【问题标题】:How to translate multiline string in Django models如何在 Django 模型中翻译多行字符串
【发布时间】:2017-07-01 09:29:51
【问题描述】:

我使用 ugettext_lazy 作为 _ ,在模型文件中我的字符串以这种方式表示:

s = _("第一行" “第二行” “三线”)

但是在运行 makemessages 之后我发现在 .po 文件中只有“第一行”被标记为翻译,其余的都不存在。我不想避免使用多行,那么有什么方法可以使翻译工作吗?

更新:

应该补充我的问题:我需要由 django 的 makemessages 处理我的多行字符串

目前我能想到的最佳解决方案是

s = str(_("第一行")) + str(_("第二行") + str(_("第三行"))

【问题讨论】:

  • 哪个操作系统,哪个 xgettext 版本?实际上 xgettext 应该处理得很好。
  • 您能否发布带有import 语句的最小完整.py 文件来重现此问题?这将使查找问题变得更加容易。

标签: django django-models translation multilinestring


【解决方案1】:

更新: 实际问题是makemessages 没有进行python(和JS 等)解析,因此它不会按预期连接多行字符串。下面的解决方案也不起作用(它不会看到计算值)。

不幸的是,您必须找到另一种方式来格式化您的消息,最好将其拆分为单行部分。

上一个答案:

ugettext_lazy 只能接受单个参数,因此您可以自行决定如何翻译。

如果您可以将"firstline" "secondline" "thirdline" 导出为单个句子进行翻译,您可以执行以下操作:

s = _(' '.join(["firstline", "secondline", "thirdline"]))

如果您想将它们保留为单独的翻译句子,当这样的事情也可能起作用时:

s = ' '.join(_(line) for line in ["firstline", "secondline", "thirdline"])

或者只是在每一行上调用_并将它们连接起来

【讨论】:

  • OP 正在发送一个参数 - 仅由空格分隔的连续文字字符串合并在一起。
  • @brunodesthuilliers 您能否详细说明拒绝投票的原因?它向 OP 解释了如何实现三个单独的翻译行,你和我都不知道 OP 的目的是为了决定这个答案是否毫无价值或有帮助。
  • 解释在我上面的评论中 - 只是并列字符串 - 就像在 OP 的 sn-p 中一样 - 将 已经 连接它们。这是 Python 语法的文档化部分。
  • 您的评论是对我评论第一部分的更正。它有一个有效的观点,即 sn-p 可能不完整,但原始帖子的措辞可能表明目标是在一次调用中翻译三个单独的行 - 这是我在评论第二部分中的建议。 IMO 由 OP 决定哪条评论有帮助,除非其中一条是明显的欺诈或诈骗。
  • 您的回答 如当前所写 表明 OP 的 sn-p 正在向 ugettext_lazy 发送三个不同的字符串 - 事实并非如此 - 解决方案是手动加入这些字符串 - 仍然不是这样。 IOW 你的答案(至少是它的主要部分)实际上是错误的。请记住,SO 背后的目标之一是构建一个可靠 QA 数据库,而不仅仅是解决 OP 的特定问题。从这个 POV 来看,“决定”哪个答案有用是整个社区的责任,这就是为什么我们可以投票赞成或反对答案。
【解决方案2】:

编辑:Goodguy 提到 makemessages 不会进行 Python 解析,因此无法正确收集那些“多行”字符串。

第一部分实际上是正确的,我对此进行了纠正(我的错误)-但是 xgettext 与 Python 中的相邻字符串连接相同,如 mentionned here

一些国际化工具——尤其是 xgettext——已经 是隐式连接的特例,

here:

还要注意,长字符串可以跨行拆分为多个 相邻的字符串标记。自动字符串连接在 根据 ISO C 和 ISO C++ 编译时间; xgettext 也支持 这个语法。

事实上,我和六名同事多年来一直在十几个项目中使用这种模式。

s = _("firstline" "secondline" "thirdline")

Python xgettext 将自动连接仅由空格(空格、换行符等)分隔的文字字符串,因此这完全等同于

s = _("firstlinesecondlinethirdline")

如果您只在 po 文件中获得这些字符串中的第一个,那么问题就出在其他地方 - 您的 sn-p 不是您的代码中实际拥有的,或者您的 po 文件没有正确更新或其他任何东西...... (可能是损坏的 xgettext 版本?)。

注意:这个:

s = str(_("firstline")) +  
      str(_("secondline") +  
      str(_("thirdline"))

从翻译者的角度来看,这是一个更糟糕的解决方案(甚至可能使您的信息无法翻译成某些语言)。

【讨论】:

  • @JulieB 它没有。这里重要的是您在 between 字符串文字之间有什么(并且它们是文字,因为它不适用于变量,但随后会引发 SyntaxError)。我已经使用了数百次相同的模式,相信我就是 JustWork。如果您根本没有收到任何错误,而只是在 .po 文件中找到了第一个字符串,那么问题就出在其他地方。请发布确切代码 sn-p(从您的源代码复制粘贴)。
  • 还要确保此时代码中的 _ 有效地绑定到 ugettextugettext_lazy - 请记住 Python 函数是普通对象,并且与任何其他变量位于相同的命名空间中.
  • 我对这个问题的 sn-p 也有同样的看法
  • @JulieB 哪个操作系统,哪个 gettext 版本?
  • Centos 7,如果我知道的话,很高兴告诉你哪个 gettext 版本)
【解决方案3】:

我遇到了类似的问题,并使用标准的 Python 多行但单字符串格式解决了它。例如对于您的字符串:

    s = _("firstline\
          secondline\ 
          thirdline")

【讨论】:

  • 不幸的是,这将(django 3.2.10)会添加大量的空格,所以这对我来说不是一个可行的解决方案......?
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2011-02-24
  • 2018-01-30
  • 2015-06-03
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多