英文、中文的就不浪费大家的时间了,我的问题是关于西欧字符的。一个丹麦人帮忙把软件界面翻译成了丹麦文的,结果后来他说界面有乱码,凡是北欧字符都是乱码,并截图给我看,弄得我莫名其妙,我不明白怎么北欧的WinXP竟然可以显示非Unicode的双字节?我昏!http://cn.textrush.com/image/messy.jpg经仔细询问,他说对话框、按钮、工具条按钮甚至菜单的Hint都没有乱码,西欧、北欧字符都显示正常,单单菜单中的凡是ASCII码在127以后的欧洲字符全部是双字节乱码。而且他说Ini文件里面一切正常,但显示在菜单就有双字节乱码!我明白简体中文操作系统上显示欧洲字符是有乱码,但我没想到简单的Ini格式的语言文件在他们的机器上显示会有乱码,而且仅仅只是菜单,其它的都正常!今天通过一个欧洲华侨的法文WinXP也确认了法文也有类似的问题。; 法文Ini文件的示例
[Menu]
DeleteBackupMenu.Caption=Supprimer les Fichiers Sauvegard閟
DeleteBackupMenu.Hint=Supprimer les fichiers format閟 sauvegard閟
SplitMenu.Caption=Exporter vers Fen阾re Coup閑
SplitMenu.Hint=Exporter code-source format?ver fen阾re coup閑{ 我的语言转换过程 }
procedure TMainForm.SetActiveLanguage(LangName: string);
var
Cmp: TComponent;
i: Integer;
Fn: string;
Ini: TIniFile;
begin { Set language }
//Get the path of language file
Fn := ExtractFilePath(Application.ExeName) + 'Language\sf' + LangName + '.ini';
if FileExists(Fn) then
begin
Ini := TIniFile.Create(Fn);
try
with Ini do
begin
for i := 0 to ComponentCount - 1 do //Loop all
begin
Cmp := Components[i];
if Cmp is TMenuItem then
begin
(Cmp as TMenuItem).Caption := ReadString(sfMenu, Cmp.Name + '.Caption',
(Cmp as TMenuItem).Caption);
(Cmp as TMenuItem).Hint := ReadString(sfMenu, Cmp.Name + '.Hint',
(Cmp as TMenuItem).Hint);
end;
if Cmp is TToolButton then
begin
(Cmp as TToolButton).Hint := ReadString(sfTool, Cmp.Name + '.Hint',
(Cmp as TToolButton).Hint);
end;
end;
end;
finally
FreeAndNil(Ini);
end;
end;
end;另外主Form的Charset是默认的DEFAULT_CHARSET。期盼得道高人拯救小弟于水深火热之中,感激涕零!!!
[Menu]
DeleteBackupMenu.Caption=Supprimer les Fichiers Sauvegard閟
DeleteBackupMenu.Hint=Supprimer les fichiers format閟 sauvegard閟
SplitMenu.Caption=Exporter vers Fen阾re Coup閑
SplitMenu.Hint=Exporter code-source format?ver fen阾re coup閑{ 我的语言转换过程 }
procedure TMainForm.SetActiveLanguage(LangName: string);
var
Cmp: TComponent;
i: Integer;
Fn: string;
Ini: TIniFile;
begin { Set language }
//Get the path of language file
Fn := ExtractFilePath(Application.ExeName) + 'Language\sf' + LangName + '.ini';
if FileExists(Fn) then
begin
Ini := TIniFile.Create(Fn);
try
with Ini do
begin
for i := 0 to ComponentCount - 1 do //Loop all
begin
Cmp := Components[i];
if Cmp is TMenuItem then
begin
(Cmp as TMenuItem).Caption := ReadString(sfMenu, Cmp.Name + '.Caption',
(Cmp as TMenuItem).Caption);
(Cmp as TMenuItem).Hint := ReadString(sfMenu, Cmp.Name + '.Hint',
(Cmp as TMenuItem).Hint);
end;
if Cmp is TToolButton then
begin
(Cmp as TToolButton).Hint := ReadString(sfTool, Cmp.Name + '.Hint',
(Cmp as TToolButton).Hint);
end;
end;
end;
finally
FreeAndNil(Ini);
end;
end;
end;另外主Form的Charset是默认的DEFAULT_CHARSET。期盼得道高人拯救小弟于水深火热之中,感激涕零!!!
解决方案 »
- delphi7有widechar,为何说不支持unicode?
- 关于Delphi如何读取.txt文件内容。。。。。。。
- 请教大家在SQL中的日期处理问题,在人事表怎样用SQL语句更新全部员工的的工龄和年龄?
- 大家是用自动编号,还是自己写函数生成啊?》
- 问个简单问题,DBGRID里面要显示两个字段,我是不是需要先在DBGRID上写上姓名,年龄,但这样我的SQL出来的数据显示不出来
- 怎樣捕捉在dos窗口里的内容信息并加以顯示
- 关于USB红外红设备的通讯问题
- Delphi中有象SQL的in用法吗?
- 淡水河给分了
- 急!进去再说
- 急,一个数据库方面的小问题!
- 大家帮我优化一下这段代码呀,关于TTreeView的
但真正支持多語言, 我想還是要用到unicode!http://borland.mblogger.cn/aiirii/posts/1624.aspx
最好保存成unicode,程序调用的时候,再转换。
# 回复: Delphi下实现UniCode 2004-5-31 12:31 Ryo
menu还是显示乱码 # 回复: Delphi下实现UniCode 2004-7-4 23:35 amai
但是在ListView中只能显示列为多语言,item显示不出,请问是为何 洋人就是打开Ini文件里面都没有双字节乱码,对话框,按钮也没有,但是软件菜单有乱码。而奇怪的是用的是同一个方法...Okay,我试试把,把Ini转换成Unicode试试。感激列位老大!
然后再打开翻译的那个语言,写到ini 中保存之,如果看到的不是乱码就没的问题。我做过多语言的帮助,还要公司的软件是多语言实现。一般好像这样解决。你试试?!
应该是不会有乱码的。
如你這麼說, 應該是INI在保存的問題了! 而不是控件顯示的問題!
如果方便, 應該在相應的語言操作系統中, 重新寫一次正确字符!我感覺不用再關注控件了, 要檢查 ini 保存的文字是否正确編碼,
讀取的過程有沒有問題!
如不行, 試下 widestring 呢???
因为XP/2003是多国语言支持的建议不要用Default Language,直接指定为法语,这样尝试看看效果如何起码Ini中的内容要能显示正确,否则都是百搭的
用NotePad打开看没问题才行
var
FNonCLientMetrics: TNonCLientMetrics;
begin
FNonCLientMetrics.cbSize := Sizeof(TNonCLientMetrics);
if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @FNonCLientMetrics,0) then
begin
Font.Handle := CreateFontIndirect(FNonCLientMetrics.lfMenuFont);
Font.Color := clMenuText; //if Font.Name = 'MS Sans Serif' then
//begin
// Font.Name := 'Tahoma';
// Font.Charset := DEFAULT_CHARSET;
//end; end;
end;我觉得你有必要自己修改一下这个函数。
{$DEFINE VER5U}
{$ENDIF}constructor TXPMenu.Create(AOwner: TComponent);
begin
{$IFDEF VER5U}
FFont.Assign(Screen.MenuFont);
{$ELSE}
GetSystemMenuFont(FFont);
{$ENDIF}
end;处获得字体属性,不论是否是Delphi5,得到的默认字体都是"宋体" 9号,默认Charset也成为GB2312_CHARSET了,而无论你主Form的字体是什么,ParentFont根本不起作用。手动改XPMenu Font属性为Font.Name := 'MS Sans Serif';
Font.Size := 8;
DEFAULT_CHARSET后问题消失。在法文和丹麦文WinXP上反复折磨都没有再出现乱码。之所以会在欧洲Windows上显示双字节,我想是欧洲版的XP至少带有一个双字节的字体,为Unicode服务。当Charset为GB2312_CHARSET时且宋体不存在时显示。否则无法解释欧洲Windows上出现双字节的问题。所以以后大家用XPMenu做多语言要小心。切换语言时必需用代码设置XPMenu的字体属性或者干脆运行时即时创建一个XPMenu控件。还有一个问题,TIniFile类在Win9x下无法访问超过64K的Ini文件,大家有什么比较简单的办法吗?
http://www.tonixsoft.com/index.php?mmenu_id=0003
和:
http://www.tonixsoft.com/phpbb2/viewforum.php?f=2&sid=c8b6b6c27ed54dc2a680e060d36d880d