*与平台无关*的语言/区域设置?

时间:2018-12-05 21:52:23

标签: r locale error-messaging

tl; dr

是否可以独立于平台更改LANGUAGE环境设置(或语言环境的LC_MESSAGES组件),如果没有更改(可能是这种情况)来检测所请求的值是否实际上是合法/具有效力的?

上下文

我的一个功能试图通过grep()输入错误消息的文本来检测特定错误的发生。如先前在R邮件列表上指出的那样(现在无法找到参考),这种方法很脆弱:消息的文本可以根据LANGUAGE环境变量的设置进行更改。

因此,我要更改代码以不执行此操作,但是我想向测试该问题是否发生的软件包中添加回归测试。而且我希望它可以跨平台工作(或至少不会失败)。

例如在this question中,我可以使用Sys.setenv(LANGUAGE=...)Sys.setlocale("LC_MESSAGES",.)更改消息语言。但这仅在我猜到正确的LANGUAGE / LC_MESSAGES值时才有效,并且该值在当前系统上可用。 (似乎LANGUAGE是语言代码,LC_MESSAGES是语言环境,如果我只想切换语言,不需要安装语言环境?)

Sys.getenv("LANGUAGE") ## [1] "en_CA:en"
test_msg <- function(msg,silent=FALSE) {
   grepl(msg,try(x ,silent=silent))
}
test_msg("not found") ## TRUE ("object 'x' not found")
Sys.setenv(LANGUAGE="fr")
test_msg("introuvable")
## Erreur : objet 'x' introuvable

到目前为止,太好了。但是重置LANGUAGE变量似乎无效...

Sys.setenv(LANGUAGE="en")
Sys.getenv("LANGUAGE")=="en" ## TRUE
test_msg("not found")   ## FALSE ('introuvable')
Sys.setenv(LANGUAGE="en_CA:en")
test_msg("not found") ## FALSE ('introuvable')

LC_MESSAGES设置为C似乎更可靠...

Sys.setlocale("LC_MESSAGES", "C")
test_msg("not found")

FWIW,我发现此命令序列实际上似乎是不可靠,即,根据某些撒尿情况,设置环境变量的相同尝试有时会奏效 我以前已经做过...我必须回过头来,从干净的会话开始,以获得可重复的结果...

无论如何,我知道如果我要在没有可用的法语语言环境的计算机上尝试使用此语言,或者在语言环境/语言名称不同的情况下,它将无法正常工作。我想弄清楚该语言设置是否有效。我可以将test_msg("introuvable")用作暴力手段,但我希望有一个更优雅的选择...


sessionInfo()的相关位:

R Under development (unstable) (2018-11-26 r75681)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.5 LTS

locale:
 [1] LC_CTYPE=en_CA.UTF8       LC_NUMERIC=C             
 [3] LC_TIME=en_CA.UTF8        LC_COLLATE=en_CA.UTF8    
 [5] LC_MONETARY=en_CA.UTF8    LC_MESSAGES=en_CA.UTF8  

0 个答案:

没有答案
相关问题