模组:制作指南/APIs/Translation
阅读
2024-10-15更新
最新编辑:sizau
阅读:
更新日期:2024-10-15
最新编辑:sizau
← 模组:目录
翻译接口可让模组实现多语言,并将所有语言包含在一个发行包中,以便 SMAPI 根据游戏语言自动使用。
概述
SMAPI 从模组文件夹中的文件读取翻译。当请求翻译时,它将自动处理语言环境
例如,如果指定的翻译文件 pt-BR.json 不可用,SMAPI 将检查 pt.json 和 default.json
翻译可以是一个简单的字符串,也可以包含将值注入到翻译中的标记。
i18n 文件夹
文件结构
SMAPI 从模组文件夹中的 i18n 子文件夹中的 JSON 文件读取翻译,文件结构如下:
YourMod/ i18n/ default.json es.json pt.json manifest.json YourMod.dll
default.json 文件包含在没有翻译可用时将显示的默认文本,一般是英语
您需要为每种语言创建一个单独的文件,每个翻译文件应是以下文件名之一:
语言 | 文件名 |
---|---|
中文 Chinese | zh.json |
法语 French | fr.json |
德语 German | de.json |
匈牙利语 Hungarian | hu.json |
意大利语 Italian | it.json |
日语 Japanese | ja.json |
韩语 Korean | ko.json |
葡萄牙语 Portuguese | pt.json |
俄语 Russian | ru.json |
西班牙语 Spanish | es.json |
土耳其语 Turkish | tr.json |
对于 自定义语言,请在文件名中使用其 LanguageCode 值
文件格式
每个 .json 文件都应是 key→value 键值对格式。 每个键不区分大小写,并且可以包含字母数字、下划线、连字符和点字符。可以随意添加 JavaScript 注释来组织或记录您的翻译,例如:
{
"item-type.label": "Item type",
"item-type.fruit-tree": "{{fruitName}} tree",
}
其中的 {{fruitName}}
是一个令牌。可以添加任何您想要的令牌(每个令牌在名称中只有字母),并用代码中的值替换它们(请参阅下面的 读取翻译)
给译者的提示
- 使用 UTF-8 编码保存 i18n 文件以避免游戏中乱码
- 在 SMAPI 控制台中输入
reload_i18n
并按 Enter 键即可重新加载翻译而无需退出游戏。(如果模组内部缓存了翻译,则可能不会更新。)
读取翻译
内置接口
设置 i18n 文件后,就可以在代码中读取当前语言环境的翻译:
// 读取一个简单的翻译
string label = helper.Translation.Get("item-type.label");
// 读取使用标记的翻译(可以是匿名对象、字典或模型)
string text = helper.Translation.Get("item-type.fruit-tree", new { FruitName = "apple" });
helper.Translate(…) 方法可以继续调用其返回值来自定义翻译(有关可用方法的说明,请参阅 IntelliSense)
要获取文本,只需将其分配给一个字符串:
string text = helper.Translation.Get(key).Tokens(tokens).Tokens(moreTokens).Default("缺少翻译?");
强类型接口
内置接口没有构建时验证。例如,如果设置了 fruitName
参数,但翻译实际上使用 {{fruit}}
,则在测试每个参数之前无法知道游戏中的翻译是否正常。这对于大多数模组来说没问题,但对于在许多不同的 UI 流程中拥有数百种翻译的大型模组来说可能会出现问题。
可选的 SMAPI 模组翻译类生成器 可生成一个强类型来读取翻译:
string label = I18n.ItemType_Label();
string text = I18n.ItemType_FruitTree(fruitName: "apple");
如果翻译出错就会立即知道,因为它无法编译。
也看看
LINQ 脚本 格式化翻译事件