Названия регионов и стран

В международных интерфейсах JavaScript идентификация стран и регионов основана на стандартах ISO, прежде всего ISO 3166. Используются два основных формата:

  • ISO 3166-1 alpha-2 — двухбуквенные коды стран (например, US, RU, KZ)
  • UN M.49 — числовые коды регионов и макрорегионов (например, 001 — мир, 150 — Европа)

В контексте JavaScript Intl API чаще применяется именно алфавитный формат ISO 3166-1 alpha-2.

Примеры распространённых кодов:

  • US — Соединённые Штаты
  • GB — Великобритания
  • DE — Германия
  • JP — Япония
  • KZ — Казахстан

Эти коды не являются локализованными строками. Они представляют собой универсальный идентификатор, который затем преобразуется в человекочитаемое название через механизмы интернационализации.


Intl.DisplayNames и локализация названий стран

Ключевым инструментом для работы с названиями стран и регионов является 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 и извлечение региона

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

Все локализованные названия регионов берутся из базы 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;
}

Такой подход закрывает пробелы стандартизированных данных.