2011-08-08 137 views
1

在django項目中存儲語言常量的最佳方式是什麼?Django應用程序佈局:國際化

例如,我們知道,對於翻譯,我們需要做的:

from django.utils.translation import gettext_lazy as _ 

class MyThing(models.Model): 
    name = models.CharField(help_text=_('This is the help text')) 

如果我們有很多變種,我們可以使用字典是這樣的:

from django.utils.translation import gettext_lazy as _ 
MYTRANSLATION = { 
    'term1':_('term1'), 
    'term2':_('term2'), 
    ... 
} 

所以,我的問題是,在哪裏存儲字典與語言常量...直接在視圖中,在模型中,在單獨的文件在應用程序文件夾中,在項目的根文件夾等...什麼是最好的方法?你在哪裏存儲你的語言常量?

回答

1

我認爲這取決於。如果您有一個大型的面向公衆的網站需要翻譯成N種語言,那麼這些網站並不是一成不變的,只要內容發生變化,就需要專業翻譯人員進行更新。對於這樣的項目,gettext完全不適合,因爲gettext對於非技術人員來說很難使用。如果內容經常改變,該網站還需要重新編譯和重新部署才能更新主要破譯者的翻譯。 gettext適用於桌面應用程序(類型,它仍然是翻譯人員的主要皮塔餅),但它不適用於網站。

改爲使用https://github.com/ojii/django-nani。創建一個表來保存所有翻譯字符串在您的模板:

class I18NString(TranslatableModel): 
    key = models.SlugField(unique = True) 
    translations = TranslatedFields(
     text = models.TextField(), 
    ) 

每一段文字,你需要,它添加在I18NString一行。例如,您可以添加一行關鍵詞「short-introduction-text」,並在其中添加英文和德文版的介紹文字。

然後爲每個頁面加載,加載所有的翻譯當前語言:

# For performance, memcached should be used. 
strings = I18NString.objects.language(request.COUNTRY_CODE).all() 
trans = dict((s.key, s.text) for s in strings) 

傳遞跨詞典模板和渲染翻譯的字符串:

{{ trans.short-introduction-text }} 
+0

哇!而已。謝謝。 –

0

字符串被實際使用的地方。不要單獨製作一個包含翻譯的字典 - 它很醜,破壞上下文(xgettext將無法指向使用字符串的文件),並基本上無意中複製了i18n機器的功能。

# yes: 
def view(request): 
    return HttpResponse(_(u'something something')) 

# no: 
translations = { 'something something': _(u'something something') } 
def view(request): 
    return HttpResponse(translations['something something']) 
+0

嗯..我們應該如何翻譯字符串,如果它們是動態的?如果我們從數據庫中獲取它們,但是已知字符串集合? –