You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Server端renderUI,实现Shiny App语言选择动态更新内容

无需renderUI实现Shiny App国际化文本动态更新

问题背景

我正在开发一款使用shiny.i18n包支持国际化(i18n)的Shiny App,已通过Translator对象处理所选语言的翻译。希望无需在Server端使用renderUI函数,直接从UI端实现界面文本的动态更新。

简化版代码

library(shiny)
library(shiny.i18n)

translator <- Translator$new(translation_json_path = "translation.json")


i18n <- reactive({
  selected <- input$selected_language
  if (length(selected) > 0 && selected %in% translator$get_languages()) {
    translator$set_translation_language(selected)
  }
  translator
})


ui <- fluidPage(
  sidebarLayout(
    sidebarPanel (
      selectInput("selected_language", 
                  translator$t("Change Language"),
                  choices = translator$get_languages(),
                  selected = input$selected_language)
    ),

    mainPanel(p(translator$t("Hello")))
  )
)

server <- function(input, output) {

}

shinyApp(ui, server)

translation.json内容

{ "cultural_date_format": "%d-%m-%Y", "languages": ["en", "tr"], "translation": [ {"en": "Hello", "tr": "Merhaba"}, {"en": "Change Language", "tr": "Dil Değiştir"} ] }

我曾尝试使用observeEvent和renderUI,但该方案不符合项目需求。请问是否有替代方法可在mainPanel中实现翻译内容的动态更新且无需使用renderUI?


解决方案:利用shiny.i18n的UI端动态绑定功能

可以借助shiny.i18n内置的UI增强函数,结合前端自动更新机制,无需依赖renderUI就能实现文本的动态切换。核心是让UI元素的文本绑定到响应式翻译状态,由包自带的前端逻辑触发更新。

调整后的完整代码

library(shiny)
library(shiny.i18n)

# 初始化翻译器并设置默认语言
translator <- Translator$new(translation_json_path = "translation.json")
translator$set_translation_language("en")

ui <- fluidPage(
  # 加载shiny.i18n的前端支持脚本,必须添加
  usei18n(translator),
  
  sidebarLayout(
    sidebarPanel (
      # 使用shiny.i18n封装的ui_selectInput,自动支持翻译绑定
      ui_selectInput(
        inputId = "selected_language",
        label = translator$t("Change Language"),
        choices = translator$get_languages(),
        selected = translator$get_translation_language()
      )
    ),
    
    mainPanel(
      # 使用ui_p绑定响应式翻译文本,语言切换时自动更新
      ui_p(text = reactive(translator$t("Hello")))
    )
  )
)

server <- function(input, output, session) {
  # 监听语言选择变化,更新翻译器并通知前端刷新
  observeEvent(input$selected_language, {
    translator$set_translation_language(input$selected_language)
    update_lang(session, input$selected_language)
  })
}

shinyApp(ui, server)

关键细节说明

  • usei18n(translator):必须在UI中添加该函数,它会注入shiny.i18n的前端脚本,是实现UI端动态更新的核心依赖。
  • ui_*系列组件:shiny.i18n提供了对应原生Shiny UI组件的封装版本(如ui_selectInput、ui_p),这些组件支持接收响应式文本参数,能自动跟随语言切换更新内容。
  • update_lang(session, lang):在Server端触发语言更新时,调用该函数通知前端所有绑定翻译的UI元素同步刷新,无需重新渲染组件。

自定义元素的翻译方式

如果需要给自定义UI元素绑定翻译,可使用ui_output_text函数直接绑定响应式翻译结果:

ui_output_text(reactive(translator$t("Custom Text")))

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:56:07