Re[5]: Динамическое переключение языка интерфейса в MFC-прил
От: Nikolaz Германия www.nikeware.com
Дата: 24.11.04 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:


А> Отлично, при старте приложения мы может его локализовать. А как быть с динамическим переключением языка, про которое идет речь в статье и на тему которого приведен пример? Я сам пользуюсь убогими ини-файлами и сейчас рассматриваю вопрос о том, стоит ли сменить подход к локазизации.

А> Итак, вопрос: У меня есть dialog-based приложение с кучей загруженных контролов и дочерних диалогов. В примере к статье при смене языка происходит перезагрузка меню. Соответственно мне на лету придется перезагрузить все диалоги, правильно?

А> Если я не прав, то, пожалуйста, поясните механизм по которому произойдет смена языка на загруженных диалогах.

Вот ответьте мне честно (положа правую руку на левое сердце ) — неужели это так жизненно необходимо — переключение языка на "лету"? Вы что, по триста раз на день переключаете язык в приложении, что не можете смирится с необходимостью перезапустить приложение при смене языка? Или это продиктовано функциональностью программы? Это конечно выглядит клево, но в 99,99% случаях совершенно бессмысленно.

Умолкаю, потому как судя по теме это уже offtop

С наилучшими,
Николай
Re: Динамическое переключение языка интерфейса в MFC-приложе
От: Аноним  
Дата: 12.05.05 12:34
Оценка:
Здравствуйте,

я что-то не так понимаю, или в чём проблема:
При переключении языка на русский само меню переводится,
а содержание диалога "О программе" остается в виде вопросительных знаков...
Да и само слово заголовок диалога "О программе" выглядит как "? ?????????"

Оп.система: WindowsXP

Что не так?
Re[2]: Динамическое переключение языка интерфейса в MFC-прил
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.05.05 12:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>я что-то не так понимаю, или в чём проблема:

А>При переключении языка на русский само меню переводится,
А>а содержание диалога "О программе" остается в виде вопросительных знаков...
А>Да и само слово заголовок диалога "О программе" выглядит как "? ?????????"

