·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 特殊汉化 >> 【.NET 程序初级汉化流程一例2:控件调整】    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

【.NET 程序初级汉化流程一例2:控件调整】

作者: 决斗 来源:http://bbs.hanzify.org/index.php?showtopic=36212&s 时间:2005-06-26 点击:10972

上一篇:【.NET 程序初级汉化流程一例】

【.NET 程序初级汉化流程一例2:控件调整】

序言:
这次我们继续上一次的 .NET 小工具 WinMD5 2.05 汉化后的外观控件调整。
具体汉化/翻译流程本文不再叙述。
这里提醒一点:xxd (徐小栋) 兄提供了一个 Passolo 用于对 *.il 文件中可翻译字串提取的文本解析规则,而我又将其稍修改了一下,再此规则上增加了一条,因为“ldstr”后跟随的字串有时有换行的现象,所以这个增加的规则有助于提取。以后可能会出现其他情况,到时视情况而修改/增加这个规则。这个规则仅适用于 Passolo 工具,大家也可以补充,和/或发上其他专业化本地工具的解析提取规则与大家共享。我将在附件中提供这个修改过的 Passolo 规则供大家使用(附件为 il_files_for_PA.rar)。

正文:
现在我们来利用反编译得到的 *.il 代码文件,对其进行代码修改来调整一些显示有问题的控件。
首先启动汉化/翻译完成后重新编译的 WinMD5.exe 文件,大家可以看到有三处控件位置明显有问题,如图(1):
附带图片

由于 *.il 文件是反编译得到的代码文件,所以对于这个 .NET 程序没有方便的可视化调整方法,那么现在用记事本或增强文本编辑工具打开我们汉化/翻译好的 WinMD5.il 文件,来找到需要修改代码参数的位置。
先用“查找”功能,找到“当前进程”字串的位置,我把本例中的上下一段代码贴出来,如下:

IL_01da: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1
IL_01df: ldc.i4.8
IL_01e0: ldc.i4.s 12
IL_01e2: newobj instance void [System.Drawing]System.Drawing.Point::.ctor(int32,
int32)
IL_01e7: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Location(valuetype [System.Drawing]System.Drawing.Point)
IL_01ec: ldarg.0
IL_01ed: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1
IL_01f2: ldstr "label1"
IL_01f7: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)
IL_01fc: ldarg.0
IL_01fd: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1
IL_0202: ldc.i4.s 120
IL_0204: ldc.i4.s 20
IL_0206: newobj instance void [System.Drawing]System.Drawing.Size::.ctor(int32,
int32)
IL_020b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Size(valuetype [System.Drawing]System.Drawing.Size)
IL_0210: ldarg.0
IL_0211: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1
IL_0216: ldc.i4.2
IL_0217: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_TabIndex(int32)
IL_021c: ldarg.0
IL_021d: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1
IL_0222: ldstr "当前进程:"
IL_0227: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)

我们现在来看这段代码,“当前进程:”字串上一行有“WinMD52.WinMD5Form::label1”字样,“label1”就是“当前进程:”这个控件的名称,“当前进程”就是赋予这个控件的字串。现在向上隔几行可以看到两行相随的“IL_0202: ldc.i4.s 120”和“IL_0204: ldc.i4.s 20”的代码语句,而紧跟着的上一行也有“WinMD52.WinMD5Form::label1”字样,说明这两条语句就是赋予控件“label1”(即“当前进程”)的大小参数,120 为“label1”(即“当前进程”)控件的宽度,20 为其高度,本例中将宽度 120 修改为 60 (减短一些)即可,因为汉化/翻译后的中文比英文通常短较多,具体可测试编译后的文件。
那么我接着向上可以看到“ldstr "label1"”的语句,其上一行也有“WinMD52.WinMD5Form::label1”字样,再向上隔几行可以看到“IL_01df: ldc.i4.8”和“IL_01e0: ldc.i4.s 12”两句参数代码,其上一行也有“WinMD52.WinMD5Form::label1”字样,这两句就是赋予“label1”控件(即“当前进程”)的 x 和 y 对应这个窗体的坐标值,上行为 x 坐标,下行 12 为 y 坐标,本例中此处不需要修改。

可能笔者描述的比较烦琐,那么现在我们来概括一下:
找到“当前进程”字串后,记住其上一行语句最后所赋予的控件名称“label1”,然后向上查找两行紧跟的“ldc.i4 xxx”语句,这是定义此控件的宽度和高度;再向上通常可以看到控件“label1”名称字串,其向上隔几行,同样可以看到紧跟的两行“ldc.i4 xxx”语句,这是定义此控件的 x 和 y 对应窗体的坐标值,其上一行也有和“当前进程”上一行相同的赋值语句“class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::label1”。
意即其间向上找到两处有“ldc.i4 xxx(数字)”的两行语句,依次上下顺序为:控件 x 和 y 坐标、控件宽和高。

也许有朋友会问:你是如何确定这些是控件位置和大小的参数代码呢?
请看 控件大小 两行语句下面的两行代码:
instance void [System.Drawing]System.Drawing.Size::.ctor
instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Size(XXX...)
Control::set_Size 这就是设置控件大小的定义。
再看 x 和 y 坐标两行语句下面的代码:
instance void [System.Drawing]System.Drawing.Point::.ctor
instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Location(xxx...)
Control::set_Location 这就是设置控件位置的定义。

