2011-08-08 103 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

嗯..我们应该如何翻译字符串,如果它们是动态的?如果我们从数据库中获取它们,但是已知字符串集合? –