@c This file is part of the GNU gettext manual.
@c Copyright (C) 1995-2020 Free Software Foundation, Inc.
@c See the file gettext.texi for copying conditions.

@node The original ABOUT-NLS
@section Notes on the Free Translation Project

@cindex @file{ABOUT-NLS} file
This section contains the text that was, for a long time, distributed
as a file named @code{ABOUT-NLS}.

@strong{ NOTE: } This documentation section is outdated.  It it included
here for historical purposes only.

@set STATUS July 2020

Free software is going international!  The Free Translation Project is
a way to get maintainers of free software, translators, and users all
together, so that free software will gradually become able to speak many
languages.  A few packages already provide translations for their messages.

If you found this @file{ABOUT-NLS} file inside a distribution, you
may assume that the distributed package does use GNU @code{gettext}
internally, itself available at your nearest GNU archive site.  But you
do @emph{not} need to install GNU @code{gettext} prior to configuring,
installing or using this package with messages translated.

Installers will find here some useful hints.  These notes also explain
how users should proceed for getting the programs to use the available
translations.  They tell how people wanting to contribute and work
on translations can contact the appropriate team.

@menu
* INSTALL Matters::
* Using This Package::
* Translating Teams::
* Available Packages::
* Using gettext in own code::
@end menu


@node INSTALL Matters
@subsection INSTALL Matters

Some packages are @dfn{localizable} when properly installed; the
programs they contain can be made to speak your own native language.
Most such packages use GNU @code{gettext}.  Other packages have their
own ways to internationalization, predating GNU @code{gettext}.

By default, this package will be installed to allow translation of
messages.  It will automatically detect whether the system already
provides the GNU @code{gettext} functions.  Installers may use special
options at configuration time for changing the default behaviour.  The
command:

@example
./configure --disable-nls
@end example

@noindent
will @emph{totally} disable translation of messages.

When you already have GNU @code{gettext} installed on your system and
run configure without an option for your new package, @code{configure}
will probably detect the previously built and installed @file{libintl}
library and will decide to use it.  If not, you may have to to use the
@samp{--with-libintl-prefix} option to tell @code{configure} where to
look for it.

Internationalized packages usually have many @file{po/@var{ll}.po}
files, where @var{ll} gives an @w{ISO 639} two-letter code
identifying the language.  Unless translations have been forbidden
at @code{configure} time by using the @samp{--disable-nls} switch,
all available translations are installed together with the package.
However, the environment variable @code{LINGUAS} may be set, prior
to configuration, to limit the installed set.  @code{LINGUAS} should
then contain a space separated list of two-letter codes, stating
which languages are allowed.

@node Using This Package
@subsection Using This Package

@c Note: We don't document the locale aliases, because they are less and less
@c used - locale.alias contains not a single UTF-8 locale and still lists
@c ISO-8859-1 for countries which have long adopted the Euro and switched to
@c ISO-8859-15.
@c
As a user, if your language has been installed for this package, you
only have to set the @code{LANG} environment variable to the appropriate
@samp{@var{ll}_@var{CC}} combination.  If you happen to have the @code{LC_ALL}
or some other @code{LC_xxx} environment variables set, you should unset them
before setting @code{LANG}, otherwise the setting of @code{LANG} will not
have the desired effect.  Here @samp{@var{ll}} is an
@w{ISO 639} two-letter language code, and @samp{@var{CC}} is an
@w{ISO 3166} two-letter country code.  For example, let's suppose that you
speak German and live in Germany.  At the shell prompt, merely execute
@w{@samp{setenv LANG de_DE}} (in @code{csh}),
@w{@samp{export LANG; LANG=de_DE}} (in @code{sh}) or
@w{@samp{export LANG=de_DE}} (in @code{bash}).  This can be done from your
@file{.login} or @file{.profile} file, once and for all.

You might think that the country code specification is redundant.  But in
fact, some languages have dialects in different countries.  For example,
@samp{de_AT} is used for Austria, and @samp{pt_BR} for Brazil.  The country
code serves to distinguish the dialects.

The locale naming convention of @samp{@var{ll}_@var{CC}}, with
@samp{@var{ll}} denoting the language and @samp{@var{CC}} denoting the
country, is the one use on systems based on GNU libc.  On other systems,
some variations of this scheme are used, such as @samp{@var{ll}} or
@samp{@var{ll}_@var{CC}.@var{encoding}}.  You can get the list of
locales supported by your system for your language by running the command
@samp{locale -a | grep '^@var{ll}'}.

