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
广告
将在 10 秒后关闭
bannerAds