# Locale

Related articles

- Environment variables

Locales are used by glibc and other locale-aware programs or libraries for rendering text, correctly displaying regional monetary values, time and date formats, alphabetic idiosyncrasies, and other locale-specific standards.

## Generating locales

Locale names are typically of the form `language[_territory][.codeset][@modifier]`, where language is an ISO 639 language code, territory is an ISO 3166 country code, and codeset is a character set or encoding identifier like ISO-8859-1 or UTF-8. See setlocale(3).

For a list of enabled locales, run:

    $ locale -a

Before a locale can be enabled on the system, it must be generated. This can be achieved by uncommenting applicable entries in `/etc/locale.gen`, and running locale-gen. Equivalently, commenting entries disables their respective locales. While making changes, consider any localisations required by other users on the system, as well as specific #Variables.

For example, uncomment `en_US.UTF-8 UTF-8` for American-English:

    /etc/locale.gen

    ...
    #en_SG ISO-8859-1
    en_US.UTF-8 UTF-8
    #en_US ISO-8859-1
    ...

Save the file, and generate the locale:

    # locale-gen

Note:

- `locale-gen` also runs with every update of glibc. [1]
- `UTF-8` is recommended over other character sets. [2]

## Setting the locale

To display the currently set locale and its related environmental settings, type:

    $ locale

The locale to be used, chosen among the previously generated ones, is set in `locale.conf` files. Each of these files must contain a new-line separated list of environment variable assignments, having the same format as output by locale.

To list available locales which have been previously generated, run:

    $ localedef --list-archive

Alternatively, using localectl(1):

    $ localectl list-locales

### Setting the system locale

To set the system locale, write the `LANG` variable to `/etc/locale.conf`, where `en_US.UTF-8` belongs to the first column of an uncommented entry in `/etc/locale.gen`:

    /etc/locale.conf

    LANG=en_US.UTF-8

Alternatively, run:

    # localectl set-locale LANG=en_US.UTF-8

See #Variables and locale.conf(5) for details.

### Overriding system locale per user session

The system-wide locale can be overridden in each user session by creating or editing `~/.config/locale.conf` (or, in general, `$XDG_CONFIG_HOME/locale.conf` or `$HOME/.config/locale.conf`).

The precedence of these `locale.conf` files is defined in `/etc/profile.d/locale.sh`.

Tip:

- This can also allow keeping the logs in `/var/log` in English while using the local language in the user environment.
- You can create a `/etc/skel/.config/locale.conf` file so that any new users added using useradd and the `-m` option will have `~/.config/locale.conf` automatically generated.

### Make locale changes immediate

Once system and user `locale.conf` files have been created or edited, their new values will take effect for new sessions at login. To have the current environment use the new settings unset `LANG` and source `/etc/profile.d/locale.sh`:

    $ LANG= source /etc/profile.d/locale.sh

Note: The `LANG` variable has to be unset first, otherwise `locale.sh` will not update the values from `locale.conf`. Only new and changed variables will be updated; variables removed from `locale.conf` will still be set in the session.

### Other uses

Locale variables can also be defined with the standard methods as explained in Environment variables.

For example, in order to test or debug a particular application during development, it could be launched with something like:

    $ LANG=C ./my_application.sh

Similarly, to set the locale for all processes run from the current shell (for example, during system installation):

    $ export LANG=C

## Variables

`locale.conf` files support the following environment variables:

- LANG
- LANGUAGE
- `LC_ADDRESS`
- LC_COLLATE
- `LC_CTYPE`
- `LC_IDENTIFICATION`
- `LC_MEASUREMENT`
- `LC_MESSAGES`
- `LC_MONETARY`
- `LC_NAME`
- `LC_NUMERIC`
- `LC_PAPER`
- `LC_TELEPHONE`
- LC_TIME

Full meaning of the above `LC_*` variables can be found on manpage locale(7), whereas details of their definition are described on locale(5).

### LANG: default locale

The locale set for this variable will be used for all the `LC_*` variables that are not explicitly set.

### LANGUAGE: fallback locales

Programs which use gettext for translations respect the `LANGUAGE` option in addition to the usual variables. This allows users to specify a list of locales that will be used in that order. If a translation for the preferred locale is unavailable, another from a similar locale will be used instead of the default. For example, an Australian user might want to fall back to British rather than US spelling:

    locale.conf

    LANG=en_AU.UTF-8
    LANGUAGE=en_AU:en_GB:en

### LC_TIME: date and time format

If `LC_TIME` is set to `en_US.UTF-8`, for example, the date format will be "MM/DD/YYYY". If wanting to use the the ISO 8601 date format of "YYYY-MM-DD" use:

    locale.conf

    LC_TIME=en_DK.UTF-8

Note: Programs do not necessarily respect this variable to format the date. For example, date(1) uses its own parameters to do so.

### LC_COLLATE: collation

This variable governs the collation rules used for sorting and regular expressions.

Setting the value to `C` can for example make the ls command sort dotfiles first, followed by uppercase and lowercase filenames:

    locale.conf

    LC_COLLATE=C

See also [3].

To get around potential issues, Arch used to set `LC_COLLATE=C` in `/etc/profile`, but this method is now deprecated.

### LC_ALL: troubleshooting

The locale set for this variable will always override `LANG` and all the other `LC_*` variables, whether they are set or not.

`LC_ALL` is the only `LC_*` variable, which cannot be set in `locale.conf` files: it is meant to be used only for testing or troubleshooting purposes, for example in `/etc/profile`.

## Troubleshooting

### My terminal does not support UTF-8

The following lists some (not all) terminals that support UTF-8:

- gnustep-terminal
- konsole
- mlterm
- rxvt-unicode
- st
- termite
- VTE-based terminals
- xterm - Run with the argument `-u8` or configure resource `xterm*utf8: 2`.

#### Gnome-terminal or rxvt-unicode

You need to launch these applications from a UTF-8 locale or they will drop UTF-8 support. Enable the `en_US.UTF-8` locale (or your local UTF-8 alternative) per the instructions above and set it as the default locale, then reboot.

### My system is still using wrong language

It is possible that the environment variables are redefined in other files than `locale.conf`, for example `~/.pam_environment`. See Environment variables#Defining variables for details.

If you're using a desktop environment, such as Gnome, its language settings may be overriding the settings in `locale.conf`.

## See also

- Gentoo Linux Localization Guide
- Gentoo Wiki Archives: Locales
- ICU's interactive collation testing
- Free Standards Group Open Internationalisation Initiative
- The Single UNIX Specification definition of Locale by The Open Group
- Locale environment variables

Category:

- Internationalization