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 - 迭代解析 HTML(使用 lxml?)

java - 如何使用pymssql/python检索多个SQL结果集

python - 匹配两个通配符字符串

asp.net - Python Django 与 ASP.NET MVC

java - grails 中不区分大小写的 i18n 字符串搜索

python - 是否在 tornado.web.RequestHandler 中初始化,每次请求时都会被调用/

Django 教程 selection_set

javascript - 单击下拉菜单按价格对商品进行排序

django - 使用复数形式进行俄语本地化

internationalization - 从 i18n 格式化字符串