ロケール環境変数を変更するには?


18

en_US.utf8et_EE.iso88591、およびru_RU.utf8のローカライズファイルを生成しました。ロケール変数をru_RU.utf8またはen_US.utf8に変更しようとしても、これは効果がありません。

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

ただし、LANG =変数を変更すると、LANGUAGE =およびLC_ALL =以外のすべての変数がLANG =変数の値を取ります。各ロケール変数を個別に変更する方法はありますか?さらに、ロケール変数は通常のシェル変数ではなく、ロケールユーティリティのパラメーターに似ていることを修正できますか?

回答:


15

任意のロケールカテゴリを個別に設定できます。LANG明示的に設定されていないカテゴリにのみ適用されます。

LANGおよびLC_xxxは、通常の環境変数です。これらはlocaleユーティリティの設定ではありません。localeプログラムはロケール処理に関与していません。現在および利用可能なロケール設定を報告するための小さなユーティリティです。

を記述するLC_TIME=ru_RU.utf8と、環境変数は設定されず、シェル変数のみが設定されます。シェル変数はシェルの内部にあり、他のプログラムからは見えません。一方、環境変数は、シェルが起動するプログラムに継承されます。変数も環境にエクスポートする必要があります。

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

または直接

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

「LANGとLC_xxxは通常の環境変数です」それをどのように認識しLANGLC_xxx環境変数ですか?私のテストのみを示しているLANGLANGUAGEし、LC_MESSAGESかつLC_ALL、環境変数あるように、一方、他の変数LC_CTYPELC_MONETARY環境変数(また、彼らはシェル変数ではありません)ではありませんか?
rony_t

@rony_tアプリケーションとライブラリのソースコード、ドキュメント、またはそれらを試してみることができます。たとえば、and env LC_TIME=en_GB dateと互換性がenv LC_TIME=fr_FR dateありますenv PATH="$PATH" date(明らかに、システムに存在するロケールを選択します)。明らかに、各変数は特定のプロセスの環境で設定される場合と設定されない場合があります。どのようなテストをしましたか?使用したアプリケーションは、LC_CTYPE(かなり一般的)とLC_MONETARY(かなりまれ)に基づいて異なる動作をしますか?
ジル「SO-悪であるのをやめる」

ターミナルでは、私は、実行printenvのbashの環境変数を一覧表示するコマンドを、とだけLANGLANGUAGEし、LC_MESSAGESかつLC_ALL、環境変数としてリストされていました。私はまた、コマンドが実行set -o posixコマンドに続いてset、環境変数とはbashのシェル変数を取得するには、唯一LANGLANGUAGEし、LC_MESSAGESかつLC_ALL上場されました。つまり、 LANGand LANGUAGELC_MESSAGESand LC_ALLは環境変数であり、ロケール変数の残りはそうではなく、シェル変数でもありません。
rony_t

@rony_tいいえそれはことを意味しますが、環境変数を設定しているLANGLANGUAGELC_MESSAGESLC_ALL。(これを明示的に行ったか、ディストリビューションまたはシステム管理者が行ったかのいずれかです。)任意の(構文的に有効な)名前で環境変数を設定できます!ただし、一部の名前は一部のアプリケーションにとって意味があり、一部の名前は意味がありません。LC_MESSAGESLC_CTYPEなどLC_TIMEは、エラーメッセージの言語、文字エンコード、時刻形式などを考慮するアプリケーションによって使用されます。
ジル 'SO-悪であるのをやめる'

@rony_tところで、設定は非常に奇妙です。の設定はLC_ALL他のすべての設定をオーバーライドするため、他のロケール変数の値は重要ではありません。通常、プログラムに特定のロケールを強制的に使用させるために一時的にのみ使用されます。通常の環境で使用することは意味がありません。
ジル 'SO-悪であるのをやめる'

6

Fedora / CentOS / RHELベースのディストリビューションでは、ロケールをlocale -aこのシステムファイルでコマンドを実行するときに表示されるロケールのいずれかに変更できると信じています。

/etc/sysconfig/i18n

たとえば、Fedora 14システムの場合:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

GNOMEでは、ヘルプアプリを実行できます。

system-config-language

このGUIが表示されます。

             ラングのSS。 gui

Debian / Ubuntuディストリビューションでは少し違うと思います。私はそれがこのファイルだと信じています:

/etc/default/locale

私はそれらが環境変数であると信じていますが、アプリケーションがどのようにそれらを使用するのかについてはまったくわかりません。

参照資料


4

少なくともRedHat 6では、LC_ALLが設定されている場合、LC_ALLが他のすべてのLC_ *環境変数よりも優先されるため、他のLC_ *環境変数を設定しても効果がないことに注意してください。

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=

1

Debianシステムでは、実行dpkg-reconfigure localesしてメイン言語を設定し、他の言語を使用可能にすることができます。次に、フォールバック言語を使用するように環境変数update-localeを設定するために実行できます。LANGUAGE/etc/default/locale


2
dpkg-reconfigure locales、ではないlocale
-lauriys
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.