Глобальные настройки

timeago.js предоставляет ограниченный набор глобальных конфигураций, влияющих на поведение библиотеки во всём приложении. В отличие от объектно-ориентированных библиотек с центральным конфигом, timeago.js придерживается функционального подхода: глобальным является реестр локалей.


Реестр локалей как глобальное состояние

Единственное глобальное состояние, которым управляет timeago.js — это словарь зарегистрированных локалей. Функция register добавляет запись в этот словарь:

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

register('ru', ru);

После вызова register локаль 'ru' становится доступной для всех последующих вызовов format в любом месте приложения.


Встроенная локаль по умолчанию

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


Регистрация нескольких локалей при старте

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);

Это делается один раз при инициализации приложения.


Регистрация собственной локали как глобальной

import { register } from 'timeago.js';

const customLocale = (number, index) => {
  return [
    ['только что', 'прямо сейчас'],
    ['%s сек. назад', 'через %s сек.'],
    ['1 мин. назад', 'через 1 мин.'],
    ['%s мин. назад', 'через %s мин.'],
    ['1 ч. назад', 'через 1 ч.'],
    ['%s ч. назад', 'через %s ч.'],
    ['1 д. назад', 'через 1 д.'],
    ['%s д. назад', 'через %s д.'],
    ['1 нед. назад', 'через 1 нед.'],
    ['%s нед. назад', 'через %s нед.'],
    ['1 мес. назад', 'через 1 мес.'],
    ['%s мес. назад', 'через %s мес.'],
    ['1 г. назад', 'через 1 г.'],
    ['%s л. назад', 'через %s л.'],
  ][index];
};

register('ru_short', customLocale);

После регистрации 'ru_short' доступна глобально.


Глобальный модуль конфигурации

В реальных проектах удобно вынести инициализацию timeago.js в отдельный файл:

// src/config/timeago.js

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

register('ru', ru);

export const LOCALE = 'ru';

В точке входа:

// src/main.js

import './config/timeago';

Отсутствие глобального setLocale

timeago.js не предоставляет функцию setLocale() для установки локали по умолчанию. При каждом вызове format локаль указывается явно:

format(date, 'ru');

Если требуется глобальная локаль по умолчанию, её обычно задают через обёртку:

// src/utils/time.js

import { format } from 'timeago.js';

const APP_LOCALE = 'ru';

export function ago(date) {
  return format(date, APP_LOCALE);
}

Глобальное переопределение стандартной локали

Встроенную локаль 'en_US' можно переопределить, зарегистрировав своё значение под тем же ключом:

import { register } from 'timeago.js';

register('en_US', (number, index) => {
  // Кастомные строки вместо стандартных
  return [
    ['just now', 'right now'],
    ['%s secs ago', 'in %s secs'],
    // ...
  ][index];
});

После этого все вызовы format(date) (без явного указания локали) будут использовать переопределённые строки.


Глобальные настройки в многопоточных средах (SSR)

На сервере с Node.js реестр локалей является единым для всего процесса. Если несколько параллельных запросов регистрируют одну и ту же локаль — это не создаёт проблем (регистрация идемпотентна). Однако попытка использовать одну локаль для одного запроса и другую — для второго одновременно может привести к неожиданным результатам в гонках.


Ограничения глобальной конфигурации

timeago.js не предоставляет возможностей для глобальной настройки:

  • интервалов обновления;
  • пороговых значений переключения единиц;
  • формата placeholder %s;
  • поведения при Invalid Date.

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


Конфигурация через переменные среды (пример)

// src/config/timeago.js

import { register } from 'timeago.js';
import ru from 'timeago.js/esm/lang/ru';
import en from 'timeago.js/esm/lang/en_US';

const LANG = process.env.REACT_APP_LOCALE || 'ru';

register('ru', ru);
register('en_US', en);

export const APP_LOCALE = LANG;

Проверка зарегистрированных локалей

Реестр локалей внутри библиотеки является внутренним объектом и не экспортируется публично. Чтобы проверить, зарегистрирована ли локаль, можно попробовать форматирование с fallback:

import { format } from 'timeago.js';

function tryFormat(date, locale) {
  try {
    const result = format(date, locale);
    return result;
  } catch (e) {
    return format(date, 'en_US');
  }
}

Итог: что является глобальным в timeago.js

Аспект Глобальный? Как управлять
Реестр локалей Да register()
Локаль по умолчанию Нет Обёртка над format
Пороги единиц времени Да (нельзя менять напрямую) Кастомный рендер
Интервалы обновления Да (нельзя менять напрямую) Кастомный рендер
Таймеры render() Глобальные cancel()