Что такое хорошее определение для кода языка и кодов локали? - PullRequest
25 голосов
/ 27 мая 2011

Когда использовать en_GB и en-GB? В чем разница? Существует ли имя ISO для этой комбинации ISO 639-1 (язык) и ISO 3166 (страна)?

Ответы [ 4 ]

30 голосов
/ 28 мая 2011

Существует несколько систем для идентификаторов локалей. Многие из них похожи на первый взгляд, но не тогда, когда вы углубляетесь:

Некоторые примеры (сербский-сербский с латинским алфавитом, японский-японский с радикальной сортировкой):

  • UTS-35, ICU, Mac OS X, Flash: sr-Latn-RS, ja-JP @ collation = радикал
  • Более новые UTS-35, расширение BCP 47 U: sr-Latn-RS, ja-JP-u-co-unihan
  • Win 2000, XP: 0x81a, 0x10411
  • Vista, Win 7: sr-Latn-CS, ja-JP_radical
  • Java: sr_CS, ja_JP
  • Java 7: sr_RS, ja_JP
  • Linux: sr_RS @ latin, ja_JP.utf8

Думайте об этом как о разных способах говорить о цветах (RGB, CMYB, HSV, Pantone и т. Д.)

Так что - против _ не имеет смысла, если вы не укажете, какую среду вы используете. Используйте -, и Java не поймет этого, используйте _, и Windows не поймет. ICU (и системы, построенные на его основе) принимают и - и _, но производят стиль _.

Не существует ISO, который охватывает сочетание языка и страны. Но есть ISO, которые охватывают различные части (язык, страна, сценарий). Точная версия ISO также зависит от системы, используемой для идентификаторов локали.


В общем, вы должны принять и _, и -, и генерировать только одно ("будьте либеральными в том, что вы принимаете, и строго в том, что вы излучаете") (например, ICU).

Если вы связываетесь с системами, использующими другой тип идентификатора локали, вам придется сопоставлять данные с вашей системой. Это заставит вас использовать _ или -. Некоторые из отображений будут с потерями (невозможно указать альтернативные календари в Windows, Linux; или альтернативную сортировку или сценарии в Java старше 7 лет и т. Д.), А циклическое переключение может быть невозможно (что-то похожее на преобразования RGB CMYK).

Дополнение: вещи различаются не только между системами, но и могут меняться во времени. Например, в Java 7 добавлена ​​поддержка sr_RS и сценариев, в Windows добавлена ​​поддержка большего количества языков, новых стран (Судан, Россия, Сербия) или исчезновения (Восточная Германия, США, Югославия) и т. Д.

Для внутреннего представления вы можете выбрать наиболее мощный, который может представлять все, и это UTS-35 / BCP 47 (также используется CLDR и ICU).

6 голосов
/ 27 мая 2011

Языковой стандарт - это сочетание языка и региона (обычно страны).

Разделитель может быть _ или -, но рекомендуется использовать тире.

Вероятно, вы ищете стандарт BCP-47, который использует языковые коды из ISO 639-1 и коды регионов / стран из ISO 3166-1 alpha-2 (обычно пишется в верхнем регистре).

Больше информации о них вы можете найти здесь http://blog.i18n.ro/simplified-locale-codes/

5 голосов
/ 27 мая 2011

В RFC 3066 он распространяется на Интернет и обозначает «en-GB», а не «en_GB»

1 голос
/ 27 мая 2011

Это зависит от технологии.Например, в Java Locale.UK предоставит вам код en_GB (если вам нужно достаточно позвонить toString()).Это то, что вы будете передавать между модулями (если вы не передаете конкретный тип), и это то, что вы будете записывать в файлы конфигурации (например, Face-context.xml).
В .Net, с другой стороны, вы наверняка будете использоватьen-GB.

en-GB форма определенно более распространена, и в большинстве случаев именно эту форму вы должны использовать.

Различия очевидны: разделитель :) В противном случае нет никакой разницы(в том смысле, что конкретная технология может накладывать некоторые ограничения на идентификатор локали).

Насколько мне известно, не существует нормативного документа ISO, который обрабатывал бы комбинацию языка и страны.В интернационализации программного обеспечения это часть модели локали.

...