主題

如何製作漢化工具.5

Q拔 | 2021-02-07 21:29:24 | 巴幣 5126 | 人氣 4906

這次說明使用csv檔案進行漢化的流程。大部分是使用文字編器而不涉及程式碼的操作,所以這篇會顯得比較平易近人?.....恩、除了指令句之外。

首先看一下FF14匯出的本文結構長什麼樣,我用截圖會比較好演示。(使用SaintCoinach的修改版匯出,指令句會長不一樣)
這個畫面我是用winmerge 比對軟體進行比對時的畫面,同時比對漢化過與日文原文的文本。

可以看到有一堆目錄跟檔案,一般來說任務與劇情類的對話文本都統一整理放在相關目錄裏頭、當然也是csv,而從名稱上來看也不難猜出其類型。

/Quest 是一般任務的劇情對話。大致上我們過的劇情都可在這找到。
/cut_scene 是過場劇情的對話。有配語音的好像都放這裡。
/custom 與dungeon也有部分的對話文本。像是優雷卡之類的。


我擷取quest\037\LucKmi107_03777.csv 下的一段任務劇情看看(暴雷注意?)。
這邊我是調整成上面中文與下面原文的排列方式來觀看。

通常任務劇情的文件格式都是 -> "index", "quest id ", "對話"。(圖片為了方便觀看,index被我擠過去了,id也只顯示部分...)

前兩個不可動。然而對話部分只要無指令句要改的話直接改字串即可。

Ex.  
"ああ、まあな……。"  --> "啊啊,是这样……"
這種直接翻譯.非常簡單。



再來是遇到指令句的部分,這在FF14本文中大量使用。通常都是幫文字做一些空行,特效、或指定某些物件,其語法也有難易的差別,簡單的可以直接使用。

Ex.
"さてと……。<hex:02100103>みんなとは、ユールモアで合流する手はずだったわね?"
-->"接下来……<hex:02100103>计划是在游末邦与大家汇合对吧?"

"私のせいで余計に時間をとらせてしまって、ごめんなさい。<hex:02100103>急いで向かうとしましょうか。"
-->"对不起,都怪我,耽误了不少时间。<hex:02100103>我们快点过去吧。"

可以看到漢化後指令句沒變不需要更改,複製貼上就好。


怎麼判斷這指令句是可以複製貼上的,其實多半也不需要了解其意思、只要看指令是不是完整即可。

辨識的秘訣就是 字句 0x02 開頭  0x03 結束 (16進制 )。 第個位置數值(BYTE)為長度,從第個位置開始計算,只要翻譯後長度沒有變動就屬於可忽略指令句。

Ex 1.
<hex:02100103>  空行字句,長度1  (只有0x03) ,指令完整可PASS。
                    
Ex 2.
"あら、<hex:022C0DFF07022903EB0203FF02200203>ちゃん!<hex:02100103>なんだかまた難しいことになっているようだけど、<hex:02100103>あなたが来てくれて嬉しいわ!"
--> "哎呀,<hex:022903EB0203>!<hex:02100103>好像事情又变得复杂起来了,<hex:02100103>不过你能过来,我真的是好高兴!"

舉例舉的不是很好,中日使用指令字句不同,中文指的是腳色全名,而日文是提取腳色姓名的名部分(可能是比較親近的叫法??)。但還是可以拿來練習驗證指令完整性

這邊我們分析一下日文部分...
<hex:022C0DFF07022903EB0203FF02200203> 長度0x0D = 13 (FF 07 02 29 03 EB 02 03 FF 02 20 02 03) ,正確,指令完整可PASS。

中文部分
<hex:022903EB0203>  長度0x03 = 3(EB 02 03),正確,指令完整可PASS。

其實基本上8成的劇情內容應該都這種,少部分才要修改指令句,但原則上我們也只是做興趣的,遇到太複雜的可直接刪掉,照自己意思改比較省事,哈。



