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

29

Estoy usando Arch Linux, y he seguido las instrucciones en la wiki sobre 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 ejecuta locale-genprogramas en_US.UTF-8... donemientras se está ejecutando, pero locale -a, que se supone que muestra los programas locales disponibles en_US.utf8. He intentado varias combinaciones de ambos formatos en /etc/locale-geny LOCALE=en /etc/rc.conf, pero nada ha solucionado el problema.

Información Adicional:

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

La sugerencia de Bruce Ediger de configurar LANG=Cy LC_ALL=en_US.UTF-8trabajar (de hecho, la configuración lo LC_ALLarregló, la configuración LANGno importó), pero me gustaría saber qué está sucediendo. Según SUS , LC_ALL anulará todas las demás variables LC_ * si está configurado y no es nulo. En mi sistema, está configurado, pero es nulo, por lo que debe ignorarse y, en su lugar, deben usarse otros valores. Eso no es lo que está pasando, parece que las aplicaciones están llamando setlocalecon LC_ALL, para conseguir una NULLvuelta, y generar un error, incluso cuando otras llamadas a setlocaledevuelven una cadena buena.

Aquí está la parte superior de una 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)  
Shawn J. Goff
fuente
puedes compartir la salida de locale -a?
njsg
Iba a punto que se debe utilizar .utf8en LOCALEy LC_*, pero al parecer .UTF-8trabaja aquí también ... En cuanto a es-ES: ¿Parece (y sin .utf8) en locale -a?
njsg
1
Hacer export LANG=Cy export LC_ALL=en_US.UTF-8ver qué pasa. Mi computadora portátil Arch Linux tiene LOCALE="en_US.UTF-8"/etc/rc.conf, y no puedo entender dónde establece mi computadora portátil LANG = C.
Bruce Ediger
¿Puedes publicar el contenido de tu /etc/locale.conf? Parece que escribiste accidentalmente LANG=en-US(con guión) en lugar de LANG=en_US(con guión bajo).
Mikel
Y el contenido de /etc/locale.gensería útil también.
Mikel

Respuestas:

18

Le falta un archivo que se usaría para predeterminar la configuración regional en ausencia de $LANGo $LC_ALL(o todos los más específicos $LC_whatever) configurados.

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

strace -e locale de 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
abierto ("/ 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 syscalls.

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

Parece que tiene los datos locales sin procesar instalados, ya que en_US.UTF-8 funciona.

Si es así, 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
Arkansas
fuente
sudo localedef -f UTF-8 -i en_US en_US.UTF-8funciona en Raspbian 2018-11-13 Lite.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
6

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

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

Stefan Majewsky
fuente
2

Seguir este enlace resuelve 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

Kokizzu
fuente
1

Tuve problemas similares recientemente, todos los nombres de archivo Unicode se mostraron incorrectamente, cuando eliminé accidentalmente 'LOCALE = en_US.utf8' en /etc/rc.conf. Así que revisé el script de arranque:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

Una solución simple es comprobar tanto DAEMON_LOCALEy LOCALEen /etc/rc.conf, asegúrese de que no era el primero noy el segundo no estaba vacía.

margarita
fuente
-1

¿Quizás una de sus configuraciones no es válida? Estas son mis configuraciones locales para 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=
dwurf
fuente