Вниз
Скачать: CL | DM;

Возможно ли поменять resourcestring в рантайме?   Найти похожие ветки 

← →
Дмитрий Белькевич   (2009-06-22 17:25) [0]

Можно ли достучаться до resourcestring"ов в памяти и их поменять?

Подключение ресурсных длл не интересует.


← →
Сергей М. ©   (2009-06-22 17:34) [1]

resourcestring
 s = "My  string";

procedure TForm1.Button5Click(Sender: TObject);
var
 pStr: PChar;
begin
 showmessage(s);
 pStr := PChar(s);
 strcopy(pStr, "Моя строка");
 showmessage(pStr);
end;


Это имелось ввиду ?


← →
Дмитрий Белькевич   (2009-06-22 17:48) [2]

>Это имелось ввиду ?

Развиваем проблему. Возможно ли пройтись по всем resourcestring"ам программы, и их поменять, что бы не пришлось перечислять все строки, использующиеся в программе.


← →
Сергей М. ©   (2009-06-22 17:51) [3]

На что поменять ?
Приведи пример ..


← →
Palladin ©   (2009-06-22 17:54) [4]

перевод хотит сделать, 100 пудов )


← →
Дмитрий Белькевич   (2009-06-22 18:00) [5]


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"


← →
Дмитрий Белькевич   (2009-06-22 18:01) [6]


> перевод хотит сделать, 100 пудов )


Ну от местных шаманов ничего не скроешь ;)


← →
Palladin ©   (2009-06-22 18:10) [7]

осталось только узнать, свое ли али чужое )


← →
Дмитрий Белькевич   (2009-06-22 18:11) [8]

>осталось только узнать, свое ли али чужое )

Своё к счастью ;)


← →
Дмитрий Белькевич   (2009-06-22 18:52) [9]

Пока нашел интересную идею по поводу перехвата LoadResString:

   FResourceStringsHook := THook.Create (@System.LoadResString,
@LoadResString);
   FResourceStringsHook.Enabled := True;

Попробую развить идею...


← →
Дмитрий Белькевич   (2009-06-22 18:56) [10]

Немного, правда, не то, что хотелось изначально... Но, возможно, получится то, что нужно.


← →
Дмитрий Белькевич   (2009-06-22 19:11) [11]

Еще один вопрос. Можно ли как-то компилятору точно указать idшники resourcestring"ов, в которые компилятор их поместит?


← →
Игорь Шевченко ©   (2009-06-22 20:00) [12]


> Еще один вопрос. Можно ли как-то компилятору точно указать
> idшники resourcestring"ов, в которые компилятор их поместит?
>


нет. Если бы было можно, я бы не маялся классической локализацией. Можно узнать, какие id сгенерирует компилятор по drc-файлу.


← →
Дмитрий Белькевич   (2009-06-22 20:49) [13]


> нет. Если бы было можно, я бы не маялся классической локализацией.


Ясно.


> я бы не маялся классической локализацией.


Классическая локализация несколько неудобна. Так как нужно создавать (и/или исправлять) дллки (или экзешники, что еще хуже), придётся обучать переводчиков каким-то специальным инструментам перевода (или свои делать), что для нескольких (дясятков) языков непрактично. С текстовым файлом гораздо проще.

Интерфейс уже весь переводится с помощью файла (обычные юзеры, опять же, могут поправить и нам файл переслать, что с дллкой выполнить сложно).

На выходе получается такой файл (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 22:58) [14]

Дмитрий Белькевич   (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-23 00:22) [15]

Т.е. путь Christian"a Ghisler"a вам обоим чем-то не подходит?


← →
RWolf ©   (2009-06-23 10:06) [16]


> Т.е. путь Christian"a Ghisler"a вам обоим чем-то не подходит?
а что это за путь, можно узнать?


← →
DVM ©   (2009-06-23 10:54) [17]

