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 языков, откатывается лишь текст.
Когда использовать
- Посетитель хочет видеть консоль на привычном языке — воспользуйтесь переключателем языков в шапке.
- Нужно сменить язык даже на экране входа (до того, как появилась сессия) —
/lang/{locale}разрешён гостям. - Нужно открыть в масштабах организации только определённые языки и задать язык по умолчанию для первых визитов — администратор редактирует включённый набор и его порядок (см. «Управление включёнными языками» ниже).
Устройство экрана
Переключатель языков в шапке (на всех экранах)
Выпадающий список языков в шапке (layouts.partials.locale-switch + ui/locale-dd.js) перечисляет только языки, включённые администратором. Каждый пункт показывает родное название и короткую метку (например, KO, EN), а текущий язык отмечен как активный.
Администрирование ▸ Локализация (управление включёнными языками)
На экране Администрирование ▸ Локализация (открывается кнопкой в правом верхнем углу) для каталога из 8 языков можно:
- включать и выключать каждый язык (появляется ли он в переключателе);
- менять порядок перетаскиванием — верхний включённый язык становится основным (по умолчанию) для сайта;
- сохранять при обязательном минимуме в один язык (сохранение нуля отклоняется).
Как пользоваться
1) Смена через переключатель в шапке
- Откройте выпадающий список языков в шапке.
- Выберите язык → браузер переходит на
GET /lang/{locale}. - Сервер сохраняет ваш выбор и возвращает вас на предыдущую страницу (
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) Управление включёнными языками (администратор)
- Перейдите в
Администрирование ▸ Локализация. - Включите языки, которые нужно открыть (переключатель, смена языка, язык профиля и многоязычное редактирование инвентаря — всё это проходит через этот набор), а остальные выключите.
- Измените порядок перетаскиванием — верхний включённый язык становится языком по умолчанию.
- Сохраните. Сохранение фиксируется в
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 |
- Смена языка сама по себе открыта всем (это не чувствительное действие).
- Экран администрирования, определяющий состав языков в переключателе, доступен только администраторам: двойная защита группой маршрутов
infr.level:10и собственной проверкой в контроллере (user_level >= 10). Уровни: demo=1 · staff=5 · admin=10 (см. Уровни · RBAC).
Устранение неполадок и 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). Даже если настройка окажется повреждённой, система откатится к полному каталогу, поэтому переключатель никогда не останется пустым.
Смежные темы
- Администрирование ▸ Локализация (управление включёнными языками)
- Мой профиль · язык
- Навигация · структура меню
- Тема оформления (светлая · тёмная)
- Уровни · RBAC
- Как пользоваться этим руководством
