Изменить способ загрузки локализаций ember-i18n, разделить строки локализации из основного файла app.js
Я пытаюсь изменить способ загрузки локализаций ember-i18n. То, что я хочу сделать, это иметь локализации в отдельном файле от основного файла JavaScript приложения.
В идеале структура останется такой же, как сейчас. Так что я бы app/locales/fr/translations.js
а также app/locales/de/translations.js
каждый из которых имеет содержание, подобное этому:
export default {
key: "value"
}
Поэтому я подумал, что мне нужно написать собственное дополнение, которое изменит процесс сборки. Этот аддон должен будет:
игнорировать
app/locales
из окончательной сборкиСкомпилируйте все файлы перевода в один
Транспилируйте новый файл с помощью babel
Скопируйте файл в
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 Джеймса Розена, который используется во многих проектах.