顶者有分——关于DELPHI程序多语言支持的问题(300分)(300分)

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

guanyue7613

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,
你们写DELPHI程序,是如何实现繁体化的?是如何开发英文版的?是通过外挂语言包吗?
我完整地说一下我的问题:
我写一个DELPHI程序,开发环境是是简体中文版本win xp系统+ Delphi 7的。现在想做一个繁体版本以及其他非简体中文版本的出来。此时遇到这几个问题:
1、在非简体中文系统中均出现乱码或界面文字错位。
2、而且语言包速度太慢了,每次启动要预读一下语言文件进行界面翻译,工程量大的时候明显感到启动速度下降了
3、因为工程量比较大,逐一设置“提示内容”及“界面内容”的语言包比较麻烦,所以不想用ini文件或dll资源库的语言包形式
请问各位DELPHI高手你们是怎么做的?有没有一劳永逸的方法?
听说DELPHI内置的多国语言功能, 有没有用法帮助?
还有没有其他一些好用简单强大的Unicode语言包控件?
顶者有分!
 
ini和dll应该是常用的.
或者就每种语言编译一个..
Unicode用tnt?
delphi内置的好像也是用DLL的吧.
 
那就找个多语言包的控件吧。盒子上就有。
 
Delphi内置的多语言也应该是在程序里嵌入字符串资源的办法实现的吧。
 
xiaope,
Delphi内置的多语言怎么使用?
 
iamsk
多语言包的控件?是免费开源的吗?有什么好推荐的?
我们的是商业软件,一般避免使用非授权、不稳定控件的
 
Delphi的多语言是这么用的,但是添加多语言后编译连接速度很慢,有时候10来分钟。
可以把你的Delphi的窗体文件分给翻译来翻译,如果是Delphi7,需要先用Conver.exe来转换为文本格式。
1、Project-New Application 创建你的中文版软件。
2、Project-Language-Add 添加你的语言,比如美国英语(ENU)。或者File-New-Others-Dll Wizard
3、保存后生成多个文件夹。
4、Project-Build All
5、程序目录下生成和工程文件同名的语言文件:MyExe.ENU;MyExe.CHN,软件发布需要带这些文件。
6、把软件里面所有字符串定义为资源字符串。
resourcestring
C_AppTitle = 'xx管理系统';
C_Error = '错误';
C_Warning = '警告';
7、在软件中用如下代码切换语言:
const
//定义你得多语言:
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;
uses
ReInit;
...
if LoadNewResourceModule(ENGLISH) <> 0 then
begin
ReInitializeForms();
end;

更多请参考Delphi帮助,里面写得更清楚。
我以前也用INI文件做多语言,感觉挺好用,Delphi带得这个多语言感觉编译起来太慢,而且总需要Build半天。
 
各位,还有其他的思路吗?
 
中文简体环境开发的EXE 到英文系统下 只要修改电脑设置,就可以了。但到繁体环境下,不行。
 
软件肯定是不能对用户电脑设置做修改的
 
可以参考cnpack里面的多语言,是开源的。
 
man8888的方法应该可行。
 
man8888的方法编译起来太慢,对于维护和升级不方便啊
 
Delphi自己提供了一个demo,有具体的使用方法。但是对于动态载入的DLL 内部的资源,我还没找到好办法解决。 另外,编译速度应该没有man8888说的那样慢,要看工程大小的吧,可能我的工程不够大,速度还可以接受哈。
Cnpack有个多国语言包,还可以。因为保存的语言文件是文本,没有加密功能,所以About里的内容也暴露给用户,等Cnpack解决了这个问题我就准备用啦[:D]
我以前发过一个这样的帖子来征求答案,也没得到满意的答案
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3862206
 
