Интерфейс, корректно локализованный для разных языков и регионов,
становится более предсказуемым для экранных читалок. Библиотека
Intl API напрямую влияет на то, как синтезаторы речи
озвучивают:
Неправильное форматирование приводит к тому, что экранная читалка читает данные механически или неоднозначно. Особенно заметны ошибки при озвучивании:
Ручное форматирование строк часто создаёт трудности для вспомогательных технологий.
const date = new Date();
const formatted =
date.getDate() + '.' +
(date.getMonth() + 1) + '.' +
date.getFullYear();
console.log(formatted);
Строка:
12.05.2026
может быть озвучена как:
двенадцать точка ноль пять точка две тысячи двадцать шесть
или даже посимвольно, в зависимости от читалки и локали.
Intl.DateTimeFormatconst formatter = new Intl.DateTimeFormat('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
console.log(formatter.format(new Date()));
Результат:
12 мая 2026 г.
Экранная читалка интерпретирует такую строку как естественную дату.
05/12/26
Проблемы:
const formatter = new Intl.DateTimeFormat('ru-RU', {
weekday: 'long',
day: 'numeric',
month: 'long',
year: 'numeric'
});
Результат:
вторник, 12 мая 2026 г.
Такой формат:
const formatter = new Intl.DateTimeFormat('ru-RU', {
hour: '2-digit',
minute: '2-digit'
});
console.log(formatter.format(new Date()));
Результат:
09:05
Некоторые читалки озвучивают подобные значения как:
ноль девять двоеточие ноль пять
const formatter = new Intl.DateTimeFormat('ru-RU', {
hour: 'numeric',
minute: 'numeric'
});
Результат:
9:05
Озвучивание становится более естественным:
девять часов пять минут
const price = '1,234,567.89';
В русской локали подобная запись может озвучиваться неправильно.
Intl.NumberFormatconst formatter = new Intl.NumberFormat('ru-RU');
console.log(formatter.format(1234567.89));
Результат:
1 234 567,89
Преимущества:
1000 RUB
Экранная читалка может прочитать:
один ноль ноль ноль руб
или:
руб
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
console.log(formatter.format(1000));
Результат:
1 000,00 ₽
Синтезатор речи обычно озвучивает:
одна тысяча рублей
const usd = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
const de = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
});
console.log(usd.format(1500));
console.log(de.format(1500));
Результат:
$1,500.00
1.500,00 €
Экранные читалки учитывают региональные правила произношения.
currencyDisplayconst formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'USD',
currencyDisplay: 'name'
});
console.log(formatter.format(25));
Результат:
25,00 доллара США
Для доступности такой формат значительно лучше сокращений.
25%
Некоторые читалки произносят символ отдельно.
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'percent'
});
console.log(formatter.format(0.25));
Результат:
25 %
Читалки обычно корректно озвучивают:
двадцать пять процентов
unitconst formatter = new Intl.NumberFormat('ru-RU', {
style: 'unit',
unit: 'kilometer-per-hour'
});
console.log(formatter.format(90));
Результат:
90 км/ч
Синтезатор речи способен интерпретировать значение как:
девяносто километров в час
const formatter = new Intl.NumberFormat('ru-RU', {
style: 'unit',
unit: 'liter',
unitDisplay: 'long'
});
console.log(formatter.format(5));
Результат:
5 литров
Длинные формы предпочтительнее для доступности.
Intl.RelativeTimeFormatconst formatter = new Intl.RelativeTimeFormat('ru-RU', {
numeric: 'auto'
});
console.log(formatter.format(-1, 'day'));
Результат:
вчера
Это лучше для экранных читалок, чем:
1 день назад
const formatter = new Intl.RelativeTimeFormat('ru-RU', {
numeric: 'auto'
});
console.log(formatter.format(1, 'day'));
console.log(formatter.format(-1, 'week'));
Результат:
завтра
на прошлой неделе
Подобные конструкции воспринимаются быстрее и естественнее.
const text = 'HTML, CSS и JavaScript';
При разных локалях соединители отличаются.
Intl.ListFormatconst formatter = new Intl.ListFormat('ru-RU', {
style: 'long',
type: 'conjunction'
});
console.log(
formatter.format(['HTML', 'CSS', 'JavaScript'])
);
Результат:
HTML, CSS и JavaScript
Intl.ListFormat автоматически использует:
const formatter = new Intl.ListFormat('en-US', {
style: 'long',
type: 'disjunction'
});
console.log(
formatter.format(['tea', 'coffee', 'juice'])
);
Результат:
tea, coffee, or juice
Экранные читалки правильно выделяют логическое разделение элементов.
formatRangeconst formatter = new Intl.DateTimeFormat('ru-RU', {
day: 'numeric',
month: 'long'
});
const start = new Date(2026, 4, 10);
const end = new Date(2026, 4, 15);
console.log(
formatter.formatRange(start, end)
);
Результат:
10–15 мая
Это лучше, чем ручная запись:
10 мая - 15 мая
const formatter = new Intl.DateTimeFormat('ru-RU', {
hour: 'numeric',
minute: 'numeric'
});
console.log(
formatter.formatRange(
new Date(2026, 0, 1, 9, 0),
new Date(2026, 0, 1, 18, 0)
)
);
Результат:
09:00–18:00
Читалки распознают диапазон как единое выражение.
Intl.SegmenterAPI помогает разбивать текст на:
Это важно для:
const segmenter = new Intl.Segmenter('ru-RU', {
granularity: 'word'
});
const segments =
segmenter.segment('Привет, мир!');
for (const item of segments) {
console.log(item.segment);
}
Результат:
Привет
,
мир
!
Некоторые вспомогательные технологии используют сегментацию для:
const formatter = new Intl.NumberFormat('ru-RU');
console.log(formatter.format(1234.56));
Если интерфейс английский, а число отформатировано по русским правилам, экранная читалка может переключаться между языковыми моделями некорректно.
Важно, чтобы:
lang в HTML совпадал с локалью;Intl API использовал ту же языковую конфигурацию;navigator.languageconst locale = navigator.language;
const formatter = new Intl.DateTimeFormat(locale, {
dateStyle: 'long'
});
console.log(
formatter.format(new Date())
);
Такой подход помогает синхронизировать:
12 тыс.
Экранная читалка может произнести:
двенадцать тис
const formatter = new Intl.NumberFormat('ru-RU', {
notation: 'compact',
compactDisplay: 'long'
});
console.log(formatter.format(12000));
Результат:
12 тысяч
Полная форма значительно лучше для синтеза речи.
formatToPartsconst formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
console.log(
formatter.formatToParts(1500)
);
Метод позволяет отдельно получить:
const parts =
formatter.formatToParts(1500);
const html = parts.map(part => {
if (part.type === 'currency') {
return `<span aria-label="рублей">${part.value}</span>`;
}
return part.value;
}).join('');
Подобный подход улучшает озвучивание специальных символов.
const formatter = new Intl.RelativeTimeFormat('ru-RU', {
style: 'long'
});
console.log(formatter.format(-5, 'minute'));
Результат:
5 минут назад
Экранные читалки обычно воспринимают такие конструкции как естественную речь.
const formatter = new Intl.DateTimeFormat('ja-JP-u-ca-japanese');
console.log(
formatter.format(new Date())
);
Intl API учитывает:
Это особенно важно в мультиязычных интерфейсах.
dateStyle и timeStyleconst formatter = new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'full',
timeStyle: 'short'
});
console.log(
formatter.format(new Date())
);
Результат может выглядеть так:
вторник, 12 мая 2026 г., 09:15
Такой формат хорошо подходит для:
Некоторые разработчики используют декоративные разделители:
12 • 05 • 2026
или:
10 → 15 мая
Экранные читалки могут:
Intl API избавляет от необходимости использовать
нестандартные конструкции вручную.
supportedLocalesOfconsole.log(
Intl.DateTimeFormat.supportedLocalesOf([
'ru-RU',
'fr-FR',
'ar-EG'
])
);
Метод помогает убедиться, что:
Предпочтительно:
dateStyle.Нежелательно:
Предпочтительно:
Intl.NumberFormat;Нежелательно:
Предпочтительно:
currencyDisplay: 'name';Предпочтительно:
Intl.ListFormat;Intl.Segmenter;Предпочтительно:
Intl.RelativeTimeFormat;