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。缺某个键时会回退到默认语言,所以新增键可以先只写一种语言,不会导致页面报错。
hreflang 互链由模板标签 {lc:hreflang} 自动输出,覆盖所有启用语种并附带 x-default{lc:langlist} 输出,只显示启用状态的语种lang:clone 带 --add,或在后台手动为每个栏目建立对应语言版本url_prefix 是否与伪静态规则冲突,以及该语言下是否真的存在这个栏目php think static:build all按「栏目数 × 语种数 + 内容条数 × 语种数」估。实践上先把栏目和单页翻完(数量固定),内容可以按主推产品优先翻,其余靠回退顶着,逐步补齐。