2010-05-30 28 views
25

Umiędzynarodowienie Django jest bardzo miłe (oparte na gettext, LocaleMiddleware), ale jaki jest właściwy sposób tłumaczenia nazwy modelu i atrybutów dla stron administracyjnych? Nie mogę znaleźć nic na ten temat w dokumentacji:Internacjonalizacja Django dla stron administracyjnych - przetłumacz nazwy modelu i atrybuty

chciałbym mieć "Выберите заказ для изменения" zamiast "Выберите celu для изменения". Uwaga: "zamówienie" nie jest tłumaczone.

Najpierw zdefiniowałem model, aktywowałem USE_I18N = True w settings.py, uruchom django-admin makemessages -l ru. Dla nazw modeli i atrybutów domyślnie nie są tworzone żadne wpisy.

grepping w kodzie źródłowym Django znalazłem:

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

Więc nieruchomość meta verbose_name wydaje się odgrywać pewną rolę. Próbowaliśmy go używać:

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

Teraz aktualizowane po plik zawiera msgid 'order' które mogą być tłumaczone. Więc umieściłem tłumaczenie. Niestety uruchomienie stron administracyjnych pokazuje tę samą mieszankę "Выберите order для изменения".

Aktualnie używam Django 1.1.1. Czy ktoś może wskazać mi odpowiednią dokumentację? Bo google nie może. ;-) W tym czasie będę kopać głębiej w kodzie źródłowym Django ...

+2

Przepraszamy, ale po aktualizacji pliku .po uruchomiłeś ./manage.py makemessages, aby zaktualizować plik .mo? –

+1

'makemessages' aktualizuje tylko pliki po. Myślę, że masz na myśli 'django-admin compilemessages' - dziękuję za twoją podpowiedź! Myślałam, ponieważ Python jest dynamiczny język, pliki tłumaczeniowe nie skompilowany, w przeciwieństwie do C Niestety moje rozwiązanie nie zadziała dostarczając tłumaczenie mieszany (języki są mieszane w jednym zdaniu). W przypadku nazwy modelu używane jest ustawienie LANGUAGE_CODE projektu. Język dla pozostałej wiadomości jest określony przez agenta użytkownika ("Accept-Languages"). Będę eksperymentować z leniwym tłumaczeniem i powiedz, czy działa . – geekQ

Odpowiedz

35

ważnych rzeczy o których nie wspomniano w dokumentacji Django:

  • metę django-admin compilemessages, np jako część procesu budowania . Dzięki Stevejalim!
  • stosuje Django ugettext_lazy() modelować nazwy (Meta klasy i verbose_name)
  • atrybut (pole modelu verbose_name) nazwy mogą być również przetłumaczony z ugettext_lazy()
  • użytku tłumaczenia leniwe w metadanych modelu, w przeciwnym razie tłumaczenie dzieje się podczas ładowania Klasy modeli i ustawienia użytkowników, szczególnie ustawienia przeglądarki, nie będą brane pod uwagę
  • Używam niektórych zakresów nazw atrybutów, np. oddzielanie nazwy modelu oraz nazwy atrybutów za pomocą potoku. Ta sama konwencja jest używana w ruby-gettext. Tło: nazwy atrybutów, takie jak "tytuł" lub "nazwa", przetłumaczone inaczej w większości języków w zależności od kontekstu. Przykład "Książka | title" -> "Titel" lub "Buchtitel" w języku niemieckim. Ale "Rozdział | title" zostanie przetłumaczony jako "Überschrift".

przykład stosując powyższe zasady:

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

Lub czy istnieje lepszy sposób tłumaczyć stron modelowych i administratora?

Tak czy inaczej powinniśmy ulepszyć dokumentację Django i wypełnić lukę!

+2

zmieniając ugettext na ugettext_lazy pracował dla mnie. Dziękuję bardzo !!! – Sakuraba

+0

Używam ugettext_lazy, ale niestety nie działa dla mnie. –

+1

Zrobiłem to wszystko, ale nadal nie mogę przetłumaczyć nazw i pól modelu –

Powiązane problemy