.NET 程式漢化執行個體

來源:互聯網
上載者:User

序言

本文並非高深的技術文章,只是將一個.Net 程式的完整漢化過程做了說明,文中用到的主要工具有 Radialix、SDL Passolo 2009 、DotNet Helper 、Beyond Compare 以及 EditPlus
等,探討了以上工具的綜合運用。

樣本軟體
Subtitle
Edit
是一個開源免費的字幕處理軟體,開發語言為C#,雖然作者提供了原始碼下載,但一則可能是系統內容原因,所供源碼包本人未能成功編譯;另外感覺漢化原始碼還不如通過反編譯漢化來的方便。

Radialix
初步漢化
不得不說
Radialix 真得很牛X,儘管其穩定性有待改善,但對漢化人員仍提供了很大的支援。Radialix 可以直接讀取 .Net 程式的資源。 建立一個
Subtitle Edit 本地化方案:

可以勾選"提取非標資源"並在目標設定中選擇"建立本地化檔案"。

翻譯標準資源沒有多少技巧。需要說明的是,在 Radialix 中對表單控制項的調整,有時顯示的大小與位置並不一定與目標檔案的相一致:

當出現此問題時,可以先選中該控制項,並切換到資源標籤進行檢查:

這時我們需要做的是,在資源標籤內的翻譯部分直接修改出預期的數值,而不必考慮工具列上顯示的數值。

利用 Radialix 翻譯非標資源,與翻譯標準的字串資源一樣,只是非標資源的初始狀態為唯讀,需要進行切換,可利用滑鼠右鍵菜單或快速鍵 Ctrl+K:

Radialix 還帶有 Google
和微軟強大的聯機翻譯引擎,對於軟體中的詞句,機器翻譯給出譯文的準確度有時高得驚人:

但不能簡單地利用機器翻譯來進行軟體漢化,使用者肯定會抱怨你的行為,甚至不會再去看你的其他作品。

翻譯完畢所有詞句,就可以編譯產生目標檔案,快速鍵為 Ctrl+F9。如果用 Radialix
漢化的是其他軟體且運氣較好,到這一步基本就結束了。但對本例來說這隻是個開始,原因是要麼你產生目標檔案時會報錯,要麼是所編譯出來的檔案有功能缺失。看到這裡你肯定會抱怨前面豈不是白忙了,不過還是請你耐心往下看,因為本文中
Radialix 只作為協助工具輔助。

接下來我們從 Radialix 中匯出翻譯詞典,採用術語檔案格式(*.glo),為後續工作做準備:

由於前面我已對每個翻譯語句做了複查驗證(快速鍵
Ctrl+Q),所以在嚮導中只匯出已驗證的翻譯即可。剩下的就交給其他軟體來處理了。

DotNet Helper

反編譯

DotNet
Helper 是漢化新世紀會員 tracky 開發的支援編譯/反編譯 .Net 的工具,介面直觀操作方便,免去了輸入命令列的麻煩。拖放要反編譯的程式檔案到
DotNet Helper 上:

本例中編譯 Subtitle Edit 的
Framework 的版本就是 2.0 的,且沒有加密混淆等問題,所以無需多餘設定,直接點擊反編譯按鈕即可。產生的檔案很多,但我們主要處理的是副檔名為 .il
的檔案。
另外再囉嗦一下,如果你使用的是 XP 以前的系統,至此你應該確定系統已安裝了.NET Framework 2.0
以上的版本,否則請去官方下載安裝:http://www.microsoft.com/downloads/details.aspx?FamilyID=zh-cn

Passolo

處理 .il
檔案

Passolo
配合強大的資源解析器可以處理各種特殊格式的檔案。為了使 Passolo 能夠正確提取 .il 檔案中的字串,我們需要對其進行設定。以空白工作空間方式啟動
Passolo,點擊工具菜單選擇外掛程式選項,彈出外掛程式管理對話方塊,如:

在解析器標籤中選擇載入文字檔解析器,再點擊右側設定按鈕,彈出文本解析器規則定義對話方塊:

