Newer
Older
gnexus-handbook / 10-platform / i18n.md

Мультиязычность интерфейса

Конвенция, применённая в gnexus-creds и hard-panel: без vue-i18n, один общий модуль, три языка.

Правила

  • Три языка: en, uk, ru — все сервисы экосистемы поддерживают их все.
  • Язык по умолчанию берётся из аккаунта gnexus-auth (profile.locale).
  • Пользовательский выбор языка — в настройках сервиса; выбор перекрывает язык аккаунта только для этого сервиса («Авто» возвращает язык аккаунта).
  • Override хранится на сервере у записи пользователя (locale) и переживает logout и обновление профиля через вебхуки (upsert профиля не трогает locale).
  • Если SSO не настроен (сервис открыт) — язык в localStorage браузера, auto нет.
  • Опции языка всегда подписываются родными именами, инвариантными к текущему языку: English / Українська / Русский.

Реализация (паттерн gnexus-creds / hard-panel)

  • Модуль src/i18n/index.js: locale = ref("en"), normalizeTag («en-US» → «en»), t(slug, params) с интерполяцией {param} и fallback на английский, setLocale + watch(locale) → <html lang> и <title>.
  • Словари — src/i18n/messages/{en,uk,ru}.js: плоские ключи по областям (dash.*, server.*, storage.*…), одинаковые slugs во всех словарях.
  • Плюрализация — Slavic-категории (one/few/many), считается только по params.n; строки с несколькими счётчиками собираются вложенными t(), а не плюральным слагом.
  • Backend: GET /me возвращает выбранный и эффективный язык (locale + locale_effective = override → account → en); PATCH /me меняет override (по cookie-сессии — см. auth.md).

Грабли

  • Модуль-уровень массивы с уже вычисленным t() застывают — таблицы колонок, опции селектов и списки навигации обязательно computed.
  • Пустой override («») и авто — одно и то же значение; не путать «настройка не выбрана» с «выбран английский».

Ссылки

  • Референс: panel/frontend/src/i18n/index.js и gnexus-creds/frontend/src/i18n/index.js
  • Язык аккаунта меняется в gnexus-auth (LocaleController, синхронизация — webhook user.updated).