Skip to content
miao edited this page Apr 15, 2022 · 8 revisions

本地化

支持多种本地化机制,分别处理不同的场合,它们可以同时使用。

静态文本值本地化

对于需要本地化的文本值,在配置导出时既已完成本地化的转化,适用于不同地区打不同包或者不同配置的情形。通过以下几个方面来实现静态文本值本地化:

  • 使用 text 类型标识需要本地化的字符串。 text类型由两个字段构成, key和value。
  • 使用本地化映射表提供text到其他语言的映射
  • 未完成本地化的text单独输出到一个文件,方便得知哪些文本值未完成本地化映射

需要本地化的示例表

##var id name desc count
##type int text string int
1 /demo/key1 苹果 这是一个苹果 100
2 /demo/key2 香蕉 这是香蕉 100
3 /demo/key3 西瓜 这是西瓜 100

文本值映射文件

##var key origin_text text_tw text_en
##type string string string string
## 本地化key 原始值 繁体值 英文
/demo/key1 苹果 苹果 apple
/demo/key2 香蕉 香蕉 banana

Luban.Client 命令

有三个参数跟静态文本值本地化相关

  • l10n:input_text_files 本地化映射文件
  • l10n:text_field_name 映射的目标字段名。因为有可能多个语言都在同一个映射表内(如text_tw和text_en)
  • l10n:output_not_translated_text_file 未完成文本值本地化映射的text

以下为一个示例脚本

%GEN_CLIENT% -h %LUBAN_SERVER_IP% -j cfg --^
 -d %DEFINE_FILE%^
 --input_data_dir %CONF_ROOT%\Datas ^
 --output_code_dir Gen ^
 --output_data_dir config_data ^
 --gen_types data_json ^
 -s all  ^
--l10n:input_text_files l10n/cn/TextTable_CN.xlsx ^
--l10n:text_field_name text_en ^
--l10n:output_not_translated_text_file NotLocalized_CN.txt

示例输出结果

导出json文件内容为

[
  {
    "id": 1,
    "text": {
      "key": "/demo/key1",
      "text": "apple"
    },
    "desc": "这是一个苹果",
    "count": 100
  },
  {
    "id": 2,
    "text": {
      "key": "/demo/key2",
      "text": "banana"
    },
    "desc": "这是香蕉",
    "count":100
  },
  {
    "id": 3,
    "text": {
      "key": "/demo/key3",
      "text": "西瓜"
    },
    "desc":"这是西瓜",
    "count": 100
  }
]

示例中 /demo/key3 在本地化映射表中未提供,因为output_l10n_not_translated_text_file 指定的未映射本地化文本值列表内容为。

/demo/key3|这是西瓜

文本值动态本地化

运行时动态切换text类型字段到目标语言,程序不需要根据id去本地化映射表里查询,简化了使用。注意,目前只有bean中text类型字段才支持,像list,text之类的暂未支持。通过以下几个方面支持文本值动态本地化:

  • 标识字段为text类型
  • 提供 (string key, string origin_value) => (string target_value) 的本地化映射函数
  • 运行时调用 cfg.Tables.TranslateText函数,一键切换配置中所有text类型值到目标语言
  • 为text类型字段额外生成了string {field}_l10n_text字段,运行时可以拿着这个字段去本地化映射表查询它在其他语言的文本值

本地化映射函数实现比较简单,核心在于如何制作文本值本地化映射配置?使用者既可以使用自定义本地化映射表,可以使用普通的 luban配置表来提供 文本值映射配置,如下图:

##var key origin_text text_tw text_en
##type string string string string
## 本地化key 原始值 繁体值 英文
/demo/key1 苹果 苹果 apple
/demo/key2 香蕉 香蕉 banana

通过提供不同的映射函数,来实现到不同目标语言的切换,例如

/// 用于切换到en
string TextMapper_en(string key, string originText) 
{
    return tables.TbTextMapper.GetOrDefault(key)?.TextEn ?? originText;
}

/// 用于切换到tw
string TextMapper_tw(string key, string originText) 
{
    return tables.TbTextMapper.GetOrDefault(key)?.TextTw ?? originText;
}

void SwitchLanguages(cfg.Tables tables)
{
  // 切换所有text字段到 en
   tables.TranslateText(TextMapper_en);

  // 切换所有text字段到 tw
   tables.TranslateText(TextMapper_tw);

  // 当前语言为tw的情况下,不使用切换,
  // 获得道具1001的desc字段对应的英语文本
  var desc_en = table.TbTextMapper.Get(tables.TbItem.Get(1001).Desc_l10n_key).TextEn;
}

多分支 数据

Luban支持 mian+patches 的数据模式。在主版本数据基础上,提供一个补丁数据,合并处理后生成最终目标数据。

以 luban_examples/Projects/L10N 目录下的gen_apply_patch_CN.bat脚本为例,命令行如下

 %GEN_CLIENT% -h %LUBAN_SERVER_IP% -j cfg --^
 -d %CONF_ROOT%\Defines\__root__.xml ^
 --input_data_dir %CONF_ROOT%\Datas ^
 --output_code_dir Gen ^
 --output_data_dir config_data ^
 --gen_types data_lua ^
 -s all  ^
 --l10n:patch cn ^
 --l10n:patch_input_data_dir l10n/cn

表示为需要生成的patch name为cn,分支数据的根目录为 l10n/cn,目录下有两个xlsx文件:Patch_CN_1.xlsx 和 Patch_CN_2.xlsx,将这两个文件中的数据合并到 DesignerConfigs/Datas/l10n 目录下 Patch.xlsx 文件中,并生成 lua 格式数据。

Patch.xlsx 内容为

## id value
##
11 1
12 2
13 2
14 4
15 5
16 6
17 7
18 8

Patch_CN_1.xlsx 内容为

## id value
## 注释
11 1001 覆盖原值1
12 1002 覆盖原值2
20 20 新增20
21 21 新增21

Patch_CN_2.xlsx 内容为

## id value
## 注释
30 300 新增30
31 310 新增31

生成的 lua 格式数据为

return
{
[11] = {id=11,value=1001,},
[12] = {id=12,value=1002,},
[13] = {id=13,value=3,},
[14] = {id=14,value=4,},
[15] = {id=15,value=5,},
[16] = {id=16,value=6,},
[17] = {id=17,value=7,},
[18] = {id=18,value=8,},
[20] = {id=20,value=20,},
[21] = {id=21,value=21,},
[30] = {id=30,value=300,},
[31] = {id=31,value=310,},
}

至此完成数据的合并,patch功能适用于数据的细微改动,适合制作海外有细节配置不同的多地区配置,不需要复制出主版本数据,接着在上面修改出最终数据,极大地优化了制作本地化配置的工作流。

时间本地化

datetime类型数据在指定了本地化时区后,会根据目标时区,生成相应时刻的UTC时间,方便程序使用.

通过Luban.Client的参数来指定时区:

-t,--l10n_timezone {timezone}

该时区为linux或win下的时区名,例如: -t "Asia/Shanghai" 或者 -t "China Standard Time" 指定目标时区为 亚洲上海(也即北京时间)

Clone this wiki locally