FAQ Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: FAQ Lazarus

Сообщение Vadim » 24.08.2008 06:31:12

Lazarus + Linux для совсем начинающих (вроде меня :) )

При попытке скомпилировать программу для GTK2 компилятор меня последовательно обругал такими ругательствами:
Can't find -lgtk
Can't find -lgdk
Can't find -lgdk_pixbuf
Хотя я готов был поклясться своей треуголкой, что такие пакеты устанавливал.

Разрешение проблемы:
1. Посмотрел в файле fpc.cfg, по какому пути FreePascal берёт файлы библиотек (-Fl).
2. Посмотрел, как действительно называются эти библиотеки там, где они установлены.
3. Сделал симлинки:
Действительное Название библиотеки -> Симлинк
------------------------------------------------------
libgtk-x11-2.0.so.0.1200.9 -> libgtk.so
libgdk-1.2.so.0.9.1 -> libgdk.so
libgdk_pixbuf-2.0.so.0.1200 -> libgdk_pixbuf.so
------------------------------------------------------

После этого всё стало компилироваться самым замечательным образом.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FAQ Lazarus

Сообщение fflatx » 04.10.2008 00:03:54

Вопрос: Как осуществить в Лазарусе интернационализацию приложения?

Ответ:
Описанный ниже способ проверен на версии Lazarus 0.9.24 beta, версия fpc 2.2.0
ОС: MS WINDOWS XP SP2, Linux Mandriva 2008.0
В Linux Mandriva 2008.0 Lazarus собран для GTK2

Итак, для интернационализации приложения требуется:
1. Определить языковой состав проекта.
2. Вынести в ресурсы строковые константы.
3. Настроить проект
4. Использовать процедуры из модулей Translations, Gettext.
5. Правильно отредактировать .po-файл

Рассмотрим пример

1. Создадим новый проект. Реализовываться будет на двух языках: английском и русском. В качестве основного языка лучше выбрать английский язык, об этом будет сказано ниже.
2. На форме разместим компонент Label1 и кнопку Button1
3. Очистим в инспекторе объектов свойство Caption у компонентов, размещенных на форме, а также у самой формы. Иначе эти свойства попадут в po-файл дважды.
4. Определим имена строковых констант для наших компонентов. Можно использовать имя компонента слитно с именем свойства без разделяющей точки.
Например, для Label1.Caption имя константы выглядит как Label1Caption.
5. Строковые константы необходимо вынести в ресурсы. Для этого в модуле формы создаем раздел resourcestring и помещаем в него строковые константы с присвоением им значений:

Код: Выделить всё
resourcestring
Form1Caption = 'Lazarus Application';
Label1Caption = 'This is testing application!';
Button1Caption = 'Run';


Раздел resourcestring может находиться как в модуле формы, так и в отдельном модуле.
В отдельном модуле раздел resourcestring размещается в разделе interface.

6. Сохраняем проект в отдельную папку. В этой же папке создаем вложенную папку для языковых файлов. В нашем примере создадим папку с именем languages.
7. В Лазарусе выбираем пункт меню Проект->Настройки проекта. Переходим на вкладку i18n. Ставим галочку Использовать i18n.
В текстовом поле Каталог вывода файлов PO указываем нашу папку languages, воспользовавшись кнопкой выбора справа от поля.
Важно: В текстовом поле отображается только имя папки без указания пути. Тем не менее путь нужно указывать полностью, именно поэтому лучше воспользоваться кнопкой выбора.
Для закрытия окна настроек нажимаем кнопку ОК.
8. Собираем проект (выбираем меню Запуск -> Собрать все). Теперь в папке languages создан языковой файл с именем проекта и расширением po, например project1.po.
Важно: В проекте не должно быть ошибок, иначе сборка завершится неудачей и po-файл не будет создан. Если ошибки обнаружились, их нужно исправить и повторить полную сборку проекта.
10. Перейдем в папку languages и сделаем в этой папке копию находящегося там po-файла с добавлением к имени файла суффикса языка.
Например, файл project1.po для русского языка копируем с именем project1.ru.po.
11. Теперь напишем необходимый код. В раздел Uses модуля формы добавим модули Translations и Gettext.
Из этих модулей нам потребуются две процедуры.

