В i18next процесс получения финальной строки перевода проходит через несколько этапов: загрузка ресурсов, выбор ключа, интерполяция переменных и последующая обработка результата. Post-processor подключается на финальной стадии и изменяет уже сформированную строку перед возвратом в приложение.
Ключевая особенность этого этапа заключается в том, что входом всегда выступает готовый перевод, а не ключ и не сырые ресурсы. Это делает post-processor удобным инструментом для форматирования, пост-обработки HTML, маскирования текста, применения кастомных правил отображения и интеграции сторонних систем.
Post-processor реализуется как объект с методом обработки строки. Он регистрируется в экземпляре i18next и вызывается автоматически при указании имени процессора в опциях перевода.
Общий поток выглядит следующим образом:
Post-processor может быть применён:
t()Любой post-processor реализует контракт:
name — имя процессораprocess(value, key, options, translator) — функция
обработки строкиconst myPostProcessor = {
name: 'myPostProcessor',
process(value, key, options, translator) {
return value;
}
};
value — строка перевода после интерполяцииkey — ключ переводаoptions — параметры вызова t()translator — экземпляр i18next (доступ к API внутри
процесса)Для подключения используется метод addPostProcessor:
import i18next from 'i18next';
i18next.addPostProcessor('uppercase', {
name: 'uppercase',
process(value) {
return value.toUpperCase();
}
});
После регистрации процессор становится доступен через опцию
postProcess.
Применение происходит через параметр postProcess:
i18next.t('welcome_message', {
postProcess: 'uppercase'
});
Можно применять несколько процессоров последовательно:
i18next.t('welcome_message', {
postProcess: 'trim,uppercase'
});
В этом случае строка проходит через цепочку обработчиков слева направо.
В экосистеме i18next существует ряд распространённых post-processor решений, применяемых через плагины:
Каждый из них реализуется как отдельный модуль, подключаемый через
addPostProcessor.
Post-processor часто используется для фильтрации HTML-строк:
const sanitizePostProcessor = {
name: 'sanitize',
process(value) {
return value.replace(/<script[^>]*>.*?<\/script>/gi, '');
}
};
i18next.addPostProcessor('sanitize', sanitizePostProcessor);
Использование:
i18next.t('html_content', {
postProcess: 'sanitize'
});
Пост-обработка может использоваться для трансформации строк без изменения переводов:
const exclamationPostProcessor = {
name: 'exclaim',
process(value) {
return `${value}!`;
}
};
i18next.addPostProcessor('exclaim', exclamationPostProcessor);
Применение:
i18next.t('hello', {
postProcess: 'exclaim'
});
Третий параметр translator позволяет взаимодействовать с
системой перевода:
const debugPostProcessor = {
name: 'debug',
process(value, key, options, translator) {
console.log('Key:', key);
console.log('Options:', options);
console.log('Language:', translator.language);
return value;
}
};
Это полезно для отладки, аналитики и динамического изменения поведения в зависимости от языка.
Post-processor может менять поведение на основе параметров:
const genderPostProcessor = {
name: 'gender',
process(value, key, options) {
if (options.gender === 'female') {
return value.replace('User', 'User (f)');
}
return value;
}
};
Использование:
i18next.t('user_label', {
gender: 'female',
postProcess: 'gender'
});
Post-processor’ы могут комбинироваться. Порядок выполнения имеет значение:
i18next.t('message', {
postProcess: 'trim,uppercase,sanitize'
});
Каждый процессор получает результат предыдущего, формируя конвейер обработки строки.
Post-processor удобно выносить в отдельные модули:
export const capitalizePostProcessor = {
name: 'capitalize',
process(value) {
return value.charAt(0).toUpperCase() + value.slice(1);
}
};
Подключение:
i18next.addPostProcessor(capitalizePostProcessor.name, capitalizePostProcessor);
Такая структура позволяет:
Post-processor применяется после интерполяции:
i18next.t('greeting', {
name: 'Alex',
postProcess: 'uppercase'
});
Если перевод:
Hello {{name}}
Результат интерполяции → Hello Alex После post-process →
HELLO ALEX
Важно учитывать последовательность этапов:
Это означает, что post-processor работает с уже финальной формой строки, что исключает необходимость ручной обработки интерполяционных конструкций.
Post-processor не предназначен для:
Все операции выполняются синхронно. Возвращаемое значение должно быть строкой.
Так как post-processor вызывается при каждом t():
processОптимизация достигается за счёт:
Post-processor используется в сложных системах локализации:
Post-processor является частью расширяемой архитектуры i18next и может использоваться совместно с:
Он всегда выполняется после основной цепочки перевода, не влияя на upstream-логику.