核心功能 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 会失效并自动回退默认站点

五、新增一门语言的步骤

  1. 后台 → 语言管理 → 新增语言,填写代码(如 ja-jp)、名称、国旗图标
  1. 后台 → 站点管理 → 编辑站点 → 勾选该语言为可用
  1. 到栏目 / 内容 / 导航管理,把「数据语言」切到新语言,逐条翻译
  1. 若已开启 URL 语言前缀,路由会自动注册该语言的前缀路由
  1. 补齐语言包文案(否则前台会出现原始键名)