При локализации веб-приложений недостаточно перевести текст интерфейса. Браузеры, поисковые системы, программы экранного доступа и различные инструменты обработки контента должны понимать, на каком языке представлен документ или его отдельные части. Для этого используются языковые атрибуты HTML.
При работе с I18next языковые атрибуты обычно синхронизируются с текущим выбранным языком приложения. Это обеспечивает корректное отображение контента, улучшает доступность и помогает поисковым системам правильно интерпретировать страницу.
Основным атрибутом является lang.
<html lang="en">
Для русского языка:
<html lang="ru">
Для немецкого:
<html lang="de">
Атрибут может устанавливаться как для всего документа, так и для отдельных элементов.
Атрибут lang определяет язык содержимого элемента.
Пример:
<p lang="en">Hello World</p>
<p lang="ru">Привет мир</p>
Браузер получает информацию о языке текста и может:
Для мультиязычных интерфейсов это особенно важно.
Для атрибута lang используются коды согласно стандарту
BCP 47.
Наиболее распространённые значения:
| Язык | Код |
|---|---|
| Русский | ru |
| Английский | en |
| Немецкий | de |
| Французский | fr |
| Испанский | es |
| Итальянский | it |
| Китайский | zh |
| Японский | ja |
| Корейский | ko |
| Казахский | kk |
Пример:
<html lang="kk">
Иногда одного языкового кода недостаточно. Один язык может использоваться в нескольких странах с различиями в орфографии, терминологии и форматировании.
Для таких случаев используется комбинация:
язык-РЕГИОН
Примеры:
<html lang="en-US">
<html lang="en-GB">
<html lang="pt-BR">
<html lang="fr-CA">
Различия между вариантами языка могут быть существенными:
| Код | Описание |
|---|---|
| en-US | Английский (США) |
| en-GB | Английский (Великобритания) |
| pt-BR | Португальский (Бразилия) |
| pt-PT | Португальский (Португалия) |
I18next полностью поддерживает подобные языковые обозначения.
После инициализации I18next выбранный язык хранится в свойстве:
i18next.language
Например:
console.log(i18next.language);
Результат:
ru
или
en-US
Логично синхронизировать значение атрибута lang с
текущим языком приложения.
Пример:
document.documentElement.lang = i18next.language;
После выполнения:
<html lang="ru">
или
<html lang="en-US">
Таким образом HTML-документ всегда отражает текущее состояние локализации.
При переключении языка через I18next необходимо обновлять атрибут автоматически.
Пример:
i18next.on('languageChanged', (lng) => {
document.documentElement.lang = lng;
});
Смена языка:
i18next.changeLanguage('de');
Приведёт к обновлению:
<html lang="de">
Без необходимости ручного вмешательства.
Инициализация:
i18next.init({
lng: 'en',
resources: {
en: {
translation: {
title: 'Welcome'
}
},
ru: {
translation: {
title: 'Добро пожаловать'
}
}
}
});
Установка языка документа:
document.documentElement.lang = i18next.language;
Подписка на изменения:
i18next.on('languageChanged', (lng) => {
document.documentElement.lang = lng;
});
Переключатель:
document
.getElementById('languageSwitcher')
.addEventListener('change', (event) => {
i18next.changeLanguage(event.target.value);
});
HTML:
<select id="languageSwitcher">
<option value="en">English</option>
<option value="ru">Русский</option>
</select>
Теперь текст интерфейса и атрибут документа изменяются синхронно.
Даже внутри локализованного интерфейса могут встречаться вставки на других языках.
Пример:
<p>
Термин
<span lang="en">Single Sign-On</span>
означает единый вход в систему.
</p>
Или:
<p>
Немецкое слово
<span lang="de">Datenschutz</span>
означает защиту данных.
</p>
Такая разметка помогает программам чтения с экрана правильно произносить иностранные слова.
Иногда перевод содержит брендовые названия или международные термины.
Файл перевода:
{
"description": "Работает через <span lang=\"en\">API Gateway</span>"
}
Вывод:
element.innerHTML = i18next.t('description');
Результат:
Работает через
<span lang="en">API Gateway</span>
Подобная практика улучшает доступность интерфейса.
Некоторые языки пишутся справа налево.
Наиболее распространённые:
| Язык | Код |
|---|---|
| Арабский | ar |
| Иврит | he |
| Персидский | fa |
| Урду | ur |
Для них дополнительно используется атрибут:
dir="rtl"
Пример:
<html lang="ar" dir="rtl">
Для большинства европейских языков используется:
dir="ltr"
Можно поддерживать направление текста автоматически.
Список RTL-языков:
const rtlLanguages = ['ar', 'he', 'fa', 'ur'];
Функция обновления:
function updateDocumentLanguage(language) {
document.documentElement.lang = language;
document.documentElement.dir =
rtlLanguages.includes(language)
? 'rtl'
: 'ltr';
}
Подписка:
i18next.on('languageChanged', updateDocumentLanguage);
Первоначальная установка:
updateDocumentLanguage(i18next.language);
Теперь документ корректно настраивается как для английского, так и для арабского интерфейса.
Для определения предпочтений пользователя часто используется:
navigator.language
Пример результата:
en-US
или
ru-RU
Это значение может использоваться при первоначальной настройке I18next.
i18next.init({
lng: navigator.language
});
После инициализации язык документа также можно синхронизировать:
document.documentElement.lang = i18next.language;
Браузер может вернуть язык, который отсутствует среди поддерживаемых переводов.
Например:
fr-CA
При этом приложение поддерживает только:
fr
en
Настройка I18next:
i18next.init({
fallbackLng: 'en',
supportedLngs: ['en', 'fr']
});
После выбора языка следует устанавливать именно итоговое значение:
document.documentElement.lang = i18next.resolvedLanguage;
Свойство:
i18next.resolvedLanguage
отражает фактически используемый язык после применения механизмов fallback.
Поисковые системы анализируют атрибут lang для
определения языка страницы.
Корректная разметка:
<html lang="ru">
помогает:
Для проектов с несколькими языками это является обязательной практикой.
Screen Reader активно используют атрибут lang.
Если язык не указан:
<html>
программа может использовать неверное произношение текста.
Правильный вариант:
<html lang="ru">
Для встроенных иностранных слов:
<p>
Используется технология
<span lang="en">Machine Learning</span>.
</p>
В таком случае синтезатор речи автоматически переключает правила произношения.
Получение текущего языка:
console.log(document.documentElement.lang);
Получение направления текста:
console.log(document.documentElement.dir);
Установка новых значений:
document.documentElement.lang = 'es';
document.documentElement.dir = 'ltr';
Проверка после смены языка:
i18next.on('languageChanged', (lng) => {
console.log('Language:', lng);
console.log('HTML lang:', document.documentElement.lang);
});
Неправильно:
<html>
Правильно:
<html lang="en">
Неправильно:
<html lang="en">
При этом интерфейс уже отображается на русском языке.
Правильно:
document.documentElement.lang = i18next.language;
Неправильно:
document.documentElement.lang = 'en';
если приложение работает в режиме:
en-GB
Правильно:
document.documentElement.lang = i18next.language;
Неправильно:
<html lang="ar">
Правильно:
<html lang="ar" dir="rtl">
или динамически:
document.documentElement.dir = 'rtl';
function applyLanguageSettings(language) {
const rtlLanguages = ['ar', 'he', 'fa', 'ur'];
document.documentElement.lang = language;
document.documentElement.dir =
rtlLanguages.includes(language)
? 'rtl'
: 'ltr';
}
i18next.init({
lng: 'en',
fallbackLng: 'en'
}).then(() => {
applyLanguageSettings(i18next.resolvedLanguage);
});
i18next.on('languageChanged', (lng) => {
applyLanguageSettings(lng);
});
Такой подход обеспечивает синхронизацию языка интерфейса, языковых атрибутов HTML, направления текста, требований доступности и механизмов поисковой индексации во всех локализованных разделах приложения.