Linux : résoudre l’erreur “Cannot set LC_ALL to default locale”

Récemment, j’ai installé un serveur en Chine, derrière le Great Firewall of China (GFW) pour un des mes clients.

Le code n’a pas de frontières mais la langue peut parfois poser problème – même pour un système d’exploitation, au niveau de la locale.

Les locales sont un ensemble de paramètres qui définissent la langue de l’utilisateur, sa région et les préférences régionales que l’utilisateur souhaire voir dans son interface.

Typiquement, une locale est identifiée par un code langue suivi d’un identifiant de région. Nous avons par exemple “en_US.UTF-8” pour l’anglais américain (en pour l’anglais, US pour les USA) ou “fr_FR.UTF-8” pour le français de France.

Dans le cas de mon serveur chinois, qui tourne sous Debian, les paramètres de la locale n’étaient pas uniformément remplis avec le même code langue et certains paramètres étaient manquants.

On obtenait donc ces messages lors d’un apt update :

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "fr_FR.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

ou encore ces messages avec apt upgrade, après chaque installation ou mise à jour de paquets :

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

Pas de panique, j’ai quelques solutions pour régler le problème si vous aussi y êtes confronté.

Dans ce tutoriel, j’utilise “en_US.UTF-8” parce que j’aime tout avoir en anglais. Si vous préférez le français, remplacez tout par “fr_FR.UTF-8”.

Etape 1 : éditez le fichier locale

Editez votre fichier /etc/default/locale :

nano /etc/default/locale

et ajoutez ces lignes:

LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8

Enregistrez le fichier, quittez votre session SSH puis reconnectez-vous pour avoir une nouvelle session avec le changement de locale.

Etape 2 : reconfigurer les locales

On commence par générer la locale de notre choix :

locale-gen "en_US.UTF-8"

Et on la reconfigure :

dpkg-reconfigure locales

Il ne reste plus qu’à tester les locales du système:

locale

Résultat:

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

Et voilà, plus de messages d’avertissement ou d’erreur concernant les locales de votre système. Problème réglé.

Vous avez un projet WordPress ou WooCommerce en tête? Transformez votre vision en réalité avec mon expertise reconnue.

Parlons de votre projet dès aujourd'hui »

Articles conseillés :

8 pensées sur “Linux : résoudre l’erreur “Cannot set LC_ALL to default locale””

  1. Hello

    Merci pour l’info, la méthode 1 me retournais tjrs la même erreur avec un no such file or directory.
    La méthode 2 a bien corrigé mon prb.

    Reply
  2. Etape 1 : Je déconseille la modification du fichier .bashrc pour résoudre le problème car cela ne résolvera le problème que pour l’utilisateur courant. Le problème sera toujours présent pour les autres utilisateurs tel que ROOT !

    Il vaut mieux créer ou modifier le fichier : /etc/default/locale de sorte à ce qu’il contient les éléments ci-dessous suivant le besoin :

    LC_CTYPE=fr_FR.UTF-8
    LC_MESSAGES=fr_FR.UTF-8
    LC_ALL=fr_FR.UTF-8
    LANGUAGE=fr_FR.UTF-8
    LANG=fr_FR.UTF-8
    Reply
    • Bonjour,

      C’est une bonne solution en effet lorsque plusieurs utilisateurs ont un compte sur le serveur, je l’ajoute à l’article, merci.

      Matt

      Reply
  3. Bonjour tout d’abord merci pour le tuto.
    Je suis sur un VPS Gandi.net.
    Voici ma question, après l’étape 2, quand je test les locale du système, il renvoie :
    LANG=en_US.UTF-8
    LANGUAGE=en_US.UTF-8
    LC_CTYPE=”C.UTF-8″
    LC_NUMERIC=”C.UTF-8″
    LC_TIME=”C.UTF-8″
    LC_COLLATE=”C.UTF-8″
    LC_MONETARY=”C.UTF-8″
    LC_MESSAGES=”C.UTF-8″
    LC_PAPER=”C.UTF-8″
    LC_NAME=”C.UTF-8″
    LC_ADDRESS=”C.UTF-8″
    LC_TELEPHONE=”C.UTF-8″
    LC_MEASUREMENT=”C.UTF-8″
    LC_IDENTIFICATION=”C.UTF-8″
    LC_ALL=C.UTF-8

    Pourquoi C.UTF-8 et pas en_US.UTF-8 ?
    Merci d’avance.

    Reply
    • Bonjour,

      C.utf8 = représente la locale qui respecte le standard POSIX, avec un support étendu d’UTF-8. Me “C” signifie “computer”.

      Cela trie les caractères non ASCII strictement en fonction de leur valeur d’encodage de caractères Unicode. cela ne comprend pas que les majuscules et les minuscules – «A avec tréma» sont deux versions du même caractère et doivent être triées l’une à côté de l’autre.

      Pour tous les paramètres régionaux C. *, le symbole monétaire par défaut n’est pas défini -> POSIX utilise “$” par défaut.

      en_US.utf8 = la langue Anglais Americain UTF-8

      Elle “sait” quels caractères Unicode non ASCII sont des paires majuscules / minuscules et les trie ensemble, en majuscules immédiatement avant les minuscules. Il a également des ordres de tri par défaut définis pour divers alphabets non latins.

      Voici un script qui compare les différences:

      CATS="LC_CTYPE LC_COLLATE LC_MONETARY LC_NUMERIC LC_TIME LC_MESSAGES"
      echo "Doing C.utf8:"
      LANG=C.utf8 locale -k $CATS > C.utf8.out
      
      echo "Doing en_US.utf8:"
      LANG=en_US.utf8 locale -k $CATS > en_US.utf8.out
      
      echo "< C.utf8"
      echo "> en_US.utf8"
      diff C.utf8.out en_US.utf8.out

      Les différences se trouvent dans:

      int_curr_symbol
      currency_symbol
      mon_decimal_point
      mon_thousands_sep
      mon_grouping
      negative_sign
      int_frac_digits
      frac_digits
      p_cs_precedes
      p_sep_by_space
      n_cs_precedes
      n_sep_by_space
      p_sign_posn
      n_sign_posn
      crncystr
      thousands_sep
      grouping
      d_t_fmt
      d_fmt
      t_fmt
      yesexpr
      noexpr
      Reply

Opinions