0

Ich habe die Django-Dokumentation für die Einrichtung der Internationalisierung gefolgt.django Rest Framework wie Felder zu internationalisieren

Ich benötige eine Übersetzung der verschiedenen Auswahlfelder abhängig von der Sprache angefordert.

Zum Beispiel habe ich die folgenden Auswahlfelder;

Ich habe meine Locale und .po Dateien gemäß der Dokumentation eingerichtet. Beispielsweise;

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

Ich Anfrage die Sprache mit dem Accept-Language-Header auf eine Anfrage.

Aber es scheint, dass Django das Gebietsschema nicht sieht oder es gibt einen weiteren Schritt, den ich für DRF nicht unternommen habe.

Django sieht die Sprachanfrage, da ich django-hvad für Modellübersetzungen verwende und sie korrekt zurückgegeben werden.

Jede Hilfe wäre willkommen.

Edit: Hinzugefügt entsprechenden Code extrahiert

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

In 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" 

Und schließlich habe ich lief wie folgt Befehle;

$ ./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

Haben Sie 'python manage.py compilemessages' auf dem System aufgerufen, auf dem Ihr Server läuft? – schwobaseggl

+0

Können Sie Schritte und Code hinzufügen, um das Problem zu reproduzieren? – Marat

Antwort

0

Albernheit meinerseits. Es wurde gut übersetzt, ich habe es im Serializer nicht korrekt aufgerufen.

In meinem Serialisierer hatte ich;

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

Während ich den Anzeigenamen für 'term' wie folgt angefordert haben sollte;

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

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