Изменить способ загрузки локализаций ember-i18n, разделить строки локализации из основного файла app.js

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

В идеале структура останется такой же, как сейчас. Так что я бы app/locales/fr/translations.js а также app/locales/de/translations.js каждый из которых имеет содержание, подобное этому:

export default {
 key: "value"
}

Поэтому я подумал, что мне нужно написать собственное дополнение, которое изменит процесс сборки. Этот аддон должен будет:

  1. игнорировать app/locales из окончательной сборки

  2. Скомпилируйте все файлы перевода в один

  3. Транспилируйте новый файл с помощью babel

  4. Скопируйте файл в dist/assets/translations.js

Объединенный файл перевода будет выглядеть примерно так:

export default {
 fr: {
   key: "value"
 },
 de: {
  key: "value"
 }

Таким образом, я мог бы использовать инициализатор экземпляра и просто импортировать и использовать этот модуль:

import Translations from 'my-translations';

export function initialize(instance) {
   const i18n = instance.lookup('service:i18n');
   for(let lang in Translations) {
      if(Translations.hasOwnProperty(tag)) {
         i18n.addTranslations(tag, Translations[tag]);
      }
   }
}

Также, index.html было бы:

<script src="assets/vendor.js"></script>
<script src="assets/translations.js"></script>
<script src="assets/my-app.js"></script>

Ну, я начал писать собственный аддон, но я застрял. Мне удалось игнорировать локали, и я написал код, который анализирует все локализации, но я не знаю, как написать новый файл переводов в dist, Какой хук мне нужно использовать, чтобы иметь возможность писать в dist? Любая помощь? Огромное спасибо.

Вот код, который я написал:

Материал я использую

var Funnel = require('broccoli-funnel');
var stew = require('broccoli-stew');
var fs = require('fs');
var writeFile = require('broccoli-file-creator');
var mergeTrees = require('broccoli-merge-trees');


preprocessTree: function(type, tree) {
    if(type !== 'js') {return tree;}

    var treeWithoutLocales = new Funnel(tree, {
        exclude: ['**/locales/*/translations.js']
    });

    var translations = {};
    var files = fs.readdirSync('app/locales');
    files.forEach((tag) => {
        if(tag !== 'fr') {return;}
        let contents = fs.readFileSync('app/locales/' + tag + '/translations.js', 'utf8');
        contents = contents.replace(/^export default /, '');
        contents = contents.replace(/;$/, '');
        contents = JSON.parse(contents);
        translations[tag] = contents;
    });

    // Should do something with this .. how to write in dist? and when? I need it compiled with babel
    var fileTree = writeFile('/my-app/locales/translations.js', 'export default ' + JSON.stringify(translations) + ';');

    return treeWithoutLocales;
}

1 ответ

Я не уверен, что вы действительно задали вопрос; но куда идет какой-то ответ. Зачем усложнять? Просто используйте аддон i18n Джеймса Розена, который используется во многих проектах.

Другие вопросы по тегам