Как создать языковые сателлитные библиотеки DLL для решения C ++ (MSVC 2008)? - PullRequest
4 голосов
/ 16 марта 2011

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

Я смотрел на MSDN и другую помощь, но я совершенно запутался в механике создания языковых DLL.

У нас есть английские ресурсы в самом EXE-файле.Насколько я понимаю, теперь нам нужно создать проект (ы) DLL с именем MyAPPXXX.dll.

Я не уверен, как мы должны это сделать.Есть только ОДИН файл ресурса / rc и различные разделы в файле, или файл rc скопирован для каждого языка с заменой переводов?

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

Нужна ли одна DLL для каждого языка, или у нас один и тот же проект с несколькими конфигурациями - и если последний, как это делается?

Вот список страниц, о которых я читалэто - но противоречивая информация и мое невежество оставляют меня в замешательстве:

http://msdn.microsoft.com/en-us/library/24b2tcy0%28vs.71%29.aspx

http://msdn.microsoft.com/en-us/library/8fkteez0%28vs.71%29.aspx

http://www.codeproject.com/KB/locale/multilingual.aspx

http://www.codeproject.com/KB/cpp/mult_lang_support.aspx

http://www.codeproject.com/KB/locale/MultiLangSupportMFCExtDLL.aspx

http://support.microsoft.com/kb/198846

http://www.codeguru.com/cpp/w-p/dll/mixeddlls/article.php/c12069

http://www.codejock.com/support/articles/mfc/general/g_multilang.asp

http://msdn.microsoft.com/en-us/library/aa645513%28v=vs.71%29.aspx

http://support.microsoft.com/kb/188659

http://msdn.microsoft.com/en-us/library/x6h91d9w.aspx

РЕДАКТИРОВАТЬ:

Могу ли я просто иметь разные разделы файла rc для разных языков или мне нужно сделать копии файла rc- по одному на каждый язык dll?

1 Ответ

3 голосов
/ 16 марта 2011

Вы можете иметь более одного файла .rc. Единственная среда сборки от MS, где это, по-видимому, недопустимо, - это WDK (Windows Driver Kit), но там вы можете обойти его, используя операторы #include.

На самом деле то, как вы комбинируете или разделяете языки, полностью зависит от вас. Ресурсы имеют идентификатор языка, который идет с ними (вы даете его в форме LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN, хотя winnt.rh, winres.h или afxres.h могут быть включены для символических названий языков), поэтому можно использовать несколько языков несут в одной DLL. Вы также можете определить набор основных языков в .exe и разделить другие языки в один файл .dll каждый.

Однако в прошлом были проблемы с выбором языка (если это не было сделано пользователем явно), поэтому MS представила поддержку MUI в Vista.

В моих развертываниях лучшим выбором до сих пор всегда был один язык на DLL и один «основной язык» в .exe.

Я также предпочитаю отдельные файлы .rc для каждого языка, но, несомненно, можно добиться того же, используя #ifdef ...

NB. Не видел ваше обновление со ссылками, просматривая их сейчас ...


Ваша первая ссылка «Создание библиотеки ресурсов только для ресурсов» предлагает мне добавить еще один небольшой факт. Поскольку такая DLL не имеет ни точки входа, ни кода, можно использовать DLL, скомпилированную для x86, в процессе x64. LoadLibraryEx с LOAD_LIBRARY_AS_DATAFILE также разрешит его для файлов, которые содержат код.


Хорошо, что входит в файлы .rc? Обычно файлы .rc будут выглядеть примерно так:

// ...
#include "afxres.h"
// ...
LANGUAGE LANG_*, SUBLANG_*

IDR_MAINFRAME MENU
// ... language-specific menu entries

IDD_ABOUTBOX DIALOGEX 0, 0, ...
// ... language specific pre-filled dialogs, control sizes adjusted and all

STRINGTABLE
// ... language-specific *strings*
END

Итак, ответ зависит от того, что происходит. Если у вас нет меню и диалогов, требующих перевода, вы можете просто поместить языковые таблицы строк для каждого файла .rc и собрать из него DLL-файл (если вы используете /noentry, это все, что нужно). Тем не менее, если у вас есть другие элементы, кроме пустых строк, которые требуют перевода, их также необходимо включить (обычно диалоговые окна и меню являются одними из наиболее распространенных). В этом случае вы можете отрегулировать размеры и позиции элементов управления для каждого языка. Но будьте осторожны, затраты на обслуживание для этого могут быть значительными. Для этого могут быть более эффективные решения, например, wxWidgets использует так называемые сортировщики сумок для размещения длинных струн.

...