2010-05-30 4 views
25

L'internazionalizzazione di Django è molto bella (basata su gettext, LocaleMiddleware), ma qual è il modo corretto di tradurre il nome del modello e gli attributi per le pagine di amministrazione? Non ho trovato nulla di questo nella documentazione:Internazionalizzazione di Django per pagine di amministrazione - traduce il nome e gli attributi del modello

Vorrei avere "Выберите заказ для изменения" invece di "Выберите ordine для изменения". Nota, l''ordine' non è tradotto.

Innanzitutto, ho definito un modello, attivato USE_I18N = True in settings.py, eseguito django-admin makemessages -l ru. Per impostazione predefinita non vengono create voci per i nomi e gli attributi del modello.

grep nel codice sorgente di Django ho trovato:

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

Così il verbose_name meta di proprietà sembra giocare un qualche ruolo qui. Provato ad usarlo:

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

Ora il po file aggiornato contiene msgid 'order' che può essere tradotto. Quindi inserisco la traduzione. Purtroppo le pagine di amministrazione mostrano lo stesso mix di "Выберите order для изменения".

Attualmente sto usando Django 1.1.1. Qualcuno potrebbe indicarmi la documentazione pertinente? Perché google non può. ;-) Nel frattempo sarò scavare più a fondo nel codice sorgente di Django ...

+2

Mi dispiace chiedere, ma dopo aver aggiornato il file .po hai eseguito ./manage.py makemessages per aggiornare il file .mo? –

+1

'makemessages' aggiorna solo i file po. Penso che tu intenda 'django-admin compilemessages' - grazie per il tuo suggerimento! Ho pensato perché Python è un linguaggio dinamico , i file di traduzione non sono compilato, in opposto a C. Purtroppo la mia soluzione ancora non funziona fornire una traduzione misto (lingue sono misti in una frase). Per il nome del modello viene utilizzata l'impostazione LANGUAGE_CODE del progetto. La lingua per il messaggio rimanente è determinata da l'agente utente ('Accept-Languages'). Mi sottoporrò all'esperimento con una traduzione lenta e dirò se funziona . – geekQ

risposta

35

cose importanti non menzionati nella documentazione Django:

  • corsa django-admin compilemessages, per esempio come parte del processo di build . Grazie stevejalim!
  • applicano Django di ugettext_lazy() modellare nomi (Meta classe e verbose_name)
  • attributo (campo Modello verbose_name) i nomi possono essere tradotti con ugettext_lazy()
  • utilizzo traduzione pigro nei metadati del modello, altrimenti la traduzione avviene durante il caricamento del le classi di modelli e le impostazioni dei tuoi utenti, , in particolare le impostazioni del browser, non saranno prese in considerazione
  • Io uso alcuni ambiti per i nomi degli attributi, ad esempio separando il nome del modello e i nomi degli attributi con una pipe. La stessa convenzione viene utilizzata in ruby-gettext. Sfondo: nomi di attributi come "titolo" o "nome" tradotti in modo diverso nella maggior parte delle lingue a seconda del contesto. Esempio "Libro | titolo" -> "Titel" o "Buchtitel" in tedesco. Ma 'Chapter | title' sarebbe tradotto come 'Überschrift'.

esempio utilizzando principi di cui sopra:

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

O c'è un modo migliore per tradurre le pagine modello e di amministrazione?

In entrambi i casi dovremmo migliorare la documentazione di Django e colmare il divario!

+2

cambiando ugettext a ugettext_lazy ha funzionato per me. Grazie mille !!! – Sakuraba

+0

Sto usando ugettext_lazy, ma sfortunatamente non funziona per me. –

+1

Ho fatto tutto questo, ma non riesco ancora a ottenere i nomi dei modelli e i campi da tradurre –