context("Internationalization")
test_that("i18n_translations() are correctly formatted", {
trns <- i18n_translations()
expect_type(trns, "list")
expect_true(!is.null(names(trns)))
for (lang in names(trns)) {
expect_equal(length(trns[[lang]]), 1L)
expect_equal(names(trns[[lang]]), "translation")
expect_type(trns[[lang]], "list")
}
})
test_that("i18n_process_language_options() single language", {
trns <- i18n_process_language_options()
expect_equal(trns$language, "en")
expect_equal(trns$resources, i18n_translations())
trns_xx <- i18n_process_language_options("xx")
expect_equal(trns_xx$language, "xx")
expect_equal(trns_xx$resources, i18n_translations())
trns_yy <- i18n_process_language_options(list(yy = NULL))
expect_equal(trns_yy$language, "yy")
expect_equal(trns_yy$resources, i18n_translations())
})
test_that("i18n_process_language_options() single customization", {
trns <- i18n_process_language_options(list(
en = list(
button = list(runcode = "Run"),
text = list(areyousure = "You sure?")
)
))
expect_equal(trns$language, "en")
expect_type(trns$resources$en$custom, "list")
expect_equal(names(trns$resources$en$custom), c("button", "text"))
expect_equal(trns$resources$en$custom$button$runcode, "Run")
expect_equal(trns$resources$en$custom$text$areyousure, "You sure?")
expect_equal(
trns$resources$en$translation,
i18n_translations()$en$translation
)
})
test_that("i18n_process_language_options() multiple customizations", {
trns <- i18n_process_language_options(list(
xx = list(
button = list(runcode = "XX run"),
text = list(areyousure = "XX sure")
),
en = list(
button = list(runcode = "EN run"),
text= list(areyousure = "EN sure")
)
))
expect_equal(trns$language, "xx")
expect_type(trns$resources$xx$custom, "list")
expect_equal(names(trns$resources$xx$custom), c("button", "text"))
expect_equal(trns$resources$xx$custom$button$runcode, "XX run")
expect_equal(trns$resources$xx$custom$text$areyousure, "XX sure")
expect_type(trns$resources$en$custom, "list")
expect_equal(names(trns$resources$en$custom), c("button", "text"))
expect_equal(trns$resources$en$custom$button$runcode, "EN run")
expect_equal(trns$resources$en$custom$text$areyousure, "EN sure")
expect_equal(
trns$resources$en$translation,
i18n_translations()$en$translation
)
})
test_that("i18n_process_language_options() json file, all languages", {
custom <- list(
ZZ = NULL,
en = list(
button = list(runcode = "EN run"),
text = list(areyousure = "EN sure")
),
"xx" = list(
button = list(runcode = "XX run"),
text = list(areyousure = "XX sure")
)
)
tmp_json <- tempfile(fileext = ".json")
on.exit(unlink(tmp_json))
jsonlite::write_json(custom, tmp_json, auto_unbox = TRUE)
trns <- i18n_process_language_options(tmp_json)
expect_equal(trns$language, "ZZ")
expect_type(trns$resources$xx$custom, "list")
expect_equal(names(trns$resources$xx$custom), c("button", "text"))
expect_equal(trns$resources$xx$custom$button$runcode, "XX run")
expect_equal(trns$resources$xx$custom$text$areyousure, "XX sure")
expect_type(trns$resources$en$custom, "list")
expect_equal(names(trns$resources$en$custom), c("button", "text"))
expect_equal(trns$resources$en$custom$button$runcode, "EN run")
expect_equal(trns$resources$en$custom$text$areyousure, "EN sure")
expect_equal(
trns$resources$en$translation,
i18n_translations()$en$translation
)
})
test_that("i18n_process_language_options() json file, single language", {
custom_en <- list(
button = list(runcode = "EN run"),
text = list(areyousure = "EN sure")
)
tmp_json <- tempfile(fileext = ".json")
jsonlite::write_json(custom_en, tmp_json, auto_unbox = TRUE)
on.exit(unlink(tmp_json))
custom <- list(
ZZ = NULL,
en = tmp_json,
"xx" = list(
button = list(runcode = "XX run"),
text = list(areyousure = "XX sure")
)
)
trns <- i18n_process_language_options(custom)
expect_equal(trns$language, "ZZ")
expect_type(trns$resources$xx$custom, "list")
expect_equal(names(trns$resources$xx$custom), c("button", "text"))
expect_equal(trns$resources$xx$custom$button$runcode, "XX run")
expect_equal(trns$resources$xx$custom$text$areyousure, "XX sure")
expect_type(trns$resources$en$custom, "list")
expect_equal(names(trns$resources$en$custom), c("button", "text"))
expect_equal(trns$resources$en$custom$button$runcode, "EN run")
expect_equal(trns$resources$en$custom$text$areyousure, "EN sure")
expect_equal(
trns$resources$en$translation,
i18n_translations()$en$translation
)
})
test_that("i18n_process_language_options() stops if not single character or list with names", {
expect_error(
i18n_process_language_options(list("apple", "banana"))
)
expect_error(
i18n_process_language_options(c("apple", "banana"))
)
expect_error(
i18n_process_language_options(list(list(button = list(runcode = "run"))))
)
})
test_that("i18n_process_language_options() warns if a language is not a single character or list with names", {
expect_warning(
i18n_process_language_options(list(en = list(c("foo", "bar"))))
)
})
test_that("i18n_process_language_options() warns unexpected keys are present", {
expect_warning(
i18n_process_language_options(list(en = list(foo = list(), button = list()))),
"foo"
)
expect_warning(
trns <- i18n_process_language_options(list(
en = list(
button = list(foo = "bar", runcode = "run"),
text = list(baz = "bop", areyousure = "yes")
)
))
)
expect_equal(trns$resources$en$custom$button$runcode, "run")
expect_equal(trns$resources$en$custom$button$foo, "bar")
expect_equal(trns$resources$en$custom$text$areyousure, "yes")
expect_equal(trns$resources$en$custom$text$baz, "bop")
})
test_that("i18n_read_json() messages if bad json file", {
tmpfile <- tempfile(fileext = ".json")
on.exit(unlink(tmpfile))
writeLines("foo", tmpfile)
expect_null(expect_message(i18n_read_json(tmpfile)))
})
test_that("i18n_span() returns an i18n span", {
span <- i18n_span("KEY", "DEFAULT", opts = list(interp = "STRING"))
expect_s3_class(span, "html")
expect_s3_class(span, "character")
expect_match(span, 'data-i18n="KEY"')
expect_match(span, ">DEFAULT</span>")
expect_match(span, 'data-i18n-opts="{"interp":"STRING"}"', fixed = TRUE)
})
test_that("i18n_set_language_option() changes message language", {
skip_if_not_pandoc("1.14")
skip_if_lang_is_c()
withr::defer(i18n_set_language_option("en"))
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("fr")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "fr")
expect_equal(result$envir_result$env_var, "fr")
ex <- mock_exercise(user_code = "mean$x")
ex$tutorial$language <- "fr"
result <- evaluate_exercise(ex, new.env())
expect_equal(result$error_message, "objet de type 'closure' non indiçable")
ex <- mock_exercise(
user_code = "mean$x",
global_setup = "i18n_set_language_option('fr')"
)
result <- evaluate_exercise(ex, new.env(), evaluate_global_setup = TRUE)
expect_equal(result$error_message, "objet de type 'closure' non indiçable")
})
test_that("i18n_set_language_option() sets up language inheritance", {
skip_if_not_pandoc("1.14")
skip_if_lang_is_c()
withr::defer(i18n_set_language_option("en"))
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("pt")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "pt")
expect_equal(result$envir_result$env_var, "pt:pt_BR")
ex <- mock_exercise(user_code = "mean$x")
ex$tutorial$language <- "pt"
result <- evaluate_exercise(ex, new.env())
expect_equal(result$error_message, "objeto de tipo 'closure' não possível dividir em subconjuntos")
ex <- mock_exercise(
user_code = "mean$x",
global_setup = "i18n_set_language_option('pt')"
)
result <- evaluate_exercise(ex, new.env(), evaluate_global_setup = TRUE)
expect_equal(result$error_message, "objeto de tipo 'closure' não possível dividir em subconjuntos")
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("zh-HK")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "zh-HK")
expect_equal(result$envir_result$env_var, "zh_HK:zh_TW:zh_CN")
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("eu")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "eu")
expect_equal(result$envir_result$env_var, "eu")
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("en-AU")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "en-AU")
expect_equal(result$envir_result$env_var, "en_AU")
ex <- mock_exercise(
user_code = c(
'i18n_set_language_option("fr-CA")',
'knit_opt <- knitr::opts_knit$get("tutorial.language")',
'env_var <- Sys.getenv("LANGUAGE")'
)
)
result <- withr::with_tempdir(render_exercise(ex, new.env()))
expect_equal(result$envir_result$knit_opt, "fr-CA")
expect_equal(result$envir_result$env_var, "fr_CA:fr")
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.