Обзор
gt-i18n теперь предоставляет переводы на основе словарей для интеграций с фреймворками. В приложениях Node.js используйте публичный экспорт getTranslations() из gt-node; gt-i18n@0.9.0 не экспортирует его из корня пакета.
| Пакет | Версия |
|---|---|
gt-i18n | 0.9.0 |
gt-node | 0.7.0 |
Настройка
Создайте в корне проекта файл dictionary.json с исходными (английскими) строками:
{
"greeting": {
"hello": "Hello!"
},
"user": {
"welcome": "Welcome, {name}!"
},
"errors": {
"notFound": "Page not found",
"unauthorized": "Access denied"
}
}Когда вы запускаете CLI (npx gt translate), он находит dictionary.json в корне проекта и переводит его для настроенных локалей.
Настройте среду выполнения Node.js с помощью initializeGT:
import { initializeGT } from 'gt-node';
import dictionary from './dictionary.json';
initializeGT({
defaultLocale: 'en',
locales: ['en', 'es'],
dictionary,
});Использование
Имея приведённый выше исходный словарь, вызовите getTranslations(), чтобы получить функцию t, которая возвращает записи из вашего словаря:
import { getTranslations, withGT } from 'gt-node';
await withGT('en', async () => {
const t = await getTranslations();
t('greeting.hello'); // "Привет!"
t('user.welcome', { name: 'Alice' }); // "Добро пожаловать, Alice!"
});Подсловари с t.obj()
t() возвращает одну строку. t.obj() возвращает целое поддерево словаря в виде объекта:
// Внутри приведённого выше callback withGT:
t('errors.notFound'); // "Страница не найдена"
const errors = t.obj('errors');
// { notFound: "Страница не найдена", unauthorized: "Доступ запрещён" }Если в переведённом словаре отсутствуют ключи, недостающие записи берутся из исходного словаря. Это значит, что частичные переводы не вызовут ошибок при выполнении — для непереведённых ключей будет использоваться исходный текст.
Поведение поиска
Поиск выполняется по двум правилам:
- Нет перевода → используется локаль по умолчанию. Если ключ существует в исходном словаре, но для текущей локали у него нет перевода,
t()возвращает исходный текст. - Нет исходной записи → ошибка. Если ключа вообще нет в исходном словаре,
t()выбрасывает ошибку. Это сделано намеренно: если ключ не определён в исходном тексте, это баг, а не отсутствующий перевод. В рамках предстоящего рефакторинга такое поведение будет применяться во всех библиотеках GT.
Второе правило предполагает, что переведённые словари соответствуют структуре исходного словаря — именно так GT автоматически создаёт переводы.