Что такое надежный способ получения разрешенных имен локалей в R?
Я пытаюсь найти надежный способ найти коды локалей для перехода на 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
из командной строки Windows завершается с ошибкой, если не установлен cygwin, а затем он возвращает те же значения, что и в 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
, см. рис.) имеет аналогичный, но не идентичный список доступных локалей, но я не знаю, где это заполняется.
![enter image description here]()
Есть несколько связанных вопросов:
1. Люди Mac и Solaris: пожалуйста, вы можете проверить, работает ли мой код для получения локалей под вашей ОС.
2. Индийский/пакистанский/норвежский/эфиопский народ, использующий Windows: Пожалуйста, скажите мне, что Sys.getlocale()
вернется для вас.
3. Другие пользователи Windows: есть ли какая-либо лучшая документация, по которой доступны локали?
Обновление: после нажатия ссылок в вопросе, о котором упомянул Бен Б, я наткнулся на этот лучший список локалей в Windows. Ручным изменением языка с помощью диалогового окна "Регион и язык" и вызова Sys.getlocale()
, я понял, что Нюнорск "норвежский-Nynorsk_Norway". Есть еще много странностей, например
Sys.setlocale(, "Inuktitut (Latin)_Canada")
отлично, но
Sys.setlocale(, "Inuktitut (Syllabics)_Canada")
терпит неудачу (как и большинство индийских языков). Запуск R в любом из этих локалей вызывает предупреждение, а R locale - на 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"