Поддержка screen readers

Поддержка экранных считывателей в интерфейсах, использующих интернационализацию, напрямую зависит от корректной генерации текстового контента. Библиотека Globalize в JavaScript играет ключевую роль в стандартизации форматирования дат, чисел, валют и сообщений, которые воспринимаются screen readers как обычный текст. Любое несоответствие локали или структуры текста приводит к ухудшению семантической интерпретации интерфейса вспомогательными технологиями.

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

Globalize обеспечивает согласованное преобразование данных в человеко-читаемый формат с учётом локали, что критично для точного восприятия информации пользователями вспомогательных технологий.


Роль Globalize в формировании доступного текста

Globalize основан на данных CLDR (Unicode Common Locale Data Repository), которые содержат правила форматирования для множества языков и регионов. Эти данные используются для генерации:

  • числовых форматов;
  • валютных представлений;
  • дат и времени;
  • сообщений с множественными формами (plural rules).

Каждый из этих типов данных напрямую влияет на то, как screen reader озвучивает интерфейс.

Числовые значения и семантическая ясность

Форматирование чисел без учёта локали может приводить к неоднозначному произношению. Например:

Globalize.locale("en");
Globalize.formatNumber(1234567.89);

Результат: 1,234,567.89

Для screen reader это может быть прочитано как последовательность цифр с паузами, зависящими от движка синтеза речи.

В локали, где используется пробел как разделитель тысяч:

Globalize.locale("fr");
Globalize.formatNumber(1234567.89);

Результат: 1 234 567,89

Такое представление обеспечивает корректное интонационное разделение числовых групп, что уменьшает когнитивную нагрузку при восприятии.


Форматирование валют и избегание неоднозначности

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

Globalize.locale("en");
Globalize.formatCurrency(1999.5, "USD");

Результат: $1,999.50

Globalize.locale("de");
Globalize.formatCurrency(1999.5, "EUR");

Результат: 1.999,50 €

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


Даты и временные метки в контексте экранных считывателей

Даты являются одним из наиболее проблемных типов данных для доступности. Визуально компактные форматы часто оказываются семантически неочевидными при озвучивании.

Globalize.locale("en");
Globalize.formatDate(new Date(2026, 4, 28), { date: "short" });

Результат: 5/28/26

Такой формат может быть интерпретирован неоднозначно в зависимости от локали screen reader.

Более безопасное представление:

Globalize.formatDate(new Date(2026, 4, 28), { date: "full" });

Результат: Thursday, May 28, 2026

Полный формат обеспечивает явное указание дня недели и месяца, что улучшает восприятие при аудио-озвучивании.


ARIA-атрибуты и интеграция с Globalize

ARIA-атрибуты используются для передачи дополнительной семантики элементам интерфейса. Однако они не должны содержать «сырые» значения без локализации.

aria-label с форматированными значениями

Неправильный подход:

button.setAttribute("aria-label", "Balance: 1234567.89 USD");

Правильный подход с Globalize:

const number = Globalize.formatNumber(1234567.89);
const currency = Globalize.formatCurrency(1234567.89, "USD");

button.setAttribute(
  "aria-label",
  `Balance: ${currency}`
);

Screen reader получает уже структурированную строку, соответствующую локали пользователя.


aria-live и динамическое обновление локализованного контента

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

const liveRegion = document.getElementById("status");

Globalize.locale("en");

const message = Globalize.formatMessage(
  {
    value: "Items loaded: {count}"
  },
  { count: Globalize.formatNumber(42) }
);

liveRegion.textContent = message;

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


Множественные формы и корректное озвучивание plural rules

Одной из наиболее значимых функций Globalize является поддержка правил множественного числа, основанных на CLDR.

Globalize.locale("en");

const pluralGenerator = Globalize.pluralGenerator();
const form = pluralGenerator(3);

Далее используется форматирование сообщений:

const message = Globalize.formatMessage(
  {
    one: "{count} item",
    other: "{count} items"
  },
  { count: 3 }
);

Результат: 3 items

Для screen readers это критично, поскольку неправильная форма множественного числа приводит к синтаксической ошибке восприятия: «3 item» воспринимается как грамматически некорректная конструкция, что снижает качество синтеза речи.


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

Message formatting в Globalize обеспечивает единый механизм генерации строк, учитывающий локаль и контекст значений.

Globalize.locale("ru");

const msg = Globalize.formatMessage(
  {
    greeting: "У пользователя {name} {count} новых сообщений"
  },
  {
    name: "Алексей",
    count: Globalize.formatNumber(5)
  }
);

Результат: У пользователя Алексей 5 новых сообщений

Screen reader воспринимает такую строку как цельное семантическое высказывание, а не набор разрозненных значений.


Ошибки, влияющие на качество озвучивания интерфейса

1. Использование нефоматированных чисел

Необработанные значения:

ariaLabel = `Total: ${1000000}`;

Проблема: отсутствие группировки разрядов усложняет восприятие.


2. Смешивание локалей

Globalize.locale("fr");
"Balance: $1,000"

Проблема: несоответствие валютного формата локали приводит к неоднозначному озвучиванию.


3. Перенос визуальных сокращений в текст

Сокращения вроде K, M, B не всегда корректно интерпретируются TTS-движками. Globalize позволяет заменить их полными числовыми формами через форматирование.


Семантическая согласованность DOM и локализации

Экранные считыватели ориентируются на DOM-структуру и текстовое содержимое. При использовании Globalize важно, чтобы:

  • текстовые узлы содержали уже локализованные значения;
  • ARIA-атрибуты не дублировали визуальные сокращения;
  • динамически обновляемые элементы использовали единый формат.

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


Влияние CLDR-данных на доступность

CLDR обеспечивает основу для:

  • правил чтения чисел;
  • форматов дат;
  • грамматических конструкций множественного числа;
  • локальных особенностей пунктуации.

Globalize выступает как слой абстракции, который превращает эти данные в готовые строки. Для screen readers это означает снижение количества неоднозначных конструкций и повышение точности синтеза речи.


Интеграция форматирования в компоненты интерфейса

В UI-компонентах локализованные значения должны формироваться на уровне представления, а не бизнес-логики.

function renderBalance(value) {
  const formatted = Globalize.formatCurrency(value, "USD");
  element.textContent = formatted;
  element.setAttribute("aria-label", formatted);
}

Такой подход гарантирует идентичность визуального и аудиального представления.


Согласование времени и контекста событий

Для событийных интерфейсов важно, чтобы временные метки были озвучены в полном контексте:

const date = Globalize.formatDate(new Date(), { datetime: "long" });

notification.setAttribute(
  "aria-label",
  `Event scheduled at ${date}`
);

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