33

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.

aef
  • 1,282
  • 3
  • 17
  • 20

3 Answers3

35

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.

Anthony Geoghegan
  • 3,521
  • 19
  • 36
Rémi
  • 1,430
  • 9
  • 10
  • 1
    Where can I find documentation about LANGUAGE? Is it mutually exclusive to LC_MESSAGES? – aef Feb 22 '12 at 00:44
  • Everything is in the locale(7) manpage. LC_MESSAGES changes the language messages are displayed in and what an affirmative or negative answer looks like. The GNU C-library contains the gettext(3), ngettext(3), and rpmatch(3) functions to ease the use of these information. The GNU gettext family of functions also obey the environment variable LANGUAGE (containing a colon-separated list of locales) if the category is set to a valid locale other than "C". – Rémi Feb 24 '12 at 15:08
  • 1
    @Rémi can you elaborate on why `LC_ALL` should not be used? – Édouard Lopez Feb 02 '16 at 12:21
  • 1
    Not much to say. You have more flexibility if you set LANG than if you set LC_ALL: you can set LANG to something and LC_COLLATE to some other thing. If you set LC_ALL, every other configuration are hidden. – Rémi Feb 03 '16 at 22:35
  • 2
    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 06 '18 at 15:11
  • 6
    2. The GNU getText documentation's chapter [Specifying a Priority List of Languages](https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html#The-LANGUAGE-variable) states: `gettext gives preference to LANGUAGE over LC_ALL and LANG`. Additionally, the chapter [Locale Environment Variables](https://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html#Locale-Environment-Variables) states: `1. LANGUAGE 2. LC_ALL [...]` – Murmel Jun 13 '18 at 12:25
  • $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 '20 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.

Jaap Eldering
  • 8,825
  • 2
  • 16
  • 26
6

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.

mikini
  • 141
  • 2
  • 3