![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ли поменять resourcestring в рантайме? [D7, WinXP]
Дмитрий Белькевич © (2009-06-22 17:25:00)Можно ли достучаться до resourcestring'ов в памяти и их поменять?
Подключение ресурсных длл не интересует.
Дмитрий Белькевич (2009-07-01 13:34:00) [1]
> Не совсем понимаю, о чем идет речь - если переводятся стандартные
> компоненты/сообщения, то мы работаем с пакетами (vclxx100.
> bpl и т.п.), а их как бы переводить не совсем удобно.
Нет, не стандартные, а все обычные интерфейсные компоненты - меню, кнопки и прочее.
Игорь Шевченко (2009-07-01 01:14:00) [2]Дмитрий Белькевич (30.06.09 14:04) [22]
> Модуль перевода VCL я как-то выкладывал
Не совсем понимаю, о чем идет речь - если переводятся стандартные компоненты/сообщения, то мы работаем с пакетами (vclxx100.bpl и т.п.), а их как бы переводить не совсем удобно.
Дмитрий Белькевич (2009-06-30 14:04:00) [3]
> Я смотрю, у дураков мысли сходятся - есть предложение обменяться
> опытом/наработками.
Возвращаясь к теме. В общем-то обмениваться особенно нечем. Модуль перевода VCL я как-то выкладывал, Можно поискать в бакапах форума, мало что изменилось с тех пор. Могу еще раз закинуть, пишите, Игорь, на мыло, которое я оставляю в форуме.
По переводу ресурсных строк. Сделал очень просто, что бы долго не заморачиваться. Написал наследника от TStringList, переписал метод Get, что бы при выходе за границы листа не валилось исключение, можно, в принципе, как-то специально это обрабатывать или просто ограничится TStringList'ом.
Строчные константы поменял на численные, код сильно не распух. Было: rsTemplEdit стало: rs[rsTemplEdit]. rs - глобальный стринглист. Проблем с поиском ресурсных строк по коду почти не было - компилятор сам все места показал. Только в Format'ах была проблема, т.к. он и строчные и числовые константы принимает - сделал глобальный поиск по коду и поменял, где нужно. В initialization одного из модулей загружаю список строк в стринглист из соответствующего файла. Можно названия файлов к локали привязать, либо еще как-то сделать, например, перегружать в рантайме. У меня переключать интерфейс в рантайме не получится, базы немного разные в разных языках, ограничился инишкой с указанием языка, и на это завязал название файла.
> подгон размеров контролов под возможно невмещающиеся надписи
У нас интерефейс изначально на русском разрабатывался. А он статистически длиннее английского. Немного беспокоюсь за немецкий - он вроде бы еще длиннее. Вообще, критической необходимости что-то подгонять пока не было.
brother (2009-06-23 11:34:00) [4]> ЭТО ЧТО?
при подгонке контролов сокращения канают))))
DVM (2009-06-23 11:30:00) [5]
> clickmaker © (23.06.09 11:25) [19]
ЭТО ЧТО?
clickmaker (2009-06-23 11:25:00) [6]> подгон размеров контролов под возможно невмещающиеся надписи
> на другом языке
[x] подг. разм. контролов под возм-но невмещ-ся надп. на др. яз.
-)
Игорь Шевченко (2009-06-23 11:10:00) [7]DVM © (23.06.09 10:54) [17]
Без подгонки обходимся, с острой необходимостью подгонки не сталкивались
DVM (2009-06-23 10:54:00) [8]Имхо, локализация - это не только замена всех надписей на кнопках и т.д. Это и подгон размеров контролов под возможно невмещающиеся надписи на другом языке и много еще чего.
RWolf (2009-06-23 10:06:00) [9]
> Т.е. путь Christian'a Ghisler'a вам обоим чем-то не подходит?
а что это за путь, можно узнать?
Германн (2009-06-23 00:22:00) [10]Т.е. путь Christian'a Ghisler'a вам обоим чем-то не подходит?
Игорь Шевченко (2009-06-22 22:58:00) [11]Дмитрий Белькевич (22.06.09 20:49) [13]
Классический метод локализации - это загрузка нужных строковых ресурсов вручную, как завещали составители Platform SDK еще во времена Windows 3.1
Объявление констант, сопоставление с ними ресурсных файлов (текстовых, кстати), компиляция ресурсных файлов вместе с проектом, явный вызов LoadString в нужных местах (или объектно-ориентированной обертки вокруг нее).
> Есть у меня мысль вообще отказаться от ресурсных строк,
> а сделать специальный класс - 'провайдер' строк, с однозначными
> idшниками, этим же классом и грузить строчки по idшникам
> из файла
Да-да, я тоже пришел к подобному
Я смотрю, у дураков мысли сходятся - есть предложение обменяться опытом/наработками.
> Единственное, что смущает - читаемость кода ухудшится.
Не думаю
procedure TfChangeCardNo.LocalizeInterface;
begin
inherited;
{ Globalizer generated code }
Self.Caption := GetResourceString(STfChangeCardNoSelfCaption, Self.Caption);
lbOldCard.Caption := GetResourceString(STfChangeCardNolbOldCardCaption, lbOldCard.Caption);
lbNewCard.Caption := GetResourceString(STfChangeCardNolbNewCardCaption, lbNewCard.Caption);
btnCancel.Caption := GetResourceString(SCancelButton, btnCancel.Caption);
{/ Globalizer generated code }
...
end;
Все свойства контролов либо изначально на "основном" языке, либо заменяются на имя контрола.имя свойства специальной утилитой (тот самый Globalizer), которая кроме всего прочего генерирует идентификаторы строк из заданного диапазона, и составляет файлы .rc и .rh
Дмитрий Белькевич (2009-06-22 20:49:00) [12]
> нет. Если бы было можно, я бы не маялся классической локализацией.
Ясно.
> я бы не маялся классической локализацией.
Классическая локализация несколько неудобна. Так как нужно создавать (и/или исправлять) дллки (или экзешники, что еще хуже), придётся обучать переводчиков каким-то специальным инструментам перевода (или свои делать), что для нескольких (дясятков) языков непрактично. С текстовым файлом гораздо проще.
Интерфейс уже весь переводится с помощью файла (обычные юзеры, опять же, могут поправить и нам файл переслать, что с дллкой выполнить сложно).
На выходе получается такой файл (rtti бывает иногда незаменим):
Form1.Action1.Caption=Print images ...
Form1.Action1.Hint=Print images
Form1.Action10.Caption=Help topics
Form1.Action10.Hint=Help topics
Form1.Action100.Hint=2/2
Form1.Action101.Caption=Cascade
Form1.Action102.Caption=Vertical tale
Form1.Action103.Caption=Horizontal tale
Нет каши со словарями, что тоже хорошо (в файле нет оригинальных, кирилических, надписей).
Главный минус - что так можно перевести только интерфейс, но не строчки в коде. Есть у меня мысль вообще отказаться от ресурсных строк, а сделать специальный класс - 'провайдер' строк, с однозначными idшниками, этим же классом и грузить строчки по idшникам из файла.
Единственное, что смущает - читаемость кода ухудшится.
Игорь Шевченко (2009-06-22 20:00:00) [13]
> Еще один вопрос. Можно ли как-то компилятору точно указать
> idшники resourcestring'ов, в которые компилятор их поместит?
>
нет. Если бы было можно, я бы не маялся классической локализацией. Можно узнать, какие id сгенерирует компилятор по drc-файлу.
Дмитрий Белькевич (2009-06-22 19:11:00) [14]Еще один вопрос. Можно ли как-то компилятору точно указать idшники resourcestring'ов, в которые компилятор их поместит?
Дмитрий Белькевич (2009-06-22 18:56:00) [15]Немного, правда, не то, что хотелось изначально... Но, возможно, получится то, что нужно.
Дмитрий Белькевич (2009-06-22 18:52:00) [16]Пока нашел интересную идею по поводу перехвата LoadResString:
FResourceStringsHook := THook.Create (@System.LoadResString,
@LoadResString);
FResourceStringsHook.Enabled := True;
Попробую развить идею...
Дмитрий Белькевич (2009-06-22 18:11:00) [17]>осталось только узнать, свое ли али чужое )
Своё к счастью ;)
Palladin (2009-06-22 18:10:00) [18]осталось только узнать, свое ли али чужое )
Дмитрий Белькевич (2009-06-22 18:01:00) [19]
> перевод хотит сделать, 100 пудов )
Ну от местных шаманов ничего не скроешь ;)
Дмитрий Белькевич (2009-06-22 18:00:00) [20]
resourcestring
s1 = 'My string1';
s2 = 'My string2';
s3 = 'My string3';
s4 = 'My string4';
s5 = 'My string5';
s1 поменять на 'My changed string1'
s2 поменять на 'My changed string2'
s3 поменять на 'My changed string3'
s4 поменять на 'My changed string4'
s5 поменять на 'My changed string5'