xpt*_*xpt 4 configuration system locale removing
如何删除系统语言环境,与如何删除不必要的语言环境中所述的打包语言环境相反?
我最近收到以下错误:
locale: Cannot set LC_ALL to default locale: No such file or directory
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但不是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"
Run Code Online (Sandbox Code Playgroud)
所以我通过以下方式添加语言环境 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
Run Code Online (Sandbox Code Playgroud)
我不想要任何上述语言环境(仅en_US),但现在我无法摆脱它们 - 我按照https://serverfault.com/questions/394610/remove-a-locale-in- 中的步骤操作
乌本图
但是当涉及到最后一步时,我仍然得到:
% 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
Run Code Online (Sandbox Code Playgroud)
如何删除所有上述语言环境并仅保留en_US?
结论与补充
感谢 Gunnar 的回答/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
Run Code Online (Sandbox Code Playgroud)
作为比较,这里是默认的样子(即,没有任何上述额外的语言环境):
$ sed '/^#/d;' /etc/locale.gen; echo ---
---
Run Code Online (Sandbox Code Playgroud)
您应该编辑/etc/locale.gen和评论您不想要的语言环境。然后运行
sudo locale-gen
Run Code Online (Sandbox Code Playgroud)
不存在名称为 的任何语言环境en。您可能想要使用的是en_US.UTF-8和 not en_US。(后者启用 latin1 编码。)
注意:下面的一些命令需要 root 权限,请考虑使用sudo.
根据man locale-gen,区域设置在多个文件中设置。
/etc/locale.gen主配置文件的格式很简单:每一行不为空且不以 # 开头的行都被视为要构建的语言环境定义。
/var/lib/locales/supported.d/包含语言包提供的 locale.gen 片段的目录。不要手动编辑它们,它们将在软件包升级时被覆盖。
语言环境被编译(生成)到单个文件中。
/usr/lib/locale/locale-archive通常的默认区域设置存档位置。
Arch Wiki上有关语言环境的全面详细信息。
要列出可用(已知)区域设置,请运行以下任意命令(输出略有差异)。
locale -a
localectl list-locales
Run Code Online (Sandbox Code Playgroud)
要检查(已)生成的区域设置,请运行以下命令。
localedef --list-archive
Run Code Online (Sandbox Code Playgroud)
要检查当前使用的区域设置,请运行以下任意命令(输出略有差异)。
locale
localectl
Run Code Online (Sandbox Code Playgroud)
区域设置通常通过取消注释行来设置/etc/locale.gen,之后locale-gen需要运行。
nano /etc/locale.gen # uncomment desired lines (locales)
locale-gen
Run Code Online (Sandbox Code Playgroud)
这将为 中和 下的/usr/lib/locale/locale-archive每个未注释的行编译(生成)语言环境,无论它们之前是否已编译。/etc/locale.gen/var/lib/locales/supported.d/
或者,命令
locale-gen <locale>
Run Code Online (Sandbox Code Playgroud)
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>都依赖于 package language-pack-<code>-base,因此当后者更新时,前者的任何更改都将被恢复。要解决此问题,只需将更新文件的包保存在/var/lib/locales/supported.d/. 在 Ubuntu/Debian 中实现此目的的命令如下。
apt-mark language-pack-<code>-base
Run Code Online (Sandbox Code Playgroud)
要更新保留的包,您必须取消标记或简单地--ignore-hold.
解决方法。一种更具侵入性但通用的防止更改的解决方案是使用“immutable (i)”属性/var/lib/locales/supported.d/设置其中的文件。因此,不要删除文件,而是清空它们。例如:
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
Run Code Online (Sandbox Code Playgroud)
设置和生成区域设置不会设置系统区域设置。以下任何命令都可以实现此目的。
echo LANG=<code> | sudo tee /etc/locale.conf # reboot (might be ignored in Ubuntu)
localectl set-locale LANG=<code>
Run Code Online (Sandbox Code Playgroud)