编程技术、软件应用与系统模拟

(Programming, Applicaiton and Simulation)



本站目录

 

首页
ASP/Access/IIS
DELPHI/PASCAL
PASCAL高级编程
C语言编程实例
WORD
Excel
MATLAB
MINITAB讲座
Windows
DOS
SAS
生物系统模拟
土壤水分剖析器
其他



镜像站点

 

主站
北美镜象站
欧洲镜象站(1)
欧洲镜象站(2)

本站 Google

[搜索]  [站内导航]
座右铭:
只做有益人类的事
不做有害人类的事


Windows软件汉化的方法

董占山

    目前方正集团新天地电子信息研究所推出了Windows的中文平台中文之星2.0,&127;随系统提供了一个动态翻译程序MAID,该程序可在系统内存中对Windows应用软件的界面进行汉化,而且只在应用软件运行时,才对其提示信息进行汉化,&127;当汉化信息得不到用户的满意时,还可以随时进行修改,修改后内容单独存盘,不修改应用软件本身。通过MAID汉化的软件,既可在中文环境下使用中文提示,也可在西文环境下使用西文提示,使这些软件的使用更方便更有效。另外使用动态翻译器汉化软件,不需要特别的技术,只要在中文平台下,把西文提示信息翻译成中文即可。下面介绍使用Maid汉化Windows软件的具体方法。

一、西文信息的自动提取

  首先执行待汉化的程序,然后切换到程序管理器,执行动态翻译程序,&127;在屏幕上出现一个动态翻译器的对话窗口,选择“自动翻译”,切换到待汉化的程序,&127;依次将该程序的所有功能(菜单项、对话框等)执行一遍,这样该程序所有西文提示即自动被Maid提取出来,并根据Maid的主要字典尽可能地进行了汉化,并写入了一个与程序同名而扩展名为.DAT&127;的数据文件,至此,待汉化程序的西文提示即全部提取出来了。

二、提示信息的完全汉化

    逐条检查并翻译西文提示信息的方法有二,即应用MAID&127;程序提供的修改分支字典功能和使用直接编辑西文提示的方法。

1.使用MAID程序的修改分支字典功能

    激活Maid程序,选择修改“分支字典”功能,这时出现一个放大镜光标,&127;将此光标移动到待汉化程序主窗口的标题上,点按鼠标左键,即出现一个对话框。&127;用鼠标移动西文信息列表窗的滚动条,逐条检查西文提示的中文翻译信息,&127;如果翻译的不恰当或没有翻译,把光标移到定义窗口,输入正确的中文信息,用光标点按“确认修改”钮,&127;修改即有效。重复上述过程,直到将全部信息正确翻译完为止。

