Language Detection in JavaScript

Learn how to detect user language preferences using navigator.language and navigator.languages for building multilingual web applications.

The Navigator Language API

Modern web applications increasingly serve global audiences, making language detection a fundamental requirement for delivering personalized user experiences. When a visitor lands on your website, their browser already knows which languages they prefer based on their operating system and browser settings.

By leveraging JavaScript's Navigator API, you can read these language preferences and automatically present content in the right language without forcing users to manually select their preferred locale. This capability forms the foundation of client-side internationalization (i18n), enabling developers to create truly multilingual web experiences that adapt to each user's preferences.

Implementing robust language detection is essential for web development projects targeting international markets, as it directly impacts user engagement and conversion rates across different regions.

Understanding navigator.language

The core property for accessing user language preferences

navigator.language

Returns a string representing the user's preferred language, typically the language of the browser UI. Returns values like 'en-US', 'fr-FR', or 'ja-JP' following BCP 47 standard.

navigator.languages

Returns an array of language preferences ordered by preference. Users can specify multiple languages, allowing for sophisticated fallback strategies.

BCP 47 Standard

Language tags follow the BCP 47 standard format. Simple tags like 'en' represent English generally, while 'en-US' represents US English with regional specificity.

Cross-Browser Support

The Navigator language API is supported across all modern browsers, making it a reliable foundation for language detection in web applications.

Client-Side Language Detection

Client-side language detection in JavaScript provides immediate access to user preferences without requiring server round-trips. This approach is particularly valuable for single-page applications built with frameworks like React, Vue, and Angular, which are commonly used in modern web development workflows.

Basic Language Detection

// Get the user's preferred language
const userLanguage = navigator.language;
console.log(userLanguage); // Output: "en-US" (example)

// Get the array of preferred languages
const languages = navigator.languages;
console.log(languages);
// Output: ["en-US", "en", "fr-CA", "fr", "es"]

The first element of the navigator.languages array is always identical to navigator.language, making both approaches valid depending on your needs. For basic use cases, navigator.language provides a simple, reliable way to access the primary language preference. For more sophisticated applications requiring fallback logic, the full array from navigator.languages enables matching against multiple supported languages.

Complete Language Detection Function
1// Find first supported language from user preferences2function detectLanguage(supportedLanguages) {3 const preferences = navigator.languages || [navigator.language];4 5 for (const pref of preferences) {6 // Check for exact match first7 if (supportedLanguages.includes(pref)) {8 return pref;9 }10 11 // Check for language-only match (e.g., "en" matches "en-US")12 const baseLanguage = pref.split('-')[0];13 const match = supportedLanguages.find(supported =>14 supported.toLowerCase().startsWith(baseLanguage.toLowerCase())15 );16 17 if (match) {18 return match;19 }20 }21 22 return supportedLanguages[0]; // Fallback to first supported language23}24 25// Listen for language preference changes26window.addEventListener('languagechange', () => {27 const newLanguage = navigator.language;28 console.log('Language changed to:', newLanguage);29 updateApplicationLanguage(newLanguage);30});

Using Language with the Intl API

Once you've determined the user's preferred language, use JavaScript's built-in Intl API to format dates, numbers, and other content according to language conventions. The Intl API provides culture-aware formatting without external libraries, making it an essential tool for any web development project serving international audiences.

Date and Number Formatting

const userLanguage = navigator.language;

// Format dates according to user preference
const date = new Date('2025-03-15');
const formattedDate = new Intl.DateTimeFormat(userLanguage).format(date);
// For "en-US": "3/15/2025"
// For "en-GB": "15/03/2025"
// For "ja-JP": "2025/3/15"

// Format numbers with proper separators
const number = 1234567.89;
const formattedNumber = new Intl.NumberFormat(userLanguage).format(number);
// For "en-US": "1,234,567.89"
// For "de-DE": "1.234.567,89"

// Format currency
const price = 99.99;
const currencyFormatter = new Intl.NumberFormat(userLanguage, {
 style: 'currency',
 currency: 'USD'
});

The Intl API can also accept the full array from navigator.languages, letting it handle preference-based fallback selection automatically. This means if a user's exact language variant isn't supported, the API gracefully falls back to a related variant.

Client-Side vs Server-Side Language Detection
AspectClient-Side (navigator)Server-Side (Accept-Language)
Detection SpeedImmediate, no HTTP overheadRequires server round-trip
Initial Page LoadAdapts after loadLocalized content from start
Language Changeslanguagechange eventPage reload required
Use CaseSPAs, dynamic adaptationServer-rendered apps
ComplexitySimple JavaScript APIRequires header parsing

Best Practices for Language Detection

Implement Robust Fallback Strategies

A well-designed language detection system should include multiple fallback layers. The recommended hierarchy prioritizes user preferences while ensuring graceful degradation.

  1. Saved User Preference: Check for explicitly saved preferences (localStorage) first
  2. Browser Detection: Use navigator.language as secondary fallback
  3. Default Language: Always have a hardcoded fallback (e.g., 'en')

Performance Optimization

Cache detection results and avoid repeated calls to navigator APIs during runtime. Invalidate the cache only when the languagechange event fires. This approach minimizes performance overhead in long-running applications.

User Control

Always provide users the ability to override automatic detection. Save explicit preferences and respect them over browser settings. Automatic detection should enhance, not override, user choice. Consider implementing a language selector in your navigation that lets users explicitly set their preference.

For optimal performance in server-rendered applications, consider combining client-side detection with server-side Accept-Language header parsing. This hybrid approach delivers localized content from the initial page load while maintaining flexibility for runtime language switching. Implementing these patterns is a core competency of professional web development services that specialize in internationalization.

Common Questions

Build Multilingual Web Applications

Our team of experienced developers can help you implement robust internationalization solutions for your web applications, from language detection to complete localization workflows.

Sources

  1. MDN Web Docs - Navigator: language property - Official documentation covering the Navigator API and browser support
  2. Lingui JavaScript i18n Documentation - Practical implementation patterns for language detection
  3. Localizely Browser Language Detection Guide - Client-side vs server-side detection approaches
  4. Phrase Locale Detection Guide - Enterprise patterns for fallback strategies and user preferences