软件汉化教程

      看到网上经常有人问汉化方面的东西,我今天也来灌水一篇,来个汉化扫盲教程。写的不好的地方欢迎大家指正!OK,现在我们进入正题。我这里所说的汉化,是指汉化 Windows 下的 PE 文件,把其他语言界面的程序翻译为中文界面。要汉化一个软件,一般的流程是这样:

一、检测软件是否加了壳。

    汉化一个软件前我们首先要做的就是要看看软件是否加了壳。因为程序加了壳后,一般情况下资源也被压缩了,使用普通的汉化工具是无法汉化的。这时一般有两种办法:一种是完全脱壳后再汉化,这种方法可以汉化的比较彻底;另一种是壳太猛,不好脱,只好退而求其次,用 freeRes 这样的工具来释放一下资源,再来汉化。这种方法只能汉化标准资源,一般就是主界面看到的部分,非标准资源因为未脱壳,还是无法汉化,所以这种方式汉化的不彻底。平常我们看到的汉化软件一般都是完整的汉化,就是有壳的脱了壳,标准资源和非标准资源都汉化了。这里脱壳后的文件优化也要注意,平常我们分析软件的时候,只要脱了壳,程序能正常运行,没有功能丢失就可以了,但要能汉化的话要求要严格一些。因为要使用一般的汉化工具来汉化程序的话,最好脱壳后程序的资源段(一般区段名称是 .rsrc)要放在最后,这可以使用 FixRes 或 freeRes 这样的工具来重建资源。另外,平常我们把脱壳后的程序优化时可以用 LordPE 删除垃圾区段,再重建一下。但若要用汉化工具来汉化这种用 LordPE 优化重建后的程序,很可能生成的汉化程序运行时会出错。如果你要会手工优化的话那是最好,可以删除垃圾区段,根据文件对齐粒度和区段对齐粒度等来优化文件,这样手工优化后的文件一般汉化时不会出错。关于优化脱壳后文件这方面也有相关文章,我就不多说了。改天若有空我会专门写一篇这样的文章,不过不要过于期待,我向来喜欢开空头支票的
如果不会手工优化,可以在脱完壳重建资源后就用汉化工具来汉化,汉化完成后再用 LordPE 这样的工具来优化一下汉化后的程序就可以了。

二、检测程序资源类型。


检测程序资源类型我们同样可以用 PEiD、FI 这样的工具,主要是看程序是用什么开发工具写的。各个开发工具编译出来的程序标准资源类型是不同的。一般可以分以下几种:

1、VC、MASM 这样的开发工具做出来的程序要汉化的标准资源主要在 Menu、Dialog、String 等中。
2、Delphi、C++Builder 这样的 Borland 公司开发工具做出来的东西要汉化的标准资源主要在 Rcdata 和 String 中。
3、VB 开发的程序,这种程序我们一般所说的标准资源是指 Form 中的资源,这种 VB 编的程序目前还没有可以可视化编辑界面资源的工具,相比较而言汉化起来不是很痛快;)

4、上面说的主要是标准资源,再说一下一般定义的非标准资源。非标准资源一般简称为非标,指在程序中出现,但又不在标准资源中的 UNICODE 字串或 ASCII 字串,这类字串汉化需要其他的工具。
判断完程序是什么开发工具做的,我们就对资源类型大致有数了。下面就可以开始着手汉化了。

三、使用合适的汉化工具

