validate a text input for BCP 47 language tag
by Imri Paloja
JavaScript
const bcp47Regex =
/^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-[a-zA-Z]{2}|\-[0-9]{3})?(?:-[a-zA-Z0-9]{5,8})*$/;
function isValidBCP47(tag) {
return bcp47Regex.test(tag);
}
console.log(isValidBCP47('en')); // true
console.log(isValidBCP47('en-US')); // true
console.log(isValidBCP47('zh-Hans-CN')); // true
console.log(isValidBCP47('english')); // false
function normalizeBCP47(tag) {
return tag
.split('-')
.map((part, i) => {
if (i === 0) return part.toLowerCase(); // language
if (part.length === 4)
// script
return part[0].toUpperCase() + part.slice(1).toLowerCase();
if (part.length === 2 || part.length === 3)
// region
return part.toUpperCase();
return part.toLowerCase(); // variants
})
.join('-');
}
console.log(normalizeBCP47('EN-hans-us')); // en-Hans-US