Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать многоязычный интерфейс 
:(
    Опции темы
Alex
Дата 10.5.2005, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Untitled DocumentПередо мной два года назад встала задача перевода программы на разные языки. На тот момент разработка программы вилась уже более двух лет. Я начал искать в Интернете информацию как же лучше это сделать. Первое, что удалось найти, это когда в ini -файле хранится название на родном языке программы и соответствующее ему название на языке, на который вы хотите перевести программу. Подробно это описано на http://www.realcoding.net/article/view/1586. Я создал демо проект и сразу увидел недостатки этого способа:       Не понятно, а как переводить какие-то сообщения, которые я показываю по ходу работы программы, содержащие многострочный текст (разделенный #13#10)       В uses части модуля trans. pas я должен был прописать все модули, в которых описаны компоненты, которые я хочу переводить, а потом еще и дописать соответствующие условия для каждого из типа компонента в функцию TranslateForm. Это очень не удобно. Есть, конечно, вариант сесть и один раз написать эту функцию практически на все компоненты, но в этом случаи при подключении такого модуля к проекту не использующему, к примеру, компоненты для доступа к БД вы все равно потянете все модули для работы с ними за собой. В результате размер вашего проекта не обоснованно большим.       В файле словаря для каждого языка нужно хранить фразы в исходном языке, это неоправданно увеличивает размер файла словаря (не будем забывать, что предельный размер ini -файла не должен превышать 32Кб). При изменении фразы в исходном языке вы должны не забыть, тут же поменять эту фразу во всех языках иначе не будет соответствия.       Т.к. проект разрабатывался уже давно и форм он содержал уже достаточно мысль о том, что нужно пройтись по всем формам и скопировать все значения из свойства Caption в словарь меня очень не прельщало.   Второй способ это воспользоваться встроенным менеджером, который встроен в Delphi. Для изучения этой технологии я взял за основу демо проект, который поставляется вместе с Delphi (проект находится в папке …\Demos\RichEdit). Для того, что бы воспользоваться данной технологией мне нужно было все строковые значения, используемые в коде программы и которые нужно было перевести объявить как resourcestring. Я потратил не мало времени, все это сделал, воспользовался менеджером, мне все понравилось. Радость моя была не долгой. В результате дальнейшего выяснились следующее подводные камни:       Не поддерживаются не стандартные компоненты (иногда и стандартные не поддерживаются) и сделать с этим ничего нельзя.       Это ужасно нагроможденный менеджер для перевода найти в нем нужное свойство, когда у тебя на форме более 20-50 компонентов это подвиг.       Нельзя поручит переводить программу другому человеку, даже если он это очень хочет сделать т.к. для перевода вы должны отдать человеку все исходные тексты своего проекта и настроить Delphi (это не приемлемо).   Т.к проект уже нужно было выпускать, то мне пришлось пройтись и в обыкновенный текстовый файл выписать все, что я хотел перевести и разослать людям для перевода. После того как они перевели, я потратил не мало времени, что бы вставить присланный ими текст в нужное место (я проклял в тот момент все). Как вы понимаете, любая корректировка в языке требует перекомпиляции программы. Говорить в этом случаи о быстрой корректировки какого-то из языков не приходиться. Можно конечно открыть создаваемые Delphi файлы «НазваниеПроекта.АббревиатураЯзыка» редактором ресурсов и отредактировать в нем т.к. это ни что иное, как обыкновенные файлы ресурсов. Но эти изменения будут только до момента, пока вы не перекомпилируете проект, из-за этого эта возможность нам не подходит. В результате после всех мучений проект был выпущен, его интерфейс был на 4-х языках: Русский (исходный язык), Английский, Белорусский и Украинский. После выхода программы я дал себе обещание, что больше я такими вещами заниматься не буду т.к. я потратил 2 месяца напряженной работы на какой-то перевод. Нужно было искать другой способ, что бы от меня как от программиста мало, что зависело, и перевод мог легко осуществить любой желающий. Просмотрел не одну программу, которые якобы должны мне помочь делать быстро перевод моей программы на разные языки, но ни одна не смогла поглотить мою задачу. В основном они все ломались, на этапе когда дело доходило до перевода строковых сообщений. Делать было нечего и пришлось изобретать свой способ перевода, которое должно было учитывать следующее моменты:       Удобное использование методики для программиста.       Словари содержатся в обычном текстовом формате и могут быть отредактированы в любом текстовом редакторе       Размер готового проекта не должен увеличиваться из-за подключения модуля для перевода проекта.       Дать возможность не переводить одинаковые названия, к примеру, label, если оно уже один раз переведено.       Автоматическое пополнение файла языка при добавлении нового компонента или строкового сообщения в программу.   Для решения всех поставленных задач была придумана следующая схема:       Для перевода компонентов каждому компоненту свойства, которого нужно перевести в приделах проекта присваивается уникальный номер от 1  до n . Этот номер хранится в свойстве Tag . (Если компоненты имеют одинаковое значение свойства Caption, то для того, что бы не переводить два раза одно и тоже нужно присвоить одинаковый номер в свойство Tag )       Решено, что в компонентах могут подвергаться только свойства Caption и Hint исключение только для компонента RadioGroup, для которого запоминается не только Caption, но и Items .       Для перевода строковых сообщений и констант некая структура (я ее называю таблицей соответствия), в которую входит: уникальный номер (он никогда не должен повторяться в приделах проекта, но может пересекаться с уникальными номерами компонентов), имя переменной (для обращения в коде программы и не потерять нормальную читаемость кода программы) и само значение (поддерживается многострочный текст).   Решение задачи было разбито на два модуля: •  acLng.pas  – Базовый модуль для перевода. Модуль ничего не знает о компонентах и подключение его к проекту практически не отражается на размере готового проекта (сделано для того, что бы можно было использовать методику перевода для бесформенных приложений). Если функция GetLng  объекта Lng  не находит в файле языка нужные данные и свойство Update  объекта Lng  установлено в истину, то строка со значением по умолчанию из таблицы соответствия записывается в файл языка. •  acLngForm.pas  - Модуль перевода форм. В модуле все функции для перевода форм. Для пополнения файла языка значениями по умолчанию для компонентов, которые еще не входят в файл языка существует процедура CreateFileLng . Ini -файл словаря состоит из следующих секций:       Option  – Здесь хранится служебная информация. Обязательным ключом является ключ Lng  он содержит названия языка.       Component  – Здесь хранятся значение свойства Caption компонента. Уникальный номер компонента соответствует значению свойства Caption компонента в этом языке.       Hint  – Здесь хранятся значение свойства Hint компонента. Уникальный номер компонента соответствует значению свойства Hint компонента в этом языке.       Const – Здесь хранятся значения строковых сообщений. Уникальный номер сообщения по таблице соответствия соответствует значению сообщения в этом языке.   Скачать модули и демо проект можно здесь. PS: Предложенный мной способ решения задачи не на что не претендует. Он был придуман под мои задачи, модули не готовились для публикации. Если у вас есть какие-то замечания или предложения по улучшению данной технологии буду рад пообщаться. Весь этот механизм перевода был придуман для программы InstallBase, которая состоит более чем из 25 форм, размер файла словаря для нее сейчас занимает ~16Кб. 


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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