163 lines
4.8 KiB
JavaScript
163 lines
4.8 KiB
JavaScript
'use strict';
|
||
|
||
var po = require('pofile');
|
||
var _ = require('lodash');
|
||
|
||
var formats = {
|
||
javascript: {
|
||
addLocale: function (locale, strings) {
|
||
return ' gettextCatalog.setStrings(\'' + locale + '\', ' + JSON.stringify(strings) + ');\n';
|
||
},
|
||
format: function (locales, options) {
|
||
var angular = 'angular';
|
||
if (options.browserify) {
|
||
angular = 'require(\'angular\')';
|
||
}
|
||
var module = angular + '.module(\'' + options.module + '\')' +
|
||
'.run([\'gettextCatalog\', function (gettextCatalog) {\n' +
|
||
'/* jshint -W100 */\n' +
|
||
locales.join('') +
|
||
'/* jshint +W100 */\n';
|
||
if (options.defaultLanguage) {
|
||
module += 'gettextCatalog.currentLanguage = \'' + options.defaultLanguage + '\';\n';
|
||
}
|
||
module += '}]);';
|
||
|
||
if (options.requirejs) {
|
||
return 'define([\'angular\', \'' + options.modulePath + '\'], function (angular) {\n' + module + '\n});';
|
||
}
|
||
|
||
return module;
|
||
}
|
||
},
|
||
json: {
|
||
addLocale: function (locale, strings) {
|
||
return {
|
||
name: locale,
|
||
strings: strings
|
||
};
|
||
},
|
||
format: function (locales, options) {
|
||
var result = {};
|
||
locales.forEach(function (locale) {
|
||
if (!result[locale.name]) {
|
||
result[locale.name] = {};
|
||
}
|
||
_.assign(result[locale.name], locale.strings);
|
||
});
|
||
return JSON.stringify(result);
|
||
}
|
||
}
|
||
};
|
||
|
||
var noContext = '$$noContext';
|
||
|
||
var Compiler = (function () {
|
||
function Compiler(options) {
|
||
this.options = _.extend({
|
||
format: 'javascript',
|
||
module: 'gettext'
|
||
}, options);
|
||
}
|
||
|
||
Compiler.browserConvertedHTMLEntities = {
|
||
'hellip': '…',
|
||
'cent': '¢',
|
||
'pound': '£',
|
||
'euro': '€',
|
||
'laquo': '«',
|
||
'raquo': '»',
|
||
'rsaquo': '›',
|
||
'lsaquo': '‹',
|
||
'copy': '©',
|
||
'reg': '®',
|
||
'trade': '™',
|
||
'sect': '§',
|
||
'deg': '°',
|
||
'plusmn': '±',
|
||
'para': '¶',
|
||
'middot': '·',
|
||
'ndash': '–',
|
||
'mdash': '—',
|
||
'lsquo': '‘',
|
||
'rsquo': '’',
|
||
'sbquo': '‚',
|
||
'ldquo': '“',
|
||
'rdquo': '”',
|
||
'bdquo': '„',
|
||
'dagger': '†',
|
||
'Dagger': '‡',
|
||
'bull': '•',
|
||
'prime': '′',
|
||
'Prime': '″',
|
||
'asymp': '≈',
|
||
'ne': '≠',
|
||
'le': '≤',
|
||
'ge': '≥',
|
||
'sup2': '²',
|
||
'sup3': '³',
|
||
'frac12': '½',
|
||
'frac14': '¼',
|
||
'frac13': '⅓',
|
||
'frac34': '¾'
|
||
};
|
||
|
||
Compiler.hasFormat = function (format) {
|
||
return formats.hasOwnProperty(format);
|
||
};
|
||
|
||
Compiler.prototype.convertPo = function (inputs) {
|
||
var format = formats[this.options.format];
|
||
var locales = [];
|
||
|
||
inputs.forEach(function (input) {
|
||
var catalog = po.parse(input);
|
||
|
||
if (!catalog.headers.Language) {
|
||
throw new Error('No Language header found!');
|
||
}
|
||
|
||
var strings = {};
|
||
for (var i = 0; i < catalog.items.length; i++) {
|
||
var item = catalog.items[i];
|
||
var ctx = item.msgctxt || noContext;
|
||
var msgid = item.msgid;
|
||
|
||
var convertedEntity;
|
||
var unconvertedEntity;
|
||
var unconvertedEntityPattern;
|
||
|
||
for ( unconvertedEntity in Compiler.browserConvertedHTMLEntities ) {
|
||
convertedEntity = Compiler.browserConvertedHTMLEntities[ unconvertedEntity ];
|
||
unconvertedEntityPattern = new RegExp( '&' + unconvertedEntity + ';?', 'g' );
|
||
msgid = msgid.replace( unconvertedEntityPattern, convertedEntity );
|
||
}
|
||
|
||
if (item.msgstr[0].length > 0 && !item.flags.fuzzy && !item.obsolete) {
|
||
if (!strings[msgid]) {
|
||
strings[msgid] = {};
|
||
}
|
||
|
||
// Add array for plural, single string for signular.
|
||
strings[msgid][ctx] = item.msgstr.length === 1 ? item.msgstr[0] : item.msgstr;
|
||
}
|
||
}
|
||
|
||
// Strip context from strings that have no context.
|
||
for (var key in strings) {
|
||
if (Object.keys(strings[key]).length === 1 && strings[key][noContext]) {
|
||
strings[key] = strings[key][noContext];
|
||
}
|
||
}
|
||
|
||
locales.push(format.addLocale(catalog.headers.Language, strings));
|
||
});
|
||
|
||
return format.format(locales, this.options);
|
||
};
|
||
|
||
return Compiler;
|
||
})();
|
||
|
||
module.exports = Compiler;
|