我试图理解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中还没有新密钥?如果是,请添加具有一些未转换值的那些密钥”。那是什么过程?
答案 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工作
.xlf
函数还在compile
目录中生成nls元数据文件。像这样:out
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
目录中生成几个必要的元数据文件out/
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>
。然后添加/运行另一个新的任务,以导入翻译。像这样:/path/to/translation.xlf
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/
调用进行新的更改
显然这不是完美的,有很多硬编码的路径,但是希望它可以帮助遇到此问题的其他人。