Как определить системный язык в Delphi для многоязычного проекта? - PullRequest
7 голосов
/ 26 ноября 2011

Мне нужно перевести программу на другие языки, фактически у меня есть та же самая программа на 3 языках (английский, испанский, португальский), но я перевел, перекомпилировал, и у меня есть 3 отдельных исполняемых файла. Добавление новых языков, сохранение ссылок и добавление новых функций сводит меня с ума.

Итак, теперь я решил сохранить один исполняемый файл и внешний языковой файл, поэтому добавление новых языков не требует перекомпиляции, просто редактируйте языковой файл с помощью текстового редактора, и все в порядке.

Я хочу сохранить все языки в одном внешнем файле. как international.lang

[portuguese]
greeting="Bem-vindo"

[spanish]
greeting="Ben venido"

если файла international.lang нет или ваш язык отсутствует в файле, программа запустится на английском языке по умолчанию, без ошибок. Как и большинство мультиязычных программ, основанных на ресурсах.

Итак, вопрос в том, как определить язык Windows в Delphi? Есть мысли о моем подходе? Есть ли способ заменить все подписи в диалогах программно?

ps: я использую delphi7, и я не могу найти ни одного бесплатного компонента, который хорош.

Ответы [ 2 ]

9 голосов
/ 26 ноября 2011

Вы можете использовать функцию 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

0 голосов
/ 04 января 2018

У меня та же проблема, хотя мне приходится иметь дело только с двумя языками: английским (по умолчанию) и польским.Я перепробовал все решения, перечисленные выше, и ни одно из них не работало.Я менял настройки системы, перезагружался и т. Д. И всегда получал английский язык.При переключении на польский язык все отображалось на польском языке, все польские локали были установлены, но мое приложение получало английский в качестве языка ОС.После многих попыток я наткнулся на довольно простой и надежный обходной путь (я не называю это решением), который хорош, если вам приходится иметь дело с небольшим количеством языков.Таким образом, хитрость заключается в том, чтобы проверить, на каком языке список языков возвращается 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;

Вы можете сделать то же самое для своих трех языков.Надеюсь, это поможет.

...