1

翻訳された静的ページを生成する必要があるプロジェクトがあります。リソースの最小化、ファイルの変更の監視と再コンパイル、およびいくつかのページに html テンプレートを挿入するのに非常に役立つため、gulp を使用することを選択しました。

私が使用したもの:
- 'gulp-inject': テンプレートを最終ファイルに挿入するため
- 'gulp-translate-html': '.json' 辞書があるため翻訳するため

だから私は2つの問題があります:

  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 ファイルに使用できる他のプラグインはありますか?

  1. 'gulp-inject' 上記のコード サンプルでは、​​1 つのファイルのみを翻訳しました。しかし、目的地が異なるいくつかの言語に対してはそうする必要があるため、言語に対してループを使用しました (コードのインデントについては申し訳ありません)。

    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 コールバックがないために発生しますよね?

結果をマージして、タスクがインターカレートしないようにするにはどうすればよいですか?

4

1 に答える 1

0

ポイント1からキャッシュの問題の解決策を見つけました:

この回答に基づいて: https://stackoverflow.com/a/16060619/944637キャッシュを削除すると、「require」機能がキャッシュからではなくファイルシステムからファイルをリロードできました。

delete require.cache[require.resolve('./dictionary/en.json')];戻る前に、「翻訳」タスクの最初に追加しました。

編集: ポイント 2 で、「merge-stream」を使用して結果をマージするソリューションを見つけました

私のコードは次のようになりました:

   ....
    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));
        }
    });
....
于 2015-04-08T10:00:57.137 に答える