當前位置: 首頁>>技術教程>>正文


如何在Debian/Ubuntu上非交互地設置語言環境?

, , ,

問題描述

通常,我先運行aptitude -y install locales,然後運行dpkg-reconfigure locales來設置語言環境。

現在,我想將其放入shell腳本中,如何可靠地自動/非交互地執行以下操作?

  • 選擇en_US.UTF-8並將其設置為係統默認值

  • 禁用所有其他語言環境

  • (可選)驗證/etc/default/locale是否包含預期的LANG=en_US.UTF-8的one-and-only條目

最佳回答

參見locale-gen:

 locale-gen --purge en_US.UTF-8

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

次佳回答

無法使@stone’s answer正常工作。相反,我使用此方法(用於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

第三種回答

基於@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)

第五種回答

要以非交互方式從腳本內重新配置時區和語言環境,以下是對我有效的方法(在Debian中):

  • 為了配置時區,我首先創建’/etc/localtime’作為到’/usr/share/zoneinfo’目錄下相應的zoneinfo文件的軟鏈接。然後,我運行dpkg-reconfigure命令,所有內容都將放置到位。因此,例如,設置時區’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-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上)之後,新設置才會被完全激活。第一次重新引導後,登錄管理器將繼續使用新設置,但是登錄後,您的用戶會話將繼續使用舊設置;然後,在第二次重新引導後,您的用戶會話也會采用新設置。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/11054.html,未經允許,請勿轉載。