Django makemessages javascript(xgettext)

ils*_*005 8 javascript django gettext xgettext django-i18n

我想用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>
      );
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我运行djangos makemessages命令:

python manage.py makemessages -l de -d djangojs -v 3 -s
Run Code Online (Sandbox Code Playgroud)

我希望创建的翻译文件有四个条目('example','button text','SOME TEXT'和'MORE TEXT'),因为gettext在js文件中出现了三次.但是创建的语言环境文件只有两个"example"条目:

#: ../HomePage.js:1
msgid "example"
msgstr ""

#: ../HomePage.js:25
msgid "MORE TEXT"
msgstr ""
Run Code Online (Sandbox Code Playgroud)

我也得到了这个警告.但不知道它意味着什么(该文件只有32行)

HomePage.js:33: warning: RegExp literal terminated too early
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么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
Run Code Online (Sandbox Code Playgroud)

那么xgettext有谁可以帮助我?

小智 1

我用最新版本的 Django (1.10.3) 尝试过这个。看起来效果很好。你能升级你的 Django 版本吗?

对我有用的代码在这里:https://github.com/guitarmanvt/stackoverflow-question-32403632

另外,请记住,您的 JavaScript 函数gettext需要在某处定义。当我上次查看时,有几个 JavaScript i18n 库,但与xgettextDjango配合良好的并不多。你可能必须自己动手。

或者,看看 Sentry 如何使用 JSX 进行 i18n 操作。https://blog.sentry.io/2016/01/07/react-i18n.html

翻译愉快!