Namespace в i18next представляет собой механизм логического разделения переводов на независимые области. Вместо хранения всех строк локализации в одном глобальном объекте используется набор изолированных словарей, каждый из которых отвечает за отдельную часть приложения.
Такое разделение формирует устойчивую структуру, где переводы группируются по смыслу, функциональности или модулю интерфейса. Основной эффект заключается в снижении когнитивной нагрузки при масштабировании и упрощении поддержки многоязычных проектов.
Namespace становится фундаментом для модульной организации i18n-слоя, особенно в приложениях с динамической загрузкой контента, микрофронтендами и большим количеством экранов.
Внутренняя модель i18next рассматривает namespace как независимый ресурс перевода. Каждый namespace содержит собственный набор ключей:
{
"header": {
"title": "Главная",
"login": "Войти"
}
}
или в другом namespace:
{
"dashboard": {
"welcome": "Добро пожаловать",
"stats": "Статистика"
}
}
При обращении к переводу указывается namespace:
i18next.t('header:title')
i18next.t('dashboard:welcome')
Разделитель : связывает namespace и ключ, формируя
адресную структуру доступа.
Инициализация i18next включает явное объявление используемых namespace:
i18next.init({
lng: 'ru',
fallbackLng: 'en',
ns: ['header', 'dashboard', 'common'],
defaultNS: 'common',
resources: {
ru: {
header: {
title: 'Главная'
},
dashboard: {
welcome: 'Добро пожаловать'
},
common: {
save: 'Сохранить'
}
}
}
})
Параметр ns задаёт список доступных пространств имён.
defaultNS определяет namespace, используемый по умолчанию
при отсутствии явного указания.
Эффективная организация namespace опирается на несколько устойчивых моделей:
Каждый модуль приложения получает собственный namespace:
auth — авторизация и регистрацияprofile — пользовательский профильsettings — настройки приложенияТакой подход обеспечивает независимость модулей и снижает связность переводов.
Namespace может отражать структуру UI:
headersidebarfootermodalПодобная модель эффективна в интерфейсах с повторяющимися компонентами, где тексты тесно связаны с визуальными блоками.
Отдельный namespace часто выделяется под общие элементы:
Пример:
{
"common": {
"ok": "ОК",
"cancel": "Отмена",
"error": "Ошибка"
}
}
i18next поддерживает ленивую загрузку переводов, что особенно важно для крупных приложений.
i18next.loadNamespaces('dashboard', () => {
const text = i18next.t('dashboard:welcome')
})
Загрузка происходит только при необходимости, снижая начальный размер бандла.
При использовании с backend-плагинами структура namespace часто соответствует файлам:
locales/
ru/
header.json
dashboard.json
common.json
В серверной или файловой архитектуре namespace напрямую отображается на файловую систему:
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
Здесь:
{{lng}} — язык{{ns}} — namespaceТакое сопоставление формирует предсказуемую и расширяемую структуру хранения переводов.
i18next использует многоуровневую систему fallback:
Пример обращения:
i18next.t('profile:name')
Если profile:name отсутствует, поиск продолжается в
fallback-настройках.
При использовании React интеграции namespace часто связывается с компонентами:
import { useTranslation } from 'react-i18next'
function Dashboard() {
const { t } = useTranslation('dashboard')
return <h1>{t('welcome')}</h1>
}
Здесь namespace передаётся в хук, что ограничивает область доступных ключей и повышает локализацию контекста.
Возможна работа сразу с несколькими namespace:
const { t } = useTranslation(['dashboard', 'common'])
t('dashboard:welcome')
t('common:save')
Такой подход используется при комбинировании локального и общего контента.
Внутренняя структура namespace может быть плоской или иерархической.
{
"welcome": "Добро пожаловать",
"logout": "Выход"
}
Преимущество — простота доступа.
{
"auth": {
"login": "Вход",
"register": "Регистрация"
}
}
Преимущество — группировка по смыслу внутри namespace.
Namespace устраняет проблему конфликтов ключей. Один и тот же ключ может существовать в разных пространствах без пересечения:
header.json:
{
"title": "Шапка"
}
dashboard.json:
{
"title": "Панель"
}
Обращение различает контекст:
i18next.t('header:title')
i18next.t('dashboard:title')
Разбиение переводов на namespace влияет на производительность:
Особенно заметен эффект при частичной загрузке интерфейса, где не все модули активны одновременно.
Концентрация большого количества ключей в одном пространстве снижает смысловое разделение и усложняет поддержку.
Создание десятков мелких namespace приводит к росту количества запросов и усложнению конфигурации.
Разные разработчики могут использовать различные принципы группировки, что приводит к фрагментированности и дублированию.
При росте приложения структура namespace часто эволюционирует:
translation к модульной системеПри этом сохраняется основной принцип: один namespace — одна область ответственности, отражающая функциональную или структурную границу приложения