Difference between revisions of "Translations / i18n / localizations for programs"
Line 56: | Line 56: | ||
end; | end; | ||
</pascal> | </pascal> | ||
+ | |||
+ | ==Compiling po files into the executable== | ||
+ | |||
+ | If you don't want to install the .po files, but put all files of the application into the executable, use the following: | ||
+ | |||
+ | *Create a new unit (not a form!). | ||
+ | *Convert the .po file(s) to .lrs using tools/lazres: | ||
+ | <pre> | ||
+ | ./lazres unit1.lrs unit1.de.po | ||
+ | </pre> | ||
+ | This will create an include file unit1.lrs beginning with | ||
+ | <pascal> | ||
+ | LazarusResources.Add('unit1.de','PO',[ | ||
+ | ... | ||
+ | </pascal> | ||
+ | *Add the code: | ||
+ | <pascal> | ||
+ | uses LResources, Translations; | ||
+ | |||
+ | resourcestring | ||
+ | MyCaption = 'Caption'; | ||
+ | |||
+ | function TranslateUnitResourceStrings: boolean; | ||
+ | var | ||
+ | r: TLResource; | ||
+ | POFile: TPOFile; | ||
+ | begin | ||
+ | r:=LazarusResources.Find('unit1.de','PO'); | ||
+ | POFile:=TPOFile.Create; | ||
+ | try | ||
+ | POFile.ReadPOText(r.Value); | ||
+ | Result:=Translations.TranslateUnitResourceStrings('unit1',POFile); | ||
+ | finally | ||
+ | POFile.Free; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | initialization | ||
+ | {$I unit1.lrs} | ||
+ | |||
+ | </pascal> | ||
+ | * Call TranslateUnitResourceStrings at the beginning of the program. You can do that in the initialization section if you like. | ||
==Future work / ToDos== | ==Future work / ToDos== |
Revision as of 16:28, 9 February 2009
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
한국어 (ko) │
polski (pl) │
português (pt) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Overview
This is about how a program can use different strings for various languages like english, chinese, german, finnish, italian, ... . Basically it works like this: Add a resourcestring for every caption, compile to get the .rst and/or .po files (the IDE can do this automatically), create one translated .po file for each language (there are free graphical tools) and use the functions of the LCL translations unit to load the right one at start of the program.
Resourcestrings
For example
resourcestring Caption1 = 'Some text'; HelloWorld1 = 'Hello World';
These are like normal string constants, that means you can assign them to any string. For example
Label1.Caption := HelloWorld1;
When fpc compiles them, it creates for each unit a file unitname.rst, containing the resourcestring data (name + content).
.po Files
There are many free graphical tools to edit .po files, which are simple text like the .rst files, but with some more options, like a header providing fields for author, encoding, language and date. Every fpc installation provides the tool rstconv (windows: rstconv.exe). This tool can be used to convert a .rst file into a .po file. The IDE can do this automatically. Examples for free tools: kbabel, poedit.
Example using rstconv directly:
rstconv -i unit1.rst -o unit1.po
Translating
For every language the .po file must be copied and translated. The LCL translation unit uses the common language codes (en=english, de=german, it=italian, ...) to search. For example the german translation of unit1.po would be unit1.de.po. This means, copy the unit1.po file to unit1.de.po, unit1.it.po, and whatever language you want to support and then the translators can edit their specific .po file.
Note to brazilians/portugueses:: Lazarus IDE and LCL has only brazillian portuguese translations and these files are 'pb.po' extensions and not 'pt.po'.
IDE options for automatic updates of .po files
- The unit containing the resource strings must be added to the package or project.
- You must provide a .po path, this means a separate directory. For example: create a sub directory language in the package / project directory. For projects go to the Project > Project Options. For packages go to Options > IDE integration.
Translating Forms, Datamodules and Frames
When the i18n option is enabled for the project / package then the IDE automatically creates .lrt files for every form. It creates the .lrt file on saving a unit. So, if you enable the option for the first time, you must open every form once, move it a little bit, so that it is modified, and save the form. For example if you save a form unit1.pas the IDE creates a unit1.lrt. And on compile the IDE gathers all strings of all .lrt files and all .rst file into a single .po file (projectname.po or packagename.po) in the i18n directory.
Translating at start of program
For every .po file, you must call TranslateUnitResourceStrings of the LCL translations unit. For example:
<pascal>
{First of all: add "gettext" and "translations" units in uses clause} procedure TForm1.FormCreate(Sender: TObject); var PODirectory, Lang, FallbackLang: String; begin PODirectory := '/path/to/lazarus/lcl/languages/'; GetLanguageIDs(Lang, FallbackLang); // in unit gettext TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang); MessageDlg('Title', 'Text', mtInformation, [mbOk, mbCancel, mbYes], 0); end;
</pascal>
Compiling po files into the executable
If you don't want to install the .po files, but put all files of the application into the executable, use the following:
- Create a new unit (not a form!).
- Convert the .po file(s) to .lrs using tools/lazres:
./lazres unit1.lrs unit1.de.po
This will create an include file unit1.lrs beginning with <pascal> LazarusResources.Add('unit1.de','PO',[
...
</pascal>
- Add the code:
<pascal> uses LResources, Translations;
resourcestring
MyCaption = 'Caption';
function TranslateUnitResourceStrings: boolean; var
r: TLResource; POFile: TPOFile;
begin
r:=LazarusResources.Find('unit1.de','PO'); POFile:=TPOFile.Create; try POFile.ReadPOText(r.Value); Result:=Translations.TranslateUnitResourceStrings('unit1',POFile); finally POFile.Free; end;
end;
initialization
{$I unit1.lrs}
</pascal>
- Call TranslateUnitResourceStrings at the beginning of the program. You can do that in the initialization section if you like.
Future work / ToDos
IDE Development: Translations, i18n, lrt, po files