   This file provides documentation for GNU `gettext' utilities.  It
also serves as a reference for the free Translation Project.

   Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002 Free Software
Foundation, Inc.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Foundation.

Invoking the `gettextize' Program
=================================

   Some files are consistently and identically needed in every package
internationalized through GNU `gettext'.  As a matter of convenience,
the `gettextize' program puts all these files right in your package.
This program has the following synopsis:

     gettextize [ OPTION... ] [ DIRECTORY ]

and accepts the following options:

`-c'
`--copy'
     Copy the needed files instead of making symbolic links.  Using
     links would allow the package to always use the latest `gettext'
     code available on the system, but it might disturb some mechanism
     the maintainer is used to apply to the sources.  Because running
     `gettextize' is easy there shouldn't be problems with using copies.

`-f'
`--force'
     Force replacement of files which already exist.

`--intl'
     Install the libintl sources in a subdirectory named `intl/'.  This
     libintl will be used to provide internationalization on systems
     that don't have GNU libintl installed. If this option is omitted,
     the call to `AM_GNU_GETTEXT' in `configure.in' should read:
     `AM_GNU_GETTEXT([external])', and internationalization will not be
     enabled on systems lacking GNU gettext.

`--no-changelog'
     Don't update or create ChangeLog files.  By default, `gettextize'
     logs all changes (file additions, modifications ans removals) in a
     file called `ChangeLog' in each affected directory.

`--help'
     Display this help and exit.

