闪亮的反应性难题;动态翻译进入 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)。
我找到了使用 uiOutput
和 renderUI
的解决方案,但我正在处理的应用程序的面板和选项卡布局非常复杂,如果我能提供帮助,我宁愿不重新编写所有代码它。有人可以推荐一种在浏览器端有效的解决方法。谢谢,
在这种情况下,另一种方法是使 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,但不在原始的可重现示例中
我正在开发一个多语言闪亮的应用程序,使用 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)。
我找到了使用 uiOutput
和 renderUI
的解决方案,但我正在处理的应用程序的面板和选项卡布局非常复杂,如果我能提供帮助,我宁愿不重新编写所有代码它。有人可以推荐一种在浏览器端有效的解决方法。谢谢,
在这种情况下,另一种方法是使 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,但不在原始的可重现示例中