Как удалить системные локали

Как удалить системных локалей, в отличие от пакета локалей, как было сказано в Как удалить ненужные локали ?

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


---
2
задан 30 June 2019 в 04:43

2 ответа

Вы должны отредактировать /etc/locale.gen и прокомментировать локали, которые вам не нужны. Затем запустите

sudo locale-gen

Не существует ни одной локали с именем en. Вероятно, вы захотите использовать en_US.UTF-8, а не en_US. (Последнее включает кодирование latin1.)

4
ответ дан 30 June 2019 в 04:43

Примечание: Некоторые из приведенных ниже команд требуют привилегий 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>
4
ответ дан 10 October 2020 в 11:44

Другие вопросы по тегам:

Похожие вопросы: