Cambiar temporalmente el idioma para mensajes de terminal / advertencias / errores

22

Los mensajes en mi terminal se muestran usando el idioma ruso de forma predeterminada, que es mi idioma nativo.

Por un momento quiero que estén en inglés (p. Ej., Para pegar en foros), luego vuelva al idioma predeterminado.

¿Cómo puedo hacer el cambio y volver a usar bash?

tomashin
fuente

Respuestas:

23

Hay varias variables de entorno disponibles para cambiar la configuración del idioma. Puede ver su configuración regional actual ejecutando el localecomando. Para cambiar todas las configuraciones regionales a inglés, use LANG=C. Esta Cconfiguración regional siempre está disponible sin instalar paquetes de idiomas adicionales. (Para cambiar temporalmente a configuraciones regionales que no estén en inglés, consulte la publicación de @ mklement0 ).

Ejemplos:

Ejecutar un comando con la configuración de idioma predeterminada e imprimir la configuración regional actual:

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

Anule temporalmente el idioma de un programa y demuestre que es realmente temporal:

$ 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

Cambie la configuración regional para todos los comandos ejecutados en el shell actual e incluya pruebas nuevamente:

$ 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=
Lekensteyn
fuente
66
Para otros usuarios que tienen problemas para hacer que esto funcione, la configuración LANGo LANG_ALLno me funciona, todavía lo LANGUAGEes. Consulte ¿Por qué anular la variable de entorno LANG no cambia el idioma para mí?
gertvdijk
1
@gertvdijk: Gracias por eso; La razón por la que esta respuesta funciona incluso sin establecer LANGUAGEes una excepción : GNU gettext da prioridad al LANGUAGEvalor, excepto si el LC_MESSAGESvalor ( efectivo) (típicamente establecido indirectamente a través de LANGo LC_ALL) es uno Co (su sinónimo) POSIX. También señalan que LANGUAGEpasa a ser desactivada en esta respuesta, mientras que se establece de forma predeterminada, y si se establece, debe invalidar que para cambiar a una de entorno local específico lenguaje (en contraposición a "C" / "POSIX"), la cual es lo que encontraste
mklement0
Su respuesta funciona muy bien al cambiar a la configuración regional "C" (con mensajes en inglés de EE. UU., Como se requiere), pero no funcionará para otras configuraciones regionales a menos que LANGUAGEse anule o se anule explícitamente. Dado el título genérico de la pregunta, es probable que las personas encuentren esta respuesta buscando cambiar también a un idioma que no sea inglés, así que considere agregar esta información a su respuesta.
mklement0
@ mklement0 Dado el contexto de la pregunta (publicar mensajes de error en inglés), creo que la publicación actual es suficiente. Puede agregar otra respuesta para explicar los detalles LANGUAGEsi lo desea :)
Lekensteyn
Agregué mi propia respuesta , como usted sugirió. Si está de acuerdo con mi evaluación de que los futuros lectores pueden venir aquí buscando cambiar a cualquier idioma (como varias personas ya lo han indicado activamente), agregue un enlace a mi respuesta a su pregunta. Aparte de eso, sugiero cambiar el valor de LANGUAGEen su salida de muestra a nl, que es el valor predeterminado real cuando su configuración regional es nl_NL.UTF-8.
mklement0
9

La útil respuesta de Lekensteyn funciona muy bien si desea cambiar al inglés de EE. UU. A pedido, como lo solicitó el OP, pero si desea cambiar a un idioma diferente a pedido , se necesita más trabajo.

Antes de comenzar, debe instalar tablas de mensajes con sudo apt-get install language-pack-<lang-tag>, donde <lang-tag>hay una subetiqueta de idioma RTF 5646 simple , como espara español.

Información de fondo

GNU gettext servicios públicos basados dando prioridad a los no estándar LANGUAGEvariable de entorno [1] sobre las variables de entorno de configuración regional definidos POSIX LC_ALL, LC_MESSAGESy LANG(en ese orden).