Только что скачал с сайта демо-проект, откомпилил и запустил — все ОК. Windows XP Pro Eng SP2.
[ posted via RSDN@Home 1.1.4 beta 7 r448, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: Динамическое переключение языка интерфейса в MFC-прил
От: Аноним  
Дата: 12.05.05 12:51
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, <Аноним>, Вы писали:


А>>я что-то не так понимаю, или в чём проблема:

А>>При переключении языка на русский само меню переводится,
А>>а содержание диалога "О программе" остается в виде вопросительных знаков...
А>>Да и само слово заголовок диалога "О программе" выглядит как "? ?????????"

SDB>Только что скачал с сайта демо-проект, откомпилил и запустил — все ОК. Windows XP Pro Eng SP2.


У меня та же оп. система со всеми ServicePack'ами. Всё на английском, виндовс-меню "All Programms" и т.д. — поэтому русский текст и в ресурсах не отображается. Но сам факт, что при выполнении программы само меню на русском, говорит о том, что это в принципе возможно. Хотел сначала скриншот привесить, но и так в принципе ведь понятно...
Так чего не хватает?
Re[4]: Динамическое переключение языка интерфейса в MFC-прил
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.05.05 13:06
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Так чего не хватает?


А Default language for non-unicode programs установлен в русский?
[ posted via RSDN@Home 1.1.4 beta 7 r448, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[5]: Динамическое переключение языка интерфейса в MFC-прил
От: Аноним  
Дата: 12.05.05 13:16
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, <Аноним>, Вы писали:


А>>Так чего не хватает?


SDB>А Default language for non-unicode programs установлен в русский?


Думаю что нет. Не совсем понимаю, о чем идёт речь и как это сделать
(а соответсвенно, этого не знает и среднестатистический пользователь!!!)
Re[6]: Динамическое переключение языка интерфейса в MFC-прил
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.05.05 13:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Думаю что нет. Не совсем понимаю, о чем идёт речь и как это сделать


Control Panel -> Regional and Language Options -> Advanvced

А>(а соответсвенно, этого не знает и среднестатистический пользователь!!!)


На NT/2000/XP обычно ставятся юникодные сборки приложений, в которых подобная проблема не возникает. (Просто добавьте еще две сборочные конфигурации, аналогичные существующим, но содержащие две дополнительные директивы препроцессора "UNICODE" и "_UNICODE", а точкой входа для компоновщика укажите wWinMainCRTStartup.)
[ posted via RSDN@Home 1.1.4 beta 7 r448, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[7]: Динамическое переключение языка интерфейса в MFC-прил
От: Аноним  
Дата: 12.05.05 13:48
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, <Аноним>, Вы писали:


А>>Думаю что нет. Не совсем понимаю, о чем идёт речь и как это сделать


SDB>Control Panel -> Regional and Language Options -> Advanvced


Примерно так я это себе и представлял, спасибо. Но это не решение. Особенно,
если оп. система будет локализированной, напрмер немецкой всё с теми же умляутами,
которые превратятся в "ё" или того хуже...

А>>(а соответсвенно, этого не знает и среднестатистический пользователь!!!)


SDB>На NT/2000/XP обычно ставятся юникодные сборки приложений, в которых подобная проблема не возникает. (Просто добавьте еще две сборочные конфигурации, аналогичные существующим, но содержащие две дополнительные директивы препроцессора "UNICODE" и "_UNICODE", а точкой входа для компоновщика укажите wWinMainCRTStartup.)


Но если в Вашем варианте мы всё равно компилируем отдельные версии dll, нужели нельзя обойтись без
"UNICODE" и "_UNICODE" ? Почему же с меню никаких проблем не возникает?? Не понимаю.
Re[8]: Динамическое переключение языка интерфейса в MFC-прил
От: Аноним  
Дата: 12.05.05 15:19
Оценка:
Для чего нужно указывать UNICODE для самого приложения, или же для dll?
Пробовал для dll- Не получается!!!
Было бы меньше ограничений, если бы можно было бы скомпилировать только dll-
само приложение могло бы быть запущенным с английским интерфейсом и под win98,
а unicode-dll подгружалась бы только для русского интерфейса...
Или так и не получится?

ЗЫ: А нельзя ли дополнить демо-проект таким образом, чтобы русский в любом случае отображался?
А то будут еще вопросы
Re[9]: Динамическое переключение языка интерфейса в MFC-прил
От: Аноним  
Дата: 22.05.05 19:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Для чего нужно указывать UNICODE для самого приложения, или же для dll?

А>Пробовал для dll- Не получается!!!
А>Было бы меньше ограничений, если бы можно было бы скомпилировать только dll-
А>само приложение могло бы быть запущенным с английским интерфейсом и под win98,
А>а unicode-dll подгружалась бы только для русского интерфейса...
А>Или так и не получится?

А>ЗЫ: А нельзя ли дополнить демо-проект таким образом, чтобы русский в любом случае отображался?

А>А то будут еще вопросы

Отвечаю сам себе:

1) Нужно указывать ОДИНАКОВЫЕ параметры препроцессора UNICODE,_UNICODE как для dll, так и для основного приложения AfxPolyglot
2) Очень важно!!! В ресурсах шрифт поменять с FONT 8, "Tahoma" на FONT 8, "MS Shell Dlg", если не сделать, русских букв не видать
3) wWinMainCRTStartup указывается только для сборки AfxPolyglot, не для библиотек!!!
4) Плюс всего этого дела- ресурсы в библиотеках остаются не в UNICODE и могут быть напрямую редактированы в редакторе!

Что не получается, или я не понимаю, как — как сделать переключение языка для, к примеру, простого котрола CEdit?
Например, имеем следующее содержание Russian_Russia.rc :

...
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUT DIALOG DISCARDABLE 0, 0, 146, 90
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "О программе"
FONT 8, "MS Shell Dlg"
BEGIN
CTEXT "Тестовое приложение AfxPolyglot",IDC_STATIC,4,4,138,12,
SS_CENTERIMAGE
CTEXT "Авторские права © 2004\nИлья Зарецкий",IDC_STATIC,4,24,
138,18
DEFPUSHBUTTON "Закрыть",IDOK,98,70,44,16
EDITTEXT IDC_EDIT1,19,46,112,14,ES_AUTOHSCROLL
END
...

