繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM