Cambia lingua temporaneamente per i messaggi del terminale / avvisi / errori

18

I messaggi nel mio terminale sono visualizzati utilizzando la lingua russa per impostazione predefinita, che è il mio nativo.

Per un momento voglio che siano in inglese (ad esempio per incollare nei forum), quindi tornare alla lingua predefinita.

Come posso fare lo switch e tornare indietro usando bash?

    
posta takeshin 27.05.2012 - 09:37

2 risposte

18

Sono disponibili diverse variabili di ambiente per modificare le impostazioni della lingua. È possibile visualizzare le impostazioni locali correnti eseguendo il comando locale . Per cambiare tutte le impostazioni locali in inglese, usa LANG=C . Questo locale C è sempre disponibile senza installare language pack aggiuntivi. (Per cambiare temporaneamente le impostazioni locali non inglesi, vedi il messaggio @ mklement0 .)

Esempi:

Eseguendo un comando con le impostazioni della lingua predefinite e stampando le impostazioni locali correnti:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

Esegui l'override temporaneo della lingua per un programma e mostra che è veramente temporaneo:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

Modifica le impostazioni internazionali per tutti i comandi eseguiti nella shell corrente e includi nuovamente le bozze:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
    
risposta data Lekensteyn 27.05.2012 - 09:44
6

La risposta utile di Lekensteyn funziona alla grande se vuoi passare a US English su richiesta, come richiesto dall'OP, ma se desideri passare a una diversa lingua su richiesta , è necessario ulteriore lavoro.

Prima di iniziare, devi installare le tabelle dei messaggi con sudo apt-get install language-pack-<lang-tag> , dove <lang-tag> è una semplice lingua RTF 5646 subtag , ad esempio es per lo spagnolo.

Informazioni di base

GNU gettext utilità basate sul sistema danno la precedenza alla non standard LANGUAGE variabile d'ambiente [1]  su variabili dell'ambiente locale definite da POSIX LC_ALL , LC_MESSAGES e LANG (in quest'ordine).

Dato che LANGUAGE è impostato di default sui sistemi Ubuntu [2] , cioè su una sottostringa del valore LANG che riflette un semplice tag di linguaggio (ad esempio, es per lo spagnolo) o un tag della regione della lingua (ad esempio de_DE per la variante tedesca del tedesco), è necessario annullare o sovrascrivere LANGUAGE affinché i messaggi di una lingua diversa abbiano effetto. > [3]

Opzione 1: imposta LANGUAGE

Esempio : passa ai messaggi di spagnolo ( es ) ad-hoc:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Nota : è sufficiente un semplice tag di lingua come es , ma puoi aggiungere un identificatore di regione (ad es. es_AR per l'Argentina) e persino un suffisso charset (ad esempio es_AR.UTF-8 ).
Tuttavia, i messaggi localizzati possono esistere solo al livello lingua e il fallback consiste nell'utilizzare i messaggi che corrispondono alla parte lingua ( es , in questo caso).

Opzione 2: Annulla LANGUAGE e imposta LC_ALL

Questa soluzione alternativa non definisce prima LANGUAGE , quindi utilizza la variabile d'ambiente locale POSIX LC_ALL per impostare in modo implicito LC_MESSAGES [4] :

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Questa soluzione ha il vantaggio di impostare gli aspetti di localizzazione tutti nelle impostazioni internazionali specificate (come LC_TIME per i formati di data / ora) e con (implicitamente) l'impostazione LC_MESSAGES informa anche programmi -GNU della lingua desiderata.

Nota come LC_ALL richiede che il nome della locale esatto, completo , incluso il suffisso charset, sia efficace ( es_ES.UTF-8 ) (a differenza di LANGUAGE , per il quale è sufficiente un tag di lingua semplice ( come es )). Lo stesso vale per l'impostazione di LC_MESSSAGES e LANG . La specifica di un nome di locale non valido / non installato causa il fallback delle impostazioni locali POSIX e quindi l'inglese americano.

Note

[1] Le ragioni per le quali la risposta di Lekensteyn funziona anche senza disabilitando / sovrascrivendo LANGUAGE è una eccezione : se il valore (efficace) LC_MESSAGES (tipicamente impostato indirettamente tramite LANG o LC_ALL ) è o C o (suo sinonimo) POSIX , quel valore è rispettato, indipendentemente dal valore di LANGUAGE , se presente. Viceversa, se il valore (efficace) LC_MESSAGES è qualsiasi altra localizzazione specifica , LANGUAGE ha la precedenza.

[2] Questo vale per Ubuntu corretto , ma non necessariamente per altri sapori ; Lekensteyn afferma che Kubuntu fa non imposta LANGUAGE .
Probabilmente, LANGUAGE dovrebbe non essere impostato di default, dato che in sua assenza il valore LC_MESSAGES implicito dal valore LANG (che determina la locale corrente), viene rispettato.

[3] Puoi anche usare questo approccio per passare a [US] inglese assegnando LANGUAGE=C o LANGUAGE=POSIX (in alternativa a LANG=C / LANG=POSIX ), sebbene non sia chiaro se sia attivo riconosciuto o semplicemente un meccanismo fallback , dato che questi valori non iniziano con un tag lingua ; forse la scelta migliore sarebbe en_US .

[4] C'è un caso edge in cui questo approccio non funziona: il tentativo di richiamare un eseguibile con un percorso - relativo o assoluto - NON passa alla lingua specificata , mentre un mere nome file fa:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility fa non funziona (emette un messaggio nelle impostazioni locali correnti), mentre
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility fa (uscite un messaggio di errore in spagnolo).
Se qualcuno sa perché e se c'è una buona ragione per questo, fatecelo sapere.

    
risposta data mklement0 02.11.2016 - 03:10

Leggi altre domande sui tag