|
|
#1 |
|
MCITP
|
Текущий язык системы.
Всем день добрый!
Возникла необходимость в получении текущего языка пользователя. Посмотрел класс xSession , но он возвращает только язык интерфейса как я понял. Сижу смотрю в MSDN функции LoadKeyboardLayout , ActivateKeyboardLayout и GetKeyboardLayout. Но как-то не могу сообразить как их применить для получения текущего языка. Не могли бы пнуть в нужном направлении. Спасибо. |
|
|
|
|
#2 |
|
MCTS
|
А какая версия АХ?
В 2009 например можно так: X++: static void UserLanguage(Args _args) { UserInfo userInfo; ; select firstonly userInfo where userInfo.id == curuserid(); info(userInfo.Language); } |
|
|
|
|
#3 |
|
Участник
|
X++: static void GetLangaugeJob(Args _args) { ; info(Infolog.language()); }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 11.11.2010 в 15:44. |
|
|
|
| За это сообщение автора поблагодарили: PavelX (1). | |
|
|
#4 |
|
MCITP
|
Спасибо за ответ!
Возможно я не правильно поставил вопрос за что извиняюсь. Но данный job возвращает язык интерфейса аксы, как я понимаю. А мне нужна раскладка виндов. Приложил скрин, что я имею ввиду. Ax 4.0 |
|
|
|
|
#5 |
|
Участник
|
Вы бы, все-таки, по-осторожнее с терминами
раскладка и язык немного разные вещи.
__________________
Ivanhoe as is.. |
|
|
|
|
#6 |
|
Ищущий знания...
|
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#7 |
|
MCITP
|
Спасибо за ответ! Но вопрос в том как получить текущее значение раскладки, а не как переключить. Все эти темы я читал. То что смог найти подходит, вроде, вот это Функция GetKeyboardLayoutName извлекает данные о названии активной раскладки символов на клавиатуре....... Но вот как её использовать я пока не понял. |
|
|
|
| За это сообщение автора поблагодарили: (-1). | |
|
|
#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). | |
|
|
#9 |
|
Ищущий знания...
|
получилось получить текущею раскладку в числовом виде, но никак не могу перевести его на читабельный вариант. может у вас получится
![]() вот код: 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). | |
|
|
#10 |
|
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 |
|
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). | |
|
|
#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). | |
|
|
#13 |
|
Ищущий знания...
|
Цитата:
Сообщение от AndyD
Использование констант.
LOCALE_SLANGUAGE - возвращает локализованное название языка LOCALE_SENGLANGUAGE - возвращает английское название языка LOCALE_SABBREVLANGNAME - возвращает аббревиатуру языка в виде ENU, RUS и т.д. LOCALE_SISO639LANGNAME - возвращает аббревиатуру языка по стандарту ISO639 в виде en, ru и т.д. Так же, если использовать константу GetLocaleInfo.call(#LOCALE_SYSTEM_DEFAULT...) то получим язык, используемый в системе по умолчанию
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
| За это сообщение автора поблагодарили: AndyD (1). | |
|
|
#14 |
|
Участник
|
Да в тройке есть все, кроме LOCALE_SISO639LANGNAME
А вот в 2009-м этих констант нет
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
#15 |
|
Участник
|
А в 2009 можно и без них обойтись
, раскладку можно просто определить при помощи .Net APIX++: 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). | |
| Теги |
| законченный пример, программно, раскладка клавиатуры |
|
|
|