2010-05-30 49 views
25

Django的國際化非常好(基於gettext,LocaleMiddleware),但是翻譯模型名稱和管理頁面屬性的正確方法是什麼?我沒有在文檔中找到這事:用於管理頁面的Django國際化 - 翻譯模型名稱和屬性

我想有 「Выберитезаказдляизменения」,而不是 「Выберите爲了дляизменения」。請注意,「訂單」未翻譯。

首先,我定義了一個模型,在settings.py中激活USE_I18N = True,運行django-admin makemessages -l ru。模型名稱和屬性默認不創建任何條目。

Grepping在Django的源代碼,我發現:

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

所以verbose_name元屬性似乎在這裏發揮一些作用。試圖使用它:

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

現在更新po文件包含msgid 'order'可以翻譯。所以我把翻譯進去了。不幸的是,運行管理頁面顯示了「Выберитеorderдляизменения」的相同組合。

我目前正在使用Django 1.1.1。 有人可以指點我的相關文件嗎?因爲谷歌不能。 ;-)在同時,我將深入Django的源代碼Django文檔中沒有提到

+2

不好意思問,但在更新.po文件之後,是否運行了./manage.py makemessages來更新.mo文件? – 2010-05-30 13:01:38

+1

'makemessages'只更新po文件。我認爲 你的意思是'django-admin compilemessages' - 謝謝 你的提示!我想因爲Python是一種 動態語言,翻譯文件不是 編制而成的,相反C. 不幸的是我的解決方案仍然不能正常工作 提供一個混合的翻譯(語言 混合在一個句子)。對於型號名稱,將使用項目的 LANGUAGE_CODE設置。用於剩餘消息的 語言由用戶代理('Accept-Languages')的 確定。我將 實驗與懶惰翻譯,並告訴它是否 的作品。 – geekQ 2010-05-31 16:20:10

回答

35

重要的事情:

  • 運行django-admin compilemessages,例如作爲您構建 過程的一部分。謝謝stevejalim!
  • 應用於Django的ugettext_lazy()至名(Meta類和verbose_name
  • 屬性(型號場verbose_name)的名字也可以用ugettext_lazy()
  • 使用懶翻譯模型中的元數據轉換模型,而加載,否則翻譯 發生模型類和您的用戶的設置, 特別是瀏覽器設置,將不會被考慮到
  • 我使用一些範圍的屬性名稱,例如使用管道將型號名稱 和屬性名稱分開。 ruby​​-gettext使用相同的約定。背景:取決於上下文,諸如「標題」或「名稱」之類的屬性名稱在大多數語言中翻譯爲 的方式不同。示例 'Book | title' - >'Titel'或'Buchtitel'用德語。但 '章標題'將被翻譯爲'Überschrift'。

例使用上述原則:

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

還是有更好的方式來翻譯模型和管理頁面?

無論哪種方式,我們應該增強Django文檔並填補空白!

+2

將ugettext更改爲ugettext_lazy爲我工作。非常感謝您! – Sakuraba 2011-12-05 10:20:35

+0

我正在使用ugettext_lazy,但不幸的是不適合我。 – 2017-03-15 09:12:08

+1

我已經完成了所有這些工作,但仍無法獲取待翻譯的模型名稱和字段 – 2017-08-05 17:46:19