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);
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');
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;
}
Английский язык доступен без явной регистрации — он встроен по умолчанию:
import { format } from 'timeago.js';
format(Date.now() - 3600000); // без локали → en_US
// → "1 hour ago"
format(Date.now() - 3600000, 'en_US'); // явно
// → "1 hour ago"
Языки с направлением текста справа налево (арабский, иврит, персидский) подключаются так же:
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]);
Встроенные пакеты прошли тестирование и учитывают грамматику языка. Для большинства случаев следует использовать их.