如何在 Debian/Ubuntu 上以非交互方式设置语言环境?

如何在 Debian/Ubuntu 上以非交互方式设置语言环境?

通常,我会运行aptitude -y install localesdpkg-reconfigure locales来设置语言环境。

现在我想将其放入 shell 脚本中,如何可靠地、自动/非交互地执行以下操作?

  • 选择en_US.UTF-8并将其设置为系统默认值
  • 禁用所有其他语言环境
  • (可选)验证是否按预期/etc/default/locale包含唯一条目LANG=en_US.UTF-8

答案1

本地化

 locale-gen --purge en_US.UTF-8

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale

答案2

无法获取@stone 的回答无法正常工作。相反,我使用这种方法(针对 Dockerfile):

# Configure timezone and locale
echo "Europe/Oslo" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata && \
    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    sed -i -e 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/' /etc/locale.gen && \
    echo 'LANG="nb_NO.UTF-8"'>/etc/default/locale && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=nb_NO.UTF-8

答案3

根据@EirikW 的回答中的出色工作。具体到Dockerfile

ENV LANG=en_GB.UTF-8
RUN apt-get install -y locales && \
    sed -i -e "s/# $LANG.*/$LANG UTF-8/" /etc/locale.gen && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=$LANG

答案4

要在脚本中以非交互方式重新配置时区和语言环境,以下是对我有用的方法(在 Debian 下):

  • 为了配置时区,我首先创建“/etc/localtime”作为指向相应区域信息文件位于“/usr/share/zoneinfo”目录下。然后,我运行dpkg-重新配置命令,一切都将就绪。例如,设置时区“Europe/Brussels”:

    AREA='Europe'
    ZONE='Brussels'
    
    ZONEINFO_FILE='/usr/share/zoneinfo/'"${AREA}"'/'"${ZONE}"
    ln --force --symbolic "${ZONEINFO_FILE}" '/etc/localtime'
    dpkg-reconfigure --frontend=noninteractive tzdata
    

    (请注意,AREA 是 '/usr/share/info' 下的子目录,而 ZONE 是 AREA 子目录下的文件)。

  • 为了配置语言环境,我首先运行sed脚本将根据“/usr/share/i18n/SUPPORTED”文件的内容创建“/etc/locale.gen”文件的新副本。输入文件的每一行都将被复制,但它将变成注释,除非它是我希望在我的系统上提供的语言的 UTF-8 区域设置的条目(例如,英语、荷兰语、法语和德语):

    sed --regexp-extended --expression='
    
       1  {
             i\
    # This file lists locales that you wish to have built. You can find a list\
    # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add\
    # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change\
    # this file, you need to rerun locale-gen.\
    \
    
    
          }
    
       /^(en|nl|fr|de)(_[[:upper:]]+)?(\.UTF-8)?(@[^[:space:]]+)?[[:space:]]+UTF-8$/!   s/^/# /
    
    ' /usr/share/i18n/SUPPORTED >  /etc/locale.gen
    

    接下来,我在 debconf 数据库中设置默认环境语言环境,例如英式英语

    debconf-set-selections <<< 'locales locales/default_environment_locale select en_GB.UTF-8'
    

    随后,我删除了现有的“/etc/default/locale”文件(只是为了确保其旧内容不会干扰我的新设置),然后运行dpkg-重新配置命令生成sed选择脚本,并创建一个新的“/etc/default/locale”文件,其中只有一个条目将“LANG”变量设置为我选择的默认环境语言环境:

    rm --force --verbose /etc/default/locale
    dpkg-reconfigure --frontend=noninteractive locales
    

    然后,根据我的需求,我可能想要运行一些更新区域设置命令,例如覆盖影响值格式的变量,并将它们设置为不同的语言环境(例如爱尔兰英语):

    update-locale LC_NUMERIC='en_IE.UTF-8'
    update-locale LC_TIME='en_IE.UTF-8'
    update-locale LC_MONETARY='en_IE.UTF-8'
    update-locale LC_PAPER='en_IE.UTF-8'
    update-locale LC_NAME='en_IE.UTF-8'
    update-locale LC_ADDRESS='en_IE.UTF-8'
    update-locale LC_TELEPHONE='en_IE.UTF-8'
    update-locale LC_MEASUREMENT='en_IE.UTF-8'
    update-locale LC_IDENTIFICATION='en_IE.UTF-8'
    

    (我可以在一次调用中指定所有这些参数更新区域设置命令,但显然,如果我这样做,条目写入“/etc/default/locale”文件的顺序是不可预测的。我希望它们始终保持相同的顺序,这就是我逐个生成它们的原因。)

    最后,我可能想运行更新区域设置最后一次命令,设置 LANGUAGE 变量(即,我希望显示可翻译文本消息的语言列表):

    update-locale LANGUAGE='en_GB:en_US:en'
    

将所有这些放到一个 bash 脚本中,您只需运行该脚本就可以轻松地重新配置您的语言环境设置,而不需要任何进一步的用户交互。

但是,根据我的经验,新设置只有在您重新启动系统两次后才会完全生效(至少在 Debian Jessie Xfce 上)。第一次重新启动后,登录管理器将正确采用新设置,但登录后,您的用户会话将继续使用旧设置;然后,在第二次重新启动后,您的用户会话也将采用新设置。

相关内容