initial translations support
This commit is contained in:
parent
811d7b51b9
commit
ba8bd12123
18 changed files with 503 additions and 43 deletions
122
tasks/jsxgettext.js
Normal file
122
tasks/jsxgettext.js
Normal file
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
Original from https://raw.githubusercontent.com/Mindflash/grunt-jsxgettext/master/lib/index.js
|
||||
License: ISC
|
||||
*/
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
'use strict';
|
||||
let _ = require('lodash');
|
||||
let path = require('path');
|
||||
let util = require('util');
|
||||
let jsxgettext = require('jsxgettext-andris');
|
||||
let fs = require('fs');
|
||||
let async = require('async');
|
||||
|
||||
/*
|
||||
options: {
|
||||
files: ['file-path','file-path'],
|
||||
+ jsxgettext options
|
||||
}
|
||||
*/
|
||||
let task = function (grunt, options, cb) {
|
||||
var generators = {
|
||||
'.ejs': jsxgettext.generateFromEJS,
|
||||
'.hbs': jsxgettext.generateFromHandlebars,
|
||||
'.jade': jsxgettext.generateFromJade,
|
||||
'.swig': jsxgettext.generateFromSwig
|
||||
};
|
||||
|
||||
// dynamically update generators mapping
|
||||
if (options.generators) {
|
||||
if (!Array.isArray(options.generators)) {
|
||||
options.generators = [options.generators];
|
||||
}
|
||||
|
||||
options.generators.forEach(elem => {
|
||||
// elem.generator can be either a string or a generator method (i.e. own generator or import from jsxgettext)
|
||||
if (typeof elem.generator === 'string' || elem.generator instanceof String) {
|
||||
// elem.generator can be an extension, which is used to remap predefined generators to different extensions
|
||||
// or elem.generator is the name of an generator method implemented in jsxgettext
|
||||
if (elem.generator.match(/^\..*/)) {
|
||||
generators[elem.ext] = generators[elem.generator];
|
||||
} else {
|
||||
generators[elem.ext] = jsxgettext[elem.generator];
|
||||
}
|
||||
} else {
|
||||
generators[elem.ext] = elem.generator;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var files = {};
|
||||
var dest = options.dest;
|
||||
|
||||
if (!fs.existsSync(path.dirname(dest)))
|
||||
return cb(util.format("Destination directory %s does not exist.", dest));
|
||||
|
||||
options.files.filter(file => grunt.file.exists(file)).forEach(file => {
|
||||
var ext = path.extname(file);
|
||||
var content = grunt.file.read(file, {
|
||||
encoding: 'utf-8'
|
||||
});
|
||||
|
||||
// pre-process non js files for use by jsxgettext.generate
|
||||
if (ext !== '.js') {
|
||||
var args = {};
|
||||
args[file] = content;
|
||||
files = _.assign(files, generators[ext](args, options).shift());
|
||||
return;
|
||||
}
|
||||
|
||||
files[file] = content;
|
||||
});
|
||||
|
||||
if (_.isEmpty(files))
|
||||
return cb("No valid input files found, received: " + util.inspect(options.files, {
|
||||
depth: null
|
||||
}));
|
||||
|
||||
cb(null, jsxgettext.generate(files, options));
|
||||
};
|
||||
|
||||
function unary(fn) {
|
||||
if (fn.length === 1) return fn;
|
||||
return function (args) {
|
||||
return fn.call(this, args);
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function (grunt) {
|
||||
grunt.registerMultiTask('jsxgettext', 'A Grunt task to run jsxgettext against files to extract strings into a POT file.', function () {
|
||||
var self = this;
|
||||
var done = self.async();
|
||||
|
||||
async.forEach(self.files, function (fileSet, eCb) {
|
||||
var dest;
|
||||
if (typeof fileSet.dest !== 'undefined' && fileSet.dest) {
|
||||
dest = fileSet.dest;
|
||||
} else {
|
||||
dest = path.join(fileSet['output-dir'] || '', fileSet.output);
|
||||
}
|
||||
|
||||
var options = _.defaults(self.options(), {
|
||||
files: fileSet.src,
|
||||
dest: dest,
|
||||
'output-dir': fileSet['output-dir'],
|
||||
output: fileSet['output']
|
||||
});
|
||||
task(grunt, options, function (err, res) {
|
||||
|
||||
if (err) return eCb(err);
|
||||
|
||||
grunt.file.write(dest, res);
|
||||
eCb();
|
||||
});
|
||||
}, err => {
|
||||
if (err) grunt.fatal(err);
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue