我正在尝试找到一种可靠的方法来查找要传递给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下的语言环境列表的可靠引用。除非安装了cygwin,否则从Windows命令行调用locale -a
会失败,然后返回与Linux相同的值(我猜它正在访问标准C库中的值。)
似乎没有与R打包的语言环境列表(我认为可能类似于share/zoneinfo/zone.tab
包含时区详细信息)。
我目前最好的策略是从Microsoft浏览此网页,并通过操作表格的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中的better list of locales。通过使用“区域和语言”对话框手动更改区域设置并调用Sys.getlocale()
,我推断出Nynorsk是“Norwegian-Nynorsk_Norway”。仍有许多奇怪之处,例如
Sys.setlocale(, "Inuktitut (Latin)_Canada")
很好,但是
Sys.setlocale(, "Inuktitut (Syllabics)_Canada")
失败(与大多数印度语言一样)。在任何这些语言环境中启动R会导致警告,并且R的语言环境将恢复为C
。
我仍然有兴趣听到任何印第安人等关于你所拥有的地方。
答案 0 :(得分:7)
在回答您的第一个问题时,这是我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"
答案 1 :(得分:0)
谢谢。我转到Richie建议的URL http://msdn.microsoft.com/en-us/library/dd318693.aspx,并在Windows中尝试了LANG_BELARUSIAN。那没有用,所以我放弃了“ LANG_”,只包括了“白俄罗斯”。很好
> bk.date1
[1]“马2012年8月14日11:28:30”
ymd_hms(bk.date1,locale =“白俄罗斯”) [1]“ UTC 2012-08-14 11:28:30”