【问题标题】:Django makemessages javascript (xgettext)Django makemessages javascript (xgettext)
【发布时间】:2015-11-30 22:35:31
【问题描述】:

我想使用 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文件中出现了3次。 但是创建的语言环境文件只有两个“示例”条目:

#: ../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专家可以帮助我?

【问题讨论】:

  • 你解决了吗?

标签: javascript django gettext django-i18n 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

翻译愉快!

【讨论】:

  • 我在 django 1.10.6 上也有同样的问题——所以 django 版本更新还不够...
【解决方案2】:

我之前用的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 line: 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

也许你可以试试这个tick或者重写一个脚本

【讨论】:

    【解决方案3】:

    我迟到了几年,但万一有人觉得这有帮助......

    你说得对,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 文件,包括从节点提取的字符串,Django 在/jsi18n/ 目录请求中正确地为它们提供服务。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多