我使用ugettext_lazy作为_,在模型文件中,我的字符串以这种方式表示:
s = _("firstline" "secondline" "thirdline")
但是在运行makemessages之后我发现在.po文件中只有“firstline”标记为翻译,其余的都没有。我不想避免使用多线程,所以有没有办法让翻译工作呢?
UPD:
应该补充我的问题:我需要我的多行字符串由django的makemessages继续
到目前为止,我能想象的最佳解决方案是
s = str(_("firstline")) + str(_("secondline") + str(_("thirdline"))
编辑: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"))
从译者的角度来看,这是一个更糟糕的解决方案(甚至可以让你的信息在某些语言中无法翻译)。
我有一个类似的问题,并使用标准的Python多行但单字符串格式解决了它。例如,对于你的字符串:
s = _("firstline\
secondline\
thirdline")
更新:实际的问题是makemessages
没有进行python(和JS等)解析,所以它不会按预期连接多行字符串。下面的解决方案也不起作用(它不会看到计算值)。
不幸的是,您必须找到另一种格式化消息的方法,最好将其拆分为单行部分。
上一个答案:
ugettext_lazy
只能接受单个参数,因此取决于您希望翻译的方式。
如果您将"firstline" "secondline" "thirdline"
导出为单句翻译,您可以这样做:
s = _(' '.join(["firstline", "secondline", "thirdline"]))
如果您想将它们作为单独的翻译句子保留,当这样的事情也可能有效:
s = ' '.join(_(line) for line in ["firstline", "secondline", "thirdline"])
或者只是在每一行上调用_
并将它们连接起来