¿Cómo cambiar la variable de entorno local?

18

He generado archivos de localización en_US.utf8 , et_EE.iso88591 y ru_RU.utf8 . Ahora, si trato de cambiar cualquiera de las variables locales a ru_RU.utf8 o en_US.utf8 , entonces esto no tiene ningún efecto:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

Sin embargo, si cambio la variable LANG = , todas las demás variables, excepto LANGUAGE = y LC_ALL = toman el valor de la variable LANG = . ¿Hay alguna manera de modificar cada variable de configuración regional por separado? Además, ¿estoy en lo cierto de que las variables de configuración regional no son variables de shell normales, sino más bien parámetros para la utilidad de configuración regional ?

Martín
fuente

Respuestas:

15

Puede establecer cualquier categoría de configuración regional de forma independiente. LANGse aplica solo a las categorías que no están establecidas explícitamente.

LANGy LC_xxxson variables de entorno ordinarias. No son configuraciones para la localeutilidad: el localeprograma no está involucrado en ningún procesamiento local, es solo una pequeña utilidad para informar la configuración local actual y disponible.

Cuando escribe LC_TIME=ru_RU.utf8, esto no establece una variable de entorno, solo una variable de shell. Las variables de shell son internas al shell, no son vistas por otros programas. Las variables de entorno, por otro lado, son heredadas por los programas que inicia el shell. También necesita exportar la variable al entorno:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

o directamente

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles 'SO- deja de ser malvado'
fuente
"LANG y LC_xxx son variables de entorno ordinarias" ¿Cómo sabe eso LANGy LC_xxxson variables de entorno? mis pruebas muestran que solo LANGy LANGUAGEy LC_MESSAGESy LC_ALLson variables de entorno, mientras que otras variables como LC_CTYPEy LC_MONETARYno son variables de entorno (además, no son variables de shell)
rony_t
@rony_t Puede ver el código fuente de las aplicaciones y bibliotecas, ver su documentación o experimentar con ellas. Por ejemplo, compare env LC_TIME=en_GB datecon env LC_TIME=fr_FR datey env PATH="$PATH" date(obviamente, elija las configuraciones regionales que existen en su sistema). Obviamente, cada variable puede o no establecerse en el entorno de un proceso dado. ¿Qué pruebas hiciste? ¿Estás seguro de que la aplicación que usaste se comporta de manera diferente según LC_CTYPE(bastante común) y LC_MONETARY(bastante raro)?
Gilles 'SO- deja de ser malvado'
En la terminal, ejecuté el printenvcomando para enumerar las variables de entorno de bash, y solo LANGy LANGUAGEy LC_MESSAGESy LC_ALLse enumeraron como variables de entorno. También ejecuté el comando set -o posixseguido del comando setpara obtener las variables de entorno y las variables de shell de bash, y solo LANGy LANGUAGEy LC_MESSAGESy LC_ALLse enumeraron. Esto significa que LANGy LANGUAGEy LC_MESSAGESy LC_ALLson variables de entorno y el resto de las variables locales no lo son, y tampoco son variables de shell.
rony_t
@rony_t No. Significa que usted ha configurado las variables de entorno LANG, LANGUAGE, LC_MESSAGESy LC_ALL. (O lo hiciste explícitamente o tu distribución o el administrador de tu sistema lo hicieron por ti). ¡Puedes establecer una variable de entorno con cualquier nombre (sintácticamente válido)! Pero algunos nombres son significativos para alguna aplicación, y algunos nombres no lo son. LC_MESSAGES, LC_CTYPE, LC_TIMEY así sucesivamente son utilizados por las aplicaciones que se preocupan por el idioma de los mensajes de error, la codificación de caracteres, el formato de hora, y así sucesivamente.
Gilles 'SO- deja de ser malvado'
@rony_t Por cierto, su configuración es muy extraña. La configuración de LC_ALLanula todas las demás configuraciones, por lo que el valor de las otras variables locales no importa. Normalmente solo se usa temporalmente para forzar a un programa a usar una configuración regional determinada, no tiene sentido tenerlo en su entorno normal.
Gilles 'SO- deja de ser malvado'
6

En las distribuciones basadas en Fedora / CentOS / RHEL, creo que puede cambiar la configuración regional a una de las configuraciones regionales que se muestran cuando ejecuta el locale -acomando en este archivo del sistema:

/etc/sysconfig/i18n

Por ejemplo en mi sistema Fedora 14:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

En GNOME puedes ejecutar la aplicación de ayuda:

system-config-language

Lo que muestra esta GUI:

             ss de lang.  gui

Creo que es ligeramente diferente para las distribuciones Debian / Ubuntu. Creo que es este archivo:

/etc/default/locale

Creo que son variables de entorno, pero no estoy del todo seguro de cómo las usan las aplicaciones, si es que lo hacen.

Referencias

slm
fuente
4

Al menos en RedHat 6, tenga en cuenta que si se establece LC_ALL, la configuración de otras variables de entorno LC_ * no tendrá ningún efecto, ya que LC_ALL tiene prioridad sobre todas las demás variables de entorno LC_ *.

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=
Kiwicmc
fuente
1

En los sistemas Debian, se puede ejecutar dpkg-reconfigure localespara configurar el idioma principal y hacer que otros estén disponibles; entonces se puede ejecutar update-localepara configurar la LANGUAGEvariable de entorno /etc/default/localepara tener idiomas de reserva.

lfd
fuente
2
dpkg-reconfigure locales, nolocale
lauriys