如何在Django模型中翻译多行字符串

问题描述 投票:0回答:3

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


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

但是在运行makemessages之后我发现在.po文件中只有“firstline”标记为翻译,其余的都没有。我不想避免使用多线程,所以有没有办法让翻译工作呢?

UPD:

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

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


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

django django-models translation multilinestring
3个回答
0
投票

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

第一部分实际上是真的,我站在这上面(我的坏) - 但是xgettext做相同的相邻字符串连接有Python,如mentionned here

一些国际化工具 - 特别是xgettext - 已经被特殊地用于隐式连接,

here

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

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

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

蟒蛇 xgettext将自动连接仅由空格(空格,换行符等)分隔的文字字符串,因此这相当于

s = _("firstlinesecondlinethirdline")

如果您只在po文件中获得第一个字符串,则问题出在其他地方 - 要么您的代码段不是您实际拥有的代码段,要么您的po文件未正确更新或其他任何内容......(破解xgettext版本可能?)。

注意:这个:

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

从译者的角度来看,这是一个更糟糕的解决方案(甚至可以让你的信息在某些语言中无法翻译)。


0
投票

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

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

-1
投票

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

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

上一个答案:

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

如果您将"firstline" "secondline" "thirdline"导出为单句翻译,您可以这样做:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.