16.11.1 Problem
16.11.2 Solution
bindtextdomain('gnumeric','/usr/share/locale');
textdomain('gnumeric');
$languages = array('en_CA','da_DK','de_AT','fr_FR');
foreach ($languages as $language) {
setlocale(LC_ALL, $language);
print gettext(" Unknown formula")."\n";
}
16.11.3 Discussion
gettext is a set of tools that makes it easier for your
application to produce multilingual messages. Compiling PHP with the
--with-gettext option enables functions to retrieve the appropriate
text from gettext-format message catalogs, and there are a number of
external tools to edit the message catalogs.
With gettext, messages are
divided into domains, and all
messages for a particular domain are stored in the same file.
bindtextdomain( ) tells gettext where to
find the message catalog for a particular domain. A call to:
bindtextdomain('gnumeric','/usr/share/locale')
indicates that the message catalog for the gnumeric
domain in the en_CA locale is in the file /usr/share/locale/en_CA/LC_MESSAGES/gnumeric.mo.
The textdomain('gnumeric')
function sets the default domain to gnumeric. Calling gettext(
) retrieves a message from the default domain. There are other functions,
such as dgettext( ), that let you retrieve a
message from a different domain. When gettext( ) (or dgettext(
)) is called, it returns the appropriate message for the current locale. If
there's no message in the catalog for the current locale that corresponds to the
argument passed to it, gettext( ) (or dgettext( )) returns
just its argument. As a result, if you haven't translated all your messages,
your code prints out English (or whatever your base language is) for those
untranslated messages.
Setting the default domain with textdomain( ) makes
each subsequent retrieval of a message from that domain more concise, because
you just have to call gettext('Good morning') instead of
dgettext('domain','Good morning'). However, if even
gettext('Good morning') is too much typing, you can take advantage of
an undocumented function alias: _( ) for
gettext( ). Instead of gettext('Good morning'), use
_('Good morning').
The gettext web site has helpful and detailed
information for managing the information flow between programmers and
translators and how to efficiently use gettext. It also includes
information on other tools you can use to manage your message catalogs, such as
a special GNU Emacs mode.