В международных интерфейсах JavaScript идентификация стран и регионов основана на стандартах ISO, прежде всего ISO 3166. Используются два основных формата:
US, RU, KZ)001 — мир, 150 — Европа)В контексте JavaScript Intl API чаще применяется именно алфавитный формат ISO 3166-1 alpha-2.
Примеры распространённых кодов:
US — Соединённые ШтатыGB — ВеликобританияDE — ГерманияJP — ЯпонияKZ — КазахстанЭти коды не являются локализованными строками. Они представляют собой универсальный идентификатор, который затем преобразуется в человекочитаемое название через механизмы интернационализации.
Ключевым инструментом для работы с названиями стран и регионов
является Intl.DisplayNames. Он позволяет преобразовывать
коды регионов в локализованные строки на заданном языке.
const regionNames = new Intl.DisplayNames(['ru'], { type: 'region' });
console.log(regionNames.of('US')); // "Соединённые Штаты"
console.log(regionNames.of('JP')); // "Япония"
console.log(regionNames.of('KZ')); // "Казахстан"
Важные параметры:
locales — язык отображения (например,
'en', 'ru', 'de')options.type = 'region' — указывает, что обрабатываются
именно страны и регионыОдин и тот же код региона может давать разные строки в зависимости от локали.
const en = new Intl.DisplayNames(['en'], { type: 'region' });
const ru = new Intl.DisplayNames(['ru'], { type: 'region' });
const de = new Intl.DisplayNames(['de'], { type: 'region' });
console.log(en.of('US')); // "United States"
console.log(ru.of('US')); // "Соединённые Штаты"
console.log(de.of('US')); // "Vereinigte Staaten"
Смысловая нагрузка остаётся одинаковой, изменяется только языковое представление.
Если передан несуществующий или некорректный код, результат становится строкой, совпадающей с исходным значением:
const regionNames = new Intl.DisplayNames(['ru'], { type: 'region' });
console.log(regionNames.of('XX')); // "XX"
Это поведение важно при работе с динамическими данными, где список кодов может быть неполным или устаревшим.
Помимо стран, Intl.DisplayNames поддерживает
административные регионы, если они представлены стандартными кодами.
Примеры:
US-CA — КалифорнияUS-NY — Нью-ЙоркGB-ENG — Англияconst regionNames = new Intl.DisplayNames(['en'], { type: 'region' });
console.log(regionNames.of('US-CA')); // "California"
console.log(regionNames.of('GB-ENG')); // "England"
Поддержка субрегионов зависит от реализации и данных CLDR (Unicode Common Locale Data Repository).
Intl.Locale предоставляет структурированное
представление локали, включая региональный компонент.
const locale = new Intl.Locale('ru-KZ');
console.log(locale.language); // "ru"
console.log(locale.region); // "KZ"
Это позволяет разделять язык и регион без необходимости ручного парсинга строки локали.
Функция Intl.getCanonicalLocales нормализует список
локалей к стандартному виду.
console.log(Intl.getCanonicalLocales('ru-kz'));
// ["ru-KZ"]
console.log(Intl.getCanonicalLocales(['en-us', 'en-gb']));
// ["en-US", "en-GB"]
Хотя основная цель функции — локали, она важна при построении систем, где регион является частью языкового идентификатора.
Хотя Intl.DisplayNames напрямую отвечает за названия,
региональные настройки влияют на форматирование других API:
const number = new Intl.NumberFormat('de-DE').format(1234567.89);
// "1.234.567,89"
const date = new Intl.DateTimeFormat('ja-JP').format(new Date());
// "2026/05/26"
Региональная часть локали (DE, JP,
US) определяет правила форматирования, разделители и
порядок отображения.
Частая ошибка при работе с Intl API — путаница между языковыми и региональными кодами.
en — язык (английский)en-US — английский, СШАen-GB — английский, Великобританияfr — французский языкfr-CA — французский, Канадаconst d = new Intl.DisplayNames(['fr-CA'], { type: 'region' });
console.log(d.of('US')); // "États-Unis"
Регион влияет на терминологию и орфографию отображаемых названий.
Коды регионов не зависят от регистра, но API приводит их к канонической форме:
const regionNames = new Intl.DisplayNames(['ru'], { type: 'region' });
console.log(regionNames.of('us')); // "Соединённые Штаты"
console.log(regionNames.of('Us')); // "Соединённые Штаты"
Внутри происходит нормализация к верхнему регистру.
Некоторые коды представляют не страны, а абстрактные регионы:
001 — мир150 — Европа419 — Латинская Америкаconst regionNames = new Intl.DisplayNames(['en'], { type: 'region' });
console.log(regionNames.of('001')); // "World"
console.log(regionNames.of('150')); // "Europe"
Эти значения особенно полезны в аналитике и статистике.
При построении интерфейсов международных приложений
Intl.DisplayNames используется для:
Пример формирования списка:
const regions = ['US', 'GB', 'DE', 'FR', 'JP'];
const display = new Intl.DisplayNames(['ru'], { type: 'region' });
const list = regions.map(code => ({
code,
name: display.of(code)
}));
console.log(list);
Результат:
[
{ "code": "US", "name": "Соединённые Штаты" },
{ "code": "GB", "name": "Великобритания" },
{ "code": "DE", "name": "Германия" },
{ "code": "FR", "name": "Франция" },
{ "code": "JP", "name": "Япония" }
]
Все локализованные названия регионов берутся из базы CLDR (Unicode Common Locale Data Repository). Это означает:
В средах без поддержки Intl.DisplayNames требуется
полифилл. В противном случае код может приводить к ошибкам
выполнения:
if (typeof Intl.DisplayNames === 'undefined') {
// fallback-логика
}
Также возможны ограничения:
В сложных приложениях часто используется гибридный подход:
Intl.DisplayNames — для стандартных странПример логики:
function getRegionName(code, locale) {
const display = new Intl.DisplayNames([locale], { type: 'region' });
const name = display.of(code);
if (name !== code) return name;
return customRegions[code] || code;
}
Такой подход закрывает пробелы стандартизированных данных.