0

Я выполнил документацию Django для настройки интернационализации.django rest framework как интернационализировать поля

Мне нужно вернуть перевод различных полей выбора в зависимости от запрашиваемого языка.

Например, у меня есть следующие поля выбора;

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

У меня установлены файлы Locale и .po в соответствии с документацией. Например;

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

Я запрашиваю язык, используя заголовок Accept-Language по запросу.

Но кажется, что Django не видит языковой стандарт, или есть еще один шаг, который я не предпринял для DRF.

Django видит запрос языка, поскольку я использую django-hvad для перевода модели, и они возвращаются правильно.

Любая помощь будет оценена по достоинству.

Edit: Добавлен соответствующий код извлекает

Settings.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') 

serializers.py

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

В локали/я/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 
+0

Вы вызывали 'python manage.py compilemessages' в системе, где работает ваш сервер? – schwobaseggl

+0

Можете ли вы включить шаги и код для воспроизведения проблемы? – Marat

ответ

0

Сухость с моей стороны. Это был отличный перевод, я просто не назвал его корректным в сериализаторе.

В моем сериализаторе у меня было;

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()