通常、aptitude -y install locales
を実行してからdpkg-reconfigure locales
を実行してロケールを設定します。
今、それをシェルスクリプトに入れたいのですが、どのようにして自動的に/非対話的に以下を確実に実行できますか?
en_US.UTF-8
を選択し、システムのデフォルトとして設定します/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
@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
スクリプト内から非対話的にタイムゾーンとロケールを再構成するために、以下は(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 /の内容に基づいて、'/etc/locale.gen 'ファイルの新しいコピーを作成しますSUPPORTED 'ファイル。入力ファイルのすべての行がコピーされますが、システムで使用できるようにする言語(英語、オランダ語、フランス語など)の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スクリプトが選択したロケール、および 'LANG'変数を選択したデフォルトの環境ロケールに設定するためのエントリのみを含む新しい '/ etc/default/locale'ファイルを作成するには:
rm --force --verbose /etc/default/locale
dpkg-reconfigure --frontend=noninteractive locales
次に、私の要件に応じて、いくつかのpdate-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'
(pdate-localeコマンドの1回の呼び出しでこれらのパラメーターをすべて指定することもできましたが、エントリが '/ etc/default/locale'ファイルに書き込まれる順序はそうする場合、予測できません。常に同じ順序にすることをお勧めします。そのため、1つずつ生成します。)
最後に、最後にpdate-localeコマンドを実行して、LANGUAGE変数(つまり、翻訳可能なテキストメッセージを表示する言語のリスト)を設定します。
update-locale LANGUAGE='en_GB:en_US:en'
これらすべてをまとめてbashスクリプトに入れれば、スクリプトを実行するだけで簡単にロケール設定を再構成できます。これにより、ユーザーがさらに操作する必要はありません。
ただし、私の経験では、システムを2回再起動するまで(少なくともDebian Jessie Xfceでは)、新しい設定が完全にアクティブになることはありません。最初の再起動後、ログインマネージャーは新しい設定を使用しますが、ログイン後、ユーザーセッションは引き続き古い設定を使用します。次に、2回目の再起動後、ユーザーセッションにも新しい設定が適用されます。
私にとっては、追加の3つのENV-Varを設定する必要がありました:
# - 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 )