在R中获取允许的语言环境名称的可靠方法是什么?

 蓝染 发布于 2023-02-06 10:38

我正在尝试找到一种可靠的方法来查找传递给的语言环境代码Sys.setlocale.

?Sys.setlocale帮助页面刚指出允许值是依赖于操作系统的,并给出了一些例子:

Sys.setlocale("LC_TIME", "de")     # Solaris: details are OS-dependent
Sys.setlocale("LC_TIME", "de_DE.utf8")   # Modern Linux etc.
Sys.setlocale("LC_TIME", "de_DE.UTF-8")  # ditto
Sys.setlocale("LC_TIME", "de_DE")  # Mac OS X, in UTF-8
Sys.setlocale("LC_TIME", "German") # Windows

在Linux下,可以使用检索可能性

locales <- system("locale -a", intern = TRUE)
##  [1] "C"                    "C.utf8"               "POSIX"               
##  [4] "af_ZA"                "af_ZA.utf8"           "am_ET"
##  ...

我没有手持Solaris或Mac机器,但我猜这个输出可以通过以下方式生成:

library(stringr)
unique(str_split_fixed(locales, "_", 2)[, 1])    #Solaris
unique(str_split_fixed(locales, "\\.", 2)[, 1])  #Mac

Windows上的语言环境更成问题:它们需要"language_country"形式的长名称,例如:

Sys.setlocale("LC_ALL", "German_Germany")

我无法找到Windows下的语言环境列表的可靠参考.locale -a除非安装了cygwin,否则从Windows命令行调用会失败,然后返回与Linux相同的值(我猜它正在访问标准C库中的值.)

似乎没有与R打包的语言环境列表(我认为可能有类似于share/zoneinfo/zone.tab包含时区详细信息的内容).

我目前最好的策略是从Microsoft浏览此网页,并通过操作SUBLANG表的列来形成名称.

http://msdn.microsoft.com/en-us/library/dd318693.aspx

需要一些猜测,例如有关区域设置SUBLANG_ENGLISH_UKEnglish_United Kingdom.

Sys.setlocale("LC_ALL", "English_United Kingdom")

如果在不同的字母表中有变体,则需要括号.

Sys.setlocale("LC_ALL", "Uzbek (Latin)_Uzbekistan")
Sys.setlocale("LC_ALL", "Uzbek (Cyrillic)_Uzbekistan")

这种猜测不会太糟糕,但许多语言环境根本不起作用,包括大多数印度语语言环境.

Sys.setlocale("LC_ALL", "Hindi_India")
Sys.setlocale("LC_ALL", "Tamil_India")
Sys.setlocale("LC_ALL", "Sindhi_Pakistan")
Sys.setlocale("LC_ALL", "Nynorsk_Norway")
Sys.setlocale("LC_ALL", "Amharic_Ethiopia")

Windows区域和语言对话框(Windows\System32\intl.cpl参见图片)有一个类似但不完全相同的可用语言环境列表,但我不知道填充的位置.

在此输入图像描述

有几个相关的问题:
1.Mac和Solaris人员:请您检查我的代码是否可以在您的操作系统下运行.
2.印度/巴基斯坦/挪威/埃塞俄比亚人使用Windows:请告诉我你的Sys.getlocale()回报.
3.其他Windows用户:是否有更好的文档可用于哪些语言环境?

更新:点击Ben B提到的问题中的链接后,我偶然发现了Windows中这个更好的语言环境列表.通过使用"区域和语言"对话框和调用手动更改区域设置Sys.getlocale(),我推断出Nynorsk是"Norwegian-Nynorsk_Norway".例如,仍有许多奇怪之处

Sys.setlocale(, "Inuktitut (Latin)_Canada")

很好,但是

Sys.setlocale(, "Inuktitut (Syllabics)_Canada")

失败(与大多数印度语言一样).在任何这些语言环境中启动R会导致警告,并且R的语言环境将恢复为C.

我仍然有兴趣听听任何印第安人等关于你所拥有的地方.

1 个回答
  • 在回答你的第一个问题时,这是我Mac上的输出:

    > locales <- system("locale -a", intern = TRUE)
    > library(stringr)
    > unique(str_split_fixed(locales, "\\.", 2)[, 1]) 
     [1] "af_ZA" "am_ET" "be_BY" "bg_BG" "ca_ES" "cs_CZ" "da_DK" "de_AT" "de_CH"
    [10] "de_DE" "el_GR" "en_AU" "en_CA" "en_GB" "en_IE" "en_NZ" "en_US" "es_ES"
    [19] "et_EE" "eu_ES" "fi_FI" "fr_BE" "fr_CA" "fr_CH" "fr_FR" "he_IL" "hi_IN"
    [28] "hr_HR" "hu_HU" "hy_AM" "is_IS" "it_CH" "it_IT" "ja_JP" "kk_KZ" "ko_KR"
    [37] "lt_LT" "nl_BE" "nl_NL" "no_NO" "pl_PL" "pt_BR" "pt_PT" "ro_RO" "ru_RU"
    [46] "sk_SK" "sl_SI" "sr_YU" "sv_SE" "tr_TR" "uk_UA" "zh_CN" "zh_HK" "zh_TW"
    [55] "C"     "POSIX"
    

    我不确定我期待看到什么,Sys.setlocale()但它不会引发任何错误:

    > Sys.setlocale(locale="he_IL")
    [1] "he_IL/he_IL/he_IL/C/he_IL/en_AU.UTF-8"
    > Sys.getlocale()
    [1] "he_IL/he_IL/he_IL/C/he_IL/en_AU.UTF-8"
    

    2023-02-06 10:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有