Dado que LANGUAGEse establece de manera predeterminada en los sistemas Ubuntu [2] , es decir, en una subcadena del LANGvalor que refleja una etiqueta de idioma simple (por ejemplo, espara español) o una etiqueta de región de idioma (por ejemplo, de_DEpara la variante alemana de alemán), debe desarmar o anular LANGUAGEpara que los mensajes de un idioma diferente surtan efecto. [3]

Opción 1: establecer LANGUAGE

Ejemplo : cambiar a esmensajes en español ( ) ad-hoc:

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

Nota : Una etiqueta de idioma simple como eses suficiente, pero puede agregar un identificador de región (por ejemplo, es_ARpara Argentina) e incluso un sufijo de conjunto de caracteres (por ejemplo, es_AR.UTF-8).
Sin embargo, los mensajes localizados solo pueden existir a nivel de idioma , y la alternativa es usar mensajes que coincidan con la parte del idioma ( es, en este caso).

Opción 2: desarmar LANGUAGEy configurarLC_ALL

Esta solución alternativa no se define LANGUAGE primero y luego usa la variable de entorno local POSIX LC_ALLpara establecer implícitamente 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

Esta solución tiene la ventaja de configurar todos los aspectos de localización en la configuración regional especificada (como LC_TIMEpara los formatos de fecha / hora) y mediante la configuración (implícitamente) LC_MESSAGEStambién informa a los programas que no son GNU del idioma deseado.

Tenga en cuenta cómo se LC_ALLrequiere que el nombre de configuración regional exacto y completo , incluido el sufijo charset, sea efectivo ( es_ES.UTF-8) (a diferencia de LANGUAGE, para lo cual una etiqueta de idioma simple es suficiente (like es)). Lo mismo se aplica a la configuración LC_MESSSAGESy LANG. La especificación de un nombre de configuración regional no válido / no instalado provoca el retroceso a la configuración regional POSIX y, por lo tanto, al inglés de EE. UU.


Notas al pie

[1] Las razones por las que la respuesta de Lekensteyn funciona incluso sin desarmar / anular LANGUAGEes una excepción : si el LC_MESSAGESvalor (efectivo) indirecto (típicamente establecido vía LANGo LC_ALL) es uno Co (su sinónimo) POSIX, ese valor se respeta, independientemente del valor de LANGUAGE, Si alguna. Por el contrario, si el LC_MESSAGESvalor (efectivo) es cualquier otro lugar específico , LANGUAGEtiene prioridad.

[2] Esto se aplica a Ubuntu propiamente dicho , pero no necesariamente a otros sabores ; Lekensteyn afirma que Kubuntu no se establece LANGUAGE.
Podría decirse LANGUAGEque no debe establecerse de manera predeterminada, dado que, en su ausencia , se respeta el LC_MESSAGESvalor implícito por el LANGvalor (que determina el entorno local actual).

[3] También puede usar este enfoque para cambiar al inglés de [EE. UU.] Asignando uno LANGUAGE=Co LANGUAGE=POSIX(como alternativa a, LANG=C/ LANG=POSIX), aunque no estoy claro si eso se reconoce activamente o simplemente un mecanismo alternativo , dado que estos valores no no comience con una etiqueta de idioma ; Quizás la mejor opción sería en_US.

[4] Hay un borde caso en que este enfoque no funciona: intentar invocar un archivo ejecutable con un camino - ya sea relativa o absoluta - no se conecta con el idioma elegido, mientras que un mero nombre de archivo hace:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilityhace no trabajo (salidas de un mensaje en el entorno local actual), mientras que
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilitysí (genera un mensaje de error en español).
Si alguien sabe por qué y si hay una buena razón para esto, háganoslo saber.

mklement0
fuente
Punta del sombrero a @ wjandrea por su ayuda con la estructuración de esta publicación.
mklement0