·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 非标汉化 >> 汉化 WinImp 的一点心得—实战 ASCII 字符后期处理    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

汉化 WinImp 的一点心得—实战 ASCII 字符后期处理

作者: Ronnier 来源:汉化教学 时间:2003-07-29 点击:9811

汉化 WinImp 的一点心得
——实战 ASCII 字符后期处理


作者:Ronnier


??首先把话说在前头,其实您看完了这篇文章就会发现,简直是没有写它的必要——因为技术都是别人的,俺只是搬来用了而已。:)不过既然答应了伟兄,只好写出些废话来班门弄斧了,希望能给热情于汉化的朋友们一些帮助,也希望各位汉化高手们看了不要笑话。:)
??WinImp 这个软件是用 Watcon32 C++ 写的,没有字串表这个资源,几乎所有的信息都是以 ASCII 形式存放在文件中的。所以汉化 ASCII 字串就成了汉化这个软件的至关重要的一步。关于批量汉化 ASCII 的原理和方法可以去看看伟乾的《ASCII 资源的汉化 (1)》《ASCII 资源的汉化 (2)》《ASCII 资源的汉化 (3)》这三篇汉化教学文章,在那里面给了很系统的阐述。我在这里要说的不是这些,而是在用 ASCII 字符替换软件完成 ASCII 字符的批量汉化工作后要对其进行的后期处理。
??当使用软件初步汉化完 ASCII 后,首先要进行的一个处理就是要对那些需要加长原来的英文 ASCII 字符串长度才能达到正确汉化目的 RVA 字符串。如你想把一个叫“OK”的按钮汉化成“确定”。关于这方面的思想和方法,可以先看看这几篇汉化教学:梁瑞本的《汉化ASCII字符串的高级技巧——序言》《汉化ASCII字符串的高级技巧——C 字符串篇(1)》《汉化ASCII字符串的高级技巧——C 字符串篇(2)》《汉化ASCII字符串的高级技巧——PASCAL 字符串篇(1)》《汉化ASCII字符串的高级技巧——PASCAL 字符串篇(2)》;伟乾的《关于 DLL 文件基地址以及 ASCII 字符的汉化修改》和梁利锋的《基地址引深》。在 WinImp 中,最典型的就是它的工具栏了。如图:

??用 HexWorkshop 打开 winimp32.exe,用搜索很容易找到工具栏这些字串的地方,如图:

??看到了吧,要把“New”翻译成“新建”,就要把那个“Open”的起始偏移往后移一个字节。启动梁利锋先生制作的偏移量转换器,输入“Open”的起始偏移——498F8,如图:

??好了,得到了代码 F8AE4400,用搜索功能找这个十六进制串,吔?有两个地方吔!如图:



??那么只好一个个试了。先试 12D6F,改为 F9AE4400,没有效果。:(再试 4BA55 那里,改成 F9AE4400,好了,搞定,有效果了,如图:

??等等,心有不甘,认真找找,12D6F 那里的调用是什么地方的。好的,找到了,原来是在主界面的右键菜单中,也是我们需要的。:)如图:

??好了,接下来,就是按平常方法把工具栏这几个字串给汉化了,结果如下图:

??其它的要调整长度的 RVA 字串也可如法炮制,在 WinImp 中这样的地方不多,也就四五处吧。在这里,还要介绍一种很好用的 RVA 字串修改法——乾坤大挪移法,请参看大宇兄的大作《RVA字串乾坤大挪移——偏移量转换器的简单用法》
??在第一次 WinImp 汉化版上传之后,大宇兄首先发难,告知我在 Windows 98/Me 下软件的状态栏字体颇为难看!如图:

??这个样子看了确实是太不爽了!!奇怪的是为什么我在汉化过程中没有注意到?原来我是在 Windows 2000 下汉化的,在 2000 下很多在 98/Me 下显示为 8pt 的字在这里都是“宋体 9pt”的。所以,在这里要提醒大家在 Windows 2000 下汉化完成后最好要到 Windows 98/Me 环境下检查一下有没有难看字体的“漏网之鱼”
??接下来就是要和非资源字体做一番斗争了。:)在作战之前请先阅读梁利锋兄的汉化教学文章《C 程序字号的修改》《汉化中的几个问题》,里面有对付 C 程序中非资源字体的原理和方法。我人很笨,Trw2000 这样的软件我一看就头大。:)所以我用的是比较容易使用的 W32Dasm,反汇编 winimp32.exe,搜索字符串“GDI32.CreateFontA”,得到这个函数调用的地方有三个:
* Possible StringData Ref from Data Obj ->"Times New Roman"
|
:00412C2D 6822E34400 push 0044E322

* Possible Reference to Dialog: DialogID_0004 
|
:00412C32 6A04 push 00000004

* Possible Reference to Menu: MenuID_0001 
|
:00412C34 6A01 push 00000001
:00412C36 6A00 push 00000000

* Possible Reference to Dialog: DialogID_0004 
|
:00412C38 6A04 push 00000004
:00412C3A 6A00 push 00000000
:00412C3C 6A00 push 00000000
:00412C3E 6A00 push 00000000
:00412C40 6A00 push 00000000
:00412C42 6890010000 push 00000190
:00412C47 6A00 push 00000000
:00412C49 6A00 push 00000000
:00412C4B 6A00 push 00000000
:00412C4D FF75FC push [ebp-04]

