i18n aus Ressourcen einbinden

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

i18n aus Ressourcen einbinden

Beitrag von Sieben »

Nach den Diskussionen hier, hier und früher schon hier möchte ich mal einen Vorschlag zu einem, wie ich finde, doch recht einfachen und pflegeleichten Umgang mit po-Dateien machen. Dazu werden die po-Dateien von ihrem Ursprungsort aus, wo sie auch erstellt und gepflegt werden, über Projekt -> Optionen -> Ressourcen in der IDE eingebunden.

Für ein typisches Projekt ist das einmal die projekt.id.po (aus dem entsprechenden Projekt-Ordner), dann die lclstrconsts.id.po (am besten direkt aus lcl/languages von Lazarus) sowie bei Bedarf für jedes Package die entsprechenden *.id.po (aus den jeweiligen Package-Ordnern), wobei 'id' hier für das jeweilige Länderkürzel steht.

Dabei die Benamsung der Ressourcen einfach der IDE überlassen, so dass aus projekt.id.po 'PROJEKT.ID' wird, aus lclstrconsts.id.po 'LCLSTRCONSTS.ID' usw. Für die Package-Dateien muss noch eine simple Textliste mit einer Zeile pro Unitnamen beigefügt werden, die man zB restrans.txt nennt und ebenfalls in die Ressourcen lädt (-> 'RESTRANS'). Als Ort dafür bietet sich der po-Ordner des Projekts an. Für mehrere Sprachen müssen natürlich auch die entsprechenden zusätzlichen po-Dateien geladen werden, die Liste wird aber nur einmal benötigt.

Das beiliegende Package ResTrans laden, kompilieren und dem Projekt hinzufügen. Für die Übersetzung steht dann die Prozedur TranslateFromResources() aus der Unit rkResTrans zur Verfügung, die im Prinzip dasselbe macht wie SetDefaultLang() aus der Lazarus-Unit LCLTranslator, nur eben aus den Ressourcen. Auch die Variable LResources.LRSTranslator wird dabei gesetzt und steht im weiteren Programmverlauf zur Verfügung.

Für die automatische Übersetzung beim Programmstart kann man einfach die Unit rkDefTrans in die uses aufnehmen, entsprechend der Lazarus-Unit DefaultTranslator. Nach einer Ressource namens 'RESTRANS' für die Liste der zusätzlichen Units wird dabei automatisch gesucht, ein anderer Name kann aber als Parameter übergeben werden. Sollte eine gewünschte Ressource für eine bestimmte Sprache dabei mal nicht vorliegen, wird kein Laufzeitfehler erzeugt, aber natürlich auch nichts übersetzt.

Danach muss man dann nur noch die jeweiligen po-Dateien und bei Bedarf die restrans.txt 'vor Ort' pflegen, die IDE zieht sich bei jedem Build automatisch die neuesten Versionen vom ursprünglich angegebenen Ort. Keine Weitergabe der po-Dateien mehr, kein manuelles Einsammeln vor dem Release, kein temporäres Entpacken von Ressourcen zur Laufzeit, keine externen Tools wie lazres. Vielleicht mag's ja mal jemand ausprobieren.

Erstellt und getestet mit Lazarus 2.0.10 (Einstellung 'FPC-Ressourcen' in Projekt -> Optionen -> Verschiedenes).

Ediot: in der ersten Version fehlte LCLType in den uses von rkResTrans, sorry...
Dateianhänge
ResTrans.zip
(2.83 KiB) 13-mal heruntergeladen
Zuletzt geändert von Sieben am Di 26. Okt 2021, 17:57, insgesamt 2-mal geändert.

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

Re: i18n aus Ressourcen einbinden

Beitrag von wp_xyz »

Übersetzungs-Dateien in die Resourcen der Anwendung zu stecken, hat zwei Seiten: Zum einen hat man alles beisammen in einer einzigen Datei, aber zum anderen kann kein freundlicher User deine Anwendung für dich in seine Sprache übersetzen, weil er keinen Zugriff auf die po-Dateien hat.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 961
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: i18n aus Ressourcen einbinden

Beitrag von fliegermichl »

Das könnte man durch eine Import / Exportfunktion erweitern. Prinzipiell halte ich das aber für eine sehr gelungene Idee.

Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: i18n aus Ressourcen einbinden

Beitrag von Sieben »

Kleines Update, das jetzt auch automatisch nach eventuellen PO-Dateien für FCL-Ressourcen (RTLConsts, SysConst und DBConst) sucht. Die gibt's hier ff, müssten aber zum Teil erst noch übersetzt werden.
Dateianhänge
ResTrans.zip
(3.68 KiB) 3-mal heruntergeladen

Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: i18n aus Ressourcen einbinden

Beitrag von Sieben »

Im übrigen ist der Einwand von wp natürlich richtig. Aber man kann es ja auch kombinieren, zB LCLStrConsts etc und Package Units aus den Ressourcen übersetzen und dennoch den Benutzern die Po-Datei der Anwendung wie gewohnt zur Verfügung stellen. Oder zunächst mal alles in die Ressourcen packen, die Po-Datei der Anwendung 'auf Anfrage' exportieren wie von fliegermichl vorgeschlagen und, sobald sie einmal auf Platte vorliegt, wieder auf die herkömmliche Art einbinden.

Antworten