模组:制作指南/APIs/Translation

来自Stardew Valley Wiki
跳到导航 跳到搜索

制作SMAPI模组 SMAPI mascot.png


模组:目录

翻译接口可让模组实现多语言,并将所有语言包含在一个发行包中,以便 SMAPI 根据游戏语言自动使用。

概述

SMAPI 从模组文件夹中的文件读取翻译。当请求翻译时,它将自动处理语言环境
例如,如果指定的翻译文件 pt-BR.json 不可用,SMAPI 将检查 pt.jsondefault.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 脚本 格式化翻译事件