如何从 Angular 6 自动生成的 XLIFF 文件中删除位置、源文件和行号?
How to remove location, sourcefile and linenumber from Angular 6's auto generated XLIFF file?
我们正在使用 Angular 的内置工具从模板中提取消息。
这工作正常,我们正在使用以下方法获取 XLIFF 文件中的所有信息:
ng xi18n
在此文件中,trans-unit
如下所示:
<trans-unit id="3535a6c8296b457542000d2cbd15ca93f86cdd79" datatype="html">
<source>Homepage</source>
<context-group purpose="location">
<context context-type="sourcefile">app/component/nav/nav.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
<note priority="1" from="description">description</note>
<note priority="1" from="meaning">title</note>
</trans-unit>
尽管 <context-group purpose="location">
中的内容看起来很有趣,但它向外部翻译服务提供了项目和实施细节。
有没有办法告诉 Angular 不要 将这些信息包含到 XLIFF 文件中?
或者,是否有其他工具可以进行转换?也许编译器在构建过程中获得该信息很重要。
你不应该删除那些,因为 Angular 需要它来翻译。
但是如果这是你想要的,你可以使用 JS 脚本来删除它们:
const fs = require('fs');
const data = fs.readFileSync('./i18n.xliff').toString();
const contentToRemoveRegexp = /<context-group purpose="location">([.\s\S])*<\/context-group>/g;
const replaced = data.replace(contentToRemoveRegexp, '');
fs.writeFileSync('./i18n-updated.xliff', replaced);
将它存储在任何你想要的 JS 文件中,并在你的包文件中制作一个脚本:
"i18n:update": "ng xi18n && node path/to/your/script/js"
以下 Angular 的代码生成此行(查看 Github 上的完整源代码):
const _CONTEXT_GROUP_TAG = 'context-group';
const _CONTEXT_TAG = 'context';
// http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
// http://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html
export class Xliff extends Serializer {
write(messages: i18n.Message[], locale: string|null): string {
const visitor = new _WriteVisitor();
const transUnits: xml.Node[] = [];
messages.forEach(message => {
let contextTags: xml.Node[] = [];
message.sources.forEach((source: i18n.MessageSpan) => {
let contextGroupTag = new xml.Tag(_CONTEXT_GROUP_TAG, {purpose: 'location'});
contextGroupTag.children.push(
new xml.CR(10),
new xml.Tag(
_CONTEXT_TAG, {'context-type': 'sourcefile'}, [new xml.Text(source.filePath)]),
new xml.CR(10), new xml.Tag(
_CONTEXT_TAG, {'context-type': 'linenumber'},
[new xml.Text(`${source.startLine}`)]),
new xml.CR(8));
contextTags.push(new xml.CR(8), contextGroupTag);
});
[...]
根据我的代码分析,似乎没有办法告诉 Angular 不要将这些信息包含到 XLIFF-file 中。 但是 这些生成的行似乎没有在别处使用。我想这只是为了与 XLIFF specs.
一致
您可能可以使用脚本(如@Maryannah 的脚本)将其删除,而不会 破坏 Angular.
我们正在使用 Angular 的内置工具从模板中提取消息。
这工作正常,我们正在使用以下方法获取 XLIFF 文件中的所有信息:
ng xi18n
在此文件中,trans-unit
如下所示:
<trans-unit id="3535a6c8296b457542000d2cbd15ca93f86cdd79" datatype="html">
<source>Homepage</source>
<context-group purpose="location">
<context context-type="sourcefile">app/component/nav/nav.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
<note priority="1" from="description">description</note>
<note priority="1" from="meaning">title</note>
</trans-unit>
尽管 <context-group purpose="location">
中的内容看起来很有趣,但它向外部翻译服务提供了项目和实施细节。
有没有办法告诉 Angular 不要 将这些信息包含到 XLIFF 文件中?
或者,是否有其他工具可以进行转换?也许编译器在构建过程中获得该信息很重要。
你不应该删除那些,因为 Angular 需要它来翻译。
但是如果这是你想要的,你可以使用 JS 脚本来删除它们:
const fs = require('fs');
const data = fs.readFileSync('./i18n.xliff').toString();
const contentToRemoveRegexp = /<context-group purpose="location">([.\s\S])*<\/context-group>/g;
const replaced = data.replace(contentToRemoveRegexp, '');
fs.writeFileSync('./i18n-updated.xliff', replaced);
将它存储在任何你想要的 JS 文件中,并在你的包文件中制作一个脚本:
"i18n:update": "ng xi18n && node path/to/your/script/js"
以下 Angular 的代码生成此行(查看 Github 上的完整源代码):
const _CONTEXT_GROUP_TAG = 'context-group';
const _CONTEXT_TAG = 'context';
// http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
// http://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html
export class Xliff extends Serializer {
write(messages: i18n.Message[], locale: string|null): string {
const visitor = new _WriteVisitor();
const transUnits: xml.Node[] = [];
messages.forEach(message => {
let contextTags: xml.Node[] = [];
message.sources.forEach((source: i18n.MessageSpan) => {
let contextGroupTag = new xml.Tag(_CONTEXT_GROUP_TAG, {purpose: 'location'});
contextGroupTag.children.push(
new xml.CR(10),
new xml.Tag(
_CONTEXT_TAG, {'context-type': 'sourcefile'}, [new xml.Text(source.filePath)]),
new xml.CR(10), new xml.Tag(
_CONTEXT_TAG, {'context-type': 'linenumber'},
[new xml.Text(`${source.startLine}`)]),
new xml.CR(8));
contextTags.push(new xml.CR(8), contextGroupTag);
});
[...]
根据我的代码分析,似乎没有办法告诉 Angular 不要将这些信息包含到 XLIFF-file 中。 但是 这些生成的行似乎没有在别处使用。我想这只是为了与 XLIFF specs.
一致您可能可以使用脚本(如@Maryannah 的脚本)将其删除,而不会 破坏 Angular.