Как использовать локаль «наилучшим образом» в JavaScript? - PullRequest
0 голосов
/ 10 марта 2019

Мое понимание проблемы до сих пор:

Я читаю этот документ MDN , в котором говорится:

Аргумент locales после удаления всех расширений Unicode интерпретируется как приоритетный запрос от приложения. Среда выполнения сравнивает его с доступными локалями и выбирает лучший из доступных. Существуют два алгоритма сопоставления: сопоставитель «lookup» следует алгоритму Lookup, указанному в BCP 47; средство наилучшего соответствия позволяет среде выполнения предоставлять языковой стандарт, который хотя бы, но, возможно, больше подходит для запроса, чем результат алгоритма «Уточняющий запрос». Если приложение не предоставляет аргумент locales или у среды выполнения нет локали, соответствующей запросу, используется локаль по умолчанию среды выполнения. Соответствующий может быть выбран с помощью свойства аргумента options (см. Ниже).

Когда я читаю это, оказывается, что я могу использовать «поиск» и «наилучшее соответствие» одинаково, иногда получая разные результаты.

Тем не менее

Я могу сделать:

new Intl.DateTimeFormat('lookup', options).format(date)

Но не:

new Intl.DateTimeFormat('best fit', options).format(date)

Я использую текущую версию Firefox (64.0-разрядная версия 65.0.1 в Ubuntu), и, насколько я могу судить, у Firefox нет открытых ошибок по этому вопросу, но я получаю RangeError, когда использую 'best fit'.

Остальные вопросы:

Могу ли я дать 'best fit' в качестве аргумента локали или я могу использовать его только как localeMatcher в аргументе options? Если я могу использовать только 'best fit' внутри options, то что я должен указать в качестве locale, учитывая, что locale требуется, когда присутствует options?

Или мне просто открыть билет в Бугзилле?

1 Ответ

1 голос
/ 10 марта 2019

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

Второй пример не работает, потому что строка не отформатирована в соответствии с BCP 47.

Вы неверно истолковали документацию по API. Это:

Аргумент locales должен быть либо строкой, содержащей язык BCP 47 тег или массив таких языковых тегов. Если аргумент locales не является если указано или не определено, используется язык по умолчанию среды выполнения.

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

Тогда это:

Аргумент options должен быть объектом со свойствами, которые варьируются между конструкторами и функциями.

Итак, ваш вызов должен выглядеть следующим образом:

new Intl.DateTimeFormat([],{localeMatcher: "best fit"}).format(date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...