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


33

通常,我aptitude -y install locales随后运行dpkg-reconfigure locales以设置语言环境。

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

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

Answers:


13

参见locale-gen

 locale-gen --purge en_US.UTF-8

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

1
谢谢,但是我越来越File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module> sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))...
kenn 2012年

试试LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone

今天早上,在虚拟机状态良好的情况下,它可以正常工作!谢谢!
肯恩2012年

嗯……在全新locale-gen --purge en_GB.UTF-8安装上运行时,会得到以下意外输出:有什么Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.想法像在dpkg中以非交互方式重新配置语言环境那样设置语言环境列表?
本杰明·诺兰2014年

这都给了权限被拒绝的错误
。...– Cerin

47

无法获得以上答案才能正常工作。相反,我使用此方法(对于Dockerfiles):

# 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
Dockerfile正是我需要的。谢谢。
peedee '16

5
请不要将其他答案称为“上方”,“下方”或类似内容。当人们投票支持,接受,删除答案或只是选择其他顺序时,答案就会四处移动。始终使用发布答案的人的姓名,或者甚至更好,使用您要评论的答案下方的共享链接明确链接到答案。
rjmunro

这个答案的版本稍微整洁-专为Dockerfiles ..编辑:由于换行符在这里不起作用,请参考我的答案serverfault.com/a/801162/89669
mafrosis

我需要en_GB.UTF-8在CircleCI中设置语言环境-这是行之有效的最佳答案。希望因为有此评论,当人们尝试搜索我遇到的问题时,Google可能会将其显示为相关。
AlexSzabó17年

回声'LANG =“ nb_NO.UTF-8”'> / etc / default / locale在update-locale中是多余的LANG = nb_NO.UTF-8
otonglet

7

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

  • 为了配置时区,我首先创建“ / etc / localtime”作为到“ / usr / share / zoneinfo”目录下相应的zoneinfo文件的软链接。然后,我运行dpkg-reconfigure命令,所有内容都将放置到位。因此,例如,设置时区“欧洲/布鲁塞尔”:

    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-reconfigure命令生成sed脚本选择的所有语言环境,并使用一个条目创建一个新的'/ etc / default / locale'文件,以将'LANG'变量设置为我选择的默认环境语言环境:

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

    然后,根据我的要求,我可能想运行一些update-locale命令,以覆盖(例如)影响值格式的变量,并将它们设置为其他语言环境(例如爱尔兰英语):

    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'

    (我可以在一次调用update-locale命令时指定所有这些参数,但是显然,如果我这样做,则无法将条目写入'/ etc / default / locale'文件的顺序。)希望它们始终处于同一顺序,这就是为什么我一一生成它们的原因。)

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

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

将所有这些内容放到bash脚本中,您可以通过简单运行脚本轻松地重新配置区域设置,而无需任何进一步的用户交互。

但是,以我的经验,直到两次重启系统后(至少在Debian Jessie Xfce上),新设置才会被完全激活。第一次重新引导后,登录管理器将继续使用新设置,但是登录后,您的用户会话将继续使用旧设置;然后,在第二次重新引导后,您的用户会话也会采用新设置。


7

基于@EirikW答案中的出色工作。特定于Dockerfile

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

1
我更喜欢设置ENV,否则您将收到此错误:“ perl:警告:设置区域设置失败。\ perl:警告:请检查您的区域设置:\ LANG =” en_US.UTF-8“ \ \ perl:警告:退回到标准语言环境(“ C”)
otonglet

6

对我来说,有必要设置额外的3个ENV变量:

# - Set the locale + timezone --------------------------------------------------
RUN echo "Europe/Vienna" > /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/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen && \
    echo 'LANG="de_AT.UTF-8"'>/etc/default/locale && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=de_AT.UTF-8

ENV LANG de_AT.UTF-8
ENV LANGUAGE de_AT.UTF-8
ENV LC_ALL de_AT.UTF-8

但是,感谢ErikWs的回答:(https://serverfault.com/a/689947


1
这是唯一对我有用的解决方案,我使用的是Docker版本17.06.1-ce,内部版本874a737
linuxatico'9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.