В общем случае вы должны отделить проблему «угадать отсутствующие параметры» от проблемы «сопоставления списка локалей, который я хочу, со списком локалей, которые у меня есть». Они разные.
Угадай недостающие части
Это все сложные области, и даже (потенциально) политически заряженные.
Но, за очень немногими исключениями, правило состоит в том, чтобы выбрать «оригинальную страну» языка.
Исключения в основном основаны на населении.
Таким образом, FR-FR для FR, ES-ES и т. Д
Некоторые исключения: pt-BR вместо pt-PT, en-US вместо en-GB.
Также общепринятым (и требуется согласно китайским стандартам), что zh отображается на zh-CN.
Возможно, вам также придется посмотреть на страну, чтобы определить сценарий, или наоборот.
Например, az => az-AZ, но az-Arab => az-Arab-IR и az_IR => az_Arab_IR
Соответствие «хочу» и «иметь»
Это включает в себя сопоставление списка желаний и списка имущих языков.
Работа со списками усложняет задачу. И результат также должен быть отсортирован по-умному, если это возможно. (например, если 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
, которые имеют дело с хотением против. Но они бесполезны, поскольку они принимают 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 ja@collation=radical ja@calendar=japanese ]
и want = [ ja@calendar=japanese;collation=radical ]
, тогда наилучшее совпадение зависит от желаемой операции. Для форматирования даты лучше подходит ja @ calendar = japanese, но для сопоставления вы хотите ja @ collation = радикал