2

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  
4

0 回答 0