i18n - Übersetzung vererbte Formulare

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

i18n - Übersetzung vererbte Formulare

Beitrag von musicones »

Hallo,

ich hoffe ich habe das richtige Forum ausgewählt.

Entsprechend der Dokumentationen und dem Lazarus Beispielprogramm habe ich meine Anwendung auf Multilingual umgestellt.
Das funktioniert im Grunde erstmal gut.
Ich habe PO-Dateien für deutsch und englisch und finde dort auch alle resourcestrings und Captions der Labels auf den Formularen wieder.
Komponenten, die nicht automatisch übersetzt werden, habe ich im Quellcode über die procedure UpdateTranslation(ALang: String); wie im
Beispiel benutzt mit resourcestrings versehen, Beispiel SpookToolbar.

Hier nun die Beschreibung meines Problems:

Mein Aufbau der Forms:

TMyForm - Enthält die Prozeduren für die Übersetzung wie im Beispielprogramm.

TMyBasicWizard = class(TMyForm): Eine Basisklasse für Assistenten, in denen ich die Logik für das vor und zurückschalten mittels eines PageControls und Buttons setzte und den ein oder anderen Parameter setzen kann, um Fehlerseite oder Erfolgseite darzustellen.
Dort habe ich die resourcestrings im implementation teil eingesetzt, um die Buttons im Quellcode zu verändern zu können.
Z.B. wird aus Weiter --> Fertigstellen und aus Abbrechen --> Schließen, je nach Situation.
Deshalb besetze ich die Captions in der UpdateTranslation Prozedur vor und später ändere ich diese mit weiteren resourcestrings

Code: Alles auswählen

 
implementation
 
{$R *.lfm}
 
// Hier sind die gesetzten resourcestrings:
 
resourcestring
  Tag_Next   = '&Weiter';
  Tag_Finish = '&Fertigstellen';
  Tag_Close  = '&Beenden';
  Tag_Cancel = '&Abbrechen';
  Tag_ReadyTitle = 'Vorbereitungen abgeschlossen';
  Tag_ReadyLabel = 'Klicken Sie auf &Fertigstellen,';
  Tag_ErrorTitle = 'Es ist ein Fehler aufgetreten';
  Tag_SuccessTitle = 'Assistent erfolgreich ausgeführt';     
 
....
 
// Hier initialisiere ich Captions der Buttons und auch einiger Labels:
 
procedure TMyBasicWizard.UpdateTranslation(ALang: String);
begin
  inherited UpdateTranslation(ALang);
 
  NextButton.Caption := Tag_Next;
  CancelButton.Caption := Tag_Cancel;
 
  ReadySheetTitle.Caption := Tag_ReadyTitle;
  ReadyLabel.Caption := Tag_ReadyLabel;
  ErrorSheetTitle.Caption := Tag_ErrorTitle;
  SuccessSheetTitle.Caption := Tag_SuccessTitle;
end;   
 
...
 
// Hier ändere ich dann entsprechend der Navigation die Captions der Buttons:
 
procedure TMyBasicWizard.UpdateNavigationControls;
begin
  with PageControl do
  begin
    ...
    // Next Button
    if (ActivePage.Name = Tag_ReadySheet) or
       (ActivePage.Name = Tag_ErrorSheet) or
       (ActivePage.Name = Tag_SuccessSheet)
    then NextButton.Caption := Tag_Finish
    else NextButton.Caption := Tag_Next;
 
     ...
 
    // Cancel Button
    if (ActivePage.Name = Tag_ErrorSheet) or
       (ActivePage.Name = Tag_SuccessSheet)
    then CancelButton.Caption := Tag_Close
    else CancelButton.Caption := Tag_Cancel;
  end;
end
 
 



In meiner Andwendung leite ich dann entweder von TMyForm ab, das funktioniert gut und die Übersetzungen klappen.

In der Anwendung leite ich auch ein Formular von TMyBasicWizard ab, um einen Assistenten auszuarbeiten.
Die Captions des Formulars erscheinen auch in der PO-Datei, die ich dann auch übersetzt habe.

In TMyBAsicWizard hat das PageControls bereits einige Sheets, auf denen z.B. TitleLabel enthalten sind, die natürlich nur Dummy Captions haben.
Diese werden dann im vererbten Formular überschrieben und genau diese Captions werden nicht übersetzt.

Beispiel:
In TMyBasicWizard: StartSheetTitle.Caption = StartSheetTitle
In TMyProjectWizard (vom Typ TMyBasicWizard): StartSheetTitle.Caption = Sie möchten ein neues Projekt anlegen?

Wie gesagt, die Caption ist in der PO-Datei vorhanden und auch von mir in der *en.po übersetzt, aber die Übersetzung wird im Programm nicht vorgenommen,
obwohl der Rest komplett übersetzt wurde. Z.b Labels, die ich erst in TMyProjectWizard eingefügt habe, werden übersetzt.

Auch die Navigationsbuttons des Assistenten werden nicht übersetzt. Siehe oberen Code-Aussschnitt.

Hätte da jemand eine Idee für mich?

