| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
С удовольствием, но ссылку не найду. |
| Автор: mr.DUDA 5.7.2004, 13:24 | ||
Вот что предлагает AndyY:
|
| Автор: Гость_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
Всё-таки где это? Можно ссылку. Чесно говоря как обратится к секции ресурсов не знаю и её структуры тоже не знаю. Подскажите где об этом прочесть.? |
| Автор: 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 | ||
Что-то сильно хитровыдуманный способ. Нафига ехешник-то менять. Лучше уж при выводе элементов управления изменять их тексты раз уж на то пошло |
| Автор: AndyY 6.7.2004, 12:51 |
| Олег М экзешник менять не надо. только секцию ресурсов в памяти. Это совсем просто - разобраться с его структурой. Насчет замены текста при выводе контролов - не понял, почему лучше. Вопрос - откуда беруться тексты, как их собрать в одно место чтобы заслать переводчикам, как решить вопрос со string table, как всей команде девелоперов не забыть в каждом диалоге для каждого вновь добавленного контрола менять текст. Я уж не говорю про то, что (к примеру) в MFC предполагается, что некоторые строки лежат в ресурсах. |
| Автор: Олег М 6.7.2004, 12:57 | ||
Я так понял ты больше беспокоился о структуре меню и наборе контролов. А где ты будешь брать тексты чтобы подставлять их в ресурсы. Каждому контролу присваивается идентификатор, по которому можно найти текст для него, в зависимости от языковых настроек. Причём здесь команда девелоперов? |
| Автор: AndyY 6.7.2004, 14:18 |
| Олег М Видимо неправильно понял вашу идею, мне казалось что речь идет о наборе ::SetDlgItemText в обработчике WM_INITDIALOG. Решение не устраивает по причине необходимости при изменениях в ресурсах модифицировать код локализации, что не нужно делать в моем варианте. Приведите pls ваш вариант. |
| Автор: Олег М 6.7.2004, 14:38 |
| AndyY Извини - своего варианта, собственно, нет. Так слова. Твоя идея в принципе понятна - минимум усилий при программировании самого приложения. Но что-то где-то не так, пока не соображу где. |