Locale
| Fiche express | |
|---|---|
| Domaine | Internationalisation (i18n) — configuration linguistique du système |
| Commandes | locale, localectl, locale-gen, localedef
|
| Variables | LANG, LC_ALL, LC_*
|
| Fichiers | /etc/locale.conf ou /etc/default/locale (moderne) — /etc/sysconfig/i18n (legacy RHEL5/6)
|
La locale définit le comportement d'un système Linux vis-à-vis de la langue, du jeu de caractères, du format des dates, des nombres, des unités monétaires, du tri alphabétique, etc. Elle se configure via un ensemble de variables d'environnement (LANG, LC_ALL, LC_*) et se gère différemment selon que le système est piloté par systemd ou par les anciens mécanismes SysV/RHEL5-6.
Afficher la configuration actuelle
locale # affiche toutes les variables LC_* effectives + LANG/LC_ALL
locale -a # liste toutes les locales installées sur le système
localectl status # (systemd) résumé de la locale système + clavier + type de console
Variables LANG / LC_ALL / LC_*
Ces trois familles de variables interagissent selon un ordre de priorité précis :
LANG: la valeur par défaut, appliquée à toutes les catégories (langue, tri, formats de date/nombre, etc.) si rien de plus spécifique n'est défini.LC_ALL: un override total et prioritaire sur tout le reste — pratique pour forcer temporairement un comportement homogène (souvent utilisé dans les scripts), mais à éviter en configuration permanente car il écrase toute personnalisation fine.LC_*(LC_TIME,LC_NUMERIC,LC_MESSAGES,LC_COLLATE,LC_MONETARY...) : des overrides ciblés catégorie par catégorie, qui priment surLANGmais pas surLC_ALL.
Ordre de priorité résumé : LC_ALL > LC_* (catégorie concernée) > LANG.
export LANG=fr_FR.UTF-8 # défaut global pour tout le système
export LC_TIME=en_GB.UTF-8 # override ciblé : dates au format anglais malgré LANG=fr_FR
export LC_ALL=C # override total : ignore LANG et tous les LC_* ci-dessus
Mode neutre : LANG=C / LANG=C.UTF-8
LANG=C (ou son équivalent LANG=C.UTF-8 pour conserver un support UTF-8) désactive toute localisation : messages système en anglais, tri byte-à-byte, formats de nombre/date non localisés. C'est le mode recommandé pour les scripts, les tâches cron, ou tout traitement dont la sortie doit rester strictement identique et parsable quelle que soit la locale de l'utilisateur qui l'exécute :
LANG=C.UTF-8 ls -la # sortie garantie identique, indépendante de la locale interactive
LC_ALL=C sort fichier.txt # tri déterministe (byte-à-byte), pas de dépendance au jeu de règles LC_COLLATE local
Persistance
Systèmes modernes (systemd)
localectl list-locales # locales disponibles
localectl set-locale LANG=fr_FR.UTF-8 # définit la locale système et la persiste
localectl set-locale LANG=fr_FR.UTF-8 LC_TIME=en_GB.UTF-8 # plusieurs catégories à la fois
localectl écrit la configuration dans /etc/locale.conf. Sur les distributions Debian/Ubuntu, le fichier persistant équivalent est /etc/default/locale, généralement mis à jour via update-locale plutôt qu'édité à la main :
update-locale LANG=fr_FR.UTF-8
Legacy RHEL5/6 (sans systemd)
Sur ces systèmes, la persistance passe par /etc/sysconfig/i18n :
# /etc/sysconfig/i18n
LANG="fr_FR.UTF-8"
SUPPORTED="fr_FR.UTF-8:fr_FR:fr:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
⚠️ Ce fichier ne configure que la langue/locale — pour le clavier (disposition, mapping physique), c'est un mécanisme distinct (system-config-keyboard sur RHEL5/6, localectl set-keymap avec systemd) : une confusion fréquente consiste à croire que ces outils clavier changent aussi la locale, ce qui n'est pas le cas.
Générer des locales manquantes
Si locale -a ne fait pas apparaître la locale souhaitée, elle doit d'abord être générée à partir des définitions sources du système :
# Debian/Ubuntu : activer la locale dans /etc/locale.gen puis générer
sed -i 's/^# *\(fr_FR.UTF-8\)/\1/' /etc/locale.gen
locale-gen
# Générique (toutes distributions) : localedef directement, sans passer par locale.gen
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
Sur AIX
`locale`/`locale -a` se comportent à l'identique sur AIX. En revanche, il n'y a ni `systemd`
ni `localectl` : la persistance de la locale par défaut du système passe par la variable
`LANG` dans /etc/environment, effective aux prochaines ouvertures de session
(pas rétroactive sur les processus déjà démarrés) :
locale # locale active de la session, identique en logique à Linux
locale -a # locales installées sur le système
# /etc/environment (AIX)
LANG=fr_FR.ISO8859-1