Python Django应用程序布局:国际化

Python Django应用程序布局:国际化,python,django,internationalization,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 i

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

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

实际使用字符串的位置。不要单独制作包含翻译的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'])

实际使用字符串的位置。不要单独制作包含翻译的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'])

我想这要看情况了。如果你有一个大型面向公众的网站,你想将其翻译成N种语言,那么这些网站就不是固定不变的,只要内容发生变化,就需要专门的翻译人员进行更新。对于这样的项目,gettext完全不适合,因为非技术人员很难使用gettext。该网站还需要重新编译和重新部署以更新翻译,如果内容经常更改,这些翻译是主要的破坏交易的因素。gettext适用于桌面应用程序(在某种程度上,它仍然是翻译人员的主要pita),但不适用于网站

相反,使用。创建一个表格以保存模板中的所有可翻译字符串:

class I18NString(TranslatableModel):
    key = models.SlugField(unique = True)
    translations = TranslatedFields(
        text = models.TextField(),
    )
对于所需的每一段文本,将其作为行添加到I18NString中。例如,您可以添加一行“简短介绍文本”,并在其中添加介绍文本的英语和德语版本

然后,对于每个页面加载,加载当前语言的所有翻译:

# 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 }}

我想这要看情况了。如果你有一个大型面向公众的网站,你想将其翻译成N种语言,那么这些网站就不是固定不变的,只要内容发生变化,就需要专门的翻译人员进行更新。对于这样的项目,gettext完全不适合,因为非技术人员很难使用gettext。该网站还需要重新编译和重新部署以更新翻译,如果内容经常更改,这些翻译是主要的破坏交易的因素。gettext适用于桌面应用程序(在某种程度上,它仍然是翻译人员的主要pita),但不适用于网站

相反,使用。创建一个表格以保存模板中的所有可翻译字符串:

class I18NString(TranslatableModel):
    key = models.SlugField(unique = True)
    translations = TranslatedFields(
        text = models.TextField(),
    )
对于所需的每一段文本,将其作为行添加到I18NString中。例如,您可以添加一行“简短介绍文本”,并在其中添加介绍文本的英语和德语版本

然后,对于每个页面加载,加载当前语言的所有翻译:

# 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 }}

好。。如果字符串是动态的,我们应该如何翻译它们?如果我们从数据库中得到它们,但字符串集是已知的?嗯。。如果字符串是动态的,我们应该如何翻译它们?如果我们从数据库中得到它们,但字符串集是已知的?