Den Olivier Guilbaud frag ich, wenn alle Stricke reißen. Vorerst vermute ich, liegt das Problem an irgendeiner Compiler-Einstellung. Also ich hab das Problem noch ein wenig weiter eingegrenzt.
Die nicht gefundenen Identifier "ResourceStringTableCount" bzw. "SetResourceStringValue", etc. gehören zu einer Gruppe aus "package 'rtl'", die hier gelistet sind:
http://lazarus-ccr.sourceforge.net/docs ... dex-8.html" onclick="window.open(this.href);return false;
Klicke ich dort auf "SetResourceStringValue", wird mir dieses schöne kleine
Beispielprogramm angeboten:
Code: Alles auswählen
Program project1;
{ Program to demonstrate the SetResourceStringValue function. }
{$Mode Delphi}
ResourceString
First = 'First string';
Second = 'Second String';
Var I,J : Longint;
S : AnsiString;
begin
{ Print current values of all resourcestrings }
For I:=0 to ResourceStringTableCount-1 do
For J:=0 to ResourceStringCount(i)-1 do
begin
Writeln ('Translate => ',GetResourceStringDefaultValue(I,J));
Write ('->');
Readln(S);
SetResourceStringValue(I,J,S);
end;
Writeln ('Translated strings : ');
For I:=0 to ResourceStringTableCount-1 do
For J:=0 to ResourceStringCount(i)-1 do
begin
Writeln (GetResourceStringDefaultValue(I,J));
Writeln ('Translates to : ');
Writeln (GetResourceStringCurrentValue(I,J));
end;
end.
Damit habe ich dann flugs selbst ein Projekt angelegt und die Compilierung hängt an der gleichen Stelle. Es muss aber doch möglich sein, solch ein Lazarus-Programm aus der Lazarus-Dokumentation mit Lazarus an's Laufen zu kriegen! Das kann doch nur eine Kompilereinstellung sein!
Dann hab ich die entsprechenden Befehle auch in der Unit "Translations" gefunden, allerdings in einen Compiler-Switch für FPC Vers. 2_0 eingeschlossen:
Code: Alles auswählen
Unit Translations
...
{$ifdef ver2_0}
for TableID:=0 to ResourceStringTableCount - 1 do begin
.....
end;
{$else ver2_0}
SetUnitResourceStrings(ResUnitName,@Translate,po);
{$endif ver2_0}
So wie ich diesen Compiler-Switch verstehe, gelten in dieser Unit die Funktionen Resource-Strings betreffend nur für Vers 2.0.xy. Ich habe aber 2.2.2.
Aber da kann doch was nicht stimmen. Eine ganze Gruppe von Funktionen, die allgemein ohne Versionsbeschränkung in einer Referenz dokumentiert sind, aber dann in den Units, z.B. Translations, bzgl. ihrer Versionsgültigkeit auf 2.0 eingeschränkt sind.
Versteht das jemand?
Falls das tatsächlich der Fall sein sollte, müsste man in gnugettext nur die folgende Funktion umschreiben unter Verwendung von Funktionen wie " SetUnitResourceStrings(ResUnitName,@Translate,po);" (s. Beispiel oben), dann musste gnugettext eigentlich laufen:
Code: Alles auswählen
{$IFDEF FPC}
Unit gnugettext
...
procedure TranslateAllResourceStrings;
var I,J : Longint;
S : WideString;
begin
{$ifdef DXGETTEXTDEBUG}
DefaultInstance.DebugWriteln('TranslateAllResourceStrings (ResourceStringTableCount='+IntToStr(ResourceStringTableCount)+')');
{$endif}
for I:=0 to ResourceStringTableCount-1 do
begin
for J:=0 to ResourceStringCount(i)-1 do
begin
S:=DefaultInstance.gettext(GetResourceStringDefaultValue(I,J));
SetResourceStringValue(I,J,S);
end;
end;
end;
{$ENDIF}
Würde natürlich erstmal viel Einarbeitung in die Resource-String-Verwaltung erfordern. Aber dann hätte man eine aktuelle brauchbare "gnugettext"
Vielleicht jemand da, der sich mit Resource-String-Verwaltung gut auskennt?
Aber vielleicht liegt es ja auch nur an einer Compilereinstellung (s. Programm ganz oben). Ein Beispielprogramm in der aktuellen Lazarus-Dokumentation, das man nicht mit Copy and Paste an's Laufen kriegt? Das kann doch nicht sein
