Solving Perl locale issues on my Raspberry Pi

17 July 2016

On my Raspberry Pi 3 I would get locale warnings when using Perl commands. This blog post explains the steps I took to fix these warnings.

For example, the colordiff command would give the following error:

perl: warning: Setting locale failed.
LANGUAGE = "en_US.UTF-8",
LC_ALL = "en_US.UTF-8",
LC_CTYPE = "en_CA.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").



To fix it, I first uncommented the locales I wanted in the /etc/locale.gen file.

sudo vi /etc/locale.gen


Uncommenting means removing the # mark at the start of a line. Any line that starts with a # is ignored, so removing the mark means the line will be read. Here I have uncommented the en_GB.UTF-8 and en_US.UTF-8 locales:

Next I ran the following two commands:

sudo dpkg-reconfigure locales

sudo locale-gen


This solved my issue and now Perl does not throw the warning! The output of the two commands are displayed in the screenshots below.

I was curious about the dpkg-reconfigure locales and locale-gen commands. The following is my summary from reading the man pages for those commands.

dpkg-reconfigure - The dpkg-reconfigure command reconfigures an already installed package: the locales package in this case. The debconf-show package_name command will display what is currently configured on a package. Running this command gave me the following result:

* locales/locales_to_be_generated: en_CA.UTF-8 UTF-8, en_GB.UTF-8 UTF-8, en_US.UTF-8 UTF-8
* locales/default_environment_locale: en_US.UTF-8


The above was the result after having already run the dpkg-reconfigure locales command. Running the dpkg-reconfigure locales command again would regenerate those locales.

locale-gen - From the man pages:

locale-gen is a program that reads the file /etc/locale.gen and invokes localedef for the chosen localisation profiles. Run locale-gen after you have modified the /etc/locale.gen file.

So, the localdef program is run for each locale I uncommented in the /etc/locale.gen file. The localdef program creates binary files used by the locale functions in the C library. These binary files contain information about how various locale attributes should be formatted.

References:

https://www.raspberrypi.org/forums/viewtopic.php?t=38231&p=553816

https://manpages.debian.org/cgi-bin/man.cgi?query=dpkg-reconfigure

https://manpages.debian.org/cgi-bin/man.cgi?query=locale-gen

http://man7.org/linux/man-pages/man1/localedef.1.html