Как удалить местоположение, исходный файл и номер белья из автоматически сгенерированного XLIFF-файла Angular 6? - PullRequest
0 голосов
/ 20 февраля 2019

Мы используем встроенные инструменты 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?

В качестве альтернативы, есть ли другие инструменты, которые могли бы выполнить преобразование?Возможно, для компилятора важно иметь эту информацию во время сборки.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Следующий код 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-файл. НО эти сгенерированные строки, кажется, не используются в других местах.Я полагаю, что это просто соответствует спецификациям XLIFF .

Вы, вероятно, можете удалить его с помощью скрипта (например, @Maryannah) без ломания Angular.

0 голосов
/ 25 июня 2019

Вы не должны удалять их, так как 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"
...