tl;博士
是否可以更改
LANGUAGE
环境设置(或
LC_MESSAGES
区域设置的组件)
独立平台
,如果不是(可能是这样),则检测请求的值是否事实上合法/生效?
上下文
我的一个函数试图通过
grep()
错误消息的文本。正如前面在R邮件列表中指出的(现在找不到引用),这种方法是脆弱的:消息的文本可以根据
语言
环境变量。
因此,我将更改代码以不执行此操作,但我想向包中添加一个回归测试,以测试问题是否发生。我希望它能跨平台工作(或者至少不会失败)。
如所述,例如
this question
,我可以使用
Sys.setenv(LANGUAGE=...)
或
Sys.setlocale("LC_MESSAGES",.)
更改消息语言。但这只有在我猜对了
语言
/
LC U消息
值,它在当前系统上可用。(看来
语言
是一种语言代码,并且
LC U消息
是一种语言环境
无需安装区域设置
如果我只是想转换语言?)
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
到目前为止,还不错。但是重新设置
语言
变量似乎不起作用。。。
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 U消息
对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