i18n-iso-countries vs country-list vs country-data vs countries-list
Comparing Popular npm Packages for Country Data: Features, Maintenance, and Use Cases
i18n-iso-countriescountry-listcountry-datacountries-listSimilar Packages:

Comparing Popular npm Packages for Country Data: Features, Maintenance, and Use Cases

countries-list, country-data, country-list, and i18n-iso-countries are npm packages that provide country-related information such as names, ISO codes, currencies, calling codes, and more. These utilities are commonly used in internationalization (i18n), form validation, dropdowns, or geolocation features. While they share overlapping goals, they differ significantly in data structure, completeness, update frequency, bundle size, and API design. Note that i18n-iso-countries appears twice in the input list but is a single package.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
i18n-iso-countries2,005,498898624 kB56a year agoMIT
country-list380,35928216.9 kB18 months agoMIT
country-data118,864518-3510 years agoMIT
countries-list01,311274 kB92 months agoMIT

Comparing Popular npm Packages for Country Data: Features, Maintenance, and Use Cases

When building applications that handle international users—such as e-commerce checkouts, user profiles, or shipping forms—you often need reliable country data. Five packages are frequently considered: countries-list, country-data, country-list, and i18n-iso-countries (listed twice in the query, but it's one package). Let’s compare them across key dimensions.

📦 Data Completeness & Structure

countries-list

  • Fields per country: name, native, phone, continent, capital, currency, languages, emoji, emojiU
  • Format: Clean, nested JSON objects keyed by ISO 3166-1 alpha-2 code
  • Example:
import countries from 'countries-list';
console.log(countries.US); 
// { name: "United States", native: "United States", phone: "1", ... }

country-data

  • Fields: Only name, alpha2, alpha3
  • Format: Array of flat objects
  • Last updated: 2017 — may miss recent changes (e.g., Eswatini instead of Swaziland)
  • Example:
import { countries } from 'country-data';
console.log(countries.all[0]); // { name: "Afghanistan", alpha2: "AF", alpha3: "AFG" }

country-list

  • Fields: Only { [code]: name } mapping
  • No extra metadata — purely for display or basic lookup
  • Example:
import countries from 'country-list';
countries.getCode('United States'); // 'US'

i18n-iso-countries

  • Focus: ISO 3166-1 compliance + localization
  • Supports 30+ languages via registerLocale(require('i18n-iso-countries/langs/en.json'))
  • Validation methods: isValid(alpha2), getAlpha2Code(name, lang)
  • Example:
import countries from 'i18n-iso-countries';
import en from 'i18n-iso-countries/langs/en.json';
countries.registerLocale(en);
countries.getName('US', 'en'); // "United States"

🔄 Maintenance & Reliability

PackageLast PublishedGitHub StarsActively Maintained?
countries-list2024~2.5k✅ Yes
country-data2017~1.2k❌ No
country-list2023~800⚠️ Minimal updates
i18n-iso-countries2024~2.8k✅ Yes

⚠️ Avoid country-data for production apps due to outdated geopolitical data.

📦 Bundle Size (Minified)

  • countries-list: ~50 KB (but supports tree-shaking — you can import only what you need)
  • country-data: ~15 KB
  • country-list: ~4 KB
  • i18n-iso-countries: ~10 KB core + ~5 KB per language file (lazy-loadable)

For performance-sensitive apps (e.g., mobile web), country-list or selective imports from countries-list are optimal.

🌍 Internationalization (i18n) Support

Only i18n-iso-countries offers true multilingual support out of the box. The others provide English-only names.

  • Need to show country names in German, Japanese, or Arabic? → i18n-iso-countries
  • Building an English-only app with rich metadata? → countries-list

🔧 API Flexibility

  • countries-list: Pure data — no methods. Flexible for any use case.
  • i18n-iso-countries: Rich API (getNames(), isValid(), toAlpha3()) — great for validation.
  • country-list: Simple getter functions — ideal for basic UI dropdowns.
  • country-data: Read-only array — requires manual indexing.

✅ Recommendation by Use Case

Use CaseRecommended Package
Modern React app with country dropdown + emoji flagscountries-list
Multilingual enterprise applicationi18n-iso-countries
Lightweight form with country selectorcountry-list
Legacy project (avoid new usage)country-data

💡 Final Thoughts

  • For most new projects, countries-list strikes the best balance: up-to-date, rich data, small footprint, and zero dependencies.
  • For i18n-heavy apps, i18n-iso-countries is the gold standard despite its steeper setup.
  • Avoid country-data unless maintaining old code.
  • Use country-list only when every byte counts and you need nothing beyond name ↔ code mapping.

All four serve valid niches—but choose based on your app’s scale, language needs, and maintenance expectations.

How to Choose: i18n-iso-countries vs country-list vs country-data vs countries-list

  • i18n-iso-countries:

    Choose i18n-iso-countries if your project requires strict ISO 3166 compliance, multilingual country names (via locale registration), and validation utilities (e.g., checking if a code is valid). It’s widely used in enterprise i18n workflows and integrates well with libraries like i18next. However, it requires manual locale loading and has a slightly more verbose API.

  • country-list:

    Choose country-list if you only need simple mappings between country names and ISO 3166-1 alpha-2 codes (e.g., { 'US': 'United States' }). It’s extremely lightweight (<5KB) but lacks additional fields like currencies, phone codes, or multilingual support. Best for basic select inputs where minimal bundle impact is critical.

  • country-data:

    Choose country-data if you prefer a minimalistic approach with basic country info (name, alpha-2/3 codes) and don’t require extensive metadata like currencies or languages. However, note that this package hasn’t been updated since 2017 and may contain outdated geopolitical data.

  • countries-list:

    Choose countries-list if you need a lightweight (~50KB minified), modern, and well-maintained package with comprehensive country data including names, native names, phone codes, currencies, emoji flags, and continents. It supports tree-shaking and provides data in a clean, consistent JSON format. Ideal for React/Vue apps requiring international dropdowns or country metadata without heavy dependencies.

README for i18n-iso-countries

i18n-iso-countries

i18n for ISO 3166-1 country codes. We support Alpha-2, Alpha-3 and Numeric codes from 'Wikipedia: Officially assigned code elements'

Installing

Install it using npm: npm install i18n-iso-countries

var countries = require("i18n-iso-countries");

If you use i18n-iso-countries with Node.js, you are done. If you use the package in a browser environment, you have to register the languages you want to use to minimize the file size.

// Support french & english languages.
countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
countries.registerLocale(require("i18n-iso-countries/langs/fr.json"));

Code to Country

Get the name of a country by its ISO 3166-1 Alpha-2, Alpha-3 or Numeric code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("US (Alpha-2) => " + countries.getName("US", "en")); // United States of America
console.log("US (Alpha-2) => " + countries.getName("US", "de")); // Vereinigte Staaten von Amerika
console.log("USA (Alpha-3) => " + countries.getName("USA", "en")); // United States of America
console.log("USA (Numeric) => " + countries.getName("840", "en")); // United States of America

Get aliases/short name using select

// Some countries have alias/short names defined. `select` is used to control which
// name will be returned.
console.log("GB (select: official) => " + countries.getName("GB", "en", {select: "official"})); // United Kingdom
console.log("GB (select: alias) => " + countries.getName("GB", "en", {select: "alias"})); // UK
console.log("GB (select: all) => " + countries.getName("GB", "en", {select: "all"})); // ["United Kingdom", "UK", "Great Britain"]
// Countries without an alias will always return the offical name
console.log("LT (select: official) => " + countries.getName("LT", "en", {select: "official"})); // Lithuania
console.log("LT (select: alias) => " + countries.getName("LT", "en", {select: "alias"})); // Lithuania
console.log("LT (select: all) => " + countries.getName("LT", "en", {select: "all"})); // ["Lithuania"]

Get all names by their ISO 3166-1 Alpha-2 code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.getNames("en", {select: "official"})); // { 'AF': 'Afghanistan', 'AL': 'Albania', [...], 'ZM': 'Zambia', 'ZW': 'Zimbabwe' }

