AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2010, 15:29   #1  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Текущий язык системы.
Всем день добрый!

Возникла необходимость в получении текущего языка пользователя.
Посмотрел класс xSession , но он возвращает только язык интерфейса как я понял.
Сижу смотрю в MSDN функции LoadKeyboardLayout , ActivateKeyboardLayout и GetKeyboardLayout. Но как-то не могу сообразить как их применить для получения текущего языка.

Не могли бы пнуть в нужном направлении.

Спасибо.
Старый 11.11.2010, 15:37   #2  
PavelX is offline
PavelX
MCTS
MCBMSS
 
46 / 97 (4) ++++
Регистрация: 08.09.2006
Адрес: Красноярск
А какая версия АХ?

В 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  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
X++:
static void GetLangaugeJob(Args _args)
{
;
info(Infolog.language());
}
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 11.11.2010 в 15:44.
За это сообщение автора поблагодарили: PavelX (1).
Старый 11.11.2010, 15:47   #4  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Спасибо за ответ!
Возможно я не правильно поставил вопрос за что извиняюсь.
Но данный job возвращает язык интерфейса аксы, как я понимаю. А мне нужна раскладка виндов.

Приложил скрин, что я имею ввиду.

Ax 4.0
Изображения
 
Старый 11.11.2010, 17:15   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Вы бы, все-таки, по-осторожнее с терминами раскладка и язык немного разные вещи.
__________________
Ivanhoe as is..
Старый 11.11.2010, 17:50   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
было похожее на форуме
Раскладка и Аксапта
Как переключить раскладку клавиатуры
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 11.11.2010, 17:55   #7  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от lev Посмотреть сообщение

Спасибо за ответ!
Но вопрос в том как получить текущее значение раскладки, а не как переключить. Все эти темы я читал.

То что смог найти подходит, вроде, вот это

Функция GetKeyboardLayoutName извлекает данные о названии активной раскладки символов на клавиатуре
.......

Но вот как её использовать я пока не понял.
За это сообщение автора поблагодарили:  (-1).
Старый 11.11.2010, 18:13   #8  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
В общем-то вот, что получилось:
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
получилось получить текущею раскладку в числовом виде, но никак не могу перевести его на читабельный вариант. может у вас получится
вот код:

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  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от 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  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если вам надо узнать именно текстовое название используемого языка, то можно воспользоваться такими функциями
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Использование констант.
LOCALE_SLANGUAGE - возвращает локализованное название языка
LOCALE_SENGLANGUAGE - возвращает английское название языка
LOCALE_SABBREVLANGNAME - возвращает аббревиатуру языка в виде ENU, RUS и т.д.
LOCALE_SISO639LANGNAME - возвращает аббревиатуру языка по стандарту ISO639 в виде en, ru и т.д.

Так же, если использовать константу GetLocaleInfo.call(#LOCALE_SYSTEM_DEFAULT...) то получим язык, используемый в системе по умолчанию
если не ошибаюсь эти (и некоторые другие) константы есть в макросе #WinApi
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: AndyD (1).
Старый 11.11.2010, 23:12   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от lev Посмотреть сообщение
если не ошибаюсь эти (и некоторые другие) константы есть в макросе #WinApi
Да в тройке есть все, кроме LOCALE_SISO639LANGNAME
А вот в 2009-м этих констант нет
__________________
Axapta v.3.0 sp5 kr2
Старый 12.11.2010, 06:04   #15  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А в 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).
Теги
законченный пример, программно, раскладка клавиатуры

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отсюда вопрос - где эффективнее всего использовать данное сжатие ? OLAP системы ? OLTP системы ? Logger DAX: Администрирование 6 17.08.2009 20:44
Каков процент внедрений "стандартной" поставки системы Аксапта? coolibin DAX: Прочие вопросы 17 10.02.2009 12:45
Текущий пользователь и язык alpine DAX: Программирование 2 03.06.2003 15:42
Проблемы с производительностью системы MIkeFW DAX: Прочие вопросы 16 25.06.2002 20:29
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:26.