¿Por qué casi todos los programas se quejan de mi ubicación?

¿Por qué casi todos los programas se quejan de mi ubicación?

Estoy usando Arch Linux y he seguido las instrucciones delwikisobre cómo configurar mi ubicación.

Casi todos los programas que se ejecutan se quejan de la configuración regional, incluso locale. Se parece a esto:

% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=

o:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

Algo un poco confuso es que /etc/locale.gentiene varios ejemplos; todas las líneas UTF-8 tienen "algo.UTF-8" y locale-gense muestran en ejecución en_US.UTF-8... donemientras se ejecuta, pero locale -ase supone que muestra las configuraciones regionales disponibles en_US.utf8. Probé varias combinaciones de ambos formatos en /etc/locale-geny LOCALE=en /etc/rc.conf, pero nada solucionó el problema.

Información adicional:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

La sugerencia de configuración de Bruce Ediger LANG=Cfuncionó LC_ALL=en_US.UTF-8(de hecho, la configuración LC_ALLlo solucionó, la configuración LANGno importó), pero me gustaría saber qué está pasando. De acuerdo aSUS, LC_ALL anulará todas las demás variables LC_* si está configurada y no es nula. En mi sistema, está configurado, pero es nulo, por lo que se debe ignorar y se deben usar otros valores en su lugar. Eso no es lo que está sucediendo, parece que las aplicaciones llaman setlocalecon LC_ALL, obtienen una NULLrespuesta y generan un error, incluso cuando otras llamadas setlocaledevuelven una buena cadena.

Aquí está la parte superior ltracede locale(desplácese hacia la derecha para ver los valores de retorno de la función)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  

Respuesta1

Le falta un archivo que se usaría para establecer la configuración regional predeterminada en ausencia de $LANGo $LC_ALL(otodode los más específicos $LC_whatever) que se están estableciendo.

En glibc más antiguo, es /usr/lib/locale/locale-archive. Debido a que GNU/Linux es caótico, debes usar strace para determinar qué archivos se esperan en las versiones particulares que se usan en tu máquina:

strace -e configuración regional del archivo
execve("/usr/bin/locale", ["locale"], [/* 36 vars */]) = 0
acceso("/etc/ld.so.preload", R_OK) = -1 ENOENT (No existe tal archivo o directorio)
abierto("/etc/ld.so.cache", O_RDONLY) = 3
abierto("/lib/libc.so.6", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

----------------------Comentarios agregados 1 día después:

ltrace -Sdebería estar bien, ya que muestra llamadas al sistema.

De lo contrario, "ltrace" no es muy útil (es decir, es contraproducente frente a strace), porque sólo muestra las llamadas superiores. Esos son obvios ( setlocale(3)), mientras que el verdadero problema ocurre dentro de libc.

Parece que tienes elcrudodatos locales instalados, desde que en_US.UTF-8funciona.

Si es así, entonces algo como esto debería solucionar su problema, estableciendo un valor predeterminado para todo el sistema:

localedef -f UTF-8 -i en_US en_US.UTF-8

Respuesta2

Tuve el mismo problema después de la configuración /etc/locale.confhoy (en relación con los cambios recientes en /etc/rc.conf. En mi caso, resultó que las configuraciones regionales no estaban instaladas.

Controlar /etc/locale.gen. Todas las configuraciones regionales a las que hacen referencia las variables de entorno deben estar activadas (es decir, no comentadas) allí. Después de haber realizado los cambios, ejecute sudo locale-genpara instalar las configuraciones regionales seleccionadas.

Respuesta3

Siguiendo estoenlaceresuelve mi problema:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

genera un archivo /etc/locale.confque soluciona este problema

Respuesta4

¿Quizás una de tus configuraciones no es válida? Estas son mis configuraciones locales como referencia; no causan ningún error (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=

información relacionada