File size: 2,152 Bytes
befd7da |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
var regex = /((([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?)*/g;
module.exports.parse = function(al){
var strings = (al || "").match(regex);
return strings.map(function(m){
if(!m){
return;
}
var bits = m.split(';');
var ietf = bits[0].split('-');
var hasScript = ietf.length === 3;
return {
code: ietf[0],
script: hasScript ? ietf[1] : null,
region: hasScript ? ietf[2] : ietf[1],
quality: bits[1] ? parseFloat(bits[1].split('=')[1]) : 1.0
};
}).filter(function(r){
return r;
}).sort(function(a, b){
return b.quality - a.quality;
});
};
module.exports.pick = function(supportedLanguages, acceptLanguage){
if (!supportedLanguages || !supportedLanguages.length || !acceptLanguage) {
return null;
}
var accept = this.parse(acceptLanguage);
var supported = supportedLanguages.map(function(support){
var bits = support.split('-');
var hasScript = bits.length === 3;
return {
code: bits[0],
script: hasScript ? bits[1] : null,
region: hasScript ? bits[2] : bits[1]
};
});
for (var i = 0; i < accept.length; i++) {
var lang = accept[i];
var langCode = lang.code.toLowerCase();
var langRegion = lang.region ? lang.region.toLowerCase() : lang.region;
var langScript = lang.script ? lang.script.toLowerCase() : lang.script;
for (var j = 0; j < supported.length; j++) {
var supportedCode = supported[j].code.toLowerCase();
var supportedScript = supported[j].script ? supported[j].script.toLowerCase() : supported[j].script;
var supportedRegion = supported[j].region ? supported[j].region.toLowerCase() : supported[j].region;
if (langCode === supportedCode &&
(!langScript || langScript === supportedScript) &&
(!langRegion || langRegion === supportedRegion)) {
return supportedLanguages[j];
}
}
}
return null;
};
|