自动为VSCode扩展名创建i18n目录

时间:2019-10-08 21:59:03

标签: visual-studio-code vscode-extensions

我试图理解https://github.com/microsoft/vscode-extension-samples/tree/master/i18n-sample中介绍的本地化Visual Studio Code扩展的工作流程。

我无法弄清楚 i18n目录是如何开始创建的,以及该目录中的字符串键集如何随着时间的推移而得到维护。

README.md中有一行显示“您可以手动创建此文件夹,也可以使用vscode-nls-dev工具提取该文件夹。” ...如何使用vscode-要提取它的nls-dev工具?

我的理解

我知道您可以使用vscode-nls并包装如下字符串:localize("some.key", "My String")在运行时获取该字符串的本地化版本。

我非常确定我了解在构建时使用vscode-nls-dev来将i18n目录中文件的内容替换为已转译的JavaScript代码,以及创建了{{1}这样的文件}

缺少的内容

当然不希望这样:为项目中的每个out/extension.nls.ja.json文件,为您支持的每个lang创建一个file.ts,然后使该文件中的密钥集保持最新状态。手动更改每个字符串。

我假设有一些过程会自动进行:“ file.ts中是否有i18n/lang/out/file.i18n.json调用,而file.i18n.json中还没有新密钥?如果是,请添加具有一些未转换值的那些密钥”。那是什么过程?

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了,引用了https://github.com/Microsoft/vscode-extension-samples/issues/74

如果您将Transifex用于翻译程序,则此功能可以正常工作。至少需要使用<div class="additions"> <input type="checkbox" value="10" v-model="additional" v-on:click= "check_one()"> <input type="checkbox" value="30" v-model="additional" v-on:click= "check_one()"> </div> <script> data(){ return { additional: [], } }, methods: { check_one: function(){ this.additional = []; } } } </script> 个文件作为翻译文件格式。

我认为这是一个最好的例子,因此,假设您想在删除i18n文件夹后让sample project工作

  • 第1步:克隆该项目,然后删除i18n目录
  • 步骤2:修改gulp file,以使.xlf函数还在compile目录中生成nls元数据文件。像这样:
out
  • 第3步:运行 function compile(buildNls) { var r = tsProject.src() .pipe(sourcemaps.init()) .pipe(tsProject()).js .pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through()) .pipe(buildNls ? nls.createAdditionalLanguageFiles(languages, 'i18n', 'out') : es.through()) .pipe(buildNls ? nls.bundleMetaDataFiles('ms-vscode.node-debug2', 'out') : es.through()) .pipe(buildNls ? nls.bundleLanguageFiles() : es.through()) 命令。这将在gulp build目录中生成几个必要的元数据文件
  • 第4步:创建并运行一个新的gulp函数,将必要的翻译内容导出到xlf文件。像这样:
out/
  • 第5步:转换生成的xlf文件。或者,添加一些虚拟值。我找不到/是否有所需文件格式的文档,但这对我有用(对于扩展名):

    gulp.task('export-i18n', function() {
        return gulp.src(['package.nls.json', 'out/nls.metadata.header.json', 'out/nls.metadata.json'])
            .pipe(nls.createXlfFiles("vscode-extensions", "node-js-debug2"))
            .pipe(gulp.dest(path.join('vscode-translations-export')));
    }

  • 第6步:将该文件粘贴在某个已知位置,例如 <?xml version="1.0" encoding="utf-8"?> <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> <file original="package" source-language="en" target-language="ja" datatype="plaintext"><body> <trans-unit id="extension.sayHello.title"> <source xml:lang="en">Hello</source> <target>JA_Hello</target> </trans-unit> <trans-unit id="extension.sayBye.title"> <source xml:lang="en">Bye</source> <target>JA_Bye</target> </trans-unit> </body></file> <file original="out/extension" source-language="en" target-language="ja" datatype="plaintext"><body> <trans-unit id="sayHello.text"> <source xml:lang="en">Hello</source> <target>JA_Hello</target> </trans-unit> </body></file> <file original="out/command/sayBye" source-language="en" target-language="ja" datatype="plaintext"><body> <trans-unit id="sayBye.text"> <source xml:lang="en">Bye</source> <target>JA_Bye</target> </trans-unit>> </body></file> </xliff> 。然后添加/运行另一个新的任务,以导入翻译。像这样:
/path/to/translation.xlf
  • 第7步:再次运行 gulp.task('i18n-import', () => { return es.merge(languages.map(language => { console.log(language.folderName) return gulp.src(["/path/to/translation.xlf"]) .pipe(nls.prepareJsonFiles()) .pipe(gulp.dest(path.join('./i18n', language.folderName))); })); });

现在应正确地重新创建gulp build目录!运行相同的构建/导出/翻译/导入/构建步骤将对您的TypeScript代码中的i18n/调用进行新的更改

显然这不是完美的,有很多硬编码的路径,但是希望它可以帮助遇到此问题的其他人。