Visual studio code 自动为VSCode扩展创建i18n目录
我试图理解中介绍的本地化Visual Studio代码扩展的工作流 我无法弄清楚i18n目录是如何创建的,以及该目录中的字符串键集是如何随着时间的推移得到维护的 在README.md中有一行写着“您可以手工创建此文件夹,或者您可以使用vscode nls dev工具来提取它。”…如何使用vscode nls dev工具来提取它 我所理解的 我知道您可以使用Visual studio code 自动为VSCode扩展创建i18n目录,visual-studio-code,vscode-extensions,Visual Studio Code,Vscode Extensions,我试图理解中介绍的本地化Visual Studio代码扩展的工作流 我无法弄清楚i18n目录是如何创建的,以及该目录中的字符串键集是如何随着时间的推移得到维护的 在README.md中有一行写着“您可以手工创建此文件夹,或者您可以使用vscode nls dev工具来提取它。”…如何使用vscode nls dev工具来提取它 我所理解的 我知道您可以使用vscode-nls,并像这样包装字符串:localize(“some.key”,“我的字符串”)以在运行时获取该字符串的本地化版本 我非常确
vscode-nls
,并像这样包装字符串:localize(“some.key”,“我的字符串”)
以在运行时获取该字符串的本地化版本
我非常确定我了解在构建时使用vscode-nls-dev
将i18n
目录中的文件内容替换为传输的JavaScript代码,以及创建像out/extension.nls.ja.json这样的文件
缺少什么
当然,这不是期望的:对于项目中的每个file.ts
文件,您为您支持的每个lang创建一个i18n/lang/out/file.i18n.json
,然后在每次字符串更改时手动更新该文件中的密钥集
我假设有一个过程会自动运行“file.ts中是否有本地化(“key”,“String”)
调用file.i18n.json中尚未出现的新键?如果是,请添加带有一些未翻译值的键”。这是什么过程?我已经弄明白了,参考
如果您将Transifex用于您的翻译器,则此功能将正常工作。您至少需要使用.xlf
文件作为翻译文件格式
我认为最好用一个例子来说明这一点,因此假设您想在删除i18n文件夹后获得工作的
- 步骤1:克隆该项目,并删除i18n目录
- 步骤2:修改,以便
compile
函数也在out
目录中生成nls元数据文件。比如:
- 步骤3:运行
gulpbuild
命令。这将在out/
目录中生成几个必要的元数据文件
- 步骤4:创建并运行一个新的gulp函数,将必要的翻译导出到xlf文件。比如:
- 步骤5:翻译生成的xlf文件。或者,添加一些虚拟值。我找不到是否/何处有所需文件格式的文档,但这对我很有用(扩展名):
- 步骤7:再次运行
gulpbuild
现在应该正确地重新创建i18n/
目录!运行相同的构建/导出/翻译/导入/构建步骤将获取对TypeScript代码中的localize()
调用的任何新更改
显然,这并不完美,有很多硬编码的路径等等,但希望它能帮助解决这个问题的其他人。我已经解决了这个问题,参考
如果您将Transifex用于您的翻译器,则此功能将正常工作。您至少需要使用.xlf
文件作为翻译文件格式
我认为最好用一个例子来说明这一点,因此假设您想在删除i18n文件夹后获得工作的
- 步骤1:克隆该项目,并删除i18n目录
- 步骤2:修改,以便
compile
函数也在out
目录中生成nls元数据文件。比如:
- 步骤3:运行
gulpbuild
命令。这将在out/
目录中生成几个必要的元数据文件
- 步骤4:创建并运行一个新的gulp函数,将必要的翻译导出到xlf文件。比如:
- 步骤5:翻译生成的xlf文件。或者,添加一些虚拟值。我找不到是否/何处有所需文件格式的文档,但这对我很有用(扩展名):
- 步骤7:再次运行
gulpbuild
现在应该正确地重新创建i18n/
目录!运行相同的构建/导出/翻译/导入/构建步骤将获取对TypeScript代码中的localize()
调用的任何新更改
显然,这并不完美,有很多硬编码的路径等等,但希望它能帮助解决这个问题的其他人
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.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')));
}
<?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>
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)));
}));
});