闪亮的反应性难题;动态翻译进入 selectInput() 的文本

Reactivity conundrum in shiny; dynamically translating text going into selectInput()

我正在开发一个多语言闪亮的应用程序,使用 shiny.i18n 包来翻译 UI 的不同部分。在我尝试动态翻译特定 selectInput 菜单中的文本之前,它工作得非常好。下面是一些可重现的代码:

# Translating text of a menu item from data

library(shiny)
library(shiny.i18n)
library(tidyverse)

# Create translation file and save in a directory called trans
system("mkdir trans")
translation_key <- data.frame(es = c("Cambiar de lenguaje", "Seleccione un proyecto", "Todos"),
                              en = c("Change language", "Select a project", "All")
                              )
write.csv(translation_key, "trans/translation_key.csv",
          row.names = FALSE, 
          quote = FALSE)

# Create data object
data <- data.frame(project_name =c("Todos","proj1", "proj2"),
                   n = c(20,30,40)
                   )
# Setup translator
trans <- Translator$new(translation_csvs_path = "trans")
trans$set_translation_language("es")


# Define UI 
ui <- fluidPage(
  usei18n(trans),
  

    # Application title
    titlePanel("Reactivity test"),
        
        mainPanel(
          selectInput('selected_language',
                      trans$t("Cambiar de lenguaje"),
                      choices = trans$get_languages()
                    ),
          selectInput("project_name",
                      trans$t("Seleccione un proyecto"),
                      choices = NULL
          ),
          textOutput("n")
          )
)



# server part
server <- function(session, input, output) {
  
  
# update languae  
   observeEvent(input$selected_language, {
     
     update_lang(session, input$selected_language)
     print(paste("Language change!", input$selected_language))
   })
  
# change the first element of data$project and translate it! It does not do it! 
  data_rv <- eventReactive(input$selected_language, {
    
    data$project_name[1] <- trans$t("Todos")
    data
    
    
  })
  
  # update the selection for project name depending on the language
  observeEvent(data_rv(), {
    updateSelectInput(session, inputId = "project_name", 
                      choices = unique(data_rv()$project_name))
  })
  
  # print the n associated with project_name selected
  output$n <- renderText({
    req(input$project_name)
    res <- data_rv() %>% filter(project_name == input$project_name)
    res$n
  })
}
    
# Run the application 
shinyApp(ui = ui, server = server) 

我尝试在 eventReactive 调用 returns 修改后的翻译对象中翻译 data$project_name 的第一个元素。问题是在呈现 project_name 的菜单后才会发生翻译(请参见下面的屏幕截图)。

应用程序默认以西班牙语 (es) 启动,当更改为英语 (en) 时,除了 Select 项目 中的第一项外,所有内容都会被翻译菜单(它应该说 All 而不是 Todos)。

我找到了使用 uiOutputrenderUI 的解决方案,但我正在处理的应用程序的面板和选项卡布局非常复杂,如果我能提供帮助,我宁愿不重新编写所有代码它。有人可以推荐一种在浏览器端有效的解决方法。谢谢,

在这种情况下,另一种方法是使 data_rv 成为一个带有 req() 而不是 eventReactive 的反应式表达式。它还可以根据您的目的保持简单。

我用你的例子试过了:

  # change the first element of data$project and translate it! 
  data_rv <- reactive({
    req(input$selected_language)
    data$project_name[1] <- trans$t(data$project_name[1])
    data
    
  })

好像结账了! reactivity question image here

注意:为了清楚起见,我将反应性测试翻译成 prueba de reactividad,但不在原始的可重现示例中