shiny.i18nパッケージでshinyを多言語対応
このエントリは「R Shiny Advent Calendar 2017」の10日目の記事です。
みなさん、せっかく作ったshinyアプリを世界の人々に見せたいときってありますよね。ね。
先日、自作Shinyアプリを多言語に切り替えるパッケージとかないかなぁと探したところ、 「shiny.i18n」パッケージを見つけたので試してみました。
shiny.i18nパッケージのつかいかた
注意: できたばかりのパッケージらしく、以下の解説は古くなる可能性があります。
インストール
GitHubからインストールしましょう。
devtools::install_github("Appsilon/shiny.i18n")
言語切り替え
では、さっそく使っていきましょう。
当然ですが、言語を切り替えるにはその言語に対応した文言が用意されていなければなりません。
shiny.i18n
パッケージは、言語ファイルとして csv と json のどちらかが必要です。
今回は、下記のような json ファイルで説明します。
{ "languages": [ "en", "pl", "jp" ], "translation": [ { "en": "Hello Shiny!", "pl": "Witaj Shiny!", "jp": "こんにちは、Shiny!" }, { "en": "Number of bins:", "pl": "Liczba podziałek", "jp": "binの数" }, { "en": "This is description of the plot.", "pl": "To jest opis obrazka.", "jp": "プロットの説明" }, { "en": "Histogram of x", "pl": "Histogram x", "jp": "xのヒストグラム" }, { "en": "Frequency", "pl": "Częstotliwość", "jp": "頻度" } ] }
まず、「languages」の項に対応したい言語名を列挙します。ここは後述の「translation」と同一である必要があります。今回は英語・ポーランド語・日本語です。先頭に書いた言語がデフォルトとして設定されます。
次に、「translation」で各文言に対する翻訳を記載します。わかりやすいですね。
では、このjsonを適当な所に置き、試してみましょう。 はじめはshinyでなく、コンソールで実行してみます。
shiny.i18nはクラスで実装されています。 まずはインスタンスを作る際に、先程のjsonファイルを指定します。
「translations」を見ると、先程の設定がデータフレームとなっています。 これをもとに、言語を切り替えるようです。
> library(shiny.i18n) > # 読み込み > translator <- Translator$new(translation_json_path = "./data/translation.json") > # 対応表 > translator$translations pl jp Hello Shiny! Witaj Shiny! こんにちは、Shiny! Number of bins: Liczba podziałek binの数 This is description of the plot. To jest opis obrazka. プロットの説明 Histogram of x Histogram x xのヒストグラム Frequency Częstotliwość 頻度
では、実際に文字列を出力してみます。 まずは、デフォルトの英語です。
文字列の出力は translate
メソッドで行います。
t
は translate
の単なるラッパーなので、より短く書けます。
英語の文字列がそのまま出力されていますね。
> translator$translate("Hello Shiny!") [1] "Hello Shiny!" > translator$t("Frequency") [1] "Frequency"
では、言語を切り替えてみましょう。
set_translation_language
メソッドを使って日本語にします。
> translator$set_translation_language('jp') > > translator$translate("Hello Shiny!") [1] "こんにちは、Shiny!" > translator$t("Frequency") [1] "頻度"
おお、きちんと対応する日本語になっていますね。 次はポーランド語にしてみます。
> translator$set_translation_language('pl') > > translator$translate("Hello Shiny!") [1] "Witaj Shiny!" > translator$t("Frequency") [1] "Częstotliwość"
こちらもしっかり表示できています。 元の英語にももちろん戻せます。
> translator$set_translation_language('en') > > translator$translate("Hello Shiny!") [1] "Hello Shiny!" > translator$t("Frequency") [1] "Frequency"
Shiny で使う
では、本題であるShinyで使ってみましょう。 パッケージのGitHubレポジトリにはサンプルがあり、そちらのソースをjsonを読むように変更しました。
こんな感じで切り替えできます。
shinyのソースはこちら(app.R)です。
reactive
を用いて言語を切り替えています。
library(shiny) library(shiny.i18n) ui <- shinyUI(fluidPage( titlePanel('shiny.i18n'), uiOutput('page_content') )) translator <- Translator$new(translation_json_path = "./data/translation.json") server <- shinyServer(function(input, output) { i18n <- reactive({ selected <- input$selected_language if (length(selected) > 0 && selected %in% translator$languages) { translator$set_translation_language(selected) } translator }) output$distPlot <- renderPlot({ x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = "darkgray", border = "white", main = i18n()$t("Histogram of x"), ylab = i18n()$t("Frequency")) }) output$page_content <- renderUI({ tagList( sidebarLayout( sidebarPanel( selectInput('selected_language', i18n()$t("Change language"), choices = translator$languages, selected = input$selected_language), sliderInput("bins", i18n()$t("Number of bins:"), min = 1, max = 50, value = 30) ), mainPanel( plotOutput("distPlot"), p(i18n()$t("This is description of the plot.")) ) ) ) }) }) shinyApp(ui = ui, server = server)
できたばかりのパッケージなので破壊的変更が起こる可能性はありますが、文言を切り替えたいときにはぜひ試してみてください。