Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am getting this message every time I do something like starting or stopping a service.

perl: warning: Setting locale failed.   
perl: warning: Please check that your locale settings:   
        LANGUAGE = "en_US:en",   
        LC_ALL = (unset),   
        LC_MESSAGES = "en_US.UTF-8",   
        LANG = "en_US.UTF-8"   
    are supported and installed on your system.   
perl: warning: Falling back to the standard locale ("C").   
locale: Cannot set LC_CTYPE to default locale: No such file or directory   
locale: Cannot set LC_MESSAGES to default locale: No such file or directory   
locale: Cannot set LC_ALL to default locale: No such file or directory   
(Reading database ... 21173 files and directories currently installed.)  
Removing bind9 ...  
 * Stopping domain name service... bind9                                        [ OK ]
Processing triggers for man-db ...   
locale: Cannot set LC_CTYPE to default locale: No such file or directory   
locale: Cannot set LC_MESSAGES to default locale: No such file or directory   
locale: Cannot set LC_ALL to default locale: No such file or directory   

How do I fix this error ?

share|improve this question
Related: How to set locale? – Lucio Nov 6 '14 at 18:10

17 Answers 17

up vote 267 down vote accepted

First run locale to list what locales currently defined for the current user account:

$ locale

Then generate the missing locale and reconfigure locales to take notice:

$ sudo locale-gen "en_US.UTF-8"
Generating locales...
  en_US.UTF-8... done
Generation complete.

$ sudo dpkg-reconfigure locales
Generating locales...
  en_US.UTF-8... up-to-date
Generation complete.

Now you will not see any errors anymore!

share|improve this answer
did not work for me – Umair Apr 24 '14 at 7:43
This has worked for me on a number of systems. Is there a way to avoid this issue on newly installed systems? – Brylie Christopher Oxley Jan 12 '15 at 17:34
@UmairAyub may be you have more than one unknow locale, try this: for y in $(locale | cut -d '=' -f 2| sort |uniq );do locale-gen $y; done It will generate a locale for each definition you have – Ivan Buttinoni Jun 27 '15 at 18:33
The locale in the locale-gen command should be in double quotes for this to work properly: $ sudo locale-gen "en_US.UTF-8" – Sheharyar Jun 28 '15 at 16:34
Worked for me on Debian 7, thanks buddy :) – Altaf Hussain Aug 26 '15 at 8:20

Nothing suggested above worked in my case (Ubuntu Server 12.04LTS). What finally helped was putting to the file /etc/environment:


For some reason it was missing. The outputs for locale and other commands appeared like the variables were properly defined. In other words don't take for granted all the basic stuff is declared where it should be declared.

share|improve this answer
Yes, none other worked except this one, perhaps due to updated version. But I rather prefer to put this in /etc/default/locale. – cmnajs Feb 22 '13 at 20:18
Updated /etc/default/locale and no more warnings. Thanks – ohho Feb 26 '13 at 7:00
Yep, the others didn't work for me. This one did. Here is the one-liner I used for unattended updating of this. sudo sh -c "echo 'LC_ALL=en_US.UTF-8\nLANG=en_US.UTF-8' >> /etc/environment" – dman Mar 22 '14 at 6:01
@user163207 your solution is incorrect because it appends (instead of overwriting), it's not the recommended file, and echo needs to be run with the interpretation of backslash escapes enabled. This is the same as yours but with the aforementioned fixed: sh -c "echo -e 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale" – glarrain Apr 9 '14 at 21:22
I am facing the same issue in my Ubuntu Cloud Image – Umair Apr 24 '14 at 16:03

They should disappear after issuing:

sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales 

dpkg-reconfigure reconfigures packages after they have already been installed. Pass it the names of a package or packages to reconfigure. It will ask configuration questions, much like when the package was first installed.

