如何用资源文件开发多语言软件(100分)

  • 主题发起人 主题发起人 GaryLou
  • 开始时间 开始时间
G

GaryLou

Unregistered / Unconfirmed
GUEST, unregistred user!
在Windows 中可利用 Resource File (.res) 进行多语言版本的编程,
但不知如何用,还望指教.
 
我在Visual C++里面倒是这样用过,方法是把资源部分单独制作DLL,
程序启动的时候可以让用户选择所使用的DLL, 就行了
 
Delphi好像在这方面支持的不太好,不过如果您用的所有字符串都用Win32API
的LoadString来获得的话,你还是可以借助别的工具来制作您的特定语言的Resource DLL,
在Delphi中支持多语言。
 
有专门做多语言界面的VCL呀!
干吗这么费事
去www.torry.ru搞一个吧
 
这么好?怎么个用法的?
 
多做几个dll,动态loadlibrary...应该可行,不过没做过。
 
有没有具体做法
 
某些字符集的字符和中文WINDOWS冲突怎么办?
 
我问过一个类似的问题:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=108999
help 里面有提到 Resource Dll作International Application,并且提到了
Danymic switching of resource DLLs
 
???
干吗不去下一个VCL试试??
难道自己懒得找???
呜,算了,我帮你找吧!:~(
http://www.torry.ru/vcl/vcltools/sicompd4.zip
还有这个:
http://www.torry.ru/vcl/vcltools/kml4.exe
 
delphi5中已经内置了专门的设置(想不出更好的说法)
选File->New->Resource DLL Wizard即可
她会生成一个和你原来程序完全一样的project,
放在china(中文)...目录下
你的工作就是针对性的翻译一下,编译一下,会自动生成???.chs(或其他国家)
的连接库
然后拷贝到你的可执行文件可以查到的的目录下
启动时,你的程序会自动判别是不是处于中文环境下,然后启动正确的语言版本
 
我也感兴趣,知道的朋友发一份说明给我吧!
 
从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
 
实际上在Delphi3和delphi4中,你还必须手动编写以上代码,但是在Cb3,cb4,delphi5中,这些已经不需要你自己动手了,你要做的只是new一个Resource DLL Wizard,她会自动生成所需的代码,你唯一要做的工作就是翻译,工作量大大的减小了
 
在Delphi3和delphi4中唯一要做的工作就是将翻译后的窗体和字符串资源链接进来,
很方便,如上面我提到的那样:
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}
前次的文章是我在作多国语言应用程序的工作小结,主要是供自己以后忘记时,
快速参考(一般来说我记得很少),因此,写得不清楚的地方,请原谅:-).
 
加分鼓励!
赶快用 Delphi 5 出个中文版的 Delphi 6 验证验证, :)
 
没想到在这儿有知音
 
多人接受答案了。
 
后退
顶部