【问题标题】:Django storing lazy translationDjango存储惰性翻译
【发布时间】:2012-05-03 08:07:42
【问题描述】:

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

假设我有一个这样定义的模型:

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

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

提前致谢。

【问题讨论】:

    标签: django translation


    【解决方案1】:

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

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

    def _(input):
         return input
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 同意,在输出时调用它。也许一个有用的补充:根本原因是它是一个数据库限制。数据库只包含常规字符串,不包含python以后可以自动翻译的python对象。
      • 我第一次尝试时是这样开始的。看到似乎没有其他简单的选择,我还是会这样做。
      【解决方案3】:

      ugettextugettext_lazy 用于静态 I18N 转换。它们应用于代码中的可翻译文本,以将文本收集到 .po 文件中,最后收集到 .mo 文件中。
      通常对于动态文本,您需要通过 Django ORM 在 DB 中创建翻译模式,并在 Django Admin 等视图中编辑翻译。然后在您看来,根据请求的语言显示正确的翻译版本。
      您可以通过酸洗将ugettext_lazy__proxy__“存储”到 DB,并且可以解开并应用unicode 以获取翻译。但是,IMO,将文字从代码存储到数据库是没有意义的。

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

      【讨论】:

      • 谢谢提醒,你的解决方案对我的项目来说似乎有点矫枉过正(这是一个小项目,我只是在探索 django 的可能性)
      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2015-11-12
      • 2011-02-09
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多