Интерполяция представляет собой механизм подстановки динамических значений в переводы. Она позволяет формировать строки, которые зависят от состояния приложения, данных пользователя или бизнес-логики, при этом сохраняя текстовые ресурсы структурированными и переиспользуемыми.
Основная идея заключается в том, что перевод содержит шаблон с плейсхолдерами, а при выполнении подставляются конкретные значения.
В ресурсах переводов используются фигурные скобки:
{
"welcome": "Привет, {{name}}!"
}
При вызове:
i18next.t('welcome', { name: 'Алексей' });
результат:
Привет, Алексей!
Механизм интерполяции работает на уровне строки, заменяя все
совпадения {{ключ}} значениями из объекта параметров.
Один перевод может содержать несколько интерполируемых значений:
{
"order": "Заказ №{{id}} на сумму {{price}} ₽"
}
i18next.t('order', { id: 4578, price: 1290 });
Результат:
Заказ №4578 на сумму 1290 ₽
Подстановка выполняется независимо для каждого ключа.
При отсутствии переданного параметра используется пустая строка или явно заданное значение через fallback-структуру:
{
"greeting": "Здравствуйте, {{name}}!"
}
i18next.t('greeting');
Результат:
Здравствуйте, !
Для предотвращения подобных ситуаций применяется конструкция с дефолтным значением:
{
"greeting": "Здравствуйте, {{name, пользователь}}!"
}
Интерполяция поддерживает обращение к вложенным структурам данных:
i18next.t('user', {
user: {
profile: {
name: 'Мария'
}
}
});
Ресурс:
{
"profile": "Имя пользователя: {{user.profile.name}}"
}
Результат:
Имя пользователя: Мария
Доступ осуществляется через точечную нотацию.
По умолчанию интерполируемые значения экранируются для защиты от XSS-уязвимостей:
{
"text": "Комментарий: {{value}}"
}
Если значение содержит HTML:
i18next.t('text', { value: '<script>alert(1)</script>' });
результат будет экранирован:
Комментарий: <script>alert(1)</script>
Параметр escapeValue управляет этим поведением:
i18next.init({
interpolation: {
escapeValue: false
}
});
Отключение экранирования применяется в средах, где HTML обрабатывается отдельно (например, React уже выполняет защиту на уровне виртуального DOM).
Интерполяция поддерживает преобразование значений через форматтеры.
{
"price": "Цена: {{value, currency}}"
}
i18next.init({
interpolation: {
format: (value, format) => {
if (format === 'currency') {
return `${value} ₽`;
}
return value;
}
}
});
Результат:
Цена: 1000 ₽
При необходимости комбинирования форматов используется
formatSeparator:
{
"date": "{{value, datetime, short}}"
}
i18next.init({
interpolation: {
formatSeparator: ','
}
});
Форматтер может учитывать тип данных:
function format(value, format) {
switch (format) {
case 'uppercase':
return String(value).toUpperCase();
case 'lowercase':
return String(value).toLowerCase();
default:
return value;
}
}
i18next.init({
interpolation: {
format
}
});
{
"title": "{{name, uppercase}}"
}
Интерполяция может комбинироваться с вложенными ключами перевода
через $t:
{
"inner": "мир",
"outer": "Привет, $t(inner)!"
}
Результат:
Привет, мир!
Такой подход позволяет строить составные строки без дублирования текста.
Массивы подставляются после преобразования в строку:
i18next.t('list', { items: ['яблоко', 'груша', 'слива'] });
{
"list": "Список: {{items}}"
}
Результат:
Список: яблоко,груша,слива
Для более контролируемого вывода применяется предварительная обработка данных через форматтер.
Работа интерполяции идентична базовой конфигурации, так как отсутствует DOM-слой.
Особое значение имеет экранирование HTML, предотвращающее внедрение скриптов.
В связке с React интерполяция часто комбинируется с компонентами:
<t i18nKey="welcome" values={{ name: 'Иван' }} />
React дополнительно обрабатывает вывод, снижая необходимость ручного экранирования.
Внутренний процесс включает несколько этапов:
{{...}}Последовательность важна при комбинировании форматирования и вложенных ключей.
При интенсивном использовании интерполяции учитываются следующие факторы:
Оптимизация достигается за счёт упрощения структуры интерполяции и минимизации вложенности объектов.