shiny.i18n库与bslib兼容问题及解决方案问询
问题说明
在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
相关产品推荐
相关产品推荐

