Особенности тайского

Локаль тайского языка в формате th-TH относится к числу культурно специфичных локалей, в которых стандартные европейские представления о датах, числах и текстовой обработке существенно изменяются. В JavaScript Intl API она демонстрирует ряд особенностей, связанных с национальной письменностью, календарными системами и форматированием числовых данных.


Числовая система и тайские цифры

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

При включённом форматировании:

new Intl.NumberFormat('th-TH').format(1234567);

результат может быть представлен как:

๑,๒๓๔,๕๖๗

В основе лежит соответствие:

  • 0 → ๐
  • 1 → ๑
  • 2 → ๒
  • 3 → ๓
  • 4 → ๔
  • 5 → ๕
  • 6 → ๖
  • 7 → ๗
  • 8 → ๘
  • 9 → ๙

Это поведение зависит от реализации окружения и параметров useGrouping, но концептуально Intl учитывает национальную систему записи чисел.

При необходимости сохранения арабских цифр используется явное указание:

new Intl.NumberFormat('th-TH-u-nu-latn').format(1234567);

где nu-latn отключает локальную цифровую систему.


Форматирование дат и буддийский календарь

Тайская локаль тесно связана с буддийской эрами (Buddhist Era, BE), которая опережает григорианский календарь на 543 года.

new Intl.DateTimeFormat('th-TH', {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date(2026, 0, 1));

Типичный результат:

1 มกราคม 2569

Здесь:

  • 2026 год преобразуется в 2569 (2026 + 543)
  • используется буддийская система летоисчисления по умолчанию

Для переключения на григорианский календарь применяется календарный параметр Unicode extension:

new Intl.DateTimeFormat('th-TH-u-ca-gregory').format(new Date());

Особенность реализации заключается в том, что даже при одинаковых форматах (long, short, full) смещается только календарная база, а структура вывода сохраняется.


Структура отображения дат и порядок компонентов

Тайский формат дат отличается от западного порядка:

  • День → Месяц → Год
  • Часто используется локализованное написание месяца
  • Год отображается в буддийской эре

Пример:

new Intl.DateTimeFormat('th-TH', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(new Date(2026, 4, 27));

Результат может иметь форму:

วันพุธที่ 27 พฤษภาคม 2569

Характерные особенности:

  • обязательное включение служебных слов
  • синтаксическая связанность даты и дня недели
  • отсутствие строгого разделения символами

Форматирование валют и тайский бат

Локаль th-TH использует валюту THB (тайский бат) как стандартную единицу.

new Intl.NumberFormat('th-TH', {
  style: 'currency',
  currency: 'THB'
}).format(1234.56);

Возможный результат:

฿1,234.56

Особенности:

  • символ валюты располагается перед числом
  • разделитель тысяч зависит от локали
  • десятичный разделитель может быть точкой или запятой в зависимости от реализации

В Unicode-расширениях можно дополнительно контролировать форматирование:

new Intl.NumberFormat('th-TH-u-nu-latn').format(1234.56);

Сравнение строк и правила сортировки

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

new Intl.Collator('th-TH').compare('กา', 'ก้า');

Особенности поведения:

  • диакритика влияет на порядок сортировки
  • тоновые знаки имеют различный приоритет
  • базовая согласная важнее модификаторов

Пример сортировки массива:

['ก', 'ข', 'ค', 'กา', 'ก้า']
  .sort(new Intl.Collator('th-TH').compare);

В результате порядок будет соответствовать правилам тайской орфографии, а не Unicode-коду.


Разбиение текста и особенности письменности

Тайская письменность не использует пробелы между словами в традиционном виде, что делает стандартное разбиение текста сложной задачей. В современных реализациях используется:

new Intl.Segmenter('th-TH', { granularity: 'word' });

Особенности:

  • слова определяются контекстно
  • сегментация зависит от словаря
  • границы слов не всегда совпадают с визуальными пробелами

Пример:

const segmenter = new Intl.Segmenter('th-TH', { granularity: 'word' });

[...segmenter.segment('ประเทศไทยเป็นประเทศใหญ่')]

Результат включает логические сегменты, а не просто символы.


Часовые пояса и локальные особенности времени

При форматировании времени для th-TH часто используется азиатский региональный контекст:

new Intl.DateTimeFormat('th-TH', {
  hour: '2-digit',
  minute: '2-digit',
  timeZone: 'Asia/Bangkok'
}).format(new Date());

Особенности:

  • отсутствие перехода на летнее время
  • фиксированный UTC+7
  • 24-часовой формат используется чаще, чем 12-часовой

Unicode расширения и контроль локали

Intl API позволяет тонко управлять тайской локалью через Unicode extension keys:

  • nu-latn — арабские цифры
  • ca-gregory — григорианский календарь
  • kb — управление коллатором (в некоторых реализациях)

Пример комбинирования:

new Intl.DateTimeFormat('th-TH-u-ca-gregory-nu-latn').format(new Date());

Такой подход позволяет отключать культурные дефолты и возвращать «нейтральный» формат.


Особенности отображения списков и структуры текста

При работе с тайской локалью косвенно проявляются особенности языковой структуры:

  • высокая плотность символов
  • отсутствие пробелов в базовой записи
  • зависимость читаемости от контекста сегментации

Хотя Intl API напрямую не форматирует списки как отдельный объект в базовом наборе, поведение связанных локалей влияет на визуальное восприятие при генерации текста через другие международные стандарты.


Особенности реализации в движках JavaScript

Поддержка th-TH зависит от ICU-библиотек:

  • V8 (Chrome, Node.js) использует ICU
  • различия возможны в цифровой системе
  • сегментация текста может варьироваться по версии ICU

Ключевые различия между окружениями:

  • наличие или отсутствие тайских цифр
  • точность word segmentation
  • формат буддийского календаря в edge-case датах

Поведение по умолчанию и неявные преобразования

При отсутствии явных опций Intl использует:

  • тайские цифры (в зависимости от реализации)
  • буддийский календарь для дат
  • локальные правила сортировки

Явное управление через options или Unicode extension является единственным способом стабилизировать поведение между платформами.