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

Конвенция, применённая в 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](auth.md)).

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

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