[英]Translating multi-line strings in javascript with django
我正在开发一个django应用程序,它需要支持多种语言。 此应用程序涉及一些javascript代码。 在这个javascript代码中,有一些需要翻译的多行字符串。
我们尝试过这种结构:
var $text = gettext('Lorem ipsum dolor sit amet, consectetur adipisicing ' +
'elit, sed do eiusmod tempor incididunt ut labore et ' +
'dolore magna aliqua. Ut enim ad minim veniam, quis ');
这不起作用。 makemessages
在第一个+
符号makemessages
停止,因此在.po
文件中它显示为:
msgid "Lorem ipsum dolor sit amet, consectetur adipisicing "
在网上进行一些搜索会导致样式指南 ,它会推荐我们已经用于多行字符串的格式。 但是, makemessages
不支持这种风格。
我尝试删除行尾的+
字符。 如果没有+
字符, makemessages
可以找到完整的字符串,但它不再适用于浏览器。
是否存在多行字符串的样式, makemessages
支持makemessages
并且可以在所有主流浏览器中使用?
到目前为止,我发现makemessages
实际上正在做的是用双引号字符串替换所有单引号字符串,并通过xgettext
运行结果声称它是C代码。
它不能自动工作的原因是makemessages
不使用真正的javascript解析器。 它进行了一个小的转换,并应用了一个C解析器。 但是为了在javascript中连接字符串,你需要一个+
字符,但是在C中你不能在要连接的字符串之间有任何标记。
我终于找到了一个解决方法,它有效:
var $text = gettext('Lorem ipsum dolor sit amet, consectetur adipisicing ' //\
+
'elit, sed do eiusmod tempor incididunt ut labore et ' //\
+
'dolore magna aliqua. Ut enim ad minim veniam, quis ');
浏览器中的javascript解析器将//\\
作为注释,并根据需要在每个字符串之间查找+
字符。 当使用makemessages
, \\
字符被解析为行继续,并且//\\
以及下一行中的+
被认为是单个注释。 因此,解析器看到仅由注释分隔的字符串常量,并执行隐式字符串连接。
当我从一位开发人员那里看到这段代码时,我偶然发现了这种解决方法:
// IE8 only allows string, identifier and number keys between {}s
var parse_bool = {"null": null, "true": true, "false": false}
parse_bool[undefined] = null
parse_bool[null] = null // using null/true/false *this* way works
parse_bool[true] = true // _______
parse_bool[false] = false // ( WAT?! )
// ¯¯¯¯¯¯¯ o ^__^
var render_bool = {} // o (oo)\_______
render_bool[null] = '--' // (__)\ )\/\
render_bool[true] = gettext('yes') // ||----w |
render_bool[false] = gettext('no') // || ||
当makemessages
处理这段javascript代码时,它错过了yes
字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.