![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Гость_Oleg |
|
|||
Unregistered |
Есть русскоязычное приложение MFC с выводом текста в окна и модальными диалогами . Возникла необходимость сделать параллельно англоязычную копию. Как поступить с текстом в окнах понятно, сгруппированный в один файл текст перевожу и помещаю в другой файл. Выбор между ними с помощью define…. А как быть с ресурс файлом? Я его тоже могу перевести, но как заставить компилятор выбрать именно тот файл, который нужно? Есть в файле *.rc define AFX_TARG_RUS, но он только там находится и откуда он поступает не понятно.
И есть ли возможность включить в ресурс файл, файл определения текстовых строк? А может быть есть специальные средства управления многоязычностью? |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
В свойствах любого ресурса можно выбрать язык (правклик, Properties). Для компиляции проекта с выбором языка, нужно зайти в Project Settings, потом - в Resources и выбрать язык. Минус при этом - это то, что в пределах одного проекта можно иметь только 1 вариант каждого ресурса с одним именем (т.е. нельзя сделать например 2 строки с именем IDS_STRING1).
Поэтому для создания многоязыкового приложения потребуется: 1) создать EXE, в которой используются ресурсы на "основном" языке (например, на русском) 2) создать и скомпилировать 1 или несколько длл, в которых создать строковые, диалоговые и проч. ресурсы для отдельных языков - например, SomeApp_ru.dll, SomeApp_en.dll и т.п.; идентификаторы ресурсов должны совпадать с используемыми в EXE ! 3) в процессе выполнения основной программы, при смене языка подгружать длл и вызывать AfxSetResourceHandle(hDll) Таким образом, MFC будет использовать ресурсы из указанной длл, где хранятся все строки, диалоги, меню и прочее для выбранного языка (если конечно будет находить ресурс с требуемым идентификатором в данной длл). -------------------- ![]() |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
сделать различные ресурсы для разных языков интерфейса - достаточно просто, тут проблем не возникает.
значительно сложнее все экземпляры ресурсов потом поддерживать и обновлять одновременно. посему - welcome на мой сайт читать статью и скачивать сорцы. |
|||
|
||||
Guest |
|
|||
Unregistered |
С удовольствием, но ссылку не найду. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Вот что предлагает AndyY:
-------------------- ![]() |
|||
|
||||
Гость_Oleg |
|
|||
Unregistered |
mr.DUDA может я мало что понял, но понял так:
Некая функция из DLL-ки изменяет тексты в программе (которая запущена, иначе как заработает эта DLL-ка) в секции ресурсов. Т.е. она должна изменять саму работающую программу. А кто её туда пустит????? Разве секция ресурсов не защищена??? Это по п. 1. По п. 2. А какими функциями узнать где хранятся тексты, выводимые в диалоге? Скорее подмена указателей на скомпилированный диалог вернее будет. Но мне собственно одновременно, в рантайме, два языка не нужны. Достаточно лёгким движением руки сделать изменения в программе (поменять define) и перекомпилировать программу. Но двуязычное (многоязычное) приложение, совет mr.DUDA тоже интересно. Пригодится. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Гость_Oleg
На этот вопрос я (если честно) и сам не нашёл ответа. Нужно переадресовать его AndyY. -------------------- ![]() |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
там ведь сорцы есть (в awin), misc_resource.h.
идея в том, что меняем содержание секции, в которой хранятся ресурсы. подменяем естественно в памяти, а не на диске. Изменить атрибуты доступа к странице - проблем нет. плюсы в том, что остальные свойства - как то структура меню, наборы контролоав и их стили в диалоге - остаются постоянными. При поддержке языков больше десятка это становится большой ценностью. |
|||
|
||||
Гость_Oleg |
|
|||
Unregistered |
AndyY
Всё-таки где это? Можно ссылку. Чесно говоря как обратится к секции ресурсов не знаю и её структуры тоже не знаю. Подскажите где об этом прочесть.? |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
||||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Что-то сильно хитровыдуманный способ. Нафига ехешник-то менять. Лучше уж при выводе элементов управления изменять их тексты раз уж на то пошло |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Олег М
экзешник менять не надо. только секцию ресурсов в памяти. Это совсем просто - разобраться с его структурой. Насчет замены текста при выводе контролов - не понял, почему лучше. Вопрос - откуда беруться тексты, как их собрать в одно место чтобы заслать переводчикам, как решить вопрос со string table, как всей команде девелоперов не забыть в каждом диалоге для каждого вновь добавленного контрола менять текст. Я уж не говорю про то, что (к примеру) в MFC предполагается, что некоторые строки лежат в ресурсах. |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Я так понял ты больше беспокоился о структуре меню и наборе контролов. А где ты будешь брать тексты чтобы подставлять их в ресурсы. Каждому контролу присваивается идентификатор, по которому можно найти текст для него, в зависимости от языковых настроек. Причём здесь команда девелоперов? |
|||
|
||||
AndyY |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Олег М
Видимо неправильно понял вашу идею, мне казалось что речь идет о наборе ::SetDlgItemText в обработчике WM_INITDIALOG. Решение не устраивает по причине необходимости при изменениях в ресурсах модифицировать код локализации, что не нужно делать в моем варианте. Приведите pls ваш вариант. |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
AndyY
Извини - своего варианта, собственно, нет. Так слова. Твоя идея в принципе понятна - минимум усилий при программировании самого приложения. Но что-то где-то не так, пока не соображу где. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |