Страница 1 из 1

Автоопределение языка

Добавлено: Пт май 25, 2007 15:29
Моторокер
Добавляю в плагин автоопределение языка.
При первой загрузке сравниваю этой функцией название текущего языка со строкой Name в lng файле.

Код: Выделить всё

{ Определение текущего языка }
function WhichLanguage: string;
var
  ID: LangID;
  Language: array [0..100] of char;
begin
  ID:= GetSystemDefaultLangID;
  VerLanguageName(ID, Language, 100);
  Result:= String(Language);
end;
Проблемы например с украинским – название языка хранится на украинском, в русская винда выдаёт его как «Украинский», т.е. автоопределение не срабатывает.
Maximus предложил делать по другому – хранить в lng файле id и сравнивать его с GetSystemDefaultLangID, как в decClipboardFS.

Думаю сделать подобное в дополнение к первому способу, только в id указывать несколько значений, чтобы автоматом определять язык для языков, используемых в нескольких странах.

Залез в Windows.pas, там есть такие строчки:

Код: Выделить всё

(*
 *  Language IDs.
 *
 *  The following two combinations of primary language ID and
 *  sublanguage ID have special semantics:
 *
 *    Primary Language ID   Sublanguage ID      Result
 *    -------------------   ---------------     ------------------------
 *    LANG_NEUTRAL          SUBLANG_NEUTRAL     Language neutral
 *    LANG_NEUTRAL          SUBLANG_DEFAULT     User default language
 *    LANG_NEUTRAL          SUBLANG_SYS_DEFAULT System default language
 *)

const
{ Primary language IDs. }
Типа язык и подъязык. Не понял, как их можно использовать и можно ли.

Добавлено: Сб июл 14, 2007 18:48
Nik
Английское название языка можно вытащить функцией (возвращает значение типа string)

Код: Выделить всё

GetLocaleInformation(LOCALE_SENGLANGUAGE)
Использую этот способ уже давно (в AmpView и не только) - никаких проблем ни с одним языком не возникало.

Выглядит всё примерно так:

Код: Выделить всё

 if FileExists(PlugDir+'\Language\'+GetIniString('main', 'language', GetLocaleInformation(LOCALE_SENGLANGUAGE)+'.lng', IniFile))
  then LoadLang(PlugDir+'\Language\'+GetIniString('main', 'language', GetLocaleInformation(LOCALE_SENGLANGUAGE)+'.lng', IniFile))

Добавлено: Пн июл 16, 2007 14:29
Моторокер
Maximus предложил использовать только id языка, я так и сделал + если совпадает id полностью, открывают этот файл. Если полностью не совпадает, сравниваю только первые 2 байта. Таким образом, неважно что за язык и как он назван – русский например сработает для всех стран, где основной язык – русский. А то есть всякие подъязыки экзотические, на каждый не запасёшься английских названий.