跳到主要内容
版本:4.x

本地化(L10N)

Luban 提供几类可叠加使用的本地化能力:

  1. datetime 时区--timeZone
  2. text 类型校验(key 是否存在于文本表)
  3. 静态替换(生成期把 key 换成某语言文案)
  4. 字段变体(见 variants

未设置 -x l10n.provider=... 时,text 校验与静态本地化都会关闭

文本表(DefaultTextProvider)

逻辑上等价于一张「key + 各语言列」的表:

keyzhen
item.gold.name金币Gold
item.potion.name药水Potion

可用 Excel,也可用 json 等(须符合 Luban 数据源格式)。json 一个文件多条时路径必须带 *@

-x l10n.provider=default
-x l10n.textFile.path=*@Datas/l10n/texts.json
-x l10n.textFile.keyFieldName=key
参数说明
l10n.providerdefault 等;不设则关闭 text 相关
l10n.textFile.path文本数据路径;json 列表用 *@file.json
l10n.textFile.keyFieldNamekey 字段名,如 key

只做 key 合法性校验时,语言列可以没有;静态替换才需要语言列。

texts.json 示意

[
{ "key": "item.gold.name", "zh": "金币", "en": "Gold" },
{ "key": "item.potion.name", "zh": "药水", "en": "Potion" }
]

text 类型(配置里写 key)

text 是语法糖,等价 string#text=1。字段语义是本地化 key,不是最终显示字符串。

<bean name="Item">
<var name="id" type="int"/>
<var name="name" type="text"/>
</bean>
##varidname
##typeinttext
1001item.gold.name
1002item.potion.name

开启校验(key 必须出现在文本表):

-x l10n.provider=default ^
-x l10n.textFile.path=*@Datas/l10n/texts.json ^
-x l10n.textFile.keyFieldName=key

静态替换(生成期 key → 文案)

在校验参数基础上再指定语言列,并打开转换开关:

-x l10n.provider=default ^
-x l10n.textFile.path=*@Datas/l10n/texts.json ^
-x l10n.textFile.keyFieldName=key ^
-x l10n.textFile.languageFieldName=zh ^
-x l10n.convertTextKeyToValue=1

导出后 name 字段直接是「金币」,运行时不必再查表。适合语言在打包时已固定的包体。

l10n.languageFieldNamel10n.textFile.languageFieldName 在部分版本可互通,以 级联选项 为准。)

datetime 时区

datetime 按目标时区解释后写成 UTC 秒。默认本地时区;用 --timeZone 指定:

--timeZone "Asia/Shanghai"
# Windows 也可用:
--timeZone "China Standard Time"

注意:短选项 -ttarget,不是时区。

导出待翻译 key 列表

用 dataTarget text-list 收集配置中出现的全部 text key:

dotnet Luban.dll --conf luban.conf -t all -d text-list ^
--validationFailAsError ^
-x outputDataDir=../Output/text ^
-x l10n.textListFile=texts.txt

与 variants 怎么选

需求更合适
长文案、翻译流程、key 复用text + 文本表
同一数值/短字段多地区不同值,导出定死一版variants
仅时间按地区解释--timeZone

常见坑

  • json 文本表忘了 *@ 前缀 → 加载失败。
  • 配了 text 字段却未设 l10n.provider → 校验静默关闭,错 key 进包。
  • 静态替换未设 languageFieldName / convertTextKeyToValue → 仍导出 key。
  • 与 variants 两套同时维护同一文案 → 难同步。

相关链接