核心功能 1
更新于 2026-10-13
多语言与多站点
文枢CMS 把「多站点」和「多语言」拆成两个正交的维度:站点决定数据分区,语言决定同一站点内的内容分支。
一、语言解析链
前台每次请求按以下顺序确定当前语言,命中即停:
1. URL 查询参数 ?lang=en-us
2. URL 路径首段 /en-us/list/9.html
3. 会话记忆 session('front_lang')
4. 站点默认语言 ws_site.lang
5. 系统默认语言 Lang::defaultCode()
若当前语言在该站点下没有任何栏目,会自动回退到站点默认语言,避免英文站空白。
二、URL 语言前缀(推荐开启)
后台 → SEO 设置 → 开启「URL 语言前缀」后:
| 语言 | 地址形式 |
|---|---|
| 默认语言(中文) | /list/9.html(不带前缀) |
| 其他语言(英文) | /en-us/list/9.html |
好处:
- 链接可分享、可被搜索引擎独立收录
- 无需依赖
?lang=,避免同一内容产生多个地址
- 自动为每个页面输出
hreflang备用地址
hreflang 输出
<link rel="alternate" hreflang="zh-cn" href="https://example.com/list/9.html">
<link rel="alternate" hreflang="x-default" href="https://example.com/list/9.html">
<link rel="alternate" hreflang="en-us" href="https://example.com/en-us/list/9.html">
英文页面里,对应栏目会按 alias 自动映射到英文站的同名栏目。
语言切换器
模板中使用 {$langLinks}:
<ul class="lang-switch">
{volist name="langLinks" id="lg"}
<li><a href="{$lg.url}" hreflang="{$lg.code}">{$lg.name}</a></li>
{/volist}
</ul>
三、内容按语言隔离
以下数据表都带 lang 字段,查询时自动追加语言条件:
ws_category 栏目(同一条目在各语言下有一条记录,用 alias 关联)
ws_content 内容
ws_model 模型
ws_nav 导航
后台对应位置都提供「数据语言」选项卡(?data_lang=en-us),切到英文即只编辑英文数据。
⚠️ 参数名必须是
data_lang。后台的?lang=已被「界面语言」占用,混用会导致界面语言被意外切换。
四、多站点
- 所有业务表都带
site_id,查询层自动追加过滤
- 后台左上角可切换当前站点,切换后全后台按新站点过滤
- 附件物理路径带站点 ID:
public/storage/<site_id>/<Ymd>/
- 站点被删除后,会话中残留的
admin_site_id会失效并自动回退默认站点
五、新增一门语言的步骤
- 后台 → 语言管理 → 新增语言,填写代码(如
ja-jp)、名称、国旗图标
- 后台 → 站点管理 → 编辑站点 → 勾选该语言为可用
- 到栏目 / 内容 / 导航管理,把「数据语言」切到新语言,逐条翻译
- 若已开启 URL 语言前缀,路由会自动注册该语言的前缀路由
- 补齐语言包文案(否则前台会出现原始键名)