世紀提供了.Net il
檔案的解析規則,但不能解析中雙行字串,我們稍作修改即可解決。點擊這裡下載規則檔案進行匯入。

設定完畢,現在我們可以在 Passolo 中建立新方案,來正式處理先前反編譯出的 .il 檔案了。在添加源檔案時,如果 Passolo
不能正確調用.Net il 解析規則,就需要手動指定:

方案建立好,開始著手翻譯。我們首先要載入從
Radialix 匯出的術語檔案(.glo),在 Passolo 工具菜單下點擊術語表選項,彈出術語表對話方塊:

添加好術語,Passolo
中的操作比較輕鬆,只需在對應的翻譯行上按快速鍵 F8 (可以複選多行同時操作)就可以了。
有一點要說明的是,類似 Passolo
這種智能化的工具,會幫你自動翻譯重複項,多數情況下是好事,但在本例中要注意:Subtitle Edit 存在字幕格式轉換,一些標記、顏色、字型屬性如 Bold
等,是不可翻譯的,要根據上下文判斷詞所在位置,是介面還是字幕格式。最後將翻譯好的方案產生目標檔案。

編譯與“非標”處理


再次回到 DotNet Helper 中,為了方便操作,我們更改副檔名為 .res 的檔案,使其與從 Passolo
中產生的目標檔案名一致,如:SE.res 和 SE.il。拖放 SE.il 檔案到 DotNet Helper
上進行編譯,成功編譯會閃現一個視窗,若眼力好可以看到單詞 successfully:

編譯失敗也閃現一個視窗,有著很醒目的 ***** 號:

遇到錯誤不怕,編譯器會提示錯誤所在的位置(對應 .il
檔案),中出錯的原因是我正運行著先前編譯好的程式,導致新編譯輸出的程式檔案無法對其覆蓋。要查看錯誤資訊,可以先用 DotNet Helper
產生批次檔,然後在命令列中運行即可。

現在我們來運行編譯好的程式檢查一下,發現很多按鈕字元顯示不全;在建立/添加行以及視覺同步面板中有未翻譯的字串:"< ½ sec"
和"&½ second back"按鈕。為了查明原因,可使用文字編輯器開啟 SE.il 檔案,這裡我用的軟體是
EditPlus。為了方便查看,先對其進行設定,點擊 EditPlus 工具菜單選擇"喜好設定",彈出參數選擇對話方塊:

設定完畢就可看到文法高亮顯示了。接下來我們尋找"< ½
sec" 和"&½ second back"字串,沒有結果;繼續搜尋它們"附近"的字串,如"< 3 秒":

可以看出控制項名稱與字串是一一對應的,很明顯最下面紅色框選的部分就是"<
½ sec" ,只要將其替換為"< ½ 秒"即可。不過我們最好去修改由 DotNet Helper 反編譯出源 .il 檔案的相應部分,因為
Passolo 產生新的目標檔案時,我們還要重複上面的操作,不如直接將源檔案中相應部分更改為 Passolo 可提取的字串形式,交給 Passolo
處理。
[提示一下:更改了源 .il 檔案,需在 Passolo 方案中對源檔案(英語)和目標檔案(中文)進行建立/更新字串操作,這樣才能保證
Passolo 能提取已更改的字串]

經過上述處理,進行二次編譯,我們再來檢查一下是否仍有未翻譯的“非標字串”,果然還有兩處:一處是在行間跳轉對話方塊;一處是在匯入二進位字幕檔案選擇語言流的對話方塊。與先前不同的是這兩處都是對話方塊而非單個的字串,但是由
Radialix 編譯產生的漢化檔案,沒有此問題。為了知道區別所在,用 DotNet Helper 將 Radialix
編譯產生的漢化檔案反編譯到其他目錄,複製其中的 .il 和 .res 檔案到由英文原版反編譯的目錄中。也就是說我們移植了 Radialix 漢化版中 .il
檔案與原英文版中的 .resources 和 .xml 檔案構成了一個新的 .Net 資源集:

