Navigator: languages property

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

The languages read-only property of the Navigator interface returns an array of strings representing the user's preferred languages. The language is described using a BCP 47 language tag. In the returned array they are ordered by preference with the most preferred language first.

The value of navigator.language is the first element of the returned array.

When its value changes, as the user's preferred languages are changed a languagechange event is fired on the Window object.

The Accept-Language HTTP header in every HTTP request from the user's browser generally lists the same locales as the navigator.languages property, with decreasing q values (quality values). Some browsers (Chrome and Safari) add language-only fallback tags in Accept-Language—for example, en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 when navigator.languages is ["en-US", "zh-CN"]. For privacy purposes (reducing fingerprinting), both Accept-Language and navigator.languages may not include the full list of user preferences, such as in Safari (always) and Chrome's incognito mode, where only one language is listed.

Value

An array of strings.

Examples

Listing the contents of navigator.language and navigator.languages

js
navigator.language; // "en-US"
navigator.languages; // ["en-US", "zh-CN", "ja-JP"]

Using Intl constructors to do language-specific formatting, with fallback

The array of language identifiers contained in navigator.languages can be passed directly to the Intl constructors to implement preference-based fallback selection of locales, where the first entry in the list that matches a locale supported by Intl is used:

js
const date = new Date("2012-05-24");

const formattedDate = new Intl.DateTimeFormat(navigator.languages).format(date);

Specifications

Specification
HTML
# dom-navigator-languages-dev

Browser compatibility

desktop mobile server
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
languages
Chrome – Full support
Chrome 37 (Release date: 2014-08-26)
footnote
footnote Before Chrome 65, navigator.languages[0] is not guaranteed to equal navigator.language.
Edge – Full support
Edge 16 (Release date: 2017-10-17)
footnote Full support
Firefox – Full support
Firefox 32 (Release date: 2014-09-02)
footnote
footnote In Firefox, the navigator.languages property's value is taken from the intl.accept_languages preference.
Opera – Full support
Opera 24 (Release date: 2014-09-02)
footnote Full support
Safari – Full support
Safari 10.1 (Release date: 2017-03-27)
footnote Full support
Chrome Android – Full support
Chrome Android 37 (Release date: 2014-09-03)
footnote
footnote Before Chrome Android 65, navigator.languages[0] is not guaranteed to equal navigator.language.
Firefox for Android – Full support
Firefox for Android 32 (Release date: 2014-09-02)
footnote
footnote In Firefox for Android, the navigator.languages property's value is taken from the intl.accept_languages preference.
Opera Android – Full support
Opera Android 24 (Release date: 2014-09-10)
footnote Full support
Safari on iOS – Full support
Safari on iOS 10.3 (Release date: 2017-03-27)
footnote Full support
Samsung Internet – Full support
Samsung Internet 3 (Release date: 2015-04-10)
footnote Full support
WebView Android – Full support
WebView Android 37 (Release date: 2014-09-03)
footnote
footnote Before version 65, navigator.languages[0] is not guaranteed to equal navigator.language.
WebView on iOS – Full support
WebView on iOS 10.3 (Release date: 2017-03-27)
footnote Full support
Deno – Full support
Deno 1.27 (Release date: 2022-10-27)
footnote Full support
Node.js – Full support
Node.js 21.2 (Release date: 2023-11-14)
footnote Full support

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
See implementation notes.

See also