在 Shiny 应用程序中使用 gettext

Use of gettext in a Shiny application

我注意到 gettext 在 Ubuntu 14.04 机器上的 Shiny 应用程序 运行ning 中有一个奇怪的行为。

?gettext,我们了解到:

If domain is NULL or "", and gettext or ngettext is called from a function in the namespace of package pkg the domain is set to "R-pkg".

但是当我使用 gettext 开发一个包以在关联的 Shiny 应用程序中执行国际化时,消息并不总是被翻译。

我开发了一个可重现的小例子,您可以在 Github 找到:

devtools::install_github("tutuchan/gettext")

这是一个非常简单的包,具有三个功能:

该软件包包含用于法语翻译的 .po 文件(这需要您的系统上有 "fr_FR.UTF8" 语言环境才能试用)。

如果我调用 app(),两个字符串都会被翻译:

但如果我直接 运行 应用程序,可以通过打开文件并单击 RStudio 中的 运行 App 按钮或调用 shiny::runApp("inst/app"), 只翻译显式调用域的消息:

我可能误解了 gettext 的帮助,但如果有人能对此有所说明,我会很高兴。

尝试匹配域时,gettext是否考虑顶级调用函数?因为在那种情况下,当调用 app() 时,所有消息都会被翻译,而当调用 shiny::runApp() 时,只有那些具有显式域的消息才会被翻译(因为对于隐式域,gettext 会在 shiny 包的命名空间中查找 .po 文件)。 但我认为它会寻找实际调用 gettext.

的函数的域

看起来 gettext 在未指定域的情况下确实在 顶级函数 的命名空间中用于翻译文件。

我创建了包含翻译文件的 another package 并从我的 gettext 包中调用应用程序。调用gettextpo::app()时(在内部调用gettext::app(),隐式域时的翻译是在gettextpo包的命名空间中找到的,而不是gettext.