【问题标题】:django rest framework how to internationalize fieldsdjango rest框架如何将字段国际化
【发布时间】:2017-02-21 17:48:08
【问题描述】:

我已按照 Django 文档设置国际化。

我需要根据请求的语言返回各种选择字段的翻译。

例如,我有以下选择字段;

CHOICE_TYPES = (('short', _('Short Term')),('long', _('Long Term')), ('mixed', _('Mixed')),)

我已经按照文档设置了我的 Locale 和 .po 文件。例如;

msgid "Short Term"
msgstr "단기계약"

我在请求中使用 Accept-Language 标头请求语言。

但似乎 Django 没有看到语言环境,或者我还没有为 DRF 采取其他步骤。

当我使用 django-hvad 进行模型翻译时,Django 确实看到了语言请求,并且它们被正确返回。

任何帮助将不胜感激。

编辑:添加相关代码摘录

设置.py

LANGUAGES = [
    ('en', _('English')),
    ('ja', _('Japanese')),
]

LANGUAGE_CODE = 'en-us'

USE_I18N = True
USE_L10N = True

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.locale.LocaleMiddleware',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# replicated locale folder in 3 locations as I thought Django couldn't find it 
LOCALE_PATHS = (
    '../locale',
    '<full_path>locale',
    '<full_path>/<app_name>/locale',
)

models.py

from django.utils.translation import ugettext_lazy as _

CHOICES = (('short', _('Short Term')),('long', _('Long Term')), ('mixed', _('Mixed')),)

# In the relevant model/s
term = models.CharField(max_length=10, choices=CHOICES, default='short')

序列化器.py

class SomethingSerializer(TranslatableModelSerializer):
    class Meta:
        depth = 1
        model = Something
        fields = (...., ...., 'term')

在 locale/ja/LC_MESSAGES

django.po

msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Translated-Using: django-rosetta 0.7.12\n"

#: common/models.py:8
msgid "Short Term"
msgstr "test translation"

最后我运行了如下命令;

$ ./manage.py makemessages -l ja
processing locale ja
$ ./manage.py compilemessages -l ja
processing file django.po in /<Path>/locale/ja/LC_MESSAGES
processing file django.po in /<Path>/locale/ja/LC_MESSAGES
processing file django.po in /<Path>/<App Name>/locale/ja/LC_MESSAGES

【问题讨论】:

  • 您是否在服务器运行的系统上调用了python manage.py compilemessages
  • 能否包含重现问题的步骤和代码?

标签: python django python-3.x internationalization django-rest-framework


【解决方案1】:

我的愚蠢。它翻译得很好,我只是没有在序列化程序中正确调用它。

在我的序列化程序中;

class SomethingSerializer(TranslatableModelSerializer):
    class Meta:
        depth = 1
        model = Something
        fields = (...., ...., 'term')

而我应该请求“术语”的显示名称,如下所示;

class SomethingSerializer(TranslatableModelSerializer):
    term = serializers.SerializerMethodField()
    class Meta:
        depth = 1
        model = Something
        fields = (...., ...., 'term')

  def get_term(self,obj):
    return obj.get_term_display()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2018-10-14
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多