我想了解语言环境如何工作。特别是我读过“-bash:警告:setlocale:LC_ALL:无法更改区域设置(en_US.UTF-8)”和https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale
在我的 Linux Mint 上我做了locale-gen fr_FR.*
,之后LC_ALL=fr_FR.UTF-8
输出“bash:警告:setlocale:LC_ALL:无法更改区域设置(fr_FR.UTF-8)”。然而,locale
之后显示“LC_NAME=fr_FR.UTF-8”等,因此区域设置变量被更改。为什么要写“无法更改区域设置”?
我做了LC_NAME=qq_QQ.UTF-8
(不存在?区域设置),结果是相同的 - 警告,locale
输出已更新。
我注意到,只有在 bash 终端启动之前已经生成新分配的情况下,才会出现警告。与此一致,bash -c "LC_NAME=fr_FR.UTF-8"
没有产生任何警告。
命令来自https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale sudo update-locale LANG=fr_FR
并没有摆脱警告。
我怀疑当前的 bash 会话保留了/etc/defaults/locale
其他文件,因此locale-gen
对此没有影响。正确的?strace
输出对于我来说太复杂了,我无法阅读,我只是还没有找到/etc/defaults/locale
它。
添加:
系统 Linux Mint 20.2(基于 Ubuntu)。我使用了locale-gen name.*
IIRC 因为我在某处读过该行并且输出显示它正是name
were的语言环境done
。现在,在阅读答案和手册页后,我尝试在runlocale-gen
中注释掉 name.* ,然后取消注释并再次运行。运行结果和之前一样/etc/locale.gen
sudo locale-gen
name.UTF-8
sudo locale-gen
locale-gen name.*
答案1
您的警告表明您请求的区域设置实际上尚未编译。所以,你应该使用:
sudo dpkg-reconfigure locales
选择要编译的区域设置。
或者,只需编辑文件:
/etc/locale.gen
并取消注释所需的区域设置,然后运行:
sudo locale-gen
来生成它们。
什么是区域设置变量?
语言环境环境变量只是 C 库 ( ) 赋予特殊含义的常规环境变量glibc
。具体来说,当程序通过调用setlocale(LC_ALL, "");
或类似方式请求激活本地化支持时,将使用这些变量。此时,C 库将从/usr/lib/locale/
.
这些本地化设置由实用localedef
程序使用/usr/share/locale
.在 Debian、Ubuntu 和相关发行版中,localedef
被称为locale-gen
.
为什么locale-gen fr_FR.*
不起作用
locale-gen
不从命令行获取任何参数。它仅读取/etc/locale.gen
以确定要生成的区域设置。因此,根据/etc/locale.gen
文件中未注释的区域设置,您的locale-gen fr_FR.*
命令可能不会产生预期的效果。
该update-locale
命令只是包维护者脚本的一个工具,用于更新/etc/default/locale
.它对于实际要编译的语言环境完全没有影响。