Edit 1: Ich habe gerade gesehen, die PO-Datei enthält nicht die Captions aus TMyBasicWizard.
Weiterhin ist mir aufgefallen, dass die .lfm Dateien die Umstellung von Object auf Inherited vergessen, bei allen Formularen. Im Beispielprogramm war angegeben, dass man das inherited setzen soll. Ob sich dies auf das Übersetzen, oder sammeln der Captions auswirkt, kann ich aber nicht sagen.


Edit 2: Nur mal eine kurze Rückmeldung...Das Problem ist noch nicht behoben
    LCLTranslator hatte ich im Package zwar eingetragen, ist aber von alleine wieder rausgeflogen, also nicht drin.
    Die LFM habe ich geprüft, die entsprechende Caption taucht nicht auf.
    @kupferstecher: Danke, dass wusste ich bereits und versuche auch immer am Form rumzuspielen (total blödes verhalten :roll: )

Ich komme gerade nicht dazu mir das weiter anzuschauen, da mich ein dringenderes Problem plagt. Ich melde mich nochmals...

Gruß
Antonio
Zuletzt geändert von musicones am Di 7. Feb 2017, 10:14, insgesamt 1-mal geändert.

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

Re: i18n - Übersetzung vererbte Formulare

Beitrag von wp_xyz »

Ich kann jetzt nicht unbedingt nachvollziehen, dass vererbte Formulare beim Übersetzen Probleme machen. Andererseits sind DefaultTranslator/LCLTranslator relativ primitiv und decken evtl nicht alle Fälle ab, das hat mir wenigstens Maxim Ganetzky, der sich um das Übersetzungssystem kümmert, einmal in ähnlichem Zusammenhang geschrieben. Es wäre hilfreich, wenn du ein kleines Demoprojekt zusammenstellen könntest, das deiner Situation entspricht und den Fehler zeigt. Bitte nur pas, lfm, lpi, lpr, lrj und po Dateien zu einem gemeinsamen zip zusammenpacken und hier hochladen (bitte keine exe, ppu, und andere vom Compiler generierte Dateien).

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: i18n - Übersetzung vererbte Formulare

Beitrag von musicones »

Hallo nochmal,

wie vorgeschlagen habe ich das mit einer kleinen Demo nachgestellt und siehe da, dort funktionierts :shock: ...
Ich hänge es trotzdem mal an.

Also habe ich weiter geschaut.

1. Problem: Meine PO-Dateien sahen irgendwie seltam aus, merkwürdige Strings etc. also hab alle alle *.po und *.lrt Dateien gelöscht und das Programm aufgeräumt und neu kompiliert. Danach sahen die PO-Dateien besser aus und es waren mehr Definitionen vorhanden.

2. Problem: Ich habe also die PO-Dateien aus dem Demo und meiner Anwendung verglichen und mir fiel auf, dass die Definitionen aus dem Vorfahr für den Assistenten im Demo vorhanden sind, aber in meiner Anwendung nicht. Deshalb werden in der Demo auch die ganzen Captions der Labels und Buttons die im Nachfahren nicht angerührt werden, übersetzt.

Jetzt ist die Frage, warum kommen die Definitionen aus dem Vorfahr im Demo in die PO-Dateien, und in der eigentlichen Anwendung nicht?....

Zum Testen, ob es denn gehen würde, habe ich die Definitionen für die Navigationsbuttons (Weiter, Abbrechen) manuell in die PO-Dateien eingetragen und
fürs englische übersetzt. Und siehe da, die Buttons waren übersetzt.

Meine TMyWizard Form ist nicht direkt im Projekt eingebunden, sondern Teil meiner Bibliothek, also in einem Package, dass im Projekt eingebunden ist. Könnte das evtl.
zu Problemen führen? Dagegen spräche, dass TMyForm auch Teil dieses Packages ist und die direkten Nachfahren von TMyForm keine Probleme haben.

Ein weiteres Problem, dass mir erst im Demo aufgefallen ist:
Ich starte mit DE als Sprache, und switche per Buttonklick die Sprache. Wenn deutsch, dann englisch und zurück, etc.
Wenn ich also jetzt mit DE starte und ins englische wechsle klappt das, aber wieder zurück ins Deutsche macht er dann nicht.
Probierts einfach mal mit der Demo aus

Gruß
Antonio
Dateianhänge
Multilanguage.zip
Demo-Anwendung zu i18n
(10.19 KiB) 103-mal heruntergeladen

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

Re: i18n - Übersetzung vererbte Formulare

Beitrag von wp_xyz »

musicones hat geschrieben:Meine TMyWizard Form ist nicht direkt im Projekt eingebunden, sondern Teil meiner Bibliothek, also in einem Package, dass im Projekt eingebunden ist. Könnte das evtl. zu Problemen führen? Dagegen spräche, dass TMyForm auch Teil dieses Packages ist und die direkten Nachfahren von TMyForm keine Probleme haben.

