Difference between revisions of "Locale"

From ArchWiki
Jump to: navigation, search
(Setting system-wide locale: changed title)
m (Make locale changes immediate: typo)
 
(146 intermediate revisions by 25 users not shown)
Line 1: Line 1:
 
[[Category:Internationalization]]
 
[[Category:Internationalization]]
 +
[[ar:Locale]]
 
[[cs:Locale]]
 
[[cs:Locale]]
 
[[de:Locale]]
 
[[de:Locale]]
Line 5: Line 6:
 
[[fr:Locale]]
 
[[fr:Locale]]
 
[[it:Locale]]
 
[[it:Locale]]
[[ja:Locale]]
+
[[ja:ロケール]]
 
[[ko:Locale]]
 
[[ko:Locale]]
 
[[nl:Locale]]
 
[[nl:Locale]]
Line 11: Line 12:
 
[[uk:Locale]]
 
[[uk:Locale]]
 
[[zh-CN:Locale]]
 
[[zh-CN:Locale]]
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.
+
{{Related articles start}}
 +
{{Related|Environment variables}}
 +
{{Related articles end}}
 +
Locales are used by {{Pkg|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.
  
Locale names are defined using the following format:
+
== Generating locales ==
<lang>_<territory>.<codeset>[@<modifiers>]
+
 
 +
Before a locale can be enabled on the system, it has to be generated. The current generated/available locales can be viewed with:
  
==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
 
  $ locale -a
To enable a locale, uncomment the name of the locale in the file {{ic|/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:
+
 
 +
The locales that can be generated are listed in the {{ic|/etc/locale.gen}} file: their names are defined using the format {{ic|[language][_TERRITORY][.CODESET][@modifier]}}. To generate a locale, first uncomment the corresponding line in the file (or comment to remove); when doing this, also consider localizations needed by other users on the system and specific [[#Variables]]. For example, for American-English uncomment {{ic|en_US.UTF-8 UTF-8}}.
 +
 
 +
{{hc|/etc/locale.gen|
 +
...
 +
#en_SG ISO-8859-1
 +
en_US.UTF-8 UTF-8
 +
#en_US ISO-8859-1
 +
...
 +
}}
 +
 
 +
When done, save the file and generate the uncommented locale(s) by executing:
 +
 
 
  # locale-gen
 
  # locale-gen
  
To display the locales now currently in use, use:
+
{{Note|1=<nowiki></nowiki>
 +
* {{ic|locale-gen}} also runs with every update of {{Pkg|glibc}}. [https://projects.archlinux.org/svntogit/packages.git/tree/trunk/glibc.install?h=packages/glibc#n5]
 +
* {{ic|UTF-8}} is recommended over other options. [http://utf8everywhere.org/]}}
 +
 
 +
== Setting the locale ==
 +
 
 +
To display the currently set locale and its related environmental settings, type:
 +
 
 
  $ locale
 
  $ locale
  
{{Tip| Though it's most likely that just one language is used 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 English, their individual locale should at least be supported by your system.}}
+
The locale to be used, chosen among the previously generated ones, is set in {{ic|locale.conf}} files, each of which must contain a new-line separated list of environment variable assignments having the same format as output by ''locale''.
  
===US English example===
+
To list available locales that can be used which have been previously generated do:
  
First uncomment the following locales in {{ic|/etc/locale.gen}}:
+
  $ localectl list-locales
  en_US.UTF-8 UTF-8
+
  
Then update the system as root:
+
=== Setting the system locale ===
# locale-gen
+
  
==Setting the locale system-wide==
+
To set the system locale use the ''localectl'' command, where ''en_US.UTF-8'' is from the '''first column''' of an uncommented entry in {{ic|/etc/locale.gen}}.
To define the system-wide locale used on the system, set {{ic|LANG}} in {{ic|/etc/locale.conf}}.
+
  
{{ic|locale.conf}} contains a new-line separated list of environment variable assignments: besides {{ic|LANG}}, it supports all the {{ic|LC_*}} variables, with the exception of {{ic|LC_ALL}}.
+
# localectl set-locale LANG=''en_US.UTF-8''
  
{{Note|{{ic|/etc/locale.conf}} does not exist by default and must be created manually.}}
+
{{Note|''localectl'' cannot be used to set the system locale in the installation chroot environment. {{ic|/etc/locale.conf}} must be edited manually as follows.}}
  
{{Tip| If the output of {{ic|locale}} is to your liking during installation, you can save a little time by doing: {{ic| # locale > /etc/locale.conf}} while chrooted.}}
+
Alternatively, manually [[edit]] or [[create]] {{ic|/etc/locale.conf}}:
  
{{hc|/etc/locale.conf|2=
+
{{hc|1=/etc/locale.conf|2=
LANG="en_US.UTF-8"}}
+
LANG=''en_US.UTF-8''
 +
}}
  
An advanced example configuration would be:
+
See [[#Variables]], {{ic|man 5 locale.conf}} and related for details.
  
{{hc|/etc/locale.conf|2=
+
=== Overriding system locale per user session ===
# Enable UTF-8 with Australian settings.
+
LANG="en_AU.UTF-8"
+
  
# Keep the default sort order (e.g. files starting with a '.'
+
The system-wide locale can be overridden in each user session by creating or editing {{ic|~/.config/locale.conf}} (or, in general, {{ic|$XDG_CONFIG_HOME/locale.conf}} or {{ic|$HOME/.config/locale.conf}}).
# should appear at the start of a directory listing.)
+
LC_COLLATE="C"
+
  
# Set the short date to YYYY-MM-DD (test with "date +%c")
+
The precedence of these {{ic|locale.conf}} files is defined in {{ic|/etc/profile.d/locale.sh}}.
LC_TIME="en_DK.UTF-8"}}
+
  
You can set the default locale in {{ic|locale.conf}} also using {{ic|localectl}}, for example:
+
{{Tip|
 +
* This can also allow keeping the logs in {{ic|/var/log}} in English while using the local language in the user environment.
 +
* You can create a {{ic|/etc/skel/.config/locale.conf}} file so that any new users added using ''useradd'' and the {{ic|-m}} option will have {{ic|~/.config/locale.conf}} automatically generated.}}
  
# localectl set-locale LANG="de_DE.UTF-8"
+
=== Make locale changes immediate ===
  
See {{ic|man 1 localectl}} and {{ic|man 5 locale.conf}} for details.
+
Once system and user {{ic|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 {{ic|LANG}} and source {{ic|/etc/profile.d/locale.sh}}:
  
They will take effect after rebooting the system and will be set for individual sessions at login.
+
$ LANG= source /etc/profile.d/locale.sh
 +
 
 +
{{Note|The {{ic|LANG}} variable has to be unset first, otherwise {{ic|locale.sh}} will not update the values from {{ic|locale.conf}}. Only new and changed variables will be updated; variables removed from {{ic|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 ==
 +
 
 +
{{ic|locale.conf}} files support the following environment variables:
 +
 
 +
* [[#LANG: default locale|LANG]]
 +
* [[#LANGUAGE: fallback locales|LANGUAGE]]
 +
* {{ic|LC_ADDRESS}}
 +
* [[#LC_COLLATE: collation|LC_COLLATE]]
 +
* {{ic|LC_CTYPE}}
 +
* {{ic|LC_IDENTIFICATION}}
 +
* {{ic|LC_MEASUREMENT}}
 +
* {{ic|LC_MESSAGES}}
 +
* {{ic|LC_MONETARY}}
 +
* {{ic|LC_NAME}}
 +
* {{ic|LC_NUMERIC}}
 +
* {{ic|LC_PAPER}}
 +
* {{ic|LC_TELEPHONE}}
 +
* [[#LC_TIME: date and time format|LC_TIME]]
 +
 
 +
Full meaning of the above {{ic|LC_*}} variables can be found on manpage [https://www.mankier.com/7/locale locale(7)], whereas details of their definition are described on [https://www.mankier.com/5/locale locale(5)].
 +
 
 +
=== LANG: default locale ===
 +
 
 +
The locale set for this variable will be used for all the {{ic|LC_*}} variables that are not explicitly set.
 +
 
 +
=== LANGUAGE: fallback locales ===
  
==Setting fallback locales==
 
 
Programs which use gettext for translations respect the {{Ic|LANGUAGE}} option in addition to the usual variables. This allows users to specify a [http://www.gnu.org/software/gettext/manual/gettext.html#The-LANGUAGE-variable 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:
 
Programs which use gettext for translations respect the {{Ic|LANGUAGE}} option in addition to the usual variables. This allows users to specify a [http://www.gnu.org/software/gettext/manual/gettext.html#The-LANGUAGE-variable 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:
{{hc|~/.bashrc|2=
+
 
export LANGUAGE="en_AU:en_GB:en"
+
{{hc|locale.conf|2=
 +
LANG=en_AU
 +
LANGUAGE=en_AU:en_GB:en
 
}}
 
}}
or system-wide
+
 
{{hc|/etc/locale.conf|2=
+
=== LC_TIME: date and time format ===
LANG="en_AU"
+
 
LANGUAGE="en_AU:en_GB:en"
+
If {{ic|LC_TIME}} is set to {{ic|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:
 +
 
 +
{{hc|locale.conf|2=
 +
LC_TIME=en_DK.UTF-8
 
}}
 
}}
  
==Setting per user locale==
+
=== LC_COLLATE: collation ===
As we mentioned earlier, some users might want to define a different locale than the system-wide locale.
+
===write locale in shell start-up file===
+
To do this, export the variable {{Ic|LANG}} with the specified locale in the {{ic|~/.bashrc}} file. For example, to use the {{Ic|en_AU.UTF-8}} locale:
+
export LANG=en_AU.UTF-8
+
  
The locales will be updated next time {{ic|~/.bashrc}} is sourced. To update, either re-login or source it manually:
+
This variable governs the collation rules used for sorting and regular expressions.
$ source ~/.bashrc
+
===Write locale in {{ic|.locale.conf}}===
+
The script {{ic|etc/profile.d/locale.sh}} overrides the ''system-wide'' locale with the one found in {{ic|$HOME/.config/locale.conf}}. This file does not exist by default.
+
  
{{hc|$HOME/.config/locale.conf|<nowiki>
+
Setting the value to {{ic|C}} can for example make the ''ls'' command sort dotfiles first, followed by uppercase and lowercase filenames:
LANG="de_DE.UTF-8"
+
LANGUAGE="de_DE.UTF-8"
+
</nowiki>}}
+
  
==Setting collation==
+
{{hc|locale.conf|2=
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 {{ic|1=LC_COLLATE="C"}} in {{ic|/etc/profile}}. However, this method is now deprecated. To enable this behavior, simply add the following to {{ic|/etc/locale.conf}}:
+
LC_COLLATE=C
LC_COLLATE="C"
+
}}
  
Now the ls command will sort dotfiles first, followed by uppercase and lowercase filenames. Note that without a {{ic|LC_COLLATE}} setting, locale aware apps sort by {{ic|LC_ALL}} or {{ic|LANG}}, but {{ic|LC_COLLATE}} settings will be overridden if {{ic|LC_ALL}} is set. If this is a problem, ensure that LC_ALL is not set by adding the following to {{ic|/etc/profile}} instead:
+
See also [http://superuser.com/a/448294/175967].
export LC_ALL=
+
Note that LC_ALL is the only LC variable which '''cannot''' be set in {{ic|/etc/locale.conf}}.
+
  
==Setting the first day of the week==
+
To get around potential issues, Arch used to set {{ic|1=LC_COLLATE=C}} in {{ic|/etc/profile}}, but this method is now deprecated.
In many countries the first day of the week is Monday. To adjust this, change or add the following lines in the {{ic|LC_TIME}} section in {{ic|/usr/share/i18n/locales/<your_locale>}}:
+
  
week            7;19971130;5
+
=== LC_ALL: troubleshooting ===
first_weekday  2
+
first_workday  2
+
  
And then update the system:
+
The locale set for this variable will always override {{ic|LANG}} and all the other {{ic|LC_*}} variables, whether they are set or not.
  
# locale-gen
+
{{ic|LC_ALL}} is the only {{ic|LC_*}} variable, which '''cannot''' be set in {{ic|locale.conf}} files: it is meant to be used only for testing or troubleshooting purposes, for example in {{ic|/etc/profile}}.
 +
 
 +
== Troubleshooting ==
 +
 
 +
=== My terminal does not support UTF-8 ===
  
==Troubleshooting==
+
The following lists some (not all) terminals that support UTF-8:
===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:
+
  
* vte-based terminals
 
 
* gnustep-terminal
 
* gnustep-terminal
 
* konsole
 
* konsole
 
* [[mlterm]]
 
* [[mlterm]]
 
* [[rxvt-unicode]]
 
* [[rxvt-unicode]]
* [[xterm]]
+
* [[st]]
 +
* [[termite]]
 +
* [[List_of_applications/Utilities#VTE-based|VTE-based terminals]]
 +
* [[xterm]] - Must be run with the argument {{ic|-u8}}. Alternatively run ''uxterm'', which is provided by the package {{Pkg|xterm}}.
  
====Xterm doesn't support UTF-8====
+
==== Gnome-terminal or rxvt-unicode does not support UTF-8 ====
xterm only supports UTF-8 if you run it as {{Ic|uxterm}} or {{Ic|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 {{ic|en_US.UTF-8}} locale (or your local UTF-8 alternative) per the instructions above and set it as the default locale, then reboot.
 
You need to launch these applications from a UTF-8 locale or they will drop UTF-8 support.  Enable the {{ic|en_US.UTF-8}} locale (or your local UTF-8 alternative) per the instructions above and set it as the default locale, then reboot.
  
==See also==
+
=== My system is still using wrong language ===
 +
 
 +
It is possible that the environment variables are redefined in other files than {{ic|locale.conf}}, for example {{ic|~/.pam_environment}}. See [[Environment variables#Defining variables]] for details.
 +
 
 +
== See also ==
 +
 
 
* [http://www.gentoo.org/doc/en/guide-localization.xml Gentoo Linux Localization Guide]
 
* [http://www.gentoo.org/doc/en/guide-localization.xml Gentoo Linux Localization Guide]
 
* [http://www.gentoo-wiki.info/Locales Gentoo Wiki Archives: Locales]
 
* [http://www.gentoo-wiki.info/Locales Gentoo Wiki Archives: Locales]

Latest revision as of 12:07, 9 July 2016

Related articles

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

Before a locale can be enabled on the system, it has to be generated. The current generated/available locales can be viewed with:

$ locale -a

The locales that can be generated are listed in the /etc/locale.gen file: their names are defined using the format [language][_TERRITORY][.CODESET][@modifier]. To generate a locale, first uncomment the corresponding line in the file (or comment to remove); when doing this, also consider localizations needed by other users on the system and specific #Variables. For example, for American-English uncomment en_US.UTF-8 UTF-8.

/etc/locale.gen
...
#en_SG ISO-8859-1
en_US.UTF-8 UTF-8
#en_US ISO-8859-1
...

When done, save the file and generate the uncommented locale(s) by executing:

# locale-gen
Note:
  • locale-gen also runs with every update of glibc. [1]
  • UTF-8 is recommended over other options. [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 which must contain a new-line separated list of environment variable assignments having the same format as output by locale.

To list available locales that can be used which have been previously generated do:

$ localectl list-locales

Setting the system locale

To set the system locale use the localectl command, where en_US.UTF-8 is from the first column of an uncommented entry in /etc/locale.gen.

# localectl set-locale LANG=en_US.UTF-8
Note: localectl cannot be used to set the system locale in the installation chroot environment. /etc/locale.conf must be edited manually as follows.

Alternatively, manually edit or create /etc/locale.conf:

/etc/locale.conf
LANG=en_US.UTF-8

See #Variables, man 5 locale.conf and related 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
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

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:

Gnome-terminal or rxvt-unicode does not 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.

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.

See also