Как внести в этот CEdit (смотри строчку EDITTEXT IDC_EDIT1,19,46,112,14,ES_AUTOHSCROLL) русский текст?
Копия статьи...
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.06.05 19:18
Оценка:
...выложена по адресу http://zarezky.spb.ru/articles/mfc/dynamic_lang.html — на тот случай, если она понадобится ровно в ту минуту, когда сервер RSDN будут рихтовать.
[ posted via RSDN@Home 1.1.4 beta 7 r462, accompanied by The Doors — Unknown Soldier ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: Динамическое переключение языка интерфейса в MFC-приложе
От: unb  
Дата: 28.04.06 10:27
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, Илья Зарецкий, Вы писали:

ИЗ>Статья рассказывает о реализации механизма переключения языка пользовательского интерфейса в приложениях, разрабатываемых с использованием библиотеки MFC.


Столкнулся с такой проблемой:

в своей программе активно использую механизм идентификации типов MFC,так вот после того как освобождаю библиотеку в OnLanguage,он перестает работать,код:

...
      // загружаем новую и выгружаем старую языковую библиотеку
      CRuntimeClass* cr;
      HINSTANCE hPrevDll = m_hResDLL;
      m_hResDLL = ::LoadLibrary( strLocale.Tokenize( "_", startpos ) + _T(".dll") );
      if( NULL == m_hResDLL )
      {
          startpos = 0;
          AfxMessageBox( "Error loading " + strLocale.Tokenize( "_", startpos ) ,MB_OK|MB_ICONEXCLAMATION );
          ::FreeLibrary(m_hResDll);
          m_hResDLL = hPrevDll;
      }
      cr = GetRuntimeClass()->FromName("COpenForm");
      ::FreeLibrary(hPrevDll);
      cr = GetRuntimeClass()->FromName("COpenForm");
....

результат второго вызова FromName — 0.
Re[2]: Динамическое переключение языка интерфейса в MFC-прил
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 28.04.06 11:00
Оценка:
Здравствуйте, unb, Вы писали:

unb>
unb>      cr = GetRuntimeClass()->FromName("COpenForm");
unb>      ::FreeLibrary(hPrevDll);
unb>      cr = GetRuntimeClass()->FromName("COpenForm");
unb>

unb>результат второго вызова FromName — 0.

1. Судя по выделенном — Вы пользуетесь 7-й версией MFC. На ней, честно признаюсь, описанный в статье механизм не проверялася, все разрабатывалось под 6-кой, на которой я тогда сидел.

2. Внутрь второго вызова FromName() заходить пробовали? Что конкретно там обламывается?
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: Динамическое переключение языка интерфейса в MFC-прил
От: unb  
Дата: 02.05.06 09:02
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, SchweinDeBurg, Вы писали:

SDB>2. Внутрь второго вызова FromName() заходить пробовали? Что конкретно там обламывается?


Проблема видимо связана с механизмом работы MFC Extensions Dll,до загрузки библиотек классы ищутся в первом цикле (кототрый search app specific classes),после загрузки библиотеки в InitInstance,в первом цикле ничего не находится,зато почему то находится во втором.После освобождения библиотеки,нужный класс не находится ни в первом ни во втором цикле.

Код FromName:

CRuntimeClass* PASCAL CRuntimeClass::FromName(LPCSTR lpszClassName)
{
        CRuntimeClass* pClass;

    // search app specific classes
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
    for (pClass = pModuleState->m_classList; pClass != NULL;
        pClass = pClass->m_pNextClass)
    {
        if (lstrcmpA(lpszClassName, pClass->m_lpszClassName) == 0)
        {
            AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
            return pClass;
        }
    }
    AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
#ifdef _AFXDLL
    // search classes in shared DLLs
    AfxLockGlobals(CRIT_DYNLINKLIST);
    for (CDynLinkLibrary* pDLL = pModuleState->m_libraryList; pDLL != NULL;
        pDLL = pDLL->m_pNextDLL)
    {
        for (pClass = pDLL->m_classList; pClass != NULL;
            pClass = pClass->m_pNextClass)
        {
            if (lstrcmpA(lpszClassName, pClass->m_lpszClassName) == 0)
            {
                AfxUnlockGlobals(CRIT_DYNLINKLIST);
                return pClass;
            }
        }
    }
    AfxUnlockGlobals(CRIT_DYNLINKLIST);
#endif

    return NULL; // not found
}
[от модератора]
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 02.05.06 09:10
Оценка:
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.