bcp47-helper
Version:
A lightweight TypeScript library for parsing, validating, and managing BCP 47 language tags in Node.js and browser environments.
530 lines (523 loc) • 12.2 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BCP47Helper = {}));
})(this, (function (exports) { 'use strict';
var languageData = {
"af-ZA": {
code: "af-ZA",
fullName: "Afrikaans South Africa",
language: "Afrikaans",
region: "South Africa",
description: "South African Afrikaans"
},
"am-ET": {
code: "am-ET",
fullName: "Amharic Ethiopia",
language: "Amharic",
region: "Ethiopia",
description: "Ethiopian Amharic"
},
"ar-XA": {
code: "ar-XA",
fullName: "Arabic Standard",
language: "Arabic",
region: "Standard",
description: "Modern Standard Arabic"
},
"bg-BG": {
code: "bg-BG",
fullName: "Bulgarian Bulgaria",
language: "Bulgarian",
region: "Bulgaria",
description: "Bulgarian"
},
"bn-BD": {
code: "bn-BD",
fullName: "Bengal Bangladesh",
language: "Bengali",
region: "Bangladesh",
description: "Bangladeshi Bengali"
},
"bn-IN": {
code: "bn-IN",
fullName: "Bengal India",
language: "Bengali",
region: "India",
description: "Indian Bengali"
},
"ca-ES": {
code: "ca-ES",
fullName: "Catalan Spain",
language: "Catalan",
region: "Spain",
description: "Catalan"
},
"cmn-CN": {
code: "cmn-CN",
fullName: "Chinese Mainland",
language: "Chinese",
region: "China",
description: "Mandarin Chinese (Simplified)"
},
"cmn-TW": {
code: "cmn-TW",
fullName: "Chinese Taiwan",
language: "Chinese",
region: "Taiwan",
description: "Mandarin Chinese (Traditional)"
},
"cs-CZ": {
code: "cs-CZ",
fullName: "Czech Czechia",
language: "Czech",
region: "Czechia",
description: "Czech"
},
"da-DK": {
code: "da-DK",
fullName: "Danish Denmark",
language: "Danish",
region: "Denmark",
description: "Danish"
},
"de-DE": {
code: "de-DE",
fullName: "German Germany",
language: "German",
region: "Germany",
description: "Standard German"
},
"el-GR": {
code: "el-GR",
fullName: "Greek Greece",
language: "Greek",
region: "Greece",
description: "Modern Greek"
},
"en-AU": {
code: "en-AU",
fullName: "English Australia",
language: "English",
region: "Australia",
description: "Australian English"
},
"en-GB": {
code: "en-GB",
fullName: "English GB",
language: "English",
region: "United Kingdom",
description: "British English"
},
"en-IN": {
code: "en-IN",
fullName: "English India",
language: "English",
region: "India",
description: "Indian English"
},
"en-US": {
code: "en-US",
fullName: "English US",
language: "English",
region: "United States",
description: "US English"
},
"es-ES": {
code: "es-ES",
fullName: "Spanish Spain",
language: "Spanish",
region: "Spain",
description: "European Spanish"
},
"es-US": {
code: "es-US",
fullName: "Spanish US",
language: "Spanish",
region: "United States",
description: "US Spanish"
},
"eu-ES": {
code: "eu-ES",
fullName: "Basque Spain",
language: "Basque",
region: "Spain",
description: "Basque"
},
"fi-FI": {
code: "fi-FI",
fullName: "Finnish Finland",
language: "Finnish",
region: "Finland",
description: "Finnish"
},
"fil-PH": {
code: "fil-PH",
fullName: "Filipino Philippines",
language: "Filipino",
region: "Philippines",
description: "Filipino"
},
"fr-CA": {
code: "fr-CA",
fullName: "French Canada",
language: "French",
region: "Canada",
description: "Canadian French"
},
"fr-FR": {
code: "fr-FR",
fullName: "French France",
language: "French",
region: "France",
description: "European French"
},
"gl-ES": {
code: "gl-ES",
fullName: "Galician Spain",
language: "Galician",
region: "Spain",
description: "Galician"
},
"gu-IN": {
code: "gu-IN",
fullName: "Gujarati India",
language: "Gujarati",
region: "India",
description: "Gujarati"
},
"hi-IN": {
code: "hi-IN",
fullName: "Hindi India",
language: "Hindi",
region: "India",
description: "Indian Hindi"
},
"hu-HU": {
code: "hu-HU",
fullName: "Hungarian Hungary",
language: "Hungarian",
region: "Hungary",
description: "Hungarian"
},
"id-ID": {
code: "id-ID",
fullName: "Indonesian Indonesia",
language: "Indonesian",
region: "Indonesia",
description: "Indonesian"
},
"is-IS": {
code: "is-IS",
fullName: "Icelandic Iceland",
language: "Icelandic",
region: "Iceland",
description: "Icelandic"
},
"it-IT": {
code: "it-IT",
fullName: "Italian Italy",
language: "Italian",
region: "Italy",
description: "Standard Italian"
},
"ja-JP": {
code: "ja-JP",
fullName: "Japanese Japan",
language: "Japanese",
region: "Japan",
description: "Standard Japanese"
},
"kn-IN": {
code: "kn-IN",
fullName: "Kannada India",
language: "Kannada",
region: "India",
description: "Kannada"
},
"ko-KR": {
code: "ko-KR",
fullName: "Korean South Korea",
language: "Korean",
region: "South Korea",
description: "Standard Korean"
},
"lt-LT": {
code: "lt-LT",
fullName: "Lithuanian Lithuania",
language: "Lithuanian",
region: "Lithuania",
description: "Lithuanian"
},
"lv-LV": {
code: "lv-LV",
fullName: "Latvian Latvia",
language: "Latvian",
region: "Latvia",
description: "Latvian"
},
"ml-IN": {
code: "ml-IN",
fullName: "Malayalam India",
language: "Malayalam",
region: "India",
description: "Malayalam"
},
"mr-IN": {
code: "mr-IN",
fullName: "Marathi India",
language: "Marathi",
region: "India",
description: "Marathi"
},
"ms-MY": {
code: "ms-MY",
fullName: "Malay Malaysia",
language: "Malay",
region: "Malaysia",
description: "Malay"
},
"nb-NO": {
code: "nb-NO",
fullName: "Norwegian Norway",
language: "Norwegian",
region: "Norway",
description: "Norwegian Bokmål"
},
"nl-BE": {
code: "nl-BE",
fullName: "Dutch Belgium",
language: "Dutch",
region: "Belgium",
description: "Belgian Dutch"
},
"nl-NL": {
code: "nl-NL",
fullName: "Dutch Netherlands",
language: "Dutch",
region: "Netherlands",
description: "Standard Dutch"
},
"pa-IN": {
code: "pa-IN",
fullName: "Punjabi India",
language: "Punjabi",
region: "India",
description: "Punjabi"
},
"pl-PL": {
code: "pl-PL",
fullName: "Polish Poland",
language: "Polish",
region: "Poland",
description: "Polish"
},
"pt-BR": {
code: "pt-BR",
fullName: "Portuguese Brazil",
language: "Portuguese",
region: "Brazil",
description: "Brazilian Portuguese"
},
"pt-PT": {
code: "pt-PT",
fullName: "Portuguese Portugal",
language: "Portuguese",
region: "Portugal",
description: "European Portuguese"
},
"ro-RO": {
code: "ro-RO",
fullName: "Romanian Romania",
language: "Romanian",
region: "Romania",
description: "Romanian"
},
"ru-RU": {
code: "ru-RU",
fullName: "Russian Russia",
language: "Russian",
region: "Russia",
description: "Standard Russian"
},
"sk-SK": {
code: "sk-SK",
fullName: "Slovak Slovakia",
language: "Slovak",
region: "Slovakia",
description: "Slovak"
},
"sr-RS": {
code: "sr-RS",
fullName: "Serbian Serbia",
language: "Serbian",
region: "Serbia",
description: "Serbian"
},
"sv-SE": {
code: "sv-SE",
fullName: "Swedish Sweden",
language: "Swedish",
region: "Sweden",
description: "Swedish"
},
"ta-IN": {
code: "ta-IN",
fullName: "Tamil India",
language: "Tamil",
region: "India",
description: "Tamil"
},
"te-IN": {
code: "te-IN",
fullName: "Telugu India",
language: "Telugu",
region: "India",
description: "Telugu"
},
"th-TH": {
code: "th-TH",
fullName: "Thai Thailand",
language: "Thai",
region: "Thailand",
description: "Thai"
},
"tr-TR": {
code: "tr-TR",
fullName: "Turkish Turkey",
language: "Turkish",
region: "Turkey",
description: "Turkish"
},
"uk-UA": {
code: "uk-UA",
fullName: "Ukrainian Ukraine",
language: "Ukrainian",
region: "Ukraine",
description: "Ukrainian"
},
"ur-IN": {
code: "ur-IN",
fullName: "Urdu India",
language: "Urdu",
region: "India",
description: "Urdu"
},
"vi-VN": {
code: "vi-VN",
fullName: "Vietnamese Vietnam",
language: "Vietnamese",
region: "Vietnam",
description: "Vietnamese"
},
"yue-HK": {
code: "yue-HK",
fullName: "Cantonese Hong Kong",
language: "Cantonese",
region: "Hong Kong",
description: "Cantonese"
}
};
function normalizeCode(code) {
var parts = code.trim().split('-');
if (parts.length === 2) {
return "".concat(parts[0].toLowerCase(), "-").concat(parts[1].toUpperCase());
}
return code.toLowerCase();
}
var data = languageData;
/**
* Normalize and map array of codes to full names
*/
function mapLanguages(codes) {
var result = {};
codes.forEach(function (code) {
var norm = normalizeCode(code);
if (data[norm]) {
result[norm] = data[norm].fullName;
}
});
return result;
}
/**
* Get language info by code
*/
function getLanguageInfo(code) {
var norm = normalizeCode(code);
return data[norm] || null;
}
/**
* Get all language variants from a base language code
*/
function getAvailableVariants(baseLangs) {
var bases = typeof baseLangs === 'string' ? [baseLangs] : baseLangs;
var result = {};
bases.forEach(function (base) {
for (var _i = 0, _a = Object.entries(data); _i < _a.length; _i++) {
var _b = _a[_i], code = _b[0], info = _b[1];
if (code.toLowerCase().startsWith(base.toLowerCase())) {
result[code] = info.fullName;
}
}
});
return result;
}
/**
* ✅ NEW: Return all codes with their full names
*/
function listAllLanguages() {
var result = {};
for (var _i = 0, _a = Object.entries(data); _i < _a.length; _i++) {
var _b = _a[_i], code = _b[0], info = _b[1];
result[code] = info.fullName;
}
return result;
}
/**
* ✅ NEW: Search by full name, region or language (case-insensitive)
*/
function searchByName(term) {
var result = {};
var lowerTerm = term.toLowerCase();
for (var _i = 0, _a = Object.entries(data); _i < _a.length; _i++) {
var _b = _a[_i], code = _b[0], info = _b[1];
if (info.fullName.toLowerCase().includes(lowerTerm) ||
info.language.toLowerCase().includes(lowerTerm) ||
info.region.toLowerCase().includes(lowerTerm)) {
result[code] = info.fullName;
}
}
return result;
}
/**
* ✅ NEW: Group language codes under base language
*/
function groupByLanguage() {
var result = {};
for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
var code = _a[_i];
var base = code.split('-')[0];
if (!result[base]) {
result[base] = [];
}
result[base].push(code);
}
return result;
}
/**
* ✅ NEW: Validate if a code exists in dataset
*/
function validateCode(code) {
var norm = normalizeCode(code);
return !!data[norm];
}
exports.getAvailableVariants = getAvailableVariants;
exports.getLanguageInfo = getLanguageInfo;
exports.groupByLanguage = groupByLanguage;
exports.listAllLanguages = listAllLanguages;
exports.mapLanguages = mapLanguages;
exports.searchByName = searchByName;
exports.validateCode = validateCode;
Object.defineProperty(exports, '__esModule', { value: true });
}));
//# sourceMappingURL=bcp47-helper.js.map