grunt加载动态JSON文件

时间:2015-09-24 15:15:53

标签: javascript json gruntjs npm

是否可以从动态源加载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');

哪个也没有用,让我有点难过。

任何人都可以提供帮助吗?

由于

2 个答案:

答案 0 :(得分:0)

尝试:

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

答案 1 :(得分: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);
});

给出正确的输出。可能不是最优雅的解决方案,但它有效!