Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возможно ли поменять resourcestring в рантайме? [D7, WinXP]


Страницы:   1 2

Дмитрий Белькевич ©   (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'


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо