使用django在javascript中翻译多行字符串

kas*_*erd 3 javascript django gettext

我正在开发一个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 ');
Run Code Online (Sandbox Code Playgroud)

这不起作用.makemessages停在第一个+标志处,因此在.po文件中显示为:

msgid "Lorem ipsum dolor sit amet, consectetur adipisicing "
Run Code Online (Sandbox Code Playgroud)

在网上进行一些搜索会导致样式指南,它会推荐我们已经用于多行字符串的格式.但是这种风格不受支持makemessages.

我尝试删除+行尾的字符.没有+字符,makemessages可以找到完整的字符串,但它不再适用于浏览器.

是否存在多行字符串的样式,它既受到makemessages所有主要浏览器的支持,也可以在所有主流浏览器中使用?

到目前为止,我发现makemessages实际上正在做的是用双引号字符串替换所有单引号字符串,并通过xgettext声明它是C代码来运行结果.

kas*_*erd 5

它不能自动工作的原因是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 ');
Run Code Online (Sandbox Code Playgroud)

浏览器中的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') //                 ||     ||
Run Code Online (Sandbox Code Playgroud)

什么makemessages时候处理这​​段javascript代码,它错过了yes字符串.