Packages müssen ihre eigenen Sprachdateien verwalten. In den Projektoptionen des Packages musst du wie bei einer Anwendung i18n aktivieren. sowie einen Ordner für die po-Dateien angeben. Falls das Package mehrere Units enthält, ist es ratsam, eine gemeinsame String-Unit mit resourcestrings zu deklarieren, aus der sich alle Units die übersetzten Strings holen. Schau dir einfach einige Komponenten im Lazarus-Ordner "components" an, z.B. TAChart, hier heißt die gemeinsame Stringsunit tachartstrconsts, und die Übersetzungen der TAChart-Strings sehen im Ordner languages. Die Sprachdateien des Package musst du dir dann in das languages-Verzeichnis der Anwendung kopieren, und du musst auch dafür sorgen, dass sie übersetzt werden. Rufe dazu nach dem Umschalten der Sprache TranslateUnitResourceStrings aus translations auf.

musicones hat geschrieben:Ein weiteres Problem, dass mir erst im Demo aufgefallen ist:
Ich starte mit DE als Sprache, und switche per Buttonklick die Sprache. Wenn deutsch, dann englisch und zurück, etc.
Wenn ich also jetzt mit DE starte und ins englische wechsle klappt das, aber wieder zurück ins Deutsche macht er dann nicht.

Das ist ein bekanntes ärgerliches Problem: Wenn man die po-Datei des Projekts in eine po-Datei der Ausgangssprache (.de.po) kopiert, dann werden die Strings nicht übersetzt. Öffne die .de.po mit poEdit - du siehst, dass in der Übersetzungsspalte keine Einträge stehen. Gehe einfach von Zeile zu Zeile und drücke CTRL+B (Quelltext übernehmen).

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: i18n - Übersetzung vererbte Formulare

Beitrag von musicones »

Vielen Dank, dass hat mich schon eine ganze Ecke weitergebracht.

Ich habe jetzt:
    Die Packageoptionen angepasst,
    LZLTranslator in die uses des Packages eingetragen
    Package neue compiliert
    Die erstellten PO-Dateien kopiert in .de.po und .en.po
    Die Übersetzungen gemacht

In meiner Anwendung habe ich in der procedure TMainForm.SelectLanguage(ALang: String);

Code: Alles auswählen

 
 
// Switch language - this is in LCLTranslator
  SetDefaultLang(ALang);
 
  // Switch language of package parts
  TranslateUnitResourceStrings('fMyBasicWizard', FilePath.Combine(Environment.LanguagesPath, 'fMyBasicWizard.%s.po'),ALang,'');
 


Ergebnis ist:

Wenn ich den Assistenten aufrufe, dann fällt auf, dass die Naviationsbuttons Weiter und Abbrechen nicht übersetzt sind, wenn ich dann auf Weiter klicke
werden diese übersetzt. Seltsames Verhalten. Auf der ersten Registerkarte sieht auch alles gut aus, da es sich um Labels und Komponenten aus dem Nachfahren handelt.
Nach dem Klick auf Weiter komme ich auf die Seite "Vorbereitungen abgeschlossen" ... diese ist aus dem Vorfahrform und im Package und nicht verändert worden und sollte
eigentlich durch TranslateUnitResourceStrings übersetzt werden.

Dort ist das Label "Vorbereitungen abgeschlossen" noch in Deutsch und nicht übersetzt.

Beim Debuggen von TranslateUnitResourceStrings wird die PO-Datei gefunden, geladen und anscheinend übersetzt.
Alle Funktionen/Unterfunktionen scheinen mit Result = true beendet zu werden.

Ich bin jetzt etwas ratlos...

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

Re: i18n - Übersetzung vererbte Formulare

Beitrag von wp_xyz »

Konkret kann ich hier wenig helfen, weil ich nicht weiß, was du genau machst. Ein paar Ideen nur:
  • Warum hast du den LCLTranslator im Package? Das ist m.E. nicht nötig.
  • Dass die Navigationsbuttons nicht sofort übersetzt werden, kannst du vielleicht verhindern, wenn du in TMainForm.SetLanguage ein Neuzeichnen des Formulars erzwingst (Invalidate).
  • Ich könnte mir vorstellen, dass LCLTranslator sich zufrieden gibt, wenn ein übersetzter Text im Vorfahr-Formular geändert wird, und nicht weitersucht, ob der Text auch in abgeleiteten Formularen vorkommt - wiegesagt "... ist relativ primitv" Kannst du nicht dem Label die übersetzte Caption nochmals manuell zuweisen? Vielleicht hängt das auch damit zusammen, dass bei dir LCLTranslator auch im Package vorhanden ist.
  • In diesem Zusammenhang fällt mir noch ein, dass die Caption im abgeleiteten Formular nicht in der lfm-Datei vorhanden sein darf, um als "vererbt" erkannt zu werden. (wenn ich mich recht erinnere...)
Zuletzt geändert von wp_xyz am Fr 3. Feb 2017, 23:32, insgesamt 2-mal geändert.

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: i18n - Übersetzung vererbte Formulare

Beitrag von kupferstecher »

Keine Ahnung, ob das mit deinem Problem was zu tun hat:
Wenn man i18n aktiviert, muss man Komponenten auf den Formularen bewegen, weil nur Änderungen berücksichtigt werden.

Antworten