这里首先要说明一下,像什么 eXeScope、ResScope、ResHacker、PE Explorer 这样的工具严格来讲都不是汉化工具,只能说是资源修改工具。一般所说的汉化工具是指如 Visual Localize、PASSOLO、Multilizer、Alchemy CATALYST 这样的工具。这些工具都是可以可视化调整调整界面的,不过这些工具都不能用来汉化 VB 编的程序,关于汉化 VB 编的程序要使用其他的工具。现在针对上面所说的资源类型来谈谈工具的选用:
1、VC、MASM 类程序:这种程序可以用上面提到的任何一款汉化工具汉化,就我个人来讲,我比较喜欢用 PASSOLO,Visual Localize 也是个很不错的选择。
   2、Delphi、C++Builder 类程序:这种程序可以使用 PASSOLO、Multilizer 来汉化,一般用 PASSOLO 时应该选择 PASSOLO 的 UNICODE 版本。对这类程序,还可以采用外挂语言包的方式来汉化标准资源。这种外挂语言文件的方法对一些加了猛壳,且又不想脱壳或不好脱壳的程序非常有用。因为 Borland 公司的编译器编译出来的程序默认对语言文件支持,编译好的程序会自动检测是否有语言文件。一般的未加壳的此类程序,要采用语言文件汉化标准资源的话,只需生成对应的语言文件放到原程序目录就可以了。对于加了猛壳的此类程序,如果只是汉化标准资源的话,不需要脱壳,只要用 freeRes 这样的工具释放一下压缩资源,再汉化释放资源后的程序,生成语言文件后放到原程序目录下就可以让主界面显示对应语言了。用 PASSOLO、Multilizer 来汉化这样的程序,还有一些区别的地方:
(1)、PASSOLO,汉化这类程序时选目标为简体中文时默认生成的目标是后缀名为 CHS 的文件。不过生成的文件其实只是改了后缀名的汉化后的 EXE 或 DLL 等可执行文件。这可以预先设置一下目标文件的后缀名,使生成的汉化后的文件后缀名为 EXE 或 DLL 等这样的可执行文件。如果只是想生成语言文件,最好在生成目标文件的高级选项中设置一下,把生成纯资源 DLL 的选项选上,再把汉化生成的CHS文件的和汉化资源无关的项如图标、位图等删掉,减小体积。
(2)、Multilizer,这个工具汉化此类的程序时,默认生成的就是语言文件,要想生成汉化后的可执行文件,要在工程选项中把输出文件中的“已本地化的文件”选项选上。而生成的简体中文语言文件一般也使以 CHS 为后缀名。
   采用语言文件方式汉化的话,只要把汉化完标准资源的语言文件和原程序放在同一目录就可以让主界面显示中文了,不受主程序是否加壳的影响。这里要注意的是语言文件名要与原程序名称一致,如你要汉化 test.exe,语言文件名就要是 test.CHS,同样,你要是把 test.exe 改名为 test1.exe,语言文件名也相应要改为 test1.CHS。
3、VB 类程序:这种程序目前可以用来汉化的工具有 VB 窗体汉化器、GetVBRes、新出的 VBLocalize 等。缺点就是没有可以可视化调整汉化后界面的工具。
4、非标准资源:这类非标资源的汉化主要采用的工具有点睛字符串替换器、CXA、枫叶字符替换器等。主要功能是把原程序需要汉化的非标字串提取出来,汉化完后再写入。汉化非标资源要求程序必须没有加壳,且这个地方汉化不当的话容易让程序出现问题,比如不能汉化的字串汉化了等等这样的情况,会让程序运行出错,也就是常说的汉化过度。所以汉化非标资源时要特别注意,要多测试,防止出现因汉化引起的 bug。

四、汉化标准资源中的字串

一般的汉化工具都支持字典及导入导出功能,字典主要靠自己积累,你汉化的软件越多,生成的字典越多,汉化起其他程序来就越快。因为很多内容都可以直接用字典来汉化完成。如果是汉化一个新的程序,且又没有什么可用的字典怎么办?我一般的做法是采用汉化工具的导出功能,把没翻译的源英文字串直接导出(这里注意如果是用 Multilizer 导出的话,需要把目标翻译语言栏全选,再粘贴原始语言,这样导出的采用 TAB 分隔的 ASCII 文本才好转换为对照文本),再用字典转换工具如 Fantasy Editor 或开心字典转换工具把导出的文件转换为对照文本,这样就可以采用 SeaTools 这样的工具来进行机器翻译,机器翻译完后再进行手工修改,全部翻译好后再用上面说的字典转换工具转换为对应汉化工具的字典文件,现在就可以用这样的字典文件来翻译原程序了。

五、调整界面,设置对话框字体,汉化其他内容

 设置字体一些汉化工具在创建工程时就可以完成,如用 Visual Localize 的话需要在工程中设置一下对话框字体。字串汉化完后要做的工作就是调整界面,因为汉化后有些对话框的字串会显示不全,按钮过大或过小,对话框大小不合适等等都要调整。如果还有什么其他的资源如图片等要汉化的,可以导出后修改了再导入。

