Welcome to Arkanis Development

Can't set locale error on Linux


Some time ago I've written about the virtual machine I got for my video streaming and archiving project events.mi. While the VM did really well during the last month´s some command displayed some strange error messages.

man for example:

man: can't set the locale; make sure $LC_* and $LANG are correct

Special characters like German umlauts were also not correctly displayed on the console. This didn't really was a problem until Subversion refused to operate because of a directory containing a special character.

The quick answer

The locale data is installed but the needed locale is not compiled into the locale archive. You can do this for the "de_DE.utf8" locale with the following command:

$ localedef -i de_DE -f UTF-8 de_DE

The long story

After a quick search I tried to reinstall or reconfigure the locales package but either helped to solve the issue. Since it's obvious that the error is related to locales I did some digging in the POSIX Locale spec. The LANG environment variable was set to "de_DE.utf8" so there was no problem with the settings. However listing the locales showed something strange:

$ locale -a
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_COLLATE to default locale: No such file or directory

The POSIX spec states that the C and POSIX locales are just placeholders for the default locale. However there is not a single "real" locale (e.g. "de_DE.utf8") in the list and therefore the default locales point nowhere. A quick test of the setlocale() function in a small C program also showed that it always returns NULL and therefore fails.

Now the question is, why are there no real locales installed? I stumbled across a forum post mentioning localedef as a solution to the problem and the man page of localedef shows the directories where the character maps (/usr/share/i18n/charmaps) and "raw" locales (/usr/share/i18n/locales) are stored in a Linux system. These directories contained many character maps and locales but the "compiled" locales in the locale archive (/usr/lib/locale/locale-archive) where simply missing. Therefore locale -a returned only the placeholder locales and setting the "de_DE.utf8" locale failed.

Now localedef is the utility that compiles the raw locales and character maps into the locale archive. So the only thing we have to do is compile the wanted locale:

$ localedef -i de_DE -f UTF-8 de_DE

Now the list of available locales looks like it is supposed to do:

$ locale -a

Now the necessary locales are in the locale archive and therefore all programs can use the setlocale() function again to set the locale to "de_DE.utf8". Directory and file names are also displayed properly and Subversion can handle special characters again.

I hope this detailed description of the error helps a few people solving similar problems. :)

One comment for this post

leave a new one

#1 by

Thank you very much! After trying long time your description helped finally! :)

Leave a new comment

Having thoughts on your mind about this stuff here? Want to tell me and the rest of the world your opinion? Write and post it right here. Be sure to check out the format help (focus the large text field) and give the preview button a try.

Format help

Please us the following stuff to spice up your comment.

An empty line starts a new paragraph. ---- print "---- lines start/end code" ---- * List items start with a * or -