Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многоязычное приложение, Как его создать? 
:(
    Опции темы
Гость_Oleg
Дата 5.7.2004, 10:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

  Вверх
mr.DUDA
Дата 5.7.2004, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 будет использовать ресурсы из указанной длл, где хранятся все строки, диалоги, меню и прочее для выбранного языка (если конечно будет находить ресурс с требуемым идентификатором в данной длл).


--------------------
user posted image
PM MAIL WWW   Вверх
AndyY
Дата 5.7.2004, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



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



--------------------
PM MAIL WWW   Вверх
Guest
Дата 5.7.2004, 11:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
welcome на мой сайт читать статью и скачивать сорцы.

С удовольствием, но ссылку не найду.
  Вверх
mr.DUDA
Дата 5.7.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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

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



--------------------
user posted image
PM MAIL WWW   Вверх
Гость_Oleg
Дата 5.7.2004, 14:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

  Вверх
mr.DUDA
Дата 5.7.2004, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
AndyY
Дата 5.7.2004, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



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


--------------------
PM MAIL WWW   Вверх
Гость_Oleg
Дата 6.7.2004, 07:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











AndyY
Цитата
welcome на мой сайт

Всё-таки где это? Можно ссылку.
Чесно говоря как обратится к секции ресурсов не знаю и её структуры тоже не знаю. Подскажите где об этом прочесть.?
  Вверх
AndyY
Дата 6.7.2004, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4





--------------------
PM MAIL WWW   Вверх
Олег М
Дата 6.7.2004, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

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

PM MAIL ICQ   Вверх
AndyY
Дата 6.7.2004, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



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

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


--------------------
PM MAIL WWW   Вверх
Олег М
Дата 6.7.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

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

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

PM MAIL ICQ   Вверх
AndyY
Дата 6.7.2004, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



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


--------------------
PM MAIL WWW   Вверх
Олег М
Дата 6.7.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.