share|improve this answer
Thanks it works :) – HackToHell Jul 11 '12 at 14:21
I am glad my troubles a year ago helped you get this fixed ;) – Rinzwind Jul 11 '12 at 14:34
Shouldn't this locale be generated by default? I mean en, en_AU, en_CA, en_GB are present by default but not en_US? – Daniel Serodio Aug 15 '12 at 16:05
Ping! Your troubles are still useful. :-D – Mr. B Sep 27 '12 at 21:35
What does the dpkg-reconfigure locales command do in more detail? – Victor Nov 17 '12 at 3:38

Just add the following to your .bashrc file (assuming you're using bash)

export LC_ALL="en_US.UTF-8"
share|improve this answer
This sweet fix worked for me on my Amazon-EC2 image (Was running their default RHEL AMI) Thanks so much! :) – gideon Dec 1 '12 at 15:07
This one worked for me with my digitalocean's Ubuntu 12.04 image. – Inan Berbatov Sep 25 '13 at 11:49
this fixed my problem. I have to ask a question: how come the LC_ALL was not set by the locale-gen command as other answers said above this one ? – alexserver Sep 21 '15 at 18:35
Weird, all solution above didn't work for me but this one did! After exporting LC_ALL I could finally use sudo dpkg-reconfigure locales. – sobi3ch Nov 18 '15 at 11:56
finally after trying a lot of tricks , this is the working one for me on kubuntu 14.04.3 lts . thanks! – younes Jan 8 at 20:44

This is a common problem if you are connecting remotely, so the solution is to not forward your locale. Edit /etc/ssh/ssh_config and comment out SendEnv LANG LC_* line.

share|improve this answer
I was trying other answers, but forgot I was connecting remotely until I saw your answer. Different locales on the ssh server and client was causing the problem. – Hieu Feb 27 '15 at 6:32
On OSX (connecting to ubuntu) it's at /etc/ssh_config – Michiel de Mare Jun 3 '15 at 10:01
One-liner to do this: sed -e '/SendEnv/ s/^#*/#/' -i /etc/ssh/ssh_config (useful for server provisioning) – Albin Jun 16 '15 at 16:57

There is a command for that:

sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

It updates /etc/default/locale with provided values.

share|improve this answer
This is legit! Don't forget to sign out / reload your shell, or else you won't see the changes. Don't forget to check out the approved answer for generating and reconfiguring locales. – Erik Z Feb 8 at 10:28
Worked. thank you – Heihachi Jul 16 at 3:52

What worked for me on 12.10 was this:

apt-get install language-pack-en-base  

This was after dpkg-reconfigure locales produced no results.

share|improve this answer
This is the best answer. It's not that my locales were setup incorrectly, but they didn't actually exist. I think this is similar to the OP's problem as well ("No such file or directory" is pretty clear if your locale is set right!). – Breakthrough Oct 27 '13 at 21:49
I was getting the OPs issue ever time i was using apt-get on Ubuntu 12.04 This solved it perfectly without having to edit any files. – Deepend Jun 10 '14 at 10:13
"language-pack-en-base is already the newest version." – karlingen Aug 10 '15 at 7:51
Logout and Login may help – S.M.Mousavi Nov 16 '15 at 18:09
Worked for me in an ubuntu chroot under debian. Thanks :) – Wyatt8740 Feb 18 at 13:25

For Ubuntu 12.10 none of the above worked except for ratzs' solution. I recommend adding this to your /etc/bash.bashrc file:

export LC_ALL="en_ZA.UTF-8"
export LC_CTYPE="en_ZA.UTF-8"
share|improve this answer
Of all the solutions above. This is the only that worked for me. – JohnnyQ May 11 at 6:56

Don't forget exit your SSH session (or your X11) by exiting and logging back in again. All of these suggestions didn't work for me unless I logged back in....

share|improve this answer

You can try:

export LANGUAGE=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_NUMERIC=ru_RU.UTF-8
export LC_TIME=ru_RU.UTF-8
export LC_COLLATE=ru_RU.UTF-8
export LC_MONETARY=ru_RU.UTF-8
export LC_MESSAGES=ru_RU.UTF-8
export LC_PAPER=ru_RU.UTF-8
export LC_NAME=ru_RU.UTF-8
export LC_ADDRESS=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8

