2011-06-01

當樂漢化教程:七、smali文件中文本的處理


七、smali文件中文本的處理
相信跟著前幾章操作過的讀者可以發現,有相當一部分遊戲的漢化方法和軟件是類似的,只要會使用apktool反編譯apk文件,然後修改xml文件裡面的文字就能完成漢化工作。這類遊戲很適合新手來嘗試,類似於怒鳥那樣的遊戲漢化起來就相對複雜,最好積累了足夠經驗後再進行。
這章我們會用一個簡單的遊戲來說明下遊戲漢化的過程,大部分的操作和第二章裡的軟件漢化是類似的,主要是想用通過其說明下classes.dex文件中(反編譯後為若干smali文件)文本的處理方法和注意事項。

首先可以在http://android.d.cn/game/84.html下載到我們要漢化的遊戲:迪斯尼找茬。然後和第二章中一樣,用apktool對apk文件進行反編譯。
查看後發現,strings.xml文件中只有一個"Find It Disney",這是遊戲在手機裡顯示的名字。其他的文本,例如菜單項的內容都不在這裡。
對於這樣的文本我們有兩種處理辦法:
第一種是逐個打開反編譯出的xml文件,看裡面是不是有需要翻譯的文本。一般推薦按照這個進行,雖然每個都打開看比較麻煩,但是可以最大限度地避免出現遺漏。
第二種是利用軟件的搜索功能,一般這個方法更多地用在查找遺漏的文本,因為未必所有文字都能找到合適的關鍵字。


我們先用第一種方法,大部分的文本在layout文件夾下的xml文件裡,例如mainmenu.xml中是菜單裡的文字。(僅截取部分)
  1. ……
  2. <Button android:textColor="#ffffffff" android:layout_gravity="center_horizontal" android:id="@id/mainmenustart" android:background="@drawable/defaultbuttonxml" android:layout_width="150.0sp" android:layout_height="wrap_content" android:layout_marginBottom="10.0sp" android:text="Start Game" />
  3. ……
复制代码
翻譯後:
  1. ……
  2. <Button android:textColor="#ffffffff" android:layout_gravity="center_horizontal" android:id="@id/mainmenustart" android:background="@drawable/defaultbuttonxml" android:layout_width="150.0sp" android:layout_height="wrap_content" android:layout_marginBottom="10.0sp" android:text="开始游戏" />
  3. ……
复制代码
都翻譯修改完之後,我們可以注意到,文本儲存的形式都是android:text="???"這個樣子,因而可以在emeditor中使用"android:text="作為關鍵字來搜索檢查一下。

其中E:\apktool\t是用apktool反編譯時設定的目錄。
檢查後沒有遺漏後,和軟件一樣再用apktool編譯,並簽名打包,安裝到手機進行測試。

測試的時候我們發現,菜單界面仍然有英文

說明這部分文本被我們遺漏了,但是xml文件裡並沒有這句話("Sound:Off"在mainmenu.xml裡面有,但修改後並沒有顯示)。
另外一些提示框裡的文字(比如退出確認)也還是英文,一般這樣的文本是被存儲在了classes.dex文件中。
classes.dex文件存儲著apk應用裡主要的代碼,有時會有少部分文本被以代碼的形式存儲在裡面(也有時很多),利用apktool的反編譯功能使得我們也能對其進行修改。
前面說過,classes.dex被反編譯成smali文件,這實際是文本文件,可以用文字編輯工具打開。一般來說反編譯出來的smali文件很多,一個一個查看並不現實,因此我們只能用搜索的辦法,或者直接搜索需要的句子:

或者搜索關鍵字:

這是因為在smali文件中,文本(字符串)大多以const-string類型保存,因此搜索"const-string"就能找到它們。
我們將MainMenu.smali文件裡的"Sound: On"和"Sound: Off"修改掉,再次編譯看下效果。(注意編碼要設定為UTF-8無簽名)
    1. ……
    2. iget-object v1, p0, Lmonkeypunch/android/finditdisney/MainMenu;->sound:Landroid/widget/Button;
    3. const-string v2, "声音:开"
    4. invoke-virtual {v1, v2}, Landroid/widget/Button;->setText(Ljava/lang/CharSequence;)V
    5. ……
    复制代码

    同樣的方法,我們修改其他的遺漏文本,這需要我們盡可能的玩通遊戲來查看是否有遺漏。
    這裡要特別提醒,當使用搜索"const-string"的方法在smali文件裡尋找文本時,最好能把要修改的句子事先在遊戲裡確認一下,我們可以看到,搜索出來的結果非常多,有些看似應該翻譯的句子實際是遊戲代碼的一部分,一旦修改很可能會導致運行出錯,因此一定要特別小心,盡可能少改動,並多做測試。
    想做的更仔細一點的話,可以再修改下遊戲裡面的圖片(png格式),這樣一個遊戲的漢化就完成了。

    via: 當樂漢化教程

    沒有留言: