模组:製作指南/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 腳本 格式化翻譯事件