如何用简单的方法将一套软件以多种语言发布?(100分)

  • 主题发起人 主题发起人 swpihwd
  • 开始时间 开始时间
S

swpihwd

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用简单的方法将一套软件以多种语言发布?
 
把涉及文字的内容都用常量定义,放到一个单独的文件中,不同版本用不同的文件代替。
如果觉得还是麻烦可以加上编译开关,来导入不同文件
 
从Delphi3开始就支持国际化资源模块.
一、建立相应应用程序、DLL或包的国际化资源模块,具体方法如下:
1、在Delphi中选择File|New菜单,建立新的DLL;
2、仅仅包含已经本地化的资源,比如:MyApp.frm和MyApp.res
{$R MyApp.res}
{$R MyApp.dfm}
3、该DLL文件取名应该与应用程序、DLL或包的名称相同,扩展名取名为当地代码。
当应用程序、DLL或包启动时,会自动寻找[当前目录下]与本地代码相符合的国际化资源模块,如果找不到,才使用应用程序内部的字符串资源。
字符串资源的国际化:
将要国际化的字符串集中到一个单元,使用ResourceString对字符串进行说明:
Unit Msgs;
interface
resourcestring
sInPasswd='Incorrect password';
sTextFileExt='.txt';
sUnableOpen='Unable to open file';
sUnableCreate='Unable to Create file';
sLZRWStreamReadErr = 'Error reading from input stream !';
sLZRWSTREAMWriteErr = 'Error writing to output stream !';
sLZHSizeErr ='Original and compressed sizesdo
not match !';
implementation
end.

然后使用命令行参数:-gd或在项目参数设置中的linker页面上选取request Detailed Map File,它将在编译时产生包含使用ResourceString宣称的所有字符串的资源文件:.DRC。每当你重新编译一次,你就需要重新“翻译”一次文件(.DRC)。
当你翻译完该文件(.DRC)后,使用BRCC32将.DRC文件编译为资源文件(.RES)。最后你就可以将它联接到国际化资源模块:
{$R MyApp.res}
Must like this:
library MyExample;
{$R MyStrings.res} {my strings resource}
{$R MyExample.res} {Delphi Auto gernerate! if have not this,Delphi will overwrite MyStrings.res,this can work now.}
{$R Dlg1.dfm}
{$R Dlg2.dfm}
{$R SplashForm.dfm}
{$R AboutDlg.dfm}
{$R unit1.dfm}
uses
Windows;
{$E chs}
begin
end.

二、动态切换国际化资源模块
你可以在运行时,动态切换语言,首先你应该使用ReInit单元,然后调用LoadNewResourceModule装入新的语言模块,最后重新初始化窗体ReinitializeForms。
例如,以下的代码将语言切换到法语:
const
FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
if LoadNewResourceModule(FRENCH) <> 0 then
ReinitializeForms;
注意:任何改变后的属性在新语言装入后将失去,恢复为默认值。

附录:
当地代码可以使用GetLocaleInfo函数取得,指定第二个参数为LOCALE_SABBREVLANGNAME,程序实例如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
LocaleList: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
function GetLocaleData(ID: LCID;
Flag: DWORD): string;
var
BufSize: Integer;
begin
BufSize := GetLocaleInfo(ID, Flag, nil, 0);
SetLength(Result, BufSize);
GetLocaleinfo(ID, Flag, PChar(Result), BufSize);
SetLength(Result, BufSize - 1);
end;

{ Called for each supported locale. }
function LocalesCallback(Name: PChar): Bool;
stdcall;
var
LCID: Integer;
begin
LCID := StrToInt('$' + Copy(Name, 5, 4));
Form1.LocaleList.Lines.Add(GetLocaleData(LCID, LOCALE_SLANGUAGE)
+':'+GetLocaleData(LCID, LOCALE_SABBREVLANGNAME));
Result := Bool(1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumSystemLocales(@LocalesCallback, LCID_SUPPORTED);{枚举出系统内的所有当地代码}
end;

end.

常用当地代码列表:
巴士克语:euq
加泰隆语:cat
丹麦语:dan
荷兰语(标准):nld
荷兰语(比利时):nlb
英语(美国):enu
英语(英国):eng
英语(澳大利亚):ena
英语(加拿大):enc
英语(新西兰):enz
英语(爱尔兰):eni
芬兰语:fin
法语(标准):fra
法语(比利时):frb
法语(加拿大):frc
法语(瑞士):frs
德语(标准):deu
德语(瑞士):des
德语(奥地利):dea
冰岛语:isl
意大利语(标准):ita
意大利语(瑞士):its
挪威语(伯克梅尔):nor
挪威语(尼诺斯克):non
葡萄牙语(巴西):ptb
葡萄牙语(标准):ptg
西班牙语(传统):esp
西班牙语(墨西哥):esm
西班牙语(现代):esn
瑞典语:sve
南非荷兰语:afk
英语(南非):ens
法语(卢森堡):frl
德语(卢森堡):del
德语(列支敦士登):dec
印度尼西亚语:ind
繁体中文(台湾):
简体中文(中国):chs
 
INI文件!
[Default]
Language=GB
[GB]
1=确定
2=取消
[English]
1=Ok
2=Cancel
......
程序中涉及文字的地方都用变量,读取INI文件后设置这些变量,可以做到适时语言切换.
 
后退
顶部