在 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")
这是一个非常简单的包,具有三个功能:
hello()
调用 gettext("Hello, world!")
、 隐式地 将域指定为 R-gettext、
hello2()
调用 gettext("Hello, world!", domain = "R-gettext")
、 显式 将域指定为 R-gettext、
app()
是 shiny::runApp()
的包装器,可直接启动应用程序
该软件包包含用于法语翻译的 .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.
我注意到 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")
这是一个非常简单的包,具有三个功能:
hello()
调用gettext("Hello, world!")
、 隐式地 将域指定为 R-gettext、hello2()
调用gettext("Hello, world!", domain = "R-gettext")
、 显式 将域指定为 R-gettext、app()
是shiny::runApp()
的包装器,可直接启动应用程序
该软件包包含用于法语翻译的 .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.