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").
Code language: PHP (php)
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
Code language: JavaScript (javascript)
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
Code language: JavaScript (javascript)
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"
Code language: JavaScript (javascript)
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
Code language: JavaScript (javascript)
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.
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.
Merci enfin c’est bon ;)
Génial !
Merci beaucoup pour le partage.
Merci. C’est utile !
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 :
Bonjour,
C’est une bonne solution en effet lorsque plusieurs utilisateurs ont un compte sur le serveur, je l’ajoute à l’article, merci.
Matt
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.
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:
Les différences se trouvent dans: