Je pense que le principal problème ici est que les paramètres du navigateur n'affectent pas réellement le système de gestion de l'information. navigator.language
qui est obtenue via javascript.
Ce qu'ils affectent, c'est l'en-tête HTTP "Accept-Language", mais il semble que cette valeur ne soit pas du tout disponible en javascript. (C'est probablement la raison pour laquelle @anddoutoi déclare ne pas pouvoir trouver de référence à ce sujet qui n'implique pas le côté serveur).
J'ai codé une solution de rechange : J'ai mis en place un script de google app engine à http://ajaxhttpheaders.appspot.com qui vous renverra les en-têtes de la requête HTTP via JSONP.
(Remarque : il s'agit d'une astuce à n'utiliser que si vous ne disposez pas d'un back-end capable de le faire pour vous. En général, vous ne devriez pas faire d'appels à des fichiers javascript hébergés par des tiers dans vos pages, sauf si vous avez un très haut niveau de confiance dans l'hôte).
J'ai l'intention de le laisser là à perpétuité, alors n'hésitez pas à l'utiliser dans votre code.
Voici un exemple de code (en jQuery) pour savoir comment l'utiliser.
$.ajax({
url: "http://ajaxhttpheaders.appspot.com",
dataType: 'jsonp',
success: function(headers) {
language = headers['Accept-Language'];
nowDoSomethingWithIt(language);
}
});
J'espère que quelqu'un trouvera cela utile.
Edit : J'ai écrit un petit plugin jQuery sur github qui englobe cette fonctionnalité : https://github.com/dansingerman/jQuery-Browser-Language
Edit 2 : Comme demandé, voici le code qui fonctionne sur AppEngine (super trivial vraiment) :
class MainPage(webapp.RequestHandler):
def get(self):
headers = self.request.headers
callback = self.request.get('callback')
if callback:
self.response.headers['Content-Type'] = 'application/javascript'
self.response.out.write(callback + "(")
self.response.out.write(headers)
self.response.out.write(")")
else:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("I need a callback=")
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=False)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Edit3 : J'ai ouvert le code du moteur d'application ici : https://github.com/dansingerman/app-engine-headers
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"]