Wie wird i18N eingebunden

Für Fragen von Einsteigern und Programmieranfängern...
lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Wie wird i18N eingebunden

Beitrag von lycaner »

Hallo Liebe Forums Spezialisten,

ich habe wieder mal eine Frage. Ich habe gesehen dass man direkt aus Lazarus heraus Multilanguage Programme erstellen sollte können.
Ich habe auch schon den Wiki Eintrag bei Lazarus gelesen, doch ich raffe es nicht ganz wie das gemeint ist.
So komme ich mit der Frage an Euch, ob mir jemand etwas start Hilfe geben könnte.

Ich habe den volgenden Code in meiner Applikation:

Code: Alles auswählen

uses
LCLTranslator, DefaultTranslator;
 
procedure TForm1.Action1Execute(Sender: TObject);
begin
       SetDefaultLang('en');
  GetLocaleFormatSettings($409, DefaultFormatSettings);
end;
 
procedure TForm1.Action2Execute(Sender: TObject);
begin
       SetDefaultLang('de');
  GetLocaleFormatSettings($407, DefaultFormatSettings);
end;
 
Doch es passiert nichts. Ich bin auch nicht ganz draus gekommen wie ich das mit den Language Files einbinde ( po Datei ).
Oder wären mo - Dateien besser als po Dateien ?

Herzlichen Dank für die Unterstützung.

Chris

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

Re: Wie wird i18N eingebunden

Beitrag von wp_xyz »

Geht aus aus dem Tutorial nicht hervor? http://wiki.lazarus.freepascal.org/Step ... plications

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: Wie wird i18N eingebunden

Beitrag von lycaner »

Hallo wp_xyz,

Also um ehrlich zu sein, ich habe es nicht verstanden wies gehen soll.
Ich gebe auch zu dass ich nie English hatte in der Schule und nur
Rudimentär es verstehe.

Also wenn Du eine bessere Erklährung hast wäre ich Dankbar.

Gruss

Chris

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

Re: Wie wird i18N eingebunden

Beitrag von wp_xyz »