看完任務類之後我們再看看以單獨檔案存在的文本,這些是比較系統或介面的資料類型,也是舉幾個例子。
Achievement.csv 成就名稱
action , 技能招式的名稱。
ActionTransient.csv 技能招式的解說。
Addon.csv  遊戲介面的部分,也包含系統句、若有指令句要較謹慎,改不好會異常。

CompleteJournal.csv 完成的任務日誌
Item.csv  物品裝備之類
BNpcName.csv  NPC 名稱
Balloon.csv 這是NPC的小對話。
Quest.csv 任務的基本設定,不含對話。

基本上這邊也沒固定格式了。
這邊貼一下addon的節錄

可以看到通常都是小句子,小片語,不過常帶有系統級的指令句,處理時要較為小心。

漢化時如劇情部分一樣,大部分是可直接使用。不過一旦遇到需要修正的情況,要嘛不要翻譯,要嘛就得改好,不然就必然造成異常。

吶、其實修正也只是修正指令句長度而已。我們直接來看。

Ex . 普通長度修正類型

"買取価格:<hex:022206E802FF022C03> <hex:020825E803FF01FF1F> マーケット取引不可<hex:03>"
-->"收购价格:<hex:022206E802FF022C03> <hex:02081FE803FF01FF19> 不可在市场出售<hex:03>"

<hex:022206E802FF022C03>  第一個指令句屬於完整不需要更改,可直接使用。

主要問題在第二句上。
<hex:020825E803FF01FF1F> マーケット取引不可<hex:03>

可以看到這是指令句裡包含文字的,觀察第三BYTE 資料長度 0x25 = 37 涵括字串 (E8 03 FF 01 FF 1F  マーケット取引不可 03),由此可見翻譯後文字必然更動,也必然對指令長度造成增減,所以這時候需要重新計算字句長度。

計算方式是指令碼數量、通常不變 (E8 03 FF 01 FF 1F + 03) + 文字轉成UTF-8 格式的byte數 ( 不可在市场出售)。   <<< 這個通常我是程式算,沒在用手算哈。

之後會得出0x1F,更改如下。
<hex:02081FE803FF01FF1F> 不可在市场出售<hex:03>

不過這樣還不行,因為這指令是IF判斷句類型, 後面的兩個FF實際上是指兩種CSAE的結果,第一個FF表示沒資料會不顯示,第二個FF則會顯示 不可在市场出售 ,(簡易格式 0xFF +len+ xxxxxxx )其0x1F 就是這句文字的長度,所以在翻譯後也是需要更改的。

於是呢,最後更改如下
<hex:02081FE803FF01FF19> 不可在市场出售<hex:03>



Ex . 再舉第二顆栗子,這是複雜指令句。
"<hex:020957E802FF10>すべて表示<hex:FF1F>コンプリートのみ表示<hex:FF22>未コンプリートのみ表示<hex:03>"  
--> "<hex:020939E802FF0D>显示全部<hex:FF13>只显示已完成<hex:FF13>只显示未完成<hex:03>"

雖說複雜但本質上還是計算長度,只是得查一下是什麼樣的指令。
經過查詢後得知是個switch,而switch是個多case的選項,所以可以看到很多FF接字串,翻譯之後也是照上面的步驟去修正各別字串長度即可。

Ex.
  .....沒Ex了,雖然還有一種是判斷句的case後面再夾帶一個指令句的,但萬變不離其宗,細細推敲還是可以了解怎麼處理,這邊就不再介紹。



好啦,就打到這,其實基本都差不多了,雖然部分細節沒怎麼講但大致方向都有的。匯出csv的部分有興趣的人也是可以改改看,他也是方便編輯的手段一種或許有人可以弄出別種更好的方法!


最後再這邊祝大家春節新年快樂拉。

創作回應

賈斯奧.雷諾多
大大真的好專業
2021-02-08 01:47:31
Q拔
也是國外的高手先研究出來,我才有機會透過程式去研究啦。
2021-02-08 19:49:10

更多創作