Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi GNU Gettext - AV beim Übersetzen (https://www.delphipraxis.net/91210-gnu-gettext-av-beim-uebersetzen.html)

xZise 1. Mai 2007 15:51


GNU Gettext - AV beim Übersetzen
 
Ich benutze das aktuelle GNU Gettext von Dieser Seite...

Problem ist jetzt, dass ich eine AV bekomme, sobald ich das Programm starte... Ich habe schon alles Versucht, also die Überstzung an die Exe anzuhängen oder die in den Ordner zu kopieren... hat nichts gebracht ...

[edit]Ich habe die gnugettext.pas in der uses des Projects und in der uses der Form... Und dann rufe ich im Create auch nur "TranslateComponents(self)" auf...[/edit]

Ralf Kaiser 1. Mai 2007 16:57

Re: GNU Gettext - AV beim Übersetzen
 
Welche Komponenten benutzt du in deinem Projekt?

Bei manchen Komponenten gibts es Probleme und die müssen dann von der Übersetzung ausgeschlossen werden!!

So erzeugt das TMS AdvGrid z.B. intern beim Start einige unsichtbare Controls (z.B. ein TRichEdit) die aber zur Erstellungszeit keinen Parent haben was zu Problemen mit dxGetText führt. dxGetText hat dazu extra Routinen mit denen man diese Controls ausschliessen kann (TP_GlobalIgnore bzw. TP_GlobaIgnoreClass)

Versuch doch mal festzustellen, WELCHE Controls die Probleme verursachen indem du ein Projekt mit dxGetText Schrittweise mit den Komponenten "ausrüstest" die du in deinem Problemprojekt benutzt.

Ciao,
Ralf

xZise 1. Mai 2007 17:02

Re: GNU Gettext - AV beim Übersetzen
 
Ui...
Also ToolBar ( + Buttons/Trenner), TreeView, CheckListBox, Memo, Edit, CheckBox, BitButtons und ein Mainmenu...
Wobei dieser Fehler in der Unit auftritt, wo er
sl.Assgin(s) aufruft... Ich weiß gerade nicht wo er dass macht...

[edit]Ah... Ich habs: In der Funktion "TranslateStrings"
Delphi-Quellcode:
procedure TGnuGettextInstance.TranslateStrings(sl: TStrings;const TextDomain:string);
var
  line: string;
  i: integer;
  s:TStringList;
begin
  if sl.Count > 0 then begin
    sl.BeginUpdate;
    try
      s:=TStringList.Create;
      try
        s.Assign (sl);
        for i:=0 to s.Count-1 do begin
          line:=s.Strings[i];
          if line<>'' then
            s.Strings[i]:=dgettext(TextDomain,line);
        end;
        sl.Assign(s); // <!--- Hier kommt die AV... (Wahrscheinlich ist sl nil?)
      finally
        FreeAndNil (s);
      end;
    finally
      sl.EndUpdate;
    end;
  end;
end;
[/edit]

Ralf Kaiser 1. Mai 2007 19:42

Re: GNU Gettext - AV beim Übersetzen
 
Tritt der Fehler bei einem leeren Projekt auf? (wahrscheinlich nicht :) )

Danach füge dem leeren Projekt einfach mal schrittweise die benutzen Komponenten hinzu. Starte zwischendurch das Projekt und kontrolliere ob der AV auftritt.

Irgendwann wirst du die Komponente bei der dieser Fehler auftritt identifiziert haben. Laut deiner Beschreibung ist es wohl eine die als Property eine Stringlist enthält, ich tippe jetzt einfach mal auf das Memo.

Bleiben wir bei dem Beispiel Memo: Um die Stringlist von der automatischen Übersetzung durch dxGetText auszuschliessen kannst du sie von dxGetText einfach ignorieren lassen. Füge dazu vor dem TranslateComponent() Aufruf noch diese Anweisung hinzu:

Delphi-Quellcode:
TP_IgnoreClass(TMemoStrings);
(Ob die Routine wirklich "TP_IgnoreClass" heisst weiss ich im Moment nicht mehr im Kopf und ich habe im Moment hier kein dxGetText installiert, schau bitte in der Doku zu dxGetText nach, es gibt mehrere "Ignore" Routinen für unterschiedliche Zwecke)

Ansonsten musst du noch ein wenig rumprobieren aber meistens handelt es sich um solche (Komponenten-)internen Stringlisten die Probleme machen. Für solche SAchen ist dxGetText ja auh eigentlich nicht gedacht, da sie ja selten statische Texte enthalten die lokalisiert werden müssen.

Hoffe das hilft ein wenig,
Ralf

xZise 1. Mai 2007 20:39

Re: GNU Gettext - AV beim Übersetzen
 
Danke... Die waren es ;) Einmal ignorieren und schon funktionierts ;) Danke!

Nur übersetzt er es jetzt nicht ... Ich habe eine Deutsche Oberfläche und englische mo als deutsch deklariert (um nicht um zu stellen)... Habe auch die Übersetzungen eingebettet nur übersetzt er nicht :(

Ralf Kaiser 2. Mai 2007 08:03

Re: GNU Gettext - AV beim Übersetzen
 
Hallo,

ich verwende dxGetText seit Jahren ohne Probleme. Dabei gehe ich so vor:

Ich erstelle die Oberfläche komplett in Englisch (habe auch eine englische delphi-Version. Daher sind auch alle internen Meldungen bzw. Resourcen in Englisch.

Dann übersetze ich die Resourcen mit POEdit in die gewünschte(n) Sprache(n).

Im Programm wird jeweils in OnCreate der folgende Code ausgeführt:

Delphi-Quellcode:
UseLanguage(MeineGewuenschteSprache);
TranslateComponent(Self)
Die Variable "MeineGewuenschteSprache" bezeichnet dabei die sprache auf die umgeschaltet werden soll. Verwendet man "UseLanguage" nicht so richtet sich dxGetText nach der Sprache die auf dem aktuellen System Default ist. Auf einem französischen Windows würde dxGetText also versuchen nach Französisch umzuschalten.

Findet dxGetText keine Übersetzungen im Verzsichnis "<APPLICATIONSVERZEICHNIS>\locale\<SPRACHE>\LC_MES SAGES" so tut es eigentlich nichts und es findet keine Übersetzung statt. In meinem Fall würde also alles in Englisch dargestellt.

In welchen Verzeichnissen hast du denn die jeweiligen DEFAULT.MO Dateien für die unterschiedlichen Sprachen gespeichert?

Wie gesagt: sie gehören nach: "<APPLICATIONSVERZEICHNIS>\locale\<SPRACHE>\LC_MES SAGES". Sprache sollte dabei der 2-Buchstaben ISO code der Sprache sein, also z.B. "de" für deutsch oder "fr" für Französisch. Falls nötig kann man das auch noch genauer machen: z.B. "de_AT" für Östereich.

Ciao,
Ralf

sh17 2. Mai 2007 08:29

Re: GNU Gettext - AV beim Übersetzen
 
Zitat:

Zitat von Alfi001
Ich erstelle die Oberfläche komplett in Englisch (habe auch eine englische delphi-Version. Daher sind auch alle internen Meldungen bzw. Resourcen in Englisch.

Wenn man mit Packages arbeitet und die .DE-Dateien weg lässt, sind die Meldungen von Delphi auch in Englisch und werden mit der Delphi-Sprachdatei von GetText mit übersetzt. Dann geht's auch mit nem deutschen Delphi

xZise 2. Mai 2007 13:43

Re: GNU Gettext - AV beim Übersetzen
 
Aber genau dass ist es ja... Ich habe eine englische Sprachdatei, und um Programmierarbeit zu sparen, habe ich die als deutsch deklariert.
Diese habe ich dann in den Ordner \locale\de_DE\LC_Messages kopiert... Keine Reaktion...

Dann habe ich rechts auf die exe geklickt und "Embed Translations" (o.s.ä.) aufgerufen... Dabei dann beide deutsche Dateien angehängt und ausgeführt => Wieder nichts... Kann es ggf. daran liegen, dass ich die Klasse TStrings (wegen der Memo) ignoriert habe?

sh17 2. Mai 2007 14:58

Re: GNU Gettext - AV beim Übersetzen
 
Zitat:

Zitat von xZise
Kann es ggf. daran liegen, dass ich die Klasse TStrings (wegen der Memo) ignoriert habe?

Im allgemeinen sollten nur grafische Komponenten ignoriert werden, TStrings gehört nicht dazu.

Des weiteren muss die automatisch geladene Übersetzungsdatei unterhalb von LC_Messages default.mo heissen.

Weitere Uebersetzungsdateien bekommst Du mit dem Befehl

Delphi-Quellcode:
AddDomainForResourceString ('delphi');
dazu (hier fuer delphi.mo)

//Edit

Beispiele für zu ignorierende Klassen

Delphi-Quellcode:
  TP_GlobalIgnoreClassProperty(TAction,'Category');
  TP_GlobalIgnoreClassProperty(TControl,'HelpKeyword');
  TP_GlobalIgnoreClassProperty(TNotebook,'Pages');
  TP_GlobalIgnoreClass(TFont);
  TP_GlobalIgnoreClass(TPrintFormComboBox);
  TP_GlobalIgnoreClass(TFontComboBox);
  TP_GlobalIgnoreClass (TWebBrowser);
  TP_GlobalIgnoreClassProperty(TDBComboBox,'DataField');
  TP_GlobalIgnoreClassProperty(TDBCheckBox,'DataField');
  TP_GlobalIgnoreClassProperty(TDBEdit,'DataField');
  TP_GlobalIgnoreClassProperty(TDBImage,'DataField');
  TP_GlobalIgnoreClassProperty(TDBListBox,'DataField');
  TP_GlobalIgnoreClassProperty(TDBLookupControl,'DataField');
  TP_GlobalIgnoreClassProperty(TDBLookupControl,'KeyField');
  TP_GlobalIgnoreClassProperty(TDBLookupControl,'ListField');
  TP_GlobalIgnoreClassProperty(TDBMemo,'DataField');
  TP_GlobalIgnoreClassProperty(TDBRadioGroup,'DataField');
  TP_GlobalIgnoreClassProperty(TDBRichEdit,'DataField');
  TP_GlobalIgnoreClassProperty(TDBText,'DataField');
  TP_GlobalIgnoreClassProperty(TTdbStringField,'FieldName');
  TP_GlobalIgnoreClassProperty(TWideStringField,'FieldName');

xZise 2. Mai 2007 17:44

Re: GNU Gettext - AV beim Übersetzen
 
1. Heißt die datei default.mo.
2. Wie ist das bei eigebundenen Übersetzungen?
3. Hat das ignorieren der Eigenschaft "Lines" bei TMemo nichts "neues" gebracht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz