Django应用程序布局:国际化

时间:2011-08-08 10:32:09

标签: python django internationalization

在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'),
    ...
}

所以,我的问题是,在哪里用语言常量存储字典...直接在视图中,在模型中,在app文件夹中的单独文件中,在项目的根文件夹中等等...最好的方法是什么?你在哪里存储你的语言功能?

2 个答案:

答案 0 :(得分: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字典传递给模板并渲染翻译后的字符串:

{{ trans.short-introduction-text }}

答案 1 :(得分:0)

实际使用字符串的地方。不要制作一个包含翻译的单独的dict - 它很难看,破坏上下文(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'])