localectl命令

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 编码可以确保最佳的多语言支持