Как удалить системных локалей, в отличие от пакета локалей, как было сказано в Как удалить ненужные локали ?
I'm недавно были получены следующие ошибки :
locale: Cannot set LC_ALL to default locale: No such file or directory
У меня есть en_US
локаль в моей системе:
$ grep en /var/lib/locales/supported.d/local
en_US ISO-8859-1
en_US.UTF-8 UTF-8
$ locale -a | grep en
en_US
en_US.iso88591
en_US.utf8
, но нет en
, как жаловался perl
:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "",
LC_ALL = (unset),
LC_MEASUREMENT = "en",
LC_PAPER = "en",
LC_MONETARY = "en",
LC_NAME = "en",
LC_ADDRESS = "en",
LC_NUMERIC = "en",
LC_TELEPHONE = "en",
LC_IDENTIFICATION = "en",
LC_TIME = "en",
LANG = "C"
Итак, я добавляю локаль en
с помощью:
% locale-gen en
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
Я не хочу ни одну из вышеуказанных локалей (только en_US
]), но теперь я не могу от них избавиться - я следовал инструкциям в https://serverfault.com/questions/394610/remove-a-locale-in-ubuntu
Но когда дело доходит до последнего шага, я все еще получаю:
% locale-gen
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
Как удалить все вышеперечисленные локали и оставить только en_US
?
Заключение & амп; Дополнение
Благодаря ответу Гуннара, это действительно вызвано записями в /etc/locale.gen
для этих дополнительных локалей. Просто FTR, это то, что locale-gen en
изменилось в /etc/locale.gen
:
$ sed '/^#/d; /en/p;' /etc/locale.gen
en_AG UTF-8
en_AG UTF-8
en_AU.UTF-8 UTF-8
en_AU.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IL UTF-8
en_IL UTF-8
en_IN UTF-8
en_IN UTF-8
en_NG UTF-8
en_NG UTF-8
en_NZ.UTF-8 UTF-8
en_NZ.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZM UTF-8
en_ZM UTF-8
en_ZW.UTF-8 UTF-8
en_ZW.UTF-8 UTF-8
Для сравнения, вот как выглядит значение по умолчанию (то есть без каких-либо из перечисленных выше дополнительных локалей):
$ sed '/^#/d;' /etc/locale.gen; echo ---
---
Вы должны отредактировать /etc/locale.gen
и прокомментировать локали, которые вам не нужны. Затем запустите
sudo locale-gen
Не существует ни одной локали с именем en
. Вероятно, вы захотите использовать en_US.UTF-8
, а не en_US
. (Последнее включает кодирование latin1.)
Примечание: Некоторые из приведенных ниже команд требуют привилегий root, рассмотрите возможность использования sudo
.
Согласно man locale-gen
, локали задаются в нескольких файлах.
/etc/locale.gen
Основной файл конфигурации, который имеет простой формат: каждая строка, которая не пуста и не начинается с #, рассматривается как определение локали, которое необходимо построить.
/var/lib/locales/supported.d/
Каталог, содержащий фрагменты locale.gen, предоставляемые языковыми пакетами. Не редактируйте их вручную, они будут перезаписаны при обновлении пакета.
Подробная информация о локалях на Arch Wiki.
Чтобы проверить (уже) сгенерированные локали, выполните любую из следующих команд (с небольшими отличиями в выводе).
locale -a
localedef --list-archive
localectl list-locales
Чтобы проверить текущую используемую локаль, выполните любую из следующих команд (с небольшими различиями в выводе).
locale
localectl
Локали обычно задаются раскомментированием строк в /etc/locale.gen
, после чего требуется запуск locale-gen
.
nano /etc/locale.gen # uncomment desired lines (locales)
locale-gen
Это создаст файлы локалей для каждой строки без комментариев в /etc/locale.gen
(и в /var/lib/locales/supported.d/
), независимо от того, были ли они созданные ранее или нет.
В качестве альтернативы команда
locale-gen <locale>
раскомментирует соответствующую строку в locale-gen
при создании нужной локали и только этой.
Чтобы удалить локали в /etc/locale.gen
, просто прокомментируйте нужные строки и перегенерируйте локали, используя locale-gen
. Команда locale-gen --purge <локаль>
не делает того, что предлагает модификатор.
Удалить локали из /var/lib/locales/supported.d/
сложнее. Поскольку любой файл /var/lib/locales/supported.d/
зависит от пакета
language-pack-
-base
, любое изменение в первом будет восстанавливается при обновлении последнего.
Обходной путь. Чтобы предотвратить изменения в папке /var/lib/locales/supported.d/
, установите в ней файлы с атрибутом "immutable (i)". Поэтому вместо удаления файлов очистите их. Например:
cd /var/lib/locales/supported.d/
rm <code> && touch <code> # <code> has been emptied
lsattr <code> # regular attributes
chattr +i <code> # adding (+) immutable
lsattr <code> # checking attributes
Установка и генерация локали не устанавливает локаль системы. Это достигается любой из следующих команд.
echo LANG=<code> | sudo tee /etc/locale.conf # reboot (might be ignored in Ubuntu)
localectl set-locale LANG=<code>