gpt4 book ai didi

javascript - 使用 "gulp-translate-html"和 "gulp-inject"时的 Gulp 管道和缓存问题

转载 作者:行者123 更新时间:2023-11-28 07:27:13 26 4
gpt4 key购买 nike

我有一个项目,我必须生成翻译后的静态页面。我们选择使用 gulp,因为它对缩小资源、监视文件更改和重新编译有很大帮助,并且还可以在多个页面中注入(inject) html 模板。

我用过:
- 'gulp-inject':用于将模板插入最终文件
- 'gulp-translate-html':用于翻译,因为我有'.json'字典

所以我有两个问题:

  1. 'gulp-translate-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 文件的其他插件?

  • '吞​​入注入(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”任务在“translation”任务之前运行,但后者运行得太快。发生这种情况是因为“injectContent”中没有特定的 return gulp 回调,对吧?

    如何合并结果而不让任务插入?

    最佳答案

    刚刚从第 1 点找到了缓存问题的解决方案:

    基于这个答案:https://stackoverflow.com/a/16060619/944637我删除了缓存,然后“require”函数可以从文件系统而不是从缓存重新加载文件。

    我在“翻译”任务的开头、返回之前添加了 delete require.cache[require.resolve('./dictionary/en.json')];

    编辑:刚刚在第 2 点找到了使用“merge-stream”合并结果的解决方案,在此答案中:https://stackoverflow.com/a/26786529

    所以我的代码是这样的:

       ....
    merge = require('merge-stream');
    gulp.task('injectContent', function() {
    var tasks = languages.map(function(lang){
    return gulp.src('./templates/base/injectContent.html')
    .pipe(plumber())
    .pipe(debug())
    .pipe(inject(gulp.src('./templates/partials/injectTemplate.html'), {
    relative: true,
    starttag: '<!-- inject:release -->',
    transform: function (filePath, file) {
    return file.contents.toString('utf8');
    }
    }))
    .pipe(gulp.dest('./temp/'+lang));
    });
    return merge(tasks);
    });

    gulp.task('translate', ['injectContent'], function() {

    for (var i in languages) {
    var lang = languages[i];

    delete require.cache[require.resolve('./dictionary/'+lang+'.json')];

    gulp.src('./temp/'+lang+'/injectContent.html')
    .pipe(plumber())
    .pipe(debug())
    .pipe(translateHtml({
    messages: require('./dictionary/'+lang+'.json'),
    templateSettings: {
    interpolate: /{{([\s\S]+?)}}/g // this is for Angular-like variable syntax
    }
    }))
    .pipe(gulp.dest('./'+lang));
    }
    });
    ....

    关于javascript - 使用 "gulp-translate-html"和 "gulp-inject"时的 Gulp 管道和缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29510266/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com