Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];

Вниз

Возможно ли поменять 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 вся ветка

Форум: "Основная";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.005 c
15-1262420654
Дмитрий С
2010-01-02 11:24
2010.03.28
Вы довольны прошедем годом?


2-1264342999
Делфиец
2010-01-24 17:23
2010.03.28
Как разом очистить всю таблицу


3-1236176370
забылпароль
2009-03-04 17:19
2010.03.28
Вроде связанный запрос что-ли.. Не могу сообразить


4-1231686803
Ort
2009-01-11 18:13
2010.03.28
Как выделить все строку в Listview


15-1262986225
Юрий
2010-01-09 00:30
2010.03.28
С днем рождения ! 9 января 2010 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский