blob: c3761fb6f7bca2748de161fa6de173c238f74a3f [file] [log] [blame]
<html lang="en">
<head>
<title>Locating gettext catalog - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Message-catalogs-with-gettext.html#Message-catalogs-with-gettext" title="Message catalogs with gettext">
<link rel="prev" href="Translation-with-gettext.html#Translation-with-gettext" title="Translation with gettext">
<link rel="next" href="Advanced-gettext-functions.html#Advanced-gettext-functions" title="Advanced gettext functions">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Locating-gettext-catalog"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Advanced-gettext-functions.html#Advanced-gettext-functions">Advanced gettext functions</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Translation-with-gettext.html#Translation-with-gettext">Translation with gettext</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Message-catalogs-with-gettext.html#Message-catalogs-with-gettext">Message catalogs with gettext</a>
<hr>
</div>
<h5 class="subsubsection">8.2.1.2 How to determine which catalog to be used</h5>
<p>The functions to retrieve the translations for a given message have a
remarkable simple interface. But to provide the user of the program
still the opportunity to select exactly the translation s/he wants and
also to provide the programmer the possibility to influence the way to
locate the search for catalogs files there is a quite complicated
underlying mechanism which controls all this. The code is complicated
the use is easy.
<p>Basically we have two different tasks to perform which can also be
performed by the <code>catgets</code> functions:
<ol type=1 start=1>
<li>Locate the set of message catalogs. There are a number of files for
different languages and which all belong to the package. Usually they
are all stored in the filesystem below a certain directory.
<p>There can be arbitrary many packages installed and they can follow
different guidelines for the placement of their files.
<li>Relative to the location specified by the package the actual translation
files must be searched, based on the wishes of the user. I.e., for each
language the user selects the program should be able to locate the
appropriate file.
</ol>
<p>This is the functionality required by the specifications for
<code>gettext</code> and this is also what the <code>catgets</code> functions are
able to do. But there are some problems unresolved:
<ul>
<li>The language to be used can be specified in several different ways.
There is no generally accepted standard for this and the user always
expects the program understand what s/he means. E.g., to select the
German translation one could write <code>de</code>, <code>german</code>, or
<code>deutsch</code> and the program should always react the same.
<li>Sometimes the specification of the user is too detailed. If s/he, e.g.,
specifies <code>de_DE.ISO-8859-1</code> which means German, spoken in Germany,
coded using the ISO&nbsp;8859-1<!-- /@w --> character set there is the possibility
that a message catalog matching this exactly is not available. But
there could be a catalog matching <code>de</code> and if the character set
used on the machine is always ISO&nbsp;8859-1<!-- /@w --> there is no reason why this
later message catalog should not be used. (We call this <dfn>message
inheritance</dfn>.)
<li>If a catalog for a wanted language is not available it is not always the
second best choice to fall back on the language of the developer and
simply not translate any message. Instead a user might be better able
to read the messages in another language and so the user of the program
should be able to define an precedence order of languages.
</ul>
<p>We can divide the configuration actions in two parts: the one is
performed by the programmer, the other by the user. We will start with
the functions the programmer can use since the user configuration will
be based on this.
<p>As the functions described in the last sections already mention separate
sets of messages can be selected by a <dfn>domain name</dfn>. This is a
simple string which should be unique for each program part with uses a
separate domain. It is possible to use in one program arbitrary many
domains at the same time. E.g., the GNU C Library itself uses a domain
named <code>libc</code> while the program using the C Library could use a
domain named <code>foo</code>. The important point is that at any time
exactly one domain is active. This is controlled with the following
function.
<!-- libintl.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>textdomain</b> (<var>const char *domainname</var>)<var><a name="index-textdomain-811"></a></var><br>
<blockquote><p>The <code>textdomain</code> function sets the default domain, which is used in
all future <code>gettext</code> calls, to <var>domainname</var>. Please note that
<code>dgettext</code> and <code>dcgettext</code> calls are not influenced if the
<var>domainname</var> parameter of these functions is not the null pointer.
<p>Before the first call to <code>textdomain</code> the default domain is
<code>messages</code>. This is the name specified in the specification of
the <code>gettext</code> API. This name is as good as any other name. No
program should ever really use a domain with this name since this can
only lead to problems.
<p>The function returns the value which is from now on taken as the default
domain. If the system went out of memory the returned value is
<code>NULL</code> and the global variable <var>errno</var> is set to <code>ENOMEM</code>.
Despite the return value type being <code>char *</code> the return string must
not be changed. It is allocated internally by the <code>textdomain</code>
function.
<p>If the <var>domainname</var> parameter is the null pointer no new default
domain is set. Instead the currently selected default domain is
returned.
<p>If the <var>domainname</var> parameter is the empty string the default domain
is reset to its initial value, the domain with the name <code>messages</code>.
This possibility is questionable to use since the domain <code>messages</code>
really never should be used.
</p></blockquote></div>
<!-- libintl.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>bindtextdomain</b> (<var>const char *domainname, const char *dirname</var>)<var><a name="index-bindtextdomain-812"></a></var><br>
<blockquote><p>The <code>bindtextdomain</code> function can be used to specify the directory
which contains the message catalogs for domain <var>domainname</var> for the
different languages. To be correct, this is the directory where the
hierarchy of directories is expected. Details are explained below.
<p>For the programmer it is important to note that the translations which
come with the program have be placed in a directory hierarchy starting
at, say, <samp><span class="file">/foo/bar</span></samp>. Then the program should make a
<code>bindtextdomain</code> call to bind the domain for the current program to
this directory. So it is made sure the catalogs are found. A correctly
running program does not depend on the user setting an environment
variable.
<p>The <code>bindtextdomain</code> function can be used several times and if the
<var>domainname</var> argument is different the previously bound domains
will not be overwritten.
<p>If the program which wish to use <code>bindtextdomain</code> at some point of
time use the <code>chdir</code> function to change the current working
directory it is important that the <var>dirname</var> strings ought to be an
absolute pathname. Otherwise the addressed directory might vary with
the time.
<p>If the <var>dirname</var> parameter is the null pointer <code>bindtextdomain</code>
returns the currently selected directory for the domain with the name
<var>domainname</var>.
<p>The <code>bindtextdomain</code> function returns a pointer to a string
containing the name of the selected directory name. The string is
allocated internally in the function and must not be changed by the
user. If the system went out of core during the execution of
<code>bindtextdomain</code> the return value is <code>NULL</code> and the global
variable <var>errno</var> is set accordingly.
</p></blockquote></div>
</body></html>