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

shiny.i18n库与bslib兼容问题及解决方案问询

在bslib的page_navbar/page_sidebar中使用shiny.i18n实现多语言切换的解决方案

问题说明

在Shiny原生fluidPage()中使用shiny.i18n可正常实现多语言切换,但改用bslib的page_navbar()或page_sidebar()时会报错——这类函数要求传入面板或导航容器,无法直接处理usei18n()函数,且用card_body包裹usei18n()的方法无效。

解决方法

核心是利用page_navbar()的header参数承载usei18n(),同时规范page_navbar()的参数结构(主内容需用nav_panel()包裹)。以下是修正后的完整代码:

library(shiny.i18n)
library(shiny)
library(bslib)

i18n <- Translator$new(translation_json_path='translations/translation.json')
i18n$set_translation_language('en')

# UI ---------------------------------------------------------------------------
ui <- page_navbar(
  title = i18n$t("Fitness Market Comparison"),
  # 将usei18n和语言选择器放入header参数中
  header = tagList(
    shiny.i18n::usei18n(i18n),
    selectInput(
      inputId='selected_language',
      label=i18n$t('Change language'),
      choices = i18n$get_languages(),
      selected = i18n$get_key_translation()
    )
  ),
  nav_spacer(),
  # 主内容必须用nav_panel包裹
  nav_panel(
    title = i18n$t("Main Content"),
    # 这里添加你的页面内容,比如文本、图表等
    p(i18n$t("Welcome to the fitness market comparison page!"))
  )
)

server <- function(input, output, session) {
  observeEvent(input$selected_language, {
    update_lang(input$selected_language, session)
  })
}

shinyApp(ui, server)

关键调整点

  • usei18n(i18n)通过tagList()组合后放入header参数:header支持任意Shiny标签对象,tagList可同时承载多元素(这里是国际化脚本和语言选择器)
  • 语言选择器selectInput也移入header,避免直接放在page_navbar()的顶级位置(该位置仅接受导航面板类元素)
  • 页面主内容必须用nav_panel()包裹,符合page_navbar()的参数要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:22:12