Cambia temporaneamente la lingua per messaggi terminali / avvisi / errori


22

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

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

Come posso fare lo switch e tornare indietro usando bash?

Risposte:


23

Sono disponibili diverse variabili di ambiente per modificare le impostazioni della lingua. È possibile visualizzare le impostazioni internazionali correnti eseguendo il localecomando. Per modificare tutte le impostazioni locali in inglese, utilizzare LANG=C. Questa Clocale è sempre disponibile senza installare ulteriori language pack. (Per passare temporaneamente a versioni non inglesi, vedere il post di @ mklement0 .)

Esempi:

Esecuzione di un comando con le impostazioni della lingua predefinite e stampa le impostazioni internazionali 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=

Sostituisci temporaneamente la lingua per un programma e mostra che è davvero 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 di nuovo le prove:

$ 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=

6
Per altri utenti che hanno problemi a far funzionare tutto ciò, l'impostazione LANGo LANG_ALLnon funziona per me, lo LANGUAGEè ancora . Vedi Perché l'override della variabile d'ambiente LANG non sta cambiando la lingua per me?
gertvdijk,

1
@gertvdijk: grazie per quello; il motivo per cui questa risposta funziona anche senza impostazione LANGUAGEè un'eccezione : GNU gettext dà la precedenza al LANGUAGEvalore, tranne se il LC_MESSAGESvalore ( effettivo) (tipicamente impostato indirettamente tramite LANGo LC_ALL) è uno Co (il suo sinonimo) POSIX. Si noti inoltre che LANGUAGEsembra essere impostata in questa risposta, mentre è impostato di default, e se è impostata, è necessario eseguire l'override che per passare ad una di locale specifica lingua (in contrapposizione a "C" / "POSIX"), che è quello che hai trovato.
mklement0

La tua risposta funziona benissimo quando passi alla locale "C" (con messaggi in inglese americano, come requsted), ma non funzionerà per altre localizzazioni a meno che non LANGUAGEsia esplicitamente disinserita o ignorata. Dato il titolo generico della domanda, è probabile che le persone troveranno questa risposta cercando di passare anche a una lingua non inglese, quindi considera di aggiungere queste informazioni alla tua risposta.
mklement0

@ mklement0 Dato il contesto della domanda (pubblicazione di messaggi di errore in inglese), penso che il post corrente sia sufficiente. LANGUAGESe lo desideri, puoi aggiungere un'altra risposta per spiegare i dettagli :)
Lekensteyn,

Ho aggiunto la mia risposta , come mi hai suggerito. Se sei d'accordo con la mia valutazione sul fatto che i futuri lettori potrebbero venire qui cercando di passare a qualsiasi lingua (come diverse persone hanno già indicato attivamente), ti preghiamo di aggiungere un link alla mia risposta alla tua domanda. A parte questo, suggerisco di cambiare il valore di LANGUAGEnel tuo output di esempio in nl, che è il valore predefinito effettivo quando lo è la tua locale nl_NL.UTF-8.
mklement0

9

La risposta utile di Lekensteyn funziona benissimo se si desidera passare all'inglese americano su richiesta, come richiesto dall'OP, ma se si desidera passare a un'altra lingua su richiesta , è necessario ulteriore lavoro.

Prima di iniziare, è necessario installare le tabelle dei messaggi con sudo apt-get install language-pack-<lang-tag>, dove si <lang-tag>trova un semplice sottotag in lingua RTF 5646 , come esper lo spagnolo.

Informazioni sullo sfondo

GNU gettext utilità basati dare priorità alla non standard LANGUAGEvariabile ambiente [1] sopra variabili di ambiente POSIX-definiti LC_ALL, LC_MESSAGESe LANG(in questo ordine).

Dato che LANGUAGEè impostato di default sui sistemi Ubuntu [2] , vale a dire una sottostringa del LANGvalore che riflette un tag di lingua semplice (ad esempio, esper lo spagnolo) o un tag di lingua-regione (ad esempio, de_DEper la variante tedesca del tedesco), è necessario annullare l'impostazione o sovrascrivere LANGUAGEaffinché i messaggi di una lingua diversa abbiano effetto. [3]

Opzione 1: impostare LANGUAGE

Esempio : passa ai esmessaggi spagnoli ( ) ad hoc:

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

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

Opzione 2: disinserire LANGUAGEe impostareLC_ALL

Questa soluzione alternativa non-definisce LANGUAGE prima, e poi utilizza variabile ambiente locale POSIX LC_ALLper impostare implicitamente 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 tutti gli aspetti della localizzazione sulla locale specificata (come LC_TIMEper i formati di data / ora) e di (implicitamente) l'impostazione LC_MESSAGESinforma anche i programmi non- GNU della lingua desiderata.

Nota come LC_ALLrichiede che il nome esatto e completo della locale, incluso il suffisso del set di caratteri, sia efficace ( es_ES.UTF-8) (a differenza del LANGUAGEquale è sufficiente un semplice tag di lingua (come es)). Lo stesso vale per l'impostazione LC_MESSSAGESe LANG. La specifica di un nome di locale non valido / non installato provoca il fallback della locale POSIX e quindi dell'inglese americano.


Le note

[1] Le ragioni per cui la risposta di Lekensteyn funziona anche senza annullare / annullare LANGUAGEè un'eccezione : se il LC_MESSAGESvalore (effettivo) (tipicamente impostato indirettamente tramite LANGo LC_ALL) è uno Co (il suo sinonimo) POSIX, tale valore viene rispettato, indipendentemente dal valore di LANGUAGE, se presente. Viceversa, se il LC_MESSAGESvalore (effettivo) è qualsiasi altra, specifica locale, LANGUAGEha la precedenza.

[2] Questo vale per Ubuntu , ma non necessariamente per altre versioni ; Lekensteyn afferma che Kubuntu non si imposta LANGUAGE.
Probabilmente, nonLANGUAGE dovrebbe essere impostato di default, dato che in sua assenza il valore implicito dal valore (che determina la locale corrente), è rispettato. LC_MESSAGESLANG

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

[4] C'è un bordo caso in cui questo approccio non funziona: Il tentativo di richiamare un eseguibile con un percorso - sia relativo o assoluto - non passa per la lingua specificata, mentre un mero nome fa:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilitylo fa non il lavoro (le uscite di un messaggio nella locale corrente), mentre lo
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilityfa (genera un messaggio di errore spagnolo).
Se qualcuno sa perché e se c'è una buona ragione per questo, fatecelo sapere.


Punta del cappello a @ wjandrea per il suo aiuto nella strutturazione di questo post.
mklement0,
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.