![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мультиязыковая поддержка [D7, WinXP]
Still Swamp © (2008-01-31 13:07:00)Есть проект - около пяти сотен формочек.
Появилась забота перевести его на английский. Подозреваю что этим дело не ограничится.
До чего я додумался для визуальных объектов:
1. Сдлеать некую софтину которая обшуршивает DFM на предмет рускоязычнх сообщений и создает к ним файл. Сопоставляющий сигнатуру и содержимое.
2. Сделать форме метод которым она обшуршивает ресурс и все свои компоненты, подставляя вместо сигнатуры данные из файла.
Для кода.
1. Оббежать код собирая все что между скобками и содержит русский. Слить это в файл заменив текст коде вызовом возвращающим значение по сигнатуре.
2. Перекомпилить.
Прежде чем затеваться с таким деянием, хочу узнать, нет ли каких иных вариантов, или может кто то все вышеописанное уже реализовал?
Still Swamp (2008-02-03 17:58:00) [1]Да ни... ну заранее обдумывать каких компонент это коснется - смысла вообще нет. К стати про птичек со скалированием. Никто не мешает в ресурсный файл выгружать не только стороки но и свойства отвечающие за размеры объектов, уж если не удалось по каким то причинам сделать все резиновым.
Вот вам и локализация с размерами.
Прикольно в общем получается. С кодом самый большой гемор.
Еще здравая идея
1. Сделал при наличии дублированных строк в разных компонентах лукапные поля на отдельный перевод. Например.
Form1.Button1.Caption = 'LinkTo.ID29873649283649238'
Form2.Button34.Caption = 'LinkTo.ID29873649283649238'
ID29873649283649238 = 'Отмена'
Очень сильно повеселело.
Игорь Шевченко (2008-02-03 14:32:00) [2]Dimaxx © (03.02.08 00:17) [39]
> Т.е. это надо (именно надо) использовать вместо уродливого
> (C as TLabel).Caption:='bla-bla'? Я так понимаю?
Можно и подставлять. Но обычно это имеет смысл, когда тип компонента заранее неизвестен, но известно, что у него есть свойство Caption...
ketmar (2008-02-03 00:44:00) [3]>[38] Still Swamp (02.02.08 15:20)
кто сказал «нельзя»? можно. сделать свой layout manager — и вперёд. только геморроя там…
Dimaxx (2008-02-03 00:17:00) [4]
> if IsPublishedProp(Label1,'Caption') then SetStrProp(Label1,'Caption', 'Blah-blah');
Т.е. это надо (именно надо) использовать вместо уродливого (C as TLabel).Caption:='bla-bla'? Я так понимаю?
Still Swamp (2008-02-02 15:20:00) [5]DVM
Я не буду гнуть пальцы естно, потому что постоянно натыкаюсь на то что не знаю, но.... можно пример где на форме что то нельзя сделать резиновым. Если можно, описание, я постараюсь представить EXE.
ketmar (2008-02-02 13:22:00) [6]>[36] DVM©(02.02.08 13:12)
>думаю MS не заморачивалась с рисованием диалогов для каждого языка
>персонально.
ах, если бы это решало проблему… но фигвам. я уже писал о «фичах» ttf-растеризатора от m$.
DVM (2008-02-02 13:12:00) [7]
> Still Swamp (02.02.08 11:33) [30]
> Все формы надо изначально планировать под произвольные размеры.
Не все можно сделать резиновым увы. Не все!!! Если бы было можно, то я думаю MS не заморачивалась с рисованием диалогов для каждого языка персонально.
Игорь Шевченко (2008-02-02 12:53:00) [8]Dimaxx © (01.02.08 23:57) [27]
> Хм, а мона примерчик как юзать сабж? Например, Label1.Caption
> менять. А то походу я "жертва" Архангельского и его "стратегии".
> .. :(
uses
TypInfo;
...
if IsPublishedProp(Label1,'Caption') then
SetStrProp(Label1,'Caption', 'Blah-blah');
Anatoly Podgoretsky (2008-02-02 12:47:00) [9]> Still Swamp (02.02.2008 11:50:31) [31]
Дальше переходим к пункту 4, который гласит - выкинуть первые три пункта и не мучаться, в Дельфи включен мощный инструмент ITE - работает, как и микрософтовские продукты MUI, через ресурсные ДЛЛ - просто, прозрачно и действительно полная локализация, а не только надписи на кнопках.
Пример есть в демос Дельфи.
Единственная проблема, возможно, это использование ТНТ, не уверен, что это работает с ним, но я не проверял.
ketmar (2008-02-02 12:25:00) [10]>[31] Still Swamp (02.02.08 11:50)
ты бы прежде чем велосипед делать, глянулд таки в сторону ITE, а?
ketmar (2008-02-02 12:24:00) [11]>[30] Still Swamp (02.02.08 11:33)
>Все формы надо изначально планировать под произвольные размеры.
гыгыгы. ты бы это Хэйлсбергу пояснил. я вообще слабо понимаю, каким местом он думал, дизайня VCL в плане визуала.
хотя нет, понимаю. он думал для Win 3.11. а потом вступило в игру страшное слово legacy.
Still Swamp (2008-02-02 11:50:00) [12]Короче концепция решения по большому счету.
Жду недостатки (только не пишите что громоздко большому кораблю большое плаванье).
1. Берем базу например FB
2. Далее делаем DLL в которую заворачиваем общение с FB а так же настройки конфига на каком языке работает клиент. DLL нужна для того что бы в проекте можно было общаться к одной базе через одно подключение.
3. Далее рисуется компонента, которая имеет возможность общаться с DLL. В компоненте приписывается путь до базы. Далее реализуются методы
- Создать дефаултный словарь из формы.
- Подменить все строки на форме родителе.
- Получить строку по идентификатору
- Сохранить строку по идентификатору.
- Делаем редактор базы для переводчиков.
Работа
Кидаем компоненту на форму.
При старте формы компонента сгружает все свои капшены в базу для языка DEFAULT, а так же удаляет все лишние записи о компонентах, которые были удалены с формы. Те фактически, следит за состоянием актуальных записей.
Переводчики начинают работу, переводчики переводят за ними.
В проекте информация о языке хранится в DLL, откуда ее выйживает каждый из компонентов проекта.
В базе требуется след идентификация
Идентификатор = ComponentName.Property
Группа - для того что бы можно было получить инфу по конкретной форме проекта. Вводится программистом в компоненту. Должно быть уникально для каждой формы. Можно использовать CreateGUID.
Момент когда появилась новая запись, что бы переводчики могли получать инфу что когда обновилось.
Ну вот.
В редакторе базы необходимо реализовать создание идентификаторов по файлу PAS млм по маске из подкатолога.
Still Swamp (2008-02-02 11:33:00) [13]На счет контролов и не влезет - ерунда.
Все формы надо изначально планировать под произвольные размеры.
1. Не делать ничего фиксированного размера.
2. Сохранять настройки пользователя.
Этого достаточно что бы избежать полностью проблем с влезет не влезет, и очень упрощает разработку, для меня самого. Не надо заниматься кройкой и шитьем.
Dimaxx
Я вот по этому разбирался.
http://megalib.com/books/923/CHMFirstPage.htm(Теория и практика использования RTTI)
ketmar (2008-02-02 01:47:00) [14]>[28] DVM©(02.02.08 00:03)
угу. и тут я опять рыдаю по поводу отсутсвия в Delphi нормального layout manager'а…
DVM (2008-02-02 00:03:00) [15]Вообще то локализация - это не тупой перевод Caption и остальных строк. Надо иметь в виду, что возможно придется кое-где и контролы сместить или в размерах изменить, т.к. надписи на другом языке могут банально не влезть.
Dimaxx (2008-02-01 23:57:00) [16]
> Все SetxxxProp используются при чтении ресурсов формы, поэтому
> ничего лишнего вроде перебора классов использовать не стоит.
> Разве что пальцы потренировать.
Хм, а мона примерчик как юзать сабж? Например, Label1.Caption менять. А то походу я "жертва" Архангельского и его "стратегии"... :(
Игорь Шевченко (2008-02-01 15:45:00) [17]Dimaxx © (01.02.08 15:32) [23]
> Объясните толком, просто я давным-давно забросил VCL и работаю
> на КОЛ...
Автор вроде над большим проектом работает, ему, как ты сам понимаешь, тонну кода тянуть не надо, она уже втянута unit'ом classes.
Все SetxxxProp используются при чтении ресурсов формы, поэтому ничего лишнего вроде перебора классов использовать не стоит. Разве что пальцы потренировать.
kami (2008-02-01 15:38:00) [18]Still Swamp (31.01.08 13:07)
Появилась забота перевести его на английский...
или может кто то все вышеописанное уже реализовал
http://www.dk-soft.org/products/dklang/
Sapersky (2008-02-01 15:35:00) [19]Есть такой вариант. Оформляем все сообщения в виде:
Type
TMsgType = (mtOK, mtCancel, ...);
Var
MsgNames : array [TMsgType] of String =
('OK', 'Cancel', ...); // в данном случае англ. локализация "встроенная"
Сначала грузим в массив MsgNames строки на нужном языке. Для большей читабельности файла локализации лучше использовать реальные названия enum'ов (mtOK=OK и т.п.), можно попробовать получить их через TypeInfo, там есть такое:
tkEnumeration: (
BaseType: PPTypeInfo;
NameList: ShortStringBase));
Как вариант, использовать в качестве имён параметров строки из встроенной английской локализации (rus: OK=Да).
Использование локализованных строк:
MessageBox(MsgNames[mtOK], ...)
Т.е. это некий баланс между автоматизацией (сообщения в массив грузятся в цикле) и красотой (mtOK понятнее чем IDFG12387GG7877ACCC3742346).
Зачем менять св-во Caption у, допустим, Label1 через SetStrProp, когда можно простым присваиванием?
См.:
Есть проект - около пяти сотен формочек.
Dimaxx (2008-02-01 15:32:00) [20]
> Потому что существует процедура SetStrProp
А для чего мне тянуть за собой тонну кода, которую тянет за собой SetStrProp, которая делает практически тоже?? Всего-то надо только заменить текст в соответствии с выбранным языком. Зачем менять св-во Caption у, допустим, Label1 через SetStrProp, когда можно простым присваиванием? Считал строки и присвоил...
Объясните толком, просто я давным-давно забросил VCL и работаю на КОЛ...