Форум: "Основная";
Текущий архив: 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.51 MB
Время: 0.004 c