* Reference To: GDI32.CreateFontA, Ord:0004h

* Possible StringData Ref from Data Obj ->"Times New Roman"
|
:00412C80 6832E34400 push 0044E332

* Possible Reference to Dialog: DialogID_0004 
|
:00412C85 6A04 push 00000004

* Possible Reference to Menu: MenuID_0001 
|
:00412C87 6A01 push 00000001
:00412C89 6A00 push 00000000

* Possible Reference to Dialog: DialogID_0004 
|
:00412C8B 6A04 push 00000004
:00412C8D 6A00 push 00000000
:00412C8F 6A00 push 00000000
:00412C91 6A00 push 00000000
:00412C93 6A00 push 00000000
:00412C95 68BC020000 push 000002BC
:00412C9A 6A00 push 00000000
:00412C9C 6A00 push 00000000
:00412C9E 6A00 push 00000000
:00412CA0 FF75FC push [ebp-04]

* Reference To: GDI32.CreateFontA, Ord:0004h

* Possible StringData Ref from Data Obj ->"MS Sans Serif"
|
:0042E49D 6847E74400 push 0044E747
:0042E4A2 6A00 push 00000000

* Possible Reference to Menu: MenuID_0001 
|
:0042E4A4 6A01 push 00000001
:0042E4A6 6A00 push 00000000

* Possible Reference to Dialog: DialogID_0004 
|
:0042E4A8 6A04 push 00000004
:0042E4AA 6A00 push 00000000
:0042E4AC 6A00 push 00000000
:0042E4AE 6A00 push 00000000
:0042E4B0 6A00 push 00000000
:0042E4B2 6890010000 push 00000190
:0042E4B7 6A00 push 00000000
:0042E4B9 6A00 push 00000000
:0042E4BB 6A00 push 00000000
:0042E4BD 6AF5 push FFFFFFF5

* Reference To: GDI32.CreateFontA, Ord:0004h
??到底哪个才是控制状态栏字体的呢?没办法,只能一个个试过去了。:(用 HexWorkshop 的搜索功能分别找“Times New Roman”和“MS Sans Serif”,把它们一个个改为“System”,看看状态栏字体的变化。终于,在偏移 4D147 处找到的“MS Sans Serif”,如图:

??把它改成“System”,状态栏字体发生了变化,如图:

??嗯,好了,可以肯定第三处的 GDI32.CreateFontA 函数调用是我们要修改的地方,先把刚才偏移 4D147 处的“System”改为“宋体”,再搜索十六进制串“68900100006A006A006A006AF5”,找到了,如图:

??现在把“6AF5”改成“6AF4”,我们就应该得到了“宋体 9pt”的字了,看看效果,果然:

??这样,我们已经得到想要的“宋体 9pt”了。等等,为什么其中的汉字和英文以及数字不对齐呢?看看梁兄的文章吧,原来要改代码页。:)把上面的那个“6A04”后面的那个“6A00”改成“6A86”(梁兄的文章中说要改成6886000000,可是我实践中发现改成 6A86 就行了,这个问题我会再请教其所以然),于是,整个状态栏字体问题就搞定了。:)如下图所示:

??在 WinImp 中,其自解压模块也是采用了这种非资源字体,可以照相同方法解决。:)
??还有,在 WinImp 这个软件中,有许多地方是采用诸如“file%s”来表示复数的。例如这样两个例子:%d damaged sector%s found%s 和 %d sector%s repaired.。汉化时,第一例,其中两个“%s”都是我们不需要的,可以尽数去掉。第二例,其中的“%s”也是不需要的,去掉。这样,这两个地方就可以分别翻译成“%d 个损坏扇区已发现。”和“%d 个扇区已修复。”。不过,对于像这个例子:“Total: %s bytes in %lu file%s. Selected: %s bytes in %lu file%s.”其中的几个“%s”就不是说去掉就能去掉的了。因为如果去掉第一个“file”后面的“%s”,软件读取变量时的就会错掉了!所以,最早我只能把它放在那里不管了,显示效果就像这样:

??怎么样?看了非常不爽吧?幸好后来 ChinEase 兄提醒,在对付这种用 %s 表示 s、ed 或是 ing 的软件时,要改掉这个“s”,如果是 VC++ 类的软件,就找十六进制串 007300,对于 Delphi 类软件,找 010000007300,把其中的 73 改为 00。其实原理也很简单,就是找“s”的十六进制 ASCII 码值 73h,把它改成 00h,让那个 s 显示不出来。:)不过可能找到的地方很多,都要试一个存盘退出测试程序。在 WinImp 里居然有几十处之多,晕倒……不过没办法,为了美观,忍着点吧……好了,最后的结果就像这样:

??经过了这几步,总算是能让汉化完的软件比较美观了。:)这些就是我在汉化 WinImp 时对其中的 ASCII 字符做后期处理的全过程,把它写出来,希望能给各位对汉化有热情的朋友们一点小小的帮助,最后说一句,要看懂我的这篇心得,一定要把文中所列举的那几篇汉化教学都给看过哦。:)另外,文中所述的所有工具软件都能在汉化新世纪下载得到。

—                                           —
 

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): ASCII 非标

·上一篇: 汉化问题----汉化后部分功能无法运行(解答) ·下一篇: 汉化 Vopt99 的一点心得

· 版权申明: 本文引自《汉化教学》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化教学》[ 作者: Ronnier],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号