Что такое надежный способ получения разрешенных имен локалей в 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"