Difference between revisions of "Locale"

From ArchWiki
Jump to: navigation, search
(KDE, XFCE or another WM refuses to change language (including programs like Firefox): tagging instructions as outdated)
(See also: Add Open Group specification)
Line 130: Line 130:
 
* [http://demo.icu-project.org/icu-bin/locexp?_=en_US&x=col ICU's interactive collation testing]
 
* [http://demo.icu-project.org/icu-bin/locexp?_=en_US&x=col ICU's interactive collation testing]
 
* [http://www.openi18n.org/ Free Standards Group Open Internationalisation Initiative]
 
* [http://www.openi18n.org/ Free Standards Group Open Internationalisation Initiative]
 +
* [http://pubs.opengroup.org/onlinepubs/007908799/xbd/locale.html ''The Single UNIX Specification'' definition of Locale] by The Open Group

Revision as of 04:12, 3 July 2012

Locales are used in Linux to define which language the user uses. As the locales define the character sets being used as well, setting up the correct locale is especially important if the language contains non-ASCII characters.

Locale names are defined using the following format:

<lang>_<territory>.<codeset>[@<modifiers>]

Enabling necessary locales

Before a locale can be used on the system, it has to be enabled first. To list all available locales, use:

$ locale -a

To enable a locale, uncomment the name of the locale in the file /etc/locale.gen. This file contains all the available locales that can be used on the system. Revert the process to disable a locale. After the necessary locales are enabled, the system needs to be updated with the new locales:

# locale-gen

To display the locales now currently in use, use:

$ locale
Tip: Though it's most likely that just one language is used use on your computer, it can be helpful or even necessary to enable other locales as well. If you're running a multi-user system with users that do not speak en_US, their individual locale should at least be supported by your system.

English UTF-8 example

To setup an English UTF-8 conform system, the locale en_US.UTF-8 needs to be enabled. But for compatibility to programs that do not support UTF-8 yet, it's recommended to enable any other locale prefixed with en_US as well.

First uncomment the following locales in /etc/locale.gen:

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

Then update the system as root:

# locale-gen

Setting system-wide locale

To define the system-wide locale used on the system, add the specified locale to the /etc/rc.conf file:

LOCALE="en_US.UTF-8"

For more advanced control, leave the above LOCALE option blank, and put the relevant settings in /etc/locale.conf. If this file does not exist, it can be easily prepopulated with the current settings:

# locale > /etc/locale.conf

The file can then be edited. Any options that are omitted from this file will default to LANG, so you do not need to specify them all (only LANG itself and any further options you wish to be different from LANG.)

Whichever method is used, the system wide locale will be updated after rebooting the system (or at the very least, logging out completely including restarting X11.)

Note that the LOCALE option in /etc/rc.conf is the same as the LANG option in /etc/locale.conf (and whatever value is set there becomes the value of the LANG environment variable.)

Here is an example advanced configuration:

/etc/locale.conf
# Enable UTF-8 with Australian settings.
LANG="en_AU.UTF-8"

# Keep the default sort order (e.g. files starting with a '.'
# should appear at the start of a directory listing.)
LC_COLLATE="C"

# Set the short date to YYYY-MM-DD (test with "date +%c")
LC_TIME="en_DK.UTF-8"
/etc/locale.gen
en_AU.UTF-8 UTF-8  
en_AU ISO-8859-1  
en_DK.UTF-8 UTF-8  
en_DK ISO-8859-1  
en_US.UTF-8 UTF-8  
en_US ISO-8859-1  

Setting per user locale

As we mentioned earlier, some users might want to define a different locale than the system-wide locale. To do this, export the variable LANG with the specified locale in the ~/.bashrc file. For example, to use the en_AU.UTF-8 locale:

export LANG=en_AU.UTF-8

The locales will be updated next time ~/.bashrc is sourced. To update, either re-login or source it manually:

$ source ~/.bashrc

Setting collation

Collation, or sorting, is a little different. Sorting is a goofy beast and different locales do things differently. To get around potential issues, Arch used to set LC_COLLATE="C" in /etc/profile. However, this method is now deprecated. To enable this behavior, simply add the following to /etc/locale.conf:

LC_COLLATE="C"

Now the ls command will sort dotfiles first, followed by uppercase and lowercase filenames. Note that without a LC_COLLATE setting, locale aware apps sort by LC_ALL or LANG, but LC_COLLATE settings will be overridden if LC_ALL is set. To resolve this, add the following to /etc/locale.conf instead:

LC_ALL=
LC_COLLATE="C"

Setting the first day of the week

In many countries the first day of the week is Monday. To adjust this, change or add the following lines in the LC_TIME section in /usr/share/i18n/locales/<your_locale>:

week            7;19971130;5
first_weekday   2
first_workday   2

And then update the system:

# locale-gen
Tip: If you experience some kind of problems with your system and would like to ask for help on the forum, mailing list or otherwise, please include the output from the misbehaving program with export LC_MESSAGES=C before posting. It will set the output messages (errors and warnings) to English, thus enabling more people to understand what the problem might be. This is not relevant if you are posting on a non-English forum.

Troubleshooting

My terminal doesn't support UTF-8

Unfortunately some terminals do not support UTF-8. In this case, you have to use a different terminal. Here are some terminals that have support for UTF-8:

  • gnome-terminal
  • gnustep-terminal
  • konsole
  • mlterm
  • urxvt (rxvt-unicode)
  • xfce-terminal
  • xterm

Xterm doesn't support UTF-8

xterm only supports UTF-8 if you run it as uxterm or xterm -u8.

Gnome-terminal or rxvt-unicode doesn't support UTF-8

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.

KDE, XFCE or another WM refuses to change language (including programs like Firefox)

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: These instructions seem to be outdated (Discuss in Talk:Locale#)

If KDE, for example, refuses to apply language to all its environment and you've configured your locale correctly, delete /etc/locale.sh and reinstall initscripts:

# rm /etc/locale.sh
# pacman -Syu initscripts

See also