在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文件夹中的单独文件中,在项目的根文件夹中等等...最好的方法是什么?你在哪里存储你的语言功能?
答案 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'])