`Intl.DisplayNames`
Веб-приложения, ориентированные на глобальную аудиторию, должны отображать названия языков, регионов, скриптов и валют на различных языках. Переводы этих названий требуют наличия данных, которые доступны в Unicode CLDR. Включение этих данных в приложение требует затрат времени разработчика. Пользователи, скорее всего, предпочтут согласованные переводы названий языков и регионов, поддержание актуальности данных в связи с геополитическими изменениями мира требует постоянного обновления.
К счастью, большинство JavaScript-рантаймов уже содержит и обновляет эти самые переводные данные. Новый API Intl.DisplayNames
предоставляет JavaScript-разработчикам прямой доступ к этим переводам, облегчая локализованное отображение имен.
Примеры использования
Следующий пример показывает, как создать объект Intl.DisplayNames
для получения названий регионов на английском языке с использованием ISO-3166 двухбуквенных кодов стран.
const regionNames = new Intl.DisplayNames(['en'], { type: 'region' });
regionNames.of('US');
// → 'United States'
regionNames.of('BA');
// → 'Bosnia & Herzegovina'
regionNames.of('MM');
// → 'Myanmar (Burma)'
Следующий пример получает названия языков на традиционном китайском языке с использованием грамматики идентификаторов языков Unicode.
const languageNames = new Intl.DisplayNames(['zh-Hant'], { type: 'language' });
languageNames.of('fr');
// → '法文'
languageNames.of('zh');
// → '中文'
languageNames.of('de');
// → '德文'
Следующий пример получает названия валют на упрощенном китайском языке с использованием ISO-4217 трехбуквенных кодов валют. В языках, где существуют различные формы единственного и множественного числа, названия валют представлены в единственном числе. Для множественных форм можно использовать Intl.NumberFormat
.
const currencyNames = new Intl.DisplayNames(['zh-Hans'], {type: 'currency'});
currencyNames.of('USD');
// → '美元'
currencyNames.of('EUR');
// → '欧元'
currencyNames.of('JPY');
// → '日元'
currencyNames.of('CNY');
// → '人民币'
Следующий пример показывает последний поддерживаемый тип — скрипты — на английском языке, используя ISO-15924 четырехбуквенные коды скриптов.
const scriptNames = new Intl.DisplayNames(['en'], { type: 'script' });
scriptNames.of('Latn');
// → 'Latin'
scriptNames.of('Arab');
// → 'Arabic'
scriptNames.of('Kana');
// → 'Katakana'
Для более сложного использования второй параметр options
поддерживает также свойство style
. Свойство style
соответствует ширине имени отображения и может быть либо "long"
, "short"
, либо "narrow"
. Значения для разных стилей не всегда отличаются. По умолчанию используется "long"
.
const longLanguageNames = new Intl.DisplayNames(['en'], { type: 'language' });
longLanguageNames.of('en-US');
// → 'American English'
const shortLanguageNames = new Intl.DisplayNames(['en'], { type: 'language', style: 'short' });
shortLanguageNames.of('en-US');
// → 'US English'
const narrowLanguageNames = new Intl.DisplayNames(['en'], { type: 'language', style: 'narrow' });
narrowLanguageNames.of('en-US');
// → 'US English'
Полное API
Полное API для Intl.DisplayNames
выглядит следующим образом.
Intl.DisplayNames(locales, options)
Intl.DisplayNames.prototype.of( code )
Конструктор соответствует другим API Intl
. Его первый аргумент — список локалей, а второй параметр — параметр options
, который принимает свойства localeMatcher
, type
и style
.
Свойство "localeMatcher"
обрабатывается так же, как в других API Intl
. Свойство type
может быть "region"
, "language"
, "currency"
или "script"
. Свойство style
может быть "long"
, "short"
или "narrow"
, а по умолчанию используется "long"
.
Intl.DisplayNames.prototype.of( code )
ожидает следующие форматы в зависимости от type
, с которым создан экземпляр.
- Если
type
—"region"
,code
должен быть либо ISO-3166 двухбуквенным кодом страны, либо UN M49 трехзначным кодом региона. - Когда
type
имеет значение"language"
,code
должен соответствовать грамматике идентификатора языка Unicode. - Когда
type
имеет значение"currency"
,code
должен быть трёхбуквенным кодом валюты ISO-4217. - Когда
type
имеет значение"script"
,code
должен быть четырёхбуквенным кодом скрипта ISO-15924.
Заключение
Как и другие API Intl
, с распространением доступности Intl.DisplayNames
библиотеки и приложения предпочтут отказаться от упаковки и доставки собственных данных переводов в пользу использования встроенной функциональности.