tl;博士
是否可以独立于平台更改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