Имхо, локализация - это не только замена всех надписей на кнопках и т.д. Это и подгон размеров контролов под возможно невмещающиеся надписи на другом языке и много еще чего.


← →
Игорь Шевченко ©   (2009-06-23 11:10) [18]

DVM ©   (23.06.09 10:54) [17]

Без подгонки обходимся, с острой необходимостью подгонки не сталкивались


← →
clickmaker ©   (2009-06-23 11:25) [19]

> подгон размеров контролов под возможно невмещающиеся надписи
> на другом языке

[x] подг. разм. контролов под возм-но невмещ-ся надп. на др. яз.
-)


← →
DVM ©   (2009-06-23 11:30) [20]


> clickmaker ©   (23.06.09 11:25) [19]

ЭТО ЧТО?


← →
brother ©   (2009-06-23 11:34) [21]

> ЭТО ЧТО?

при подгонке контролов сокращения канают))))


← →
Дмитрий Белькевич   (2009-06-30 14:04) [22]


> Я смотрю, у дураков мысли сходятся - есть предложение обменяться
> опытом/наработками.


Возвращаясь к теме. В общем-то обмениваться особенно нечем. Модуль перевода VCL я как-то выкладывал, Можно поискать в бакапах форума, мало что изменилось с тех пор. Могу еще раз закинуть, пишите, Игорь, на мыло, которое я оставляю в форуме.

По переводу ресурсных строк. Сделал очень просто, что бы долго не заморачиваться. Написал наследника от TStringList, переписал метод Get, что бы при выходе за границы листа не валилось исключение, можно, в принципе, как-то специально это обрабатывать или просто ограничится TStringList"ом.

Строчные константы поменял на численные, код сильно не распух. Было: rsTemplEdit стало: rs[rsTemplEdit]. rs - глобальный стринглист. Проблем с поиском ресурсных строк по коду почти не было - компилятор сам все места показал. Только в Format"ах была проблема, т.к. он и строчные и числовые константы принимает - сделал глобальный поиск по коду и поменял, где нужно. В initialization одного из модулей загружаю список строк в стринглист из соответствующего файла. Можно названия файлов к локали привязать, либо еще как-то сделать, например, перегружать в рантайме. У меня переключать интерфейс в рантайме не получится, базы немного разные в разных языках, ограничился инишкой с указанием языка, и на это завязал название файла.


> подгон размеров контролов под возможно невмещающиеся надписи


У нас интерефейс изначально на русском разрабатывался. А он статистически длиннее английского. Немного беспокоюсь за немецкий - он вроде бы еще длиннее. Вообще, критической необходимости что-то подгонять пока не было.


← →
Игорь Шевченко ©   (2009-07-01 01:14) [23]

Дмитрий Белькевич   (30.06.09 14:04) [22]


> Модуль перевода VCL я как-то выкладывал


Не совсем понимаю, о чем идет речь - если переводятся стандартные компоненты/сообщения, то мы работаем с пакетами (vclxx100.bpl и т.п.), а их как бы переводить не совсем удобно.


← →
Дмитрий Белькевич   (2009-07-01 13:34) [24]


> Не совсем понимаю, о чем идет речь - если переводятся стандартные
> компоненты/сообщения, то мы работаем с пакетами (vclxx100.
> bpl и т.п.), а их как бы переводить не совсем удобно.


Нет, не стандартные, а все обычные интерфейсные компоненты - меню, кнопки и прочее.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.009 c
15-1263131112
Студент Игорь
2010-01-10 16:45
2010.03.28
Помогите новичку


2-1264684555
Valior
2010-01-28 16:15
2010.03.28
бд на дельфях


2-1264496780
Oleg196lora
2010-01-26 12:06
2010.03.28
Странность в работе try..except


15-1263112641
Nic
2010-01-10 11:37
2010.03.28
Соединение из Delphi MSSQL Server через RDP. Как?


15-1263224540
GDI+
2010-01-11 18:42
2010.03.28
Ура!!! В Украине ВД изобредли...




   Наверх