【问题标题】:Extracting Javascript gettext messages using Babel CLI extractor使用 Babel CLI 提取器提取 Javascript gettext 消息
【发布时间】:2012-05-03 06:43:54
【问题描述】:

据说here Babel 可以为 Python 和 Javascript 文件提取 gettext 消息。

Babel 带有一些内置的提取器:python(它提取 来自 Python 源文件的消息)、javascript 和忽略(其中 什么都不提取)。

命令行提取器记录在here - 但没有使用示例。

同样在上面的same pointer 中,提到了一个用于提取的配置文件,但没有太多扩展。

当我在带有 js 文件的目录上运行提取器的基本命令时,我只生成了 .PO 标头,但没有消息。

$ pybabel extract   /path/to/js-dir

# Translations template for PROJECT.
# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2012-04-22 19:39+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"

$ 

这是我尝试提取消息的 js 文件中的示例片段:

else if(data.status == "1"){
    var follow_html = gettext('Follow');
    object.attr("class", 'button follow');
    object.html(follow_html);
    var fav = getFavoriteNumber();
    fav.removeClass("my-favorite-number");
    if(data.count === 0){
        data.count = '';
        fav.text('');
    }else{
        var fmts = ngettext('%s follower', '%s followers', data.count);
        fav.text(interpolate(fmts, [data.count]));
    }
}

如果有人可以提供准确的 CLI 选项和配置设置以使提取工作正常进行,我将不胜感激。

【问题讨论】:

标签: javascript python localization gettext python-babel


【解决方案1】:

创建一个包含以下内容的文件 (babel.cfg):

[javascript:*.js]
encoding = utf-8

然后,做:

pybabel extract -F babel.cfg /path/to/js-dir

你有一些消息字符串应该足够了。

顺便说一句,您可以通过以下方式查阅extract 命令的帮助:

pybabel extract --help

【讨论】:

  • 抱歉回复晚了。我正在做你所概述的事情,并得到与我的问题中显示的完全相同的结果。你有没有在相当大的例子上测试过这个命令。
  • 我遇到了同样的问题。然后我创建了一个包含以下内容的 babel.cfg 文件:``` [javascript: **.js] extract_messages = _ ```` 现在它可以工作了!
  • 顺便定义一个复数关键字,如下所示:-k "ngettext:1,2"
【解决方案2】:

我有一个类似的问题,并且能够通过使用 babel 禁用默认关键字来解决它。

pybabel extract -k __ -F babel.cfg --no-default-keywords /path/to/js-dir 

当您禁用默认值时,您必须在命令中至少指定一个关键字 (-k [keyword])。我选择了-k __,因为“__”是我一直在寻找的模式。

只需使用此命令并将 -k 之后的“__”替换为 babel.cfg 文件中的一个。

编辑:这允许您使用自己的关键字而不是 gettext()

【讨论】:

    【解决方案3】:

    您可以在烧瓶全局中创建一个对象并使用 gettext 翻译它

    g.i18n = {
        'Casa' : lazy_gettext('Home'),
        'Auto' : lazy_gettext('Car'),
        'Persona' : lazy_gettext('Person')
    }
    

    然后将其添加为变量

    <script>
        var i18n = {{ g.i18n | tojson }}
    </script>
    

    并在 JS 中使用:

    var labelTranslate = {
                        Casa: i18n.Casa,
                        Persona: i18n.Persona,
                        Auto: i18n.Auto
                    };
    

    【讨论】:

      【解决方案4】:

      您实际上可以在 Javascript 中直接使用gettext

      请参阅:jsgettext。它允许您使用标准的 *gettext 函数,包括使用上下文和/或复数形式的函数。

      它可以读取 PO/MO 文件,也可以导入自定义的 JSON 文件。

      完整示例请参见this project 中的this file

      【讨论】:

        猜你喜欢
        • 2016-05-26
        • 2023-03-22
        • 2017-01-18
        • 2016-04-22
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        相关资源
        最近更新 更多