六、汉化非标资源中的字串

    标准资源汉化完成后就要开始汉化非标准资源字串了。汉化方法与汉化标准资源类似,用我上面所说的非标资源提取工具先把非标字串提取出来,删除不需要翻译的,再做一下字典转换(对于点睛字符串替换器、CXA 这样的工具,如果有当前汉化的程序以前的非标字串翻译,可以直接作为字典导入),先机器翻译,再手工修改后导入。汉化非标字串如果有经验的话比较好,一般可以看出那些东西是需要翻译的哪些是不需要翻译的,哪些翻译后字串长度比原字串短时补 0 还是空格。如果没什么经验,就要多测试了。
七、汉化后程序测试及字体调整
     这个地方是比较繁琐的,因为汉化后有可能造成程序出错,这里就要重点检测非标部分。另外汉化后有些地方的字体比较难看,这些地方是无法通过在标准资源中设置字体来修改的,这时就要通过调试来设置字体了。设置字体在 OD 中主要断这几个函数:CreateFontA(W)、CreateFontIndirectA(W)、GetStockObject。找到地方再作修改。

     说到这大致差不多了,其他的还有一些非标字串汉化后字串长度超过原字串长度,需挪移修改、汉化后有程序有自校验需去除、字串加密后的汉化等等,我就不再这里说了,大家可以自行参考汉化新世纪的相关文章。此外还有一些图形界面游戏的汉化是不能采取我上面说的这样的方法的,如你要汉化 StarCraft,用我这种方法是不行的。汉化这样的游戏可能要你分析程序,采用外挂方式来汉化,这里不作讨论。

现在的汉化软件和汉化补丁是越来越多了,你肯定也想自己汉化一些软件试试吧。肯定你又会以为这是很麻烦或者很难的事情,只有高手才会做,其实并不是这样,你也完全可以自己汉化一些软件,有些方法还是很简单的,不需要设计到编程的知识。不相信,不相信就听我下面给你介绍三种方法,保证你看完后,你也能汉化一些平常见的软件了。(哎,我把胸口都拍痛了)

  第一种方法:


  直接修改源二进制的代码,不要紧张,也不要被吓倒,很简单的。这里需要用到一个二进制代码查看器,如果你没有,我推荐你用一个名字为Ultra Edit的编辑器,相信你已经用过这个编辑器,(没有用过?没有用过也不要紧,往下看!)这个软件比Windows自带的记事本的功能强大许多,用法上倒没有什么复杂的地方,至于具体好在哪里,我就不说了,呵呵,可以自己看看专门介绍它的软件。比如说,我们要汉化一个英文软件,就比如汉化Turbo C吧,把菜单中的“File”汉化成中文的“文件”。用此编辑器打开TC的可执行文件tc.exe,当然啦,在做这之前,你要先备份好你要操作的文件,免得到时候没有汉化成功,倒弄坏了文件,回不来了。打开以后,就可以看到它的原二进制代码文件。这时候,你选择查找功能。从二进制中查找到“file”,找倒后,将它修改成“文件”,然后关闭,执行这个文件,看看是不是已经汉化了。当然,这次你找到的不一定就是你要汉化的菜单,不一定会成功。这就需要反复实验了。
这类方法比较累,并且也不一定准确。这种方法现在也基本没有人使用了。

  第二种方法:


  这种方法是比较简单的一种,但这种方法只能适用于带有语言选择的软件,这样的软件不是很多,只能是偶尔逮着一个,方法很简单,找到它的语言选择文件夹,里面会有各个语言的选择文件,比如FlashGet的language目录下面有三十几个国家的语言版本。这里面已经有中国的了,假如你想新建一个的话,则也可以用记事本按照它的格式建立一个语言版本。提供给大家的一个思路就是将它的原语言版本复制一个后,用记事本打开,然后按照它的格式修改,将它的内容换成你的内容,注意要一行一行地换,如果你把两行弄到一行去了,这就可能会产生错误了。换完后,你也就已经汉化了这个软件了。
