我注意到在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()
,则会翻译两个字符串:
但如果我直接运行应用程序,可以通过打开文件并单击RStudio中的运行应用程序按钮或通过调用shiny::runApp("inst/app")
,只会显示带有显式域名的消息:
我可能误解了gettext
的帮助,但如果有人能够对此有所了解,我会很高兴。
尝试匹配域时,gettext
会考虑顶级调用功能吗?因为在这种情况下,在调用app()
时,在调用shiny::runApp()
时翻译所有消息是有意义的,只有那些具有显式域的消息才会被翻译(因为对于隐式域,gettext
会在闪亮包的命名空间中查找.po文件。
但我认为它会寻找实际调用gettext
的函数域。
答案 0 :(得分:1)
当未指定域时,gettext
看起来确实在翻译文件的顶级函数的命名空间中。
我创建了包含翻译文件的another package,并通过 gettext 包调用该应用。调用gettextpo::app()
(内部调用gettext::app()
时,隐含域的翻译位于 gettextpo 包的名称空间中,而不是 gettext 强>