InfraGuard 是一套 支持 8 种语言的控制台,以韩语为总部默认语言、英语为全球回退语言。本文介绍:(1) 用户如何从顶部切换器切换语言,(2) 每次请求时显示语言如何被解析,(3) 管理员如何决定切换器中出现哪些语言。
概述 —— 它做什么
控制台中的每一个标签、菜单项与提示信息都经由翻译键(如 __('menu.security'))呈现,而不是硬编码的英文。更改语言后,从下一次请求开始,服务器会使用该语言的翻译文件(resources/lang/{locale}/*.php)渲染界面。
受支持的语言目录是 config/locales.php 中 admin 下的 8 个条目。无论当前生效的是哪种语言,每种语言始终以 其母语名称 显示。
| 代码 | 母语名称 | 标签 | 实际翻译 |
|---|---|---|---|
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 是真正翻译过的(
config/locales.php中的priority => ['ko','en'])。其余六种(ja·zh·es·fr·de·ru)尚无翻译文件,会自动 回退到 en(config/app.php中的fallback_locale = en)。因此现在选择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 中间件在 每一次 Web 请求(包括登录页)时按下列优先级确定语言。每个候选项 只有在它是当前已启用的语言时 才会被采纳。
1. session infr_locale (本次会话中通过切换器明确选择)
2. cookie infr_locale (跨访问的持久选择 · 会话建立前也适用于登录页)
3. session infr_lang (已登录用户的资料语言 users.lang → 登录时载入会话)
4. 站点级默认 (Locales::primary() = 已启用列表中的第一种语言)
系统不进行浏览器 Accept-Language 自动检测。 当会话、Cookie 与用户资料中都没有选择时,首次访问会确定性地以 管理员设定的站点默认语言 呈现,而不是浏览器语言(以站点级设置为准)。访问者随时可以用顶部切换器更改。
3) 管理启用的语言(管理员)
- 进入
管理 ▸ 本地化。 - 启用要开放的语言(切换器、语言切换、用户资料语言以及库存的多语言编辑都经由这个集合),并停用其余语言。
- 拖动排序 —— 排在最上面的已启用语言成为默认语言。
- 保存。该保存会以
localization.save记入infr_audit_log审计日志。
减少启用的语言会立即缩减顶部切换器中的可选项。作为保护措施,至少要保留一种启用的语言(保存零种会返回 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(在 bootstrap/app.php 中通过 useLangPath 重新绑定) |
| 启用的语言子集 | 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
交接给前端
服务器把当前语言与消息包传入视图引导数据(例如 window.__t = @json(__('msg'))、window.__locale)。Vue 页面与 mixin 借此渲染客户端字符串,并按当前界面语言格式化日期。
访问权限
| 操作 | 最低级别 |
|---|---|
切换语言 GET /lang/{locale} |
允许访客 —— 无需登录(在登录页同样可用) |
查看/保存启用的语言 管理 ▸ 本地化 |
admin = 10 |
- 切换语言本身对所有人开放(这不是敏感操作)。
- 决定切换器中出现哪些语言的管理页面仅限管理员:路由组
infr.level:10加上控制器自检(user_level >= 10)构成 双重防护。级别划分为 demo=1 · staff=5 · admin=10(参见 访问级别 · RBAC)。
故障排查与常见问题
切换器里没有我想要的语言
最可能是被管理员 停用 了。请在 管理 ▸ 本地化 中把它的开关打开。切换器、语言切换与用户资料语言都经由启用集合。
切换语言后仍有部分文字是英文
ja·zh·es·fr·de·ru 尚无真正的翻译文件,会回退到 en(初期策略)。只有未翻译的字符串显示为英文属于预期行为。ko 与 en 已完整翻译。
首次访问没有使用我的浏览器语言
这是设计如此。InfraGuard 不读取 Accept-Language,而是以管理员设定的 站点默认语言(已启用列表中的第一种)打开。您切换一次之后,该选择会保存到会话与 Cookie,并在后续访问中保留。
退出后重新登录,语言被重置
只要 Cookie(infr_locale,1 年)存在,语言就会保留。对已登录用户,该选择还会保存到 users.lang,并在下次登录时作为用户资料语言恢复。若 Cookie 与用户资料都没有,则以站点默认语言打开。
指定 /lang/xx 这样的未知代码会怎样?
不受支持的代码会被 静默忽略,并保持当前语言(不报错)。唯一有效的代码是这 8 种语言中已启用的那些。
如果我停用全部语言会怎样?
系统会阻止。保存时强制至少保留一种(保存零种会返回 422)。即使设置被破坏,系统也会回退到完整目录,因此切换器永远不会为空。
相关内容
