Подключение языковых пакетов

timeago.js поставляется с набором встроенных языковых пакетов. Они хранятся в директории lang внутри пакета и импортируются напрямую. Каждый языковой пакет — это функция, реализующая логику форматирования для конкретного языка.


Структура языковых пакетов

После установки пакета языки доступны по следующим путям:

node_modules/timeago.js/esm/lang/
├── ar.js
├── be.js
├── bg.js
├── ca.js
├── da.js
├── de.js
├── el.js
├── en_US.js
├── es.js
├── eu.js
├── fa.js
├── fi.js
├── fr.js
├── gl.js
├── he.js
├── hr.js
├── hu.js
├── hy.js
├── id.js
├── in_BG.js
├── in_HI.js
├── in_ID.js
├── it.js
├── ja.js
├── ka.js
├── ko.js
├── ml.js
├── my.js
├── nb_NO.js
├── nl.js
├── pl.js
├── pt_BR.js
├── ro.js
├── ru.js
├── sq.js
├── sr.js
├── sv.js
├── ta.js
├── th.js
├── tr.js
├── uk.js
├── vi.js
├── zh_CN.js
├── zh_TW.js

Подключение русского языка

import { register, format } from 'timeago.js';
import ru from 'timeago.js/esm/lang/ru';

register('ru', ru);

format(Date.now() - 1000 * 60 * 60, 'ru');
// → "1 час назад"

Подключение нескольких языков

import { register } from 'timeago.js';
import ru from 'timeago.js/esm/lang/ru';
import de from 'timeago.js/esm/lang/de';
import fr from 'timeago.js/esm/lang/fr';
import zh_CN from 'timeago.js/esm/lang/zh_CN';

register('ru', ru);
register('de', de);
register('fr', fr);
register('zh_CN', zh_CN);

Использование CommonJS

const { register, format } = require('timeago.js');
const ru = require('timeago.js/esm/lang/ru');

register('ru', ru);

Если возникают проблемы с импортом ESM-файла через CommonJS, используйте путь к CJS-версии (если доступна) или динамический импорт.


Динамическая загрузка языкового пакета

Чтобы не включать все локали в основной бандл, можно загружать их по требованию:

import { register, format } from 'timeago.js';

async function loadLocale(locale) {
  const module = await import(`timeago.js/esm/lang/${locale}.js`);
  register(locale, module.default);
}

// Загрузить нужную локаль при смене языка
await loadLocale('ru');
format(Date.now() - 3600000, 'ru');

Подключение в TypeScript

import { register, format } from 'timeago.js';
import ru from 'timeago.js/esm/lang/ru';

register('ru', ru);

const label: string = format(new Date(), 'ru');

Если TypeScript не видит типы для языковых пакетов, добавьте объявление:

declare module 'timeago.js/esm/lang/ru' {
  const locale: (number: number, index: number) => [string, string];
  export default locale;
}

Встроенная локаль en_US

Английский язык доступен без явной регистрации — он встроен по умолчанию:

import { format } from 'timeago.js';

format(Date.now() - 3600000); // без локали → en_US
// → "1 hour ago"

format(Date.now() - 3600000, 'en_US'); // явно
// → "1 hour ago"

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

Языки с направлением текста справа налево (арабский, иврит, персидский) подключаются так же:

import { register, format } from 'timeago.js';
import ar from 'timeago.js/esm/lang/ar';
import he from 'timeago.js/esm/lang/he';
import fa from 'timeago.js/esm/lang/fa';

register('ar', ar);
register('he', he);
register('fa', fa);

format(Date.now() - 3600000, 'ar');
// → "منذ ساعة"

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

import uk from 'timeago.js/esm/lang/uk';

register('uk', uk);

format(Date.now() - 1000 * 60 * 5, 'uk');
// → "5 хвилин тому"

Центральная инициализация языков

Рекомендуемый паттерн для приложений с поддержкой нескольких языков:

// src/i18n/timeago.js

import { register } from 'timeago.js';

import ru from 'timeago.js/esm/lang/ru';
import en from 'timeago.js/esm/lang/en_US';
import de from 'timeago.js/esm/lang/de';

const locales = { ru, en_US: en, de };

Object.entries(locales).forEach(([key, fn]) => register(key, fn));

export const SUPPORTED_LOCALES = Object.keys(locales);

Проверка доступности языка

import { format } from 'timeago.js';

const SUPPORTED = new Set(['ru', 'en_US', 'de', 'fr']);

function safeFormat(date, locale) {
  const safeLocale = SUPPORTED.has(locale) ? locale : 'en_US';
  return format(date, safeLocale);
}

Отличие языкового пакета от самостоятельной локали

Языковой пакет — это готовая функция из поставки библиотеки. Самостоятельная локаль — это функция, написанная разработчиком. Обе регистрируются через register одинаково:

// Встроенный пакет
import ru from 'timeago.js/esm/lang/ru';
register('ru', ru);

// Самостоятельная локаль
register('ru_custom', (n, i) => customStrings[i]);

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