|
11.11.2010, 15:29 | #1 |
MCITP
|
Текущий язык системы.
Всем день добрый!
Возникла необходимость в получении текущего языка пользователя. Посмотрел класс xSession , но он возвращает только язык интерфейса как я понял. Сижу смотрю в MSDN функции LoadKeyboardLayout , ActivateKeyboardLayout и GetKeyboardLayout. Но как-то не могу сообразить как их применить для получения текущего языка. Не могли бы пнуть в нужном направлении. Спасибо. |
|
11.11.2010, 15:37 | #2 |
MCTS
|
А какая версия АХ?
В 2009 например можно так: X++: static void UserLanguage(Args _args) { UserInfo userInfo; ; select firstonly userInfo where userInfo.id == curuserid(); info(userInfo.Language); } |
|
11.11.2010, 15:40 | #3 |
Участник
|
X++: static void GetLangaugeJob(Args _args) { ; info(Infolog.language()); }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 11.11.2010 в 15:44. |
|
|
За это сообщение автора поблагодарили: PavelX (1). |
11.11.2010, 15:47 | #4 |
MCITP
|
Спасибо за ответ!
Возможно я не правильно поставил вопрос за что извиняюсь. Но данный job возвращает язык интерфейса аксы, как я понимаю. А мне нужна раскладка виндов. Приложил скрин, что я имею ввиду. Ax 4.0 |
|
11.11.2010, 17:15 | #5 |
Участник
|
Вы бы, все-таки, по-осторожнее с терминами раскладка и язык немного разные вещи.
__________________
Ivanhoe as is.. |
|
11.11.2010, 17:50 | #6 |
Ищущий знания...
|
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
11.11.2010, 17:55 | #7 |
MCITP
|
Спасибо за ответ! Но вопрос в том как получить текущее значение раскладки, а не как переключить. Все эти темы я читал. То что смог найти подходит, вроде, вот это Функция GetKeyboardLayoutName извлекает данные о названии активной раскладки символов на клавиатуре....... Но вот как её использовать я пока не понял. |
|
|
За это сообщение автора поблагодарили: (-1). |
11.11.2010, 18:13 | #8 |
Участник
|
В общем-то вот, что получилось:
X++: server static void getLanguage() { dll dll = new dll("user32"); dllFunction GetKeyboardLayout = new dllFunction(dll, "GetKeyboardLayout"); #define.RU("68748313") #define.EN("67699721") ; GetKeyboardLayout.arg(ExtTypes::DWORD); GetKeyboardLayout.returns(ExtTypes::DWORD); if(value2string(GetKeyboardLayout.call(0)) == #RU) { info("RU"); } else { info("EN"); } }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 11.11.2010 в 18:17. |
|
|
За это сообщение автора поблагодарили: GBH (1). |
11.11.2010, 18:36 | #9 |
MCITP
|
Цитата:
Сообщение от samolalex
В общем-то вот, что получилось:
X++: server static void getLanguage() { dll dll = new dll("user32"); dllFunction GetKeyboardLayout = new dllFunction(dll, "GetKeyboardLayout"); #define.RU("68748313") #define.EN("67699721") ; GetKeyboardLayout.arg(ExtTypes::DWORD); GetKeyboardLayout.returns(ExtTypes::DWORD); if(value2string(GetKeyboardLayout.call(0)) == #RU) { info("RU"); } else { info("EN"); } } Всем огромное спасибо. Тему можно закрывать. P.S. Только вместо value2string использовать надо int2str Последний раз редактировалось GBH; 11.11.2010 в 18:41. Причина: Поправка |
|
|
За это сообщение автора поблагодарили: zZ_TOP_Zz (1), kornix (3). |
11.11.2010, 18:14 | #10 |
Ищущий знания...
|
получилось получить текущею раскладку в числовом виде, но никак не могу перевести его на читабельный вариант. может у вас получится
вот код: X++: DLL DLL; DLLFunction DLLFunction; ; #WinAPI DLL = new DLL('user32.dll'); DLLFunction = new DLLFunction(DLL,'GetKeyboardLayout'); DLLFunction.arg(ExtTypes::DWord); DLLFunction.returns(ExtTypes::DWord); info(DLLFunction.call(0));
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 11.11.2010 в 18:16. |
|
|
За это сообщение автора поблагодарили: GBH (1). |
11.11.2010, 18:20 | #11 |
MCITP
|
Цитата:
Сообщение от lev
получилось получить текущею раскладку в числовом виде, но никак не могу перевести его на читабельный вариант. может у вас получится
вот код: X++: DLL DLL; DLLFunction DLLFunction; ; #WinAPI DLL = new DLL('user32.dll'); DLLFunction = new DLLFunction(DLL,'GetKeyboardLayout'); DLLFunction.arg(ExtTypes::DWord); DLLFunction.returns(ExtTypes::DWord); info(DLLFunction.call(0)); Сейчас буду думать дальше! |
|
11.11.2010, 19:32 | #12 |
Участник
|
Если вам надо узнать именно текстовое название используемого языка, то можно воспользоваться такими функциями
X++: { DLL dll = new DLL("user32"); DLL kernel = new DLL("KERNEL32"); DLLFunction GetKeyboardLayout = new dllFunction(dll, "GetKeyboardLayout"); DLLFunction GetLocaleInfoSize0 = new dllFunction(kernel, "GetLocaleInfoA"); DLLFunction GetLocaleInfo = new dllFunction(kernel, "GetLocaleInfoA"); int locale; Binary buf; int size; #define.LOCALE_SYSTEM_DEFAULT(0x400) #define.LOCALE_SLANGUAGE (0x00000002) #define.LOCALE_SENGLANGUAGE (0x00001001) #define.LOCALE_SABBREVLANGNAME (0x00000003) #define.LOCALE_SISO639LANGNAME (0x00000059) ; GetKeyboardLayout.arg(ExtTypes::DWORD); GetKeyboardLayout.returns(ExtTypes::DWORD); locale = GetKeyboardLayout.call(0); GetLocaleInfoSize0.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord); GetLocaleInfoSize0.returns(ExtTypes::DWord); GetLocaleInfo.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord); GetLocaleInfo.returns(ExtTypes::DWord); size = GetLocaleInfoSize0.call(locale & 0xffff, #LOCALE_SISO639LANGNAME, 0, 0); if (size) { buf = new Binary(size); GetLocaleInfo.call(locale & 0xffff, #LOCALE_SISO639LANGNAME, buf, size); info(buf.string(0)); } else info(WinApi::formatMessage(WinApi::getLastError())); } LOCALE_SLANGUAGE - возвращает локализованное название языка LOCALE_SENGLANGUAGE - возвращает английское название языка LOCALE_SABBREVLANGNAME - возвращает аббревиатуру языка в виде ENU, RUS и т.д. LOCALE_SISO639LANGNAME - возвращает аббревиатуру языка по стандарту ISO639 в виде en, ru и т.д. Так же, если использовать константу GetLocaleInfo.call(#LOCALE_SYSTEM_DEFAULT...) то получим язык, используемый в системе по умолчанию
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (1), zZ_TOP_Zz (1), GBH (1), samolalex (1). |
11.11.2010, 21:39 | #13 |
Ищущий знания...
|
Цитата:
Сообщение от AndyD
Использование констант.
LOCALE_SLANGUAGE - возвращает локализованное название языка LOCALE_SENGLANGUAGE - возвращает английское название языка LOCALE_SABBREVLANGNAME - возвращает аббревиатуру языка в виде ENU, RUS и т.д. LOCALE_SISO639LANGNAME - возвращает аббревиатуру языка по стандарту ISO639 в виде en, ru и т.д. Так же, если использовать константу GetLocaleInfo.call(#LOCALE_SYSTEM_DEFAULT...) то получим язык, используемый в системе по умолчанию
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: AndyD (1). |
11.11.2010, 23:12 | #14 |
Участник
|
Да в тройке есть все, кроме LOCALE_SISO639LANGNAME
А вот в 2009-м этих констант нет
__________________
Axapta v.3.0 sp5 kr2 |
|
12.11.2010, 06:04 | #15 |
Участник
|
А в 2009 можно и без них обойтись, раскладку можно просто определить при помощи .Net API
X++: static void currentKeyBoardLayout(Args _args) { System.Windows.Forms.InputLanguage currentLanguage = System.Windows.Forms.InputLanguage::get_CurrentInputLanguage(); System.Globalization.CultureInfo cultInfo; ; cultInfo = currentLanguage.get_Culture(); info(cultInfo.get_TwoLetterISOLanguageName()); }
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Logger (1), rINT (1), lev (1), gl00mie (1), PavelX (1), GBH (1), player (1). |
Теги |
законченный пример, программно, раскладка клавиатуры |
|
|