135 lines
4.7 KiB
JavaScript
135 lines
4.7 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
|
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
|
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
|
|
var _logger = _interopRequireDefault(require("./logger.js"));
|
|
|
|
function capitalize(string) {
|
|
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
}
|
|
|
|
var LanguageUtil =
|
|
/*#__PURE__*/
|
|
function () {
|
|
function LanguageUtil(options) {
|
|
(0, _classCallCheck2.default)(this, LanguageUtil);
|
|
this.options = options;
|
|
this.whitelist = this.options.whitelist || false;
|
|
this.logger = _logger.default.create('languageUtils');
|
|
}
|
|
|
|
(0, _createClass2.default)(LanguageUtil, [{
|
|
key: "getScriptPartFromCode",
|
|
value: function getScriptPartFromCode(code) {
|
|
if (!code || code.indexOf('-') < 0) return null;
|
|
var p = code.split('-');
|
|
if (p.length === 2) return null;
|
|
p.pop();
|
|
return this.formatLanguageCode(p.join('-'));
|
|
}
|
|
}, {
|
|
key: "getLanguagePartFromCode",
|
|
value: function getLanguagePartFromCode(code) {
|
|
if (!code || code.indexOf('-') < 0) return code;
|
|
var p = code.split('-');
|
|
return this.formatLanguageCode(p[0]);
|
|
}
|
|
}, {
|
|
key: "formatLanguageCode",
|
|
value: function formatLanguageCode(code) {
|
|
// http://www.iana.org/assignments/language-tags/language-tags.xhtml
|
|
if (typeof code === 'string' && code.indexOf('-') > -1) {
|
|
var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];
|
|
var p = code.split('-');
|
|
|
|
if (this.options.lowerCaseLng) {
|
|
p = p.map(function (part) {
|
|
return part.toLowerCase();
|
|
});
|
|
} else if (p.length === 2) {
|
|
p[0] = p[0].toLowerCase();
|
|
p[1] = p[1].toUpperCase();
|
|
if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());
|
|
} else if (p.length === 3) {
|
|
p[0] = p[0].toLowerCase(); // if lenght 2 guess it's a country
|
|
|
|
if (p[1].length === 2) p[1] = p[1].toUpperCase();
|
|
if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();
|
|
if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());
|
|
if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());
|
|
}
|
|
|
|
return p.join('-');
|
|
}
|
|
|
|
return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;
|
|
}
|
|
}, {
|
|
key: "isWhitelisted",
|
|
value: function isWhitelisted(code) {
|
|
if (this.options.load === 'languageOnly' || this.options.nonExplicitWhitelist) {
|
|
code = this.getLanguagePartFromCode(code);
|
|
}
|
|
|
|
return !this.whitelist || !this.whitelist.length || this.whitelist.indexOf(code) > -1;
|
|
}
|
|
}, {
|
|
key: "getFallbackCodes",
|
|
value: function getFallbackCodes(fallbacks, code) {
|
|
if (!fallbacks) return [];
|
|
if (typeof fallbacks === 'string') fallbacks = [fallbacks];
|
|
if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks;
|
|
if (!code) return fallbacks.default || []; // asume we have an object defining fallbacks
|
|
|
|
var found = fallbacks[code];
|
|
if (!found) found = fallbacks[this.getScriptPartFromCode(code)];
|
|
if (!found) found = fallbacks[this.formatLanguageCode(code)];
|
|
if (!found) found = fallbacks.default;
|
|
return found || [];
|
|
}
|
|
}, {
|
|
key: "toResolveHierarchy",
|
|
value: function toResolveHierarchy(code, fallbackCode) {
|
|
var _this = this;
|
|
|
|
var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);
|
|
var codes = [];
|
|
|
|
var addCode = function addCode(c) {
|
|
if (!c) return;
|
|
|
|
if (_this.isWhitelisted(c)) {
|
|
codes.push(c);
|
|
} else {
|
|
_this.logger.warn("rejecting non-whitelisted language code: ".concat(c));
|
|
}
|
|
};
|
|
|
|
if (typeof code === 'string' && code.indexOf('-') > -1) {
|
|
if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));
|
|
if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));
|
|
if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));
|
|
} else if (typeof code === 'string') {
|
|
addCode(this.formatLanguageCode(code));
|
|
}
|
|
|
|
fallbackCodes.forEach(function (fc) {
|
|
if (codes.indexOf(fc) < 0) addCode(_this.formatLanguageCode(fc));
|
|
});
|
|
return codes;
|
|
}
|
|
}]);
|
|
return LanguageUtil;
|
|
}();
|
|
|
|
var _default = LanguageUtil;
|
|
exports.default = _default; |