Supported languages (ISO 639-1)

In case you want to add new language, please refer ISO 639-1 table.

  • af: Afrikaans
  • am: Amharic
  • ar: Arabic
  • az: Azerbaijani
  • be: Belorussian
  • bg: Bulgarian
  • bn: Bengali
  • br: Breton
  • bs: Bosnian
  • ca: Catalan
  • cs: Czech
  • cy: Cymraeg
  • da: Danish
  • de: German
  • dv: Dhivehi
  • en: English
  • es: Spanish
  • et: Estonian
  • eu: Basque
  • fa: Persian
  • fi: Finnish
  • fr: French
  • ga: Irish
  • gl: Galician
  • el: Greek
  • ha: Hausa
  • he: Hebrew
  • hi: Hindi
  • hr: Croatian
  • hu: Hungarian
  • hy: Armenian
  • is: Icelandic
  • it: Italian
  • id: Indonesian
  • ja: Japanese
  • ka: Georgian
  • kk: Kazakh
  • km: Khmer
  • ko: Korean
  • ku: Kurdish
  • ky: Kyrgyz
  • lt: Lithuanian
  • lv: Latvian
  • mk: Macedonian
  • ml: Malayalam
  • mn: Mongolian
  • mr: Marathi
  • ms: Malay
  • mt: Maltese
  • nb: Norwegian Bokmål
  • nl: Dutch
  • nn: Norwegian Nynorsk
  • no: Norwegian
  • pl: Polish
  • ps: Pashto
  • pt: Portuguese
  • ro: Romanian
  • ru: Russian
  • sd: Sindhi
  • sk: Slovak
  • sl: Slovene
  • so: Somali
  • sq: Albanian
  • sr: Serbian
  • sv: Swedish
  • sw: Swahili
  • ta: Tamil
  • tg: Tajik
  • th: Thai
  • tk: Turkmen
  • tr: Turkish
  • tt: Tatar
  • ug: Uyghur
  • uk: Ukrainian
  • ur: Urdu
  • uz: Uzbek
  • zh: Chinese
  • vi: Vietnamese

