# 試圖將所有Unity遊戲簡轉繁 RT ※不是所有遊戲都適用,目前只用過skul和節奏醫生成功,其他大多數遊戲都沒嘗試,因此本文僅供參考 # 步驟 ## 一般安裝 1. 確認遊戲使用Unity引擎。 2. 對遊戲安裝[XUnity.AutoTranslator](https://github.com/bbepis/XUnity.AutoTranslator),推薦使用ReiPatcher安裝。 3. 調整設定檔,修改檔案`{遊戲root}/AutoTranslator/Config.ini`套用以下設定: ```ini [General] Language=zh-TW FromLanguage=zh-CN ``` ## 缺失文字 1. 若遊戲中有部份文字缺失,則確認遊戲目錄下是否有`Unity.TextMeshPro.dll`,以Skul這款遊戲的情況位於`{遊戲root}/Managed/`目錄下。 2. 對遊戲主程式exe檔案`右鍵>內容>詳細資料`檢查檔案版本,確認是2018年以後的版本。 3. 若有找到TextMeshPro則代表問題是因為TextMeshPro找不到字型所致,以上兩個檢查都確認為真後,到[此處](https://github.com/bbepis/XUnity.AutoTranslator/issues/57#issuecomment-562344581)下載fonts.zip置於`{遊戲root}/`目錄下,並修改ini為 ```ini [Behaviour] OverrideFont=Microsoft JhengHei OverrideFontTextMeshPro=arialuni_sdf ``` ,若不為真則可能無法使用此方法。 ## 修改翻譯來源 參照[此處](https://github.com/bbepis/XUnity.AutoTranslator#implementing-a-translator)方法,製作dll檔,或是直接[點此下載](https://drive.google.com/file/d/16U8E2_plWVlVoY7Dj_jxv0sBpR9tM4R6/view?usp=sharing)後跳到步驟七放到指定資料夾 1. 從[releases](https://github.com/bbepis/XUnity.AutoTranslator/releases)下載並解壓縮`XUnity.AutoTranslator-Developer-{VERSION}.zip`,對應自己的XUnity.AutoTranslator版本。 2. 首先下載開啟Visual Studio2017,安裝時需要.NET套件(可能也要Unity,不確定)。 3. 開啟後點擊`檔案>新增>專案`,選擇`已安裝>Visual C#>.NET Standard`點選類別庫(.NET Standard)選項,輸入專案名後點確定,專案名最好和待會修改的cs文件內取的ID相同。 4. 找到專案目錄,修改csproj檔案,將`netstandardX.X`改為`net35`(可能要先下載 .NET Framework 3.5以上的SDK)。 5. 對專案點右鍵,`加入>參考`,選取步驟一Developer中的`XUnity.AutoTranslator-Developer-{VERSION}/Developer/XUnity.AutoTranslator.Plugin.Core.dll`。 6. 接著參考他給的範例修改cs文件,我的修改如下: ```C# using SimpleJSON; using System; using XUnity.AutoTranslator.Plugin.Core.Endpoints; using XUnity.AutoTranslator.Plugin.Core.Endpoints.Http; using XUnity.AutoTranslator.Plugin.Core.Utilities; using XUnity.AutoTranslator.Plugin.Core.Web; namespace zhConvert { internal class CustomTranslateEndpoint : HttpEndpoint { private static readonly string ServicePointTemplateUrl = "https://api.zhconvert.org/convert?converter=Taiwan&text={0}"; private string _friendlyName; public CustomTranslateEndpoint() { _friendlyName = "zhConvert(繁化姬)"; } public override string Id => "zhConvert"; public override string FriendlyName => _friendlyName; public override void Initialize(IInitializationContext context) { context.DisableCertificateChecksFor("api.zhconvert.org"); } public override void OnCreateRequest(IHttpRequestCreationContext context) { var request = new XUnityWebRequest( string.Format( ServicePointTemplateUrl, Uri.EscapeDataString(context.UntranslatedText))); context.Complete(request); } public override void OnExtractTranslation(IHttpTranslationExtractionContext context) { var data = context.Response.Data; var obj = JSON.Parse(data); var code = obj.AsObject["code"].ToString(); if (code != "0") context.Fail("Received bad response code: " + code); var token = obj.AsObject["data"]["text"].ToString(); var translation = JsonHelper.Unescape(token.Substring(1, token.Length - 2)); if (string.IsNullOrEmpty(translation)) context.Fail("Received no translation."); context.Complete(translation); } } } ``` 簡單來說就是透過繁化姬的API來達到用詞的簡繁轉換,依照網站提供的API來發送請求,並且解析回應取出翻譯後的文本。 7. 點擊`建置>建置方案`,並將`{專案root}/{專案名}/bin/Debug/net35/{專案名}.dll`放到遊戲資料夾內的Translators資料夾下,不同的安裝方式會有不同的路徑,以ReiPatcher安裝的話會在`{遊戲root}/Managed/Translators`。 8. 啟動遊戲後檢查有沒有出現自己設定的翻譯引擎,還有翻譯內容是否正確,遊戲中點alt+0可以叫出UI,可以確認各翻譯引擎翻出來的結果,若dll編寫失敗的話將滑鼠放在選擇翻譯引擎的介面中,灰掉的翻譯引擎上可以看見error log。 9. 在UI中把使用的翻譯引擎換成自己找的引擎,或是透過修改ini來達到同樣目的,此後都會使用這個引擎來修改,可以達成一般Google翻譯API無法達成的用語簡繁翻譯。 # 資料來源 * XUnity.AutoTranslator介紹:https://forum.gamer.com.tw/C.php?bsn=60599&snA=30521 * 自動翻譯主程式:https://github.com/bbepis/XUnity.AutoTranslator * 使用的簡轉繁線上翻譯API繁化姬:https://docs.zhconvert.org # 參考資料(解決問題) * [繁化姬API範例](https://api.zhconvert.org/convert?converter=Taiwan&text=内存不足!没法在视频聊天时播放视频。) * [尋找本電腦可用的非TextMeshPro一般字型](https://github.com/bbepis/XUnity.AutoTranslator/issues/27) * [創建.NET Standard 類別庫](https://docs.microsoft.com/zh-tw/dotnet/core/tutorials/library-with-visual-studio) * [HttpEndpoint class的範例](https://github.com/bbepis/XUnity.AutoTranslator/blob/master/src/Translators/CustomTranslate/CustomTranslateEndpoint.cs) * [C#字串分割](https://stackoverflow.com/questions/20928315/how-can-i-slice-a-string-in-c)