localectl 命令 #
localectl
是一个用于查询和更改系统区域设置和键盘布局的命令行工具,它是 systemd 系统的一部分。该命令提供了一个统一的接口来管理系统的语言、格式和键盘设置,简化了本地化配置过程。
语法 #
localectl [选项...] 命令 [参数...]
常用命令 #
命令 | 描述 |
---|---|
status |
显示当前区域设置和键盘配置(默认命令) |
set-locale LOCALE... |
设置系统区域设置 |
list-locales |
列出可用的区域设置 |
set-keymap KEYMAP |
设置虚拟控制台键盘映射 |
list-keymaps |
列出可用的键盘映射 |
set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]] |
设置 X11 键盘映射 |
list-x11-keymap-models |
列出可用的 X11 键盘模型 |
list-x11-keymap-layouts |
列出可用的 X11 键盘布局 |
list-x11-keymap-variants [LAYOUT] |
列出可用的 X11 键盘变体 |
list-x11-keymap-options |
列出可用的 X11 键盘选项 |
常用选项 #
选项 | 描述 |
---|---|
-h, --help |
显示帮助信息 |
--version |
显示版本信息 |
--no-ask-password |
不询问密码 |
--no-convert |
不在键盘映射之间转换 |
-H, --host=HOST |
在远程主机上操作 |
-M, --machine=CONTAINER |
在本地容器上操作 |
常见用法 #
1. 显示当前区域设置和键盘配置 #
localectl
或者:
localectl status
输出示例:
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
X11 Model: pc105
2. 列出可用的区域设置 #
localectl list-locales
输出示例(部分):
en_US.UTF-8
en_GB.UTF-8
fr_FR.UTF-8
de_DE.UTF-8
zh_CN.UTF-8
ja_JP.UTF-8
...
3. 设置系统区域设置 #
localectl set-locale LANG=en_US.UTF-8
设置多个区域变量:
localectl set-locale LANG=en_US.UTF-8 LC_TIME=de_DE.UTF-8 LC_PAPER=de_DE.UTF-8
4. 列出可用的键盘映射 #
localectl list-keymaps
输出示例(部分):
us
uk
de
fr
es
it
...
5. 设置虚拟控制台键盘映射 #
localectl set-keymap de
6. 列出可用的 X11 键盘布局 #
localectl list-x11-keymap-layouts
输出示例(部分):
us
gb
de
fr
es
it
...
7. 设置 X11 键盘映射 #
localectl set-x11-keymap de
设置带有模型、变体和选项的完整 X11 键盘映射:
localectl set-x11-keymap de pc105 nodeadkeys grp:alt_shift_toggle
8. 同时设置虚拟控制台和 X11 键盘映射 #
localectl set-keymap --no-convert de
localectl set-x11-keymap de
9. 列出特定布局的键盘变体 #
localectl list-x11-keymap-variants de
输出示例(部分):
nodeadkeys
deadacute
deadgraveacute
...
10. 在远程主机上操作 #
localectl --host=user@remote-server status
区域设置变量 #
localectl
可以设置以下区域设置变量:
变量 | 描述 | 示例 |
---|---|---|
LANG |
默认区域设置 | en_US.UTF-8 |
LC_CTYPE |
字符分类和转换 | en_US.UTF-8 |
LC_NUMERIC |
数字格式 | de_DE.UTF-8 |
LC_TIME |
日期和时间格式 | fr_FR.UTF-8 |
LC_COLLATE |
字符串排序规则 | en_US.UTF-8 |
LC_MONETARY |
货币格式 | de_DE.UTF-8 |
LC_MESSAGES |
系统消息语言 | en_US.UTF-8 |
LC_PAPER |
纸张大小 | de_DE.UTF-8 |
LC_NAME |
姓名格式 | en_US.UTF-8 |
LC_ADDRESS |
地址格式 | de_DE.UTF-8 |
LC_TELEPHONE |
电话号码格式 | de_DE.UTF-8 |
LC_MEASUREMENT |
度量单位 | de_DE.UTF-8 |
LC_IDENTIFICATION |
区域设置元数据 | en_US.UTF-8 |
LC_ALL |
覆盖所有区域设置 | en_US.UTF-8 |
相关文件 #
/etc/locale.conf
:存储系统区域设置/etc/vconsole.conf
:存储虚拟控制台键盘映射/etc/X11/xorg.conf.d/00-keyboard.conf
:存储 X11 键盘设置/usr/share/locale/
:包含可用的区域设置/usr/share/kbd/keymaps/
:包含可用的键盘映射
与其他命令的关系 #
命令 | 描述 | 与 localectl 的关系 |
---|---|---|
locale |
显示当前区域设置 | 只显示信息,不能更改设置 |
setxkbmap |
设置 X11 键盘映射 | localectl 在后台使用它来设置 X11 键盘 |
loadkeys |
加载虚拟控制台键盘映射 | localectl 在后台使用它来设置控制台键盘 |
实用示例 #
1. 设置英语环境但使用欧洲格式 #
# 设置基本语言为英语
localectl set-locale LANG=en_US.UTF-8
# 设置欧洲格式的日期、时间、数字和货币
localectl set-locale LC_TIME=en_GB.UTF-8 LC_NUMERIC=de_DE.UTF-8 LC_MONETARY=de_DE.UTF-8 LC_PAPER=de_DE.UTF-8 LC_MEASUREMENT=de_DE.UTF-8
2. 为多语言环境配置键盘 #
# 设置支持多种语言输入的键盘
localectl set-x11-keymap us,ru pc105 "" grp:alt_shift_toggle
这将设置美式和俄语键盘布局,使用 Alt+Shift 切换。
3. 在脚本中使用 localectl #
#!/bin/bash
# 检测系统语言并设置相应的键盘布局
# 获取当前语言
CURRENT_LANG=$(localectl status | grep "System Locale" | cut -d= -f2)
# 根据语言设置键盘
case "$CURRENT_LANG" in
de_*)
localectl set-keymap de
localectl set-x11-keymap de
;;
fr_*)
localectl set-keymap fr
localectl set-x11-keymap fr
;;
es_*)
localectl set-keymap es
localectl set-x11-keymap es
;;
*)
localectl set-keymap us
localectl set-x11-keymap us
;;
esac
echo "Keyboard layout set according to language: $CURRENT_LANG"
4. 设置带有特殊选项的键盘布局 #
# 设置德语键盘布局,带有nodeadkeys变体和Caps Lock作为额外Ctrl键
localectl set-x11-keymap de pc105 nodeadkeys ctrl:nocaps
5. 在系统初始化脚本中使用 #
#!/bin/bash
# 根据地理位置设置区域设置
# 获取IP地址的地理位置
COUNTRY_CODE=$(curl -s http://ipinfo.io/country)
# 根据国家代码设置区域设置
case "$COUNTRY_CODE" in
"DE")
localectl set-locale LANG=de_DE.UTF-8
localectl set-keymap de
;;
"FR")
localectl set-locale LANG=fr_FR.UTF-8
localectl set-keymap fr
;;
"ES")
localectl set-locale LANG=es_ES.UTF-8
localectl set-keymap es
;;
*)
localectl set-locale LANG=en_US.UTF-8
localectl set-keymap us
;;
esac
echo "Locale and keyboard set based on geographic location: $COUNTRY_CODE"
常见问题排查 #
1. 权限问题 #
Could not set property: Interactive authentication required.
解决方法:使用 sudo 运行命令。
sudo localectl set-locale LANG=en_US.UTF-8
2. 区域设置未生效 #
可能的原因:
- 区域设置未正确生成
- 应用程序未重启
- 用户会话未重新登录
解决方法:
# 确保区域设置已生成
sudo locale-gen en_US.UTF-8
# 重新加载配置
source /etc/locale.conf
# 重新登录或重启系统
3. 键盘布局未更改 #
可能的原因:
- X11 服务器未重启
- 桌面环境覆盖了设置
- 缺少必要的键盘布局包
解决方法:
# 安装必要的键盘布局包
sudo apt-get install console-setup xkb-data
# 重启X11服务器(注意:这将关闭所有图形会话)
sudo systemctl restart display-manager
# 或者注销并重新登录
4. 找不到指定的区域设置 #
Warning: Cannot set LC_CTYPE to default locale: No such file or directory
解决方法:
# 生成缺少的区域设置
sudo locale-gen en_US.UTF-8
# 更新区域设置数据库
sudo update-locale
5. X11 键盘设置与控制台键盘设置不同步 #
可能的原因:
- 使用了
--no-convert
选项 - 键盘布局之间没有直接映射
解决方法:
# 同时设置两种键盘布局
sudo localectl set-keymap de
sudo localectl set-x11-keymap de
# 或者使用不带--no-convert的命令
sudo localectl set-keymap de
提示 #
- 更改区域设置后,可能需要重新登录或重启某些应用程序才能生效
- 使用
locale
命令可以查看当前会话的区域设置 - 区域设置名称通常遵循
语言_国家.编码
格式,如en_US.UTF-8
- 在服务器环境中,通常只需要设置基本的
LANG
变量 - 在桌面环境中,某些设置可能会被桌面环境的配置工具覆盖
- 使用
LC_ALL
变量可以覆盖所有其他区域设置变量,但通常不建议在系统配置中使用它 - 在容器或虚拟机模板中设置区域设置和键盘布局可以确保一致的用户体验
- 某些应用程序可能有自己的语言设置,独立于系统区域设置
- 在多用户系统中,用户可以在其主目录的
.profile
或.bashrc
文件中设置自己的区域设置 - 使用 UTF-8 编码可以确保最佳的多语言支持