Чому майже кожна програма скаржиться на мою локальну мову?


29

Я використовую Arch Linux, і я слідував вказівкам на вікі про налаштування моєї локалі.

Практично кожна програма, яка працює, скаржиться на локальний рівень - навіть locale. Це виглядає приблизно так:

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

або:

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

Щось дещо заплутане - це /etc/locale.genкілька прикладів; у всіх рядках UTF-8 є "something.UTF-8", а також запущені locale-genшоу, en_US.UTF-8... doneпоки він працює, але це locale -a, як передбачається, показує доступні шоу локалів en_US.utf8. Я спробував різні комбінації обох форматів в /etc/locale-genі LOCALE=в /etc/rc.conf, але нічого не вирішило проблему.

Додаткова інформація:

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

Пропозиція Брюса Едігера налаштувати LANG=Cі LC_ALL=en_US.UTF-8спрацювала (насправді налаштування LC_ALLвиправлено, налаштування LANGне мали значення), але я хотів би знати, що відбувається. Відповідно до SUS , LC_ALL замінить усі інші змінні LC_ *, якщо він встановлений, а не нульовий. У моїй системі вона встановлена, але вона є нульовою, тому її слід ігнорувати, а замість неї використовувати інші значення. Це не те , що відбувається, здається , що додатки виклику setlocaleз LC_ALL, отримуючи NULLназад, і генерується помилка, навіть коли інші виклики setlocaleповертають хорошу рядок.

Ось верхівка ltraceз locale(прокрутки вправо , щоб побачити функції повертають значення)

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

Ви можете поділитися результатом locale -a?
njsg

Я хотів би зазначити, що ви повинні використовувати .utf8в LOCALEі LC_*, але, мабуть, .UTF-8працює і тут ... Щодо en-US: чи з'являється (без .utf8) в locale -a?
njsg

1
Зробіть export LANG=Cі export LC_ALL=en_US.UTF-8подивіться, що станеться. У мого ноутбука Arch linux є LOCALE="en_US.UTF-8"/etc/rc.conf, і я не можу зрозуміти, де мій ноутбук встановлює LANG = C.
Брюс Едігер

Чи можете ви розмістити вміст свого /etc/locale.conf? Схоже, ви випадково написали LANG=en-US(дефісом) замість LANG=en_US(з підкресленням).
Мікель

І вміст також /etc/locale.genбув би корисним.
Мікель

Відповіді:


18

Вам не вистачає файлу, який використовувався б за замовчуванням локалі за відсутності $LANGабо $LC_ALL(або всіх більш конкретних $LC_whatever), що встановлюються.

Для старих glibc це / usr / lib / locale / locale-archive. Оскільки GNU / Linux хаотичний, вам слід використовувати strace, щоб визначити, які файли очікуються в конкретних версіях, які використовуються на вашому комп'ютері:

strace -e локальний файл файлу
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
доступ ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (немає такого файлу чи каталогу)
відкрити ("/ etc / ld.so.cache", O_RDONLY) = 3
відкрити ("/ lib / libc.so.6", O_RDONLY) = 3
відкрити ("/ usr / lib / locale / locale-archive", O_RDONLY | O_LARGEFILE) = 3

---------------------- Коментарі додані через 1 день:

"ltrace -S" має бути добре, оскільки він показує системні дзвінки.

В іншому випадку "ltrace" не дуже корисний (тобто є контрпродуктивним проти strace), оскільки показує лише найвищі виклики. Це очевидно (setlocale (3)), тоді як реальна проблема відбувається в межах libc.

Це здається, що у вас встановлені необроблені дані локалів, оскільки en_US.UTF-8 працює.

Якщо так, то щось подібне повинно вирішити вашу проблему, встановивши загальносистемний за замовчуванням:

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

sudo localedef -f UTF-8 -i en_US en_US.UTF-8роботи над Raspbian 2018-11-13 Lite.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

6

У мене була така ж проблема після налаштування /etc/locale.confсаме сьогодні (стосовно останніх змін до /etc/rc.conf. У моєму випадку виявилося, що локалі не встановлені.

Перевірка /etc/locale.gen. Усі локалі, на які посилаються ваші змінні середовища, повинні бути активовані (тобто не коментовані) там. Після внесення змін запустіть, sudo locale-genщоб встановити вибрані локалі.


2

Після цього посилання вирішується моя проблема:

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

він створює файл, /etc/locale.confякий вирішує цю проблему


1

У мене були подібні проблеми останнім часом, усі імена файлів unicode були неправильно відображені, коли я випадково видалив 'LOCALE = en_US.utf8' у /etc/rc.conf. Тому я перевірив сценарій завантаження:

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

Просте рішення - це ввімкнути DAEMON_LOCALEі LOCALEвхід /etc/rc.conf, переконайтесь, що перший не був, noа другий не був порожнім.


-1

Можливо, одне з ваших налаштувань недійсне? Це мої параметри локалі для довідки; вони не викликають помилок (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=
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.