主題

如何製作漢化工具.3

Q拔 | 2021-01-23 23:05:28 | 巴幣 2012 | 人氣 6159

這次來講一下當初做的第一版改版。這是讓漢化程式從原先吃陸板檔案變成能吃國際板漢化組的檔案,算是很基礎的修改。

會這樣做是當初想要在遇到遊戲版本更新時,可以先套用上個版本的漢化檔,借此保留漢化組修改過的漢化,而不是僅有陸板的中文部分。而這樣也可以讓新版本新增的資料可以導入,避免版本對應不同而造成顯示異常或是遊戲當機。

大致修改的部分是再ReplaceEXDF與EXDFUtil這兩個class裡面,因為這兩個都涉及到提取檔案的處理。

我們直接打開code來看,ReplaceEXDF.JAVA line 136~142 這行附近。

if (cnEXHFileAvailable){
  try{
     Integer exdFileCRCCN = FFCRC.ComputeCRC((fileName.replace(".EXH", "_" + String.valueOf(exdfPage.pageNum) + "_CHS.EXD")).toLowerCase().getBytes());
     SqPackIndexFile exdIndexFileCN = indexCN.get(filePatchCRC).getFiles().get(exdFileCRCCN);
     byte[] exdFileCN = extractFile(pathToIndexCN, exdIndexFileCN.getOffset());
     EXDFFile chs_exd = new EXDFFile(exdFileCN);
     chsExdList = chs_exd.getEntrys();

這邊幾段code的意思是,根據命名規則計算一組CRC,再用這組CRC從0a0000.win32.index取得實際位置的offset,有了offset後就可以在從0a0000.win32.dat0 中提取該檔案的row data (byte[] exdFileCN), 將這些資料丟去new 一個EXDFFile類別出來以利後面的處理。

那看到138行這邊不難猜他的命名規則、_pageNum_CHS.EXD。

前面的pageNum表示是資料表的分頁數,後面CHS則就是象徵他是哪個語言的。稍微查一下基本上支援七種語言。
enum Language : uint16_t
{
    None,
    // ja
    Japanese,
    // en
    English,
    // de
    German,
    // fr
    French,
    // chs
    ChineseSimplified,
    // cht
    ChineseTraditional,
    // ko
    Korean
}
(參考資料:https://xiv.dev/game-data/file-formats/excel,可以看到當初規劃有繁體中文的,可惜沒機會能看到了。)

好拉、講了一堆。上述程式簡單的說就是從陸板(CHS)檔案裡抓取資料。

那我們整理一下原先漢化的流程 >從陸板(CHS)的位置提取資料 ->放入國際板日文版(JA)的位置。

根據思路想把流程改成 >從國際版(JA)已經漢化過的版本提取資料 -> 放入國際板日文版(JA)的位置。

根據這樣,程式方面我們可以改動如下。
Integer exdFileCRCCN = FFCRC.ComputeCRC((fileName.replace(".EXH", "_" + String.valueOf(exdfPage.pageNum) + "_JA.EXD")).toLowerCase().getBytes());
這樣表示會從JA提取資料。當然不只這邊、EXDFUtil.java 裡面也有三處需要修改。

然後在資源檔方面也要做替換,原先resource/text/下面放的是陸板的檔案,經過修改後應該就可以吃漢化過的國際板檔案吧......哈有點久了已忘記試了有問題在說。

另外要注意的是繁簡體的問題,當初我是取得簡體的所以不需要特別再修改。但如果是直接使用繁體中文漢化檔的話就必須考慮繁體字被繁簡轉化的機制做過度翻譯的問題,不過這部分比較簡單。

程式是內使用JianFan這個簡轉繁套件,理論上從ReplaceEXDF.JAVA  LINE 277 這邊修改即可
newFFXIVStringBytes = ArrayUtil.append(newFFXIVStringBytes, JianFan.getInstance().j2f(new String(bytes, "UTF-8")).getBytes("UTF-8"));

可以試著改成....
newFFXIVStringBytes = ArrayUtil.append(newFFXIVStringBytes, bytes);
(不過沒有測試過XDD)

基本上有了這版大致上遇到版本更新就不需要擔心沒有新版漢化檔了。

不過對於任務對話錯誤的狀況仍會存在,所以還是得找方法修正這問題。


創作回應

大歐派蘿莉
會想注入英文的動機是因為原本替換日文的版本,有些過場還是使用日文字幕,所以才想改成替換英文版,不知道現在的研究方向正不正確
2021-05-26 06:38:55
Q拔
那些過場呀?或許可以先用Godbert打開來看一下,檢查該過場字幕在哪個檔案裡、看看是為什麼沒替換過去0.0
2021-05-26 10:19:41
Q拔
突然想到目前目前 GITHUB上的FFXIVChnTextPatch 應該會用了會部分字體整個花掉吧?
2021-05-26 18:39:08
大歐派蘿莉
我記得像是 2.0 第一次帶到南方堡的過場動畫,字幕就是日文,不過那個看起來很像是影片應該不能改,還有像是 3.0 開頭也有一幕都是日文的紅字,然後像是一些功能開放(例如風脈泉解鎖時跳在畫面上的字幕)也是日文,這個感覺也是不能修改的,其實影響不算太大,但還是想試試看能不能換成英文為底的
2021-05-26 21:11:53
大歐派蘿莉
至於字體的部份還感受不太出來,換到英文上面之後只有一小部份是中文的,大部分的字串都還是英文,我在推想會不會是 EN 的 offset 跟 JA, CH 都不一樣才代換不了,Godbert 的部份我還沒嘗試,因為本身不是 Java 跟 C# 專門的,建置 Gradle 耗費了蠻多心力的 ((汗
2021-05-26 21:14:04
Q拔
我覺得程式再逐個檔案再替代時試試看放些log檢查,不然語系都是走同個流程走才對。因為做英文版的漢化時,我也是走同個流程,只遇到道具名稱放的位置不一樣而已。
2021-05-27 20:46:48

更多創作