这种方法用途不是很大,一般的多语言版本的程序都有中文的语言版本,不需要你的汉化了。

  第三种方法:


  好的方法当然留在最后讲,这种方法是汉化者们经常用的一种,那就是修改文件的资源文件。我们知道,用VC和DEPHI编译成的软件都有资源文件。高手呢,就是打开VC,直接修改内核,而我们嘛,就不必掌握这些复杂的方法了,这里给大家介绍一个简单的方法,用eXeScope软件修改,特别的简单。(没有听说过?那没有关系,网络学院里面有教程的)像这类的软件还有很多,不过这个历史比较长,使用也非常的简单。就给大家介绍它了。比如我们要汉化OICQ,当然这本来就是中文版了,不需要汉化,没有关系,这里只是给大家演示一下汉化的过程而已。(要详细了解eXeScope,有专门的文章介绍)
  启动eXeScope,选择文件菜单,再选择打开,打开QQ的可执行文件。这时候左边的资源栏目里面就会出现该文件的全部资源,包括什么头部文件,导入的动态连接库,以及它所用到的资源文件。而资源文件,就是我们汉化时要终点修改的内容。从资源中间选择菜单(一般汉化就是汉化菜单和对话框)当菜单栏目展开以后,你可以看到右边的栏目里面有该菜单的全部内容了,这时候,只需要你自己改动就可以了,将各个菜单的名字都改成你所要的名字就可以了,比如说要是“File”,你讲它改成“文件”就可以了。注意的是“&”这个符号,编过程序的人应该知道,这个是不能动的,如果你不知道意思,只要记住,这个符号的意义是:这个符号后面紧跟的字母是这个菜单的快捷键,就像记事本的菜单“文件(F)”那么这个F就是快捷键,最好不要删除掉。比如说有个菜单为:“&Edit”,那么你换的时候,就不能把快捷键去掉,把它写成“(&E)编辑”,就可以了。这是一个要注意的地方。
  汉化还包括汉化对话框,同样从左边资源树中点开对话框,从右边就可以看到各个具体的标签与空间的名称了,只需要将各控件显示的文字改过来就可以了,按下F8键,就可以可视化地进行修改了。将修改后的文件保存就可以了(在编辑菜单中有“保存修改”项)。你运行一下你刚才修改过的文件,可以看到修改后的效果了。
  当然啦,eXeScope的功能远不止这一些,但汉化是非常好的一个功能。*_*

  汉化软件要注意的几点是:
  1. 汉化前的备份,如果失败,还可以还原回来。切记!
  2. 汉化软件的时候,最好就不要做别的事情了,因为我们都是刚学汉化的人,有可能某个错误,而使软件运行后死机,如果你别的文档没有存盘,可不要说我没有预先通知你了。呵呵。
  3. 习惯问题,为了软件的通用性,一般都把“File”汉化成“文件”,把“Edit”汉化成“编辑”,最好遵守一下这个规则。
  4. 软件版权问题,还是尊纪守法的好,打官司了,不要说是我害了你哟。

  希望上面的汉化方法会对大家有一点帮助,谢谢。

转载于:https://www.cnblogs.com/weiqubo/archive/2010/05/18/1929986.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图的DFS深度遍历

