Django的命令会忽略USE_I18N的设定
简要介绍
- Django で I18N 対応 されたメッセージを取得しようとした時うまく取得できなかったという話
环境
确认环境
-
- Mac OS X 10.11.5
-
- Python3.5
- Django1.9
前提 tí)
- Django で settingsの内容を下記のように設定する
LANGUAGE_CODE = 'ja'
USE_I18N = True
- 上記の様に設定すれば、I18N対応した日本語メッセージがあれば下記のようにして日本語のメッセージが取得できる。
from django.utils.translation import ugettext_lazy as _
_('Hello') # => こんにちわ
在Django的Command中无法获取
-
- django-localflaover というパッケージがあって、ISO 3166-2:JP で定義された、日本の都道府県情報を取得できる。
- 都道府県名はI18N対応されていて、日本語名で都道県名が取得できる。
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES
dict(JP_PREFECTURE_CODES)['13'] # => 東京都
-
- 上記をrunserverしたDjangoアプリから読んだりすると「東京都」という値が取得できる
- だが下記のようにDjangoのCommand内で呼ぶと、「Tokyo」が返ってくる
from django.core.management.base import BaseCommand
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES
class Command(BaseCommand):
def handle(self, *args, **options):
print(dict(JP_PREFECTURE_CODES)['13']) # => Tokyo
なんだよ!国際オリンピック委員会第8代会長 ジャック・ロゲ氏かよ!? と突っ込みたくなる一品。
为什么呢?
默认情况下,BaseCommand.execute()方法会禁用翻译,因为Django附带的一些命令执行多个任务(例如用户界面内容渲染和数据库填充),这些任务需要使用与项目无关的字符串语言。
参考链接:https://docs.djangoproject.com/ja/1.9/howto/custom-management-commands/#management-commands-and-locales
-
- アッ!ハイ!
-
- つまりDjangoのデフォルトのコマンド類が、translateされてると都合が悪いのでI18Nはオフになってるとのこと
- これは「manage.py shell」などのコマンドも同様です。
应对方法
- Commandのクラス変数に「leave_locale_alone=True」を付ければ良い。
from django.core.management.base import BaseCommand
from localflavor.jp.jp_prefectures import JP_PREFECTURE_CODES
class Command(BaseCommand):
leave_locale_alone = True
def handle(self, *args, **options):
print(dict(JP_PREFECTURE_CODES)['13']) # => 東京
请参考
-
- Writing custom django-admin commands > Management commands and locales
- Writing custom django-admin commands > BaseCommand.leave_locale_alone