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...
i18n aus Ressourcen einbinden
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
i18n aus Ressourcen einbinden
- Dateianhänge
-
ResTrans.zip
- (2.83 KiB) 121-mal heruntergeladen
Zuletzt geändert von Sieben am Di 26. Okt 2021, 17:57, insgesamt 2-mal geändert.
Re: i18n aus Ressourcen einbinden
Ü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.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: i18n aus Ressourcen einbinden
Das könnte man durch eine Import / Exportfunktion erweitern. Prinzipiell halte ich das aber für eine sehr gelungene Idee.
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: i18n aus Ressourcen einbinden
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) 111-mal heruntergeladen
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: i18n aus Ressourcen einbinden
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.
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: i18n aus Ressourcen einbinden
Vielleicht noch mal eine Schritt für Schritt Anleitung, wenn man nur die LCl-Strings übersetzen will:
- Zip-Datei in eigenes Verzeichnis entpacken (wo man halt seine Packages hat)
- Die Package-Datei in der IDE öffnen und einmal kompilieren (nicht installieren)
- Im Projekt die Datei LCLStrConsts.de.po aus dem Lazarus-Ordner lcl/languages in die Projekt-Ressourcen laden (Projekt -> Optionen -> Ressourcen) - kann man sich auch lokal hinlegen, sollte dann aber daran denken, sie bei jeder neuen Version evt zu aktualisieren
- Das Package zu den Projekt-Anforderungen hinzufügen
- Die Unit rkDefTrans entweder direkt in der Projekt-Datei oder im MainForm zu den uses hinzufügen
- Feddich