UNPKG

@gctools-components/i18n-translation-webpack-plugin

Version:

Complete i18n translation solution for webpack, including code-splitting and automatic generation of translation files

80 lines (68 loc) 3.67 kB
'use strict'; /* * Author: National Research Council Canada * Website: http://www.nrc-cnrc.gc.ca/eng/rd/ict/ * * License: MIT * Copyright: Her Majesty the Queen in Right of Canada, as represented by * the Minister of National Research Council, 2017 */ var fs = require('fs'); var path = require('path'); /** * Loader responsible for injecting language data into bundle, and for code * splitting. */ module.exports = function I18nWebpackLoader() { if (this.cacheable) { this.cacheable(); } var validCodeSplitting = ['language', 'domain', 'language+domain', 'all', 'none']; var optSplit = this.request.split('?options=')[1]; var options = JSON.parse(decodeURIComponent(optSplit)); var languages = options.languages; var context = this._compiler.context; var root = path.join(context, options.i18n_dir); if (!options.codeSplitting || validCodeSplitting.indexOf(options.codeSplitting) === -1) { options.codeSplitting = 'language'; } var requires = []; requires = ['module.exports = function(lang, domain, cb) {\n']; Object.keys(languages).forEach(function (l) { var lang = languages[l]; var filepath = path.join(root, lang + '/LC_MESSAGES'); requires = requires.concat([' if (lang == \'' + lang + '\') {\n']); if (options.codeSplitting === 'none') { requires = requires.concat([' var req = require.context(\'' + root + '\', true, /.*\\.po$/);\n', ' cb(req(\'' + filepath + '/\' + domain + \'.po\'));']); } else if (options.codeSplitting === 'all') { requires = requires.concat([' require.ensure([], function(require) {\n', ' cb(require(\'' + root + '\' + lang + \'/LC_MESSAGES/\'', ' + domain + \'.po\'));\n', ' });\n']); } else if (options.codeSplitting === 'language') { // code split by language var chunk = '/* webpackChunkName: "' + lang + '" */ '; var loader = '!json-loader!po-loader?format=jed1.x!'; requires = requires.concat(['import(' + chunk + ' \'' + loader + filepath + '/\'+domain+\'.po\').then(cb);']); } else if (options.codeSplitting === 'domain') { // code split by domain var poFiles = fs.readdirSync(path.join(root, filepath)).filter(function (file) { return file.indexOf('.po') > 2; }); Object.keys(poFiles).forEach(function (po) { var domain = poFiles[po].slice(0, -3); requires = requires.concat([' if (domain == \'' + domain + '\') {\n', ' require.ensure([], function(require) {\n', ' var req = require.context(\'' + root + '\',true,/\\.\\/' + lang, '\\/LC_MESSAGES\\/' + domain.replace('.', '\\.') + '\\.po/);\n', ' cb(req(\'' + path.join(filepath, domain) + '\' + \'.po\'', '));\n', ' }, \'' + domain + '\');\n', ' }\n']); }); } else if (options.codeSplitting === 'language+domain') { // code split by domain AND language. var _poFiles = fs.readdirSync(path.join(root, filepath)).filter(function (file) { return file.indexOf('.po') > 2; }); var co = '' + root + path.sep + lang + '/LC_MESSAGES/'; Object.keys(_poFiles).forEach(function (po) { var domain = _poFiles[po].slice(0, -3); requires = requires.concat([' if (domain == \'' + domain + '\') {\n', ' require.ensure([], function(require) {\n', ' var req = require.context(\'' + co + '\', ', 'false, /\\.\\/' + domain.replace('.', '\\.') + '\\.po/);\n', ' cb(req(\'./' + domain + '\' + \'.po\'', '));\n', ' }, \'' + lang + '-' + domain + '\');\n', ' }\n']); }); } requires = requires.concat([' }\n']); }); requires = requires.concat(['}']); return requires.join(''); };