Perché quasi tutti i programmi si lamentano della mia lingua?


29

Sto usando Arch Linux e ho seguito le indicazioni sul wiki sull'impostazione della mia locale.

Quasi tutti i programmi che eseguono si lamentano delle impostazioni locali, anche locale. Sembra così:

% 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")

Qualcosa di leggermente confuso è che /etc/locale.genha diversi esempi; tutte le linee UTF-8 hanno "qualcosa.UTF-8", e locale-genspettacoli in esecuzione en_US.UTF-8... donementre è in esecuzione, ma locale -a, che dovrebbe mostrare gli spettacoli locali disponibili en_US.utf8. Ho provato varie combinazioni di entrambi i formati in /etc/locale-gene LOCALE=in /etc/rc.conf, ma nulla ha risolto il problema.

Informazioni aggiuntive:

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

Il suggerimento di Bruce Ediger di ambientare LANG=Ce LC_ALL=en_US.UTF-8lavorare (in effetti, ambientarlo LC_ALLrisolto, ambientare LANGnon aveva importanza), ma mi piacerebbe sapere cosa sta succedendo. Secondo SUS , LC_ALL sovrascriverà tutte le altre variabili LC_ * se è impostata e non è nulla. Nel mio sistema, è impostato, ma è nullo, quindi dovrebbe essere ignorato e dovrebbero essere usati altri valori. Non è quello che sta succedendo, sembra che le applicazioni stanno chiamando setlocalecon LC_ALL, ottenendo uno NULLschiena, e la generazione di un errore, anche quando altre chiamate a setlocalerestituire una stringa buona.

Ecco la parte superiore di un ltracedi locale(scorrere verso destra per vedere i valori di ritorno della funzione)

% 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)  

puoi condividere l'output di locale -a?
njsg,

Stavo per indicare che dovresti usare .utf8in LOCALEe LC_*, ma a quanto pare .UTF-8funziona anche qui ... Per quanto riguarda en-US: appare (senza .utf8) in locale -a?
njsg,

1
Fai export LANG=Ce export LC_ALL=en_US.UTF-8vedi cosa succede. Il mio laptop Arch Linux ha LOCALE="en_US.UTF-8"in /etc/rc.conf e non riesco a capire dove il mio laptop imposta LANG = C.
Bruce Ediger,

Puoi pubblicare i tuoi contenuti /etc/locale.conf? Sembra che tu abbia scritto accidentalmente LANG=en-US(con trattino) anziché LANG=en_US(con trattino basso).
Mikel,

E anche il contenuto di /etc/locale.gensarebbe utile.
Mikel,

Risposte:


18

Ti manca un file che sarebbe stato utilizzato di default il locale in assenza di $LANGo $LC_ALL(o tutta la più specifica $LC_whatever) essendo set.

Su glibc più vecchi, è / usr / lib / locale / locale-archive. Poiché GNU / Linux è caotico, dovresti usare strace per determinare quali file sono previsti nelle particolari versioni in uso sul tuo computer:

strace -e locale del file
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (nessun file o directory)
open ("/ etc / ld.so.cache", O_RDONLY) = 3
open ("/ lib / libc.so.6", O_RDONLY) = 3
open ("/ usr / lib / locale / locale-archive", O_RDONLY | O_LARGEFILE) = 3

---------------------- Commenti aggiunti 1 giorno dopo:

"ltrace -S" dovrebbe essere a posto, dato che mostra syscalls.

Altrimenti, "ltrace" non è molto utile (vale a dire controproducente rispetto a strace), perché mostra solo le chiamate più in alto. Questi sono ovvi (setlocale (3)), mentre il vero problema si presenta all'interno di libc.

Sembra che si hanno le prime dati locali installati, dal momento che en_US.UTF-8 opere.

In tal caso, qualcosa del genere dovrebbe risolvere il tuo problema, impostando un valore predefinito a livello di sistema:

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

sudo localedef -f UTF-8 -i en_US en_US.UTF-8funziona su Raspbian 13/11/2018 Lite.
Ciro Santilli 25 改造 中心 法轮功 六四 事件

6

Ho avuto lo stesso problema dopo la configurazione di /etc/locale.confoggi (relativa alle recenti modifiche a /etc/rc.conf. Nel mio caso, si è scoperto che le impostazioni locali non erano installate.

Controllare /etc/locale.gen. Tutte le impostazioni locali a cui fanno riferimento le variabili di ambiente devono essere attivate (ovvero non commentate) all'interno. Dopo aver apportato le modifiche, eseguire sudo locale-genper installare le impostazioni locali selezionate.


2

Seguire questo link risolve il mio problema:

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

genera un file /etc/locale.confche risolve questo problema


1

Di recente ho avuto problemi simili, tutti i nomi dei file unicode sono stati visualizzati in modo errato, quando ho rimosso accidentalmente 'LOCALE = en_US.utf8' in /etc/rc.conf. Quindi ho controllato lo script di avvio:

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

La soluzione semplice è controllare sia DAEMON_LOCALEe LOCALEdentro /etc/rc.conf, assicurarsi che il primo non lo fosse noe il secondo non fosse vuoto.


-1

Forse una delle tue impostazioni non è valida? Queste sono le mie impostazioni locali per riferimento; non causano errori (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=
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.