Procedure TranslateUnitResourceStrings(const ResUnitName, BaseFilename, Lang, FallbackLang: string); из модуля Translations.

Параметры:
const ResUnitName: string - имя модуля, в который вынесены строковые константы
BaseFilename: string - имя языкового файла с указанием пути к нему
Lang: string - языковая настройка системы, например ru
FallbackLang: string - сочетание обозначений языковой раскладки и страны, например ru_RU

Procedure GetLanguageIDs(var Lang, FallbackLang: string); из модуля GetText. Используется для определения значений Lang и FallBackLang

Вызов этих процедур должен выполняться до присвоения значений свойствам компонентов формы. Т.е. эти процедуры должны вызываться в обработчике события создания формы.

Важно: В модуле Translations кроме процедуры TranslateUnitResourceStrings существует функция с таким же именем, но с другим набором параметров. Нам требуется именно процедура, а не функция.
Также процедура TranslateUnitResourceStrings объявлена в модуле GetText, нам нужна процедура из модуля Translations, поэтому перед вызовом процедуры нужно указать имя модуля.

В результате код обработчика события создания формы для нашего примера выглядит так:

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var
    PODirectory, Lang, FallbackLang: String;
    begin
      PODirectory:='path/to/languages/'; //здесь укажите полный путь к языковым файлам
      GetLanguageIDs(Lang,FallbackLang); // определение языковых параметров системы
      //Перед именем процедуры TranslateUnitResourceStrings указываем
      имя модуля Translations во избежание разночтений.
      //'project1.%s.po' - имя языкового файла. %s - языковой суффикс.
                     Translations.TranslateUnitResourceStrings('Unit1',PODirectory+'project1.%s.po',lang,Fallbacklang);
      //присваиваем значения свойствам компонентов формы     
      Form1.caption:=Form1Caption;
      Button1.Caption:=Button1Caption;
    end;

Важно: Путь к языковым файлам, помещаемый в переменную PODirectory, не должен содержать символов, преобразуемых в код (т.е. пробелов, символов кириллицы и т.д.)

Обработчик события нажатия кнопки выглядит так:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:=Label1Caption;
end;


12. Сохраняем проект.
13. Осталось отредактировать языковой файл (файл перевода).
Языковой файл, сгенерированный при сборке нашего проекта имеет следующий вид:

#: unit1.form1caption
msgid "Lazarus Application"
msgstr ""

#: unit1.label1caption
msgid "This is testing application!"
msgstr ""

#: unit1.button1caption
msgid "Run"
msgstr ""

msgid - идентификатор элемента перевода (т.е. фразы), в качестве которого используется значение константы из раздела resourcestring.
Именно поэтому в качестве основного языка лучше выбрать английский, т.к. константам задаются англоязычные значения и мы имеем в языковом файле англоязычные идентификаторы.
Если же в качестве основного языка выбран русский (соответственно константам заданы русскоязычные значения), то идентификаторы в языковом файле преобразуются в коды символов, т.к. не могут содержать символы кириллицы. В этом случае с языковым файлом работать очень неудобно.

msgstr - значение элемента перевода (т.е. фраза на языке, отличном от основного). В нашем примере в кавычках вписываются значения констант на русском языке.

В результате файл для русского языка project1.ru.po получается таким:

#: unit1.form1caption
msgid "Lazarus Application"
msgstr "Приложение Лазарус"

#: unit1.label1caption
msgid "This is testing application!"
msgstr "Это тестовое приложение!"

#: unit1.button1caption
msgid "Run"
msgstr "Пуск"

Одной из причин, по которой не работает интернационализация описанным способом является нарушение формата языкового файла. Языковой файл - это обычный текстовый файл и при редактировании его в Windows символы конца строки в файле вставляются по стандарту Windows. После этого интернационализация перестает работать.
Если же сохранить po-файл с концами строк как в UNIX, проблема исчезает. Поэтому пользователям Windows для редактирования po-файлов лучше использовать редакторы типа Poedit, выставив в настройках формат конца строки как в UNIX.
Другой причиной является неверное указание пути к файлам локализации. В процедуру TranslateUnitResourceStrings должен передаваться полный путь к po-файлу, не содержащий пробелов и символов кириллицы.