Ich versuch mal eine Kurzfassung (es sind wirklich nur ein paar Schritte):
  • In den Projekt-Optionen das Häkchen vor "i18n" / "i18n einschalten" setzen. PO-Ausgabeverzeichnis = "languages" (damit kommen die po-Dateien in dieses Unterverzeichnis des Projekt-Ordners). Häkchen vor ".po Datei beim Speichern ..." setzen
  • Alle zu übersetzenden Strings müssen als "resourcestring" deklariert werden.
  • Unit lcltranslator ins Projekt aufnehmen (in "uses" des Hauptformular), dadurch werden auch die Strings, die in die lfm-Datei eingebettet sind, übersetzbar gemacht (führt allerdings in der Regel zu Doppelübersetzungen - damit muss man leben, oder die Captions etc. zur Laufzeit auf resourcestrings umlegen).
  • Zum Übersetzen das Programm poedit (http://sourceforge.net/projects/poedit/) o.ä installieren
  • po-Datei des Projekts, die beim Speichern automatisch erstellt wird, mit poedit öffnen. Links stehen die unübersetzten Texte. Jeden anklicken und die Übersetzung eingeben. Beim Speichern das Sprachkürzel (z.B. "de" für deutsch, "en" für englisch, "it" für italienisch, "es" für spanisch etc) vor der Endung .po verwenden (also: Projekt "MeinEditor.lpi" --> Übersetzungsvorlage, die mit peedit übersetzt wird: "MeinEditor.po" --> deutsche Übersetzung "MeinEditor.de.po", englische Übersetzung "MeinEditor.en.po", etc).
  • Zum Umschalten der Sprache gibt es verschiedene Möglichkeiten, z.B. einen Menüpunkt für jede Sprache erstellen, im OnClick folgenden Code aufrufen

Code: Alles auswählen

 
procedure TMainForm.MenuBtnEnglischClick(Sender: TObject);
begin
  SetDefaultLang('en');
end;  
 
procedure TMainForm.MenuBtnDeutschClick(Sender: TObject);
begin
  SetDefaultLang('de');
end;
 
//etc.
 
Ich hoffe, ich habe nichts vergessen, ansonsten melde dich nochmals. Es gibt übrigens hier im Forum einen Beitrag, der die mo-Dateien (statt der po-Dateien) bevorzugt - geht auch (aber noch nicht von mir getestet).

Übrigens: im Ordner "Examples\Translation" der Lazarus-Installation findest du ein ausgearbeitetes Beispiel mit vielen Kommentaren (allerdings wieder in Englisch - wenn du ernsthaft erwägst, Programmieren zu lernen, würde ich dir dringend raten, zumindest Grundzüge von Englisch zu lernen (Volkshochschulkurs über Englisch zu belegen, oder im Fernsehen Telekolleg)

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

@wp_xyz:

...hmm, das kann's irgendwie doch nicht so ganz gewesen sein. In der Doku steht noch irgendwas von 'LBFiles' was ich aber in dem Zusammenhang auch nicht richtig verstehe. Muss man jetzt für alles was geändert werden soll eine Funktion schreiben, die die 'LBFiles' anpasst. Wenn ja wäre das ein irre hoher Aufwand, denn mit dem Setzen der DefaultLanguage alleine tritt auch bei mir keine Änderung der Oberfläche ein. Übersetzung habe ich kompiliert, .mo und .po Dateien sind vorhanden, aber dieser Code ändert nichts:

Code: Alles auswählen

 
procedure TFrmMain.MenItDEClick(Sender: TObject);
begin
  MenItDE.Checked:=TRUE;
  MenItEN.Checked:=FALSE;
  SetDefaultLang('de');
  GetLocaleFormatSettings($407, DefaultFormatSettings);
end;
 
procedure TFrmMain.MenItENClick(Sender: TObject);
begin
  MenItEN.Checked:=TRUE;
  MenItDE.Checked:=FALSE;
  SetDefaultLang('en');
  GetLocaleFormatSettings($409, DefaultFormatSettings);
end;
 
...ah, und vielleicht nicht ganz unwichtig - unter WINDOWS - weil laut Doku soll's ja unter LINUX noch nicht funktionieren!

NACHTRAG: Habe grade meinen Fehler bemerkt, hatte die Datei .po nicht in .de.po umbenannt. Tja, wer lesen kann, ..... :shock:

Allerdings bleibt noch ein Haken umwandeln in Englisch geht, aber nicht mehr zurück, erst nach Neustart des Programms.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wie wird i18N eingebunden

Beitrag von Christian »

Nein, geht auch zurück. Dazu musst du natürlich auch eine .de.po haben...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

Christian hat geschrieben:Nein, geht auch zurück. Dazu musst du natürlich auch eine .de.po haben...
...hatte ich auch, nur blöderweise genauso formatiert wie die englische :oops: peinlich, peinlich, schäm.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

...habe jetzt die englischen Begriffe aus der deutschen .de.po Datei rausgenommen, hat aber leider zu keiner Änderung geführt, kann also nicht zu deutsch zurück switchen. Kann es sein, dass man in der .de.po Datei die deutsche "Übersetzung" im Übersetzungsteil wiederholen muss?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

OK, hab's jetzt nochmal ausprobiert und es ist in der Tat so, dass auch bei der deutschen po-Datei im Übersetzungsteil die deutschen Begriffe übernommen werden müssen, da sonst das Zurückschalten auf Deutsch misslingt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

@lycaner
Der Einfachheit halber ist zu überlegen eine eigene Unit (z. B. GlobalTerms) zu erstellen und dorthin alle Ressourcenstrings zu transferieren, erleichtert die spätere Pflege ungemein. Sind damit die Fragen geklärt?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

...was mir sonst noch aufgefallen ist, dass es zumindest unter Windows einen Bug in Lazarus gibt, der das Umschalten der Sprachen erheblich erschwert, nämlich dass in Windows (deutsch) Double/Float mit Kommata möglich sind, in Windows (englisch) nach Umschalten dies aber zu einer Exception beim Cast von einem String (Textfeld) in einen Double/Float-Wert führt, da diese offensichtlich einen Wert mit Punkt (wie unter Linux auch) erwartet. Linux-Float/Double-Werte scheinen immer einen Punkt zu erwarten, daher ist zum systemübergreifenden Kompilieren bei mir bei der entsprechenden Funktion folgender Code eingetragen:

Code: Alles auswählen

 
 
  {$ifdef WINDOWS}
  if (key='.') then key:=',';
  {$endif WINDOWS}
  {$ifdef LINUX}
  if (key=',') then key:='.';
  {$endif LINUX}
 
nur lässt sich so was nicht zur Laufzeit erzeugen, oder? Kennt jemand einen Workaround?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Wie wird i18N eingebunden

Beitrag von wp_xyz »

Du musst nach dem Umschalten der Sprache "GetLocaleFormatSettings(LCID, DefaultFormatSettings)" aufrufen, wobei für LCID die Kennnummer der neuen Sprache einzusetzen ist (de: $407, en: $409, siehe https://msdn.microsoft.com/en-us/goglobal/bb964664.aspx). Geht aber nur für Windows.

Hast du dir eigentlich schon mal das Beispiel "translation" im Lazarus/Examples Ordner angesehen?

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

wp_xyz hat geschrieben:Du musst nach dem Umschalten der Sprache "GetLocaleFormatSettings(LCID, DefaultFormatSettings)" aufrufen, wobei für LCID die Kennnummer der neuen Sprache einzusetzen ist (de: $407, en: $409, siehe https://msdn.microsoft.com/en-us/goglobal/bb964664.aspx). Geht aber nur für Windows.

Hast du dir eigentlich schon mal das Beispiel "translation" im Lazarus/Examples Ordner angesehen?
Dann darf ich auf mein weiter oben genanntes Code-Beispiel verweisen?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Wie wird i18N eingebunden

Beitrag von wp_xyz »

Was willst du damit sagen? Dein Beispiel oben ist richtig. Wenn's nicht geht, machst du etwas anderes falsch.

Schau dir das genannte Beispiel-Programm an. Füge ein TEdit ins Hauptformular und ins OnEditingDone Ereignis schreibst du "StrToFloat(Edit1.Text)". Starte das Programm, es beginnt zunächst mit der englischen Übersetzung. Tippe ins Edit-Feld eine Zahl mit Dezimalpunkt, klicke einen Button, damit OnEditingDone aufgerufen wird. --> alles ok. Jetzt wähle die deutsche Übersetzung, klicke ins Edit, aber lasse den Text im Edit unverändert, klicke wieder einen Button, um OnEditingDone aufzurufen --> Exception, weil beim Wechsel der Sprache die DefaultSettings für Deutsch, also mit Dezimal-Komma, eingestellt worden sind.

Achtung: Das Beispiel-Programm kommt in der trunk-Version nicht durch den Compiler, ergänze in der Uses-Liste die Units SysUtils und Windows. Hab' dazu gerade einen Bug-Report geschrieben.

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Wie wird i18N eingebunden

Beitrag von and4more »

@wp_xyz:
...damit wollte ich sagen, dass der Code bereits genau so aussieht, wie es Du es genannt hast und es im Tutorial empfohlen ist und daher funktioniert auch die Umschaltung zwischen den Sprachen einwandfrei, aber wenn man die Sprachen umschaltet ändert sich die Art und Weise wie Float/Double-Zahlen im Programm bearbeitet werden, in Deutsch also mit Komma, in Englisch mit Punkt. Entsprechende Casts eines Textfeldes führen also wenn man, während das Programm läuft, umschaltet zu einer Exception, da im Englischen Float/Double-Zahlen mittels Punkt dargestellt und bearbeitet werden und im Deutschen eben mit einem Komma.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Antworten