Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Многоязычное приложение


Автор: Гость_Oleg 5.7.2004, 10:36
Есть русскоязычное приложение MFC с выводом текста в окна и модальными диалогами . Возникла необходимость сделать параллельно англоязычную копию. Как поступить с текстом в окнах понятно, сгруппированный в один файл текст перевожу и помещаю в другой файл. Выбор между ними с помощью define…. А как быть с ресурс файлом? Я его тоже могу перевести, но как заставить компилятор выбрать именно тот файл, который нужно? Есть в файле *.rc define AFX_TARG_RUS, но он только там находится и откуда он поступает не понятно.
И есть ли возможность включить в ресурс файл, файл определения текстовых строк?
А может быть есть специальные средства управления многоязычностью?

Автор: mr.DUDA 5.7.2004, 11:04
В свойствах любого ресурса можно выбрать язык (правклик, Properties). Для компиляции проекта с выбором языка, нужно зайти в Project Settings, потом - в Resources и выбрать язык. Минус при этом - это то, что в пределах одного проекта можно иметь только 1 вариант каждого ресурса с одним именем (т.е. нельзя сделать например 2 строки с именем IDS_STRING1).

Поэтому для создания многоязыкового приложения потребуется:
1) создать EXE, в которой используются ресурсы на "основном" языке (например, на русском)
2) создать и скомпилировать 1 или несколько длл, в которых создать строковые, диалоговые и проч. ресурсы для отдельных языков - например, SomeApp_ru.dll, SomeApp_en.dll и т.п.; идентификаторы ресурсов должны совпадать с используемыми в EXE !
3) в процессе выполнения основной программы, при смене языка подгружать длл и вызывать AfxSetResourceHandle(hDll)

Таким образом, MFC будет использовать ресурсы из указанной длл, где хранятся все строки, диалоги, меню и прочее для выбранного языка (если конечно будет находить ресурс с требуемым идентификатором в данной длл).

Автор: AndyY 5.7.2004, 11:40
сделать различные ресурсы для разных языков интерфейса - достаточно просто, тут проблем не возникает.
значительно сложнее все экземпляры ресурсов потом поддерживать и обновлять одновременно.
посему - welcome на мой сайт читать статью и скачивать сорцы.

Автор: Guest 5.7.2004, 11:54
Цитата
welcome на мой сайт читать статью и скачивать сорцы.

С удовольствием, но ссылку не найду.

Автор: mr.DUDA 5.7.2004, 13:24
Вот что предлагает AndyY:
Цитата
Мы будем сами формировать ресурсы при загрузке dll так, как нам это нужно!
Итак, что мы имеем:

Файл компилируется с одним (основным) набором ресурсов. Пусть это будет, скажем, английский язык.
1) На DllMain (любители MFC читают CMyApp::InitInstance) вызываем некую функцию, которая изменяет значения всех текстов в секции ресурсов.
2) Текст для переведенных ресурсов читаем из текстового файла. После чтения файла можно автоматически проконтролировать, что все текстовые строки в программе переведены.
3) Попутно раскрываем макросы - например заменяем на нормальное название продукта, а - на нормальное название компании.
4) Заодно напишем функцию записи текстов из ресурсов в файл. Простым сравнением текстовых файлов мы составим задание переводчикам.

Автор: Гость_Oleg 5.7.2004, 14:46
mr.DUDA может я мало что понял, но понял так:
Некая функция из DLL-ки изменяет тексты в программе (которая запущена, иначе как заработает эта DLL-ка) в секции ресурсов. Т.е. она должна изменять саму работающую программу. А кто её туда пустит????? Разве секция ресурсов не защищена???
Это по п. 1.
По п. 2. А какими функциями узнать где хранятся тексты, выводимые в диалоге?
Скорее подмена указателей на скомпилированный диалог вернее будет.
Но мне собственно одновременно, в рантайме, два языка не нужны. Достаточно лёгким движением руки сделать изменения в программе (поменять define) и перекомпилировать программу.
Но двуязычное (многоязычное) приложение, совет mr.DUDA тоже интересно. Пригодится.

Автор: mr.DUDA 5.7.2004, 20:43
Гость_Oleg
Цитата
.е. она должна изменять саму работающую программу. А кто её туда пустит????? Разве секция ресурсов не защищена???

На этот вопрос я (если честно) и сам не нашёл ответа. Нужно переадресовать его AndyY.

Автор: AndyY 5.7.2004, 22:32
там ведь сорцы есть (в awin), misc_resource.h.
идея в том, что меняем содержание секции, в которой хранятся ресурсы. подменяем естественно в памяти, а не на диске. Изменить атрибуты доступа к странице - проблем нет.
плюсы в том, что остальные свойства - как то структура меню, наборы контролоав и их стили в диалоге - остаются постоянными. При поддержке языков больше десятка это становится большой ценностью.

Автор: Гость_Oleg 6.7.2004, 07:57
AndyY
Цитата
welcome на мой сайт

Всё-таки где это? Можно ссылку.
Чесно говоря как обратится к секции ресурсов не знаю и её структуры тоже не знаю. Подскажите где об этом прочесть.?

Автор: AndyY 6.7.2004, 12:35
http://awin.spb.ru/articles/local.html
сорцы тут:
http://awin.spb.ru/downloads/awin.html

Автор: Олег М 6.7.2004, 12:42
Цитата
1) На DllMain (любители MFC читают CMyApp::InitInstance) вызываем некую функцию, которая изменяет значения всех текстов в секции ресурсов.

Что-то сильно хитровыдуманный способ. Нафига ехешник-то менять. Лучше уж при выводе элементов управления изменять их тексты раз уж на то пошло

Автор: AndyY 6.7.2004, 12:51
Олег М
экзешник менять не надо. только секцию ресурсов в памяти. Это совсем просто - разобраться с его структурой.

Насчет замены текста при выводе контролов - не понял, почему лучше. Вопрос - откуда беруться тексты, как их собрать в одно место чтобы заслать переводчикам, как решить вопрос со string table, как всей команде девелоперов не забыть в каждом диалоге для каждого вновь добавленного контрола менять текст. Я уж не говорю про то, что (к примеру) в MFC предполагается, что некоторые строки лежат в ресурсах.

Автор: Олег М 6.7.2004, 12:57
Цитата
Насчет замены текста при выводе контролов - не понял, почему лучше. Вопрос - откуда беруться тексты, как их собрать в одно место чтобы заслать переводчикам, как решить вопрос со string table, как всей команде девелоперов не забыть в каждом диалоге для каждого вновь добавленного контрола менять текст. Я уж не говорю про то, что (к примеру) в MFC предполагается, что некоторые строки лежат в ресурсах.

Я так понял ты больше беспокоился о структуре меню и наборе контролов. А где ты будешь брать тексты чтобы подставлять их в ресурсы.

Каждому контролу присваивается идентификатор, по которому можно найти текст для него, в зависимости от языковых настроек. Причём здесь команда девелоперов?

Автор: AndyY 6.7.2004, 14:18
Олег М
Видимо неправильно понял вашу идею, мне казалось что речь идет о наборе ::SetDlgItemText в обработчике WM_INITDIALOG. Решение не устраивает по причине необходимости при изменениях в ресурсах модифицировать код локализации, что не нужно делать в моем варианте.
Приведите pls ваш вариант.

Автор: Олег М 6.7.2004, 14:38
AndyY
Извини - своего варианта, собственно, нет. Так слова.
Твоя идея в принципе понятна - минимум усилий при программировании самого приложения. Но что-то где-то не так, пока не соображу где.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)