В i18next функция $t() представляет собой основной
механизм получения перевода строки. Помимо простого извлечения значения
по ключу, она позволяет выстраивать систему переиспользования уже
существующих переводов внутри других переводов. Это снижает
дублирование, упрощает поддержку локализации и обеспечивает единообразие
терминологии во всём приложении.
Переиспользование переводов строится на возможности ссылаться на другие ключи внутри строки перевода. Вместо повторного указания текста используется ссылка на уже существующий ключ.
{
"common": {
"save": "Сохранить",
"cancel": "Отмена"
},
"form": {
"submit": "Нажмите «{{save}}» для подтверждения"
}
}
В стандартной конфигурации i18next такие ссылки не интерпретируются
автоматически как вложенные переводы. Для корректной работы используется
интерполяция вместе с вызовом $t() или специальными
конструкциями вложенного перевода.
$t() внутри интерполяцииНаиболее надёжный способ переиспользования — явный вызов
$t() внутри интерполяции.
$t('form.submit', {
save: $t('common.save')
});
В данном случае перевод ключа common.save вычисляется
заранее и передаётся как параметр save в строку
form.submit.
Результат:
Нажмите «Сохранить» для подтверждения
Такой подход гарантирует корректную работу даже при сложных структурах переводов и минимизирует зависимость от внутренних механизмов интерполяции i18next.
При построении интерфейсов часто возникает необходимость комбинировать несколько переводов в одной строке. Переиспользование позволяет собирать сложные фразы из базовых элементов.
{
"status": {
"success": "Успешно",
"error": "Ошибка"
},
"messages": {
"operationResult": "Результат операции: {{status}}"
}
}
$t('messages.operationResult', {
status: $t('status.success')
});
Такой подход обеспечивает единый источник правды для базовых терминов.
i18next поддерживает контекстные переводы, что особенно полезно при повторном использовании строк в разных ситуациях.
{
"button": {
"save": "Сохранить",
"save_context_admin": "Сохранить (администратор)"
}
}
$t('button.save', { context: 'admin' });
При этом можно комбинировать контекст и переиспользование:
$t('form.submit', {
save: $t('button.save', { context: 'admin' })
});
Это позволяет строить гибкую систему локализации без дублирования строк.
В некоторых архитектурах применяется подход, при котором значения
переводов содержат ссылки на другие ключи. Для этого используется
механизм расширения через функцию i18next.t() или
дополнительные плагины.
Пример логической структуры:
{
"actions": {
"confirm": "Подтвердить",
"delete": "Удалить"
},
"dialog": {
"confirmDelete": "Вы уверены, что хотите {{action}}?"
}
}
$t('dialog.confirmDelete', {
action: $t('actions.delete')
});
Результат:
Вы уверены, что хотите Удалить?
При масштабировании приложения важно учитывать влияние
переиспользования на производительность. Частые вложенные вызовы
$t() могут увеличивать количество операций поиска ключей.
Для оптимизации используются следующие подходы:
Пример кэширования:
const t = i18next.t.bind(i18next);
const saveText = t('common.save');
$t('form.submit', {
save: saveText
});
Такой подход уменьшает количество вызовов функции перевода в рантайме.
В динамических приложениях, где интерфейс формируется на основе данных, переиспользование переводов позволяет строить универсальные шаблоны.
const labels = {
submit: $t('common.submit'),
cancel: $t('common.cancel')
};
function renderButton(type) {
return $t(`buttons.${type}`, {
label: labels[type]
});
}
При изменении языка достаточно обновить базовые ключи, и все производные строки автоматически адаптируются.
Допускается многослойная композиция переводов, когда один перевод использует другой, который в свою очередь также основан на базовом ключе.
$t('level3.message', {
action: $t('level2.action', {
base: $t('level1.baseAction')
})
});
Несмотря на гибкость, чрезмерная вложенность усложняет отладку и понимание структуры переводов, поэтому такие конструкции используются ограниченно.
При формировании сложных сообщений, содержащих несколько логических частей, переиспользование переводов позволяет разделить ответственность между ключами.
{
"user": {
"name": "Имя пользователя",
"deleted": "удалён"
},
"notification": {
"accountStatus": "{{name}} был {{status}}"
}
}
$t('notification.accountStatus', {
name: $t('user.name'),
status: $t('user.deleted')
});
Такая структура повышает читаемость и упрощает поддержку многоязычных интерфейсов.
Несмотря на гибкость, переиспользование переводов через
$t() имеет ряд ограничений:
Циклические ссылки, например:
$t('a', { x: $t('b') });
$t('b', { y: $t('a') });
могут привести к логическим ошибкам и непредсказуемому поведению.
Эффективная система переиспользования требует продуманной структуры namespaces:
common/
buttons/
actions/
status/
forms/
validation/
labels/
pages/
home/
dashboard/
Такое разделение позволяет минимизировать пересечения и упростить повторное использование базовых терминов во всех частях приложения.
Переиспользование переводов через $t() становится частью
архитектурного подхода к локализации. Оно позволяет:
При грамотном применении этот механизм превращает i18next из простой библиотеки перевода в инструмент построения устойчивой системы текстовой композиции интерфейса.