Not all programs have translations for all languages.  By default, an
English message is shown in place of a nonexistent translation.  If you
understand other languages, you can set up a priority list of languages.
This is done through a different environment variable, called
@code{LANGUAGE}.  GNU @code{gettext} gives preference to @code{LANGUAGE}
over @code{LANG} for the purpose of message handling, but you still
need to have @code{LANG} set to the primary language; this is required
by other parts of the system libraries.
For example, some Swedish users who would rather read translations in
German than English for when Swedish is not available, set @code{LANGUAGE}
to @samp{sv:de} while leaving @code{LANG} to @samp{sv_SE}.

Special advice for Norwegian users: The language code for Norwegian
bokm@ringaccent{a}l changed from @samp{no} to @samp{nb} recently (in 2003).
During the transition period, while some message catalogs for this language
are installed under @samp{nb} and some older ones under @samp{no}, it's
recommended for Norwegian users to set @code{LANGUAGE} to @samp{nb:no} so that
both newer and older translations are used.

In the @code{LANGUAGE} environment variable, but not in the @code{LANG}
environment variable, @samp{@var{ll}_@var{CC}} combinations can be
abbreviated as @samp{@var{ll}} to denote the language's main dialect.
For example, @samp{de} is equivalent to @samp{de_DE} (German as spoken in
Germany), and @samp{pt} to @samp{pt_PT} (Portuguese as spoken in Portugal)
in this context.

@c An operating system might already offer message localization for many of
@c its programs, while other programs have been
@c installed locally with the full capabilities of GNU @code{gettext}.
@c Just using @code{gettext} extended syntax for @code{LANG} would break
@c proper localization of already available operating system programs.
@c FIXME: The user doesn't care about design justifications. --bruno

@node Translating Teams
@subsection Translating Teams

For the Free Translation Project to be a success, we need interested
people who like their own language and write it well, and who are also
able to synergize with other translators speaking the same language.
Each translation team has its own mailing list.  The up-to-date list
of teams can be found at the Free Translation Project's homepage,
@file{https://translationproject.org/}, in the "Teams" area.

If you'd like to volunteer to @emph{work} at translating messages, you
should become a member of the translating team for your own language.
The subscribing address is @emph{not} the same as the list itself, it
has @samp{-request} appended.  For example, speakers of Swedish can send
a message to @w{@file{sv-request@@li.org}}, having this message body:

@example
subscribe
@end example

Keep in mind that team members are expected to participate
@emph{actively} in translations, or at solving translational
difficulties, rather than merely lurking around.  If your team does not
exist yet and you want to start one, or if you are unsure about what to
do or how to get started, please write to
@w{@file{coordinator@@translationproject.org}} to reach the
coordinator for all translator teams.

The English team is special.  It works at improving and uniformizing
the terminology in use.  Proven linguistic skills are praised
more than programming skills, here.

@node Available Packages
@subsection Available Packages

Languages are not equally supported in all packages.  The following
matrix shows the current state of internationalization, as of
@value{STATUS}.  The matrix shows, in regard of each package, for which
languages PO files have been submitted to translation coordination,
with a translation percentage of at least 50%.

@include matrix.texi

Some counters in the preceding matrix are higher than the number of visible
blocks let us expect.  This is because a few extra PO files are used for
implementing regional variants of languages, or language dialects.

For a PO file in the matrix above to be effective, the package to which
it applies should also have been internationalized and distributed as
such by its maintainer.  There might be an observable lag between the
mere existence a PO file and its wide availability in a distribution.

If @value{STATUS} seems to be old, you may fetch a more recent copy
of this @file{ABOUT-NLS} file on most GNU archive sites.  The most
up-to-date matrix with full percentage details can be found at
@file{https://translationproject.org/extra/matrix.html}.


@node Using gettext in own code
@subsection Using @code{gettext} in new packages

If you are writing a freely available program and want to internationalize
it you are welcome to use GNU @file{gettext} in your package.  Of course
you have to respect the GNU Lesser General Public License which covers
the use of the GNU @file{gettext} library.  This means in particular that
even non-free programs can use @code{libintl} as a shared library, whereas
only free software can use @code{libintl} as a static library or use
modified versions of @code{libintl}.

Once the sources are changed appropriately and the setup can handle the
use of @code{gettext} the only thing missing are the translations.  The
Free Translation Project is also available for packages which are not
developed inside the GNU project.  Therefore the information given above
applies also for every other Free Software Project.  Contact
@w{@file{coordinator@@translationproject.org}} to make the @file{.pot} files
available to the translation teams.
