keecode logokeecode
International
language codes
iso 639
locale codes
language tags
i18n codes
internationalization

ISO 639 Language Codes Reference - Complete List

Complete reference for ISO 639 language codes used for internationalization (i18n), localization, and multi-language applications. Includes alpha-2 and alpha-3 codes.

Updated January 15, 2025

ISO 639 language codes are standardized codes for identifying languages. This comprehensive guide covers language codes essential for internationalization (i18n), localization, and multi-language applications.

Table of Contents

  1. What Are ISO 639 Language Codes?
  2. Language Code Types
  3. Language Tags (BCP 47)
  4. Most Common Languages
  5. Using Language Codes in Development
  6. Locale Codes
  7. Complete Language List

What Are ISO 639 Language Codes?

ISO 639 is the international standard for language codes maintained by the International Organization for Standardization (ISO). These codes are used for:

  • Websites: Multi-language content (i18n/l10n)
  • Browsers: Language preferences
  • APIs: Content negotiation
  • Operating Systems: Language settings
  • Documents: Language metadata
  • Translation: Content management systems

Language Code Types

Alpha-2 Codes (2-Letter)

Format: Two lowercase letters
Example: en, es, fr, de
Standard: ISO 639-1

Most commonly used for:

  • Web development (HTML lang attribute)
  • URL paths (/en/, /es/)
  • Browser language preferences
  • Mobile apps
<!-- HTML language attribute -->
<html lang="en">

<!-- Spanish content -->
<html lang="es">

Alpha-3 Codes (3-Letter)

Format: Three lowercase letters
Example: eng, spa, fra, deu
Standard: ISO 639-2 and ISO 639-3

Used for:

  • Bibliographic systems
  • Academic applications
  • Less common languages
  • Historical languages
// Mapping alpha-2 to alpha-3
const languageMap = {
  en: 'eng',
  es: 'spa',
  fr: 'fra',
  de: 'deu'
};
formatexamplelengthusage
Alpha-2en, es, fr2 lettersWeb development
Alpha-3 (639-2)eng, spa, fra3 lettersBibliographic
Alpha-3 (639-3)eng, spa, fra3 lettersLinguistics

Language Tags (BCP 47)

BCP 47 defines language tags by combining ISO standards:

Format: language-REGION or language-Script-REGION

Basic Language Tags

// Language only
'en'     // English (any region)
'es'     // Spanish (any region)
'zh'     // Chinese (any script/region)

// Language + Region
'en-US'  // English (United States)
'en-GB'  // English (United Kingdom)
'es-ES'  // Spanish (Spain)
'es-MX'  // Spanish (Mexico)
'pt-BR'  // Portuguese (Brazil)
'pt-PT'  // Portuguese (Portugal)

// Language + Script + Region
'zh-Hans-CN'  // Chinese (Simplified, China)
'zh-Hant-TW'  // Chinese (Traditional, Taiwan)

// Special cases
'en-US-x-custom'  // With private use extension

Common Language Tag Patterns

const locales = {
  'en-US': 'English (United States)',
  'en-GB': 'English (United Kingdom)',
  'en-CA': 'English (Canada)',
  'en-AU': 'English (Australia)',
  
  'es-ES': 'Spanish (Spain)',
  'es-MX': 'Spanish (Mexico)',
  'es-AR': 'Spanish (Argentina)',
  
  'fr-FR': 'French (France)',
  'fr-CA': 'French (Canada)',
  
  'de-DE': 'German (Germany)',
  'de-AT': 'German (Austria)',
  'de-CH': 'German (Switzerland)',
  
  'pt-BR': 'Portuguese (Brazil)',
  'pt-PT': 'Portuguese (Portugal)',
  
  'zh-CN': 'Chinese (Simplified, China)',
  'zh-TW': 'Chinese (Traditional, Taiwan)',
  'zh-HK': 'Chinese (Traditional, Hong Kong)'
};

Most Common Languages

Top 10 by Native Speakers

