mui-language-picker
Version:
Material UI language picker
133 lines (132 loc) • 4.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.bcp47Match = bcp47Match;
exports.bcp47Parse = bcp47Parse;
exports.bcp47Index = bcp47Index;
exports.bcp47Find = bcp47Find;
var langTags_1 = require("./langTags");
// https://tools.ietf.org/html/bcp47 page 4
var lgPat = /^([a-z]{2,3}(-[a-z]{3}){0,3})(-[A-Z][a-z]{3})?(-[A-Z]{2}|-[0-9]{3})?(-[0-9a-z]{5,8}|-[0-9][0-9a-zA-Z]{3})*(-([0-9A-WY-Za-wy-z]-[0-9A-Za-z]{2,8}|fonipa))*(-[xX]-[0-9a-zA-Z]{1,8})*$/;
function bcp47Match(code) {
var result = lgPat.test(code);
if (result)
return result;
return /en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE/.test(code);
}
var multi = function (pat, input) {
var result = Array();
var index = 0;
while (true) {
var puItem = pat.exec(input.slice(index));
if (!puItem)
break;
result.push(puItem[1]);
index += puItem.index + puItem[1].length;
}
return result;
};
function bcp47Parse(code) {
var match = lgPat.exec(code);
// console.log(match);
var language = match ? match[1] : null;
var extlang = match && match[2] ? match[2].slice(1) : null;
var script = match && match[3] ? match[3].slice(1) : null;
var region = match && match[4] ? match[4].slice(1) : null;
var variant = match && match[5] ? match[5].slice(1) : null;
var extension = match && match[6] ? match[6].slice(1) : null;
var privateUse = multi(/-[xX]-([0-9a-zA-Z]{1,8})/, code);
var irregular = !match && bcp47Match(code) ? code : null;
return {
language: language,
script: script,
region: region,
variant: variant,
extension: extension,
privateUse: privateUse,
irregular: irregular,
extlang: extlang,
};
}
var tagLen = function (i) {
var tag = langTags_1.langTags[i];
return tag.full ? tag.full.length + tag.tag.length : tag.tag.length;
};
function bcp47Index(code) {
var _a;
if (!bcp47Match(code))
return null;
var exact = Array();
langTags_1.langTags.forEach(function (lt, i) {
if (lt.tag === code)
exact.push(i);
});
if (exact.length === 1)
return exact;
var inAll = Array();
langTags_1.langTags.forEach(function (lt, i) {
if (lt.iso639_3 === code) {
inAll.push(i);
}
else {
if (lt.tags && lt.tags.filter(function (ltTag) { return ltTag === code; }).length > 0)
inAll.push(i);
}
});
if (inAll.length === 1)
return inAll;
if (inAll.length > 0)
return inAll.sort(function (i, j) { return (langTags_1.langTags[i].name < langTags_1.langTags[j].name ? -1 : 1); });
var part = Array();
langTags_1.langTags.forEach(function (lt, i) {
if (lt.full && lt.full === code.slice(0, lt.full.length)) {
part.push(i);
}
else {
if (lt.tag === code.slice(0, lt.tag.length))
part.push(i);
}
});
if (part.length === 0) {
var parse = bcp47Parse(code);
if (!parse.extlang)
return part;
var parts = (_a = parse.language) === null || _a === void 0 ? void 0 : _a.split('-');
var isValid_1 = true;
parts === null || parts === void 0 ? void 0 : parts.forEach(function (pt, j) {
var codeFound = false;
var ptLen = pt.length;
langTags_1.langTags.forEach(function (lt, i) {
if (j === 0 && lt.tag.slice(0, ptLen) === pt) {
codeFound = true;
}
else if (lt.tag === pt) {
codeFound = true;
if (!part.includes(i))
part.push(i);
}
});
if (!codeFound)
isValid_1 = false;
});
if (!isValid_1)
return [];
return part.sort(function (i, j) { return (tagLen(i) < tagLen(j) ? -1 : 1); });
}
var spart = part.sort(function (i, j) { return (tagLen(i) < tagLen(j) ? 1 : -1); });
if (spart.length <= 1)
return part;
var long = tagLen(spart[0]);
var longList = part
.filter(function (ll) { return tagLen(ll) === long; })
.sort(function (i, j) { return (langTags_1.langTags[i].name < langTags_1.langTags[j].name ? -1 : 1); });
return longList;
}
function bcp47Find(code) {
var _a;
var result = (_a = bcp47Index(code)) === null || _a === void 0 ? void 0 : _a.map(function (i) { return langTags_1.langTags[i]; }).sort(function (i, j) { return (i.tag < j.tag ? -1 : 1); });
if ((result === null || result === void 0 ? void 0 : result.length) === 0)
return null;
if ((result === null || result === void 0 ? void 0 : result.length) === 1)
return result[0];
return result;
}