Руссификация Lazreport
Модератор: Модераторы
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Руссификация Lazreport
Добрый всем день!
Три года работаю в Lazarus, но одну промблему решить не могу. Не могу руссифицировать Lazreport. FastReport стал ну уж очень дорогим. А часто нужно сделать быстро утилитку для винды, а печать через lazreport с аглицким меню. Да и редактор шаблона тоже. Поиграл с po-файлом языка, почитал вики. Не помогло.
Мож кто напишет здеcь простую пошаговую инструкцию для Windows. Понятно, что у всех своих забот полно и времени лишнего нет. Но дело то полезное для всего Lazarus-freepascal-сообщества. Ссылки и поиск прошу не предлагать, я по ним уже часов несколько потратил. Нужна простая, как лопата, пошаговая инструкция.
Три года работаю в Lazarus, но одну промблему решить не могу. Не могу руссифицировать Lazreport. FastReport стал ну уж очень дорогим. А часто нужно сделать быстро утилитку для винды, а печать через lazreport с аглицким меню. Да и редактор шаблона тоже. Поиграл с po-файлом языка, почитал вики. Не помогло.
Мож кто напишет здеcь простую пошаговую инструкцию для Windows. Понятно, что у всех своих забот полно и времени лишнего нет. Но дело то полезное для всего Lazarus-freepascal-сообщества. Ссылки и поиск прошу не предлагать, я по ним уже часов несколько потратил. Нужна простая, как лопата, пошаговая инструкция.
Лично я делаю это следующим образом :
В модуле главной формы проекта :
Файл 'lr_const.ru.po' в данном случае копируется в стартовую директорию приложения.
В модуле главной формы проекта :
Код: Выделить всё
uses ...... translations;
procedure TMainForm.TranslateLazReport(Lang: String);
var
UserLang, lngFolder, poFileName:string;
i:integer;
begin
lngFolder:=ExtractFilePath(ParamStr(0));
UserLang:=Lang;
for i := 1 to Paramcount - 1 do
if (ParamStrUTF8(i) = '--LANG') or (ParamStrUTF8(i) = '-l') or
(ParamStrUTF8(i) = '--lang') then
UserLang := ParamStrUTF8(i + 1);
if UserLang='' then
UserLang:='ru';
poFileName:= lngFolder +DirectorySeparator + Format('lr_const.%s.po', [UserLang]);
if FileExists(poFileName) then
Translations.TranslateUnitResourceStrings('lr_const', poFileName);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
TranslateLazReport('ru');
end;
Файл 'lr_const.ru.po' в данном случае копируется в стартовую директорию приложения.
Так вроде бы при создание po файлов для соответствующей локализации вашей программы и LazReport загрузит соответствующий po файл.
Вы похоже не читали вики " Как локализировать программы".
Вы похоже не читали вики " Как локализировать программы".
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Тут главное не то, кто что читал, а то как сделать и проверить самому. Я проверил . В режиме IDE меню в редакторе на русском смог сделать, в компиллированном exe-файле нет.
"Файл 'lr_const.ru.po' в данном случае копируется в стартовую директорию приложения."- а тут не понятно. Речь идет о проекте или о готовом приложении.
Я бы предпочел доработку самой компоненты Lazreport . Например в Lazreport 9.8 есть "руссификация" сохранения файла для винды- utf8tosys(filename) , так вот не работает это в вин7 . Нужно конкретно utf8tocp1251(filename), как это я делаю в проекте, когда сохраняю текст в файл. Или уже есть доработанная компонента Lazreport ?
"Файл 'lr_const.ru.po' в данном случае копируется в стартовую директорию приложения."- а тут не понятно. Речь идет о проекте или о готовом приложении.
Я бы предпочел доработку самой компоненты Lazreport . Например в Lazreport 9.8 есть "руссификация" сохранения файла для винды- utf8tosys(filename) , так вот не работает это в вин7 . Нужно конкретно utf8tocp1251(filename), как это я делаю в проекте, когда сохраняю текст в файл. Или уже есть доработанная компонента Lazreport ?
pi1 писал(а):Речь идет о проекте или о готовом приложении.
Одинаково.
pi1 писал(а):Тут главное не то, кто что читал, а то как сделать и проверить самому. Я проверил . В режиме IDE меню в редакторе на русском смог сделать, в компиллированном exe-файле нет."Файл 'lr_const.ru.po' в данном случае копируется в стартовую директорию приложения."- а тут не понятно. Речь идет о проекте или о готовом приложении.
Тут на форуме даже это уже обсуждалось. Можно как svk12 собственную процедуру, но можно еще проще. При создании многоязычных приложение Lazarus создает po файлы для соответствующей локализации. Как это сделать написано в вики. Lazreport загрузит соответствующий файл. Локаль операционной системы тоже должна быть настроена на требуемую страну.
quote="pi1"]Я бы предпочел доработку самой компоненты Lazreport . Например в Lazreport 9.8 есть "руссификация" сохранения файла для винды- utf8tosys(filename) , так вот не работает это в вин7 . Нужно конкретно utf8tocp1251(filename), как это я делаю в проекте, когда сохраняю текст в файл. Или уже есть доработанная компонента Lazreport ?[/quote]
Функции utf8tosys и utf8tocp1251 для всех ОС поддерживаемых FreePascal. Вы забываете, что в Windows, может использоваться как WIndows кодировка для страны, так и uft8. Все у нее не так как у нормальных операционных систем.
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Спасибо svk12 за совет. Так действительно работает. Давно видно я в x-ах ковырялся, совсем форточником стал
Логика в винде другая, путанная. Ну да ладно. Тут вот еще неожиданно вылез глюк непонятный. Если репорт открывался командой DesignReport то загрузить в него другой файл шаблона не могу, вываливается. Процедура clear не помогает. Поиск в инете тоже не помог. Мож кто встречал?
Добавлено спустя 5 минут 31 секунду:
"Функции utf8tosys и utf8tocp1251 для всех ОС поддерживаемых FreePascal. Вы забываете, что в Windows, может использоваться как WIndows кодировка для страны, так и uft8. Все у нее не так как у нормальных операционных систем."
Вот и получается, что загрузить файл шаблон с русским именем (cp1251) в Lazreport можно frReport1.LoadFromFile(utf8tocp1251(fname1));
А вот из дизайнера репорта сохранить в такой кодировке не выходит
Добавлено спустя 1 час 26 минут 38 секунд:
Выяснил только, что если в шаблоне есть subreport и шаблон открывался в репорте для редактирования, то повторная загрузка (frReport1.LoadFromFile(utf8tocp1251(fname1))) вызывает крах задачи. Скорее всего это глюк компоненты. Не так часто используется пользователем проги редактор шаблона. Просто у меня в утилитке одна форма с двумя кнопками Печать и Редактор шаблона, а шаблонов в задаче используется несколько.Если не редактировать, то на печать выводится нормально со сменой шаблонов. Сам случайно наткнулся.
Логика в винде другая, путанная. Ну да ладно. Тут вот еще неожиданно вылез глюк непонятный. Если репорт открывался командой DesignReport то загрузить в него другой файл шаблона не могу, вываливается. Процедура clear не помогает. Поиск в инете тоже не помог. Мож кто встречал?
Добавлено спустя 5 минут 31 секунду:
"Функции utf8tosys и utf8tocp1251 для всех ОС поддерживаемых FreePascal. Вы забываете, что в Windows, может использоваться как WIndows кодировка для страны, так и uft8. Все у нее не так как у нормальных операционных систем."
Вот и получается, что загрузить файл шаблон с русским именем (cp1251) в Lazreport можно frReport1.LoadFromFile(utf8tocp1251(fname1));
А вот из дизайнера репорта сохранить в такой кодировке не выходит
Добавлено спустя 1 час 26 минут 38 секунд:
Выяснил только, что если в шаблоне есть subreport и шаблон открывался в репорте для редактирования, то повторная загрузка (frReport1.LoadFromFile(utf8tocp1251(fname1))) вызывает крах задачи. Скорее всего это глюк компоненты. Не так часто используется пользователем проги редактор шаблона. Просто у меня в утилитке одна форма с двумя кнопками Печать и Редактор шаблона, а шаблонов в задаче используется несколько.Если не редактировать, то на печать выводится нормально со сменой шаблонов. Сам случайно наткнулся.
pi1 писал(а):повторная загрузка (frReport1.LoadFromFile(utf8tocp1251(fname1))) вызывает крах задачи
Если вызываете на печать один и тот же шаблон не редактируя его, тоже падает?
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Все одно, тот же шаблон или другой. Но вот выяснилось, что это происходит в режиме отладки. В штатном режиме приложения не вываливается. Один раз даже удалось поймать ошибку (жаль не скриншотил). Что то про EDOM было написано. Ну это ладно,терпимо, но вот когда открыт файл ( в штатном режиме приложения) с именем в кодировке cp1251, то в редакторе шаблона имя файла представлено знаками вопрос (Дизайнер-?????.lrf) и попытка сохранить его после редактирования с тем же именем выполняется не корректно, это не есть хорошо.Попытка повторного открытия в дизайнере файла в этой кодировке, вообще дает интересный результ. Придется, как говорят бухгалтеры, это все открыжить и потом здесь описать по понятней и по точнее.
Добавлено спустя 6 часов 30 минут:
Решил сделать так- изменить, компиллировать,установить компоненту lazreport :
в файле lr_desgn.pas (lazarus/components/lazreport/source) добавил после CurDocName := OpenDialog1.FileName;
строчку CurDocName:=utf8tocp1251(CurDocName);
(ессно библу lconvEncoding в uses)
а в файл lr_class.pas в procedure TfrReport.SaveToFile(FName: String); добавил перекодировку utf8tocp1251:
if SameText('.lrf',Ext) then
SaveToXMLFile(fName)
else
begin
Stream := TFileStream.Create(UTF8Tocp1251(FName), fmCreate);
SaveToStream(Stream);
Stream.Free;
end;
Еще надо найти где cp1251toutf8 "впендюрить" . Думаю, действуя по аналогии, можно весь lazreport для нужд "русской" винды поднастроить.
Уточняю, мне нужен репорт для быстрого создания утилит для работы с датасетами и отчетами именно в винде.
Спасибо разработчикам за простой и понятный код компоненты, в частности Tzyganenko A.
Добавлено спустя 6 часов 30 минут:
Решил сделать так- изменить, компиллировать,установить компоненту lazreport :
в файле lr_desgn.pas (lazarus/components/lazreport/source) добавил после CurDocName := OpenDialog1.FileName;
строчку CurDocName:=utf8tocp1251(CurDocName);
(ессно библу lconvEncoding в uses)
а в файл lr_class.pas в procedure TfrReport.SaveToFile(FName: String); добавил перекодировку utf8tocp1251:
if SameText('.lrf',Ext) then
SaveToXMLFile(fName)
else
begin
Stream := TFileStream.Create(UTF8Tocp1251(FName), fmCreate);
SaveToStream(Stream);
Stream.Free;
end;
Еще надо найти где cp1251toutf8 "впендюрить" . Думаю, действуя по аналогии, можно весь lazreport для нужд "русской" винды поднастроить.
Уточняю, мне нужен репорт для быстрого создания утилит для работы с датасетами и отчетами именно в винде.
Спасибо разработчикам за простой и понятный код компоненты, в частности Tzyganenko A.