LanguageAlpha-2Alpha-3Native SpeakersTotal Speakers
Mandarin Chinesezhzho918 million1.1 billion
Spanishesspa460 million543 million
Englisheneng379 million1.5 billion
Hindihihin341 million600 million
Bengalibnben228 million265 million
Portugueseptpor221 million264 million
Russianrurus154 million258 million
Japanesejajpn128 million128 million
Western Punjabipapan93 million113 million
Marathimrmar83 million95 million

View English (en) | View Spanish (es) | View Chinese (zh)

Major World Languages

LanguageAlpha-2Alpha-3Common Regions
EnglishenengUS, GB, CA, AU, NZ
SpanishesspaES, MX, AR, CO
FrenchfrfraFR, CA, BE, CH
GermandedeuDE, AT, CH
ItalianititaIT, CH
PortugueseptporBR, PT, AO
RussianrurusRU, BY, KZ
JapanesejajpnJP
KoreankokorKR, KP
ChinesezhzhoCN, TW, HK, SG
ArabicararaSA, EG, AE, MA
HindihihinIN
DutchnlnldNL, BE
TurkishtrturTR
PolishplpolPL
SwedishsvsweSE
IndonesianidindID
ThaiththaTH
VietnamesevivieVN

European Languages

LanguageAlpha-2Alpha-3Speakers
Germandedeu95 million
Frenchfrfra80 million
Italianitita65 million
Spanishesspa47 million (in EU)
Polishplpol40 million
Ukrainianukukr37 million
Romanianroron23 million
Dutchnlnld23 million
Greekelell13 million
Czechcsces10 million
Portugueseptpor10 million
Hungarianhuhun9 million
Swedishsvswe9 million
Bulgarianbgbul8 million
Danishdadan6 million
Finnishfifin5 million
Slovakskslk5 million
Norwegiannonor5 million

Using Language Codes in Development

HTML Lang Attribute

<!-- Document language -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>My Website</title>
</head>
<body>
  <!-- English content -->
  <p>Hello World</p>
  
  <!-- Spanish section -->
  <section lang="es">
    <p>Hola Mundo</p>
  </section>
  
  <!-- French quote -->
  <blockquote lang="fr">
    <p>Bonjour le monde</p>
  </blockquote>
</body>
</html>

HTTP Accept-Language Header

GET /page HTTP/1.1
Host: example.com
Accept-Language: en-US,en;q=0.9,es;q=0.8,fr;q=0.7

# Breakdown:
# en-US    (quality 1.0 - default)
# en;q=0.9 (quality 0.9 - second preference)
# es;q=0.8 (quality 0.8 - third preference)
# fr;q=0.7 (quality 0.7 - fourth preference)

JavaScript Language Detection

// Get browser language
const browserLanguage = navigator.language || navigator.userLanguage;
console.log(browserLanguage);  // "en-US"

// Get all preferred languages
const languages = navigator.languages;
console.log(languages);  // ["en-US", "en", "es"]

// Parse language tag
function parseLocale(locale) {
  const [language, region] = locale.split('-');
  return {
    language: language.toLowerCase(),
    region: region?.toUpperCase(),
    full: locale
  };
}

const parsed = parseLocale('en-US');
console.log(parsed);
// { language: 'en', region: 'US', full: 'en-US' }

// Match user preference to supported languages
function getBestMatch(userLanguages, supportedLanguages) {
  for (const userLang of userLanguages) {
    // Try exact match first
    if (supportedLanguages.includes(userLang)) {
      return userLang;
    }
    
    // Try language without region
    const lang = userLang.split('-')[0];
    const match = supportedLanguages.find(s => s.startsWith(lang));
    if (match) return match;
  }
  
  return supportedLanguages[0];  // Default to first supported
}

const supported = ['en-US', 'es-ES', 'fr-FR', 'de-DE'];
const userPrefs = navigator.languages;
const bestMatch = getBestMatch(userPrefs, supported);
console.log(bestMatch);  // "en-US"

