Загрузка заголовка элементов управления из библиотеки ресурсов - PullRequest
1 голос
/ 15 апреля 2009

Я новичок в MFC, и мне нужно создать многоязычное приложение, которое должно иметь возможность изменять язык во время выполнения.

AFAIK Распространенный способ интернационализации с помощью MFC - создание DLL-библиотек только для ресурсов. Но, похоже, не существует простого способа (это означает, загружать DLL, вызывать какую-то функцию и MFC обновляет все автоматически или что-то в этом роде), чтобы переключать библиотеки ресурсов во время выполнения, верно?

Так что мне придется обновить все элементы управления и так далее вручную. Мне уже удалось загрузить строки из таблицы строк DLL, но поскольку заголовки элементов управления, таких как кнопки, хранятся в соответствующем диалоговом окне (если я доверяю своему хакеру ресурсов :)), я подумал, что должен быть способ загрузить их и избежать сохранение дополнительной строки в таблице строк вручную.

Или есть другой способ, о котором я не знаю?

Если это имеет какое-то значение ... Я должен использовать MS Visual C ++ 4

Ответы [ 2 ]

1 голос
/ 23 апреля 2009

Если вы не хотите требовать перезапуска приложения (на далеко самое простое решение и то, которое вы должны использовать IMO), вы можете использовать ресурсные библиотеки DLL и воссоздать основные окна, когда пользователь переключает языки. Таким образом, MFC воссоздает меню и т. Д. На новом языке. В любом случае, новые диалоги будут отображаться на новом языке уже с того момента, как вы переключили дескриптор ресурса.

Я не уверен, как это связано со встроенным миром, мой опыт из настольного MFC.

1 голос
/ 16 апреля 2009

Я работаю над крупным локализованным проектом MFC. Вот наша стратегия:

  1. Словарь ключевых слов -> локализованная строка, специфичная для каждого языка. Есть несколько способов реализовать это, позже.

  2. Идентификаторы или заголовки элементов управления в диалоговом ресурсе устанавливаются на ключ, используемый для поиска перевода

  3. Создание базового CDialog, CFormView и т. Д. И при вызове инициализации :: EnumChildWindows . В обратном вызове найдите перевод и замените заголовок элемента управления переводом.

Для вашего словаря вы можете пойти несколькими путями.

  • Если вы хотите положиться на встроенный выбор локализованных ресурсов и таблицы строк, вам нужно как-то сопоставить элемент управления с идентификатором строки. Вы можете тщательно убедиться, что идентификатор элемента управления совпадает с идентификатором строки, или вы можете ASCII-кодировать идентификатор в заголовке, а затем использовать atoi для анализа значения int.

  • Вы можете отказаться от встроенной сделки с таблицей локализованных строк и поддерживать свой собственный словарь строк -> строк для каждого языка. Это позволяет вам установить заголовок для нелокализованной строки в ресурсе, что упрощает компоновку (хотя вам все равно придется тестировать на всех языках.) Потребуется сделать собственное «внедрение зависимостей», чтобы убедиться, что вы загружаете до правильного словаря. Вы хотите иметь возможность выпускать обновленные / дополнительные языки без перекомпоновки основных двоичных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...