【问题标题】:grunt load dynamic JSON filegrunt 加载动态 JSON 文件
【发布时间】:2015-12-22 06:34:46
【问题描述】:

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

这也不起作用,让我有点难过。

谁能帮忙?

谢谢

【问题讨论】:

    标签: javascript json gruntjs npm


    【解决方案1】:

    试试:

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

    【讨论】:

    • 这给了TypeError: Cannot read property '0' of undefined。我认为这取决于调用事物的时间,初始化是在任务运行之前发生的。
    【解决方案2】:

    好的,经过多次试验和错误,我得到了它:

    我更新了返回数据的函数:

    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);
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多