Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.464 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: gettext sucht nur im default.mo

  Alt 19. Jun 2020, 08:51
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

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.
Thomas Mueller
  Mit Zitat antworten Zitat