\section{\module{locale} ---
         Internationalization services}

\declaremodule{standard}{locale}
\modulesynopsis{Internationalization services.}
\moduleauthor{Martin von L\"owis}{martin@v.loewis.de}
\sectionauthor{Martin von L\"owis}{martin@v.loewis.de}


The \module{locale} module opens access to the \POSIX{} locale
database and functionality. The \POSIX{} locale mechanism allows
programmers to deal with certain cultural issues in an application,
without requiring the programmer to know all the specifics of each
country where the software is executed.

The \module{locale} module is implemented on top of the
\module{_locale}\refbimodindex{_locale} module, which in turn uses an
ANSI C locale implementation if available.

The \module{locale} module defines the following exception and
functions:


\begin{excdesc}{Error}
  Exception raised when \function{setlocale()} fails.
\end{excdesc}

\begin{funcdesc}{setlocale}{category\optional{, locale}}
  If \var{locale} is specified, it may be a string, a tuple of the
  form \code{(\var{language code}, \var{encoding})}, or \code{None}.
  If it is a tuple, it is converted to a string using the locale
  aliasing engine.  If \var{locale} is given and not \code{None},
  \function{setlocale()} modifies the locale setting for the
  \var{category}.  The available categories are listed in the data
  description below.  The value is the name of a locale.  An empty
  string specifies the user's default settings. If the modification of
  the locale fails, the exception \exception{Error} is raised.  If
  successful, the new locale setting is returned.

  If \var{locale} is omitted or \code{None}, the current setting for
  \var{category} is returned.

  \function{setlocale()} is not thread safe on most systems.
  Applications typically start with a call of

\begin{verbatim}
import locale
locale.setlocale(locale.LC_ALL, '')
\end{verbatim}

  This sets the locale for all categories to the user's default
  setting (typically specified in the \envvar{LANG} environment
  variable).  If the locale is not changed thereafter, using
  multithreading should not cause problems.

  \versionchanged[Added support for tuple values of the \var{locale}
                  parameter]{2.0}
\end{funcdesc}

\begin{funcdesc}{localeconv}{}
  Returns the database of the local conventions as a dictionary.
  This dictionary has the following strings as keys:

  \begin{tableiii}{l|l|p{3in}}{constant}{Key}{Category}{Meaning}
    \lineiii{LC_NUMERIC}{\code{'decimal_point'}}
            {Decimal point character.}
    \lineiii{}{\code{'grouping'}}
            {Sequence of numbers specifying which relative positions
             the \code{'thousands_sep'} is expected.  If the sequence is
             terminated with \constant{CHAR_MAX}, no further grouping
             is performed. If the sequence terminates with a \code{0}, 
             the last group size is repeatedly used.}
    \lineiii{}{\code{'thousands_sep'}}
            {Character used between groups.}\hline
    \lineiii{LC_MONETARY}{\code{'int_curr_symbol'}}
            {International currency symbol.}
    \lineiii{}{\code{'currency_symbol'}}
            {Local currency symbol.}
    \lineiii{}{\code{'mon_decimal_point'}}
            {Decimal point used for monetary values.}
    \lineiii{}{\code{'mon_thousands_sep'}}
            {Group separator used for monetary values.}
    \lineiii{}{\code{'mon_grouping'}}
            {Equivalent to \code{'grouping'}, used for monetary
             values.}
    \lineiii{}{\code{'positive_sign'}}
            {Symbol used to annotate a positive monetary value.}
    \lineiii{}{\code{'negative_sign'}}
            {Symbol used to annotate a nnegative monetary value.}
    \lineiii{}{\code{'frac_digits'}}
            {Number of fractional digits used in local formatting
             of monetary values.}
    \lineiii{}{\code{'int_frac_digits'}}
            {Number of fractional digits used in international
             formatting of monetary values.}
  \end{tableiii}

  The possible values for \code{'p_sign_posn'} and
  \code{'n_sign_posn'} are given below.

  \begin{tableii}{c|l}{code}{Value}{Explanation}
    \lineii{0}{Currency and value are surrounded by parentheses.}
    \lineii{1}{The sign should precede the value and currency symbol.}
    \lineii{2}{The sign should follow the value and currency symbol.}
    \lineii{3}{The sign should immediately precede the value.}
    \lineii{4}{The sign should immediately follow the value.}
    \lineii{\constant{LC_MAX}}{Nothing is specified in this locale.}
  \end{tableii}
\end{funcdesc}

\begin{funcdesc}{nl_langinfo}{option}

Return some locale-specific information as a string. This function is
not available on all systems, and the set of possible options might
also vary across platforms. The possible argument values are numbers,
for which symbolic constants are available in the locale module.

\end{funcdesc}

\begin{funcdesc}{getdefaultlocale}{\optional{envvars}}
  Tries to determine the default locale settings and returns
  them as a tuple of the form \code{(\var{language code},
  \var{encoding})}.

  According to \POSIX, a program which has not called
  \code{setlocale(LC_ALL, '')} runs using the portable \code{'C'}
  locale.  Calling \code{setlocale(LC_ALL, '')} lets it use the
  default locale as defined by the \envvar{LANG} variable.  Since we
  do not want to interfere with the current locale setting we thus
  emulate the behavior in the way described above.

  To maintain compatibility with other platforms, not only the
  \envvar{LANG} variable is tested, but a list of variables given as
  envvars parameter.  The first found to be defined will be
  used.  \var{envvars} defaults to the search path used in GNU gettext;
  it must always contain the variable name \samp{LANG}.  The GNU
  gettext search path contains \code{'LANGUAGE'}, \code{'LC_ALL'},
  \code{'LC_CTYPE'}, and \code{'LANG'}, in that order.

  Except for the code \code{'C'}, the language code corresponds to
  \rfc{1766}.  \var{language code} and \var{encoding} may be
  \code{None} if their values cannot be determined.
  \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{getlocale}{\optional{category}}
  Returns the current setting for the given locale category as
  sequence containing \var{language code}, \var{encoding}.
  \var{category} may be one of the \constant{LC_*} values except
  \constant{LC_ALL}.  It defaults to \constant{LC_CTYPE}.

  Except for the code \code{'C'}, the language code corresponds to
  \rfc{1766}.  \var{language code} and \var{encoding} may be
  \code{None} if their values cannot be determined.
  \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{getpreferredencoding}{\optional{do_setlocale}}
  Return the encoding used for text data, according to user
  preferences.  User preferences are expressed differently on
  different systems, and might not be available programmatically on
  some systems, so this function only returns a guess.

  On some systems, it is necessary to invoke \function{setlocale}
  to obtain the user preferences, so this function is not thread-safe.
  If invoking setlocale is not necessary or desired, \var{do_setlocale}
  should be set to \code{False}.

  \versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{normalize}{localename}
  Returns a normalized locale code for the given locale name.  The
  returned locale code is formatted for use with
  \function{setlocale()}.  If normalization fails, the original name
  is returned unchanged.

  If the given encoding is not known, the function defaults to
  the default encoding for the locale code just like
  \function{setlocale()}.
  \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{resetlocale}{\optional{category}}
  Sets the locale for \var{category} to the default setting.

  The default setting is determined by calling
  \function{getdefaultlocale()}.  \var{category} defaults to
  \constant{LC_ALL}.
  \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{strcoll}{string1, string2}
  Compares two strings according to the current
  \constant{LC_COLLATE} setting. As any other compare function,
  returns a negative, or a positive value, or \code{0}, depending on
  whether \var{string1} collates before or after \var{string2} or is
  equal to it.
\end{funcdesc}

\begin{funcdesc}{strxfrm}{string}
  Transforms a string to one that can be used for the built-in
  function \function{cmp()}\bifuncindex{cmp}, and still returns
  locale-aware results.  This function can be used when the same
  string is compared repeatedly, e.g. when collating a sequence of
  strings.
\end{funcdesc}

\begin{funcdesc}{format}{format, val\optional{, grouping}}
  Formats a number \var{val} according to the current
  \constant{LC_NUMERIC} setting.  The format follows the conventions
  of the \code{\%} operator.  For floating point values, the decimal
  point is modified if appropriate.  If \var{grouping} is true, also
  takes the grouping into account.
\end{funcdesc}

\begin{funcdesc}{str}{float}
  Formats a floating point number using the same format as the
  built-in function \code{str(\var{float})}, but takes the decimal
  point into account.
\end{funcdesc}

\begin{funcdesc}{atof}{string}
  Converts a string to a floating point number, following the
  \constant{LC_NUMERIC} settings.
\end{funcdesc}

\begin{funcdesc}{atoi}{string}
  Converts a string to an integer, following the
  \constant{LC_NUMERIC} conventions.
\end{funcdesc}

\begin{datadesc}{LC_CTYPE}
\refstmodindex{string}
  Locale category for the character type functions.  Depending on the
  settings of this category, the functions of module
  \refmodule{string} dealing with case change their behaviour.
\end{datadesc}

\begin{datadesc}{LC_COLLATE}
  Locale category for sorting strings.  The functions
  \function{strcoll()} and \function{strxfrm()} of the
  \module{locale} module are affected.
\end{datadesc}

\begin{datadesc}{LC_TIME}
  Locale category for the formatting of time.  The function
  \function{time.strftime()} follows these conventions.
\end{datadesc}

\begin{datadesc}{LC_MONETARY}
  Locale category for formatting of monetary values.  The available
  options are available from the \function{localeconv()} function.
\end{datadesc}

\begin{datadesc}{LC_MESSAGES}
  Locale category for message display. Python currently does not
  support application specific locale-aware messages.  Messages
  displayed by the operating system, like those returned by
  \function{os.strerror()} might be affected by this category.
\end{datadesc}

\begin{datadesc}{LC_NUMERIC}
  Locale category for formatting numbers.  The functions
  \function{format()}, \function{atoi()}, \function{atof()} and
  \function{str()} of the \module{locale} module are affected by that
  category.  All other numeric formatting operations are not
  affected.
\end{datadesc}

\begin{datadesc}{LC_ALL}
  Combination of all locale settings.  If this flag is used when the
  locale is changed, setting the locale for all categories is
  attempted. If that fails for any category, no category is changed at
  all.  When the locale is retrieved using this flag, a string
  indicating the setting for all categories is returned. This string
  can be later used to restore the settings.
\end{datadesc}

\begin{datadesc}{CHAR_MAX}
  This is a symbolic constant used for different values returned by
  \function{localeconv()}.
\end{datadesc}

The \function{nl_langinfo} function accepts one of the following keys.
Most descriptions are taken from the corresponding description in the
GNU C library.

\begin{datadesc}{CODESET}
Return a string with the name of the character encoding used in the
selected locale.
\end{datadesc}

\begin{datadesc}{D_T_FMT}
Return a string that can be used as a format string for strftime(3) to
represent time and date in a locale-specific way.
\end{datadesc}

\begin{datadesc}{D_FMT}
Return a string that can be used as a format string for strftime(3) to
represent a date in a locale-specific way.
\end{datadesc}

\begin{datadesc}{T_FMT}
Return a string that can be used as a format string for strftime(3) to
represent a time in a locale-specific way.
\end{datadesc}

\begin{datadesc}{T_FMT_AMPM}
The return value can be used as a format string for `strftime' to
represent time in the am/pm format.
\end{datadesc}

\begin{datadesc}{DAY_1 ... DAY_7}
Return name of the n-th day of the week. \warning{This
follows the US convention of \constant{DAY_1} being Sunday, not the
international convention (ISO 8601) that Monday is the first day of
the week.}
\end{datadesc}

\begin{datadesc}{ABDAY_1 ... ABDAY_7}
Return abbreviated name of the n-th day of the week.
\end{datadesc}

\begin{datadesc}{MON_1 ... MON_12}
Return name of the n-th month.
\end{datadesc}

\begin{datadesc}{ABMON_1 ... ABMON_12}
Return abbreviated name of the n-th month.
\end{datadesc}

\begin{datadesc}{RADIXCHAR}
Return radix character (decimal dot, decimal comma, etc.)
\end{datadesc}

\begin{datadesc}{THOUSEP}
Return separator character for thousands (groups of three digits).
\end{datadesc}

\begin{datadesc}{YESEXPR}
Return a regular expression that can be used with the regex
function to recognize a positive response to a yes/no question.
\warning{The expression is in the syntax suitable for the
\cfunction{regex()} function from the C library, which might differ
from the syntax used in \refmodule{re}.}
\end{datadesc}

\begin{datadesc}{NOEXPR}
Return a regular expression that can be used with the regex(3)
function to recognize a negative response to a yes/no question.
\end{datadesc}

\begin{datadesc}{CRNCYSTR}
Return the currency symbol, preceded by "-" if the symbol should
appear before the value, "+" if the symbol should appear after the
value, or "." if the symbol should replace the radix character.
\end{datadesc}

\begin{datadesc}{ERA}
The return value represents the era used in the current locale.

Most locales do not define this value.  An example of a locale which
does define this value is the Japanese one.  In Japan, the traditional
representation of dates includes the name of the era corresponding to
the then-emperor's reign.

Normally it should not be necessary to use this value directly.
Specifying the \code{E} modifier in their format strings causes the
\function{strftime} function to use this information.  The format of the
returned string is not specified, and therefore you should not assume
knowledge of it on different systems.
\end{datadesc}

\begin{datadesc}{ERA_YEAR}
The return value gives the year in the relevant era of the locale.
\end{datadesc}

\begin{datadesc}{ERA_D_T_FMT}
This return value can be used as a format string for
\function{strftime} to represent dates and times in a locale-specific
era-based way.
\end{datadesc}

\begin{datadesc}{ERA_D_FMT}
This return value can be used as a format string for
\function{strftime} to represent time in a locale-specific era-based
way.
\end{datadesc}

\begin{datadesc}{ALT_DIGITS}
The return value is a representation of up to 100 values used to
represent the values 0 to 99.
\end{datadesc}

Example:

\begin{verbatim}
>>> import locale
>>> loc = locale.setlocale(locale.LC_ALL) # get current locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform
>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut 
>>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
\end{verbatim}


\subsection{Background, details, hints, tips and caveats}

The C standard defines the locale as a program-wide property that may
be relatively expensive to change.  On top of that, some
implementation are broken in such a way that frequent locale changes
may cause core dumps.  This makes the locale somewhat painful to use
correctly.

Initially, when a program is started, the locale is the \samp{C} locale, no
matter what the user's preferred locale is.  The program must
explicitly say that it wants the user's preferred locale settings by
calling \code{setlocale(LC_ALL, '')}.

It is generally a bad idea to call \function{setlocale()} in some library
routine, since as a side effect it affects the entire program.  Saving
and restoring it is almost as bad: it is expensive and affects other
threads that happen to run before the settings have been restored.

If, when coding a module for general use, you need a locale
independent version of an operation that is affected by the locale
(such as \function{string.lower()}, or certain formats used with
\function{time.strftime()}), you will have to find a way to do it
without using the standard library routine.  Even better is convincing
yourself that using locale settings is okay.  Only as a last resort
should you document that your module is not compatible with
non-\samp{C} locale settings.

The case conversion functions in the
\refmodule{string}\refstmodindex{string} module are affected by the
locale settings.  When a call to the \function{setlocale()} function
changes the \constant{LC_CTYPE} settings, the variables
\code{string.lowercase}, \code{string.uppercase} and
\code{string.letters} are recalculated.  Note that this code that uses
these variable through `\keyword{from} ... \keyword{import} ...',
e.g.\ \code{from string import letters}, is not affected by subsequent
\function{setlocale()} calls.

The only way to perform numeric operations according to the locale
is to use the special functions defined by this module:
\function{atof()}, \function{atoi()}, \function{format()},
\function{str()}.

\subsection{For extension writers and programs that embed Python
            \label{embedding-locale}}

Extension modules should never call \function{setlocale()}, except to
find out what the current locale is.  But since the return value can
only be used portably to restore it, that is not very useful (except
perhaps to find out whether or not the locale is \samp{C}).

When Python code uses the \module{locale} module to change the locale,
this also affects the embedding application.  If the embedding
application doesn't want this to happen, it should remove the
\module{_locale} extension module (which does all the work) from the
table of built-in modules in the \file{config.c} file, and make sure
that the \module{_locale} module is not accessible as a shared library.


\subsection{Access to message catalogs \label{locale-gettext}}

The locale module exposes the C library's gettext interface on systems
that provide this interface.  It consists of the functions
\function{gettext()}, \function{dgettext()}, \function{dcgettext()},
\function{textdomain()}, and \function{bindtextdomain()}.  These are
similar to the same functions in the \refmodule{gettext} module, but use
the C library's binary format for message catalogs, and the C
library's search algorithms for locating message catalogs. 

Python applications should normally find no need to invoke these
functions, and should use \refmodule{gettext} instead.  A known
exception to this rule are applications that link use additional C
libraries which internally invoke \cfunction{gettext()} or
\function{cdgettext()}.  For these applications, it may be necessary to
bind the text domain, so that the libraries can properly locate their
message catalogs.
