多语言站点:新增语种与翻译流程

一、多语言是怎么组织的

  • 语种存在 ba_lang 表:code(语言代码)、name(显示名)、url_prefix(URL 前缀)、sort、status
  • 默认语言不带前缀(英文站的关于页是 /about/),其余语种带前缀(/de/about/)
  • 栏目与内容按 lang 字段区分,同一条内容的不同语言通过 source_id 归为一组
  • 没翻译的条目会自动回退到默认语言,不会给访客一个空白页

二、新增一个语种

后台「语言管理」里新增,或者用命令一次克隆:

php think lang:clone en de --add --prefix=de

参数含义:

  • 第一个参数是源语言(en)
  • 第二个参数是目标语言(de)
  • --add 目标语种不存在时自动创建
  • --prefix URL 前缀,默认与语言代码相同
  • --draft 克隆后保持草稿,不自动发布
  • --pack 整站文案包(PHP 文件,含 site 与 text 两段)
  • --map 栏目文案覆盖文件(JSON)

克隆会把源语言的栏目结构、单页正文、词条一起带过去,之后逐条改译文即可。

三、界面词条在哪改

模板里的界面文字(按钮、提示语、侧栏标题)不在数据库,而在模板自带的语言包:

templates/{模板名}/lang/{语言代码}.php

例如 templates/default/lang/de.php。缺某个键时会回退到默认语言,所以新增键可以先只写一种语言,不会导致页面报错。

四、SEO 相关的自动化

  • hreflang 互链由模板标签 {lc:hreflang} 自动输出,覆盖所有启用语种并附带 x-default
  • sitemap 会按语言分别列出,并标注 alternates
  • 语言切换器由 {lc:langlist} 输出,只显示启用状态的语种

五、常见问题

  • 新增语种后前台是空的:栏目没有一起克隆。用 lang:clone 带 --add,或在后台手动为每个栏目建立对应语言版本
  • 切到某语种 404:检查 url_prefix 是否与伪静态规则冲突,以及该语言下是否真的存在这个栏目
  • 译文显示成英文:说明该条目还没翻译,命中了回退逻辑。这是预期行为,不是 bug
  • 前端仍显示旧文案:改了语言包要重新生成静态页,php think static:build all

六、翻译工作量怎么估

按「栏目数 × 语种数 + 内容条数 × 语种数」估。实践上先把栏目和单页翻完(数量固定),内容可以按主推产品优先翻,其余靠回退顶着,逐步补齐。