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/)
-   -   gettext sucht nur im default.mo (https://www.delphipraxis.net/204676-gettext-sucht-nur-im-default-mo.html)

charly52 18. Jun 2020 08:00

gettext sucht nur im default.mo
 
Hi all,

habe das Problem schon im Forum "Sonstige Fragen zu Delphi"
unter dem Titel "Übersetzungstexte werden nur in der default.mo gesucht" gestellt.
Entweder ist es dort falsch oder ?????

Ich poste es hier aber besser nicht nochmal.

Für etwas Hilfe wäre ich trotzdem sehr verbunden.

Danke

Charly

sh17 18. Jun 2020 08:17

AW: gettext sucht nur im default.mo
 
mittels AddDomainForResourceString kann man weitere Dateien hinzufügen.

z.B. delphi.mo

AddDomainForResourceString ('delphi');

himitsu 18. Jun 2020 09:07

AW: gettext sucht nur im default.mo
 
AddDomainForResourceString hatte er bereits benutzt, aber scheint nicht zu funktionieren.

Ja, der TE hätte natürlich seinen anderen Beitrag verlinken können, damit du es dort hättest sehen können.



Wenn du denkst falsch zu sein, dann kannst drüben gern auf den Report-Knopf drücken und es eventuell verschieben lassen.

Ja, das "Fragen zu Delphi", also zur IDE und Sprache selbst, passt nicht wirklich,
wobei ich denke "Sonstige Werkzeuge" würde gut passen. (aber nun nicht noch einen Post eröffnen)


Und hier in "GUI-Design mit VCL / FireMonkey / Common Controls" bist'e auch falsch.
Wie patziere ich Komponenten auf der Form und was verwende ich (Usability) und wie verwende ich die "Standard"-Komponenten, welche mitgeliefert wurden?


Weiter erstmal dort: https://www.delphipraxis.net/204658-...o-gesucht.html

dummzeuch 18. Jun 2020 09:56

AW: gettext sucht nur im default.mo
 
Zitat:

Zitat von sh17 (Beitrag 1467641)
mittels AddDomainForResourceString kann man weitere Dateien hinzufügen.

z.B. delphi.mo

AddDomainForResourceString ('delphi');

AddDomainForResourceString funktionert halt nur für Ressourcestrings, wie der Name schon impliziert. Direkte Aufrufe von GetText ignorieren die damit hinzugefügten Domains.

Üblicherweise benutzt man Domains aber eigentlich auch, um Übersetzungen für verschiedene Zwecke zu trennen. Z.B. wenn man eine Spezialanwendung für Straßenzustandserfassung und Bewertung schreibt, dann gibt es eine Domain "ZEB", die die ganzen Fachbegriffe umfasst, bei denen es auf wortgenaue Überstzungen ankommt, damit der Anwender sicher ist, worum es geht.

Und dann benutzt man auch DGetText(s, 'ZEB') bzw. TranslateComponent(..., 'ZEB') für die Übersetzung.

Es gibt noch die Funktion TextDomain, die die Default-Domain auf eine andere umstellt TextDomain('ZEB') würde dazu führen, dass alle nachfolgenden GetText-Aufrufe die Domain "ZEB" verwenden (und keine Übersetzungen aus der Domain "default" mehr finden würden).

In diesem Fall ist es gar nicht gewünscht, dass Übersetzungen aus anderen Domains verwendet werden.

Soweit ich mich erinnere, gibt es kein Analog zu AddDomainForResourceString für GetText-Aufrufe.

Wir reden doch hier von gxgettext (bzw. dem Original GnuGettext), oder? Wenn nein, ignoriert alles, was ich geschrieben habe.

charly52 19. Jun 2020 08:12

AW: gettext sucht nur im default.mo
 
Hallo

Zitat:

Wir reden doch hier von gxgettext (bzw. dem Original GnuGettext), oder? Wenn nein, ignoriert alles, was ich geschrieben habe.
Ich benutze ein gnugettext.pas welches bei den Tools von J.Rathlev dabei war. Der letzte Eintrag im Header:

Delphi-Quellcode:
// Changes J. Rathlev (kontakt(a)rathlev-home.de)
//    see: JR - 2011-07-29 / 2012-09-10
//    All Delphi version related compiler switches removed - needs at least Delphi XE2

// Information about this file:
// $LastChangedDate: 2010-08-25 15:40:17 +0200 (mer., 25 août 2010) $
// $LastChangedRevision: 220 $
// $HeadURL: http://svn.berlios.de/svnroot/repos/dxgettext/trunk/dxgettext/sample/gnugettext.pas $
und im Programm sieht es so aus
Delphi-Quellcode:
 

unit XXXX_Help;   Das ist aber KEIN Formular!!!!!

procedure Do_TiPoolTimer(Sender: TObject; Ident: Word; Counter: Integer; projAktiv: Boolean);
begin
  etwas code
 
  txt:= FormatDateTime(_('mm/dd/yyyy'),Now)+' '+FormatDateTime(_('hh:mm AM/PM'),Now);  
end;

ich hoffe jetzt sind die Randbedinungen alle bekannt?

Und noch die grundsätzliche Frage zu meinem Problem:
Wenn ich dem System mehrere Domains bekannt mache, wird dann von _(xxx) automatisch in allen gesucht, oder sollte zumindest in allen gesucht werden?

Danke Charly

dummzeuch 19. Jun 2020 08:51

AW: gettext sucht nur im default.mo
 
Zitat:

Zitat von charly52 (Beitrag 1467744)
Ich benutze ein gnugettext.pas welches bei den Tools von J.Rathlev dabei war. Der letzte Eintrag im Header:

Delphi-Quellcode:
// Changes J. Rathlev (kontakt(a)rathlev-home.de)
//    see: JR - 2011-07-29 / 2012-09-10
//    All Delphi version related compiler switches removed - needs at least Delphi XE2

// Information about this file:
// $LastChangedDate: 2010-08-25 15:40:17 +0200 (mer., 25 août 2010) $
// $LastChangedRevision: 220 $
// $HeadURL: http://svn.berlios.de/svnroot/repos/dxgettext/trunk/dxgettext/sample/gnugettext.pas $

Die Version ist uralt, aber an der prinzipiellen Verwendung hat sich nichts geändert.

Die aktuelle Version gibt's auf Sourceforge

https://svn.code.sf.net/p/dxgettext/...gnugettext.pas

Zitat:

Zitat von charly52 (Beitrag 1467744)
und im Programm sieht es so aus
Delphi-Quellcode:
 

unit XXXX_Help;   Das ist aber KEIN Formular!!!!!

procedure Do_TiPoolTimer(Sender: TObject; Ident: Word; Counter: Integer; projAktiv: Boolean);
begin
  etwas code
 
  txt:= FormatDateTime(_('mm/dd/yyyy'),Now)+' '+FormatDateTime(_('hh:mm AM/PM'),Now);  
end;

ich hoffe jetzt sind die Randbedinungen alle bekannt?

Und noch die grundsätzliche Frage zu meinem Problem:
Wenn ich dem System mehrere Domains bekannt mache, wird dann von _(xxx) automatisch in allen gesucht, oder sollte zumindest in allen gesucht werden?

Wenn JR da nichts grundlegendes geändert hat, wird für direkte gettext() bzw. _()-Aurufe nicht automatisch in allen Domains gesucht sondern nur in der jeweils aktiven (Standard: "default"). In allen Domains suchen passiert nur für RessourceStrings, und auch da nur in denen die mit RegisterDomainForRessourceString registriert wurden.

Man kann natürlich selbst eine _()-Funktion schreiben, die mittels DGetText alle Domains durchgeht, bis eine Übersetzung geliefert wird:

Delphi-Quellcode:
function _(const _s: string): string;
begin
  Result := gettext(_s);
  if Result = _s then begin
    Result := dgettext(_s, domain1);
    if Result = _s then begin
      Result := dgettext(_s, domain2);
      // usw. fuer weitere Domains.
    end;
  end;
end;
Diese muss man dann aber in eine Unit packen, in der sie vor der Funktion in gnugetext.pas gefunden wird.

Am besten dupliziert man die Funktionen aus gnugetext, die man benutzt, (also in der Regel _() und TranslateComponent) in eine eigene Unit mytranslation und bindet nur in dieser Unit gnugettext ein, in allen anderen benutzt man mytranslation statt gnugettext, so dass man sicher ist, welche _()-Funktion aufgerufen wird.

charly52 23. Jun 2020 10:22

AW: gettext sucht nur im default.mo
 
Hi

erstmal sorry für die späte Antwort.
Da gabs ja mal richtig viel Info. Danke!


Zitat:

Wenn JR da nichts grundlegendes geändert hat, wird für direkte gettext() bzw. _()-Aurufe nicht automatisch in allen Domains gesucht sondern nur in der jeweils aktiven (Standard: "default"). In allen Domains suchen passiert nur für RessourceStrings, und auch da nur in denen die mit RegisterDomainForRessourceString registriert wurden.
Dann verstehe ich den Sinn von
AddDomainForComponent('Base');
aber garnicht. Oder wirkt das wiederum nur bei TranslateComponent(self) ?

Vieleicht sollte ich mich doch mal mit der gnugettext befassen. ;-)

