表示形式のローカル化

オーバービュー

Django の表示形式システムは、カレント ロケール に合った表示形式を使って日付、時刻、数値をテンプレート内で表示することができます。また、フォームでのローカル化された入力も処理します。

この機能が有効のとき、同じコンテンツにアクセスする 2 人のユーザは、違う形で日付、時刻、数値を目にすることになるでしょう。これは、彼らのカレントロケールに対する表示形式に依存します。

デフォルトでは、表示形式システムは無効になっています。有効化するには、設定ファイル内の USE_L10N = True をセットする必要があります。

注釈

django-admin startproject によって生成されるデフォルトの settings.py ファイルは、利便性のために USE_L10N = True を含んでいます。ただし、1000 区切りでの数値表示を有効にするためには、設定ファイル内で USE_THOUSAND_SEPARATOR = True にすることに注意してください。別の方法として、テンプレート内で数値の表示形式を指定するために intcomma を使うこともできます。

注釈

ほかにも、独立はしていますが、関連する USE_I18N 設定もあります。これは、Django が表示形式のローカル化を有効にするかどうかをコントロールします。詳しくは 翻訳 を参照してください。

フォームでのロケールを認識する入力

表示形式機能が有効のとき、Django がフォーム内で日付、時刻、数値を描画する際に、ローカル化された表示形式を使用することができます。フォームにデータが入力されたとき、ユーザによって使用される表示形式を推測し、異なるロケールに対する異なる表示形式を試みることを意味します。

注釈

Django は、データを描画するために使うものに対して、データを表示するための異なる表示形式を使います。特に、日付を描画するための表示形式は、%a (省略された曜日名)、%A (曜日名), %b (省略された月名)、%B (月名)、%p (AM/PM) を使うことができません。

フォームフィールドにローカル化された入力を有効化してデータを出力するには、単に localize 引数を使ってください:

class CashRegisterForm(forms.Form):
   product = forms.CharField()
   revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)

テンプレート内でローカル化をコントロールする

USE_L10N で表示形式を有効にしたとき、Django はテンプレート内で値が出力されたときはいつでもロケールに対応した表示形式を使います。

しかし、ローカル化された値を使うことが適切ではないこともあります – 例えば、機械可読的に絵座員された JavaScript や XML を出力している場合、常にローカル化されていない値が必要でしょう。また、全ての場所でローカル化を適用するのではなく、特定のテンプレートだけで使いたいときもあるかもしれません。

ローカル化の仕様について細かいコントロールをするために、Django は l10n テンプレートライブラリを提供しています。これは、以下のタグやフィルタを含んでいます。

テンプレートタグ

localize

ブロック内で、テンプレート変数のローカル化を有効化または無効化します。

このタグでは、USE_L10N よりも細かい粒度のローカル化のコントロールができます。

テンプレートブロックに対してローカル化を有効化または無効化するためには、以下を使ってください:

{% load l10n %}

{% localize on %}
    {{ value }}
{% endlocalize %}

{% localize off %}
    {{ value }}
{% endlocalize %}

注釈

USE_L10N の値は、{% localize %} ブロック内では尊重されません。

各変数ベースで同じ仕事をするテンプレートフィルタについて、localizeunlocalize を参照してください。

テンプレートフィルタ

localize

単数のローカル化を強制します。

For example:

{% load l10n %}

{{ value|localize }}

単数のローカル化を無効化するには、unlocalize を使ってください。テンプレートの大きな範囲を通じてローカル化をコントロールするには、localize テンプレートタグを使ってください。

unlocalize

単数形がローカル化されずに表示されるように強制します。

For example:

{% load l10n %}

{{ value|unlocalize }}

単数のローカル化を強制するには、localize を使ってください。テンプレートの大きな範囲を通じてローカル化をコントロールするには、localize テンプレートタグを使ってください。

独自の表示形式ファイルを作成する

Django は多くのロケールに対して表示形式の定義を準備していますが、あなたのロケールに対して表示形式ファイルが存在しなかったり、値のいくつかを上書きしたいときには、独自の定義を作成したいこともあるでしょう。

独自の表示形式を使うには、最初に表示形式を設置するパスを指定してください。そのために、FORMAT_MODULE_PATH 設定を表示形式ファイルを置く予定のパッケージにセットしてください。例えば:

FORMAT_MODULE_PATH = [
    'mysite.formats',
    'some_app.formats',
]

Files are not placed directly in this directory, but in a directory named as the locale, and must be named formats.py. Be careful not to put sensitive information in these files as values inside can be exposed if you pass the string to django.utils.formats.get_format() (used by the date template filter).

To customize the English formats, a structure like this would be needed:

mysite/
    formats/
        __init__.py
        en/
            __init__.py
            formats.py

where formats.py contains custom format definitions. For example:

from __future__ import unicode_literals

THOUSAND_SEPARATOR = '\xa0'

to use a non-breaking space (Unicode 00A0) as a thousand separator, instead of the default for English, a comma.

提供されているロケール表示形式の限界

いくつかのロケールは、数字に対して文脈依存の表示形式を使います。これは、Django のローカル化システムでは自動的に扱うことはできません。

スイス (ドイツ語)

スイスの数値の表示形式は、対象となる数字の種類によって決まります。貨幣の値に対しては、カンマが 1000 区切りに使われ、小数点が小数区切りに使われます。他の数字に対しては、カンマは小数区切りとして使われ、空白が 1000 区切りとして使われます。Django によって提供されるロケール表示形式は、一般的な区切り文字、つまり小数にはカンマそして1000 区切りには空白を使用します。