|  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:14 | #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). | |
|  11.11.2010, 18:20 | #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.11.2010, 18:36 | #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). | |
|  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). | |
| Теги | 
| законченный пример, программно, раскладка клавиатуры | 
|  | 
| 
 |