VC++ 10 MFC: как правильно делать локализацию
Я парень.NET, которому приходится работать над приложением MFC. Приложение представляет собой исполняемый файл VS2008 MFC, который я преобразовал в VS2010. Первоначальные разработчики сделали локализацию, указав имя файла.txt с парами ключ-значение в нем в командной строке приложения. Установленные ярлыки для исполняемого файла указывают другой файл.txt в зависимости от страны, в которой устанавливается приложение. Это, конечно, не работает, если вы просто запускаете.exe напрямую. Это кажется странным способом сделать что-то для меня.
Я хочу сделать это с помощью MFC, но у меня возникают трудности с поиском окончательных ответов в Google. Насколько я понимаю, что таблица строк в файле.rc должна использоваться для этой локализации? Это лучшая практика для МФЦ?
Что касается таблицы строк, я прочитал, что практикой является создание нескольких таблиц строк, каждая для своего языка. Как приложения MFC выбирают какой язык использовать? Основано ли это на текущих настройках языка машины или я могу управлять этим (может быть, мы хотим, чтобы язык был указан установщиком Wix.msi, который мы также создаем)?
Я также читал, что встраивание всех ресурсов в приложение MFC перестало быть популярным, и что теперь вам следует компилировать отдельные ресурсы.dll? Разве это правда плохо расследовать, как это сделать...
Наконец, мне нужно сделать что-то особенное, чтобы заставить MFC поддерживать Unicode или MFC Unicode по умолчанию?
Спасибо
2 ответа
Идея заключается в том, что все локализуемые элементы должны храниться в ресурсах. Стандартные объекты пользовательского интерфейса, такие как меню и диалоги, автоматически сохраняются там (ресурсы) для вас, но такие элементы, как строковые литералы (например, сообщения об ошибках, сообщения в сообщениях,...), должны извлекаться из исходного кода в таблицу строк. Эта моя короткая статья о проекте кода демонстрирует, как легко извлечь строки из таблицы строк в вашем коде.
Примечание. В вашем скрипте ресурсов должна быть только одна строковая таблица (.rc).
С этого момента вы можете переводить свои ресурсы и создавать DLL-библиотеки ресурсов (также называемые спутниковыми DLL). Идея состоит в том, что вы сохраняете разные копии файлов.rc для каждого языка. Каждый перевод компилируется в DLL без кода, которая действует как контейнер для ресурсов.
Эта другая моя статья о проекте кода позволяет вам легко загружать библиотеки ресурсов в соответствии с настройками системы или предпочтениями пользователя: код просматривает среди ваших библиотек ресурсов ресурсы, язык которых лучше всего соответствует настройкам пользователя (в зависимости от языка пользовательского интерфейса и региональных настроек). Код также позволяет легко создавать меню со всеми доступными языками. Таким образом, ваш пользователь может переопределить выбор по умолчанию.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: мое объявление следует. Не стесняйтесь пропустить:-)
Что касается перевода ресурсов, управления переводами и создания библиотек ресурсов, вы можете проверить appTranslator.
КОНЕЦ ОБЪЯВЛЕНИЯ:-)
Что касается Unicode, MFC поставляется с версиями кода ANSI и Unicode. Вам решать, хотите ли вы создать приложение ANSI или Unicode: просто сделайте свой выбор на первой странице настроек проекта. Конечно, если вы начинаете с нуля, вам обязательно следует использовать Unicode. Но если устаревшие причины вынуждают вас оставаться ANSI/MBCS, не беспокойтесь слишком сильно: это не помешает вам локализовать ваше приложение.
Несколько лет назад, когда мне приходилось работать с несколькими языками в MFC, мы использовали отдельные библиотеки ресурсов. Все, что вам нужно сделать, это сделать один вызов для переключения, который обрабатывает функции ресурсов, которые будут использоваться, и все было автоматически с этого момента.
Вам нужно сделать больше, чем просто изменить строки. В частности, в диалогах будут строки, и вам может потребоваться изменить макет, если эти строки станут слишком длинными после перевода.