LC_*を設定しますが、LC_ALLは設定しません

LC_*を設定しますが、LC_ALLは設定しません

私はドイツ語(オーストリア)のロケール(A4用紙サイズ、24時間、yyyy-mm-dd)が欲しいが、英語のユーザーインターフェースが欲しい(悪い翻訳は好きではない)。私の考えにこれを達成する正しい方法は、LC_私の変数を次のように設定することです。.bashrc(私が間違っている場合は訂正してください):

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

すべての値を設定する代わりにLC_$everythingelseを設定するよりエレガントな方法はありますか? LC_ALL 設定は LC_MESSAGES より優先されるため、オプションではありません。

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS:これは共有コンピュータで、私はsudoerではないため、システム全体の設定を変更することはできません。

答え1

3つのロケールセットがあります1:

  • LANG、まだカテゴリ値を指定していない場合の代替設定です。ユーザーが簡単な方法でロケール設定を表示できるように設計されています。
  • LC_xxx各カテゴリについて(などにxxxなることがあります)MESSAGESTIME
  • LC_ALLすべての設定を上書きします。これは、アプリケーションが既知のロケール(通常はデフォルトのロケール)で動作するようにすべての設定をオーバーライドする方法です。通常、さまざまCなコマンドが既知の形式で出力を生成します。

LANG=de_AT.UTF-8したがって、LC_MESSAGES=CCデフォルトのロケールに翻訳されていないことを意味し、en_US通常はCメッセージと同じです)を設定できます。

ただし、デフォルトを変更すると多くのプログラムが中断される可能性があるため、推奨されない2つのカテゴリがあります。

  • LC_COLLATE役割です。整える注文する。文字列のソート方法ではなく、文字のソート方法だけを表すため、あまり役に立ちません。文字列を並べ替える方法を知るツールは使用されませんLC_COLLATE。また、多くのツールは[a-z]「26個のASCII小文字すべて一致し、他のASCII文字は一致しない」のようなことを期待していますが、ほとんどのデフォルトではないロケールではそうではありません(try echo B | LC_COLLATE=en_US grep '[a-z]')。
  • LC_NUMERIC数値の表示方法を示します。具体的には、多くの言語では、浮動小数点数が小数点では,ないを使用します。.ただし、数値を解析するほとんどのプログラムはaを期待し、.aを,フィールド区切り文字として扱います。

だから私は提案する

  • または明示的にLC_COLLATE=C LC_NUMERIC=_C
  • または、LANG設定しないままにして、有用なカテゴリの値(LC_MESSAGES、、、プラス記号(LC_TIME対応する値は端末によって異なる場合があります))を設定します。LC_PAPERLC_CTYPE

プラス記号1個LANGUAGEGNU libcで。聞いたことがないと、あまり見逃したことではありません。

答え2

これマンページロケール(7)説明する:

基本ロケール[...]次の手順を使用して、以下を決定します。

  1. null 以外の環境変数 LC_ALL が存在する場合は、LC_ALL 値が使用されます。

  2. 上記のカテゴリ[LC_*]の1つと同じ名前の環境変数が存在し、空でない場合は、その値がそのカテゴリに使用されます。

  3. 空でない環境変数 LANG が存在する場合、LANG 値が使用されます。

したがって、LANGはLC_ALLの優先順位の低いアナログとして使用できます。 LANG値を次のように設定し、de_ATLC_MESSAGESを次のように設定しますen_US

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"

関連情報