[Lazarus] TPOFile.Translate always fails on the Identifier lookup

Mattias Gaertner nc-gaertnma at netcologne.de
Sat Mar 1 20:17:31 CET 2008

On Sat, 1 Mar 2008 20:08:04 +0200
"Graeme Geldenhuys" <graemeg.lists at gmail.com> wrote:

> Hi,
> I'm using LCL's translations.pas unit in fpGUI. I have simply removed
> the LCL specific units from the uses clause and replaced it with FPC
> or fpGUI ones. The actual processing of the POFiles are identical,
> nothing has changed. I have two queries though....
> 1) Why doesn't the translations.pas unit use FPC's standard
> TFPObjectHashTable class, but instead opt for a custom written
> TStringHashList (StringHashList.pas unit)? 

AFAIR TStringHashList existed first.

> What is the benefit of
> using the StringHashList unit?

AFAIK TStringHashList is faster.

> 2) In the code below (TPOFile.Translate), the first lookup using
> FIdentifierToItem.Data[] always returns nil. It seems that the lookup
> via the Identifier (eg: gfx_constants.rsLanguage) always fails. Has
> anybody else noticed this in the LCL as well?

Maybe the russian .po file is buggy?
Uncomment the debugln in TPOFile.Add and see what is added.

> The standard (runtime loaded) translation files (*.po) was created
> from the original English include file.  Now if I change fpGUI's
> default language to say Russian, the only way to do a successful PO
> lookup is via the resourcestring identifier (eg:
> gfx_constants.rsLanguage), because the original string in the PO files
> are based on the English language.
> Anybody got any clues as to why the FIdentifierToItem.Data[] always
> returns nil? I even replaced the the internal hash class from
> TStringListHash to FPC's TFPObjectHashTable, but the problem still
> persists!
> ----------------------- COPY -------------------------
> function TPOFile.Translate(const Identifier, OriginalValue: String):
> String; var
>   Item: TPOFileItem;
> begin
>   Item:=TPOFileItem(FIdentifierToItem.Data[Identifier]);
>   if Item=nil then
>     Item:=TPOFileItem(FOriginalToItem.Data[OriginalValue]);
>   if Item<>nil then begin
>     Result:=Item.Translation;
>     if Result='' then RaiseGDBException('TPOFile.Translate
> Inconsistency'); end else
>     Result:=OriginalValue;
> end;
> ----------------------- END -------------------------
> If the problem is still not clear, I can try and create a small demo
> project doing exactly what fpGUI does, which will highlight the issue.

That will help.


More information about the Lazarus mailing list