好,现在来看看“发现错误”的位置和大小定义:

IL_0a0a: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::alertLabel
IL_0a0f: ldc.i4 0x1a4
IL_0a14: ldc.i4.8
IL_0a15: newobj instance void [System.Drawing]System.Drawing.Point::.ctor(int32,
int32)
IL_0a1a: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Location(valuetype [System.Drawing]System.Drawing.Point)
IL_0a1f: ldarg.0
IL_0a20: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::alertLabel
IL_0a25: ldstr "alertLabel"
IL_0a2a: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)
IL_0a2f: ldarg.0
IL_0a30: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::alertLabel
IL_0a35: ldc.i4.s 112
IL_0a37: ldc.i4.s 16
IL_0a39: newobj instance void [System.Drawing]System.Drawing.Size::.ctor(int32,
int32)
IL_0a3e: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Size(valuetype [System.Drawing]System.Drawing.Size)
IL_0a43: ldarg.0
IL_0a44: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::alertLabel
IL_0a49: ldc.i4.s 12
IL_0a4b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_TabIndex(int32)
IL_0a50: ldarg.0
IL_0a51: ldfld class [System.Windows.Forms]System.Windows.Forms.Label WinMD52.WinMD5Form::alertLabel
IL_0a56: ldstr "发现错误"
IL_0a5b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)

如上述方法,可以看到“发现错误”的控件名称为“alertLabel”,向上看到“Control::set_Size”和“System.Drawing.Size::.ctor”两行,再上面的“IL_0a35: ldc.i4.s 112”和“IL_0a37: ldc.i4.s 16”就是定义控件大小,本例中此处控件大小不需修改。
再向上可看到“ldstr "alertLabel"”字串,而其上面可以找到“Control::set_Location”和“System.Drawing.Point::.ctor”,那么其上面的“IL_0a0f: ldc.i4 0x1a4”和“IL_0a14: ldc.i4.8”两行代码,就是其位置定义了。
上行为 x 坐标,下行为 y 坐标,现在我们将 x 坐标“0x1a4”改为“0x1d8”,其意义就是将 x 坐标向右移。
那么 y 坐标如何改呢?原句为“ldc.i4.8”,似乎后面没有赋值参数,其实“.8”就是其参数,没关系,现在我们可以将“.8”删除,然后增加空格,与上行对齐,自己给它重新赋值,赋值为“0x9”,其意义就是将 y 坐标向下移。
这里说明一下:参数值从 0 到 9 十个数字和 a 到 f 六个字母组成。字母值比数字值大,其依次顺序为:
0、1、2……9、a、b、……f、10、11、……1a、1a1、……1b、1b1、……a1、a11、……b1、b11、……依次类推。f 后跟随的数值为最大。

好了,下面我们将“(空闲)”向左移,将“在 MD5SUM 文件中发现的已知 md5 混编(散列)数目: ”向右移,也按上述方法修改,具体数值变化不要修改太大,可自行测试即可结果查看。

下面我们看看修改后的界面控件对比图,如图(2):
附带图片

现在我们对这几个控件的位置调整完毕,可能笔者描述的不是很清楚,没关系,您只要记住:
System.Windows.Forms.Control::set_Size 定义控件大小,上面有两行数字/字母值的紧跟语句就是参数代码。
System.Windows.Forms.Control::set_Location 定义控件位置,上面有两行数字字母值的紧跟语句就是参数代码。
记住、熟悉、分析,就能看懂这种较明显的赋值语句,对控件位置和大小修改就会方便和快速的多。

这里对上一文做一点补充:
上文提到重新编译后的程序无图标和版本信息,我们使用 Resource Hacker 来添加,后来 orochi_cn 兄指出这么做有时可能会引起问题。
而应该使用 ilasm xxx.il /resource:xxx.res 的命令方式来编译,这样重新编译的程序才是和原版基本相同的程序了。
如本例:
ilasm WinMD5.il /resource:WinMD5.res

最后要说的是,本例中的这个 .NET 小工具的语句比较清晰,容易分析和看懂,本文主要是提供一种方法和思路,以后碰到复杂的程序时可能会变化很大,那就以后需要大家的补充来完善这些控件调整的修改方法,所以本文方法可能并不包括所有 .NET 程序,如果您碰到了复杂,并且代码混淆,结构复杂的程序时,可以和大家一起讨论和分析。(因为现在很多 .NET 程序使用一种名为“代码混淆器”来使代码结构变的混乱以防破解/修改,具体相关信息请查阅网上资料)
以上仅为笔者的一点初步分析和所理解的内容,不足之处或错误的地方请大家完善和补充。
风中决斗 2005.6.25 晚

附件为对 xxd 兄的 passolo 文本解析规则增加了一条规则,供大家使用:
il_files_for_PA.rar

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): NET 控件

·上一篇: 语言文件的PASSOLO汉化操作--动画演示教程 ·下一篇: [公告] 关于非成员汉化作品的捆绑相关规范

· 版权申明: 本文引自《http://bbs.hanzify.org/index.php?showtopic=36212&s》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《http://bbs.hanzify.org/index.php?showtopic=36212&s》[ 作者: 决斗],如需转载请直接联系原始作者,并请注明原始出处。

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

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