40

It seems both the LANG and LANGUAGE environment variable are used by some programs to determine their user interface language.

What are the exact semantics of these variables and where can I read about their correct usage? The manpage for locale(1) only mentions the LC_* family of environment variables. Additionally there is also an LC_ALL variable commonly in place which isn't described there either.

4 Answers 4

39

LANG contain the setting for all categories that are not directly set by a LC_* variable.

LC_ALL is used to override every LC_* and LANG and LANGUAGE. It should not be set in a normal user environment, but can be useful when you are writing a script that depend on the precise output of an internationalized command.

LANGUAGE is used to set messages languages (as LC_MESSAGES) to a multi-valued value, e.g., setting it to fr:de:en will use French messages where they exist; if not, it will use German messages, and will fall back to English if neither German nor French messages are available.

11
  • 1
    Where can I find documentation about LANGUAGE? Is it mutually exclusive to LC_MESSAGES?
    – aef
    Feb 22, 2012 at 0:44
  • 2
    @Rémi can you elaborate on why LC_ALL should not be used? Feb 2, 2016 at 12:21
  • 3
    I don't think LC_ALL overrides LANGUAGE: 1. they have different meanings (order [e.g.: fr:de:en] vs. characteristics[e.g.: fr_FR])
    – Murmel
    Jun 6, 2018 at 15:11
  • 13
    2. The GNU getText documentation's chapter Specifying a Priority List of Languages states: gettext gives preference to LANGUAGE over LC_ALL and LANG. Additionally, the chapter Locale Environment Variables states: 1. LANGUAGE 2. LC_ALL [...]
    – Murmel
    Jun 13, 2018 at 12:25
  • 4
    $LANGUAGE is not part of the C locales, but specific to GNU gettext. If set it is given precedence over anything else. I'm using it my own applications to avoid mixed languages when using gettext based libraries.
    – Bachsau
    Jul 12, 2020 at 20:16
12

Have a look at the manpage locale(7): it describes that LANG is a fallback setting, while LC_ALL overrides all separate LC_* settings.

1
  • 6
    man 7 locale is the command
    – Smile4ever
    Jan 8, 2017 at 15:52
5

For reference, the locale system is GNU GetText, which has its full documentation available in the gettext-doc package (Debian/Ubuntu).

Alternatively, there is an online manual with authoritative and elaborate documentation of the LANG and LANGUAGE environment variables.

1
  • 1
    gettext is a library to localize messages, but it is not the whole locale system. The LC_* variables are used by several different parts of the C standard library and various other libraries as well.
    – Bachsau
    Aug 7, 2022 at 22:22
0

This answer attempts to directly quote relevant standards and contains no speculation or inaccurate statements. Edits and corrections welcome as long as they cite relevant standards and authoritative sources.

Environment Variable Priority

The priority of all four variables LC_ALL, LC_*, LANG, and LANGUAGE according to applicable standards:

  1. man 7 local:

If the second argument to setlocale(3) is an empty string, "", for the default locale, it is determined using the following steps:

  1. If there is a non-null environment variable LC_ALL, the value of LC_ALL is used.

  2. If an environment variable with the same name as one of the categories above exists and is non-null, its value is used for that category.

  3. If there is a non-null environment variable LANG, the value of LANG is used.

  1. Gnu Gettext Manual:

When a program looks up locale dependent values, it does this according to the following environment variables, in priority order:

  1. LANGUAGE
  2. LC_ALL
  3. LC_xxx, according to selected locale category: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, ...
  4. LANG

So the currently accepted answer is inaccurate.

Environment Variable Format

From another part of the Gnu Gettext Manual:

A locale name usually has the form ‘ll_CC’. Here ‘ll’ is an ISO 639 two-letter language code, and ‘CC’ is an ISO 3166 two-letter country code.

Many locale names have an extended syntax ‘ll_CC.encoding’ that also specifies the character encoding.

Some locale names use ‘ll_CC@variant’ instead of ‘ll_CC’. The ‘@variant’ can denote any kind of characteristics that is not already implied by the language ll and the country CC.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .