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';
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) (без явного указания
локали) будут использовать переопределённые строки.
На сервере с Node.js реестр локалей является единым для всего процесса. Если несколько параллельных запросов регистрируют одну и ту же локаль — это не создаёт проблем (регистрация идемпотентна). Однако попытка использовать одну локаль для одного запроса и другую — для второго одновременно может привести к неожиданным результатам в гонках.
timeago.js не предоставляет возможностей для глобальной настройки:
%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');
}
}
| Аспект | Глобальный? | Как управлять |
|---|---|---|
| Реестр локалей | Да | register() |
| Локаль по умолчанию | Нет | Обёртка над format |
| Пороги единиц времени | Да (нельзя менять напрямую) | Кастомный рендер |
| Интервалы обновления | Да (нельзя менять напрямую) | Кастомный рендер |
| Таймеры render() | Глобальные | cancel() |