Автоматически создавать каталог i18n для расширения VSCode - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь понять рабочий процесс, представленный в https://github.com/microsoft/vscode-extension-samples/tree/master/i18n-sample для локализации расширений кода Visual Studio.

Я не могу понять , как создается каталог i18n, начиная с а также о том, как набор строковых ключей в этом каталоге поддерживается с течением времени.

В файле README.md есть одна строка, в которой говорится: «Вы могли создать эту папку вручную или использовать инструмент vscode-nls-dev для ее извлечения». ... как быиспользовать инструмент vscode-nls-dev для его извлечения?

Что я понимаю

Я понимаю, что вы можете использовать vscode-nls и переносить строки следующим образом: localize("some.key", "My String") чтобы выбрать локализованную версию этой строки во время выполнения.

Я почти уверен, что понимаю, что vscode-nls-dev используется во время сборки для замены содержимого файлов в каталоге i18n в передаваемый JavaScriptкод, а также создание файлов, таких как out/extension.nls.ja.json

Чего не хватает

Конечно, не ожидается, что: для каждого file.ts файла в вашем проекте вы создаетеi18n/lang/out/file.i18n.json для каждого поддерживаемого языка ... и затем обновлять набор ключей в этом файле вручную при каждом изменении строки.

Я предполагаю, что есть некоторый процесс, который автоматически запускается "в * file32ts есть localize("key", "String") вызовы дляновых ключей еще нет в файле .i18n.json? Если так, добавьте эти ключи с некоторыми непереведенными значениями ". Что это за процесс?

1 Ответ

0 голосов
/ 09 октября 2019

Я понял это, ссылаясь на https://github.com/Microsoft/vscode-extension-samples/issues/74

Это сработало, если вы используете Transifex для своего переводчика. Как минимум, вам нужно использовать .xlf файлы в качестве формата файла перевода.

Я думаю, что это лучше всего проиллюстрировать на примере, поэтому предположим, что вы хотите получить пример проекта работает после того, как вы удалили папку i18n

  • Шаг 1: клонируйте этот проект и удалите каталог i18n
  • Шаг 2: измените gulp file , поэтому функция 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())

  • Шаг 3: Запустите команду gulp build. Это создаст несколько необходимых файлов метаданных в каталоге out/
  • Шаг 4. Создайте и запустите новую функцию gulp для экспорта необходимых переводов в файл 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')));
    }

  • Шаг 5: Получите переведенный xlf-файл. Или добавьте несколько фиктивных значений. Я не могу найти, если / где есть документация для необходимого формата файла, но это сработало для меня (для расширения):

    <?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>

  • Шаг 6: Вставьте этот файл в какой-то известныйместоположение, скажем, /path/to/translation.xlf. Затем добавьте / запустите еще одну новую задачу gulp, чтобы импортировать перевод. Что-то вроде:

    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)));
        }));
    });

  • Шаг 7: Запустите gulp build снова.

Каталог i18n/ теперь должен быть воссоздан правильно! Выполнение тех же шагов сборки / экспорта / перевода / импорта / сборки приведет к появлению любых новых изменений вызовов localize() в вашем коде TypeScript

Очевидно, что это не идеально, есть много жестко закодированных путей и тому подобное. , но, надеюсь, это поможет любому, кто решит эту проблему.

...