where ru_RU is your country code.

share|improve this answer

I wrote a bash script to fix above issue.The above answers are useful but setting the locale variables by simply exporting the values in shell variable will work only for a session. I permanently solved this issue by exporting the locale variables in .bash_profile file. You can also use /etc/profile file instead of .bash_profile.

echo "export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8">>~/.bash_profile

Don't forget to source the .bash_profile and follow the script in easy setup.

share|improve this answer
$ cat ~/.kde/env/ 
export LANG=en_US.UTF-8
export LANGUAGE=en_US:ru:en

if you run KDE check file

share|improve this answer
this saved my ass.... thank you! Unbelievable how many places this locale crap is being set in... and how in the world does KDE manage to screw things up by mixing my two different locales (is_IS for location, money, etc and en_EN for language into a non-existent is_EN locale)! Grmpfh. – StFS May 27 at 11:05

As said here in the Debian Wiki, you can edit /etc/locales.gen and add all locales (or uncomment them, I had a list of all locales but all except the one I used as comments) you wish to have support for on your system. Then, execute

sudo dpkg-reconfigure locales

to update the locales on your system. Now, all of the locales you added/uncommented in /etc/locales.gen are available on your system without any warnings.

share|improve this answer
  1. You may need to run sudo dpkg-reconfigure also for the application you have installed while "locale" settings have been invalid / not matching.

    While system locale was incorrectly setup I installed vim. Later when system locale was fixed I saw a situation that vim was showing utf-8 characters incorrectly as strange symbols while nano and less were showing them correctly. Running

    sudo dpkg-reconfigure vim

    appeared to fix the issue after the system settings were fixed.

  2. I also noticed the same thing as already mentioned: You may need to disconnect/reconnect SSH to make changes visible.

share|improve this answer

I was stuck in a weird state where my local machine is set to es and so the remote machine (via vagrant) had been provisioned in an un-handled state. Therefore, I had to use the manual export= only to facilitate a successful dpkg-reconfigure. Then the system is fine.

export LC_ALL="en_US.UTF-8"
sudo dpkg-reconfigure locales
share|improve this answer
it works for me. – realhu Apr 27 at 15:17

Current accepted answer is not sufficient in the troubleshoot strategy because you can have an human error. You setup your system to en_US but you have en_GB enabled in/etc/locale.gen like I had in the thread here for Raspberry Pi 3b. You should have all your used locales enabled in /etc/locale.gen.

I had en_GB.UTF-8 UTF-8 only enabled in /etc/locale.gen. I should have there only enabled en_US.UTF-8 UTF-8 because of other commands run for it. So I commended GB and uncommented US, and everything work now

masi@raspberrypi:~ $ sudo vim /etc/locale.gen

masi@raspberrypi:~ $ sudo locale-gen 
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.

masi@raspberrypi:~ $ sudo a2enmod rewrite && a2enmod headers && a2enmod ssl
Module rewrite already enabled
Module headers already enabled
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
Module ssl already enabled

Now, I do not get those locale mistakes with any commands.

System: Raspbian Jessie
Hardware: Raspberry Pi 3b

share|improve this answer

This worked for me when I had the same problem (solution provided by dman):

sudo sh -c "echo 'LC_ALL=en_US.UTF-8\nLANG=en_US.UTF-8' >> /etc/environment"
share|improve this answer
I wasn't quite sure how to add the url to the comment. @EliahKagan – pythonhunter Aug 27 '14 at 6:28
No problem--the date/timestamp next to a comment is what links to it directly. ...So, I've noticed glarrain's comment (calling for > instead of >>) seems like a reply to dman's. I don't actually know which way is right or best, but if you have any insight into this you could expand this answer with more information. (You don't have to though.) – Eliah Kagan Aug 27 '14 at 6:32

protected by Community Jan 1 '15 at 19:12

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.