2010-05-30 5 views
25

L'internationalisation de Django est très agréable (basée sur gettext, LocaleMiddleware), mais quelle est la bonne façon de traduire le nom du modèle et les attributs des pages d'administration? Je ne trouve rien à ce sujet dans la documentation:L'internationalisation de Django pour les pages d'administration - traduire le nom et les attributs du modèle

je voudrais avoir "Выберите заказ для изменения" au lieu de "l'ordre Выберите для изменения". Notez que la 'commande' n'est pas traduite.

D'abord, j'ai défini un modèle, activé USE_I18N = True dans settings.py, exécutez django-admin makemessages -l ru. Aucune entrée n'est créée par défaut pour les noms de modèles et les attributs.

Grepping dans le code source Django j'ai trouvé:

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

Ainsi, la propriété verbose_name méta semble jouer un rôle ici. Essayé de l'utiliser:

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

Maintenant le fichier mis à jour contient pomsgid 'order' qui peut être traduit. J'ai donc mis la traduction en. Malheureusement, l'exécution des pages admin montre le même mélange de "Выберите order для изменения". J'utilise actuellement Django 1.1.1. Quelqu'un pourrait-il me diriger vers la documentation pertinente? Parce que google ne peut pas. ;-) En attendant, je vais creuser plus profondément dans le code source django ...

+2

Désolé de demander, mais après avoir mis à jour le fichier .po avez-vous exécuté ./manage.py makemessages pour mettre à jour le fichier .mo? –

+1

'makemessages' ne fait que mettre à jour les fichiers po. Je pense que vous voulez dire 'compilemessages django-admin' - merci vous pour votre indice! Je pensais que Python est un langage dynamique , les fichiers de traduction ne sont pas compilé, en face de C. Malheureusement, ma solution ne fonctionne toujours pas fournir une traduction mixte (langues sont mixtes en une seule phrase). Pour le nom du modèle, le paramètre LANGUAGE_CODE du projet est utilisé. La langue pour le message restant est déterminée par l'agent utilisateur ('Accept-Languages'). Je vais expérimenter avec la traduction paresseuse et dire si ça fonctionne . – geekQ

Répondre

35

choses importantes ne sont pas mentionnées dans la documentation Django:

  • run django-admin compilemessages, par exemple dans le cadre de votre processus de construction . Merci stevejalim!
  • appliquent les noms ugettext_lazy() de django aux noms de modèle (Meta de classe et verbose_name)
  • attribut (champ modèle verbose_name) peuvent également être traduits avec ugettext_lazy()
  • utiliser la traduction paresseuse dans vos métadonnées de modèle, sinon la traduction arrive lors du chargement de la les classes du modèle et les paramètres de vos utilisateurs, en particulier les paramètres du navigateur, ne seront pas pris en compte
  • J'utilise une certaine portée pour les noms d'attribut, par exemple séparer le nom du modèle et attribuer des noms à un tuyau. La même convention est utilisée dans ruby-gettext. Contexte: les noms d'attribut tels que 'title' ou 'name' traduits différemment dans la plupart des langues selon le contexte. Exemple 'Livre | titre' -> 'Titel' ou 'Buchtitel' en allemand. Mais 'Chapter | title' serait traduit par 'Überschrift'.

Exemple en utilisant les principes ci-dessus:

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

Ou est-il une meilleure façon de traduire les pages de modèle et d'administration?

De toute façon nous devrions améliorer la documentation de Django et combler le vide!

+2

en changeant ugettext à ugettext_lazy travaillé pour moi.Merci tellement !!! – Sakuraba

+0

J'utilise ugettext_lazy, mais malheureusement ça ne marche pas pour moi. –

+1

J'ai tout fait, mais je n'arrive toujours pas à traduire les noms et champs des modèles –

Questions connexes