définir LC_ * mais pas LC_ALL

13

J'aimerais avoir une langue allemande (Autriche) (format papier A4, 24 heures, aaaa-mm-jj), mais une interface utilisateur en anglais (je n'aime pas les mauvaises traductions). J'ai pensé que la bonne façon d'y parvenir est de définir les LC_variables comme suit dans mon .bashrc(veuillez me corriger si je me trompe):

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

Existe-t-il un moyen plus élégant de définir LC_ $ everythingelse plutôt que de définir chaque valeur individuelle? La définition de LC_ALL n'est pas une option, car elle a priorité sur LC_MESSAGES:

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS: C'est une machine partagée et je ne suis pas sudoer, donc changer les paramètres à l'échelle du système n'est pas une option.

Heinzi
la source

Réponses:

15

Il existe trois ensembles de paramètres régionaux¹:

  • LANG, le paramètre de secours, si vous n'avez pas spécifié de valeur pour une catégorie. Il est recommandé aux utilisateurs d'indiquer leurs paramètres régionaux de manière simple.
  • LC_xxxpour chaque catégorie ( xxxpeut être MESSAGES, TIMEetc.).
  • LC_ALLremplace tous les paramètres. C'est un moyen pour les applications de remplacer tous les paramètres afin de fonctionner dans un environnement local connu (généralement C, l'environnement local par défaut), généralement afin que diverses commandes produisent une sortie dans un format connu.

Vous pouvez donc définir LANG=de_AT.UTF-8et LC_MESSAGES=C( Cest le paramètre régional par défaut et signifie non traduit; en_USest généralement identique à Cpour les messages).

Cependant, il y a deux catégories où je ne recommande pas de changer la valeur par défaut, car cela casse beaucoup de programmes:

  • LC_COLLATEest l' ordre de classement des caractères . Ce n'est pas très utile car il indique uniquement comment trier les caractères, pas comment trier les chaînes. Les outils qui savent trier les chaînes n'utilisent pas LC_COLLATE. De plus, de nombreux outils s'attendent à des choses comme « [a-z]correspond aux 26 lettres minuscules ASCII et à aucun autre caractère ASCII», mais ce n'est pas vrai dans la plupart des paramètres régionaux non définis par défaut (essayez echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICindique comment afficher les nombres. En particulier, dans de nombreuses langues, les nombres à virgule flottante utilisent a ,plutôt que .comme point décimal. Mais la plupart des programmes qui analysent les nombres attendent a .et traitent a ,comme un séparateur de champ.

Je recommande donc de

  • soit explicitement LC_COLLATE=C LC_NUMERIC=_C,
  • ou laisser LANGunset et seulement définir une valeur pour les catégories utiles ( LC_MESSAGES, LC_TIME, LC_PAPER, plus LC_CTYPE(dont la valeur peut varier en fonction de votre terminal)).

¹ Plus LANGUAGEavec GNU libc. Si vous n'en aviez pas entendu parler, vous ne manquez pas grand chose.

Gilles 'SO- arrête d'être méchant'
la source
Merci pour la réponse détaillée et les explications! Je vais essayer une LC_NUMERIC localisée, bien que, depuis le numpad sur les claviers allemands a la ,place d'un .(malheureusement), de sorte que la saisie des numéros avec un point est peu pratique (et la plupart des applications semblent fonctionner bien avec un LC_NUMERIC non standard). Je ne comprends pas bien votre exemple LC_COLLATE: sur mon système, l'exemple que vous avez donné ne correspond pasB .
Heinzi
@Heinzi Est-
Gilles 'SO- arrête d'être méchant'
10

La locale de la page de manuel (7) dit:

les paramètres régionaux par défaut [...] sont déterminés en suivant les étapes suivantes:

  1. S'il existe une variable d'environnement non nulle LC_ALL, la valeur de LC_ALL est utilisée.

  2. Si une variable d'environnement portant le même nom que l'une des catégories [LC_ *] ci-dessus existe et n'est pas nulle, sa valeur est utilisée pour cette catégorie.

  3. S'il existe une variable d'environnement non nulle LANG, la valeur de LANG est utilisée.

Ainsi, vous pouvez utiliser LANG comme une sorte d'analogue de faible priorité de LC_ALL: définissez la valeur de LANG sur de_ATet LC_MESSAGES sur en_US:

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"
Riccardo Murri
la source