impostare LC_ * ma non LC_ALL


13

Vorrei avere una localizzazione tedesca (Austria) (formato carta A4, 24 ore, aaaa-mm-gg), ma un'interfaccia utente in lingua inglese (non mi piacciono le traduzioni scadenti). Ho pensato che il modo corretto per raggiungere questo obiettivo è impostare le LC_variabili come segue nel mio .bashrc(per favore correggimi se sbaglio):

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

Esiste un modo più elegante per impostare LC_ $ everythingelse anziché impostare ogni singolo valore? L'impostazione di LC_ALL non è un'opzione, poiché ha la precedenza su 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: è una macchina condivisa e non sono sudoer, quindi la modifica delle impostazioni a livello di sistema non è un'opzione.

Risposte:


15

Esistono tre set di impostazioni internazionali¹:

  • LANG, l'impostazione di fallback, se non è stato specificato un valore per una categoria. È previsto che gli utenti indichino la propria lingua in modo semplice.
  • LC_xxxper ogni categoria ( xxxpuò essere MESSAGES, TIMEe così via).
  • LC_ALLignora tutte le impostazioni. È un modo per le applicazioni di sovrascrivere tutte le impostazioni per funzionare in una locale nota (di solito C, la locale predefinita), in genere in modo che vari comandi producano output in un formato noto.

Quindi puoi impostare LANG=de_AT.UTF-8e LC_MESSAGES=C( Cè la locale predefinita e significa non tradotto; di en_USsolito è identico a Cper i messaggi).

Tuttavia, ci sono due categorie in cui non consiglio di cambiare l'impostazione predefinita, perché interrompe molti programmi:

  • LC_COLLATEè l' ordine di confronto dei personaggi . Non è molto utile perché indica solo come ordinare i caratteri, non come ordinare le stringhe. Gli strumenti che sanno come ordinare le stringhe non usano LC_COLLATE. Inoltre, molti strumenti si aspettano cose come " [a-z]corrisponde a tutte le 26 lettere minuscole ASCII e nessun altro carattere ASCII", ma ciò non è vero nella maggior parte delle versioni locali non predefinite (prova echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICindica come visualizzare i numeri. In particolare, in molte lingue, fa in modo che i numeri in virgola mobile utilizzino un punto ,anziché un .punto decimale. Ma la maggior parte dei programmi che analizzano i numeri si aspettano a .e trattano a ,come un separatore di campo.

Quindi consiglio di farlo

  • o esplicitamente LC_COLLATE=C LC_NUMERIC=_C,
  • o lasciare LANGnon impostato e impostare solo un valore per le categorie utili ( LC_MESSAGES, LC_TIME, LC_PAPER, più LC_CTYPE(il cui valore può variare a seconda del terminale)).

¹ Plus LANGUAGEcon GNU libc. Se non ne avessi sentito parlare, non ti perderai molto.


Grazie per la risposta dettagliata e le spiegazioni! Proverò un LC_NUMERIC localizzato, però, poiché il tastierino numerico sulle tastiere tedesche ha un ,posto di .(purtroppo), quindi inserire numeri con un punto è scomodo (e la maggior parte delle app sembra funzionare bene con un LC_NUMERIC non standard). Non capisco perfettamente il tuo esempio LC_COLLATE: sul mio sistema, l'esempio che hai fornito non corrisponde B.
Heinzi,


10

La localizzazione della pagina man (7) dice:

la locale predefinita [...] viene determinata mediante i seguenti passaggi:

  1. Se esiste una variabile d'ambiente non nulla LC_ALL, viene utilizzato il valore di LC_ALL.

  2. Se esiste una variabile di ambiente con lo stesso nome di una delle categorie [LC_ *] sopra e non è nulla, il suo valore viene utilizzato per quella categoria.

  3. Se è presente una variabile d'ambiente non nulla LANG, viene utilizzato il valore di LANG.

Quindi, puoi usare LANG come una sorta di analogo a bassa precedenza di LC_ALL: imposta il valore di LANG su de_ATe LC_MESSAGES su 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.