У меня есть проект, в котором я должен создавать переведенные статические страницы. Выбор состоял в том, чтобы использовать gulp, потому что он очень помогает в минимизации ресурсов, отслеживании изменений файлов и повторной компиляции, а также может вставлять html-шаблоны на несколько страниц.
Я использовал:
- 'gulp-inject': для вставки шаблонов в окончательные файлы
- 'gulp-translate-html': для перевода, потому что у меня есть словари '.json'
Итак, у меня есть две проблемы:
- 'глоток-перевод-html'
Это использует json в качестве входных данных для перевода, используя следующий код:
gulp.task('translate', function() {
return gulp.src('./temp/en/template.html')
.pipe(translateHtml({
messages: require('./dictionary/en.json'),
templateSettings: {
interpolate: /{{([\s\S]+?)}}/g
}
}))
.pipe(gulp.dest('./en'));
});
Я создал часы в файле .json, при изменении он должен повторно применить перевод. Но почему-то он использует старый файл вместо измененного. Есть ли обходной путь для этого? Или другой плагин, который я мог бы использовать для файлов json?
'gulp-inject' В приведенном выше примере кода я перевел только один файл. Но мне нужно сделать это для нескольких языков с разными пунктами назначения, поэтому я использовал цикл для языков (извините за отступ кода).
var gulp = require('gulp'), inject = require('gulp-inject'), translateHtml = require('gulp-translate-html'); var languages = ['en', 'de']; gulp.task('injectContent', function() { /* the base file used as a reference*/ var target = gulp.src('./templates/base/baseTemplate.html'); /* get each language*/ languages.forEach(function(lang) { target.pipe(inject(gulp.src('./templates/partials/injectTemplate.html'), { relative: true, starttag: '<!-- inject:template -->', transform: function (filePath, file) { return file.contents.toString('utf8'); } })) /* put the merged files into "temp" folder under its language folder*/ .pipe(gulp.dest('./temp/'+lang)); }); }); /* The translation has to be made after the injection above is finished*/ gulp.task('translate', ['injectContent'] function() { /* get each language*/ languages.forEach(function(lang) { gulp.src('./temp/'+ lang +'/baseTemplate.html') .pipe(translateHtml({ messages: require('./dictionary/'+lang+'.json');, templateSettings: { interpolate: /{{([\s\S]+?)}}/g } })) .pipe(gulp.dest('./'+lang)); /* put file in the "en" or "de" language folder*/ }); }); gulp.task('watch', function() { gulp.watch(['./templates/**/*.html', './dictionary/*.json'], ['translate']); }); gulp.task('default', ['translate', 'watch']);
Здесь я хочу, чтобы задача «injectContent» выполнялась перед задачей «перевод», но последняя запускается слишком рано. Это происходит потому, что в 'injectContent' нет определенного обратного вызова return gulp, верно?
Как я могу объединить результаты и не допустить интеркалирования задач?