2015-09-24 6 views
0

Возможно ли загрузить файл JSON из динамического источника? Я хочу сделать некоторые локализациизагрузить файл динамического JSON

grunt.file.readJSON('src/locales/<%= grunt.task.current.args[0] %>/i18n.json'); 

Более подробным пример Gruntfile выглядит следующим образом:

module.exports = function(grunt) { 

    var i18n = { 
    locales: ['en', 'fr', 'de', 'es'], 
    default: 'en', 
    replacements: function(locale){ 
     var content = grunt.file.readJSON('src/locales/<%= grunt.task.current.args[0] %>/i18n.json'); 
     var arr = []; 
     for(i in content){ 
     var replacement = { 
      from: i, 
      to: content[i].value 
     }; 
     arr.push(replacement); 
    } 

    return arr; 
    } 
}; 
// Project configuration. 
grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    replace: { 
    build: { 
    src: ['local/en/**/*.html'],    // source files array (supports minimatch) 
    dest: 'local/<%= grunt.task.current.args[0] %>/',    // destination directory or file 
    replacements: i18n.replacements('<%= grunt.task.current.args[0] %>') 
    } 
}, 

При регистрации задачи выглядит следующим образом:

grunt.registerTask('localise', function(){ 
    var tasks = []; 
    for(i in i18n.locales){ 
    if(i18n.locales[i] !== i18n.default){ 

     tasks.push('replace:build:' + i18n.locales[i]); 
    } 
    } 
    grunt.task.run(tasks); 
}); 

Все работает, как я надеялся за исключением загрузки JSON, чтобы фактически выполнить замены.

Я также попытался:

grunt.file.readJSON('src/locales/'+locale+'/i18n.json'); 

, который не работает, либо, оставив меня немного в тупик.

Любой, кто может помочь?

Благодаря

ответ

0

Try:

'src/locales/' + grunt.task.current.args[0] + '/i18n.json' 
+0

Это дает 'TypeError: Невозможно прочитать свойство '0' undefined'. Я думаю, что до тех пор, пока что-то называется, инициализация происходит до того, как выполняются задачи. – philsbury

0

Хорошо, я получил это работает после долгих проб и ошибок:

Я обновил функцию, возвращающую данные для:

var i18n = { 
    locales: ['en', 'fr', 'de', 'es'], 
    default: 'en', 
    replacements: function(locale){ 

    var content = grunt.file.readJSON('src/locales/'+ locale +'/i18n.json'); 
    var arr = [{from: "/" + locale, to: "/en"}, {from: "Test", to: locale}]; 

    for(i in content){ 
     var replacement = { 
     from: i, 
     to: content[i].value 
     }; 

     arr.push(replacement); 
    } 
    console.log(arr); 
    return arr; 
    } 
}; 

Затем установите пустой массив в задаче по умолчанию:

replace: { 
    build: { 
    src: ['local/en/**/*.html'],    // source files array (supports minimatch) 
    dest: 'local/<%= grunt.task.current.args[0] %>/',    // destination directory or file 
    replacements: [] 
    } 
}, 

который обновляется, используя его собственную задачу

grunt.registerTask('updateConf', function(locale){ 

    var content = i18n.replacements(locale); 

    grunt.config('replace.build.replacements', content); 

}); 

, который запускается только перед задачей заменить:

grunt.registerTask('localise', function(){ 
    var tasks = []; 
    for(i in i18n.locales){ 
    if(i18n.locales[i] !== i18n.default){ 
     tasks.push('updateConf:' + i18n.locales[i]); 
     tasks.push('replace:build:' + i18n.locales[i]); 
    } 
    } 

    grunt.task.run(tasks); 
}); 

, дающим право выхода. Возможно, это не самые элегантные решения, но это работает!

Смежные вопросы