【问题标题】:Django Application Layout: InternationalizationDjango 应用布局:国际化
【发布时间】:2011-08-08 10:32:09
【问题描述】:

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

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

【问题讨论】:

    标签: python django internationalization


    【解决方案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 }}
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好吧.. 如果字符串是动态的,我们应该如何翻译它们?如果我们从数据库中获取它们,但字符串集是已知的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多