В системе i18next организация переводов строится вокруг концепции namespaces — логических контейнеров для разделения ресурсов локализации. Один из них всегда играет особую роль: дефолтный namespace, который используется при отсутствии явного указания.
Namespace в i18next представляет собой независимый набор ключей переводов. Он позволяет:
Типичная структура:
locales/
en/
common.json
auth.json
dashboard.json
ru/
common.json
auth.json
dashboard.json
Здесь common, auth, dashboard
— отдельные namespaces.
Дефолтный namespace — это namespace, который используется системой перевода, если:
t();defaultNS задана в конфигурации;Он определяет базовый слой переводов, к которому обращается приложение по умолчанию.
В i18next настройка задаётся при инициализации:
i18next.init({
lng: 'en',
ns: ['common', 'auth', 'dashboard'],
defaultNS: 'common',
resources: {
en: {
common: {
welcome: "Welcome"
},
auth: {
login: "Login"
}
}
}
});
'common' становится базовым пространством имён;t('welcome') ищет ключ в
common;При вызове функции:
t('welcome');
внутренний алгоритм:
defaultNSwelcome в commonВызов с namespace:
t('auth:login');
или:
t('login', { ns: 'auth' });
В этом случае:
defaultNS игнорируется;auth.Чаще всего дефолтным namespace становится common:
Пример структуры:
{
"welcome": "Welcome",
"cancel": "Cancel",
"confirm": "Confirm"
}
При правильно настроенном defaultNS можно избегать
избыточных указаний:
t('cancel');
t('confirm');
Без необходимости писать:
t('cancel', { ns: 'common' });
При использовании backend-подгрузки ресурсов (например, HTTP backend), дефолтный namespace влияет на:
Если defaultNS = 'common', система сначала
запрашивает:
/locales/en/common.json
При множественных namespaces:
ns: ['common', 'auth', 'dashboard'],
defaultNS: 'common'
поведение становится приоритетным:
common используется для всех неуточнённых ключей;Если включён fallback:
i18next.init({
fallbackLng: 'en',
ns: ['common', 'auth'],
defaultNS: 'common'
});
то порядок поиска может выглядеть так:
common (текущий язык)auth (если указан в ns)common (fallback язык)auth (fallback язык)Если ключ находится в auth, но
defaultNS = 'common':
t('login');
результат будет missingKey.
Частая проблема — помещение всех переводов в defaultNS, что приводит к:
Если часть команды использует:
t('login')
а часть:
t('auth:login')
возникает дублирование логики и нестабильность архитектуры переводов.
В связке с React используется hook:
const { t } = useTranslation();
Если не указано:
useTranslation('auth');
то автоматически применяется defaultNS.
Пример:
const { t } = useTranslation();
return <button>{t('cancel')}</button>;
Ключ ищется в default namespace.
В i18next можно изменить namespace на лету:
i18next.setDefaultNamespace('dashboard');
После этого:
t('title');
будет искать ключ в dashboard.
Выбор дефолтного namespace влияет на структуру проекта:
commonЕсли defaultNS не задан:
ns;Пример:
ns: ['auth', 'common']
дефолтным станет auth.
common используется только для действительно общих
строк;Алгоритм разрешения ключа в i18next с учётом default namespace: