Django makemessages javascript(xgettext)

时间:2015-09-04 17:30:45

标签: javascript django gettext django-i18n xgettext

我想使用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文件中出现三次。 但是创建的语言环境文件只有两个“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类?

UPDATE:

我发现这不是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专家可以帮助我?

2 个答案:

答案 0 :(得分:1)

我尝试使用最新版本的Django(1.10.3)。它似乎工作得很好。你能升级你的Django版本吗?

适合我的代码在这里:https://github.com/guitarmanvt/stackoverflow-question-32403632

另外,请记住,您的JavaScript函数gettext需要在某处定义。当我最后看时,有几个JavaScript i18n库,但是很少有很好的与 xgettext Django 。你可能需要自己动手。

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

快乐翻译!

答案 1 :(得分:0)

我以前使用的Django版本是1.5.6,它可以完美地从.js中提取关键字。但是升级到1.11.15后会抛出错误。例如warning: unterminated string literalwarning: 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格式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文件中的错误引起的。

所以我只返回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

也许您可以尝试打勾或重写脚本

相关问题