如何删除系统区域设置

如何删除系统区域设置

如何删除系统区域设置,而不是包裹询问的语言环境如何删除不需要的区域设置?

我收到以下错误最近

locale: Cannot set LC_ALL to default locale: No such file or directory

仅有的 en我的系统中的语言环境:

$ grep -r en /var/lib/locales/supported.d/*
/var/lib/locales/supported.d/local: en_US ISO-8859-1
/var/lib/locales/supported.d/local: 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

结论与补充

感谢 Gunnar 的回答,这确实是由 中的条目引起的/etc/locale.gen,针对那些额外的语言环境。仅供参考,这是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 ---


---

答案1

笔记:下面的一些命令需要root权限,请考虑使用sudo

基本信息

根据man locale-gen,语言环境在几个文件中设置。

/etc/locale.gen

主配置文件具有简单的格式:每一行非空且不以 # 开头的行都被视为要构建的区域设置定义。

/var/lib/locales/supported.d/

包含语言包提供的 locale.gen 片段的目录。请勿手动编辑这些片段,它们将在包升级时被覆盖。

语言环境被编译(生成)成一个文件。

/usr/lib/locale/locale-archive

通常的默认语言环境存档位置。

有关地点的全面详细信息建筑维基

检查区域设置和语言环境

要列出可用(已知)的区域设置,请运行以下任一命令(输出略有不同)。

locale -a
localectl list-locales

要检查(已)生成的语言环境,请运行以下命令。

localedef --list-archive

要检查当前使用的区域设置,请运行以下任一命令(输出略有不同)。

locale
localectl

设置和生成(新)区域设置

通常通过取消注释行来设置区域设置/etc/locale.gen,然后locale-gen需要运行。

nano /etc/locale.gen # uncomment desired lines (locales)
locale-gen

这将为 中和 下的/usr/lib/locale/locale-archive每个未注释的行编译(生成)语言环境,无论它们之前是否被编译过。/etc/locale.gen/var/lib/locales/supported.d/

或者,命令

locale-gen <locale>

将在生成所需的语言环境时取消注释相应的行locale-gen,并且仅生成这一行。

注意: 的实现locale-gen取决于发行版。例如,上述命令在 Ubuntu/Debian 中有效,但在 ArchLinux 中无效。

删除区域设置

发出 时locale-gen,已编译的存档将被删除,并且所有/etc/locale.gen和 下的语言环境/usr/lib/locale/locale-archive都将重新生成。该命令locale-gen --purge <locale>不会执行修饰符所建议的操作,而是相反:它会删除除所指示的语言环境之外的所有已编译语言环境。要确保在locale-gen发出 或 并执行更新时只生成特定语言环境,必须同时考虑/etc/locale.gen和。/usr/lib/locale/locale-archive

要删除中的语言环境/etc/locale.gen,只需注释掉所需的行并使用重新生成语言环境即可locale-gen

删除 下的语言环境/var/lib/locales/supported.d/比较棘手。由于任何文件都/var/lib/locales/supported.d/<code>依赖于 软件包language-pack-<code>-base,因此当 软件包更新时,前者的任何更改都将恢复。要解决这个问题,只需保留 下更新文件的软件包/var/lib/locales/supported.d/。在 Ubuntu/Debian 中实现此目的的命令如下。

apt-mark language-pack-<code>-base

要更新保留的包,您必须取消标记或者简单地--ignore-hold

解决方法。一个更具侵入性但更通用的解决方案,可以防止更改,/var/lib/locales/supported.d/方法是使用“不可变(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>

答案2

你应该编辑/etc/locale.gen并注释掉你不想要的区域设置。然后运行

sudo locale-gen

不存在名为 的任何语言环境en。您可能想要使用的语言环境是en_US.UTF-8而不是en_US。(后者启用 latin1 编码。)

答案3

我的机器上安装了哪些语言环境?

您可以使用 locale 命令检查系统上生成和配置了哪些语言环境:

  • locale... 列出当前的区域设置配置
  • locale -a...列出系统上生成的所有语言环境
  • locale -a -v... 列出所有语言环境并显示有用的附加信息(例如包含语言环境信息数据文件的目录名称)

上面的最后一个命令让你看到所有生成的语言环境都位于/usr/lib/locale/,如果不需要,您可以删除其中任何一个。每个语言环境信息包都是一个包含文本文件和其他目录的目录。


支持的区域设置

您希望系统支持的所有语言环境都列在/var/lib/locales/supported.d/.这些文件有两列,语言标签和字符映射表。

我希望我的系统只识别美式英语,所以我只有一个文件,叫做en,其中仅包含一行:

en_US UTF-8

错误消息

如果在发出 locale 命令时显示错误消息,例如

locale: Cannot set LC_ALL to default locale: No such file or directory

确保文件/etc/default/locale存在并且具有适当的内容,例如:

LANG="en_US"
LANGUAGE="en_US:en"

删除不需要的语言环境数据 - 一步一步

现在我们知道了开始清理系统的区域设置信息所需的所有详细信息:

  1. 编辑语言环境文件/var/lib/locales/supported.d/,并删除所有不需要的语言环境(每行一个语言环境)
  2. 创建和编辑/etc/default/locale(见上文示例)
  3. 删除所有生成的语言环境数据:rm -rfv /usr/lib/locale/*
  4. 重新生成新的区域设置:locale-gen

就这样!重新启动计算机以使更改生效。然后运行上面的一个或多个 locale 命令示例以确保结果符合预期。


参考:

https://www.linuxquestions.org/questions/blog/bittner-195120/remove-unwanted-locales-on-ubuntu-debian-3281/

相关内容