How to install/change locale on Debian?
I've written a web application for which the user interface is in Dutch. I use the system's date and time routines to format date strings in the application. However, the date strings that the system formats are in English but I want them in Dutch, so I need to set the system's locale. How do I do that on Debian? I tried setting LC_ALL=nl_NL
but it doesn't seem to have any effect:
$ date
Sat Aug 15 14:31:31 UTC 2009
$ LC_ALL=nl_NL date
Sat Aug 15 14:31:36 UTC 2009
I remember that setting LC_ALL on my Ubuntu desktop system works fine. Do I need to install extra packages to make this work, or am I doing it entirely wrong?
Edit /etc/default/locale
and set the contents to:
LANG="nl_NL.UTF-8"
You can check which locales you currently have generated using:
locale -a
You can generate more by editing /etc/locale.gen
and uncommenting the lines for the locales that you want to enable. Then you can generate them by running the command:
locale-gen
You can find a list of supported locales in /usr/share/i18n/SUPPORTED
There is more information available on the Debian wiki.
You may need to install the locales
package. This will ask you which locales to generate. If it's already installed, then dpkg-reconfigure locales
will let you generate more locales.
Answers here are incomplete as with most elsewhere. After piecing together information from a few places, what worked for me was to (1) make sure the locale I wanted was available (generate it if it wasn't) then (2) set locale related environment variables to desired locale.
In my case I needed en_US.UTF-8
programmatically (i.e. non-interactively) installed in a docker container. The ff accomplished what I need but it should work just fine in an interactive shell.
apt-get update
# Install locales package
apt-get install -y locales
# Uncomment en_US.UTF-8 for inclusion in generation
sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen
# Generate locale
locale-gen
# Export env vars
echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
echo "export LANG=en_US.UTF-8" >> ~/.bashrc
echo "export LANGUAGE=en_US.UTF-8" >> ~/.bashrc
On the same shell, you will need to do source ~/.bashrc
for the env vars to take effect immediately. You can check that locale has been configured correctly by invoking locale
.
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
There were a lot of Q&A entries regarding this subject but only a few were actually helpful. Credit where credit is due:
- https://unix.stackexchange.com/a/247019/21289
- https://perlgeek.de/en/article/set-up-a-clean-utf8-environment
None of these answers worked for me, on an LXC container installed with:
lxc-create -n sse-master -t download -n sse-master -- \
-d debian -r jessie --arch i386
I always got the following output from locale-gen
, i.e. not generating any locales (none listed):
$ sudo locale-gen
Generating locales (this might take a while)...
Generation complete.
Running dpkg-reconfigure locales
and selecting some locales did not update /etc/locale.gen
as I expected it to.
However, when I modified that file manually and uncommented the locales that I wanted, then locale-gen
started working properly:
$ sudo locale-gen
Generating locales (this might take a while)...
en_GB.UTF-8... done
en_US.UTF-8... done
Generation complete.
I was also able to generate locales manually like this:
sudo localedef -i en_US -f UTF-8 en_US.UTF-8
sudo localedef -i en_GB -f UTF-8 en_GB.UTF-8
But this was not a permanent solution: I found that running locale-gen
without the --keep-existing
option will delete all such manually-generated locales, i.e. every locale not listed (and uncommented) in /etc/locale.gen
.
For a web application, it might be better to use setlocale() inside the program, rather than requiring that the system default locale be set appropriately outside. Less loose ends that way.