1998-11-09 10:05:24 +08:00
|
|
|
This document exists to document the important things to care for
|
|
|
|
because of locale support.
|
|
|
|
Actually this one is maintained by me, that is Daniel Egger
|
2000-01-02 00:08:09 +08:00
|
|
|
(Daniel.Egger@rz.fh-muenchen.de).
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
1. Why localisation?
|
|
|
|
|
|
|
|
Many persons from many countries start to get used to Linux.
|
|
|
|
Unfortunately not everyone is able to understand English. But
|
2000-01-02 00:08:09 +08:00
|
|
|
even those people sometimes like to use good and free software
|
1999-09-20 16:17:21 +08:00
|
|
|
without using a dictionary to get the unknown words.
|
1998-11-09 10:05:24 +08:00
|
|
|
So why not simply localise the software to make it available to
|
2000-01-02 00:08:09 +08:00
|
|
|
the mass which isn't wholly English native? Of course this also
|
|
|
|
eases the migration from PhotoX to GIMP. :))
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
2. How?
|
|
|
|
|
|
|
|
GNU provides a very nice package called gettext. This one offers
|
|
|
|
the possibility to translate chosen messages from the native language
|
|
|
|
of the program into that one of the users if a necessary catalog is
|
|
|
|
provided. Gettext therefor provides some easy tools to create and maintain
|
|
|
|
such catalogs and a few functions which can be called by the program to
|
1999-09-20 16:17:21 +08:00
|
|
|
enable automatic translation at runtime. The program gets linked to the
|
|
|
|
gettext library or glibc2 which already provides that functionality
|
|
|
|
and everything is fine.
|
1998-11-09 10:05:24 +08:00
|
|
|
By the way: gettext is a fixed part of glibc2 but will be shipped with
|
|
|
|
GIMP and so can be automatically compiled on every platform GIMP itself
|
|
|
|
runs on.
|
|
|
|
|
|
|
|
3. Deep inside...
|
|
|
|
|
1999-09-20 16:17:21 +08:00
|
|
|
GIMP provides header files called gimpintl.h and stdplugins-intl.h in the
|
|
|
|
libgimp directory which check whether gettext is available on the system
|
|
|
|
which GIMP is compiled on and will deactivate language support if it's not.
|
|
|
|
You CAN use such a compiled GIMP even without the catalogs or on a system
|
2000-01-02 00:08:09 +08:00
|
|
|
which dosen't have language support.
|
1999-09-20 16:17:21 +08:00
|
|
|
|
|
|
|
If the gettext system is there it will declare 3 functions which will be
|
|
|
|
described below.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
3.1 _() [more correctly: char * _( char * )]
|
|
|
|
|
2000-01-02 00:08:09 +08:00
|
|
|
This one is a macro for the function gettext(). You can wrap any text with
|
|
|
|
it that is allowed to be a return value of a function. If you use it then
|
|
|
|
libintl will try to translate it into the native language of the
|
1998-11-09 10:05:24 +08:00
|
|
|
user according to his/her environmental settings.
|
2000-01-02 00:08:09 +08:00
|
|
|
The gettext() function will do a lookup in the hashed catalog which contains
|
1998-11-09 10:05:24 +08:00
|
|
|
all the translated texts.
|
|
|
|
|
|
|
|
- If it is found a pointer to the string will be returned to the caller.
|
2000-01-02 00:08:09 +08:00
|
|
|
- If not, the caller will receive a pointer to the original string.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
This way it is ensured that there isn't any harm caused to the program
|
2000-01-02 00:08:09 +08:00
|
|
|
(i.e. The GIMP) if no useful catalog is installed.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
Please note that it is important to use _() directly (and not gettext())
|
|
|
|
for simple messages because of reasons that will be mentioned below.
|
|
|
|
|
1999-09-20 16:17:21 +08:00
|
|
|
NOTE: I know some of the developer like short functions like _() but
|
|
|
|
for a better source understanding I suggest to use it consistently only
|
2000-01-02 00:08:09 +08:00
|
|
|
for text (like _("That's text!")) and not for variables (like _(text) ) BUT
|
|
|
|
gettext(text) instead.
|
1999-09-20 16:17:21 +08:00
|
|
|
|
|
|
|
|
2000-01-06 03:57:02 +08:00
|
|
|
3.2 N_() [more correctly: const char * ( const char * ) ]
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
This one is a macro for the function gettext_noop(). As you can see and
|
2000-01-02 00:08:09 +08:00
|
|
|
guess it doesn't really do anything in the programm i.e. it is a dummy
|
|
|
|
macro but nevertheless important. As it isn't possible to call functions
|
1998-11-09 10:05:24 +08:00
|
|
|
in a structure as seen here:
|
|
|
|
|
|
|
|
struct blurb
|
|
|
|
{
|
|
|
|
_("This won't work\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
you have to do it in some other way. In GIMP such structures are often used
|
2000-01-02 00:08:09 +08:00
|
|
|
to create menus or similar things very simply. Here you have to use the
|
|
|
|
dummy to allow the generation of the template catalog which will be described
|
|
|
|
below. This one doesn't do anything but it marks the text as important to
|
|
|
|
the xgettext extractor.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
2000-01-02 00:08:09 +08:00
|
|
|
The text has to be translated manually with the next function.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
3.3 gettext()
|
|
|
|
|
|
|
|
This function is the same as that mcaro in 3.1. But there is one big
|
1999-09-20 16:17:21 +08:00
|
|
|
difference: The _()'s and N_()'s are the only expressions which get parsed
|
|
|
|
by the template generator.
|
1998-11-09 10:05:24 +08:00
|
|
|
If you have strings that should be translated but are unfortunately in a
|
|
|
|
structure you have to do that on your own which means that you have to
|
|
|
|
parse the fields with the messages in a loop and translate the texts with
|
|
|
|
this gettext() function.
|
|
|
|
|
|
|
|
Please note that it may be necessary to free or allocate memory in this
|
|
|
|
case!
|
|
|
|
|
|
|
|
4. Some magic...
|
|
|
|
|
|
|
|
As you have seen we only did the programming part until now but this isn't
|
|
|
|
all by far.
|
|
|
|
To use catalogs we'll have to create them. Now there are 3 different files
|
|
|
|
which are importart:
|
|
|
|
|
|
|
|
gimp.pot:
|
|
|
|
|
|
|
|
This one is the so called template. It contains the messages which are
|
|
|
|
extracted from the sources and empty fields which have to get filled by the
|
|
|
|
author. It is used to start a new catalog or to update the an already
|
|
|
|
available one.
|
|
|
|
|
|
|
|
The Makefile will automatically call the program gettext which will extract
|
|
|
|
all messages that are wrapped by a _() or a N_() (but NOT gettext()) and
|
|
|
|
concat them to this template.
|
|
|
|
|
|
|
|
[language].po:
|
|
|
|
|
|
|
|
This file has to be an edited gimp.pot and contains the original messages
|
|
|
|
plus the translated ones. This file will be delivered together with GIMP
|
|
|
|
and is the base for the final catalog.
|
|
|
|
|
|
|
|
[language].mo:
|
|
|
|
|
|
|
|
This file is a compiled version of [language.po] which will be
|
1999-09-20 16:17:21 +08:00
|
|
|
automatically compiled by the Makefile system and installed in the locale
|
1998-11-09 10:05:24 +08:00
|
|
|
directory of the system. It contains everything that the .po file
|
|
|
|
contains except not translated messages, comments and other overhead.
|
|
|
|
For maximum speed it is also hashed to allow gettext a faster search.
|
|
|
|
|
|
|
|
5. Tools and how to use them...
|
|
|
|
|
|
|
|
As mentioned the to get translated string are extracted directly from the
|
|
|
|
source and written to the template.
|
|
|
|
I guess many of you will now ask if it is necessary to add new strings
|
1999-09-20 16:17:21 +08:00
|
|
|
directly to the template or if there's a tool to achieve that.
|
|
|
|
I think I can calm down those of you who fear lots of had work just to
|
1998-11-09 10:05:24 +08:00
|
|
|
update the language files. There's a program called msgmerge which will
|
|
|
|
add all strings that are in the template but not in the uncompiled catalog
|
1999-09-20 16:17:21 +08:00
|
|
|
to it. Msgmerge does this job very nicely and also tries to use some kind
|
|
|
|
of fuzzy logic method for already translated strings for possible reduction
|
2000-01-02 00:08:09 +08:00
|
|
|
of translators work: If a original string seems similar to a new one
|
1998-11-09 10:05:24 +08:00
|
|
|
and it already has a translation, it will be taken over to the new catalog
|
1999-09-20 16:17:21 +08:00
|
|
|
together with a remark that this one may not necessarily fit.
|
1998-11-09 10:05:24 +08:00
|
|
|
|
|
|
|
6. And more?
|
|
|
|
|
|
|
|
I hope I mentioned everything that is worth it and hope that this document
|
|
|
|
will clarify some things. If it doesn't please write me a mail and tell me
|
2000-01-02 00:08:09 +08:00
|
|
|
what you want to know. This text of course contains errors, so if you find one
|
1998-11-09 10:05:24 +08:00
|
|
|
tell it to me, too....
|
|
|
|
|
|
|
|
Happy Gimping. Yours,
|
2000-01-06 03:57:02 +08:00
|
|
|
Daniel Egger
|
|
|
|
|