List of ISO 639-1 codes

Get all supported languages (ISO 639-1)

var countries = require("i18n-iso-countries");
console.log("List of supported languages => " + countries.getSupportedLanguages());
// List of supported languages => ["cy", "dv", "sw", "eu", "af", "am", ...]

Country to Code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("United States of America => " + countries.getAlpha2Code("United States of America", "en"));
// United States of America => US

console.log("United States of America => " + countries.getAlpha3Code("United States of America", "en"));
// United States of America => USA

Codes

Convert Alpha-3 to Alpha-2 code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("USA (Alpha-3) => " + countries.alpha3ToAlpha2("USA") + " (Alpha-2)");
// USA (Alpha-3) => US (Alpha-2)

Convert Numeric to Alpha-2 code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("840 (Numeric) => " + countries.numericToAlpha2("840") + " (Alpha-2)");
// 840 (Numeric) => US (Alpha-2)

Convert Alpha-2 to Alpha-3 code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("DE (Alpha-2) => " + countries.alpha2ToAlpha3("DE") + " (Alpha-3)");
// DE (Alpha-2) => DEU (Alpha-3)

Convert Numeric to Alpha-3 code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log("840 (Numeric) => " + countries.numericToAlpha3("840") + " (Alpha-3)");
// 840 (Numeric) => USA (Alpha-3)

Convert Alpha-3 to Numeric code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.alpha3ToNumeric("SWE"));
// 752

Convert Alpha-2 to Numeric code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.alpha2ToNumeric("SE"));
// 752

Get all Alpha-2 codes

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.getAlpha2Codes());
// { 'AF': 'AFG', 'AX': 'ALA', [...], 'ZM': 'ZMB', 'ZW': 'ZWE' }

Get all Alpha-3 codes

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.getAlpha3Codes());
// { 'AFG': 'AF', 'ALA': 'AX', [...], 'ZMB': 'ZM', 'ZWE': 'ZW' }

Get all Numeric codes

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(countries.getNumericCodes());
// { '004': 'AF', '008': 'AL', [...], '887': 'YE', '894': 'ZM' }

Validate country code

var countries = require("i18n-iso-countries");
// in a browser environment: countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
console.log(
  countries.isValid("US"),
  countries.isValid("USA"),
  countries.isValid("XX")
);
// true, true, false

Contribution

To add a language:

  • add a json file under langs/
  • add the language to the list in supportedLocales.json at the top
  • add language to section Supported languages in README.md
  • add language to keywords in package.json
  • run npm run lint and npm test
  • open a PR on GitHub

You can check codes here: https://www.iso.org/obp/ui/#home