Django存储懒惰翻译

时间:2012-04-22 13:17:27

标签: django translation

在尝试实施网站的翻译版本时,我遇到了以下问题:

假设我的模型定义如下:

class Model(models.model)
    name=models.CharField(max_length=10)
    ...

要创建一些数据(稍后显示在网页上),我会使用包含以下行的特殊视图:

Model.objects.create(name = "testName",...)

我尝试使用以下代码实现翻译:

Model.objects.create(name = _("testName"),...)

如果我将ugettext导入为_,则只需将“testName”的翻译值放入数据库中。 如果我将ugettext_lazy导入_,我会InterfaceError(更准确地说是Error binding parameter X - probably unsupported type

我想知道如果我必须找到一些解决方法,是否可以进行这样的初始化。

提前致谢。

3 个答案:

答案 0 :(得分:2)

只需将英文版存储在数据库中,并在输出期间仅调用ugettext / _lazy。这显然只有在存在这些字符串的翻译时才有效,否则它将以任何方式显示英文版...

答案 1 :(得分:1)

ugettextugettext_lazy用于静态I18N翻译。它们应用于代码中的可翻译文本,以将文本收集到.po文件,最后收集到.mo个文件中。
通常对于动态文本,您需要通过Django ORM在DB中创建翻译模式,并编辑Django Admin等视图中的翻译。然后在您的视图中,根据请求的语言显示正确的翻译版本 您可以通过挑选将“ugettext_lazy __proxy__存储到数据库”,然后可以对其进行解压缩并应用unicode来获取翻译。但是,IMO,将代码中的文字存储到DB无意义。

如果您想要通过Web界面管理的基于po的翻译解决方案,请参考https://github.com/mbi/django-rosetta

答案 2 :(得分:0)

只需添加,以防有人需要它。

这是我发现实施Florian解决方案的最佳方式,并且每次都不需要添加/删除_函数。 您将在包含字符串的文件中定义一个虚函数:

def _(input):
     return input

这样,您的字符串将以原始语言存储,但makemessages仍然会像需要翻译的字符串一样处理它们,从而将它们放在.po文件中。而你只需要在html中使用{% trans %}块。