499 votes

JavaScript pour détecter la préférence linguistique du navigateur

J'ai essayé de détecter la préférence de langue du navigateur en utilisant JavaScript.

Si je définis la langue du navigateur dans IE dans Tools>Internet Options>General>Languages comment puis-je lire cette valeur en utilisant JavaScript ?

Même problème pour Firefox. Je ne suis pas en mesure de détecter le paramètre pour tools>options>content>languages en utilisant navigator.language .

Utilisation de navigator.userLanguage il détecte le réglage effectué par Start>ControlPanel>RegionalandLanguageOptions>Regional Options onglet.

J'ai testé avec navigator.browserLanguage y navigator.systemLanguage mais aucun ne renvoie la valeur du premier paramètre( Tools>InternetOptions>General>Languages )

J'ai trouvé un lien qui en parle en détail, mais la question reste sans réponse :(

4 votes

Il existe désormais (2020) une fonction expérimentale prise en charge par tous les navigateurs qui renvoie un tableau des préférences linguistiques : navigator.languages //["en-US", "zh-CN", "ja-JP"]

37voto

Josef Ježek Points 1831
var language = navigator.languages && navigator.languages[0] || // Chrome / Firefox
               navigator.language ||   // All browsers
               navigator.userLanguage; // IE <= 10

console.log(language);

Essayez le modèle PWA https://github.com/StartPolymer/progressive-web-app-template

8 votes

Il suffit de lancer votre script, obtenu en-US sur osX El Capitan en espagnol, Chrome set en espagnol, de Barcelone La liste des langues autorisées, et de ramasser le premier de celui-ci navigator.languages[0] n'est pas la langue réelle utilisée par l'utilisateur.

20voto

navigator.userLanguage pour IE

window.navigator.language pour firefox/opera/safari

6 votes

Navigator.userLanguage ne lui donne pas ce qu'il veut. De userLanguage-docs : Cette propriété reflète le paramètre dans la case "Your locale (location)" dans les Options régionales du Panneau de configuration ; par exemple, "English (United States)".

2 votes

Il est en fait indiqué qu'il renverra "l'une des valeurs de retour possibles énumérées dans les codes de langue", comme "en" ou "en-gb". msdn.microsoft.com/fr/us/library/ie/ms533052.aspx msdn.microsoft.com/fr/us/library/ie/ms534713.aspx

20voto

EamonnM Points 701

J'utilise la réponse de Hamid depuis un moment, mais dans les cas où le tableau des langues est du type ["en", "en-GB", "en-US", "fr-FR", "fr", "en-ZA"], il renvoie "en", alors que "en-GB" serait une meilleure correspondance.

Ma mise à jour (ci-dessous) retournera le premier code de format long, par exemple "en-GB", sinon elle retournera le premier code court, par exemple "en", sinon elle retournera null.

function getFirstBrowserLanguage() {
        var nav = window.navigator,
            browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
            i,
            language,
            len,
            shortLanguage = null;

        // support for HTML 5.1 "navigator.languages"
        if (Array.isArray(nav.languages)) {
            for (i = 0; i < nav.languages.length; i++) {
                language = nav.languages[i];
                len = language.length;
                if (!shortLanguage && len) {
                    shortLanguage = language;
                }
                if (language && len>2) {
                    return language;
                }
            }
        }

        // support for other well known properties in browsers
        for (i = 0; i < browserLanguagePropertyKeys.length; i++) {
            language = nav[browserLanguagePropertyKeys[i]];
            //skip this loop iteration if property is null/undefined.  IE11 fix.
            if (language == null) { continue; } 
            len = language.length;
            if (!shortLanguage && len) {
                shortLanguage = language;
            }
            if (language && len > 2) {
                return language;
            }
        }

        return shortLanguage;
    }

console.log(getFirstBrowserLanguage());

Mise à jour : IE11 émettait des erreurs lorsque certaines propriétés étaient indéfinies. Nous avons ajouté une vérification pour ignorer ces propriétés.

0 votes

Il fonctionne sur tous les navigateurs que j'ai testés - de bureau et mobiles. Avec quel navigateur rencontrez-vous des problèmes ?

0 votes

'browserLanguage', 'systemLanguage' et, 'userLanguage' ne sont pas des propriétés de chrome et firefox mais 'language' est présent dans tous les navigateurs C'est ma faute si je n'ai pas vu qu'il retournerait le premier code court qui répond à la question Je supprime mon commentaire précédent

0 votes

Est-il fréquent que des personnes aient des préférences dans l'ordre ["en", "en-GB"] mais souhaitent que les préférences soient inversées ? Je pensais que les langues étaient censées être dans l'ordre des préférences de l'utilisateur. Si c'était ["fr", "en-GB"], la préférence ne serait-elle pas pour le français ?

17voto

Mihai Nita Points 2870

Il n'existe aucun moyen décent d'obtenir ce paramètre, du moins pas un moyen indépendant du navigateur.

Mais le serveur dispose de cette information, car elle fait partie de l'en-tête de la requête HTTP (le champ "Accept-Language", cf. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 )

Le seul moyen fiable est donc de recevoir une réponse du serveur. Vous aurez besoin de quelque chose qui fonctionne sur le serveur (comme .asp, .jsp, .php, CGI) et cette "chose" peut renvoyer cette information. De bons exemples ici : http://www.developershome.com/wap/detection/detection.asp?page=readHeader

3 votes

Gardez à l'esprit qu'il ne s'agit pas d'un moyen particulièrement fiable de proposer la "bonne" langue à l'utilisateur. De nombreux utilisateurs voudront une autre option - ne les laissez pas en plan !

5 votes

Tout à fait d'accord. En utilisant cette information, c'est une meilleure estimation. Vous devriez permettre à l'utilisateur de passer outre, si vous vous trompez. Et s'il y a une possibilité que l'utilisateur revienne, vous pouvez vous souvenir de ce choix dans un cookie. Si le site nécessite une authentification, vous pouvez avoir cette information dans un profil d'utilisateur.

15voto

user1548557 Points 41

Je viens juste d'inventer ceci. Il combine la nouvelle syntaxe de déstructuration JS avec quelques opérations standard pour récupérer la langue et la locale.

var [lang, locale] = (
    (
        (
            navigator.userLanguage || navigator.language
        ).replace(
            '-', '_'
        )
    ).toLowerCase()
).split('_');

J'espère que cela aidera quelqu'un

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X