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

Vit*_*.us 7 delphi multilingual locale translation

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

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

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

[portuguese]
greeting="Bem-vindo"

[spanish]
greeting="Ben venido"
Run Code Online (Sandbox Code Playgroud)

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

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

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

RRU*_*RUZ 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.
Run Code Online (Sandbox Code Playgroud)

注意:从Windows Vista开始存在获取相同语言环境信息的新函数,请检查这些函数GetLocaleInfoEx,GetUserDefaultLocaleNameGetSystemDefaultLocaleName