模组:製作指南/APIs/Translation
← 模組:目錄
翻譯接口可讓模組實現多語言,並將所有語言包含在一個發行包中,以便 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 腳本 格式化翻譯事件