Точка или запятая? Русский или английский?
От: BaSergey Россия  
Дата: 15.04.03 14:27
Оценка:
Привет всем!
Про то, что некоторые юзеры любят лезть в настройку "Язык и стандарты" и как с этим бороться, уже написано много. Но все же...
У меня стоит Default locale = Русский, язык по умолчанию английский, больше ничего не исправлял — для чистоты эксперимента.
Забиваю число в строку ввода, жму точку на цифровой клавиатуре — появляется запятая. Известно, почему — русский язык выбран. Переключаюсь на английский — вместо запятой идет точка. Все нормально, кроме самого главного — как определить текущий язык ввода?

Я пишу на Delphi, MSDN у меня есть и я в нем более-менее ориентируюсь.GetUserDefaultLCID дает фиксированное значение, GetLocaleInfo тем более от него зависит. GetKeyboardLayoutList тоже не из этой оперы...

Как определить, на каком языке вводится текст и какие в нем настройки даты/валюты/чисел/...?
Заранее спасибо.
ICQ 153965498
Re: Точка или запятая? Русский или английский?
От: SergH Россия  
Дата: 15.04.03 14:30
Оценка: 3 (1)
Здравствуйте, BaSergey, Вы писали:

BS>Привет всем!

BS>Про то, что некоторые юзеры любят лезть в настройку "Язык и стандарты" и как с этим бороться, уже написано много. Но все же...
BS>У меня стоит Default locale = Русский, язык по умолчанию английский, больше ничего не исправлял — для чистоты эксперимента.
BS>Забиваю число в строку ввода, жму точку на цифровой клавиатуре — появляется запятая. Известно, почему — русский язык выбран. Переключаюсь на английский — вместо запятой идет точка. Все нормально, кроме самого главного — как определить текущий язык ввода?

BS>Я пишу на Delphi, MSDN у меня есть и я в нем более-менее ориентируюсь.GetUserDefaultLCID дает фиксированное значение, GetLocaleInfo тем более от него зависит. GetKeyboardLayoutList тоже не из этой оперы...


BS>Как определить, на каком языке вводится текст и какие в нем настройки даты/валюты/чисел/...?

BS>Заранее спасибо.

GetKeyboardLayout + GetLocalInfo ?
Делай что должно, и будь что будет
Re[2]: Точка или запятая? Русский или английский?
От: BaSergey Россия  
Дата: 15.04.03 14:36
Оценка:
Здравствуйте, SergH, Вы писали:

SH>GetKeyboardLayout + GetLocalInfo ?


HKL и LCID — это одно и то же? Я не нашел функции GetLocalInfo...
ICQ 153965498
Re[3]: Точка или запятая? Русский или английский?
От: SergH Россия  
Дата: 15.04.03 14:39
Оценка: 3 (1)
Здравствуйте, BaSergey, Вы писали:

BS>HKL и LCID — это одно и то же?


Из MSDN про GetKeyboardLayout :

The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.

BS>Я не нашел функции GetLocalInfo...


Это я виноват правильное название GetLocaleInfo
Делай что должно, и будь что будет
Re: Точка или запятая? Русский или английский?
От: SergeyIT Россия  
Дата: 15.04.03 15:13
Оценка:
Здравствуйте, BaSergey, Вы писали:

...
В Дельфи есть глобальная переменная

DecimalSeparator: Char;
Извините, я все еще учусь
Re: Точка или запятая? Русский или английский?
От: SergeyIT Россия  
Дата: 15.04.03 15:38
Оценка:
Здравствуйте, BaSergey, Вы писали:

...
В Дельфи есть глобальные переменные
var
CurrencyString: string;
CurrencyFormat: Byte;
NegCurrFormat: Byte;
ThousandSeparator: Char;
DecimalSeparator: Char;
CurrencyDecimals: Byte;
DateSeparator: Char;
ShortDateFormat: string;
LongDateFormat: string;
TimeSeparator: Char;
TimeAMString: string;
TimePMString: string;
ShortTimeFormat: string;
LongTimeFormat: string;
ShortMonthNames: array[1..12] of string;
LongMonthNames: array[1..12] of string;
ShortDayNames: array[1..7] of string;
LongDayNames: array[1..7] of string;
SysLocale: TSysLocale;
EraNames: array[1..7] of string;
EraYearOffsets: array[1..7] of Integer;
TwoDigitYearCenturyWindow: Word = 50;
ListSeparator: Char;
...
и поищите в исходниках
Извините, я все еще учусь
Re[4]: Точка или запятая? Русский или английский?
От: BaSergey Россия  
Дата: 16.04.03 06:55
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Из MSDN про GetKeyboardLayout :


SH>The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.


GetKeyboardLayout действительно отслеживает изменения языка. Но GetLocaleInfo с его результатом работать отказывается. Вот, что я делаю для проверки:
function GetLocaleChar(Locale, LocaleType: Integer; Default: Char): Char;
var
  Buffer: array[0..1] of Char;
begin
  if GetLocaleInfo(Locale, LocaleType, Buffer, 2) > 0 then
    Result := Buffer[0] else
    Result := Default;
end;

  Application.MessageBox(PChar(format(
      'Lo=%4x; Hi=%4x; Char=[%s]',
    [LoWord(GetKeyboardLayout(0)), HiWord(GetKeyboardLayout(0)),
    GetLocaleChar(GetKeyboardLayout(0), LOCALE_SDECIMAL, 'D')])),
    'Info', mb_Ok or mb_IconInformation);


Результат работы GetLocaleChar всегда равен "D". А если ему дать результат чего-нибудь типа GetThreadLocale — все нормально, но результат не тот, что хотелось — постоянно то, что прописано в панели управления. Мне же нужен конкретно тот разделитель, который действует непосредственно сейчас, для текущего языка ввода.

Есть соображения?
ICQ 153965498
Re[5]: Точка или запятая? Русский или английский?
От: SergH Россия  
Дата: 16.04.03 11:59
Оценка:
Здравствуйте, BaSergey, Вы писали:

SH>The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.


BS>GetKeyboardLayout действительно отслеживает изменения языка. Но GetLocaleInfo с его результатом работать отказывается. Вот, что я делаю для проверки:

BS>
...
BS>


BS>Результат работы GetLocaleChar всегда равен "D". А если ему дать результат чего-нибудь типа GetThreadLocale — все нормально, но результат не тот, что хотелось — постоянно то, что прописано в панели управления. Мне же нужен конкретно тот разделитель, который действует непосредственно сейчас, для текущего языка ввода.


BS>Есть соображения?


Есть. Извини, сам проверить сейчас не могу, но, имхо что бы получить LCID из GetKeyboardLayout нужно делать так:

MAKELCID(LOWORD(GetKeyboardLayout(0)), SORT_DEFAULT);


И вот это уже передавать в первый параметр GetLocaleInfo.
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.