InfraGuard

Смена языка · Локализация

Как изменить язык интерфейса консоли InfraGuard — 8 языков, включённое подмножество на выбор администратора и правило разрешения сессия→cookie→профиль→язык сайта по умолчанию.

InfraGuard — это консоль на 8 языках, где корейский является языком по умолчанию для головного офиса, а английский — глобальным резервным языком. В этой статье рассмотрены (1) как пользователь меняет язык через переключатель в шапке, (2) как язык интерфейса определяется при каждом запросе и (3) как администратор выбирает, какие языки появляются в переключателе.

Обзор — что это делает

Каждая подпись, пункт меню и сообщение в консоли проходят через ключ перевода (__('menu.security') и т. п.), а не задаются английским текстом в коде. После смены языка сервер, начиная со следующего запроса, отрисовывает интерфейс из файлов перевода этого языка (resources/lang/{locale}/*.php).

Каталог поддерживаемых языков — это 8 записей в разделе admin файла config/locales.php. Каждый язык всегда показывается своим собственным названием, независимо от того, какой язык активен сейчас.

Код Родное название Метка Реальный перевод
ko 한국어 KO ✅ Переведён полностью (по умолчанию для головного офиса)
en English EN ✅ Переведён полностью (глобальный резервный)
ja 日本語 JA ⏳ Откат на en
zh 中文(简体) ZH ⏳ Откат на en
es Español ES ⏳ Откат на en
fr Français FR ⏳ Откат на en
de Deutsch DE ⏳ Откат на en
ru Русский RU ⏳ Откат на en

Изначально реально переведены только ko и en (priority => ['ko','en'] в config/locales.php). У остальных шести (ja·zh·es·fr·de·ru) файлов перевода пока нет, и они автоматически откатываются на en (fallback_locale = en в config/app.php). Поэтому, если выбрать ja сегодня, непереведённые строки по-прежнему отображаются на английском — переключатель перечисляет все 8 языков, откатывается лишь текст.

Когда использовать

Устройство экрана

Переключатель языков в шапке (на всех экранах)

Выпадающий список языков в шапке (layouts.partials.locale-switch + ui/locale-dd.js) перечисляет только языки, включённые администратором. Каждый пункт показывает родное название и короткую метку (например, KO, EN), а текущий язык отмечен как активный.

Администрирование ▸ Локализация (управление включёнными языками)

На экране Администрирование ▸ Локализация (открывается кнопкой в правом верхнем углу) для каталога из 8 языков можно:

Как пользоваться

1) Смена через переключатель в шапке

  1. Откройте выпадающий список языков в шапке.
  2. Выберите язык → браузер переходит на GET /lang/{locale}.
  3. Сервер сохраняет ваш выбор и возвращает вас на предыдущую страницу (redirect()->back()). Новый язык применяется со следующей отрисовки.

Точка входа для смены языка выглядит так:

GET /lang/ko      # переключиться на корейский
GET /lang/en      # переключиться на английский
GET /lang/ja      # японский (не переведён → откат на en)

Что делает сервер (LocaleController@switch) при смене языка:

Хранилище Ключ Значение Срок жизни
Сессия infr_locale выбранный код на время сессии
Сессия infr_lang выбранный код на время сессии (синхронизация языка профиля)
Cookie infr_locale выбранный код 1 год (сохраняется между визитами)
БД users.lang выбранный код постоянно (только для вошедших пользователей)

Когда язык меняет вошедший пользователь, выбор дополнительно сохраняется в users.lang (язык профиля), поэтому язык сохраняется и при следующем входе. Выбор гостя (не вошедшего) хранится только в сессии и cookie.

Вызов /lang/{locale} с неподдерживаемым (или отключённым администратором) кодом молча игнорируется, и текущий язык сохраняется — ошибка не возникает.

2) Как определяется язык интерфейса (SetLocale)

Посредник SetLocale определяет язык при каждом веб-запросе (включая экран входа) по приведённому ниже приоритету. Кандидат принимается только если это язык, включённый в данный момент.

1. session infr_locale   (явно выбран через переключатель в этой сессии)
2. cookie  infr_locale   (постоянный выбор между визитами · применяется к экрану входа, до появления сессии)
3. session infr_lang     (профиль вошедшего пользователя users.lang → загружается в сессию при входе)
4. язык сайта по умолчанию (Locales::primary() = первый язык во включённом списке)

Автоопределение по браузерному Accept-Language НЕ выполняется. Первый визит без сессии, cookie и выбора в профиле детерминированно обслуживается на языке сайта по умолчанию, заданном администратором, а не на языке браузера (приоритет за общесайтовой настройкой). Посетители всегда могут изменить его переключателем в шапке.

3) Управление включёнными языками (администратор)

  1. Перейдите в Администрирование ▸ Локализация.
  2. Включите языки, которые нужно открыть (переключатель, смена языка, язык профиля и многоязычное редактирование инвентаря — всё это проходит через этот набор), а остальные выключите.
  3. Измените порядок перетаскиванием — верхний включённый язык становится языком по умолчанию.
  4. Сохраните. Сохранение фиксируется в infr_audit_log как localization.save.

Сокращение включённых языков немедленно сужает выбор в переключателе шапки. В качестве защиты должен оставаться включённым хотя бы один язык (сохранение нуля возвращает 422), а если не остаётся ни одного корректного кода, система откатывается к полному каталогу, так что как минимум один язык гарантирован всегда.

Источники данных

Элемент Расположение
Каталог языков (8 + названия) config/locales.php → admin
Приоритет реального перевода config/locales.php → priority = ['ko','en']
Резервный язык config/app.php → fallback_locale = en
Файлы перевода resources/lang/{locale}/{msg,menu,infra,security,...}.php (переопределены через useLangPath в bootstrap/app.php)
Подмножество включённых языков infr_setting (group=i18n, key=enabled) — CSV
Порядок отображения infr_setting (group=i18n, key=order) — CSV
Язык профиля users.lang
Выбор в сессии сессия infr_locale / infr_lang
Постоянный выбор cookie infr_locale (1 год)

Настройки включённых языков и порядка читает App\Support\Locales с 60-секундным кэшем. При ошибке базы данных или отсутствии настройки он безопасно откатывается к пустому массиву (→ полный каталог). После сохранения Locales::flush() немедленно сбрасывает кэш.

-- Где хранятся включённый набор и порядок (пример)
SELECT `group`, `key`, `value` FROM infr_setting WHERE `group` = 'i18n';
-- group | key     | value
-- i18n  | order   | ko,en,ja,zh,es,fr,de,ru
-- i18n  | enabled | ko,en

Передача во фронтенд

Сервер передаёт активный язык и пакет сообщений в bootstrap представления (например, window.__t = @json(__('msg')), window.__locale). Страницы и миксины Vue используют их, чтобы отрисовывать строки на клиенте и форматировать даты в соответствии с активным языком интерфейса.

Доступ

Действие Минимальный уровень
Смена языка GET /lang/{locale} Разрешено гостям — вход не требуется (работает и на экране входа)
Просмотр и сохранение включённых языков Администрирование ▸ Локализация admin = 10

Устранение неполадок и FAQ

Нужного языка нет в переключателе

Скорее всего, он отключён администратором. Включите его переключатель в разделе Администрирование ▸ Локализация. Переключатель, смена языка и язык профиля — всё это проходит через включённый набор.

Я сменил язык, но часть текста осталась на английском

У ja·zh·es·fr·de·ru пока нет реальных файлов перевода, и они откатываются на en (изначальная стратегия). То, что на английском видны только непереведённые строки, ожидаемо. ko и en переведены полностью.

Первый визит открывается не на языке моего браузера

Так и задумано. InfraGuard не читает Accept-Language; он открывается на языке сайта по умолчанию, заданном администратором (первый язык во включённом списке). После смены языка выбор сохраняется в сессии и cookie и удерживается при последующих визитах.

После выхода и повторного входа язык сбрасывается

Если cookie (infr_locale, 1 год) на месте, язык сохраняется. Для вошедших пользователей выбор дополнительно сохраняется в users.lang и восстанавливается как язык профиля при следующем входе. Если нет ни cookie, ни профиля, интерфейс открывается на языке сайта по умолчанию.

Что произойдёт с неизвестным кодом вида /lang/xx?

Неподдерживаемый код молча игнорируется, и текущий язык сохраняется (без ошибки). Допустимы только те коды из 8, которые включены.

Что если отключить все языки?

Это заблокировано. При сохранении действует минимум в один язык (сохранение нуля возвращает 422). Даже если настройка окажется повреждённой, система откатится к полному каталогу, поэтому переключатель никогда не останется пустым.

Смежные темы

언어 · 지역화 화면
언어 · 지역화 화면