代码之家  ›  专栏  ›  技术社区  ›  Ben Bolker

*独立于平台的*语言/区域设置?

  •  2
  • Ben Bolker  · 技术社区  · 5 年前

    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  
    
    0 回复  |  直到 5 年前