in globalize/globalize.ts [1327:1407]
Globalize.findClosestCulture = function (name) {
var match;
if (!name) {
return this.cultures[this.cultureSelector] || this.cultures["default"];
}
if (typeof name === "string") {
name = name.split(",");
}
if (isArray(name)) {
var lang,
cultures = this.cultures,
list = name,
i, l = list.length,
prioritized = [];
for (i = 0; i < l; i++) {
name = trim(list[i]);
var pri, parts = name.split(";");
lang = trim(parts[0]);
if (parts.length === 1) {
pri = 1;
}
else {
name = trim(parts[1]);
if (name.indexOf("q=") === 0) {
name = name.substr(2);
pri = parseFloat(name);
pri = isNaN(pri) ? 0 : pri;
}
else {
pri = 1;
}
}
prioritized.push({ lang: lang, pri: pri });
}
prioritized.sort(function (a, b) {
return a.pri < b.pri ? 1 : -1;
});
// exact match
for (i = 0; i < l; i++) {
lang = prioritized[i].lang;
match = cultures[lang];
if (match) {
return match;
}
}
// neutral language match
for (i = 0; i < l; i++) {
lang = prioritized[i].lang;
do {
var index = lang.lastIndexOf("-");
if (index === -1) {
break;
}
// strip off the last part. e.g. en-US => en
lang = lang.substr(0, index);
match = cultures[lang];
if (match) {
return match;
}
}
while (1);
}
// last resort: match first culture using that language
for (i = 0; i < l; i++) {
lang = prioritized[i].lang;
for (var cultureKey in cultures) {
var culture = cultures[cultureKey];
if (culture.language == lang) {
return culture;
}
}
}
}
else if (typeof name === "object") {
return name;
}
return match || null;
};