ロケール —国際化サービス
ソースコード: :source: `Lib / locale.py`
locale モジュールは、POSIXロケールデータベースと機能へのアクセスを開きます。 POSIXロケールメカニズムにより、プログラマーは、ソフトウェアが実行される各国の詳細をすべて知る必要なしに、アプリケーション内の特定の文化的問題に対処できます。
locale モジュールは_locale
モジュールの上に実装され、可能な場合はANSICロケール実装を使用します。
locale モジュールは、次の例外と機能を定義します。
- exception locale.Error
- setlocale()に渡されたロケールが認識されない場合に発生する例外。
- locale.setlocale(category, locale=None)
locale が指定され、
None
が指定されていない場合、 setlocale()はカテゴリのロケール設定を変更します。 使用可能なカテゴリは、以下のデータの説明にリストされています。 locale は、文字列、または2つの文字列(言語コードとエンコーディング)の反復可能です。 反復可能である場合は、ロケールエイリアシングエンジンを使用してロケール名に変換されます。 空の文字列は、ユーザーのデフォルト設定を指定します。 ロケールの変更が失敗した場合、例外エラーが発生します。 成功すると、新しいロケール設定が返されます。locale を省略した場合、または
None
の場合、 category の現在の設定が返されます。setlocale()は、ほとんどのシステムでスレッドセーフではありません。 アプリケーションは通常、の呼び出しで始まります
import locale locale.setlocale(locale.LC_ALL, '')
これにより、すべてのカテゴリのロケールがユーザーのデフォルト設定に設定されます(通常は
LANG
環境変数で指定されます)。 その後ロケールが変更されない場合、マルチスレッドを使用しても問題は発生しません。
- locale.localeconv()
ローカル規則のデータベースを辞書として返します。 この辞書には、キーとして次の文字列があります。
カテゴリー
鍵
意味
'decimal_point'
小数点文字。
'grouping'
'thousands_sep'
が予想される相対位置を指定する一連の番号。 シーケンスが CHAR_MAX で終了している場合、それ以上のグループ化は実行されません。 シーケンスが0
で終了する場合、最後のグループサイズが繰り返し使用されます。'thousands_sep'
グループ間で使用される文字。
'int_curr_symbol'
国際通貨記号。
'currency_symbol'
現地通貨記号。
'p_cs_precedes/n_cs_precedes'
通貨記号が値の前にあるかどうか(正の応答の場合)。 負の値)。
'p_sep_by_space/n_sep_by_space'
通貨記号が値からスペースで区切られているかどうか(正の応答の場合)。 負の値)。
'mon_decimal_point'
金額に使用される小数点。
'frac_digits'
金額のローカルフォーマットで使用される小数桁数。
'int_frac_digits'
金額の国際フォーマットで使用される小数桁数。
'mon_thousands_sep'
金額に使用されるグループ区切り文字。
'mon_grouping'
'grouping'
と同等で、金銭的価値に使用されます。'positive_sign'
正の金銭的価値に注釈を付けるために使用される記号。
'negative_sign'
負の金銭的価値に注釈を付けるために使用される記号。
'p_sign_posn/n_sign_posn'
記号の位置(正の応答の場合)。 負の値)、以下を参照してください。
すべての数値を CHAR_MAX に設定して、このロケールで値が指定されていないことを示すことができます。
'p_sign_posn'
および'n_sign_posn'
の可能な値を以下に示します。価値
説明
0
通貨と価値は括弧で囲まれています。
1
記号は、値と通貨記号の前に置く必要があります。
2
記号は、値と通貨記号の後に続く必要があります。
3
符号は値の直前にある必要があります。
4
記号は値の直後に続く必要があります。
CHAR_MAX
このロケールでは何も指定されていません。
この関数は、
LC_CTYPE
ロケールをLC_NUMERIC
ロケール、またはロケールが異なり、数値または通貨の文字列が非ASCIIの場合は、LC_MONETARY
ロケールに一時的に設定します。 この一時的な変更は他のスレッドに影響します。バージョン3.7で変更:この関数は、
LC_CTYPE
ロケールをLC_NUMERIC
ロケールに一時的に設定する場合があります。
- locale.nl_langinfo(option)
ロケール固有の情報を文字列として返します。 この機能はすべてのシステムで使用できるわけではなく、可能なオプションのセットもプラットフォームによって異なる場合があります。 可能な引数値は数値であり、ロケールモジュールでシンボリック定数を使用できます。
nl_langinfo()関数は、次のいずれかのキーを受け入れます。 ほとんどの説明は、GNUCライブラリの対応する説明から取得されます。
- locale.CODESET
選択したロケールで使用されている文字エンコードの名前の文字列を取得します。
- locale.D_T_FMT
time.strftime()のフォーマット文字列として使用できる文字列を取得して、ロケール固有の方法で日付と時刻を表します。
- locale.D_FMT
time.strftime()のフォーマット文字列として使用できる文字列を取得して、ロケール固有の方法で日付を表します。
- locale.T_FMT
time.strftime()のフォーマット文字列として使用できる文字列を取得して、ロケール固有の方法で時間を表します。
- locale.T_FMT_AMPM
time.strftime()のフォーマット文字列を取得して、時刻を午前/午後形式で表します。
- DAY_1 ... DAY_7
n番目の曜日の名前を取得します。
ノート
これは、
DAY_1
が日曜日であるという米国の規則に従い、月曜日が週の最初の日であるという国際規則(ISO 8601)ではありません。
- ABDAY_1 ... ABDAY_7
n番目の曜日の省略名を取得します。
- MON_1 ... MON_12
n番目の月の名前を取得します。
- ABMON_1 ... ABMON_12
n番目の月の省略名を取得します。
- locale.RADIXCHAR
基数文字(小数点、小数点カンマなど)を取得します。
- locale.THOUSEP
数千(3桁のグループ)の区切り文字を取得します。
- locale.YESEXPR
はい/いいえの質問に対する肯定的な応答を認識するために正規表現で使用できる正規表現を取得します。
ノート
式は、Cライブラリの
regex()
関数に適した構文であり、 re で使用されている構文とは異なる場合があります。
- locale.NOEXPR
regex(3)関数で使用できる正規表現を取得して、yes / no質問に対する否定的な応答を認識します。
- locale.CRNCYSTR
値の前に記号を表示する場合は「-」、値の後に記号を表示する場合は「+」、または「。」を前に付けた通貨記号を取得します。 記号が基数文字を置き換える必要がある場合。
- locale.ERA
現在のロケールで使用されている時代を表す文字列を取得します。
ほとんどのロケールはこの値を定義していません。 この値を定義するロケールの例は、日本語です。 日本では、伝統的な日付の表現には、当時の天皇の治世に対応する時代の名前が含まれています。
通常、この値を直接使用する必要はありません。 フォーマット文字列で
E
修飾子を指定すると、 time.strftime()関数はこの情報を使用します。 返される文字列の形式は指定されていないため、異なるシステムでその知識があると想定しないでください。
- locale.ERA_D_T_FMT
time.strftime()のフォーマット文字列を取得して、ロケール固有の時代ベースの方法で日付と時刻を表します。
- locale.ERA_D_FMT
time.strftime()のフォーマット文字列を取得して、ロケール固有の時代ベースの方法で日付を表します。
- locale.ERA_T_FMT
time.strftime()のフォーマット文字列を取得して、ロケール固有の時代ベースの方法で時間を表します。
- locale.ALT_DIGITS
0から99の値を表すために使用される最大100個の値の表現を取得します。
- locale.getdefaultlocale([envvars])
デフォルトのロケール設定を決定しようとし、
(language code, encoding)
の形式のタプルとして返します。POSIXによると、
setlocale(LC_ALL, )
を呼び出さなかったプログラムは、ポータブル'C'
ロケールを使用して実行されます。setlocale(LC_ALL,
)
を呼び出すと、LANG
変数で定義されているデフォルトのロケールを使用できます。 現在のロケール設定に干渉したくないので、上記の方法で動作をエミュレートします。他のプラットフォームとの互換性を維持するために、
LANG
変数だけでなく、envvarsパラメーターとして指定された変数のリストもテストされます。 最初に定義されたものが使用されます。 envvars は、デフォルトでGNUgettextで使用される検索パスになります。 常に変数名'LANG'
が含まれている必要があります。 GNU gettext検索パスには、'LC_ALL'
、'LC_CTYPE'
、'LANG'
、'LANGUAGE'
の順に含まれています。コード
'C'
を除いて、言語コードは RFC 1766 に対応します。 言語コードおよびエンコーディングは、値を特定できない場合、None
になる可能性があります。
- locale.getlocale(category=LC_CTYPE)
指定されたロケールカテゴリの現在の設定を、言語コード、エンコーディングを含むシーケンスとして返します。 category は、 LC_ALL を除いて、
LC_*
値の1つである可能性があります。 デフォルトは LC_CTYPE です。コード
'C'
を除いて、言語コードは RFC 1766 に対応します。 言語コードおよびエンコーディングは、値を特定できない場合、None
になる可能性があります。
- locale.getpreferredencoding(do_setlocale=True)
ユーザーの好みに応じて、テキストデータに使用されるエンコーディングを返します。 ユーザー設定はシステムごとに異なって表現され、一部のシステムではプログラムで使用できない場合があるため、この関数は推測のみを返します。
一部のシステムでは、 setlocale()を呼び出してユーザー設定を取得する必要があるため、この関数はスレッドセーフではありません。 setlocaleを呼び出す必要がない、または必要ない場合は、 do_setlocale を
False
に設定する必要があります。AndroidまたはUTF-8モード( -X
utf8
オプション)では、常に'UTF-8'
を返し、ロケールと do_setlocale 引数は無視されます。バージョン3.7で変更:この関数は、Androidで、またはUTF-8モードが有効になっている場合、常に
UTF-8
を返すようになりました。
- locale.normalize(localename)
指定されたロケール名の正規化されたロケールコードを返します。 返されたロケールコードは、 setlocale()で使用できるようにフォーマットされています。 正規化が失敗した場合、元の名前は変更されずに返されます。
指定されたエンコーディングが不明な場合、関数はデフォルトで setlocale()と同様にロケールコードのデフォルトエンコーディングになります。
- locale.resetlocale(category=LC_ALL)
category のロケールをデフォルト設定に設定します。
デフォルト設定は、 getdefaultlocale()を呼び出すことによって決定されます。 category のデフォルトは LC_ALL です。
- locale.strcoll(string1, string2)
- 現在の LC_COLLATE 設定に従って2つの文字列を比較します。 他の比較関数と同様に、 string1 が string2 の前後で照合するか、それと等しいかに応じて、負の値、正の値、または
0
を返します。
- locale.strxfrm(string)
- 文字列を、ロケールを意識した比較で使用できる文字列に変換します。 たとえば、
strxfrm(s1) < strxfrm(s2)
はstrcoll(s1, s2) < 0
と同等です。 この関数は、同じ文字列を繰り返し比較する場合に使用できます。 文字列のシーケンスを照合するとき。
- locale.format_string(format, val, grouping=False, monetary=False)
現在の LC_NUMERIC 設定に従って、数値 val をフォーマットします。 形式は、
%
演算子の規則に従います。 浮動小数点値の場合、必要に応じて小数点が変更されます。 grouping がtrueの場合、グループ化も考慮に入れます。money がtrueの場合、変換では数千の区切り文字とグループ化文字列が使用されます。
format % val
のようにフォーマット指定子を処理しますが、現在のロケール設定を考慮に入れます。バージョン3.7で変更: money キーワードパラメーターが追加されました。
- locale.format(format, val, grouping=False, monetary=False)
この関数は format_string()のように機能しますが、1つの
%char
指定子に対してのみ機能することに注意してください。 たとえば、'%f'
と'%.0f'
はどちらも有効な指定子ですが、'%f KiB'
はそうではありません。フォーマット文字列全体の場合は、 format_string()を使用します。
バージョン3.7以降非推奨:代わりに format_string()を使用してください。
- locale.currency(val, symbol=True, grouping=False, international=False)
現在の LC_MONETARY 設定に従って、数値 val をフォーマットします。
symbol がtrueの場合、返される文字列には通貨記号が含まれます。これがデフォルトです。 grouping がtrue(デフォルトではない)の場合、グループ化は値を使用して行われます。 international がtrueの場合(これはデフォルトではありません)、国際通貨記号が使用されます。
この関数は「C」ロケールでは機能しないため、最初に setlocale()を使用してロケールを設定する必要があることに注意してください。
- locale.str(float)
- 組み込み関数
str(float)
と同じ形式を使用して浮動小数点数をフォーマットしますが、小数点を考慮に入れます。
- locale.delocalize(string)
LC_NUMERIC 設定に従って、文字列を正規化された数値文字列に変換します。
バージョン3.5の新機能。
- locale.atof(string)
- LC_NUMERIC 設定に従って、文字列を浮動小数点数に変換します。
- locale.atoi(string)
- LC_NUMERIC の規則に従って、文字列を整数に変換します。
- locale.LC_CTYPE
- 文字タイプ関数のロケールカテゴリ。 このカテゴリの設定に応じて、ケースを処理するモジュール string の機能が動作を変更します。
- locale.LC_TIME
- 時間のフォーマットのロケールカテゴリ。 関数 time.strftime()は、これらの規則に従います。
- locale.LC_MONETARY
- 金銭的価値をフォーマットするためのロケールカテゴリ。 使用可能なオプションは、 localeconv()関数から使用できます。
- locale.LC_MESSAGES
- メッセージ表示のロケールカテゴリ。 Pythonは現在、アプリケーション固有のロケール対応メッセージをサポートしていません。 os.strerror()によって返されるメッセージなど、オペレーティングシステムによって表示されるメッセージは、このカテゴリの影響を受ける可能性があります。
- locale.LC_NUMERIC
- 数値をフォーマットするためのロケールカテゴリ。 locale の関数 format()、 atoi()、 atof()、 str()モジュールはそのカテゴリの影響を受けます。 他のすべての数値フォーマット操作は影響を受けません。
- locale.LC_ALL
- すべてのロケール設定の組み合わせ。 ロケールが変更されたときにこのフラグが使用されると、すべてのカテゴリーのロケールの設定が試行されます。 いずれかのカテゴリでそれが失敗した場合、カテゴリはまったく変更されません。 このフラグを使用してロケールを取得すると、すべてのカテゴリの設定を示す文字列が返されます。 この文字列は、後で設定を復元するために使用できます。
- locale.CHAR_MAX
- これは、 localeconv()によって返されるさまざまな値に使用されるシンボリック定数です。
例:
>>> import locale
>>> loc = locale.getlocale() # get current locale
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
背景、詳細、ヒント、ヒント、警告
C標準では、ロケールをプログラム全体のプロパティとして定義しており、変更に比較的費用がかかる可能性があります。 その上、いくつかの実装は、頻繁なロケール変更がコアダンプを引き起こす可能性があるような方法で壊れています。 これにより、ロケールを正しく使用するのがやや面倒になります。
最初、プログラムが開始されると、ユーザーの優先ロケールに関係なく、ロケールはC
ロケールになります。 例外が1つあります。起動時に LC_CTYPE カテゴリが変更され、現在のロケールエンコーディングがユーザーの優先ロケールエンコーディングに設定されます。 プログラムは、setlocale(LC_ALL, )
を呼び出して、他のカテゴリのユーザーの優先ロケール設定が必要であることを明示的に指定する必要があります。
副作用としてプログラム全体に影響を与えるため、一部のライブラリルーチンで setlocale()を呼び出すことは一般的に悪い考えです。 保存と復元はほとんど同じくらい悪いです:それは高価であり、設定が復元される前にたまたま実行される他のスレッドに影響を与えます。
一般的な使用のためにモジュールをコーディングするときに、ロケールの影響を受ける操作のロケールに依存しないバージョン( time.strftime()で使用される特定の形式など)が必要な場合は、標準ライブラリルーチンを使用せずにそれを行う方法。 さらに良いのは、ロケール設定を使用しても問題がないことを自分に納得させることです。 最後の手段としてのみ、モジュールがC
以外のロケール設定と互換性がないことを文書化する必要があります。
ロケールに従って数値演算を実行する唯一の方法は、このモジュールで定義されている特別な関数 atof()、 atoi()、 format()を使用することです。 ]、 str()。
ロケールに応じて大文字と小文字の変換と文字分類を実行する方法はありません。 (Unicode)テキスト文字列の場合、これらは文字値のみに従って実行されますが、バイト文字列の場合、変換と分類は、バイトのASCII値、および上位ビットが設定されているバイト(つまり、非ASCIIバイト)に従って実行されます。 )は、文字や空白などの文字クラスの一部として変換または考慮されることはありません。
Pythonを組み込んだ拡張機能の作成者とプログラムの場合
拡張モジュールは、現在のロケールを確認する場合を除いて、 setlocale()を呼び出さないでください。 ただし、戻り値は移植可能に使用して復元することしかできないため、あまり役に立ちません(ロケールがC
であるかどうかを確認する場合を除く)。
Pythonコードが locale モジュールを使用してロケールを変更する場合、これは埋め込みアプリケーションにも影響します。 埋め込みアプリケーションがこれを望まない場合は、config.c
ファイルの組み込みモジュールのテーブルから_locale
拡張モジュール(すべての作業を行う)を削除する必要があります。 _locale
モジュールが共有ライブラリとしてアクセスできないことを確認してください。
メッセージカタログへのアクセス
- locale.gettext(msg)
- locale.dgettext(domain, msg)
- locale.dcgettext(domain, msg, category)
- locale.textdomain(domain)
- locale.bindtextdomain(domain, dir)
ロケールモジュールは、このインターフェイスを提供するシステムでCライブラリのgettextインターフェイスを公開します。 機能gettext()
、dgettext()
、dcgettext()
、textdomain()
、bindtextdomain()
、およびbind_textdomain_codeset()
で構成されています。 これらは gettext モジュールの同じ関数に似ていますが、メッセージカタログにはCライブラリのバイナリ形式を使用し、メッセージカタログを見つけるにはCライブラリの検索アルゴリズムを使用します。
Pythonアプリケーションは通常、これらの関数を呼び出す必要がないことを認識し、代わりに gettext を使用する必要があります。 このルールの既知の例外は、gettext()
またはdcgettext()
を内部的に呼び出す追加のCライブラリとリンクするアプリケーションです。 これらのアプリケーションでは、ライブラリがメッセージカタログを適切に見つけることができるように、テキストドメインをバインドする必要がある場合があります。