我需要翻译其他语言的程序,实际上我有3种语言(英语,西班牙语,葡萄牙语)相同的程序,但我翻译,重新编译,我有3个单独的可执行文件。添加更多语言,保持链接,添加新功能让我发疯。
所以现在我决定保留一个可执行文件和一个外部语言文件,所以添加新语言不需要重新编译,只需用文本编辑器编辑语言文件,一切正常。
我想将所有语言保存在一个外部文件中。比如international.lang
[portuguese]
greeting="Bem-vindo"
[spanish]
greeting="Ben venido"
如果文件international.lang
不存在,或者您的语言不在文件中,默认情况下程序将以英文启动,没有错误。就像大多数基于资源的多语言程序一样。
所以问题是,如何在delphi中检测Windows语言? 对我的方法有什么想法吗? 有没有办法以编程方式替换对话框上的所有字幕?
ps:我正在使用delphi7,我找不到任何免费的组件。
答案 0 :(得分:9)
您可以使用GetSystemDefaultLCID
函数获取区域设置标识符,然后使用VerLanguageName
函数来解析与语言相关的名称。或使用GetLocaleInfo
功能
检查此样本
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
procedure Test_VerLanguageName;
var
wLang : LangID;
szLang: Array [0..254] of Char;
begin
wLang := GetSystemDefaultLCID;
VerLanguageName(wLang, szLang, SizeOf(szLang));
Writeln(szLang);
end;
procedure Test_GetLocaleInfo;
var
Buffer : PChar;
Size : integer;
begin
Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, nil, 0);
GetMem(Buffer, Size);
try
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, Buffer, Size);
Writeln(Buffer);
finally
FreeMem(Buffer);
end;
end;
begin
try
Test_VerLanguageName;
Test_GetLocaleInfo;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
注意:从Windows Vista开始,存在用于获取相同区域设置信息的新功能,请检查这些功能GetLocaleInfoEx,GetUserDefaultLocaleName和GetSystemDefaultLocaleName
答案 1 :(得分:0)
我有同样的问题,虽然我只需要处理两种语言:英语(默认)和波兰语。 我尝试了上面列出的所有解决方案,但没有一个能够正常工作。我正在更改系统设置,重新启动等,并始终接收语言英语。 切换到波兰语时,一切都以波兰语显示,所有波兰语语言环境都已设置,但我的应用程序正在接收英语作为操作系统语言。经过多次尝试后,我遇到了非常简单可靠的解决方法(我不称之为解决方案),如果你不得不处理少量语言,那就很好了。 因此,诀窍是检查TLanguages返回语言列表的语言。
function GetLang: Integer; //lcid
const
lcidEnglish = $9;
lcidPolish = $415;
var Idx: Integer;
begin
Result := Languages.IndexOf(lcidPolish);
if (Result > 0) and
(Languages.Name[Result].StartsWith('Polski', True)) //'Polski'is the Polish name of the language
then Result := lcidPolish
else Result := lcidEnglish;
end;
您可以为三种语言执行相同的操作。 希望它有所帮助。