Компонент Trans является одним из ключевых
механизмов интеграции интернационализации в React-приложениях при
использовании i18next и его React-обвязки react-i18next. Он
предназначен для рендеринга переводов, содержащих разметку JSX,
вложенные компоненты и динамические значения, сохраняя при этом
чистую структуру переводческих ресурсов.
Основная задача компонента — обеспечить безопасную и декларативную подстановку элементов интерфейса внутрь переводимых строк без необходимости ручного разбиения текста на фрагменты и без потери контекста перевода.
Переводы в i18next традиционно представляют собой строки:
{
"welcome": "Добро пожаловать, {{name}}"
}
Однако при наличии HTML-подобной структуры или React-компонентов строка становится недостаточной:
{
"welcome": "Добро пожаловать, <strong>{{name}}</strong>"
}
Компонент Trans решает задачу интерпретации таких конструкций и их преобразования в React-дерево.
import { Trans } from "react-i18next";
function App() {
return (
<Trans i18nKey="welcome" values={{ name: "Alex" }} />
);
}
Перевод:
{
"welcome": "Добро пожаловать, {{name}}"
}
Одно из ключевых преимуществ Trans — возможность встраивания компонентов прямо в текст перевода.
<Trans i18nKey="description">
Здесь находится <strong>важный текст</strong> внутри строки
</Trans>
Перевод:
{
"description": "Здесь находится <1>важный текст</1> внутри строки"
}
<0>, <1>,
<2> — маркеры элементовРекомендуемый способ управления JSX-вставками:
<Trans
i18nKey="description"
components={{ bold: <strong />, link: <a href="/home" /> }}
/>
Перевод:
{
"description": "Это <bold>жирный текст</bold> и <link>ссылка</link>"
}
components соответствуют именам тегов в
переводеTrans поддерживает многослойные структуры:
<Trans
i18nKey="complex"
components={{
bold: <strong />,
italic: <em />,
link: <a href="/docs" />
}}
/>
{
"complex": "Текст с <bold>жирным</bold>, <italic>курсивом</italic> и <link>ссылкой</link>"
}
<Trans
i18nKey="profile"
values={{ username: "user_42", score: 1200 }}
/>
{
"profile": "Пользователь {{username}} имеет {{score}} очков"
}
<Trans
i18nKey="profile"
values={{ username: "user_42" }}
components={{ strong: <strong /> }}
/>
{
"profile": "Пользователь <strong>{{username}}</strong>"
}
Trans интерпретирует псевдо-HTML внутри переводов.
{
"nested": "Текст <0>с <1>вложенным</1> элементом</0>"
}
<Trans
i18nKey="nested"
components={[<span />, <strong />]}
/>
Trans сохраняет структуру перевода, не разрушая семантику строки:
Это позволяет избегать:
<Trans
i18nKey="order"
values={{ id: 15 }}
components={{ bold: <strong /> }}
/>
{
"order": "Заказ <bold>#{{id}}</bold> успешно создан"
}
В переводах важно учитывать специальные символы:
< > используются как маркеры компонентов{{ }} используются для
переменныхНеправильное использование приводит к:
Компонент Trans не является шаблонизатором общего назначения. Ограничения:
При работе с пространствами имён:
<Trans i18nKey="header:title" />
или
<Trans ns="header" i18nKey="title" />
Структура переводов:
{
"header": {
"title": "Заголовок страницы"
}
}
Trans возвращает React-элементы, что позволяет:
{isVisible && <Trans i18nKey="message" />}
При каждом рендере:
Оптимизация достигается через:
{ "text": "Hello <bold>world</bold>" }
<Trans i18nKey="text" components={{ strong: <strong /> }} />
Несовпадение bold и strong приводит к
отсутствию форматирования.
Чрезмерное количество уровней
<0><1><2> усложняет поддержку и снижает
читаемость переводов.
Переводы не предназначены для бизнес-логики или вычислений, их задача — исключительно представление текста.
useTranslation — получение строки переводаTrans — рендеринг JSX-структуры внутри переводаconst { t } = useTranslation();
t("key");
<Trans i18nKey="key" />
Trans применяется при наличии:
<Trans
i18nKey="example"
components={[<span />, <strong />, <a href="/" />]}
/>
Перевод:
{
"example": "<0>Текст</0> и <1>выделение</1> и <2>ссылка</2>"
}
Если ключ отсутствует:
В архитектурах с высокой степенью локализации Trans становится центральным элементом UI-слоя: