Существует несколько систем для идентификаторов локалей. Многие из них похожи на первый взгляд, но не тогда, когда вы углубляетесь:
Некоторые примеры (сербский-сербский с латинским алфавитом, японский-японский с радикальной сортировкой):
- 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).