Ответ 1
В общем, вы должны отделить проблему "угадать недостающие параметры" от "сопоставления списка локалей, которые я хочу, и списка проблем, которые у меня есть". Они разные.
Угадать недостающие части
Это все сложные области и даже (потенциально) политически заряженные.
Но за очень немногими исключениями правило заключается в выборе "исходной страны" языка. Исключения в основном основаны на численности населения. Таким образом, fr-FR для fr, es-ES и т.д. Некоторые исключения: pt-BR вместо pt-PT, en-US вместо en-GB.
Также принято (и требуется по китайским стандартам), что zh сопоставляется с zh-CN.
Возможно, вам также придется посмотреть на страну, чтобы определить script, или наоборот. Например, az = > az-AZ, но az-Arab = > az-Arab-IR, az_IR = > az_Arab_IR
Соответствие 'want' vs. 'have'
Это включает в себя сопоставление списка желаний и списка языков.
Работа со списками затрудняет работу. И результат также должен быть отсортирован разумным способом, если это возможно. (например, если want = [ fr ro ]
и have = [ en fr_CA fr_FR ro_RO ]
, то вы, вероятно, захотите [ fr_FR fr_CA ro_RO ]
в качестве результата.
Не должно быть соответствия между языком с разными скриптами. Поэтому zh-TW не должен отступать к zh-CN, а mn-Mong не должен отступать от mn-Cyrl. Трудные области: sr-Cyrl не должен отвлекаться на sr-Latn в теории, но это может быть понято пользователями. ro-Cyrl может вернуться к ro-Latn, но не наоборот.
Некоторые ссылки
- RFC 4647 имеет дело с отступлением языка (но в этом случае он не очень полезен, поскольку он следует правилу "вырезать справа" ).
- ICU 4.2 и более новый (проект в 4.0, я думаю) имеет
uloc_addLikelySubtags
(иuloc_minimizeSubtags
) вuloc.h
. Это реализует http://www.unicode.org/reports/tr35/#Likely_Subtags - Также в ICU
uloc.h
естьuloc_acceptLanguageFromHTTP
иuloc_acceptLanguage
, которые имеют дело с want vs have. Но они бесполезны, поскольку они принимают UEnumeration * в качестве входных данных, и нет никакого открытого API для создания UEnumeration. - Существует некоторая работа по согласованию языков, выходящей за рамки простого RFC 4647. См. http://cldr.unicode.org/development/design-proposals/languagedistance
- Согласование локалей в ActionScript на http://code.google.com/p/as3localelib/
- API-интерфейсы в новом пространстве имен Flash Player 10.1
flash.globalization
выполняют как угадывание тегов, так и соответствие языков (http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/flash/globalization/package-detail.html). Он работает на TR-35 и может смотреть за пределы @и рассматривать операцию. Например, еслиhave = [ ja [email protected]=radical [email protected]=japanese ]
иwant = [ [email protected]=japanese;collation=radical ]
, то наилучшее соответствие зависит от требуемой операции. Для форматирования даты ja @calendar = japanese - лучшее совпадение, но для сортировки вы хотите ja @collation = радикальный