establecer LC_ * pero no LC_ALL

13

Me gustaría tener una configuración regional alemana (Austria) (tamaño de papel A4, tiempo de 24 horas, aaaa-mm-dd), pero una interfaz de usuario en inglés (no me gustan las malas traducciones). Pensé que la forma correcta de lograr esto es establecer las LC_variables de la siguiente manera en mi .bashrc(corríjame si me equivoco):

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

¿Hay una manera más elegante de configurar LC_ $ everythingelse en lugar de establecer cada valor? Establecer LC_ALL no es una opción, ya que tiene prioridad sobre 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"

PD: es una máquina compartida y no soy sudoer, por lo que cambiar la configuración de todo el sistema no es una opción.

Heinzi
fuente

Respuestas:

15

Hay tres conjuntos de configuraciones regionales¹:

  • LANG, la configuración de reserva, si no ha especificado un valor para una categoría. Está diseñado para que los usuarios indiquen su configuración regional de una manera simple.
  • LC_xxxpara cada categoría ( xxxpuede ser MESSAGES, TIME, etc.).
  • LC_ALLanula todas las configuraciones. Es una forma en que las aplicaciones anulan todas las configuraciones para trabajar en una configuración regional conocida (generalmente C, la configuración regional predeterminada), por lo general para que varios comandos produzcan resultados en un formato conocido.

Por lo tanto, puede establecer LANG=de_AT.UTF-8y LC_MESSAGES=C( Ces la configuración regional predeterminada y significa no traducido; en_USgeneralmente es idéntico a Cpara mensajes).

Sin embargo, hay dos categorías en las que no recomiendo cambiar el valor predeterminado, ya que rompe muchos programas:

  • LC_COLLATEes el orden de clasificación de caracteres . No es muy útil porque solo indica cómo ordenar caracteres, no cómo ordenar cadenas. Las herramientas que saben cómo ordenar cadenas no usan LC_COLLATE. Además, muchas herramientas esperan cosas como " [a-z]coincide con las 26 letras minúsculas ASCII y ningún otro carácter ASCII", pero eso no es cierto en la mayoría de las configuraciones regionales no predeterminadas (intente echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICindica cómo mostrar números. En particular, en muchos idiomas, hace que los números de punto flotante utilizan una ,vez de .que el punto decimal. Pero la mayoría de los programas que analizan números esperan a .y tratan a ,como un separador de campo.

Por eso recomiendo

  • ya sea explícitamente LC_COLLATE=C LC_NUMERIC=_C,
  • o salir LANGdesarmado y sólo establecer un valor para las categorías útiles ( LC_MESSAGES, LC_TIME, LC_PAPER, además de LC_CTYPE(cuyo valor puede variar dependiendo de la terminal)).

¹ Plus LANGUAGEcon GNU libc. Si no te habías enterado, no te estás perdiendo mucho.

Gilles 'SO- deja de ser malvado'
fuente
Gracias por la respuesta detallada y las explicaciones! Sin embargo, intentaré un LC_NUMERIC localizado, ya que el teclado numérico en los teclados alemanes tiene un ,lugar .(desafortunadamente), por lo que ingresar números con un punto es inconveniente (y la mayoría de las aplicaciones parecen funcionar bien con un LC_NUMERIC no estándar). No entiendo completamente su ejemplo LC_COLLATE: en mi sistema, el ejemplo que dio no coincide B.
Heinzi 01 de
@Heinzi ¿
Gilles 'SO- deja de ser malvado'
10

La configuración regional de la página man (7) dice:

la configuración regional [...] predeterminada se determina mediante los siguientes pasos:

  1. Si hay una variable de entorno no nula LC_ALL, se utiliza el valor de LC_ALL.

  2. Si existe una variable de entorno con el mismo nombre que una de las categorías [LC_ *] anteriores y no es nula, su valor se utiliza para esa categoría.

  3. Si hay una variable de entorno no nula LANG, se utiliza el valor de LANG.

Por lo tanto, puede usar LANG como una especie de análogo de baja prioridad de LC_ALL: establezca el valor de LANG en de_ATy LC_MESSAGES en 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
fuente