
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.gen
tiene varios ejemplos; todas las líneas UTF-8 tienen "algo.UTF-8" y locale-gen
se muestran en ejecución en_US.UTF-8... done
mientras se ejecuta, pero locale -a
se supone que muestra las configuraciones regionales disponibles en_US.utf8
. Probé varias combinaciones de ambos formatos en /etc/locale-gen
y 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=C
funcionó LC_ALL=en_US.UTF-8
(de hecho, la configuración LC_ALL
lo solucionó, la configuración LANG
no 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 setlocale
con LC_ALL
, obtienen una NULL
respuesta y generan un error, incluso cuando otras llamadas setlocale
devuelven una buena cadena.
Aquí está la parte superior ltrace
de 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 $LANG
o $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 -S
deberí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-8
funciona.
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.conf
hoy (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-gen
para 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.conf
que 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=