React i18n Example

import { useState, useEffect } from 'react';

// Initialize i18n
i18n
  .use(initReactI18next)
  .init({
    resources: {
      en: {
        translation: {
          welcome: "Welcome",
          goodbye: "Goodbye"
        }
      },
      es: {
        translation: {
          welcome: "Bienvenido",
          goodbye: "Adiós"
        }
      },
      fr: {
        translation: {
          welcome: "Bienvenue",
          goodbye: "Au revoir"
        }
      }
    },
    lng: 'en',
    fallbackLng: 'en'
  });

// Language selector component
function LanguageSelector() {
  const { i18n } = useTranslation();
  
  const languages = [
    { code: 'en', name: 'English', flag: '🇺🇸' },
    { code: 'es', name: 'Español', flag: '🇪🇸' },
    { code: 'fr', name: 'Français', flag: '🇫🇷' },
    { code: 'de', name: 'Deutsch', flag: '🇩🇪' }
  ];
  
  return (
    <select 
      value={i18n.language} 
      onChange={(e) => i18n.changeLanguage(e.target.value)}
    >
      {languages.map(lang => (
        <option key={lang.code} value={lang.code}>
          {lang.flag} {lang.name}
        </option>
      ))}
    </select>
  );
}

// Using translations
function App() {
  const { t } = useTranslation();
  
  return (
    <div>
      <LanguageSelector />
      <h1>{t('welcome')}</h1>
      <p>{t('goodbye')}</p>
    </div>
  );
}

Next.js Internationalization

// next.config.js
module.exports = {
  i18n: {
    locales: ['en-US', 'es-ES', 'fr-FR', 'de-DE'],
    defaultLocale: 'en-US',
    localeDetection: true
  }
};

// Pages automatically get locale in URL
// /en-US/about
// /es-ES/about
// /fr-FR/about

// Access current locale

function MyPage() {
  const router = useRouter();
  const { locale, locales, defaultLocale } = router;
  
  return (
    <div>
      <p>Current language: {locale}</p>
      
      {locales.map(loc => (
        <Link key={loc} href="/" locale={loc}>
          {loc}
        </Link>
      ))}
    </div>
  );
}

Locale Codes

Locale codes combine language and region for specific formatting:

Date Formatting

const date = new Date('2025-01-15');

// Different locales, different formats
console.log(date.toLocaleDateString('en-US'));
// "1/15/2025"

console.log(date.toLocaleDateString('en-GB'));
// "15/01/2025"

console.log(date.toLocaleDateString('de-DE'));
// "15.1.2025"

console.log(date.toLocaleDateString('ja-JP'));
// "2025/1/15"

console.log(date.toLocaleDateString('ar-SA'));
// "١٥‏/١‏/٢٠٢٥"

Number Formatting

const number = 1234567.89;

// Different locales, different separators
console.log(number.toLocaleString('en-US'));
// "1,234,567.89"

console.log(number.toLocaleString('de-DE'));
// "1.234.567,89"

console.log(number.toLocaleString('fr-FR'));
// "1 234 567,89"

console.log(number.toLocaleString('ja-JP'));
// "1,234,567.89"

console.log(number.toLocaleString('ar-EG'));
// "١٬٢٣٤٬٥٦٧٫٨٩"

Currency Formatting

const amount = 1234.56;

// US English with USD
console.log(amount.toLocaleString('en-US', { 
  style: 'currency', currency: 'USD' 
}));
// "$1,234.56"

// German with EUR
console.log(amount.toLocaleString('de-DE', { 
  style: 'currency', currency: 'EUR' 
}));
// "1.234,56 €"

// French with EUR
console.log(amount.toLocaleString('fr-FR', { 
  style: 'currency', currency: 'EUR' 
}));
// "1 234,56 €"

// Japanese with JPY
console.log(amount.toLocaleString('ja-JP', { 
  style: 'currency', currency: 'JPY' 
}));
// "¥1,235"