最近复习了一下图的内容,记录一下,后续添加详解(无向图的深度遍历) package com.qey.learn;import java.util.ArrayList; import java.util.Arrays;/*** ClassName graph* Description* Author qianxl* Date 2021-03-06 17:18* V…

【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 问题一:构造函数与析构函数可以成为虚函数么? 答案: 1、构造函数不可以成为虚函数 因为在构造函数执行结束后,虚函数表…

网站切图初学

先做一个简单的说明为什么选择Photoshop软件而没有选择Firework软件。Friework Dreamweaver Flash号称网页制作三剑客,Friework与Dreamwaver整合得更为紧密,在这里只所以选择photoshop只是因为我的偏好,况且我对 firework软件使用的次数很少&…

【C++深度剖析教程34】C++中的强制类型转换dynamic_cast

加qq1126137994 微信:liu1126137994 一起学习更多技术!!! C中的继承中,如何使用强制类型转换? 知识点: dynamic_cast是与继承相关的类型转换关键字dynamic_cast要求相关的类中必须有虚函数dy…

main函数的参数的含义

转载自:点击链接 链接2 加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 最近学习服务器网络编程,遇到了一个问题,main函数的参数,特意整理资料记录之!&#…

C#FTP操作

C# FTP操作类 收藏 using System;using System.Collections;using System.IO;using System.Net;using System.Net.Sockets;using System.Text;using System.Text.RegularExpressions; namespace Discuz.Common{ /// <summary> /// FTP类 /// </summary> …

【C++深度剖析教程35】函数模板的概念和意义

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、问题引入&#xff1a; C中有几种变量交换的方法&#xff1f; 定义宏代码块和定义函数 #include <iostream> #include <string>using namespace std;#d…

生产者和消费者

注意&#xff01;&#xff01; notify和wait 使用后续补充 package com.qey.learn;/*** ClassName Water* Description* Author qianxl* Date 2021-03-01 23:09* Version 1.1**/ public class Water {// 服务员来提供产品的输入的输出private int product;public Water(int m…

前端学习(133):雪碧图实现原理

百度词条对雪碧图的解释是&#xff1a;CSS雪碧 即CSS Sprite&#xff0c;也有人叫它CSS精灵&#xff0c;是一种CSS图像合并技术&#xff0c;该方法是将小图标和背景图像合并到一张图片上&#xff0c;然后利用css的背景定位来显示需要显示的图片部分。 举个应用的实例&#xff…

如何在C++中动态分配二维数组

一般是三种方法&#xff1a;(1)用vector的vector&#xff0c;(2)先分配一个指针 数组&#xff0c;然后让里面每一个指针再指向一个数组&#xff0c;这个做法的好处是访问数组元素时比较直观&#xff0c;可以用a[x][y]这样的写法&#xff0c;缺点是它相当于C#中的一个锯齿 数组&…

循环打印ABA问题

注意&#xff01;&#xff01; notify 虚拟锁问题&#xff0c;后续补充 package com.qey.learn;/*** ClassName SwapPrint* Description* Author qianxl* Date 2021-03-02 14:46* Version 1.1**/ public class SwapPrint {public int flag 0;public synchronized void prin…

【C++深度剖析教程36】深入理解函数模板

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、函数模板深入理解 编译器从函数模板通过具体类型产生不同的函数编译器会对函数模板进行两次编译 *对模板进行编译 *对参数替换后的函数进行编译 注意事项&#xf…

【C++深度剖析教程37】类模板的概念和意义

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、类模板 一些类主要用于存储和组织数据元素类中数据的组织方式和数据元素的具体类型无关如 数组类&#xff0c;链表类&#xff0c;stack类&#xff0c;queue类等 C中…

链表中求倒数第几个元素并打印出来

//补充一下 链表的逆序操作 添加到listed 类中public Listed reverse() {Listed head this;Listed p head;// 单个节点的情况if (p.next null) {return p;}// 从第二节点的开始Listed q p;p p.next;q.next null;// 防止自循环// 临界条件while (p ! null) {Listed temp…

【C++深度剖析教程38】类模板深度剖析

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化&#xff1a; 指定类模板的特定实现部分类型参数必须显示指定根据类型参数分开实现类模板…

c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别(转)

C# 集合类 Array Arraylist List Hashtable Dictionary Stack Queue 1.数组是固定大小的&#xff0c;不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小&#xff0c; 但是该方法是重新创建新设置大小的数组&#xff0c;用的是旧数组的元素初始化。随后以前的数组…

dbeaver 连接hbase 数据库

1.安装dbeaver 参考: https://blog.csdn.net/volitationLong/article/details/80583977 安装dbeaver 2.配置hosts 文件 10.21.21.89 nn01.as 10.21.21.94 nn02.as 10.21.21.93 dn01.as 3.配置用户变量 4. 配置hbase 驱动 连接参数 点击“新建连接”按钮 4.1 选择:a…

docker思维导图

之前学习的总结的思维导图&#xff0c;后续持续更新

ODI配置Mysql5.1数据库服务器

场景&#xff1a;服务器端mysql装了是Mysql5.1版本&#xff0c;最开始使用mysql-connector-java-5.0.6-bin.jar 驱动&#xff0c;经测试&#xff0c;无法连接成功&#xff0c;后来再网络上下载了最新的驱动mysql-connector-java-5.1.12-bin.jar 发现还是没法连接成功。最后面使…