2.直接编辑提取的西文提示信息

    要直接编辑Maid提取的西文提示信息,首先必须了解MAID&127;程序的“分支字典”文件的数据结构,然后把“分支字典”数据文件解译为可阅读的文本,&127;调用合适的编辑器对提取的信息进行编辑。
    “分支字典”数据文件的结构下图。1-19字节为程序的标志信息,20-23字节为字典锁定开关,24字节为文件头结束标志,接着是字典的正文,其中“:”为提示信息串的分界符,“{”为提示信息串中的中文与英文的分界符,字典正文的每一个字节的ASCII码值加1就可得到字典的明文,可以用编辑器进行编辑修改。

         标志信息     字典锁定开关    文件头结束标志      字典正文

XXXX:0100  53 75 6E 54 65 6E 64 79-20 44 69 63 74 69 6F 6E   SunTendy Diction
XXXX:0110  61 72 79 30 30 30 31 1A-4C 6E 75 64 7B D1 C5 B5    ary0001.Lnud{...
XXXX:0120  AE 3A 42 6B 6E 72 64 08-40 6B 73 2A 45 33 7B B8    .:Bknrd.@ks*E3{.
XXXX:0130  D7 B0 D4 08 1F 40 6B 73-2A 45 33 3A 55 68 64 76    .....@ks*E3:Uhdv
XXXX:0140  7B E3 AE BF BF 3A 4E 6A-7B C7 B6 B5 A7 3A 42 60    {....:Nj{....:B`
XXXX:0150  6D 62 64 6B 7B C7 A0 CE-FA 3A 44 63 68 73 7B B0    mbdk{....:Dchs{.
XXXX:0160  DF BB AC 3A 52 6E 74 71-62 64 1F 45 68 6B 64 7B    ...:Rntqbd.Ehkd{
XXXX:0170  D3 B3 CD C3 BB FD 3A 45-68 6B 64 6D 60 6C 64 39    ......:Ehkdm`ld9
XXXX:0180  7B CD C3 BB FD C2 FA 39-3A 43 68 71 64 62 73 6E    {......9:Chqdbsn
XXXX:0190  71 78 39 7B C3 BE C1 BB-39 3A 45 68 6B 64 72 39    qx9{....9:Ehkdr9
XXXX:01A0  7B CD C3 BB FD 39 3A 43-68 71 64 62 73 6E 71 68    {....9:Chqdbsnqh
XXXX:01B0  64 72 39 7B C3 BE C1 BB-39 3A                      dr9{....9:

    了解了“分支字典”的结构,就可以用程序将字典的密文翻译为明文,&127;而后用编辑器对明文进行编辑,把西文提示翻译为正确的中文,&127;之后再用程序把编辑好的明文翻译为密文,写入原来的“分支字典”,这样就实现了字典的直接编辑工作。我用BORLAND &127;PASCAL7.0编写了一个可完成字典正文的密文和明文互译的程序TENG.PAS,该程序在BPW&127;下编译并与TENG.RES的资源文件连接,生成在Windows下运行的执行程序,即可使用。TENG.&127;PAS&127;和TENG.RC清单附后。

三、使用汉化的Windows软件

    启动Windows之后,先执行中文之星2.0,而后执行MAID,选择自动翻译,&127;之后执行汉化了的Windows应用程序,其软件界面即是完全汉化的信息,包括菜单和对话框的提示信息。当不需要中文提示时,先关闭动态翻译器的自动翻译功能,然后退出应用程序,&127;再重新执行程序即可再现西文软件的本来面目。
    如果一个程序汉化完成之后,只需要把CSTAR20(中文之星所在目录)与该程序名相同以.DAT为扩展名的的汉化信息文件拷贝到其他机器的CSTAR20子目录下,&127;就可以共享软件的汉化成果,这种方法即简单又省时。

四、结语

    中文之星2.0是Windows下的一个优秀的中文平台,为Windows的本地化提拱了良好的支持,尤其是它提供的众多的工具软件更是锦上添花,给中国广大计算机用户带来了福音。
  &127; &127; &127;用本文提供的方法汉化西文软件,&127;不需要学习高深的软件汉化技术,&127;也可以不懂Windows程序设计,就可以得到高质量的中文Windows软件,且完全不存在软件的版权问题。愿广大Windows用户能够尽早圆Windows软件的汉化梦。

程序清单:
program Translator;

{$C Moveable, Preload, Permanent }

uses WinTypes, OWindows, ODialogs,
     ShellApi, OStdDlgs, WinDos, Strings;

{$R Teng.res}  { 包含资源文件 }

const
   CRLF : array[0..1] of char = #$0d#$0a; { 回车换行符 }
   AppName     = 'Translator';             { 该程序名 }
   ID_FileName = 101;                      { 以下三个常量为资源标识符 }
   ID_View     = 102;
   ID_Edit     = 105;

type
  PTEngApp = ^TTEngApp;             { 应用程序对象 }
  TTEngApp = object(TApplication)
    procedure InitMainWindow; virtual;
  end;

  PTEngWindow = ^TTEngWindow;      { 主窗口对象 }
  TTEngWindow = object(TDlgWindow)
    MyEdit : PEdit;
    AFileName : array[0..fsPathName] of char;
    TempFile : array[0..fsPathName] of char;
    HeadString : array[0..24] of char;
    Editfile : boolean;
    constructor Init;
    function GetClassName : PChar; virtual;
    procedure Edit(var Msg : TMessage); virtual ID_FIRST + ID_Edit;
    procedure View(var Msg : TMessage); virtual ID_FIRST + ID_View;
    procedure OK(var Msg : TMessage); virtual ID_FIRST + ID_Ok;
    procedure SaveFile;
end;

constructor TTEngWindow.init;
begin
  TDlgWindow.init(nil,AppName);
  MyEdit := new(PEdit,initResource(@Self,id_FileName,StrLen(AFileName)));
  Editfile := False;
end;

function TTEngWindow.GetClassName;
begin
  GetClassName := AppName;
end;

procedure TTEngWindow.View(var Msg : TMessage);
begin
  if Application^.ExecDialog(new(PFileDialog,
     init(@Self,PChar(sd_FileOpen),StrCopy(AFileName,'*.dat'))))
     = ID_OK then
  begin
  MyEdit^.SetText(AFileName)
  end;
end;

procedure TTEngWindow.SaveFile;
var FB1,FB2 : file;
    ch : char;
begin
  if EditFile then
    begin
    assign(FB1,TempFile);
    reset(FB1,1);
    assign(FB2,AFileName);
    rewrite(FB2,1);
    BlockWrite(FB2,HeadString,24);
    repeat
    blockread(FB1,ch,1);
    if not ((ch = #$0d) or (ch = #$0a)) then
      begin
      ch := char(ord(ch)-1);
      blockwrite(FB2,ch,1);
      end;
    until eof(FB1);
    close(FB1);
    close(FB2);
    erase(FB1);
    end;
end;

procedure TTEngWindow.Ok(var Msg : TMessage);
begin
  if EditFile then SaveFile;
  inherited ok(Msg);
end;

procedure TTEngWindow.Edit(var Msg : TMessage);
var FB1,FB2 : file;
    ch : char;
    Path: array[0..fsPathName] of Char;
    Dir:  array[0..fsDirectory] of Char;
    Name: array[0..fsFileName] of Char;
    Ext:  array[0..fsExtension] of Char;
begin
  StrPCopy(PATH,AFileName);
  FileSplit(PATH,dir,name,ext);
  assign(FB1,PATH);
  reset(FB1,1);
  StrCat(StrCopy(Tempfile,name),'.$$$');
  assign(FB2,TempFile);
  rewrite(FB2,1);
  blockread(FB1,HeadString,24);
  repeat
    blockread(FB1,ch,1);
    ch := char(ord(ch)+1);
    blockwrite(FB2,ch,1);
    if ch = ';' then blockwrite(FB2,crlf,2);
  until eof(FB1);
  close(FB1);
  close(FB2);
  ShellExecute(HWindow, nil, 'c:\windows\NotePad.exe',TempFile,'.\',sw_Show);
  EditFile := True;
end;

{ memnber mothods of TTEngApp }

procedure TTEngApp.InitMainWindow;
begin
  MainWindow := new(PTEngWindow,init);
end;

var TEngApp : TTEngApp;

begin
  TengApp.init(AppName);
  TEngApp.Run;
  TEngApp.Done;
end.

资源文件:

TRANSLATOR DIALOG 8, 41, 183, 53
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Translator"
BEGIN
  CONTROL "", 101, "EDIT", ES_LEFT | ES_UPPERCASE |&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_BORDER | WS_TABSTOP, 56, 8, 113, 12
  CONTROL "View", 102, "BUTTON",&127; &127;BS_PUSHBUTTON &127;|&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_TABSTOP, 13, 29, 33, 14
  CONTROL "Ok", 1, &127;"BUTTON",&127; &127;BS_DEFPUSHBUTTON &127;|&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_TABSTOP, 55, 29, 33, 14
  CONTROL "Cancel", 2, "BUTTON",&127; &127;BS_PUSHBUTTON &127;|&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_TABSTOP, 97, 29, 33, 14
  CONTROL "Edit", 105, "BUTTON",&127; &127;BS_PUSHBUTTON &127;|&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_TABSTOP, 139, 29, 33, 14
  CONTROL "Source File", -1, "STATIC", SS_CENTER &127;|&127; &127;WS_CHILD &127;|&127; &127;WS_VISIBLE &127;|WS_GROUP, 14, 10, 39, 8
END


© 1998-, 董占山, 版权所有。
转载文章请注明出处(www.sunfinedata.com/articles)。