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

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

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

Сообщение Моторокер »

Добавляю в плагин автоопределение языка.
При первой загрузке сравниваю этой функцией название текущего языка со строкой 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. }
Типа язык и подъязык. Не понял, как их можно использовать и можно ли.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение 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))
Качественный хостинг.
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

Сообщение Моторокер »

Maximus предложил использовать только id языка, я так и сделал + если совпадает id полностью, открывают этот файл. Если полностью не совпадает, сравниваю только первые 2 байта. Таким образом, неважно что за язык и как он назван – русский например сработает для всех стран, где основной язык – русский. А то есть всякие подъязыки экзотические, на каждый не запасёшься английских названий.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Ответить