How to install/change locale on Debian?

Solution 1:

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.

Solution 2:

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.


Solution 3:

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

Solution 4:

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.


Solution 5:

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.