Почему почти каждая программа жалуется на мой язык?

Я использую 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 имеют «что- en_US.UTF-8... done -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_ *, если он установлен, а не null. В моей системе оно установлено, но оно равно null, поэтому его следует игнорировать, а вместо него следует использовать другие значения. Это не то, что происходит, кажется, что приложения вызывают 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) 

5 Solutions collect form web for “Почему почти каждая программа жалуется на мой язык?”

Вам не хватает файла, который будет использоваться для стандартного языкового стандарта при отсутствии $LANG или $LC_ALL (или всех более специфических $LC_whatever ).

В старшем glibc это / usr / lib / locale / locale-archive. Поскольку GNU / Linux хаотичен, вы должны использовать strace, чтобы определить, какие файлы ожидаются в конкретных версиях, используемых на вашем компьютере:

 strace -e file locale
 execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
 access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Нет такого файла или каталога)
 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

———————- Комментарии добавлены через 1 день:

«ltrace -S» должно быть в порядке, так как оно отображает системные вызовы.

В противном случае «ltrace» не очень помогает (т. Е. Контрпродуктивен по сравнению с strace), потому что он отображает только самые верхние вызовы. Это очевидно (setlocale (3)), тогда как реальная проблема происходит в libc.

Похоже, что у вас установлены исходные данные локали, поскольку работает en_US.UTF-8.

Если это так, то что-то вроде этого должно исправить вашу проблему, установив общесистемное значение по умолчанию:

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

У меня была такая же проблема после установки /etc/locale.conf только сегодня (в связи с недавними изменениями в /etc/rc.conf . В моем случае оказалось, что локали не установлены.

Проверьте /etc/locale.gen . Все локали, которые ссылка на переменные среды должна быть активирована (т. Е. Не закомментированы). После внесения изменений запустите sudo locale-gen чтобы установить выбранные локали.

Недавно у меня были подобные проблемы, все имена файлов 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 , убедитесь, что первый из них не был, а второй не был пустым.

После этой ссылки решает мою проблему:

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

он создает файл /etc/locale.conf который исправляет эту проблему

Возможно, одно из ваших настроек недействительно? Это мои настройки языка для справки; они не вызывают ошибок (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= 
  • языковой зависимый сценарий bash: как правильно обеспечить локаль?
  • Символы, отличные от ASCII, обрабатываются неправильно в командной строке
  • Почему нет «евроанглийского» языка?
  • Обновлен мой архивный linux-сервер, и теперь я получаю tmux: требуется локаль UTF-8 (LC_CTYPE), но имеет ANSI_X3.4-1968
  • Сделать yakuake вывод правильных символов
  • Как установить LANG в локали, несмотря на то, что он находится в / etc / default / locale в ubuntu для поддержки Unicode?
  • Могу ли я изменить выходной формат «последней» команды для отображения года?
  • Локальная компиляция не выполняется, поскольку поля не определены
  • Почему `ls` перечисляет следующие файлы в, казалось бы, разных порядках?
  • Почему следует использовать update-locale вместо прямого задания LANGUAGE?
  • Проблемы с языками и шрифтами в Linux Mint
  • Linux и Unix - лучшая ОС в мире.