Dlaczego prawie każdy program narzeka na moje ustawienia regionalne?

29

Korzystam z Arch Linux i postępowałem zgodnie ze wskazówkami na wiki dotyczącymi ustawiania lokalizacji.

Niemal każdy uruchomiony program narzeka na ustawienia regionalne - nawet locale. To wygląda tak:

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

lub:

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

Coś nieco mylącego jest to, że /etc/locale.genma kilka przykładów; wszystkie linie UTF-8 mają „coś.UTF-8”, a podczas locale-genpokazów są uruchomione pokazy en_US.UTF-8... done, ale locale -aktóre powinny pokazywać dostępne pokazy ustawień regionalnych en_US.utf8. Próbowałem różnych kombinacji w obu formatach /etc/locale-geni LOCALE=na /etc/rc.conf, ale nic nie naprawili problem.

Dodatkowe informacje:

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

Sugestia Bruce'a Edigera dotycząca ustawienia LANG=Ci LC_ALL=en_US.UTF-8pracy (w rzeczywistości ustawienie LC_ALLnaprawiło, ustawienie LANGnie miało znaczenia), ale chciałbym wiedzieć, co się dzieje. Według SUS , LC_ALL zastąpi wszystkie inne zmienne LC_ *, jeśli jest ustawione, a nie null. W moim systemie jest ustawione, ale ma wartość NULL, więc należy je zignorować i zamiast tego użyć innych wartości. To nie jest to, co się dzieje, wydaje się, że aplikacje są dzwoni setlocalez LC_ALL, coraz NULLplecy, i wygeneruje błąd, nawet gdy inne połączenia do setlocalepowrotu dobry ciąg.

Oto górnej części ltraceod locale(przewiń w prawo, aby zobaczyć wartości zwracanych funkcja)

% 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
źródło
czy możesz podzielić się wynikami locale -a?
njsg
Ja jechałem do punktu, który należy wykorzystać .utf8w LOCALEa LC_*, ale podobno .UTF-8działa tu też ... Co do en-US: nie wydaje się (bez .utf8) w locale -a?
njsg
1
Zrób export LANG=Ci export LC_ALL=en_US.UTF-8zobacz, co się stanie. Mój laptop z linuksem Arch ma LOCALE="en_US.UTF-8"plik /etc/rc.conf i nie mogę ustalić, gdzie mój laptop ustawia LANG = C.
Bruce Ediger,
Czy możesz opublikować zawartość swojego /etc/locale.conf? Wygląda na to, że przypadkowo napisałeś LANG=en-US(z myślnikiem) zamiast LANG=en_US(z podkreśleniem).
Mikel
Przydałaby się też zawartość /etc/locale.gen.
Mikel

Odpowiedzi:

18

Brakuje pliku, który zostałby użyty do domyślnego ustawienia narodowego przy braku $LANGlub $LC_ALL(lub wszystkich bardziej szczegółowych $LC_whatever) ustawionych.

Na starszym glibc jest to / usr / lib / locale / locale-archive. Ponieważ GNU / Linux jest chaotyczny, powinieneś użyć strace, aby określić, które pliki są oczekiwane w poszczególnych wersjach używanych na twoim komputerze:

Ustawienia regionalne pliku strace -e
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Brak takiego pliku lub katalogu)
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

---------------------- Komentarze dodane 1 dzień później:

„ltrace -S” powinno być w porządku, ponieważ pokazuje wywołania systemowe.

W przeciwnym razie „ltrace” nie jest zbyt pomocne (tzn. Przynosi efekt przeciwny do zamierzonego w porównaniu do strace), ponieważ pokazuje tylko najwyższe wywołania. Są to oczywiste (setlocale (3)), podczas gdy prawdziwy problem zdarza się w libc.

Wygląda na to, że masz zainstalowane surowe dane regionalne, ponieważ działa en_US.UTF-8.

Jeśli tak, to coś takiego powinno rozwiązać Twój problem, ustawiając systemowe ustawienie domyślne:

localedef -f UTF-8 -i en_US en_US.UTF-8
AR
źródło
sudo localedef -f UTF-8 -i en_US en_US.UTF-8działa na Raspbian 2018-11-13 Lite.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
6

Miałem ten sam problem po skonfigurowaniu /etc/locale.confdzisiaj (dotyczy ostatnich zmian w /etc/rc.conf. W moim przypadku okazało się, że ustawienia regionalne nie zostały zainstalowane.

Sprawdzić /etc/locale.gen. Wszystkie ustawienia narodowe, do których odwołują się zmienne środowiskowe, muszą być tam aktywowane (tzn. Nieskomentowane). Po wprowadzeniu zmian uruchom, sudo locale-genaby zainstalować wybrane ustawienia regionalne.

Stefan Majewsky
źródło
2

Poniższe łącze rozwiązuje mój problem:

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

generuje plik, /etc/locale.confktóry rozwiązuje ten problem

Kokizzu
źródło
1

Ostatnio miałem podobne problemy, wszystkie nazwy plików Unicode były niepoprawnie wyświetlane, gdy przypadkowo usunąłem plik „LOCALE = en_US.utf8” /etc/rc.conf. Więc sprawdziłem skrypt rozruchowy:

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

Prostym rozwiązaniem jest sprawdzić zarówno DAEMON_LOCALEi LOCALEna /etc/rc.confupewnij się, że nie był pierwszy noi drugi nie był pusty.

stokrotka
źródło
-1

Może jedno z Twoich ustawień jest nieprawidłowe? Oto moje ustawienia regionalne w celach informacyjnych; nie powodują żadnych błędów (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
źródło