You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

模块化Shiny应用中shiny.i18n翻译失效,求原因及解决建议

解决模块化Shiny应用中shiny.i18n翻译失效的问题

Hey there! Let's figure out why your shiny.i18n translation isn't working in your modular Shiny app, and walk through how to fix it.

问题的两个核心原因

1. 模块访问不到主脚本里的i18n对象

Shiny模块运行在独立的命名空间中,当你在displayTable_module.R里直接调用i18n$t()时,模块根本不知道主应用脚本里定义的i18n对象——它不在模块的作用域内,所以翻译逻辑完全无法执行。

2. 翻译JSON里的语言对应关系搞反了

看你的translation.json,你把英语和德语的映射搞反了:

{
"en": "Daten Visualisieren",
"ger": "Visualize your data"
}
Daten Visualisieren是德语,应该对应ger键;而Visualize your data是英语,应该对应en键。就算作用域问题解决了,这个错误也会导致翻译失效。


修复步骤

Step 1: 修正翻译JSON文件

首先,调整translation.json里的语言键值对,让对应关系正确:

{
  "languages": ["en", "ger"],
  "translation": [
    {
      "en": "Visualize your data",
      "ger": "Daten Visualisieren"
    }
  ]
}

Step 2: 将i18n对象传递给模块

模块需要明确获取i18n对象的访问权限,这里有两种可靠的实现方式:

方式一:将i18n作为参数传递(推荐)

修改模块代码,让UI和Server函数都接受i18n作为参数:

## displayTable_module.R
table_UI <- function(id, i18n){
  ns <- NS(id)
  shinydashboard::box(i18n$t("Visualize your data"),
                      DTOutput(ns("table"))
  )
}

table_server <- function(input, output, session, i18n){
  output$table <- renderDT(datatable(mtcars))
}

然后在主应用中调用模块时传入i18n

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)
library(shiny.i18n)

i18n <- Translator$new(translation_json_path = "translation.json")
i18n$set_translation_language("en") # 改成"ger"就能测试德语翻译
source("displayTable_module.R")

ui <- fluidPage(
  table_UI("display_table", i18n = i18n)
)

server <- function(input, output) {
  callModule(table_server, "display_table", i18n = i18n)
}

shinyApp(ui = ui, server = server)

方式二:使用全局环境(仅用于快速测试)

如果你想快速测试效果,可以把i18n定义到全局环境中,让模块能直接访问。在主脚本里修改i18n的定义:

i18n <<- Translator$new(translation_json_path = "translation.json")
i18n$set_translation_language("en")

注意: 这种方法不推荐用于生产代码——全局变量会让依赖关系变得模糊,违背了模块化的初衷。

额外:添加语言切换控件(可选)

如果想让用户自行切换语言,可以在主UI里加一个选择框,并在语言变更时刷新应用:

ui <- fluidPage(
  selectInput("lang", "Choose Language", choices = c("English" = "en", "German" = "ger")),
  table_UI("display_table", i18n = i18n)
)

server <- function(input, output, session) {
  observeEvent(input$lang, {
    i18n$set_translation_language(input$lang)
    session$reload() # 刷新UI以应用新的翻译
  })
  
  callModule(table_server, "display_table", i18n = i18n)
}

内容的提问来源于stack exchange,提问作者rkraft

火山引擎 最新活动