![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| sergio_1982 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 11.9.2006 Репутация: нет Всего: нет |
Здраствуйте Ув. коллеги.
Подскажите пожалуйста, как сделать мультиязычный интерфейс в приложении? Например, по умолчанию интерфейс на русском, а при клике на пункт меню English, все компоненты меняют свои кепшины... Заранее благодарен! |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
||||
|
||||
| ALeXandrK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
А это чудо позволяет пользователям программ локализовать твое приложение (создать свой INI со своим переводом) или это может только разработчик? Переформулирую: локализация происходит при загрузке исполняемого файла или во время компиляции? Как понял, на сайте написано, что все записывается в INI, а значит любой может создать свою локализацию. Это сообщение отредактировал(а) ALeXandrK - 24.8.2007, 22:06 -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
|||
|
||||
| Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Там на сайте есть HowTo в котором приведён весь код необходимый для загрузки:
=) Т.е. получается, что локализация произходит при загрузке. И судя по всему, для того чтобы изменить язык не перезапуская программу придётся пересоздать все формы... |
||||
|
|||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
я делал так локализацию...
Пробегаюсь по всем формам с помощью Screen, на каждой форме пробегаюсь по Контролам, и записываю все примерно так, в ини файл [_form_] c= h= [ObjectName] c= h= Где c - Caption, а H - hint Каждую форму записываю в файл название которого. <Имя формы>.lng В таком же духе читаю эту информацию. Для локализации достаточно один раз запусть запись в lng, затем копировать все эти файлы в другую папку, и переводить. Можно также применить модуль TypInfo, тогда вообще все сделается очень быстро и для любых контролов. Присоединённый файл ( Кол-во скачиваний: 12 )
LocalLng.pas 12,05 Kb-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 3 Всего: 9 |
sergio_1982, Я покажу свой путь, как я сделал много-языковость ;)))
Первое: Я умел немного работать с XML-Data Binding`ом и поэтому пришел к выводу, что файлы настроек языка будут построены на XML Второе: Я понял, что может быть и не быть, файла с языком, поэтому я сделал все не обходимое в дизайн-тайме и ран-тайме, т.е задал язык по умолчанию - выбрал англ. - т.к. пусть с горем-пополам но юзер разберется Третье: Я понял что юзер может быть и не русским и англичанином, потому я сделал на юникоде ) Пришел к выводу, что все будет выглядеть так: 1. Прога ищет в папке запуска другую папку "language" и названия всех файлов с расширением lng выводит в окно настроек языка 2. в общем файле настроек задан файл языка к примеру "english" при заданном языке прога ищет в папке языков, если не нашла, то язык по дефолту 3. файл языка подчиняется стандарту к примеру:
4. Дальше File->New->XML и жму XML Data Binding - формируется инклуд позваляющий очень просто работать с файлом настроек языка ну а дальше дело техники ;) Удачи |
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
А я этим пользуюсь, с юникодом дружит http://www.dk-soft.org/download.php?lang=ru&cat_id=4
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
ага, если формы динамически создаются? -------------------- There are always someone smarter than you... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
ZBugz, в DKLang все константы приходится заключать в функцию-обёртку?
А как там дело обстоит с resourcestring? Обращения к ним тоже нужно "оборачивать"? The Kryvich's Delphi Localizer, насколько я понял сам выдаёт нужную "resourcestring" в зависимости от выбранного языка. Кстати, интересно, как у них это реализовано |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
MetalFan,
ну тут уж... твои проблемы... все равно они в Screen появятся... что еще можно лучше предложить... для статистических лучше решения не найдешь... по крайней мере вручную писать для каждого контрола ключики... не придеться... а только лишь переводить... Это когда программа маленькая... с несколькими окнами... то можно в ручную, а когда в программе за 30 форм... то тут уж... на один перевод может уйти весь день.... (если вручную) -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Там все просто. Кидаешь компонент на форму. Он автоматом генерит все Caption всех компонентов на форме в файл. Ты его переводишь как хочешь. При добавление в проект новых компонентов, он тебе догенерит строки в исходный шаблон. Если ты удалишь DK и заново кинешь на форму, он перегенерит исходный файл, причем 90% что подругому, т.е. номерация строк может отличаться. Насчет resourcestring незнаю, непользовал, потому что мутерно. |
|||
|
||||
| Lence |
|
||||||
|
Чухарадземадзупэ ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 9.5.2006 Где: Ташкент Репутация: 3 Всего: 3 |
Если выбор языка зависит от языка ОС, то лучший вариант через resourcestring. Очень удобно когда много мессаг с одним текстом выпрыгивают. Один раз вбил и юзаешь его на протяжении все простыни проекта.
Если же пользовательсам выбирает себе язык - то один из варинтов - который предложил lukas Либо как обычный ини . Я делал с ини. Получилось следущее - создал отдельный модул с процедуркой принимающая булевые значения, на каждую форму - тру или фалс.
а внутри проверял - если тру значит каждому компоненту на такойто форме присваивал значению caption стринг из ини ... примерно так
где
тут же параллельно вводил в этот самый ини файлик сответствующий капшн... ключи - обчнфе цифры, не нужно выдумывать имена.... довольно удобно тем, что любой другой потом сможет перевести на свой язык и нормально работать с программой. Однозначно кодировку нужно указывать ... --------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой .... |
||||||
|
|||||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
А я использую компонентик, там вбиваешь все стринги и вызываешь их когда тебе надо, т.е. все caption находятся в нем. Ну и DKLang все это обрабатывает. |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
А почему про Integrated Translation Environment никто не вспоминает? Самый лучший способ, потому что не трубует никаких добавлений в код.
Еще есть трансляция GnuGetText для Delphi. |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
например в моем коде... количество килобайт исчисляется даже не в десятки, а намного меньше...
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Lence |
|
|||
|
Чухарадземадзупэ ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 9.5.2006 Где: Ташкент Репутация: 3 Всего: 3 |
зачем добавлять лишний код компонентоа, когда можно написать самому, причем понимая то, что делаешь и размер нормальный.
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой .... |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Зачем использовать Delphi, если можно написать на асме, "причем понимая то, что делаешь и размер нормальный"? Зачем использовать VCL, если можно написать на WinAPI? Да все за тем же - чтобы было меньше гемороя и проще вносить изменения... -------------------- ![]() |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 3 Всего: 9 |
aktuba, В принципе можно сделать один раз универсальный компонент для языковой дури )))
Алгоритм: 1) Открыть XML 2) Прочитать очередное имя_атрибута 3) Сделать строку T | имя_атрибута, получим класс 4) Найти такой класс 5) Добавить значение атрибута в caption, text в зависимости от других свойств в атрибуте характеризующих компонент 6) Перейти к следующему ноду |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
И получим огромные тормоза при загрузке, так как поиск по неупорядоченному нехешированному строковому массиву (массив классов/кепшенов компонентов) занимает очень значительное время.
|
|||
|
||||
| HappyLife |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: нет Всего: 8 |
Я создал очень простой класс.
Он требует добавить все "многоязыковые" компоненты вместе с заголовком и именем текста в INI в один большой список. Что-то типо
В классе уществует метод
После его вызова меняется INI файл и мой класс пробегается по всем добавленным в общий список компонентам и меняет их кепшены вместе с хинтами. Очень хорошо работает. Это сообщение отредактировал(а) HappyLife - 3.9.2007, 16:48 |
||||
|
|||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
HappyLife,
я же говорю можно пробежаться по всем компонентам на форме... и сделать типа параметра, если tag=13 значит не переводим... и т.д... этот метод я использовал в своей программе. (в моей подписи).. только в след. раз я использую кое что более лучшее чем ини-файл... загрузка будет моментальной... да и кстати с ини файлами загрузка перевода на более 30 форм очень быстрая... почти незаметная... ;) Это сообщение отредактировал(а) lukas - 3.9.2007, 19:33 -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Такой компонент даже есть =)))) Поищи на форуме - Quadr0 делал... Правда мне он показался неудобным... -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |