![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мультиязыковая поддержка [D7, WinXP]
Still Swamp © (2008-01-31 13:07:00)Есть проект - около пяти сотен формочек.
Появилась забота перевести его на английский. Подозреваю что этим дело не ограничится.
До чего я додумался для визуальных объектов:
1. Сдлеать некую софтину которая обшуршивает DFM на предмет рускоязычнх сообщений и создает к ним файл. Сопоставляющий сигнатуру и содержимое.
2. Сделать форме метод которым она обшуршивает ресурс и все свои компоненты, подставляя вместо сигнатуры данные из файла.
Для кода.
1. Оббежать код собирая все что между скобками и содержит русский. Слить это в файл заменив текст коде вызовом возвращающим значение по сигнатуре.
2. Перекомпилить.
Прежде чем затеваться с таким деянием, хочу узнать, нет ли каких иных вариантов, или может кто то все вышеописанное уже реализовал?
Still Swamp (2008-02-01 15:21:00) [21]Автоматически более благозвучное имя я себе не представляю.
Такие вещи самому писать не дешевле.
Я вот полдня проковырялся, освоил работу со свойствами и получил себе приемлимую крутилку для локализации форм.
Идея нужна. Писанина - дело второе.
А вот идеи нет.
Anatoly Podgoretsky (2008-02-01 15:10:00) [22]> Dimaxx (01.02.2008 14:04:16) [16]
Не надо.
Игорь Шевченко (2008-02-01 15:03:00) [23]
> Какие есть еще варианты?
1. Например вариант с заменой IDFG12387GG7877ACCC3742346 на более благозвучное имя.
2. Поискать в тырнете готовых локализаторов - их есть. Всяко дешевле, чем самому писать
Still Swamp (2008-02-01 14:22:00) [24]Вообще - с компонентами красиво получается. Кода на сотню строк, и переводы готовы.
А вот что делать с кодом - ума не приложу.
Ну допустим, я возму все исходники. Перешерстю их на предмет MessageBox('русский');
Заменю на
// IDFG12387GG7877ACCC3742346 = 'русский'
MessageBox(GetMLS(Lang, Resource, 'IDFG12387GG7877ACCC3742346'));
И что..? на меня оно потом из кода будет глядеть с укоризной.
Какие есть еще варианты?
Still Swamp (2008-02-01 14:16:00) [25]Я...я... натюрлих. Перебрать все свойства и поглядеть их типы куда веселее чем описывать каждый компонент.
Игорь Шевченко (2008-02-01 14:14:00) [26]Dimaxx © (01.02.08 14:04) [16]
> Почему?
> // В этих строках перебираем все классы компонентов, которые
> нуждаются в локализации
Вот поэтому. Потому что существует процедура SetStrProp
Dimaxx (2008-02-01 14:04:00) [27]
> Так не надо делать
Почему?
Игорь Шевченко (2008-02-01 13:33:00) [28]
> Что такое ITE?
Intergated Translation Environment
Still Swamp (2008-02-01 12:23:00) [29]Что такое ITE?
Какие есть еще варианты борьбы с текстом в коде?
Игорь Шевченко (2008-02-01 11:55:00) [30]
> А кто мешает сделать примерно так?
Так не надо делать
Dimaxx (2008-02-01 11:41:00) [31]
> Тут я не совсем отчетливо представляю себе как можно оббежать
> в рантайме все компоненты, а ни дай бог, там чье то нестандартное
> изделие попадется с каким нить свойством MyHint.
А кто мешает сделать примерно так?
var I: integer;
C: TComponent;
S: string;
begin
...
C:=Components[I];
// В этих строках перебираем все классы компонентов, которые нуждаются в локализации
if (C.ClassName='TMenuItem') and ((C as TMenuItem).Caption<>'-') then (C as TMenuItem).Caption:='bla-bla';
if C.ClassName='TRadioButton' then (C as TRadioButton).Caption:='bla-bla';
if C.ClassName='TButton' then (C as TButton).Caption:='bla-bla';
if C.ClassName='TCheckBox' then (C as TCheckBox).Caption:='bla-bla';
if C.ClassName='TGroupBox' then (C as TGroupBox).Caption:='bla-bla';
if C.ClassName='TLabel' then (C as TLabel).Caption:='bla-bla';
...
end;
Кто тебе мешает перебрать нестандартное? Например так:if C.ClassName='TShitHint' then (C as TShitHint).MyHint:='bla-bla'??
Ты же сам знаешь какие компоненты использовал...
Anatoly Podgoretsky (2008-02-01 11:03:00) [32]> @!!ex (01.02.2008 10:34:10) [10]
Да какая разница сколько форм, это экстенсивная характеристика, важнее как сделан проект, позволяет он использовать ITE или нет. Если нет, то все эти выше описаные манипуляции.
@!!ex (2008-02-01 10:34:00) [33]пять сотен формочек... нихреново...
Still Swamp (2008-02-01 00:25:00) [34]Вопрос как получить список свойств и как с ними работать - снимается. Разобрался.
Still Swamp (2008-01-31 23:13:00) [35]е мое.... а еще листы всякие которые вообще можно не найти...
Still Swamp (2008-01-31 23:09:00) [36]Вообще при более плотном обдумывании мне наиболее красивой кажется идея использовать как тут было сказано Component.Property в качестве идентификатора по той простой причине что при этом русское значение в дизайнтайме остается.
Теперь два способа построения.
1. Обшуршивание DFM. Надо писать парсер какой то. Это реально но лениво. Второй недостаток - требуется какая то предварительная подготовка как то сам по себе процесс сборки файла.
2. Действительно написать некий проц в Create формы, который при старте формы создаст файл если его не было, а потом потом тут же из него грузит значения. Те после первого старта приложение автоматом создаст необходимое, останется только перевести. Тут я не совсем отчетливо представляю себе как можно оббежать в рантайме все компоненты, а ни дай бог, там чье то нестандартное изделие попадется с каким нить свойством MyHint.
Высказывайтесь за и против.
И еще вопрос попутно. Как получить список свойств объекта? А так же тип. Без этого второй вариант несколько не жизнеспособен.
Игорь Шевченко (2008-01-31 19:01:00) [37]
> До чего я додумался для визуальных объектов:
> 1. Сдлеать некую софтину которая обшуршивает DFM на предмет
> рускоязычнх сообщений и создает к ним файл. Сопоставляющий
> сигнатуру и содержимое.
> 2. Сделать форме метод которым она обшуршивает ресурс и
> все свои компоненты, подставляя вместо сигнатуры данные
> из файла.
Собственно, сделана программка, которая смотрит русскоязычные значения свойств в dfm, заменяет их на английский текст, и генерирует код для метода Loaded формы, в котором свойствам присваиваются их русскоязычные найденные значения.
Anatoly Podgoretsky (2008-01-31 14:32:00) [38]clickmaker © (31.01.08 13:16) [1]
Могу поспорить, что никаких resourcestring и в помине нет.
Dimaxx (2008-01-31 13:50:00) [39]А куда изящнее?? У меня код локализации в OnCreate формы сидит и при добавлении контролов даже переписывать ничего не надо. Тока в ini-файл добавлять не забывай строки и все.
Still Swamp (2008-01-31 13:38:00) [40]Ну те в общем я не оригинален и более изящных методов нет?