我试图find一个可靠的方法来查找区域代码传递给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”forms的长名称,例如:
Sys.setlocale("LC_ALL", "German_Germany")
我无法findWindows下的语言环境列表的可靠参考。 除非安装了cygwin,否则从Windows命令行调用locale -a
失败,然后返回与Linux下相同的值(我猜测它正在访问标准C库中的值)。
似乎没有与R打包的区域设置列表(我认为有可能类似于share/zoneinfo/zone.tab
包含时区的详细信息)。
我目前最好的策略是从微软浏览这个网页,并通过操纵表格的SUBLANG
栏来形成这个名字。
http://msdn.microsoft.com/en-us/library/dd318693.aspx
一些猜测是必要的,例如与SUBLANG_ENGLISH_UK
相关的语言环境是English_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
我还有兴趣听到印度人等等,你有什么地方。
回答你的第一个问题,这里是我的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"