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.
perl: warning: Please check that your locale settings:
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