[red]{******************************************************************
用资源文件实现多语言界面的源码。
*******************************************************************}
{******************************************************************
第一步建立并维护一个语言字符串资源文件(*.rc/*.res)。
因每一个exe文件只能有一个字符串资源,所以定义多语言界面的字符串。
就必须定义一个规则。如中文语言ID从1000 ~ 1999,英文语言ID从2000 ~
2999,……等等。之后只须在程序里定义一个变量,这个变量保存语言的基础
ID,如1000、2000、3000、……等等。就可以在程序里实现只需变更这个变量
的基ID,就实现更改程序语言界面。如下面的例子
*******************************************************************}
{******************************************************************
第一步,建立字符串资源。
*******************************************************************}[/red]
STRINGTABLE
begin
[red]// 我这里定义的规则是,菜单基ID是1000 ~ 1999则是中文ID
// 2000 ~ 2999则是英文ID。[/red]
1001 "文件(&amp;F)"
1002 "编辑(&amp;E)"
1003 "选项(&amp;O)"
1004 "帮助(&amp;H)"
1011 "新建(&amp;N)/tCtrl+N"
1012 "-"
1013 "退出(&amp;X)/tAlt+F4"
1021 "撤消(&amp;U)/tCtrl+Z"
1022 "-"
1023 "剪切(&amp;T)/tCtrl+X"
1024 "复制(&amp;C)/tCtrl+C"
1025 "粘贴(&amp;P)/tCtrl+V"
1026 "删除(&amp;D)/tDel"
1031 "设置(&amp;S)..."
1041 "关于(&amp;A)..."
[red]{******************************************************************
这里就是开始定义英语资源ID,注意,除了ID是从2000开始的和中文ID是从1000
开始的不同之外,后面的数值顺序必须和中文ID定义的一样才行。如中文1001是"文件",
则,英语的2001也必须是同样的"File",其它语言的也类似这样定义。
*******************************************************************}[/red]
2001 "&amp;File"
2002 "&amp;Edit"
2003 "&amp;Option"
2004 "Help"
2011 "&amp;New/tCtrl+N"
2012 "-"
2013 "E&amp;xit/tAlt+F4"
2021 "&amp;Undo/tCtrl+Z"
2022 "-"
2023 "Cu&amp;t/tCtrl+X"
2024 "&amp;Copy/tCtrl+C"
2025 "&amp;Paste/tCtrl+V"
2026 "&amp;Del/tDel"
2031 "&amp;Setup..."
2041 "&amp;About..."
END
[red]{******************************************************************
上面的资源文件内容放到一个*.rc文件,然后只须在Cmd命令行上用Delphi的
brcc32.exe编译就可以生成一个*.res文件。命令格式如下:
[blue]brcc32 *.rc[/blue]
*******************************************************************}[/red]
[red]{******************************************************************
下面是Demo演示代码。下面的程序一个菜单、一个ComBoBox控件,其中菜单控
件的菜单项必须先准备好四个菜单项[文件、编辑、选项、帮助],其中[文件]菜单
三个子项[新建、'-'、退出],[编辑]菜单有六个子项[撤消、'-'、剪切、复制、
粘贴、删除]、[选项]菜单有一个子项[设置],[帮助]菜单也一个子项[关于]。
上面的菜单项都是对应前面的字符串资源而设置的。
*******************************************************************}[/red]
var
Form1: TForm1;
LangBaseID:Integer;
[red]// 定义一个语言基ID变量[/red]
implementation
{$R *.dfm}
[red]// 在这里用编译指令将你的*.res资源选入程序中[/red]
[blue]{$R ResName.res}[/blue]
[red]// 写一个获取资源字符串的函数,uID参数是资源字符串的ID值(如1001等)
// 函数成功,则返回对应ID的字符串[/red]
function GetStrings(uID:Integer):String;
var c:array[0..256] of Char;
begin
FillChar(c,sizeof(c),#0);
LoadString(hInstance, uID, c, sizeof(c));
Result := String(c);
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
var i,j,k:Integer;
begin
[red] // 这里开始更改程序语言界面[/red]
if ComBoBox1.ItemIndex = 0 then
Exit
else
if ComBoBox1.ItemIndex = 1 then
LangBaseID := 1000 [red]// 如果选择中文,则将ID基值设为1000[/red]
else
if ComBoBox1.ItemIndex = 2 then
LangBaseID := 2000;
[red]// 如果选择了英文,则将ID基值设为2000[/red]
k := 10;
[red] // 在这里,只须一个循环,就可以实现更换程序语言界面了。[/red]
For i := 0 to MainMenu1.Items.Count - 1do
begin
MainMenu1.Items.Items.Caption := GetStrings(LangBaseID + i + 1);
for j := 0 to MainMenu1.Items.Items.Count - 1do
begin
MainMenu1.Items.Items.Items[j].Caption := GetStrings(LangBaseID+j+k+1);
end;
k := k + 10;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
[red] // 初始化ComBoBox控件,因中文语言基ID是1000,所以将中文语言项放到第一行,英文的放到第二行。[/red]
ComBoBox1.Items.Add('请选择窗口语言界面!');
ComBoBox1.Items.Add('中文语言窗口界面');
ComBoBox1.Items.Add('英文语言窗口界面');
ComboBox1.ItemIndex := 0;
end;

end.
 
楼上的,这样做相当的不直观,并且很麻烦,稍微改动一个资源就很容易出错啊。
 
可以使用TsiLang控件,简,繁,英没有问题
 
现在有朋友推荐使用无源码的TMS Unicode Component Pack 控件,有朋友使用过这个东东吗?稳定性如何?跟其他控件的兼容性如何?
 
哈哈,我自己做了一個類,還不錯
 
使用TsiLang控件,产品已经在国外客户使用2年以上
 
顶部