我想使用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专家可以帮我呢?
发布于 2016-11-23 21:01:44
我在最新版本的Django (1.10.3)中尝试过。它似乎工作得很好。你能升级你的Django版本吗?
适用于我的代码如下:https://github.com/guitarmanvt/stackoverflow-question-32403632
此外,请记住,您的JavaScript函数gettext需要在某个地方定义。据我所知,市面上有几个JavaScript i18n库,但在xgettext和Django上运行良好的并不多。你可能得自己动手了。
或者,看看Sentry是如何使用JSX进行i18n的。https://blog.sentry.io/2016/01/07/react-i18n.html
翻译愉快!
发布于 2019-10-18 10:12:22
我之前使用的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 form django.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文件中的bug引起的。
所以我只返回True,,,,:77,一切都像以前一样工作。
# django/core/management/commands/makemessages.py
def is_templatized(self):
if self.domain == 'djangojs':
return True
# return self.command.gettext_version < (0, 18, 3)
elif self.domain == 'django':
file_ext = os.path.splitext(self.translatable.file)[1]
return file_ext != '.py'
return False也许你可以尝试这个滴答或者重写一个脚本。
发布于 2021-11-08 02:42:04
我迟到了几年,但如果有人觉得这有帮助的话...
你是对的,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,然后如下所示:
./manage.py makemessages $LANGUAGE_FLAGS $IGNORE_FLAGS
./manage.py makemessages -d djangojs $LANGUAGE_FLAGS $IGNORE_FLAGS
for LANGUAGE in ${LANGUAGES[*]}
do
PO_PATH=locale/${LANGUAGE}/LC_MESSAGES/djangojs.po
touch $PO_PATH
msgmerge -q --previous --update $PO_PATH frontend/messages.pot
done
./manage.py compilemessages然后,compilemessages生成适当的.mo文件,包括节点提取的字符串,并在/jsi18n/编目请求中正确地为它们提供服务。
https://stackoverflow.com/questions/32403632
复制相似问题