This chapter discusses shortly how to use the Internationalization (I18N) features of GNU Pascal.
You need to have gettext installed. Try to compile demos/gettextdemo.pas. Furthermore, you should download a tool named pas2po from http://www.gnu-pascal.org/contrib/eike/.
We would like to translate the messages provided with this simple example different languages (here: German) without touching the source for each language:
program Hello1; begin WriteLn ('Hello, World!'); WriteLn ('The answer of the questions is: ', 42) end.
To do so, we must prepare the source to use gettext:
program Hello2; uses GPC, Intl; var s: TString; begin Discard (BindTextDomain ('hello2', '/usr/share/locale/')); Discard (TextDomain ('hello2')); WriteLn (GetText ('Hello, World!')); s := FormatString (GetText ('The answer of the questions is %s'), 42); WriteLn (s) end.
BindTextDomain sets the path to find our message catalogs in the system. This path is system dependent. TextDomain tells the program to use this catalog. GetText looks up the given string in the catalog and returns a translated string within the current locale settings. FormatString replaces some format specifiers with the following argument. %s is the first following argument. After this step is done, we do not need to touch the sourcefile any longer. The output of this program is as follows:
Hello, World! The answer of the questions is 42
There are lots of strings in the above example, but only those surrounded with GetText should be translated. We use pas2po hello2.pas -o hello2.po to extract the messages. The output is:
# This file was created by pas2po with 'hello2.pas'. # Please change this file manually. # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2003-04-27 20:48+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #hello2.pas:10 msgid "Hello, World!" msgstr "" #hello2.pas:11 msgid "The answer of the questions is %s" msgstr ""
Now we translate the message ids into German language, and set some needful informations at their appropriate places. The following steps must be repeated for each language we would like to support:
# This file was created by pas2po with 'hello2.pas'. # Copyright (C) 2003 Free Software Foundation, Inc. # Eike Lange <email@example.com>, 2003. msgid "" msgstr "" "Project-Id-Version: Hello2 1.0\n" "POT-Creation-Date: 2003-04-27 12:00+0200\n" "PO-Revision-Date: 2003-04-27 12:06+0200\n" "Last-Translator: Eike Lange <firstname.lastname@example.org>\n" "Language-Team: de <email@example.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #hello2.pas:10 msgid "Hello, World!" msgstr "Hallo, Welt!" #hello2.pas:11 msgid "The answer of the questions is %s" msgstr "'%s' lautet die Antwort auf die Frage."
Please note that we swapped text and numeric arguments and added some single quotes arround the first argument. We compile the message catalog with msgfmt -vv hello2.po -o hello2.mo and install the file hello2.mo at /usr/share/locale/de/LC_MESSAGES/ With a german locale setting, the output should be as follows:
Hallo, Welt! '42' lautet die Antwort auf die Frage.
The topmost path where message catalogs reside is system dependent:
Gettext (gettext), FormatString, Intl.