Gruß Charly

dummzeuch 23. Jun 2020 11:51

AW: gettext sucht nur im default.mo
 
Zitat:

Zitat von charly52 (Beitrag 1468078)
Hi

erstmal sorry für die späte Antwort.
Da gabs ja mal richtig viel Info. Danke!


Zitat:

Wenn JR da nichts grundlegendes geändert hat, wird für direkte gettext() bzw. _()-Aurufe nicht automatisch in allen Domains gesucht sondern nur in der jeweils aktiven (Standard: "default"). In allen Domains suchen passiert nur für RessourceStrings, und auch da nur in denen die mit RegisterDomainForRessourceString registriert wurden.
Dann verstehe ich den Sinn von
AddDomainForComponent('Base');
aber garnicht. Oder wirkt das wiederum nur bei TranslateComponent(self) ?

Vieleicht sollte ich mich doch mal mit der gnugettext befassen. ;-)

Wie sagte meine Mutter immer so schön: "Man wird alt wie eine Kuh und lernt immernoch dazu." AddDomainForComponent war mir bisher nicht bekannt. Der Kommentar zumindest lässt erstmal vermuten, dass das genau das ist, was Du suchst:

Delphi-Quellcode:
// Add more domains that component strings can be extracted from. If a translation
// is not found in the default domain, this domain will be searched, too.
// This is useful when an application inherits components from a 3rd
// party component libraries
procedure AddDomainForComponent (const domain:DomainString);
procedure RemoveDomainForComponent (const domain:DomainString);
Wenn man dann mal nachschaut, was die Prozedur macht, nämlich eine Domain zur Liste ComponentDomainList hinzufügen, stellt man fest, dass das auch nicht hilft. Diese Liste wird nur in ComponentGetText verwendet, dies wiederum wird nur aufgerufen, wenn eine Property übersetzt wird, welches wiederum nur aus TranslateComponent aufgerufen wird.

