2010-05-30 13 views
25

Djangos Internationalisierung ist sehr schön (Gettext basiert, LocaleMiddleware), aber was ist der richtige Weg, um den Modellnamen und die Attribute für Admin-Seiten zu übersetzen? Ich habe etwas über diese nicht in der Dokumentation:Django Internationalisierung für Admin-Seiten - übersetzen Modellnamen und Attribute

Ich möchte "Выберите заказ для изменения" statt "Выберите um для изменения" haben. Beachten Sie, dass die 'Bestellung' nicht übersetzt wird.

Zuerst habe ich ein Modell definiert, aktiviert USE_I18N = True in settings.py, führen Sie django-admin makemessages -l ru. Für Modellnamen und Attribute werden standardmäßig keine Einträge erstellt.

greppen im Code Django Quelle gefunden:

$ ack "Select %s to change" 
contrib/admin/views/main.py 
70:  self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s to change') % force_unicode(self.opts.verbose_name)) 

So ist die verbose_name Meta Eigenschaft scheint hier eine gewisse Rolle zu spielen. Versucht, es zu benutzen:

class Order(models.Model): 
    subject = models.CharField(max_length=150) 
    description = models.TextField() 
    class Meta: 
     verbose_name = _('order') 

nun die aktualisierte po Datei enthält msgid 'order', die übersetzt werden kann. Also lege ich die Übersetzung in. Leider laufen die Admin-Seiten zeigen die gleiche Mischung von "Выберите спорт для изменения".

Ich verwende derzeit Django 1.1.1. Kann mir jemand auf die relevante Dokumentation verweisen? Weil Google nicht kann. ;-) In der Zwischenzeit werde ich tiefer in die django Quellcode graben ...

+2

Entschuldigen Sie die Frage, aber nachdem Sie die .po-Datei aktualisiert haben, haben Sie ./manage.py Makemessages ausgeführt, um die .mo-Datei zu aktualisieren? –

+1

'makemessages' aktualisiert nur die po-Dateien. Ich denke, Sie meinen 'Django-Admin Compilemessages' - danke Sie für Ihren Hinweis! Ich dachte, weil Python eine dynamische Sprache ist, sind die Übersetzungsdateien nicht kompilierte, im Gegensatz zu C. leider noch meine Lösung nicht funktioniert eine gemischte Übersetzung liefern (Sprachen sind in einem Satz gemischt). Für den Modellnamen wird die Einstellung LANGUAGE_CODE des Projekts verwendet. Die Sprache für die verbleibende Nachricht wird durch der Benutzer-Agent ("akzeptieren-Sprachen") bestimmt. Ich werde mit fauler Übersetzung experimentieren und sagen, ob es funktioniert. – geekQ

Antwort

35

Wichtige Dinge nicht in der Dokumentation Django erwähnt:

  • Lauf django-admin compilemessages, z.B. als Teil Ihrer Build Prozess. Danke stevejalim!
  • gelten Djangos ugettext_lazy() Namen zu modellieren (Meta Klasse und verbose_name)
  • Attribut (Modellfeld verbose_name) Namen auch mit ugettext_lazy()
  • Verwendung faul Übersetzung in Ihrem Modell Metadaten übersetzt werden kann, da sonst die Übersetzung geschieht, während das Laden Modellklassen und die Einstellungen Ihrer Benutzer, vor allem die Browsereinstellungen, werden nicht berücksichtigt
  • Ich verwende einige Scoping für Attributnamen, z Trennen Sie den Modellnamen und Attributnamen mit einer Pipe. Die gleiche Konvention wird in ruby-gettext verwendet. Hintergrund: Attributnamen wie 'title' oder 'name' werden in den meisten Sprachen je nach Kontext unterschiedlich übersetzt . Beispiel 'Buch | Titel' -> 'Titel' oder 'Buchtitel' auf Deutsch. Aber "Kapitel | Titel" würde als "Überschrift" übersetzt werden.

Beispiel unter Verwendung der oben Prinzipien:

from django.utils.translation import ugettext_lazy as _ 
class Order(models.Model): 
    subject = models.CharField(max_length=150, verbose_name = _('Order|subject')) 
    description = models.TextField(   verbose_name = _('Order|description')) 
    class Meta: 
     verbose_name = _('order') 
     verbose_name_plural = _('orders') 

Oder gibt es einen besseren Weg, das Modell und die Admin-Seiten zu übersetzen?

In jedem Fall sollten wir die Django-Dokumentation verbessern und die Lücke füllen!

+2

Das Ändern von Ugettext zu Ugettext_lazy hat für mich funktioniert. Vielen Dank !!! – Sakuraba

+0

Ich benutze Ugettext_lazy, aber leider funktioniert das nicht für mich. –

+1

Ich habe das alles gemacht, kann aber die Modellnamen und Felder noch nicht übersetzen lassen –

Verwandte Themen