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

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

现在我想把它放到一个shell脚本中,我怎样才能可靠地自动/非交互地执行以下操作?

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

    请参阅locale-gen

      locale-gen --purge en_US.UTF-8 

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

    无法得到上面的答案工作。 相反,我使用这个方法(用于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 

    要在脚本中以非交互方式重新configuration时区和区域设置,以下是适用于我的操作(在Debian下):

    • 为了configuration时区,我首先创build'/ etc / localtime'作为软链接到'/ usr / share / zoneinfo'目录下相应的zoneinfo文件。 然后,我运行dpkg-reconfigure命令,一切都会就绪。 因此,例如,build立“欧洲/布鲁塞尔”时区:

       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子目录下的文件)。

    • 为了configuration语言环境,我首先运行一个sed脚本,根据“/ usr / share / i18n / SUPPORTED”文件的内容创build'/etc/locale.gen'文件的新副本。 input文件中的每一行都将被复制,但是它会变成注释,除非它是我希望在我的系统上可用的语言的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脚本所选的所有语言环境,并创build一个新的“/ etc / default / locale”文件,只需要一个条目将“LANG”variables设置为我select的默认环境语言环境:

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

      然后,根据我的要求,我可能需要运行一些update-locale命令来覆盖影响值格式的variables,并将它们设置为不同的语言环境(如爱尔兰英语 ):

       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命令来设置LANGUAGEvariables(即,我希望显示可翻译文本消息的语言列表):

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

    把所有这些东西放到一个bash脚本中,你可以通过简单的脚本运行轻松地重新configuration你的语言环境设置,而不需要任何进一步的用户交互。

    但是,根据我的经验,新的设置不会完全激活,直到重新启动系统两次(至less在Debian Jessie Xfce上)。 第一次重新启动后,loginpipe理器将采取新的设置好,但是login后,你的用户会话将继续使用旧的设置; 那么在第二次重新启动之后,您的用户会话也将采用新的设置。

    基于@ 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 

    对我而言,有必要设置额外的3个ENV-Vars:

     # - 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