編譯中的”SE –
漢化版.il”,得到的程式依然存在這兩處未翻譯的對話方塊。現在可以推測“非標字串”不在 .il 檔案中,而是在 .resources 檔案中。啟動
Radialix 建立本地化項目,源檔案是
SubtitleCreator.ChooseLanguage.resources,立刻就看到了“非標字串”:

翻譯完畢,用產生的目標檔案替換源檔案,再次對
SE.il 檔案進行編譯,可以看到對話方塊已翻譯了。同樣的方式處理 Nikse.SubtitleEdit.Forms.GoToLine.resources
檔案。

控制項調整與測試

控制項大小與位置的調整數不少,所以放在最後。調整前還必須再次確認程式沒有任何功能缺失問題,例如有個獨立的單詞“Dictionaries”,我將其翻譯為詞典,結果導致
Subtitle Edit 的拼字檢查功能丟失,出現這種問題要如何排錯呢?

學過編程的都知道有個二分法,可以借用到這裡進行排錯:在 Passolo
中對翻譯狀態列排序,使已翻譯的行集中到一起,從上到下選擇大概一半已翻譯的行,然後按快速鍵 Ctrl+U
取消翻譯,不要再做其他任何附加動作,立刻產生目標檔案,編譯輸出可執行檔進行驗證,這時就只有兩種情況:一種是仍有錯誤,說明在 Passolo
中所選行沒問題,那麼我們可以先撤消取消翻譯操作,再選擇另一半已翻譯行的一半重複剛才的操作;另一種是沒錯誤,說明在 Passolo
中所選行包含了不可翻譯的部分,那麼我們只需在所選行中再選出一半繼續進行驗證……重複以上操作幾次很快就能找到錯誤所在位置。Radialix
中更方便,只需對容易出錯的非標部分進行唯讀屬性列排序,然後選擇一半數量的非唯讀屬性行再按快速鍵 Ctrl+K
切換隻讀屬性,後面的驗證操作就都一樣了。

現在開始調整控制項的大小與位置。先來看一下 .il 檔案中是如何描述的:

也是經過處理的,實際資料並未靠得那麼近,不過只要注意畫紅線的部分就容易辨識了。另外以
0x 開頭的資料是十六進位的,藉助 Win 7
系統內建的計算機可以輕鬆地進行十進位和十六進位之間的轉換。

可以分兩步調整圖中的數值:第一步是粗調,將前面用 Radialix
漢化輸出的檔案反編譯得到的"SE – 漢化版.il"與 Passolo 產生的目標檔案"SE.il"進行比較,只更改數值部分,我們通常藉助 Beyond
Compare 來完成(現在手上沒有"SE – 漢化版.il"檔案,所以只能用"SE.il"與英文源 .il 檔案的比較圖來充數);

接下來是精調,對於未達到預期效果的控制項,可以用
EditPlus 開啟 SE.il 檔案進行手動調節。雖然麻煩但還是有參照的:開啟先前的 Radialix
本地化方案,選中要參照調整的控制項,切換到資源標籤,就能看到控制項的名稱以及位置和大小等資料,這樣改起來也相當快。

更新維護

更新漢化相對來說簡單多了,開啟先前的
Radialix 本地化方案,更改源檔案為新版程式,然後按快速鍵 F5 更新資源,我們就可以立刻知道新版程式有哪些變化:

接下來的操作都雷同就不細說了。

至此我們完成了一個
.Net 程式的漢化。發布之前還是要儘可能地多測試,避免將重大錯誤呈現給使用者。由於 Subtitle Edit
本為開源免費的綠色軟體,所以加殼、打包等不屬本文的討論範圍。以上是本人目前掌握的 .Net 程式漢化的一種折中方案,也許將來新版 Radialix
能徹底改變這種複雜的方式,或是誕生新工具給出更好的解決方案。希望朋友們也能分享自己經驗,更希望耐心看完本文的你能夠有所收穫。 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.