在Shiny应用程序中使用gettext

时间:2016-12-29 15:21:11

标签: r shiny gettext

我注意到在Ubuntu 14.04计算机上运行的Shiny应用程序中存在gettext的奇怪行为。

?gettext开始,我们了解到:

  

如果domain为NULL或“”,并且从包 pkg 的命名空间中的函数调用gettext或ngettext,则域将设置为“R-pkg”。

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

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

devtools::install_github("tutuchan/gettext")

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

  • hello()调用gettext("Hello, world!")隐式将域名指定为 R-gettext
  • hello2()调用gettext("Hello, world!", domain = "R-gettext")显式将域名指定为 R-gettext
  • app()shiny::runApp()的包装,可直接启动应用

该软件包包含用于法语翻译的.po文件(要求您在系统上使用“fr_FR.UTF8”语言环境进行试用)。

如果我拨打app(),则会翻译两个字符串:

app

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

当未指定域时,gettext看起来确实在翻译文件的顶级函数的命名空间中。

我创建了包含翻译文件的another package,并通过 gettext 包调用该应用。调用gettextpo::app()(内部调用gettext::app()时,隐含域的翻译位于 gettextpo 包的名称空间中,而不是 gettext

enter image description here