InfraGuard

切换界面语言 · 本地化

如何更改 InfraGuard 控制台的显示语言 —— 8 种语言、管理员选定的启用子集,以及 会话→Cookie→用户资料→站点默认 的解析规则。

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 种语言,回退的只是文案。

何时使用

页面构成

顶部语言切换器(所有页面)

顶部的语言下拉菜单(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 中间件在 每一次 Web 请求(包括登录页)时按下列优先级确定语言。每个候选项 只有在它是当前已启用的语言时 才会被采纳。

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. 保存。该保存会以 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

故障排查与常见问题

切换器里没有我想要的语言

最可能是被管理员 停用 了。请在 管理 ▸ 本地化 中把它的开关打开。切换器、语言切换与用户资料语言都经由启用集合。

切换语言后仍有部分文字是英文

ja·zh·es·fr·de·ru 尚无真正的翻译文件,会回退到 en(初期策略)。只有未翻译的字符串显示为英文属于预期行为。ko 与 en 已完整翻译。

首次访问没有使用我的浏览器语言

这是设计如此。InfraGuard 不读取 Accept-Language,而是以管理员设定的 站点默认语言(已启用列表中的第一种)打开。您切换一次之后,该选择会保存到会话与 Cookie,并在后续访问中保留。

退出后重新登录,语言被重置

只要 Cookie(infr_locale,1 年)存在,语言就会保留。对已登录用户,该选择还会保存到 users.lang,并在下次登录时作为用户资料语言恢复。若 Cookie 与用户资料都没有,则以站点默认语言打开。

指定 /lang/xx 这样的未知代码会怎样?

不受支持的代码会被 静默忽略,并保持当前语言(不报错)。唯一有效的代码是这 8 种语言中已启用的那些。

如果我停用全部语言会怎样?

系统会阻止。保存时强制至少保留一种(保存零种会返回 422)。即使设置被破坏,系统也会回退到完整目录,因此切换器永远不会为空。

相关内容

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