這次來講一下當初做的第一版改版。這是讓漢化程式從原先吃陸板檔案變成能吃國際板漢化組的檔案,算是很基礎的修改。
會這樣做是當初想要在遇到遊戲版本更新時,可以先套用上個版本的漢化檔,借此保留漢化組修改過的漢化,而不是僅有陸板的中文部分。而這樣也可以讓新版本新增的資料可以導入,避免版本對應不同而造成顯示異常或是遊戲當機。
大致修改的部分是再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)
基本上有了這版大致上遇到版本更新就不需要擔心沒有新版漢化檔了。
不過對於任務對話錯誤的狀況仍會存在,所以還是得找方法修正這問題。