`--version'
     Output version information and exit.

   If DIRECTORY is given, this is the top level directory of a package
to prepare for using GNU `gettext'.  If not given, it is assumed that
the current directory is the top level directory of such a package.

   The program `gettextize' provides the following files.  However, no
existing file will be replaced unless the option `--force' (`-f') is
specified.

  1. The `ABOUT-NLS' file is copied in the main directory of your
     package, the one being at the top level.  This file gives the main
     indications about how to install and use the Native Language
     Support features of your program.  You might elect to use a more
     recent copy of this `ABOUT-NLS' file than the one provided through
     `gettextize', if you have one handy.  You may also fetch a more
     recent copy of file `ABOUT-NLS' from Translation Project sites,
     and from most GNU archive sites.

  2. A `po/' directory is created for eventually holding all
     translation files, but initially only containing the file
     `po/Makefile.in.in' from the GNU `gettext' distribution.  (beware
     the double `.in' in the file name) and a few auxiliary files. If
     the `po/' directory already exists, it will be preserved along
     with the files it contains, and only `Makefile.in.in' and the
     auxiliary files will be overwritten.

  3. Only if `--intl' has been specified: A `intl/' directory is
     created and filled with most of the files originally in the
     `intl/' directory of the GNU `gettext' distribution.  Also, if
     option `--force' (`-f') is given, the `intl/' directory is emptied
     first.

  4. The `config.rpath' file is copied into the directory containing
     configuration support files. It is needed by the `AM_GNU_GETTEXT'
     autoconf macro.

   If your site support symbolic links, `gettextize' will not actually
copy the files into your package, but establish symbolic links instead.
This avoids duplicating the disk space needed in all packages.  Merely
using the `-h' option while creating the `tar' archive of your
distribution will resolve each link by an actual copy in the
distribution archive.  So, to insist, you really should use `-h' option
with `tar' within your `dist' goal of your main `Makefile.in'.

   It is interesting to understand that most new files for supporting
GNU `gettext' facilities in one package go in `intl/' and `po/'
subdirectories.  One distinction between these two directories is that
`intl/' is meant to be completely identical in all packages using GNU
`gettext', while all newly created files, which have to be different,
go into `po/'.  There is a common `Makefile.in.in' in `po/', because
the `po/' directory needs its own `Makefile', and it has been designed
so it can be identical in all packages.

Files You Must Create or Alter
==============================

   Besides files which are automatically added through `gettextize',
there are many files needing revision for properly interacting with GNU
`gettext'.  If you are closely following GNU standards for Makefile
engineering and auto-configuration, the adaptations should be easier to
achieve.  Here is a point by point description of the changes needed in
each.

   So, here comes a list of files, each one followed by a description of
all alterations it needs.  Many examples are taken out from the GNU
`gettext' 0.11.2 distribution itself, or from the GNU `hello'
distribution (`http://www.franken.de/users/gnu/ke/hello' or
`http://www.gnu.franken.de/ke/hello/')  You may indeed refer to the
source code of the GNU `gettext' and GNU `hello' packages, as they are
intended to be good examples for using GNU gettext functionality.

`POTFILES.in' in `po/'
----------------------

   The `po/' directory should receive a file named `POTFILES.in'.  This
file tells which files, among all program sources, have marked strings
needing translation.  Here is an example of such a file:

     # List of source files containing translatable strings.
     # Copyright (C) 1995 Free Software Foundation, Inc.

     # Common library files
     lib/error.c
     lib/getopt.c
     lib/xmalloc.c

     # Package source files
     src/gettext.c
     src/msgfmt.c
     src/xgettext.c

Hash-marked comments and white lines are ignored.  All other lines list
those source files containing strings marked for translation (see
Mark Keywords), in a notation relative to the top level of your whole
distribution, rather than the location of the `POTFILES.in' file itself.

   When a C file is automatically generated by a tool, like `flex' or
`bison', that doesn't introduce translatable strings by itself, it is
recommended to list in `po/POTFILES.in' the real source file (ending in
`.l' in the case of `flex', or in `.y' in the case of `bison'), not the
generated C file.

`LINGUAS' in `po/'
------------------

   The `po/' directory should also receive a file named `LINGUAS'.
This file contains the list of available translations.  It is a
whitespace separated list.  Hash-marked comments and white lines are
ignored.  Here is an example file:

     # Set of available languages.
     de fr

This example means that German and French PO files are available, so
that these languages are currently supported by your package.  If you
want to further restrict, at installation time, the set of installed
languages, this should not be done by modifying the `LINGUAS' file, but
rather by using the `LINGUAS' environment variable (see Installers).

`Makefile' pieces in `po/'
--------------------------

   The `po/' directory also has a file named `Makevars'.  It can be
left unmodified if your package has a single message domain and,
accordingly, a single `po/' directory. Only packages which have
multiple `po/' directories at different locations need to adjust the
three variables defined in `Makevars'.

   `po/Makevars' gets inserted into the `po/Makefile' when the latter
is created. At the same time, all files called `Rules-*' in the `po/'
directory get appended to the `po/Makefile'. They present an
opportunity to add rules for special PO files to the Makefile, without
needing to mess with `po/Makefile.in.in'.

   GNU gettext comes with a `Rules-quot' file, containing rules for
building catalogs `en@quot.po' and `en@boldquot.po'. The effect of
`en@quot.po' is that people who set their `LANGUAGE' environment
variable to `en@quot' will get messages with proper looking symmetric
Unicode quotation marks instead of abusing the ASCII grave accent and
the ASCII apostrophe for indicating quotations. To enable this catalog,
simply add `en@quot' to the `po/LINGUAS' file. The effect of
`en@boldquot.po' is that people who set `LANGUAGE' to `en@boldquot'
will get not only proper quotation marks, but also the quoted text will
be shown in a bold font on terminals and consoles. This catalog is
useful only for command-line programs, not GUI programs. To enable it,
similarly add `en@boldquot' to the `po/LINGUAS' file.

`configure.in' at top level
---------------------------

   `configure.in' or `configure.ac' - this is the source from which
`autoconf' generates the `configure' script.

  1. Declare the package and version.

     This is done by a set of lines like these:

          PACKAGE=gettext
          VERSION=0.11.2
          AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
          AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
          AC_SUBST(PACKAGE)
          AC_SUBST(VERSION)

     or, if you are using GNU `automake', by a line like this:

          AM_INIT_AUTOMAKE(gettext, 0.11.2)

     Of course, you replace `gettext' with the name of your package,
     and `0.11.2' by its version numbers, exactly as they should appear
     in the packaged `tar' file name of your distribution
     (`gettext-0.11.2.tar.gz', here).

  2. Check for internationalization support.

     Here is the main `m4' macro for triggering internationalization
     support.  Just add this line to `configure.in':

          AM_GNU_GETTEXT

     This call is purposely simple, even if it generates a lot of
     configure time checking and actions.

     If you have suppressed the `intl/' subdirectory by calling
     `gettextize' without `--intl' option, this call should read

          AM_GNU_GETTEXT([external])

  3. Have output files created.

     The `AC_OUTPUT' directive, at the end of your `configure.in' file,
     needs to be modified in two ways:

          AC_OUTPUT([EXISTING CONFIGURATION FILES intl/Makefile po/Makefile.in],
          [EXISTING ADDITIONAL ACTIONS])

     The modification to the first argument to `AC_OUTPUT' asks for
     substitution in the `intl/' and `po/' directories.  Note the `.in'
     suffix used for `po/' only.  This is because the distributed file
     is really `po/Makefile.in.in'.

     If you have suppressed the `intl/' subdirectory by calling
     `gettextize' without `--intl' option, then you don't need to add
     `intl/Makefile' to the `AC_OUTPUT' line.

`config.guess', `config.sub' at top level
-----------------------------------------

   If you haven't suppressed the `intl/' subdirectory, you need to add
the GNU `config.guess' and `config.sub' files to your distribution.
They are needed because the `intl/' directory has platform dependent
support for determining the locale's character encoding and therefore
needs to identify the platform.

   You can obtain the newest version of `config.guess' and `config.sub'
from `ftp://ftp.gnu.org/pub/gnu/config/'.  Less recent versions are
also contained in the GNU `automake' and GNU `libtool' packages.

   Normally, `config.guess' and `config.sub' are put at the top level
of a distribution.  But it is also possible to put them in a
subdirectory, altogether with other configuration support files like
`install-sh', `ltconfig', `ltmain.sh', `mkinstalldirs' or `missing'.
All you need to do, other than moving the files, is to add the
following line to your `configure.in'.

     AC_CONFIG_AUX_DIR([SUBDIR])

`aclocal.m4' at top level
-------------------------

   If you do not have an `aclocal.m4' file in your distribution, the
simplest is to concatenate the files `codeset.m4', `gettext.m4',
`glibc21.m4', `iconv.m4', `isc-posix.m4', `lcmessage.m4', `lib-ld.m4',
`lib-link.m4', `lib-prefix.m4', `progtest.m4' from GNU `gettext''s
`m4/' directory into a single file.  If you have suppressed the `intl/'
directory, only `gettext.m4', `iconv.m4', `lib-ld.m4', `lib-link.m4',
`lib-prefix.m4', `progtest.m4' need to be concatenated.

   If you already have an `aclocal.m4' file, then you will have to
merge the said macro files into your `aclocal.m4'.  Note that if you
are upgrading from a previous release of GNU `gettext', you should most
probably _replace_ the macros (`AM_GNU_GETTEXT', etc.), as they usually
change a little from one release of GNU `gettext' to the next.  Their
contents may vary as we get more experience with strange systems out
there.

   If you are using GNU `automake' 1.5 or newer, it is enough to put
these macro files into a subdirectory named `m4/' and add the line

     ACLOCAL_AMFLAGS = -I m4

to your top level `Makefile.am'.

   These macros check for the internationalization support functions
and related informations.  Hopefully, once stabilized, these macros
might be integrated in the standard Autoconf set, because this piece of
`m4' code will be the same for all projects using GNU `gettext'.

`acconfig.h' at top level
-------------------------

   Earlier GNU `gettext' releases required to put definitions for
`ENABLE_NLS', `HAVE_GETTEXT' and `HAVE_LC_MESSAGES', `HAVE_STPCPY',
`PACKAGE' and `VERSION' into an `acconfig.h' file.  This is not needed
any more; you can remove them from your `acconfig.h' file unless your
package uses them independently from the `intl/' directory.

`Makefile.in' at top level
--------------------------

   Here are a few modifications you need to make to your main, top-level
`Makefile.in' file.

  1. Add the following lines near the beginning of your `Makefile.in',
     so the `dist:' goal will work properly (as explained further down):

          PACKAGE = @PACKAGE@
          VERSION = @VERSION@

  2. Add file `ABOUT-NLS' to the `DISTFILES' definition, so the file
     gets distributed.

  3. Wherever you process subdirectories in your `Makefile.in', be sure
     you also process dir subdirectories `intl' and `po'.  Special
     rules in the `Makefiles' take care for the case where no
     internationalization is wanted.

     If you are using Makefiles, either generated by automake, or
     hand-written so they carefully follow the GNU coding standards,
     the effected goals for which the new subdirectories must be
     handled include `installdirs', `install', `uninstall', `clean',
     `distclean'.

     Here is an example of a canonical order of processing.  In this
     example, we also define `SUBDIRS' in `Makefile.in' for it to be
     further used in the `dist:' goal.

          SUBDIRS = doc intl lib src po

     Note that you must arrange for `make' to descend into the `intl'
     directory before descending into other directories containing code
     which make use of the `libintl.h' header file.  For this reason,
     here we mention `intl' before `lib' and `src'.

  4. A delicate point is the `dist:' goal, as both `intl/Makefile' and
     `po/Makefile' will later assume that the proper directory has been
     set up from the main `Makefile'.  Here is an example at what the
     `dist:' goal might look like:

          distdir = $(PACKAGE)-$(VERSION)
          dist: Makefile
          	rm -fr $(distdir)
          	mkdir $(distdir)
          	chmod 777 $(distdir)
          	for file in $(DISTFILES); do \
          	  ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir); \
          	done
          	for subdir in $(SUBDIRS); do \
          	  mkdir $(distdir)/$$subdir || exit 1; \
          	  chmod 777 $(distdir)/$$subdir; \
          	  (cd $$subdir && $(MAKE) $@) || exit 1; \
          	done
          	tar chozf $(distdir).tar.gz $(distdir)
          	rm -fr $(distdir)

   Note that if you are using GNU `automake', `Makefile.in' is
automatically generated from `Makefile.am', and all needed changes to
`Makefile.am' are already made by running `gettextize'.

`Makefile.in' in `src/'
-----------------------

   Some of the modifications made in the main `Makefile.in' will also
be needed in the `Makefile.in' from your package sources, which we
assume here to be in the `src/' subdirectory.  Here are all the
modifications needed in `src/Makefile.in':

  1. In view of the `dist:' goal, you should have these lines near the
     beginning of `src/Makefile.in':

          PACKAGE = @PACKAGE@
          VERSION = @VERSION@

  2. If not done already, you should guarantee that `top_srcdir' gets
     defined.  This will serve for `cpp' include files.  Just add the
     line:

          top_srcdir = @top_srcdir@

  3. You might also want to define `subdir' as `src', later allowing
     for almost uniform `dist:' goals in all your `Makefile.in'.  At
     list, the `dist:' goal below assume that you used:

          subdir = src

  4. The `main' function of your program will normally call
     `bindtextdomain' (see Triggering), like this:

          bindtextdomain (PACKAGE, LOCALEDIR);

     To make LOCALEDIR known to the program, add the following lines to
     Makefile.in:

          datadir = @datadir@
          localedir = $(datadir)/locale
          DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@

     Note that `@datadir@' defaults to `$(prefix)/share', thus
     `$(localedir)' defaults to `$(prefix)/share/locale'.

  5. You should ensure that the final linking will use `@LIBINTL@' or
     `@LTLIBINTL@' as a library.  `@LIBINTL@' is for use without
     `libtool', `@LTLIBINTL@' is for use with `libtool'. An easy way to
     achieve this is to manage that it gets into `LIBS', like this:

          LIBS = @LIBINTL@ @LIBS@

     In most packages internationalized with GNU `gettext', one will
     find a directory `lib/' in which a library containing some helper
     functions will be build.  (You need at least the few functions
     which the GNU `gettext' Library itself needs.)  However some of
     the functions in the `lib/' also give messages to the user which
     of course should be translated, too.  Taking care of this, the
     support library (say `libsupport.a') should be placed before
     `@LIBINTL@' and `@LIBS@' in the above example.  So one has to
     write this:

          LIBS = ../lib/libsupport.a @LIBINTL@ @LIBS@

  6. You should also ensure that directory `intl/' will be searched for
     C preprocessor include files in all circumstances.  So, you have to
     manage so both `-I../intl' and `-I$(top_srcdir)/intl' will be
     given to the C compiler.

  7. Your `dist:' goal has to conform with others.  Here is a
     reasonable definition for it:

          distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
          dist: Makefile $(DISTFILES)
          	for file in $(DISTFILES); do \
          	  ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir); \
          	done

`gettext.h' in `lib/'
---------------------

   Internationalization of packages, as provided by GNU `gettext', is
optional. It can be turned off in two situations:

   * When the installer has specified `./configure --disable-nls'. This
     can be useful when small binaries are more important than
     features, for example when building utilities for boot diskettes.
     It can also be useful in order to get some specific C compiler
     warnings about code quality with some older versions of GCC (older
     than 3.0).

   * When the package does not include the `intl/' subdirectory, and the
     libintl.h header (with its associated libintl library, if any) is
     not already installed on the system, it is preferrable that the
     package builds without internationalization support, rather than
     to give a compilation error.

   A C preprocessor macro can be used to detect these two cases.
Usually, when `libintl.h' was found and not explicitly disabled, the
`ENABLE_NLS' macro will be defined to 1 in the autoconf generated
configuration file (usually called `config.h'). In the two negative
situations, however, this macro will not be defined, thus it will
evaluate to 0 in C preprocessor expressions.

   `gettext.h' is a convenience header file for conditional use of
`<libintl.h>', depending on the `ENABLE_NLS' macro. If `ENABLE_NLS' is
set, it includes `<libintl.h>'; otherwise it defines no-op substitutes
for the libintl.h functions. We recommend the use of `"gettext.h"' over
direct use of `<libintl.h>', so that portability to older systems is
guaranteed and installers can turn off internationalization if they
want to. In the C code, you will then write

     #include "gettext.h"

instead of

     #include <libintl.h>

   The location of `gettext.h' is usually in a directory containing
auxiliary include files. In many GNU packages, there is a directory
`lib/' containing helper functions; `gettext.h' fits there.  In other
packages, it can go into the `src' directory.

   Do not install the `gettext.h' file in public locations. Every
package that needs it should contain a copy of it on its own.

Autoconf macros for use in `configure.in'
=========================================

   GNU `gettext' installs macros for use in a package's `configure.in'
or `configure.ac'.  See Introduction (autoconf).  The primary
macro is, of course, `AM_GNU_GETTEXT'.

AM_GNU_GETTEXT in `gettext.m4'
------------------------------

   The `AM_GNU_GETTEXT' macro tests for the presence of the GNU gettext
function family in either the C library or a separate `libintl' library
(shared or static libraries are both supported) or in the package's
`intl/' directory.

   `AM_GNU_GETTEXT' accepts up to three optional arguments. The general
syntax is

     AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR])

   INTLSYMBOL can be one of `external', `no-libtool', `use-libtool'.
The default (if it is not specified or empty) is `no-libtool'.
INTLSYMBOL should be `external' for packages with no `intl/' directory,
and `no-libtool' or `use-libtool' for packages with an `intl/'
directory. If INTLSYMBOL is `use-libtool', then a libtool library
`$(top_builddir)/intl/libintl.la' will be created (shared and/or static,
depending on `--{enable,disable}-{shared,static}' and on the presence
of `AM_DISABLE_SHARED'). If INTLSYMBOL is `no-libtool', a static library
`$(top_builddir)/intl/libintl.a' will be created.

   If NEEDSYMBOL is specified and is `need-ngettext', then GNU gettext
implementations (in libc or libintl) without the `ngettext()' function
will be ignored.

   INTLDIR is used to find the intl libraries.  If empty, the value
`$(top_builddir)/intl/' is used.

   The `AM_GNU_GETTEXT' macro determines whether GNU gettext is
available and should be used. If so, it sets the `USE_NLS' variable to
`yes'; it defines `ENABLE_NLS' to 1 in the autoconf generated
configuration file (usually called `config.h'); it sets the variables
`LIBINTL' and `LTLIBINTL' to the linker options for use in a Makefile
(`LIBINTL' for use without libtool, `LTLIBINTL' for use with libtool);
it adds an `-I' option to `CPPFLAGS' if necessary. In the negative
case, it sets `USE_NLS' to `no'; it sets `LIBINTL' and `LTLIBINTL' to
empty and doesn't change `CPPFLAGS'.

   The complexities that `AM_GNU_GETTEXT' deals with are the following:

   * Some operating systems have `gettext' in the C library, for example
     glibc. Some have it in a separate library `libintl'. GNU `libintl'
     might have been installed as part of the GNU `gettext' package.

   * GNU `libintl', if installed, is not necessarily already in the
     search path (`CPPFLAGS' for the include file search path,
     `LDFLAGS' for the library search path).

   * Except for glibc, the operating system's native `gettext' cannot
     exploit the GNU mo files, doesn't have the necessary locale
     dependency features, and cannot convert messages from the
     catalog's text encoding to the user's locale encoding.

   * GNU `libintl', if installed, is not necessarily already in the run
     time library search path. To avoid the need for setting an
     environment variable like `LD_LIBRARY_PATH', the macro adds the
     appropriate run time search path options to the `LIBINTL' and
     `LTLIBINTL' variables. This works on most systems, but not on some
     operating systems with limited shared library support, like SCO.

   * GNU `libintl' relies on POSIX `iconv'. The macro checks for linker
     options needed to use iconv and appends them to the `LIBINTL' and
     `LTLIBINTL' variables.

AM_ICONV in `iconv.m4'
----------------------

   The `AM_ICONV' macro tests for the presence of the POSIX `iconv'
function family in either the C library or a separate `libiconv'
library. If found, it sets the `am_cv_func_iconv' variable to `yes'; it
defines `HAVE_ICONV' to 1 in the autoconf generated configuration file
(usually called `config.h'); it defines `ICONV_CONST' to `const' or to
empty, depending on whether the second argument of `iconv()' is of type
`const char **' or `char **'; it sets the variables `LIBICONV' and
`LTLIBICONV' to the linker options for use in a Makefile (`LIBICONV'
for use without libtool, `LTLIBICONV' for use with libtool); it adds an
`-I' option to `CPPFLAGS' if necessary. If not found, it sets
`LIBICONV' and `LTLIBICONV' to empty and doesn't change `CPPFLAGS'.

   The complexities that `AM_ICONV' deals with are the following:

   * Some operating systems have `iconv' in the C library, for example
     glibc. Some have it in a separate library `libiconv', for example
     OSF/1 or FreeBSD. Regardless of the operating system, GNU
     `libiconv' might have been installed. In that case, it should be
     used instead of the operating system's native `iconv'.

   * GNU `libiconv', if installed, is not necessarily already in the
     search path (`CPPFLAGS' for the include file search path,
     `LDFLAGS' for the library search path).

   * GNU `libiconv' is binary incompatible with some operating system's
     native `iconv', for example on FreeBSD.  Use of an `iconv.h' and
     `libiconv.so' that don't fit together would produce program
     crashes.

   * GNU `libiconv', if installed, is not necessarily already in the
     run time library search path. To avoid the need for setting an
     environment variable like `LD_LIBRARY_PATH', the macro adds the
     appropriate run time search path options to the `LIBICONV'
     variable. This works on most systems, but not on some operating
     systems with limited shared library support, like SCO.

   `iconv.m4' is distributed with the GNU gettext package because
`gettext.m4' relies on it.

Other Programming Languages
***************************

   While the presentation of `gettext' focuses mostly on C and
implicitly applies to C++ as well, its scope is far broader than that:
Many programming languages, scripting languages and other textual data
like GUI resources or package descriptions can make use of the gettext
approach.

The Language Implementor's View
===============================

   All programming and scripting languages that have the notion of
strings are eligible to supporting `gettext'.  Supporting `gettext'
means the following:

  1. You should add to the language a syntax for translatable strings.
     In principle, a function call of `gettext' would do, but a
     shorthand syntax helps keeping the legibility of internationalized
     programs.  For example, in C we use the syntax `_("string")', in
     bash we use the syntax `$"string"', and in GNU awk we use the
     shorthand `_"string"'.

  2. You should arrange that evaluation of such a translatable string at
     runtime calls the `gettext' function, or performs equivalent
     processing.

  3. Similarly, you should make the functions `ngettext', `dcgettext',
     `dcngettext' available from within the language.  These functions
     are less often used, but are nevertheless necessary for particular
     purposes: `ngettext' for correct plural handling, and `dcgettext'
     and `dcngettext' for obeying other locale environment variables
     than `LC_MESSAGES', such as `LC_TIME' or `LC_MONETARY'.  For these
     latter functions, you need to make the `LC_*' constants, available
     in the C header `<locale.h>', referenceable from within the
     language, usually either as enumeration values or as strings.

  4. You should allow the programmer to designate a message domain,
     either by making the `textdomain' function available from within
     the language, or by introducing a magic variable called
     `TEXTDOMAIN'.  Similarly, you should allow the programmer to
     designate where to search for message catalogs, by providing
     access to the `bindtextdomain' function.

  5. You should either perform a `setlocale (LC_ALL, "")' call during
     the startup of your language runtime, or allow the programmer to
     do so.  Remember that gettext will act as a no-op if the
     `LC_MESSAGES' and `LC_CTYPE' locale facets are not both set.

  6. A programmer should have a way to extract translatable strings
     from a program into a PO file.  The GNU `xgettext' program is being
     extended to support very different programming languages.  Please
     contact the GNU `gettext' maintainers to help them doing this.  If
     the string extractor is best integrated into your language's
     parser, GNU `xgettext' can function as a front end to your string
     extractor.

  7. The language's library should have a string formatting facility
     where the arguments of a format string are denoted by a positional
     number or a name.  This is needed because for some languages and
     some messages with more than one substitutable argument, the
     translation will need to output the substituted arguments in
     different order.  See c-format.

  8. If the language has more than one implementation, and not all of
     the implementations use `gettext', but the programs should be
     portable across implementations, you should provide a no-i18n
     emulation, that makes the other implementations accept programs
     written for yours, without actually translating the strings.

  9. To help the programmer in the task of marking translatable strings,
     which is usually performed using the Emacs PO mode, you are
     welcome to contact the GNU `gettext' maintainers, so they can add
     support for your language to `po-mode.el'.

   On the implementation side, three approaches are possible, with
different effects on portability and copyright:

   * You may integrate the GNU `gettext''s `intl/' directory in your
     package, as described in Maintainers.  This allows you to
     have internationalization on all kinds of platforms.  Note that
     when you then distribute your package, it legally falls under the
     GNU General Public License, and the GNU project will be glad about
     your contribution to the Free Software pool.

   * You may link against GNU `gettext' functions if they are found in
     the C library.  For example, an autoconf test for `gettext()' and
     `ngettext()' will detect this situation.  For the moment, this test
     will succeed on GNU systems and not on other platforms.  No severe
     copyright restrictions apply.

   * You may emulate or reimplement the GNU `gettext' functionality.
     This has the advantage of full portability and no copyright
     restrictions, but also the drawback that you have to reimplement
     the GNU `gettext' features (such as the `LANGUAGE' environment
     variable, the locale aliases database, the automatic charset
     conversion, and plural handling).

The Programmer's View
=====================

   For the programmer, the general procedure is the same as for the C
language.  The Emacs PO mode supports other languages, and the GNU
`xgettext' string extractor recognizes other languages based on the
file extension or a command-line option.  In some languages,
`setlocale' is not needed because it is already performed by the
underlying language runtime.

The Translator's View
=====================

   The translator works exactly as in the C language case.  The only
difference is that when translating format strings, she has to be aware
of the language's particular syntax for positional arguments in format
strings.

The Maintainer's View
=====================

   For the maintainer, the general procedure differs from the C language
case in two ways.

   * For those languages that don't use GNU gettext, the `intl/'
     directory is not needed and can be omitted.  This means that the
     maintainer calls the `gettextize' program without the `--intl'
     option, and that he invokes the `AM_GNU_GETTEXT' autoconf macro via
     `AM_GNU_GETTEXT([external])'.

   * If only a single programming language is used, the
     `XGETTEXT_OPTIONS' variable in `po/Makevars' (see po/Makevars)
     should be adjusted to match the `xgettext' options for that
     particular programming language.  If the package uses more than
     one programming language with `gettext' support, it becomes
     necessary to change the POT file construction rule in
     `po/Makefile.in.in'. It is recommended to make one `xgettext'
     invocation per programming language, each with the options
     appropriate for that language, and to combine the resulting files
     using `msgcat'.

Individual Programming Languages
================================

C, C++, Objective C
-------------------

RPMs
     gcc, gpp, gobjc, glibc, gettext

File extension
     For C: `c', `h'.
     For C++: `C', `c++', `cc', `cxx', `cpp', `hpp'.
     For Objective C: `m'.

String syntax
     `"abc"'

gettext shorthand
     `_("abc")'

gettext/ngettext functions
     `gettext', `dgettext', `dcgettext', `ngettext', `dngettext',
     `dcngettext'

textdomain
     `textdomain' function

bindtextdomain
     `bindtextdomain' function

setlocale
     Programmer must call `setlocale (LC_ALL, "")'

Prerequisite
     `#include <libintl.h>'
     `#include <locale.h>'
     `#define _(string) gettext (string)'

Use or emulate GNU gettext
     Use

Extractor
     `xgettext -k_'

Formatting with positions
     `fprintf "%2$d %1$d"' (POSIX but not C 99)

Portability
     autoconf (gettext.m4) and #if ENABLE_NLS

po-mode marking
     yes

sh - Shell Script
-----------------

RPMs
     bash, gettext

File extension
     `sh'

String syntax
     `"abc"', `'abc'', `abc'

gettext shorthand
     `"`gettext "abc"`"'

gettext/ngettext functions
     `gettext', `ngettext' programs

textdomain
     environment variable `TEXTDOMAIN'

bindtextdomain
     environment variable `TEXTDOMAINDIR'

setlocale
     automatic

Prerequisite
     --

Use or emulate GNU gettext
     use

Extractor
     --

Formatting with positions
     --

Portability
     --

po-mode marking
     --

bash - Bourne-Again Shell Script
--------------------------------

RPMs
     bash 2.0 or newer, gettext

File extension
     `sh'

String syntax
     `"abc"', `'abc'', `abc'

gettext shorthand
     `$"abc"'

gettext/ngettext functions
     `gettext', `ngettext' programs

textdomain
     environment variable `TEXTDOMAIN'

bindtextdomain
     environment variable `TEXTDOMAINDIR'

setlocale
     automatic

Prerequisite
     --

Use or emulate GNU gettext
     use

Extractor
     `bash --dump-po-strings'

Formatting with positions
     --

Portability
     --

po-mode marking
     --

Python
------

RPMs
     python

File extension
     `py'

String syntax
     `'abc'', `u'abc'', `r'abc'', `ur'abc'',
     `"abc"', `u"abc"', `r"abc"', `ur"abc"',
     `'''abc'''', `u'''abc'''', `r'''abc'''', `ur'''abc'''',
     `"""abc"""', `u"""abc"""', `r"""abc"""', `ur"""abc"""'

gettext shorthand
     `_('abc')' etc.

gettext/ngettext functions
     `gettext.gettext', `gettext.dgettext', also `ugettext'

textdomain
     `gettext.textdomain' function, or `gettext.install(DOMAIN)'
     function

bindtextdomain
     `gettext.bindtextdomain' function, or
     `gettext.install(DOMAIN,LOCALEDIR)' function

setlocale
     not used by the gettext emulation

Prerequisite
     `import gettext'

Use or emulate GNU gettext
     emulate. Bug: uses only the first found .mo file, not all of them

Extractor
     `xgettext'

Formatting with positions
     `'...%(ident)d...' % { 'ident': value }'

Portability
     fully portable

po-mode marking
     --

GNU clisp - Common Lisp
-----------------------

RPMs
     clisp 2.28 or newer

File extension
     `lisp'

String syntax
     `"abc"'

gettext shorthand
     `(_ "abc")', `(ENGLISH "abc")'

gettext/ngettext functions
     `i18n:gettext', `i18n:ngettext'

textdomain
     `i18n:textdomain'

bindtextdomain
     `i18n:textdomaindir'

setlocale
     automatic

Prerequisite
     --

Use or emulate GNU gettext
     use

Extractor
     `xgettext -k_ -kENGLISH'

Formatting with positions
     `format "~1@*~D ~0@*~D"'

Portability
     On platforms without gettext, no translation.

po-mode marking
     --

GNU clisp C sources
-------------------

RPMs
     clisp

File extension
     `d'

String syntax
     `"abc"'

gettext shorthand
     `ENGLISH ? "abc" : ""'
     `GETTEXT("abc")'
     `GETTEXTL("abc")'

gettext/ngettext functions
     `clgettext', `clgettextl'

textdomain
     --

bindtextdomain
     --

setlocale
     automatic

Prerequisite
     `#include "lispbibl.c"'

Use or emulate GNU gettext
     use

Extractor
     `clisp-xgettext'

Formatting with positions
     `fprintf "%2$d %1$d"' (POSIX but not C 99)

Portability
     On platforms without gettext, no translation.

po-mode marking
     --

Emacs Lisp
----------

RPMs
     emacs, xemacs

File extension
     `el'

String syntax
     `"abc"'

gettext shorthand
     `(_"abc")'

gettext/ngettext functions
     `gettext', `dgettext' (xemacs only)

textdomain
     `domain' special form (xemacs only)

bindtextdomain
     `bind-text-domain' function (xemacs only)

setlocale
     automatic

Prerequisite
     --

Use or emulate GNU gettext
     use

Extractor
     `xgettext'

Formatting with positions
     `format "%2$d %1$d"'

Portability
     Only XEmacs. Without `I18N3' defined at build time, no translation.

po-mode marking
     --

librep
------

RPMs
     librep 0.15.3 or newer

File extension
     `jl'

String syntax
     `"abc"'

gettext shorthand
     `(_"abc")'

gettext/ngettext functions
     `gettext'

textdomain
     `textdomain' function

bindtextdomain
     `bindtextdomain' function

setlocale
     --

Prerequisite
     `(require 'rep.i18n.gettext)'

Use or emulate GNU gettext
     use

Extractor
     `xgettext'

Formatting with positions
     `format "%2$d %1$d"'

Portability
     On platforms without gettext, no translation.

po-mode marking
     --

GNU Smalltalk
-------------

RPMs
     smalltalk

File extension
     `st'

String syntax
     `''abc'''

gettext shorthand
     `NLS? ''abc'''
     `self? ''abc'''

gettext/ngettext functions
     `LcMessagesDomain>>#at:', `LcMessagesDomain>>#at:plural:with:'

textdomain
     `LcMessages>>#?' (returns a `LcMessagesDomain' object).
     Example: `Locale default messages ? 'gettext''

bindtextdomain
     `LcMessages>>#domain:directory:' (returns a `LcMessagesDomain'
     object)

setlocale
     You can obtain any `Locale' object from `Locale' class methods
     such as `#fromString:' or `#default'.
     Example: `Locale default messages' gives the `LcMessages' object
     for the default locale.

Prerequisite
     The gettext code is contained in the `I18N' package.

Use or emulate GNU gettext
     emulate

Extractor
     --

Formatting with positions
     `'%1 %2' bindWith: 'Hello' with: 'world''

Portability
     fully portable

po-mode marking
     --

Java
----

RPMs
     java, java2

File extension
     `java'

String syntax
     "abc"

gettext shorthand
     _("abc")

gettext/ngettext functions
     `GettextResource.gettext', `GettextResource.ngettext'

textdomain
     --, use `ResourceBundle.getResource' instead

bindtextdomain
     --, use CLASSPATH instead

setlocale
     automatic

Prerequisite
     --

Use or emulate GNU gettext
     --, uses a Java specific message catalog format

Extractor
     `xgettext -k_'

Formatting with positions
     `MessageFormat.format "{1,number} {0,number}"'

Portability
     fully portable

po-mode marking
     --

   Before marking strings as internationalizable, uses of the string
concatenation operator need to be converted to `MessageFormat'
applications. For example, `"file "+filename+" not found"' becomes
`MessageFormat.format("file {0} not found", new Object[] { filename })'.
Only after this is done, can the strings be marked and extracted.

   GNU gettext uses the native Java internationalization mechanism,
namely `ResourceBundle's. To convert a PO file to a ResourceBundle, the
`msgfmt' program can be used with the option `--java' or `--java2'. To
convert a ResourceBundle back to a PO file, the `msgunfmt' program can
be used with the option `--java'.

   Two different programmatic APIs can be used to access
ResourceBundles.  Note that both APIs work with all kinds of
ResourceBundles, whether GNU gettext generated classes, or other
`.class' or `.properties' files.

  1. The `java.util.ResourceBundle' API.

     In particular, its `getString' function returns a string
     translation.  Note that a missing translation yields a
     `MissingResourceException'.

     This has the advantage of being the standard API. And it does not
     require any additional libraries, only the `msgfmt' generated
     `.class' files. But it cannot do plural handling, even if the
     resource was generated from a PO file with plural handling.

  2. The `gnu.gettext.GettextResource' API.

     Reference documentation in Javadoc 1.1 style format is in the
     javadoc1 directory (javadoc1/tree.html) and in Javadoc 2 style
     format in the javadoc2 directory (javadoc2/index.html).

     Its `gettext' function returns a string translation. Note that when
     a translation is missing, the MSGID argument is returned unchanged.

     This has the advantage of having the `ngettext' function for plural
     handling.

     To use this API, one needs the `libintl.jar' file which is part of
     the GNU gettext package and distributed under the LGPL.

GNU awk
-------

RPMs
     gawk 3.1 or newer

File extension
     `awk'

String syntax
     `"abc"'

gettext shorthand
     `_"abc"'

gettext/ngettext functions
     `dcgettext', missing `dcngettext' in gawk-3.1.0

textdomain
     `TEXTDOMAIN' variable

bindtextdomain
     `bindtextdomain' function

setlocale
     automatic, but missing `setlocale (LC_MESSAGES, "")' in gawk-3.1.0

Prerequisite
     --

Use or emulate GNU gettext
     use

Extractor
     `xgettext'

Formatting with positions
     `printf "%2$d %1$d"' (GNU awk only)

Portability
     On platforms without gettext, no translation.  On non-GNU awks,
     you must define `dcgettext', `dcngettext' and `bindtextdomain'
     yourself.

po-mode marking
     --

Pascal - Free Pascal Compiler
-----------------------------

RPMs
     fpk

File extension
     `pp', `pas'

String syntax
     `'abc''

gettext shorthand
     automatic

gettext/ngettext functions
     --, use `ResourceString' data type instead

textdomain
     --, use `TranslateResourceStrings' function instead

bindtextdomain
     --, use `TranslateResourceStrings' function instead

setlocale
     automatic, but uses only LANG, not LC_MESSAGES or LC_ALL

Prerequisite
     `{$mode delphi}' or `{$mode objfpc}'
     `uses gettext;'

Use or emulate GNU gettext
     emulate partially

Extractor
     `ppc386' followed by `xgettext' or `rstconv'

Formatting with positions
     `uses sysutils;'
     `format "%1:d %0:d"'

Portability
     ?

po-mode marking
     --

   The Pascal compiler has special support for the `ResourceString' data
type. It generates a `.rst' file. This is then converted to a `.pot'
file by use of `xgettext' or `rstconv'. At runtime, a `.mo' file
corresponding to translations of this `.pot' file can be loaded using
the `TranslateResourceStrings' function in the `gettext' unit.