const codes = require('./codes.json'); const registeredLocales = {}; /* * All codes map to ISO 3166-1 alpha-2 */ const alpha2 = {}; const alpha3T = {}; const alpha3B = {}; const invertedAlpha3B = {}; codes.forEach((codeInformation) => { const [first, second, third] = codeInformation; alpha2[first] = second; alpha3T[second] = first; alpha3B[third] = first; invertedAlpha3B[first] = third; }); function registerLocale(localeData) { if (!localeData.locale) { throw new TypeError('Missing localeData.locale'); } if (!localeData.languages) { throw new TypeError('Missing localeData.languages'); } registeredLocales[localeData.locale] = localeData.languages; } /* * @param code Alpha-3T code * @return Alpha-2 code or undefined */ function alpha3TToAlpha2(code) { return alpha3T[code]; } /* * @param code Alpha-3B code * @return Alpha-2 code or undefined */ function alpha3BToAlpha2(code) { return alpha3B[code]; } /* * @param code Alpha-2 code * @return Alpha-3T code or undefined */ function alpha2ToAlpha3T(code) { return alpha2[code]; } /* * @param code Alpha-2 code * @return Alpha-3B code or undefined */ function alpha2ToAlpha3B(code) { return invertedAlpha3B[code]; } /* * @param code ISO 639-1 alpha-2, ISO 639-2 alpha-3 T or B * @return ISO 639-2 alpha-3 T */ function toAlpha3T(code) { if (typeof code !== 'string') { return undefined; } const codeLower = code.toLowerCase(); if (code.length === 2) { return alpha2ToAlpha3T(codeLower); } if (code.length === 3) { if (alpha3T[codeLower]) { return codeLower; } if (alpha3BToAlpha2(codeLower)) { return alpha2ToAlpha3T(alpha3BToAlpha2(codeLower)); } } return undefined; } /* * @param code ISO 639-1 alpha-2, ISO 639-2 alpha-3 T or B * @return ISO 639-2 alpha-3 B */ function toAlpha3B(code) { if (typeof code !== 'string') { return undefined; } const codeLower = code.toLowerCase(); if (code.length === 2) { return alpha2ToAlpha3B(codeLower); } if (code.length === 3) { if (alpha3B[codeLower]) { return codeLower; } if (alpha3T[codeLower]) { return alpha2ToAlpha3B(alpha3TToAlpha2(codeLower)); } } return undefined; } /* * @param code ISO 639-1 alpha-2, ISO 639-2 alpha-3 T or B * @return ISO 639-1 alpha-2 */ function toAlpha2(code) { if (typeof code !== 'string') { return undefined; } const codeLower = code.toLowerCase(); if (code.length === 2) { return codeLower; } if (code.length === 3) { if (alpha3B[codeLower]) { return alpha3BToAlpha2(codeLower); } if (alpha3T[codeLower]) { return alpha3TToAlpha2(codeLower); } } return undefined; } /* * @param code ISO 639-1 alpha-2, ISO 639-2 alpha-3 T or B * @param lang language for country name * @return name or undefined */ function getName(code, lang) { try { const d = registeredLocales[lang.toLowerCase()]; return d[toAlpha2(code)]; } catch (err) { return undefined; } } /* * @param lang language for language names * @return Object of language code mapped to language name */ function getNames(lang) { const d = registeredLocales[lang.toLowerCase()]; if (d === undefined) { return {}; } return d; } /* * @param name name * @param lang language for language name * @return ISO 639-1 alpha-2 or undefined */ function getAlpha2Code(name, lang) { try { let p; const codenames = registeredLocales[lang.toLowerCase()]; // eslint-disable-next-line no-restricted-syntax -- for loop for early exit for (p in codenames) { if (codenames[p].toLowerCase() === name.toLowerCase()) { return p; } } return undefined; } catch (err) { return undefined; } } /* * @return Object of alpha-2 codes mapped to alpha-3 T codes */ function getAlpha2Codes() { return alpha2; } /* * @param name name * @param lang language for country name * @return ISO 639-2 alpha-3 T or undefined */ function getAlpha3TCode(name, lang) { const code = getAlpha2Code(name, lang); if (code) { return toAlpha3T(code); } return undefined; } /* * @param name name * @param lang language for country name * @return ISO 639-2 alpha-3 B or undefined */ function getAlpha3BCode(name, lang) { const code = getAlpha2Code(name, lang); if (code) { return toAlpha3B(code); } return undefined; } /* * @return Object of alpha-3 T codes mapped to alpha-2 codes */ function getAlpha3TCodes() { return alpha3T; } /* * @return Object of alpha-3 B codes mapped to alpha-2 codes */ function getAlpha3BCodes() { return alpha3B; } /* * @return Array of supported languages */ function langs() { return Object.keys(registeredLocales); } /* * @param code ISO 639-1 alpha-2, 639-2 alpha-3 T or B code * @return Boolean */ function isValid(code) { return toAlpha3T(code) !== undefined; } exports.alpha2ToAlpha3B = alpha2ToAlpha3B; exports.alpha2ToAlpha3T = alpha2ToAlpha3T; exports.alpha3BToAlpha2 = alpha3BToAlpha2; exports.alpha3TToAlpha2 = alpha3TToAlpha2; exports.getAlpha2Code = getAlpha2Code; exports.getAlpha2Codes = getAlpha2Codes; exports.getAlpha3BCode = getAlpha3BCode; exports.getAlpha3BCodes = getAlpha3BCodes; exports.getAlpha3TCode = getAlpha3TCode; exports.getAlpha3TCodes = getAlpha3TCodes; exports.getName = getName; exports.getNames = getNames; exports.isValid = isValid; exports.langs = langs; exports.registerLocale = registerLocale; exports.toAlpha2 = toAlpha2; exports.toAlpha3B = toAlpha3B; exports.toAlpha3T = toAlpha3T;