blob: 841e049b28bfeb923916118847a3b90302ae8868 [file] [log] [blame]
<html lang="en">
<head>
<title>Message Translation - 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="prev" href="Locales.html#Locales" title="Locales">
<link rel="next" href="Searching-and-Sorting.html#Searching-and-Sorting" title="Searching and Sorting">
<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="Message-Translation"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Searching-and-Sorting.html#Searching-and-Sorting">Searching and Sorting</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Locales.html#Locales">Locales</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
</div>
<!-- %MENU% How to make the program speak the user's language -->
<h2 class="chapter">8 Message Translation</h2>
<p>The program's interface with the human should be designed in a way to
ease the human the task. One of the possibilities is to use messages in
whatever language the user prefers.
<p>Printing messages in different languages can be implemented in different
ways. One could add all the different languages in the source code and
add among the variants every time a message has to be printed. This is
certainly no good solution since extending the set of languages is
difficult (the code must be changed) and the code itself can become
really big with dozens of message sets.
<p>A better solution is to keep the message sets for each language are kept
in separate files which are loaded at runtime depending on the language
selection of the user.
<p>The GNU C Library provides two different sets of functions to support
message translation. The problem is that neither of the interfaces is
officially defined by the POSIX standard. The <code>catgets</code> family of
functions is defined in the X/Open standard but this is derived from
industry decisions and therefore not necessarily based on reasonable
decisions.
<p>As mentioned above the message catalog handling provides easy
extendibility by using external data files which contain the message
translations. I.e., these files contain for each of the messages used
in the program a translation for the appropriate language. So the tasks
of the message handling functions are
<ul>
<li>locate the external data file with the appropriate translations.
<li>load the data and make it possible to address the messages
<li>map a given key to the translated message
</ul>
<p>The two approaches mainly differ in the implementation of this last
step. The design decisions made for this influences the whole rest.
<ul class="menu">
<li><a accesskey="1" href="Message-catalogs-a-la-X_002fOpen.html#Message-catalogs-a-la-X_002fOpen">Message catalogs a la X/Open</a>: The <code>catgets</code> family of functions.
<li><a accesskey="2" href="The-Uniforum-approach.html#The-Uniforum-approach">The Uniforum approach</a>: The <code>gettext</code> family of functions.
</ul>
</body></html>