Поделиться через


TN057: локализация компонентов MFC

Замечание

Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

Замечание

Следующая техническая заметка не была обновлена, так как она была впервые включена в онлайн-документацию. В результате некоторые процедуры и темы могут быть устаревшими или неверными. Для получения последних сведений рекомендуется искать интересующую тему в индексе веб-документации.

В этом примечании описываются некоторые конструкции и процедуры, которые можно использовать для локализации компонента, если это приложение или элемент управления OLE или библиотека DLL, использующая MFC.

Обзор

При локализации компонента, использующего MFC, существует две проблемы. Во-первых, необходимо локализовать собственные ресурсы — строки, диалоги и другие ресурсы, относящиеся к вашему компоненту. Большинство компонентов, созданных с помощью MFC, также включают и используют ряд ресурсов, определенных MFC. Кроме того, необходимо предоставить локализованные ресурсы MFC. К счастью, несколько языков уже предоставляются самим MFC.

Кроме того, ваш компонент должен быть готов к выполнению в целевой рабочей среде (европейской или с поддержкой DBCS). В большинстве случаев это зависит от того, как приложение обрабатывает символы с высоким набором битов правильно и обрабатывает строки с двойными байтами. MFC включен по умолчанию в каждой из этих сред, позволяя использовать один всемирный двоичный файл, который используется на всех платформах, с разными ресурсами, подключаемыми во время установки.

Локализация ресурсов компонента

Локализация приложения или библиотеки DLL должна включать простое замена ресурсов ресурсами, соответствующими целевому языку. Для собственных ресурсов это относительно просто: измените ресурсы в редакторе ресурсов и создайте приложение. Если ваш код написан правильно, то в исходном коде C++ не будет жёстко закодированных строк или текста, которые вы хотите локализовать — вся локализация может быть выполнена просто путем изменения ресурсов. На самом деле вы можете реализовать компонент таким образом, что все, предоставляющие локализованную версию, даже не включают сборку исходного кода. Это более сложный, но это того стоит и является механизмом, выбранным для самого MFC. Кроме того, можно локализовать приложение, загрузив EXE или DLL-файл в редактор ресурсов и непосредственно изменив ресурсы. Хотя это возможно, требуется повторное применение этих изменений при каждом создании новой версии приложения.

Один из способов избежать этого заключается в поиске всех ресурсов в отдельной библиотеке DLL, иногда называемой вспомогательной библиотекой DLL. Затем эта библиотека DLL загружается динамически во время выполнения, а ресурсы загружаются из этой библиотеки DLL, а не из основного модуля со всем кодом. MFC напрямую поддерживает этот подход. Рассмотрим приложение с именем MYAPP.EXE; Он может иметь все свои ресурсы, расположенные в библиотеке DLL с именем MYRES.DLL. В приложении InitInstance выполняются следующие действия, чтобы загрузить эту библиотеку DLL и заставить MFC загружать ресурсы из этого расположения:

CMyApp::InitInstance()
{
    // one of the first things in the init code
    HINSTANCE hInst = LoadLibrary("myres.dll");

    if (hInst != NULL)
        AfxSetResourceHandle(hInst);

    // other initialization code would follow
    // ...
}

С этого момента MFC будет загружать ресурсы из этой библиотеки DLL, а не из myapp.exe. Тем не менее, все ресурсы должны присутствовать в этой библиотеке DLL; MFC не будет искать экземпляр приложения в поисках конкретного ресурса. Этот метод применяется одинаково хорошо к обычным библиотекам DLL MFC, а также к элементам управления OLE. Программа установки скопирует соответствующую версию MYRES.DLL в зависимости от выбранного пользователем языкового стандарта ресурса, который предпочтет пользователь.

Довольно легко создать только библиотеку DLL ресурсов. Создайте проект DLL, добавьте свой. Rc-файл в него и добавьте необходимые ресурсы. Если у вас есть существующий проект, который не использует этот метод, можно скопировать ресурсы из этого проекта. После добавления файла ресурса в проект вы почти готовы к сборке проекта. Единственное, что необходимо сделать, — задать параметры компоновщика для включения /NOENTRY. Это сообщает компоновщику, что библиотека DLL не имеет точки входа, так как она не имеет кода, у нее нет точки входа.

Замечание

Редактор ресурсов в Visual C++ 4.0 и более поздних версий поддерживает несколько языков на каждый. RC-файл. Это позволяет легко управлять локализацией в одном проекте. Ресурсы для каждого языка управляются директивами препроцессора, созданными редактором ресурсов.

Использование предоставленных локализованных ресурсов MFC

Любое приложение MFC, которое вы создаете, повторно использует две вещи из MFC: код и ресурсы. То есть MFC содержит различные сообщения об ошибках, встроенные диалоги и другие ресурсы, используемые классами MFC. Чтобы полностью локализовать приложение, необходимо локализовать не только ресурсы приложения, но и ресурсы, поступающие непосредственно из MFC. MFC предоставляет несколько разных файлов ресурсов языка автоматически, поэтому если целевой язык является одним из языков, уже поддерживаемых MFC, необходимо просто убедиться, что эти локализованные ресурсы используются.

На момент написания данного текста, MFC поддерживает китайский, немецкий, испанский, французский, итальянский, японский и корейский. Файлы, содержащие эти локализованные версии, находятся в каталогах MFC\INCLUDE\L.* (где 'L' обозначает локализованные версии). Например, немецкие файлы находятся в MFC\INCLUDE\L.DEU. Чтобы приложение использовало эти RC-файлы вместо файлов, расположенных в MFC\INCLUDE, добавьте /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU в командную строку RC (это просто пример; вам потребуется заменить языковой стандарт, а также каталог, в который вы установили Visual C++).

Приведенные выше инструкции будут работать, если приложение статически связывается с MFC. Большинство приложений связываются динамически (так как это настройка по умолчанию в AppWizard). В этом сценарии код динамически связан не только с ресурсами. В результате вы можете локализовать ресурсы в приложении, но ресурсы реализации MFC по-прежнему будут загружены из MFC7x.DLL (или более поздней версии) или из MFC7xLOC.DLL, если она существует. Вы можете приблизиться к этому с двух разных углов.

Более сложный подход заключается в том, чтобы поставлять одну из локализованных библиотек MFC7xLOC.DLL (например, MFC7xDEU для немецкого языка, MFC7xESP.DLL для испанского и т. д.), или более позднюю версию, а также установить соответствующую MFC7xLOC.DLL в системный каталог при установке приложения пользователем. Это может быть очень сложно как для разработчика, так и для конечного пользователя и поэтому не рекомендуется. Дополнительные сведения об этом методе и его предостережениях см. в техническом примечание 56 .

Самый простой и безопасный подход — включить локализованные ресурсы MFC непосредственно в ваше приложение или в DLL (или в отдельную DLL, если вы используете таковую). Это позволяет избежать проблем при установке MFC7xLOC.DLL правильно. Для этого выполните те же инструкции, что и для статического случая, указанные выше, за исключением того, что необходимо правильно настроить командную строку RC на локализованные ресурсы и также удалить определение /D_AFXDLL, добавленное AppWizard. Когда определяется /D_AFXDLL, AFXRES.H (и другие RC-файлы MFC) фактически не определяют ресурсы, так как они будут извлечены из DLL библиотек MFC.

См. также

Технические примечания по номеру
Технические заметки по категориям