Complete Language List

A-E

LanguageAlpha-2Alpha-3Native Name
Arabicararaالعربية
Bengalibnbenবাংলা
Bulgarianbgbulбългарски
CatalancacatCatalà
Chinesezhzho中文
CroatianhrhrvHrvatski
CzechcscesČeština
DanishdadanDansk
DutchnlnldNederlands
EnglishenengEnglish
EstonianetestEesti

F-K

LanguageAlpha-2Alpha-3Native Name
FinnishfifinSuomi
FrenchfrfraFrançais
GermandedeuDeutsch
GreekelellΕλληνικά
Hebrewhehebעברית
Hindihihinहिन्दी
HungarianhuhunMagyar
IcelandicisislÍslenska
IndonesianidindBahasa Indonesia
ItalianititaItaliano
Japanesejajpn日本語
Koreankokor한국어

L-R

LanguageAlpha-2Alpha-3Native Name
LatvianlvlavLatviešu
LithuanianltlitLietuvių
MalaymsmsaBahasa Melayu
NorwegiannonorNorsk
Persianfafasفارسی
PolishplpolPolski
PortugueseptporPortuguês
RomanianroronRomână
RussianrurusРусский

S-Z

LanguageAlpha-2Alpha-3Native Name
SerbiansrsrpСрпски
SlovakskslkSlovenčina
SlovenianslslvSlovenščina
SpanishesspaEspañol
SwedishsvsweSvenska
Thaiththaไทย
TurkishtrturTürkçe
UkrainianukukrУкраїнська
Urduururdاردو
VietnamesevivieTiếng Việt

Browse all languages →

Best Practices

1. Use BCP 47 Language Tags

<!-- ✅ Good - Complete language tag -->
<html lang="en-US">

<!-- ✅ Acceptable - Language only -->
<html lang="en">

<!-- ❌ Bad - Wrong format -->
<html lang="EN_US">
<html lang="english">

2. Always Set Language Attribute

<!-- ✅ Good - Helps screen readers and SEO -->
<html lang="en">

<!-- ❌ Bad - Missing language -->
<html>

3. Use Lowercase for Language Codes

// ✅ Good
const language = 'en-US';  // Lowercase language, uppercase region

// ❌ Bad
const language = 'EN-US';
const language = 'en-us';

4. Provide Language Fallbacks

const translations = {
  'en-US': { welcome: 'Welcome' },
  'en-GB': { welcome: 'Welcome' },
  'en': { welcome: 'Welcome' },  // Fallback for all English
  'es-MX': { welcome: 'Bienvenido' },
  'es': { welcome: 'Bienvenido' }  // Fallback for all Spanish
};

function getTranslation(locale, key) {
  // Try exact match
  if (translations[locale]?.[key]) {
    return translations[locale][key];
  }
  
  // Try language without region
  const language = locale.split('-')[0];
  if (translations[language]?.[key]) {
    return translations[language][key];
  }
  
  // Final fallback
  return translations['en'][key];
}

5. Store User Language Preference

// Save user's language choice
function setLanguage(locale) {
  localStorage.setItem('preferredLanguage', locale);
  document.documentElement.lang = locale;
}

// Load saved language on page load
function getLanguage() {
  const saved = localStorage.getItem('preferredLanguage');
  const browser = navigator.language;
  return saved || browser || 'en';
}

// Usage
const userLanguage = getLanguage();
i18n.changeLanguage(userLanguage);

Summary

ISO 639 language codes are essential for internationalization and localization. Always use BCP 47 language tags, provide fallbacks, and respect user language preferences.

Key Takeaways:

✅ Use ISO 639 two-letter codes (en, es, fr)
✅ Combine with country codes for locales (en-US, es-MX)
✅ Always set HTML lang attribute
✅ Use lowercase for language, uppercase for region
✅ Provide language fallbacks (en-US → en)
✅ Detect and store user language preferences
✅ Use Intl API for locale-aware formatting