Добавить второй язык в проект MFC без использования ресурсов DLL - PullRequest
0 голосов
/ 30 ноября 2018

У меня действительно небольшое приложение, созданное с помощью MFC с немецкими меню.Теперь меня тоже попросили сделать английскую версию.Но цель состоит в том, чтобы не использовать дополнительные языковые DLL .В конце должно быть только два .exe файла (немецкий и английский).Знаете ли вы какое-нибудь пошаговое руководство, как добавить второй файл ресурсов для диалогов на английском языке (при необходимости) и как использовать их в моем коде C ++?Моя идея состоит в том, чтобы использовать директиву препроцессора:

#ifdef APPLANG=EN
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON_EN);
#else if
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
#endif

Это хорошая идея сделать это таким образом?И каковы правильные шаги, чтобы просто скопировать существующие файлы ресурсов и изменить их на английский?

Я попробовал несколько вещей, таких как создание нового файла ресурсов и копирование исходного немецкого меню в новый файл.Но потом я получаю несколько ошибок, таких как «Введите идентификатор легального ресурса».

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете встроить несколько языковых ресурсов в один файл .exe без использования библиотек ресурсов.Редактор ресурсов Visual Studio не поддерживает этот вариант использования, поэтому сценарии ресурсов необходимо редактировать вручную, используя текстовый редактор.

Чтобы определить ресурсы, используйте файлы .rc2, которые редактор ресурсов Visual Studio не будет пытаться изменить.Обязательно храните файлы .rc2 с кодировкой Unicode (UTF-16 LE) и всегда заканчивайте их разрывом строки , в противном случае компилятор ресурсов не будет работать.

Шаги

  1. Проект, созданный с помощью мастера приложений MFC, уже содержит пустой файл .rc2, который мы можем использовать в качестве нашего "основного" файла .rc2.В противном случае следуйте документации или создайте новое приложение MFC с помощью мастера, чтобы проанализировать, как включен файл .rc2.
  2. В основном файле .rc2 добавьте #include длякаждый файл .rc2 для конкретного языка:

    #include "lang_en.rc2"
    #include "lang_de.rc2"
    
    // Restore default language for resources included after current file
    LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
    
  3. Создание файлов .rc2 для конкретного языка.Каждый файл должен начинаться с LANGUAGE <LANGID>, <SUBLANGID>, чтобы указывать язык следующих ресурсов:

    lang_en.rc2

    LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
    STRINGTABLE
    BEGIN
        IDS_STRING1 "Stack Overflow"
        IDS_STRING2 "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky."
    END
    

    lang_de.rc2

    LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
    STRINGTABLE
    BEGIN
        IDS_STRING1 "Stapelüberlauf"
        IDS_STRING2 "Stack Overflow (englisch für Stapelüberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen können."
    END
    
  4. Создайте исполняемый файл и проверьте его в редакторе ресурсов, чтобы увидеть, действительно ли ресурсы включены для нескольких языков.Вместо использования редактора ресурсов вы также можете открыть файл .exe в Visual Studio, чтобы проверить его ресурсы.Например, демонстрационная версия .exe, которую я создаю для этого ответа, при открытии в Visual Studio выглядит следующим образом:

    Multi language string table

В коде вы можете загружать ресурсы как обычно, Windows автоматически загружает языковой ресурс, который лучше всего соответствует текущей локали пользователя.Если он не находит соответствия, он возвращается к английскому языку.

Если вы хотите явно загрузить ресурс для данного языка, вы можете сделать это с помощью функций ресурсов, которые имеют параметр языка, напримерFindResourceEx().

Включая стандартные ресурсы MFC

Без дальнейших церемоний стандартные ресурсы MFC будут включены только в "основной" язык, которыйнастраивается в свойствах ресурса проекта.

В проектах, где я использовал этот подход, мне не нужны были стандартные ресурсы MFC.Ниже приведена лишь непроверенная идея о том, как это можно сделать.

В каждом файле .rc2 для конкретного языка, который не является "основным" языком, добавьте #include s дляСтандартные ресурсы MFC после строки LANGUAGE, например:

LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL

#ifdef __AFXRES_RC__
    #undef __AFXRES_RC__    // To be able to include multiple language versions of afxres.rc
#endif
#include "l.deu\afxres.rc"  // Standard MFC resources

STRINGTABLE
BEGIN
    IDS_STRING1 "Stapelüberlauf"
    IDS_STRING2 "Stack Overflow (englisch für Stapelüberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen können."
END

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

...