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)?  What is the benefit of
using the StringHashList unit?

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?

The reason I detected it, is because fpGUI can change it's default
compiled language. It uses include files to pull in the correct
translation based on a $DEFINE statement.  This code is show below...

------------ COPY ---------------
{ Define Compiler language symbol (eg: de for German) to include the correct
  language resource file otherwise the Default (English) resource file will
  be used. }

{.$DEFINE de}     // German
{.$DEFINE ru}     // Russian
{.$DEFINE fr}     // French
{.$DEFINE pt}     // Portuguese (Brazil)
{.$DEFINE za}     // Afrikaans
{.$DEFINE it}     // Italian


{$IF defined(de)}
  {$I lang_german.inc}

{$ELSEIF defined(ru)}
  {$I lang_russian.inc}

{$ELSEIF defined(fr)}
  {$I lang_french.inc}

{$ELSEIF defined(pt)}
  {$I lang_portuguese.inc}

{$ELSEIF defined(za)}
  {$I lang_afrikaans.inc}

{$ELSEIF defined(it)}
  {$I lang_italian.inc}

{$ELSE}
  {$I lang_english.inc}
{$IFEND}
-------------- END ---------------


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.

By the way, I'm trying all this under Linux and changing the LANG
environment variable.

Regards,
  - Graeme -


_______________________________________________
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
_______________________________________________
Lazarus mailing list
[email protected]
http://www.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to