Вы можете встроить несколько языковых ресурсов в один файл .exe без использования библиотек ресурсов.Редактор ресурсов Visual Studio не поддерживает этот вариант использования, поэтому сценарии ресурсов необходимо редактировать вручную, используя текстовый редактор.
Чтобы определить ресурсы, используйте файлы .rc2, которые редактор ресурсов Visual Studio не будет пытаться изменить.Обязательно храните файлы .rc2 с кодировкой Unicode (UTF-16 LE) и всегда заканчивайте их разрывом строки , в противном случае компилятор ресурсов не будет работать.
Шаги
- Проект, созданный с помощью мастера приложений MFC, уже содержит пустой файл .rc2, который мы можем использовать в качестве нашего "основного" файла .rc2.В противном случае следуйте документации или создайте новое приложение MFC с помощью мастера, чтобы проанализировать, как включен файл .rc2.
В основном файле .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
Создание файлов .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
Создайте исполняемый файл и проверьте его в редакторе ресурсов, чтобы увидеть, действительно ли ресурсы включены для нескольких языков.Вместо использования редактора ресурсов вы также можете открыть файл .exe в Visual Studio, чтобы проверить его ресурсы.Например, демонстрационная версия .exe, которую я создаю для этого ответа, при открытии в Visual Studio выглядит следующим образом:
В коде вы можете загружать ресурсы как обычно, 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, который обычно предотвращает множественные включения.В нашем случае это нормально, потому что ресурсы окажутся в разных разделах языковых ресурсов исполняемого файла.