Aurelia I18N:扫描html源以获取新密钥并更新translation.json文件

时间:2019-05-16 14:36:53

标签: aurelia i18next

是否有任何工具可以扫描aurelia项目源(html,js)文件并在translation.json文件中创建(更新)密钥?

特别是我想从使用TBindingBehaviorTValueConverter转换样式的HTML文件中收集密钥。

1 个答案:

答案 0 :(得分:0)

免责声明:建议的软件包由我的雇主公司开发。

以下是此过程涉及的主要步骤。

  1. 使用gulp-i18n-update-localization-ids
  2. 为html模板生成i18n密钥
  3. 使用gulp-i18n-extract
  4. 将键和值提取到外部资源
  5. 手动翻译不同语言的值
  6. 使用gulp-i18n-compile2
  7. 编译翻译以生成不同语言的语言环境文件

以下是极简主义的任务

const gulp = require("gulp");
const path = require("path");
const updateLocalizationIds = require('gulp-i18n-update-localization-ids');
const i18nExtract = require('gulp-i18n-extract');
const i18nCompile = require('gulp-i18n-compile2');

const src = path.resolve(__dirname, "src"),
    json = path.resolve(src, "*.r.json"),
    html = path.resolve(src, "*.html"),
    translations = path.resolve(__dirname, "translations/i18n.json"),
    locales = path.resolve(__dirname, "locales"),
    i18nGlobalPrefixes = new Map();

const generateI18nKeys = function () {
    return gulp.src(html)
        .pipe(updateLocalizationIds({
            emit: 'onChangeOnly',
            ignore: [{ content: v => v.startsWith('${') && v.endsWith('}') }],
            idTemplate: updateLocalizationIds.prefixFilename(i18nGlobalPrefixes),
            whitelist: [
                { tagName: 'h2' },
                {
                    tagName: 'another-custom-el',
                    attrs: ['some-other-value1', 'some-other-value2']
                }
            ]
        }))
        .pipe(gulp.dest(src));
}

const i18nExtractOptions = {
    plugIns: [
        new i18nExtract.html(),
        new i18nExtract.json()
    ],
    markUpdates: true,
    defaultLanguages: ['de', "fr"] // add more language here as per your need
};

const extractI18n = function () {
    return gulp.src([html, json])
        .pipe(i18nExtract.extract(translations, i18nExtractOptions))
        .pipe(gulp.dest("."));
}

const compileOptions = {
    fileName: "translation.json",
    defaultLanguage: "en"
};

const compileI18n = function () {
    return gulp.src(translations)
        .pipe(i18nCompile(compileOptions))
        .pipe(gulp.dest(locales));
}

gulp.task("i18n", gulp.series(generateI18nKeys, extractI18n, compileI18n));

这是怎么回事?

让我们假设您拥有src目录下的所有html文件。您还可以在src下有一些普通的json文件作为外部资源。尽管并不是真正需要它,但在此示例中,我为此使用了扩展名*.r.jsonr表示资源)。

第一个任务generateI18nKeys 会为html模板生成i18n键。例如,它将转换以下edit.html ...

<!--edit.html-->
<h2>some text</h2>
<another-custom-el some-other-value1="value1" some-other-value2="value2"></another-custom-el>

...到以下

<!--edit.html-->
<h2 t="edit.t0">some text</h2>
<another-custom-el some-other-value1="value1" some-other-value2="value2"
  t="[some-other-value1]edit.t1;[some-other-value2]edit.t2"></another-custom-el>

使用config选项中的whitelist属性执行此任务,以标记密钥生成目标的元素和属性。

下一步中,将键和相应的值提取到一个如下所示的json文件中。

{
  "edit": {
    "content": {
      "edit.t0": {
        "content": "some text",
        "lastModified": "2019-05-26T16:23:42.306Z",
        "needsUpdate": true,
        "translations": {
          "de": {
            "content": "",
            "lastModified": ""
          },
          "fr": {
            "content": "",
            "lastModified": ""
          }
        }
      },
      "edit.t1": {
        "content": "value1",
        "lastModified": "2019-05-26T16:23:42.306Z",
        "needsUpdate": true,
        "translations": {
          "de": {
            "content": "",
            "lastModified": ""
          },
          "fr": {
            "content": "",
            "lastModified": ""
          }
        }
      },
      "edit.t2": {
        "content": "value2",
        "lastModified": "2019-05-26T16:23:42.306Z",
        "needsUpdate": true,
        "translations": {
          "de": {
            "content": "",
            "lastModified": ""
          },
          "fr": {
            "content": "",
            "lastModified": ""
          }
        }
      }
    },
    "src": "src\\edit.html"
  }
}

请注意,为任务中指定的localeId生成了空内容。您可以手动更改此文件,以为每种已配置的语言添加翻译。

最后,compileI18n任务会根据最后一个json为每种语言生成文件,如下所示。

{
  "edit": {
    "t0": "some text",
    "t1": "value1",
    "t2": "value2"
  }
}

请注意,该文件可以被aurelia-i18n插件直接使用。有关更多详细信息,请参阅特定于软件包的文档。

希望这会有所帮助。