Теперь можно запустить проект и убедиться, что надписи на форме отображаются на русском языке. Если сменить системные языковые настройки, то надписи на форме будут отображаться на английском языке. Если отсутствует языковой файл для русского языка, то надписи на форме отображаются на основном языке (в данном случае английский).
Последний раз редактировалось fflatx 02.11.2008 14:48:00, всего редактировалось 1 раз.
fflatx
незнакомец
 
Сообщения: 5
Зарегистрирован: 27.09.2008 01:14:24

Re: FAQ Lazarus

Сообщение Alexx2000 » 16.10.2008 22:38:56

fflatx писал(а):3. Очистим в инспекторе объектов свойство Caption у компонентов, размещенных на форме, а также у самой формы. Иначе эти свойства попадут в po-файл дважды.
4. Определим имена строковых констант для наших компонентов. Можно использовать имя компонента слитно с именем свойства без разделяющей точки.
Например, для Label1.Caption имя константы выглядит как Label1Caption.
5. Строковые константы необходимо вынести в ресурсы. Для этого в модуле формы создаем раздел resourcestring и помещаем в него строковые константы с присвоением им значений:

ИМХО можно сделать проще. Если воспользоваться модулем из этой темы, то такие действия будут лишними. При этом все строковые константы для компонентов будут генерироваться автоматически. Перевод компонентов так же будет произведен автоматически, без присвоения вручную.

P.S. В поставку Лазарус входит аналогичный модуль, только для работы с *.mo файлами (DefaultTranslator.pas).
Было бы неплохо чтобы в поставку Лазарус входил и модуль для работы с *.po файлами.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 487
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: FAQ Lazarus

Сообщение fflatx » 17.10.2008 07:43:16

Alexx2000 писал(а):Если воспользоваться модулем из этой темы

В указанной теме Вы пытались использовать функцию TranslateUnitResourceStrings, она не сработала и далее, если не ошибаюсь, Вы анализировали код модулей Translations.pas и DefaultTranslator.pas, и результатом было создание собственного модуля uTranslations. При этом Ваша собственная оценка этого труда "Вот такой велосипед". :D

Понятно, что можно создать какой угодно модуль с любыми функциями для любых целей.
:D
Я делал акцент как раз на том, что не нужно изобретать никаких велосипедов, не нужно анализировать никаких кодов и создавать (или подключать) дополнительных модулей, а пользоваться теми средствами, которые есть изначально. Я всего лишь хотел показать, что функция TranslateUnitResourceStrings, которая на первый взгляд не работает, на самом деле работает, а проблемы упираются в формат po-файла, либо в указание путей к этому файлу.
fflatx
незнакомец
 
Сообщения: 5
Зарегистрирован: 27.09.2008 01:14:24

Re:

Сообщение Den_Zurin » 16.05.2009 08:35:49

Sniper писал(а): Вопрос:
скомпилированный Lazarus получается в размере 20Mb! Можно ли уменьшить его?
Ответ:
Можно воспользуйтесь утилитой strip (например: strip lazarus.exe)
точно также можно уменьшить в размере startlazarus.exe : strip startlazarus.exe

Не понимаю, к чему такие сложности. Просто выбираем пункт меню "Проект" -> "Параметры компилятора...", переходим на вкладку "Связывание" и устанавливаем галочку напротив пункта "Использовать внешний файл отладочных символов GDB (-Xg)". И все! Теперь при каждой компиляции будет создаваться небольшой исполняемый файл (размер примерно как в Delphi) и dbg-файл, содержащий отладочную информацию.
Den_Zurin
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.04.2009 23:54:29

Re: Re:

Сообщение Mr.Smart » 16.05.2009 14:21:51

Den_Zurin писал(а):Не понимаю, к чему такие сложности.

В Lazarus данная возможность появилась недавно и насколько знаю в последней стабильной версии её нет 0.96.4.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: FAQ Lazarus

Сообщение v-t-l » 17.05.2009 10:48:38

