如何在delphi中检测多语言项目的系统语言?

时间:2011-11-26 15:43:13

标签: delphi translation locale multilingual

我需要翻译其他语言的程序,实际上我有3种语言(英语,西班牙语,葡萄牙语)相同的程序,但我翻译,重新编译,我有3个单独的可执行文件。添加更多语言,保持链接,添加新功能让我发疯。

所以现在我决定保留一个可执行文件和一个外部语言文件,所以添加新语言不需要重新编译,只需用文本编辑器编辑语言文件,一切正常。

我想将所有语言保存在一个外部文件中。比如international.lang

[portuguese]
greeting="Bem-vindo"

[spanish]
greeting="Ben venido"

如果文件international.lang不存在,或者您的语言不在文件中,默认情况下程序将以英文启动,没有错误。就像大多数基于资源的多语言程序一样。

所以问题是,如何在delphi中检测Windows语言? 对我的方法有什么想法吗? 有没有办法以编程方式替换对话框上的所有字幕?

ps:我正在使用delphi7,我找不到任何免费的组件。

2 个答案:

答案 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开始,存在用于获取相同区域设置信息的新功能,请检查这些功能GetLocaleInfoExGetUserDefaultLocaleNameGetSystemDefaultLocaleName

答案 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;

您可以为三种语言执行相同的操作。 希望它有所帮助。