Einzelnen Beitrag anzeigen

Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 10.3 Rio
 
#27

Re: Programm in mehreren Sprachen(keine Programmiersprachen)

  Alt 26. Aug 2008, 13:56
Hallo.

Ich gebe auch mal gerne meinen Senf zum WinLocalizer ab:
  • Generell: Schönes Tool
  • Eine Versionsnummer wäre nicht schlecht. So wären Änderungen in der Unit ggf. auch ohne WinMerge ersichtlich.
  • Könnte ein bisschen abwärtskompatibler sein (StrictDelimiter fehlt zB unter D6). Als Ersatz verwende ich hier zZt eine Implementierung aus FPC (siehe unten).
  • Vielleicht auch wegen letztem Punkt kommt es ab und zu zu einem Fehler "3f: Increment: Increment failed" bei "CopyMemory(@Res[1], ResItem, Size);" in der Funktion NewLoadResString bei Ersetzungen für ResourceStrings, sodass dieser Fehlertext als Übersetzung angezeigt wird. Ich weiss noch nicht wieso der Fehler auftritt, aber hier wäre ein Fallback auf die Default-Sprache schön.
  • IMO generelles Problem in TranslateComponent wenn zB einem Label zur Laufzeit bereits ein anderer Wert zugewiesen wurde. Bei Umschaltung der Sprache zur Laufzeit wird der neue Text durch den alten Text des DFMs ersetzt. Man müsste hier Elemente ausgrenzen können. Hier punktet eindeutig GetText.

Delphi-Quellcode:
  TStringList = class(Classes.TStringList)
  private
    function GetDelimitedText : string;
    procedure SetDelimitedText(const AValue : string);
  public
    StrictDelimiter : boolean;
    property DelimitedText : string read GetDelimitedText write SetDelimitedText;
  end;

function TStringList.GetDelimitedText: string;
var
  I : integer;
  P : pchar;
begin
  {$IFDEF FPC}CheckSpecialChars;{$ENDIF}
  Result := '';
  for I := 0 to Count-1 do begin
    P := pchar(Strings[I]);
    if not StrictDelimiter then
      while not(P^ in [#0..' ', QuoteChar, Delimiter]) do inc(P)
    else
      while not(P^ in [QuoteChar, Delimiter]) do inc(P);
    // strings in list may to contain #0
    if P <> (pchar(Strings[I]) + length(Strings[I])) then
      Result := Result + QuoteChar + Strings[I] + QuoteChar
    else
      Result := Result + Strings[I];
    if I < Count-1 then Result := Result + Delimiter;
  end;
  if (length(Result) = 0) and (Count = 1) then Result := QuoteChar + QuoteChar;
end;

procedure TStringList.SetDelimitedText(const AValue : string);
var
  I, J : integer;
  aNotFirst : boolean;
begin
  {$IFDEF FPC}CheckSpecialChars;{$ENDIF}
  BeginUpdate;
  I := 1;
  aNotFirst := false;
  try
    Clear;
    while I <= length(AValue) do begin
      // skip delimiter
      if aNotFirst and (I <= length(AValue)) and (AValue[I] = Delimiter) then inc(I);
      // skip spaces
      if not StrictDelimiter then
        while (I <= length(AValue)) and (ord(AValue[I]) <= ord(' ')) do inc(I);
      // read next string
      if I <= length(AValue) then begin
        if AValue[I] = QuoteChar then begin
          // next string is quoted
          J := I + 1;
          while (J <= length(AValue)) and ((AValue[J] <> QuoteChar) or
             ((J+1 <= length(AValue)) and (AValue[J+1] = QuoteChar))) do
            if (J <= length(AValue)) and (AValue[J] = QuoteChar) then
              inc(J, 2)
            else
              inc(J);
          // J is position of closing quote
          Add(StringReplace(Copy(AValue, I+1, J-I-1), QuoteChar + QuoteChar, QuoteChar, [rfReplaceAll]));
          I := J + 1;
        end
        else begin
          // next string is not quoted
          J := I;
          if not StrictDelimiter then
            while (J <= length(AValue)) and (ord(AValue[J]) > ord(' ')) and (AValue[J] <> Delimiter) do inc(J)
          else
            while (J <= length(AValue)) and (AValue[J] <> Delimiter) do inc(J);
          Add(copy(AValue, I, J-i));
          I := J;
        end;
      end
      else
        if aNotFirst then Add('');
      // skip spaces
      if not StrictDelimiter then
        while (I <= length(AValue)) and (ord(AValue[I]) <= ord(' ')) do inc(I);
      aNotFirst:=true;
    end;
  finally
    EndUpdate;
  end;
end;
  Mit Zitat antworten Zitat