Mr.Smart писал(а):В Lazarus данная возможность появилась недавно и насколько знаю в последней стабильной версии её нет 0.96.4

В версии 0.9.26.1 уже есть, да и вообще -Xg - это опция линкера, а не Lazarus.
v-t-l
энтузиаст
 
Сообщения: 727
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: FAQ Lazarus

Сообщение svs5may » 25.06.2009 21:49:44

Вопрос: ОС Debian Lenny установил Lazarus 0.9.26 при вызове оперативной справки выдает сообщение база данных
справки "StartPage" не смогла найти файл "/usr/lib/lazarus/docs/index.html" как решить эту проблему.
svs5may
незнакомец
 
Сообщения: 1
Зарегистрирован: 25.06.2009 21:12:00

Re: FAQ Lazarus

Сообщение Attid » 29.06.2009 23:34:38

svs5may
обратиться к сборщику пакета в Debian
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: FAQ Lazarus

Сообщение and » 12.10.2009 21:28:17

Вопрос:
Не удаётся применить патч. Сообщение:
Код: Выделить всё
Assertion failed: hunk, file patch.c, line 321

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Платформа Win32.

Ответ:
Виноваты UNIX-завершения строк (#$A), в то время как patch.exe ожидает #$D#$A. Откройте .patch-файл текстовым редактором и пересохраните.
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: FAQ Lazarus

Сообщение vitalka » 17.11.2009 18:17:58

fflatx писал(а):Вопрос: Как осуществить в Лазарусе интернационализацию приложения?

Ответ:
Описанный ниже способ проверен на версии Lazarus 0.9.24 beta, версия fpc 2.2.0
ОС: MS WINDOWS XP SP2, Linux Mandriva 2008.0
В Linux Mandriva 2008.0 Lazarus собран для GTK2

Итак, для интернационализации приложения требуется:
1. Определить языковой состав проекта.
2. Вынести в ресурсы строковые константы.
3. Настроить проект
4. Использовать процедуры из модулей Translations, Gettext.
5. Правильно отредактировать .po-файл
Рассмотрим пример
...

версия Lazarus 0.9.28.2 beta, версия fpc 2.2.2
ОС: MS WINDOWS XP SP2
(Не знаю как проверить, что Lazarus собран для GTK2!!! :oops: )

Повторил ваш пример. Механизм работает, но при выполнении проекта на форме, кнопке и лэйбле вместо кирилицы показываются только знаки вопроса "??????????".
В чем может быть проблемма???
Спасибо.
vitalka
незнакомец
 
Сообщения: 1
Зарегистрирован: 17.11.2009 11:36:27

Re: FAQ Lazarus

Сообщение Mr.Smart » 17.11.2009 18:26:21

vitalka
Не знаю как проверить, что Lazarus собран для GTK2!!!

Вообще эта информация присутствует в окне "О проекте Lazarus" в меню справка. В случае с Windows только виджеты Win32 (хотя можно ещё и QT, а вот под GTK2 сборки я невидел хотя теоретически собрать можно :wink: ).
В чем может быть проблемма???

Какой кодировки у вас файл с переводом (.PO файл)? Должна быть кодировка UTF-8.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: FAQ Lazarus

Сообщение Attid » 17.11.2009 22:50:28

vitalka писал(а):0.9.28.2

он по умолчанию в ГТК2 , то описание под старую версию
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: FAQ Lazarus

Сообщение Ustas » 13.01.2010 17:03:28

Подскажите, пожалуйста, порядок обновления версий Lazarus. Т.е. нужно ли стирать старую версию, а затем ставить новую и затем устанавливать нужные пакеты, или можно новую версию поставить поверх старой и перекомпилировать Lazarus?
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

Re: FAQ Lazarus

Сообщение Odyssey » 13.01.2010 20:24:34

Если ставить поверх старой, то
* могут остаться мусорные файлы, которые в старой версии есть, а в новой удалены;
* если новая версия использует другую версию fpc, придётся вручную править в конфигурационных файлах Лазаруса путь к компилятору.

Теоретически всё, практически -- всякое бывает :)
Если всё это вас не пугает, можете попробовать поставить поверх, иначе -- удалять старую, ставить новую.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru