Локализация пользовательского интерфейса является лишь одной частью интернационализации веб-приложения. Для полноценной поддержки нескольких языков необходимо адаптировать содержимое страницы, которое используется поисковыми системами, браузерами и социальными платформами. К таким данным относятся:
title);meta description);В проектах, использующих I18next, перевод мета-информации обычно осуществляется через те же механизмы локализации, что и перевод интерфейса.
<title>Наиболее распространённая задача — перевод заголовка страницы.
Структура переводов:
{
"meta": {
"home": {
"title": "Главная страница"
}
}
}
Для английской локали:
{
"meta": {
"home": {
"title": "Home Page"
}
}
}
Получение перевода:
import i18next from "i18next";
document.title = i18next.t("meta.home.title");
После переключения языка:
i18next.changeLanguage("en").then(() => {
document.title = i18next.t("meta.home.title");
});
В результате браузерная вкладка автоматически отображает локализованный заголовок.
Описание страницы активно используется поисковыми системами.
HTML:
<meta name="description" content="">
Переводы:
{
"meta": {
"home": {
"description": "Каталог товаров и услуг компании"
}
}
}
Обновление значения:
const descriptionTag = document.querySelector(
'meta[name="description"]'
);
descriptionTag.setAttribute(
"content",
i18next.t("meta.home.description")
);
Для английской версии:
{
"meta": {
"home": {
"description": "Company products and services catalog"
}
}
}
После смены языка содержимое мета-тега изменяется автоматически.
Удобно хранить SEO-переводы отдельно от интерфейсных строк.
Пример структуры:
{
"meta": {
"home": {
"title": "Главная",
"description": "Описание главной страницы"
},
"catalog": {
"title": "Каталог",
"description": "Просмотр товаров"
},
"contacts": {
"title": "Контакты",
"description": "Контактная информация"
}
}
}
Такой подход обеспечивает:
В крупных приложениях SEO-данные часто выносятся в отдельный namespace.
Файл:
{
"home": {
"title": "Главная",
"description": "Описание главной страницы"
}
}
Инициализация:
i18next.init({
lng: "ru",
ns: ["common", "seo"],
defaultNS: "common"
});
Получение значений:
i18next.t("home.title", {
ns: "seo"
});
i18next.t("home.description", {
ns: "seo"
});
Преимущества:
Во многих приложениях мета-информация зависит от данных, полученных с сервера.
Переводы:
{
"product": {
"title": "{{name}} — купить по выгодной цене",
"description": "{{name}}. Доставка по всей стране."
}
}
Использование:
const product = {
name: "Ноутбук ProBook"
};
document.title = i18next.t(
"product.title",
{
name: product.name
}
);
Описание:
descriptionTag.setAttribute(
"content",
i18next.t(
"product.description",
{
name: product.name
}
)
);
Для английского языка:
{
"product": {
"title": "{{name}} — buy online",
"description": "{{name}}. Fast worldwide delivery."
}
}
Благодаря интерполяции шаблоны остаются универсальными для любого количества товаров.
Open Graph используется социальными сетями для формирования превью ссылок.
HTML:
<meta property="og:title" content="">
<meta property="og:description" content="">
Переводы:
{
"meta": {
"home": {
"ogTitle": "Добро пожаловать",
"ogDescription": "Лучшие предложения компании"
}
}
}
Обновление тегов:
document
.querySelector(
'meta[property="og:title"]'
)
.setAttribute(
"content",
i18next.t("meta.home.ogTitle")
);
document
.querySelector(
'meta[property="og:description"]'
)
.setAttribute(
"content",
i18next.t("meta.home.ogDescription")
);
Теперь при публикации ссылки в социальных сетях пользователи разных языков будут видеть локализованные описания.
Twitter Card работает аналогично Open Graph.
HTML:
<meta name="twitter:title" content="">
<meta name="twitter:description" content="">
Переводы:
{
"meta": {
"article": {
"twitterTitle": "Новая статья",
"twitterDescription": "Подробный разбор технологии"
}
}
}
Обновление:
document
.querySelector(
'meta[name="twitter:title"]'
)
.setAttribute(
"content",
i18next.t(
"meta.article.twitterTitle"
)
);
Создание отдельной функции значительно упрощает сопровождение приложения.
function updateMeta(page) {
document.title = i18next.t(
`meta.${page}.title`
);
document
.querySelector(
'meta[name="description"]'
)
.setAttribute(
"content",
i18next.t(
`meta.${page}.description`
)
);
}
Использование:
updateMeta("home");
После переключения языка:
i18next.on(
"languageChanged",
() => {
updateMeta("home");
}
);
Все SEO-данные будут синхронизированы с текущей локалью.
В React обычно используется библиотека React Helmet или её современные аналоги.
Пример:
import { Helmet } from "react-helmet";
import { useTranslation } from "react-i18next";
function HomePage() {
const { t } = useTranslation();
return (
<>
<Helmet>
<title>
{t("meta.home.title")}
</title>
<meta
name="description"
content={
t(
"meta.home.description"
)
}
/>
</Helmet>
</>
);
}
При изменении языка компонент автоматически перерисовывается, а мета-теги получают новые значения.
Для поисковых систем важно указывать альтернативные версии документа.
Пример:
<link
rel="alternate"
hreflang="ru"
href="https://site.com/ru/"
>
<link
rel="alternate"
hreflang="en"
href="https://site.com/en/"
>
I18next может использоваться для определения текущего языка:
const currentLanguage =
i18next.language;
На основе этого значения сервер или клиентская часть может формировать соответствующие ссылки.
Поисковые системы и браузеры используют атрибут языка документа.
Обновление значения:
document.documentElement.lang =
i18next.language;
При переключении языка:
i18next.on(
"languageChanged",
lng => {
document.documentElement.lang =
lng;
}
);
Результат:
<html lang="ru">
или
<html lang="en">
Это повышает корректность индексации и улучшает доступность приложения.
Некоторые языки могут содержать неполный набор переводов.
Настройка:
i18next.init({
lng: "de",
fallbackLng: "en"
});
Если перевод отсутствует:
i18next.t(
"meta.home.description"
);
будет автоматически использована английская версия.
Это предотвращает появление пустых мета-тегов.
Для поисковой оптимизации важно, чтобы мета-теги присутствовали в итоговом HTML ещё до загрузки JavaScript.
На сервере:
const title = i18next.t(
"meta.home.title"
);
const description =
i18next.t(
"meta.home.description"
);
Генерация HTML:
<title>Главная</title>
<meta
name="description"
content="Описание главной страницы"
>
Такой подход обеспечивает:
В крупных проектах создаётся отдельный модуль управления SEO.
Пример:
export function setMeta({
title,
description
}) {
document.title = title;
document
.querySelector(
'meta[name="description"]'
)
.setAttribute(
"content",
description
);
}
Использование:
setMeta({
title: i18next.t(
"meta.catalog.title"
),
description: i18next.t(
"meta.catalog.description"
)
});
Преимущества такого решения:
Пример организации файлов локализации:
{
"home": {
"title": "Главная",
"description": "Описание главной страницы",
"ogTitle": "Главная",
"ogDescription": "Описание для соцсетей"
},
"catalog": {
"title": "Каталог товаров",
"description": "Просмотр ассортимента",
"ogTitle": "Каталог",
"ogDescription": "Полный список товаров"
},
"product": {
"title": "{{name}}",
"description": "{{name}} — подробное описание товара"
}
}
Подобная структура позволяет хранить все мета-теги в одном месте, использовать возможности интерполяции I18next, автоматически обновлять SEO-информацию при смене языка и поддерживать единообразие многоязычного приложения независимо от количества страниц и локалей.