La bonne langue

Niveau : Star Star Empty Empty Empty
Résumé :

La gestion des langues sur les unix c'est pas le paradis. Il est possible de configurer finement les choses, mais ce n'est pas des plus adapté.

Terminal

Prenons le cas d'un terminal. La gestion doit se faire en plusieurs endroits. Tout d'abord le terminal virtuel est lui-même un processus (sauf la console linux qui se configure différemment) qui peut avoir des langues différentes. Il doit en plus être configuré pour communiquer avec la même langue que le processus qu'il fait tourner. En effet cette communication n'inclut pas explicitement la langue, il faut donc qu'elle soit définie implicitement de la même façon de chaque côté.

En supposant que le terminal soit déjà lancé avec une langue donnée (disons le français). Celui-ci vous propose encore à travers son menu (mais chaque terminal est spécifique) de configurer la façon dont il communique avec le client (bash le plus souvent).
Cette configuration gère deux choses simultanément : le format des codes de caractère venant du clavier et envoyés à l'application et le format des caractères envoyés par l'application au terminal et qui seront affichés.

L'application lancée à travers ce terminal doit parler la même langue que celui-ci (à moins qu'elle ne soit graphique auquel cas on se fout de la configuration du terminal). Les applications sont configurées au travers des variables d'environnement LANG et LC_* (ce qui explique qu'à part bash, les application supportent rarement le changement de langue en cours de route. Cela explique aussi que tous les processus fils d'une application tournent avec la même localisation (gnome et les applications graphiques par exemple).

Variables

Ces variables configurent l'entrée et la sortie des applications lancées :

  • LANG définit d'un coup la langue, l'encodage et le pays utilisés par l'application c'est une valeur par défaut qui peut être surchargées par les variables suivantes.
  • LC_* sont des variables permettant de redéfinir plus finement les valeurs de LANG. Par exemple on peut choisir une langue française mais afficher les nombre avec des points à la place des virgules. Les valeurs de * sont CTYPE, NUMERIC, TIME, COLLATE, MONETARY et MESSAGES. Chacune de ces variables correspond en réalité à une fonction de la libc.
  • LC_ALL est une variable qui surcharge tous les autres LC_* d'un coup, les mettant à la même valeur.
  • LANGUAGE est une variable qui ne définit QUE la langue utilisée pour les messages (la partie codage ne sert pas), mais permet d'en spécifier plusieurs par ordre de préférence (séparées par des ':' ).

Ces variables définissent de nombreuses choses sur la base d'un pays et de sa langue. Au format <langue>_<Pays>.<codage>@<variante>

Ainsi fr_FR définit l'utilisation du français de France et donc de toutes les conventions qui vont avec et le codage et la variante par défaut.

Et fr_FR.iso-8859-15@euro définit l'utilisation du français de France avec un encodage iso et la variante euro.

A chacune de ces valeurs correspond une façon d'écrire les nombres (10.5 ou 10,5), la date (22 juin ou jun 22), les caractères (iso ou utf8) ...

Une valeur par défaut nommée C ou POSIX existe et est toujours disponible. Elle permet de formater la communication de façon standard unix (standard US quoi) :

Pour savoir quelle locale vous utilisez en ce moment :

$ locale

L'ordre de priorité est le suivant, seule la dernière valeur est prise en compte :

  • LANG
  • LC_<selon contexte>
  • LC_ALL
  • LANGUAGE (pour les messages uniquement, attention, il arrive qu'elle ne soit pas prise en compte)

Subtilités

LC_*

Explication des différentes valeurs des variables LC standard posix (exemples entres parenthèses)

  • LC_CTYPE : encodage (utf8) et manipulation (majusculisation) des caractères
  • LC_NUMERIC : format des nombres (espace tous les 3 chiffres)
  • LC_TIME : date et heure (jour/mois/an)
  • LC_COLLATE : définition de l'ordre lexicographique, par exemple pour le tri avec ls
  • LC_MONETARY : format des valeurs monétaires (€ avec 2 chiffres après la virgule)
  • LC_MESSAGES : traduction des messages (manuel en français)

Les extensions non posix, sont-elles vraiment utilisée ?

  • LC_PAPER : dimension des feuilles de papier pour l'impression (21x29.7)
  • LC_NAME : format du nom complet d'une personne (prénom puis nom)
  • LC_ADDRESS : format d'écriture d'une adresse postale
  • LC_TELEPHONE : format d'écriture du numéro de téléphone
  • LC_MEASUREMENT : format d'écriture des unités de mesure
  • LC_IDENTIFICATION : cette variable est purement informative et permet de récupérer des informations à propos de la définition des locales correspondantes comme l'auteur ou la liste des variables prises en compte

Qui fait quoi ?

LANG est généralement modifié globalement par l'administrateur système dans /etc/default/locale ou /etc/environment . C'est une sorte de valeur par défaut, parfois surchargée dans le .bashrc

Les LC_* et LANGUAGE ne devraient être modifiées que par l'utilisateur désireux de personnaliser sont environnement.

LC_ALL ne devrait être modifié que temporairement par une application qui voudrait garantir un certain fonctionnement des méthodes qu'elle utilise.

Bien sûr, il y a toujours des exceptions.

SSH

Il est préférable de configurer ssh de façon à laisser passer les variables de langage pour que l'utilisateur se sente chez lui partout.

Définition

Les locales sont définies dans des fichiers se situant dans /usr/share/i18n/locales/ sur debian. C'est ici qu'on définit par exemple qu'en France on utilise la virgule comme séparateur de décimales. C'est ici que vous pouvez ajouter une locale Kilgon si cela vous tient à coeur. Et si vous modifiez une locale, appelez locale-gen cat une locale ça se compile ...

Attention, cela n'inclut pas la traduction des messages qui vont plutôt se trouver dans /usr/share/locale .

Gettext

Les logiciels utilisent majoritairement la méthode gettext pour fournir une version traduite. Celle-ci se base aussi sur les variables d'environnement lorsque le programme est bien fait.

Fichiers

Attention : changer la locale de votre shell impacte vos noms de fichier. En effet, les commandes de manipulation de fichier ne font aucune manipulation de langue. Ce qui veut dire que si vous avec un terminal en ISO-8859-1 vous verrez les noms de fichier en iso, ce qui peut donner un affichage bizarre s'ils sont en réalité en UTF-8. Faites donc bien attention à synchroniser au mieux vos usages des locales pour éviter des soucis.

En cas de besoin utilisez un outil comme convmv pour convertir votre système de fichier à une norme différente.

Vus : 250
Publié par Peck : 100