Mit anderen Worten: Nein, wieder kein Blumenstrauß.

charly52 23. Jun 2020 15:37

AW: gettext sucht nur im default.mo
 
Hallo

vielen Dank trotzdem.

Ich wühle gerade in diversen gnugettext herum.
Es gibt auch noch was von git (jvgnugettext.pas)
und wohl diverse Varianten von dem im SVN.
Wäre es nicht sinnvoll wieder den Header zu pflegen?
So mit Änderungsdatum usw.

schönen Gruß charly

dummzeuch 23. Jun 2020 19:21

AW: gettext sucht nur im default.mo
 
Zitat:

Zitat von charly52 (Beitrag 1468105)
Ich wühle gerade in diversen gnugettext herum.
Es gibt auch noch was von git (jvgnugettext.pas)
und wohl diverse Varianten von dem im SVN.
Wäre es nicht sinnvoll wieder den Header zu pflegen?
So mit Änderungsdatum usw.

Wenn es noch jemanden gäbe, der sich dafür zuständig fühlte, vielleicht. Den gibt es aber nicht. Lars Dybahl, der eigentliche Maintainer und Betreiber der jeweiligen Webseiten, ist anscheinend nicht mehr besonders interessiert.

Das Projekt wäre schon länger tot, wenn ich nicht noch Schreibzugriff auf das SVN Repository hätte und je nach Lust und Laune mal Bugs fixe (in der Regel nur, wenn mir jemand einen Patch zukommen lässt, oder wenn ich selbst betroffen bin) oder es an neue Delphi-Versionen anpasse. Und ich habe ehrlich gesagt keinen Bock für dieses Projekt auf solche Formalismen zu achten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr.
Seite 1 von 2  1 2   

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