LazReport

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

LazReport

Beitrag von hbr »

Hallo,
mit
frReport1.LoadFromFile('Report.lrf');
frReport1.ShowReport;
öffnet sich ein Preview Report mit einem erstellten Report durch frReport.
Leider greifen die Sprachdateien '.po' nicht.
Oder welche '.po' Datei ist für den Laz-Preview erforderlich?
Versucht habe ich: calleditorwithpkg.de.po und lr_const.de.po
Gruß

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: LazReport

Beitrag von hbr »

Hallo,
anders gefragt!
In LR_View wird in FormCreate z.B.
'ZoomBtn.Hint := sPreviewFormScale;' zugewiesen.
In LR_Const ist unter Resourcestring sPreviewFormScale='Scale'; definiert.
Woher weis jetzt LR_View bei aufruf welche '*.po' Datei verwendet werden soll bzw. wird,
wo ist das Definiert? bzw. wo wird 'sPreviewFormScale' der neue Wert der .Po Datei zugewiesen?
Bitte um Antwort.
Gruß

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: LazReport

Beitrag von wp_xyz »

Die Resourcestrings für die LazrReport-Druckvorschau sind in der Unit LR_Const deklariert; die deutsche Übersetzungsdatei heißt demnach LR_Const.de.po, man findet sie im Verzeichnis (Lazarus)\components\lazreport\source\languages. Du musst sie nur für dein Übersetzungssystem verfügbar machen. Du hast nicht geschrieben, wie du das machst. Wahrscheinlich hast du ein Sprachverzeichnis für dein Projekt (meist: "languages"), in dem du alle Übersetzungen gesammelt hast. Dann musst du dafür sorgen, dass LR_Const.de.po übersetzt wird: "TranslateUnitResourceStrings('LR_Const', pfad)" wobei "pfad" für den Pfad zu den po-Dateien steht. Das rufst du auf, wenn die Sprache gesetzt wird.

Ein Beispiel gibt es unter (lazarus)\examples\translation, sowie ein Tutorial http://wiki.lazarus.freepascal.org/Step ... plications, allerdings nur in Englisch. Die "offizielle" Dokumentation des Übersetzungssystems findest du auf http://wiki.lazarus.freepascal.org/Tran ... r_programs

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: LazReport

Beitrag von hbr »

Hallo,

wp_xyz hat geschrieben:"TranslateUnitResourceStrings('LR_Const', pfad)" wobei "pfad" für den Pfad zu den po-Dateien steht. Das rufst du auf, wenn die Sprache gesetzt wird.
Ein Beispiel gibt es unter (lazarus)\examples\translation, sowie ein Tutorial http://wiki.lazarus.freepascal.org/Step ... plications, allerdings nur in Englisch. Die "offizielle" Dokumentation des Übersetzungssystems findest du auf http://wiki.lazarus.freepascal.org/Tran ... r_programs

Funktioniert auch nicht!

also ich habe das bisher so gemacht.
Im programm.lpr

Code: Alles auswählen

program programm;
 {$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset lclstrconsts.de.po
  Forms, FrmMain, NichtDoppeltStarten, gettext, translations;
{$R *.res}
   var PODirectory, Lang, FallbackLang: String;
begin
  PODirectory := 'languages/';
  GetLanguageIDs(Lang, FallbackLang);
  TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.de.po', Lang, FallbackLang);
  RequireDerivedFormResource := True;
  .........

dann habe ich von allen Units die übersetzungen in 'lclstrconsts.de.po' gesammelt und eingefügt.
z.B.
#: lr_const.spreviewformprint
msgid "Print report"
msgstr "Report drucken"
ob ich nun 'lclstrconsts.de.po' oder direkt 'lr_const.de.po' es wird nichts übersetzt.

Bisher funktionieren alle eingebundene units auf diese weise, z.b. iphtmlPv, nur LR_View nicht.

hausi
Beiträge: 132
Registriert: Mi 23. Sep 2009, 08:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport

Beitrag von hausi »

Lege die po Dateien in den Ordner, in dem das EXE ist und dann sollte es laufen. Bei mir läuft es so, oder ist bei meinem letzten Projekt so gelaufen.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: LazReport

Beitrag von wp_xyz »

LR_View? Die Strings sind doch in LR_Const...

Nur für kleine Projekte würde ich empfehlen, alle Resourcestring-Dateien in einer einzelnen zusammenzukopieren, du musst dir jedesmal die Strings von LazReport heraussuchen, wenn deren Autor einen neuen String in seine aktuelle Version eingebaut hat, und die LCL (--> lclstrconsts) ist sowieso permanenten Änderungen unterworfen. Und speziell bei dir stimmt der Name der Resource-Datei nicht mit dem Namen deines Projekts überein, so dass sich die automatische Übersetzungsmaschinerie nicht einmal um dein eigenes Projekt kümmern kann. Besser ist es, für das Projekt ein Sprachverzeichnis zu definieren, als Unterverzeichnis des Ordners, in dem die exe landet (dann kannst du exe und sprachdateien einfach weiterkopieren). In dieses Verzeichnis kopierst du alle benötigten Sprachdateien in allen gwünschten Sprachen, also lclstrconsts.*.po für die LCL-Strings, LR_Const.*.po für LazReport, etc. Natürlich auch die deines Projekts. Wenn du eine neue Lazarus-Version verwendest, ersetzt du die lclstrconsts einfach durch die aktuelle Version etc. Übersetze die Sprachdateien mit

Code: Alles auswählen

uses
  Translations;
var
  PODirectory: String;
  Lang, FallBackLang: String;
 
...
  PODirectory := ExtractFileDir(Application.ExeName) + DirectorySeparator + 'languages' + DirectorySeparator;
  GetLanguageIDs(lang, fallbacklang);
  TranslateUnitResource('dein_projekt', PODirectory + 'dein_projekt.%s.po', lang, fallbacklang);
  TranslateUnitResource('lclstrconst', PODirectory + 'lclstrconst.%s.po', lang, fallbacklang);
  TranslateUnitResource('LR_Const', PODirectory + 'LR_Const.%s.po', lang, fallbacklang);
  // analog mit anderen Sprachdateien

Dieser Aufruf muss erfolgen, bevor die die übersetzten Strings benötigt werden. Zu Programmbeginn, wie du das machst, ist sicher nicht falsch. Wenn du eine Live-Umschaltung der Sprache bereits geladener Formulare willst, musst du die Unit DefaultTranslator oder LCLTranslator verwenden, dann kannst du dir auch die explizite Übersetzung der Projekt und der LCL-Strings sparen.

PODirectory würde ich nicht als relativen Pfad nehmen, denn du weißt nie, was aktuell der Pfad ist, unter dem dein Programm gestartet wurde. Besser ist, einfach das "languages" an den Exe-Pfad anzuhängen. Wenn du daran denkst, dein Programm auch auf anderen Betriebssystem laufen zu lassen, musst du Backslash als Verzeichnistrennen durch das Symbol "DirectorySeparator" ersetzen, damit hast du z.B. unter Linix einen einfachen Slash.

Nun konkret zu deinem Problem: Ich vermute, deine sprachdatei (LCLStrconsts.de.po) existiert mehrfach oder in einem anderen Verzeichnis. Prüfe das. Vielleicht ruft die exe zur Laufzeit einfach die falsche Version auf? Eventuell (damit bin ich mit aber nicht sicher) benötigt die Übersetzungs-Engine auch die unübersetzten Sprachdateien (ohne dem Sprachkürzel vor .po).

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: LazReport

Beitrag von hbr »

OK, Danke,
Das mit den einzelnen Po Dateien geht jetzt, ich nehme an,
ich muss das %s durch den jeweiligen Sprachkürzel ersetzen, aber was macht der Parameter lang?
TranslateUnitResource geht nicht, muss wahrscheinlich
TranslateUnitResourceStrings heißen.

Und wie geht das Ganze mit .mo Dateien?

Dann ist mir noch etwas aufgefallen,
habe verzweifel in einer meiner Formen nach einer nicht Funktionierender Umwandlung gesucht.

Der Fehler war in der po Datei, und zwar nach dem "msgid _ _ 'Ausdrck'"
ein Lehrzeichen zu viel, also zwei Spackes anstelle von einem.
Bei zweien geht es nicht.

Gruß

Antworten