Тестирование локализации

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

Подключение локалей

Для работы с локалями в Moment.js необходимо подключить соответствующую локаль и установить её через метод moment.locale():

const moment = require('moment');
require('moment/locale/ru');

moment.locale('ru');

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

Форматирование дат и времени

Moment.js поддерживает гибкое форматирование с помощью метода format(). При тестировании локализации важно проверять:

  • Корректное отображение дней недели (dddd), например, «понедельник» или «воскресенье».
  • Правильное отображение месяцев (MMMM), например, «январь», «февраль».
  • Соответствие коротких форматов (MMM) локальным стандартам, например, «янв» для русского.
  • Форматы времени (HH:mm, h:mm A) с учётом локальных особенностей, например, использование 24-часового или 12-часового формата.

Пример теста форматирования для локали «ru»:

const date = moment('2026-05-22T15:30:00');
console.log(date.format('dddd, D MMMM YYYY HH:mm')); // "пятница, 22 мая 2026 15:30"

Проверка относительных дат

Moment.js позволяет отображать временные промежутки относительно текущего момента с помощью методов fromNow() и toNow(). Для тестирования локализации необходимо убедиться, что строки правильно склоняются:

moment.locale('ru');
console.log(moment().add(1, 'day').fromNow()); // "через день"
console.log(moment().subtract(2, 'hours').fromNow()); // "2 часа назад"

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

Тестирование календарных форматов

Метод calendar() используется для отображения дат относительно текущего дня, например, «Сегодня в 15:30» или «Вчера в 09:00». Тестирование включает:

  • Проверку корректного отображения сегодня/вчера/завтра.
  • Корректное форматирование часов и минут.
  • Проверку локальных особенностей формата.

Пример:

const now = moment();
const yesterday = moment().subtract(1, 'day');
console.log(now.calendar()); // "Сегодня в 15:30"
console.log(yesterday.calendar()); // "Вчера в 15:30"

Тестирование начала недели и недельного номера

В разных локалях начало недели может отличаться. В Moment.js это настраивается через объект локали week:

const localeData = moment.localeData('ru');
console.log(localeData.firstDayOfWeek()); // 1 (понедельник)
console.log(localeData.week()); // параметры для вычисления номера недели

Для тестирования необходимо:

  • Проверять, что метод week() возвращает правильный номер недели.
  • Убедиться, что функции для определения начала недели соответствуют стандартам локали.

Склонение и род

Многие языки, включая русский, используют склонение и род для числительных и месяцев. Moment.js поддерживает это через локализационные файлы, и тестирование должно проверять:

  • Падежи месяцев при форматировании (D MMMM vs MMMM D).
  • Корректное использование родов для относительных выражений.
  • Обновление локалей при изменении языка через moment.locale(newLocale).

Автоматизация тестов

Для больших проектов рекомендуется создавать автоматические тесты локализации. Примеры методов:

  • Снапшот-тесты: сравнение форматированного вывода с ожидаемыми строками.
  • Проверка числительных и падежей: генерация различных чисел и проверка склонения.
  • Кросс-локальные тесты: проверка одной и той же даты в нескольких локалях.

Пример автоматического теста с использованием Jest:

test('формат даты для локали ru', () => {
    moment.locale('ru');
    const date = moment('2026-05-22T15:30:00');
    expect(date.format('dddd, D MMMM YYYY HH:mm')).toBe('пятница, 22 мая 2026 15:30');
});

Итоговые рекомендации

  • Всегда загружать и активировать нужную локаль перед тестированием.
  • Проверять все основные методы: format(), fromNow(), calendar(), week().
  • Обращать внимание на склонения, род и падежи в языках с их наличием.
  • Использовать автоматизацию для регулярной проверки корректности локализации.

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