@ntpu/i18n-iso-countries
Version:
i18n for ISO 3166-1 country codes
280 lines (251 loc) • 6.02 kB
JavaScript
;
var codes = require("./codes.json");
var removeDiacritics = require('diacritics').remove;
var registeredLocales = {};
/*
* All codes map to ISO 3166-1 alpha-2
*/
var alpha2 = {},
alpha3 = {},
numeric = {},
invertedNumeric = {};
codes.forEach(function(codeInformation) {
var s = codeInformation;
alpha2[s[0]] = s[1];
alpha3[s[1]] = s[0];
numeric[s[2]] = s[0];
invertedNumeric[s[0]] = s[2];
});
function formatNumericCode(code) {
return String('000'+(code ? code : '')).slice(-3);
}
function registerLocale(localeData) {
if (!localeData.locale) {
throw new TypeError('Missing localeData.locale');
}
if (!localeData.countries) {
throw new TypeError('Missing localeData.countries');
}
registeredLocales[localeData.locale] = localeData.countries;
}
exports.registerLocale = registerLocale;
/*
* @param code Alpha-3 code
* @return Alpha-2 code or undefined
*/
function alpha3ToAlpha2(code) {
return alpha3[code];
}
exports.alpha3ToAlpha2 = alpha3ToAlpha2;
/*
* @param code Alpha-2 code
* @return Alpha-3 code or undefined
*/
function alpha2ToAlpha3(code) {
return alpha2[code];
}
exports.alpha2ToAlpha3 = alpha2ToAlpha3;
/*
* @param code Alpha-3 code
* @return Numeric code or undefined
*/
function alpha3ToNumeric(code) {
return invertedNumeric[alpha3ToAlpha2(code)];
}
exports.alpha3ToNumeric = alpha3ToNumeric;
/*
* @param code Alpha-2 code
* @return Numeric code or undefined
*/
function alpha2ToNumeric(code) {
return invertedNumeric[code];
}
exports.alpha2ToNumeric = alpha2ToNumeric;
/*
* @param code Numeric code
* @return Alpha-3 code or undefined
*/
function numericToAlpha3(code) {
var padded = formatNumericCode(code);
return alpha2ToAlpha3(numeric[padded]);
}
exports.numericToAlpha3 = numericToAlpha3;
/*
* @param code Numeric code
* @return Alpha-2 code or undefined
*/
function numericToAlpha2(code) {
var padded = formatNumericCode(code);
return numeric[padded];
}
exports.numericToAlpha2 = numericToAlpha2;
/*
* @param code ISO 3166-1 alpha-2, alpha-3 or numeric code
* @return ISO 3166-1 alpha-3
*/
function toAlpha3(code) {
if (typeof code === "string") {
if (/^[0-9]*$/.test(code)) {
return numericToAlpha3(code);
}
if(code.length === 2) {
return alpha2ToAlpha3(code.toUpperCase());
}
if (code.length === 3) {
return code.toUpperCase();
}
}
if (typeof code === "number") {
return numericToAlpha3(code);
}
return undefined;
}
exports.toAlpha3 = toAlpha3;
/*
* @param code ISO 3166-1 alpha-2, alpha-3 or numeric code
* @return ISO 3166-1 alpha-2
*/
function toAlpha2(code) {
if (typeof code === "string") {
if (/^[0-9]*$/.test(code)) {
return numericToAlpha2(code);
}
if (code.length === 2) {
return code.toUpperCase();
}
if(code.length === 3) {
return alpha3ToAlpha2(code.toUpperCase());
}
}
if (typeof code === "number") {
return numericToAlpha2(code);
}
return undefined;
}
exports.toAlpha2 = toAlpha2;
/*
* @param code ISO 3166-1 alpha-2, alpha-3 or numeric code
* @param lang language for country name
* @return name or undefined
*/
exports.getName = function(code, lang) {
try {
var d = registeredLocales[lang.toLowerCase()];
return d[toAlpha2(code)];
} catch (err) {
return undefined;
}
};
/*
* @param lang language for country names
* @return Object of country code mapped to county name
*/
exports.getNames = function(lang) {
var d = registeredLocales[lang.toLowerCase()];
if (d === undefined) {
return {};
}
return d;
};
/*
* @param name name
* @param lang language for country name
* @return ISO 3166-1 alpha-2 or undefined
*/
exports.getAlpha2Code = function(name, lang) {
try {
var p, codenames = registeredLocales[lang.toLowerCase()];
for (p in codenames) {
if (codenames.hasOwnProperty(p)) {
if (codenames[p].toLowerCase() === name.toLowerCase()) {
return p;
}
}
}
return undefined;
} catch (err) {
return undefined;
}
};
/*
* @param name name
* @param lang language for country name
* @return ISO 3166-1 alpha-2 or undefined
*/
exports.getSimpleAlpha2Code = function(name, lang) {
try {
var p, codenames = registeredLocales[lang.toLowerCase()];
for (p in codenames) {
if (codenames.hasOwnProperty(p)) {
if (removeDiacritics(codenames[p].toLowerCase()) === removeDiacritics(name.toLowerCase())) {
return p;
}
}
}
return undefined;
} catch (err) {
return undefined;
}
};
/*
* @return Object of alpha-2 codes mapped to alpha-3 codes
*/
exports.getAlpha2Codes = function() {
return alpha2;
};
/*
* @param name name
* @param lang language for country name
* @return ISO 3166-1 alpha-3 or undefined
*/
exports.getAlpha3Code = function(name, lang) {
var alpha2 = this.getAlpha2Code(name, lang);
if (alpha2) {
return this.toAlpha3(alpha2);
} else {
return undefined;
}
};
/*
* @param name name
* @param lang language for country name
* @return ISO 3166-1 alpha-3 or undefined
*/
exports.getSimpleAlpha3Code = function(name, lang) {
var alpha2 = this.getSimpleAlpha2Code(name, lang);
if (alpha2) {
return this.toAlpha3(alpha2);
} else {
return undefined;
}
};
/*
* @return Object of alpha-3 codes mapped to alpha-2 codes
*/
exports.getAlpha3Codes = function() {
return alpha3;
};
/*
* @return Object of numeric codes mapped to alpha-2 codes
*/
exports.getNumericCodes = function() {
return numeric;
};
/*
* @return Array of supported languages
*/
exports.langs = function() {
return Object.keys(registeredLocales);
};
/*
* @param code ISO 3166-1 alpha-2, alpha-3 or numeric code
* @return Boolean
*/
exports.isValid = function(code) {
if (!code) {
return false;
}
var coerced = code.toString().toUpperCase();
return alpha3.hasOwnProperty(coerced) || alpha2.hasOwnProperty(coerced) ||
numeric.hasOwnProperty(coerced);
};