3

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

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

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

升级版:

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

到目前为止我能想象的最好的解决方案是

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

4

3 回答 3

0

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

    s = _("firstline\
          secondline\ 
          thirdline")
于 2019-04-17T18:43:47.953 回答
0

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

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

一些国际化工具 - 特别是 xgettext - 已经针对隐式连接进行了特殊处理,

这里:

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

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

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

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

s = _("firstlinesecondlinethirdline")

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

注意:这个:

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

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

于 2017-02-13T12:09:25.910 回答
-1

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

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

上一个答案:

ugettext_lazy只能接受单个参数,因此取决于您希望如何翻译。

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

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

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

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

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

于 2017-02-13T11:57:39.273 回答