2009-08-25 4 views
5

Von Django Dokumentation:Mit settings.LANGUAGES mit richtig übersetzt Namen gettext()

Wenn Sie eine benutzerdefinierte LANGUAGES Einstellung definieren, es ist OK, um die Sprachen als Übersetzungs-Strings zu markieren (wie in der Standard Wert angezeigt) - aber Verwenden Sie eine "Dummy" gettext() Funktion, nicht die in django.utils.translation. Sie sollten importieren nie django.utils.translation aus Ihre Einstellungsdatei, denn das Modul an sich auf den Einstellungen abhängt, und das wäre ein Kreis Import verursachen. Die Lösung ist verwenden Sie eine "Dummy" gettext() Funktion. Hier ist eine Beispieleinstellungsdatei:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

Mit dieser Anordnung django-admin.py makemessages noch diese Zeichenfolge für die Übersetzung, aber die Übersetzung bei Laufzeit wird nicht passieren, finden und markieren - - so müssen Sie sich an erinnern, um die Sprachen in die reale gettext() in irgendeinem Code zu verpacken, der LANGUAGES verwendet zur Laufzeit.

Was bedeutet es genau Sprachen in echte gettext() zu wickeln? Wie soll es im Code heißen?

Antwort

3

Genau das, was es sagt: call gettext() auf den Sprachennamen, wenn Sie sie tatsächlich verwenden oder sie dem Benutzer zeigen:

from django.utils.translation import ugettext 

for lang_code, lang_name in settings.LANGUAGES: 
    translated_name = ugettext(lang_name) 
    ... 

(Sie in der Regel ugettext statt gettext verwenden sollte, da alle Texte in Django ist Unicode)

das Äquivalent in einer Vorlage zu tun, verwenden Sie einfach die {% blocktrans%} Tag, das hinter den Kulissen nur nennt ugettext.

{% for lang in LANGUAGES %} 
    {% blocktrans %}{{ lang.1 }}{% endblocktrans %} 
{% endfor %} 
+0

Diese Methode ziemlich stright ist nach vorn und verständlich. Aber in diesem Fall ist der Punkt der Verwendung eines Dummy-Wrappers in den settings.LANGUAGES? Da Sie ohnehin jede Zeile im Code umbrechen müssen, ist dies der Punkt der Wrapper-Funktion, der im Tutorial vorgeschlagen wird. –

+2

Wenn Sie das gettext-Befehlszeilentool über Ihren Quelltextbaum ausführen (wahrscheinlich über ./manage.py makemessages), möchten Sie, dass diese Zeichenfolgen als "Übersetzung erforderlich" erkannt werden, damit sie Ihrer PO-Datei hinzugefügt werden. –

0

das ist neu Verbündeter einen Kommentar und eine weitere Erklärung zu dem oben genannten Q & A. Ich konnte meine Übersetzungen nicht zum Arbeiten bringen, die Dokumente lesen und erneut lesen, stundenlang online suchen, und nach dem Lesen dieses Beitrags stellte ich fest, dass es sich um Folgendes handelte:

ich hatte ursprünglich:

LANGUAGES = (
    ('en', 'English'), 
    ('nl', 'Dutch'), 
    ) 

Welche nicht funktionieren würde, dann versucht diese

nach der Lektüre
ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ) 

die alles Arbeit gemacht ... und ich suchte gerade für diese und es ist in der doc https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, in Richtung der Botto m dieses Abschnitts ...

0

in Vorlage könnten Sie tun, nur die folgenden:

{% for lang in LANGUAGES %} 
     {% trans lang.1 %} 
{% endfor %} 
2

Nach dem latest docs Sie ugettext_lazy in Einstellungen, ohne dass Kreis Importe verwenden können:

from django.utils.translation import ugettext_lazy as _ 

LANGUAGES = [ 
    ('de', _('German')), 
    ('en', _('English')), 
]