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 import gettext_lazy as _
MYTRANSLATION = { 
    'term1':_('term1'), 
    'term2':_('term2'),
    ...
}

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

最佳答案

我认为这确实取决于。如果您有一个面向公众的大型网站,想要翻译成 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 }}

关于python - Django应用程序布局: Internationalization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6980850/

相关文章:

python - 程序停止运行是由python udp 停留在一个地方引起的

python - 这段代码有什么问题?它不断写入相同的值

python - 这是使 mysql 在 django 应用程序中与 gevent 良好配合的最佳选择

Symfony 2.1 设置语言环境

angular - i18n Translate.instant 带参数

没有RessourceBundle的Java i18n

python - 在一行中打印范围内项目的功能方式是什么?

python - Pandas contains() 方法无法识别 '$'

django - 用于 Django 部署的 Azure Web 应用程序不起作用

django - 使用表名检索模型对象