我想使用django i18n支持来翻译我的JavaScript文件。我有以下javascript文件:
var test_text = gettext('example');
@withStyles(styles)
export default class HomePage {
static contextTypes = {
i18n: PropTypes.object
}
constructor() {
this.componentDidMount.bind(this);
this.handleCitySearch.bind(this);
}
render() {
return (
<Grid className="HomePage">
<Row className="HomePage-hero">
<Col md={8} style={{ textAlign: 'center' }}>
<Input ref="city" bsSize="large" type="text" />
<Button bsSize="large" bsStyle="default" onClick={this.handleCitySearch}>{gettext('button text')}</Button>
</Col>
<Col md={4}>
<ul>
<li>{gettext('SOME TEXT')}</li>
<li>{gettext('MORE TEXT')}</li>
</ul>
</Col>
</Row>
</Grid>
);
}
}
字符串
现在我运行djangos makemessages命令:
python manage.py makemessages -l de -d djangojs -v 3 -s
型
我希望创建的翻译文件有四个条目('example','button text','SOME TEXT'和'MORE TEXT'),因为gettext
在js文件中出现了三次。但创建的locale文件只有两个条目“example”:
#: ../HomePage.js:1
msgid "example"
msgstr ""
#: ../HomePage.js:25
msgid "MORE TEXT"
msgstr ""
型
我也收到了这个警告。但不知道它是什么意思(文件只有32行)
HomePage.js:33: warning: RegExp literal terminated too early
型
有谁知道为什么django忽略了其他条目?也许是因为我使用了jsx语法或者因为我使用了es6类?
更新:
我发现这不是django的问题,而是xgettext
的问题。Django通过以下命令调用xgettext
:
xgettext --language=JavaScript --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 --output=- --from-code=UTF-8 --add-comments=Translators ../HomePage.js
型
那么有没有xgettext
Maven可以帮助我?
4条答案
按热度按时间zazmityj1#
我在最新版本的Django(1.10.3)上试过这个。它看起来工作得很好。你能升级你的Django版本吗?
对我有用的代码在这里:https://github.com/guitarmanvt/stackoverflow-question-32403632
另外,请记住,您的JavaScript函数
gettext
需要在某个地方定义。当我上次查看时,有几个JavaScript i18 n库,但没有多少能很好地与xgettext和Django配合使用。您可能必须自己创建。或者,看看Sentry如何使用JSX. https://blog.sentry.io/2016/01/07/react-i18n.html实现i18 n
快乐翻译!
vs91vp4v2#
我以前用的django版本是1.5.6,可以完美的从.js中提取关键字,但是升级到1.11.15后会抛出错误,例如
warning: unterminated string literal
,warning: RegExp literal terminated too early
经过很长时间我发现了一个事实:makemessages.py在升级后发生了变化。该文件位于
/usr/lib/python2.7/site-packages/django/core/management/commands/makemessages.py
,1.5.6和1.11.15。在1.5.6中,makemessage的流程是:1.使用
prepare_js_for_gettext
formdjango.utils.jslex
将js文件预处理成符合C语言语法的内容2.将内容写入.c文件3.使用xgettext从.c文件中提取关键字,指定语言为C但在1.11.15中,它是:1.检测xgettext版本,如果大于1.18.3,直接使用xgettext处理js文件,或者像1.5.6一样处理
我得到的错误是由xgettext处理js文件的错误引起的。
所以我只是返回
True
行:77和所有工作像以前一样字符串
也许你可以试试这个记号或者重写一个脚本
olhwl3o23#
我迟到了几年,但如果有人觉得这有帮助...
你是对的,
xgettext --language=JavaScript
似乎不喜欢ES6/JSX。使用一个简单的实用程序,如the one shown in this article,而不是让
makemessages/xgettext
直接解析ES6/JSX文件可能会有所帮助。或者,也有像
gettext-extractor
这样的节点包,它可以用来将.pot
文件写入msgmerge
文件到djangojs.po
文件中.我运行一个节点脚本,使用这个库(和gettext-extractor-vue
用于我的特定用例)来写入frontend/messages.pot
,然后是:字符串
然后
compilemessages
生成相应的.mo
文件,包括节点提取的字符串,Django在/jsi18n/
目录请求中正确地提供它们。lf5gs5x24#
你需要把JavaScript代码放在静态文件夹中的一个文件中,以便生成
djangojs.po
。因为Django在处理JS文件时默认会查看这个目标。