1. ホーム
  2. javascript

[解決済み] ブラウザの言語設定を検出するためのJavaScript [重複]。

2022-03-19 08:10:58

質問

JavaScriptを使って、ブラウザの言語設定を検出することを試みています。

でIEのブラウザ言語を設定すると Tools>Internet Options>General>Languages この値をJavaScriptで読み取るにはどうしたらよいですか?

Firefoxでも同じ問題です。の設定を検出できません。 tools>options>content>languages を使って navigator.language .

使用方法 navigator.userLanguage によって行われた設定を検出します。 Start>ControlPanel>RegionalandLanguageOptions>Regional Options タブを使用します。

でテストしてみました。 navigator.browserLanguagenavigator.systemLanguage の値を返しますが、どちらも最初の設定( Tools>InternetOptions>General>Languages )

を発見しました。 リンク が詳しく説明していますが、疑問は残りますね :(

解決方法は?

ここでの主な問題は、ブラウザの設定が実際には navigator.language プロパティを取得します。

これらが影響を与えるのは HTTP の 'Accept-Language' ヘッダーですが、この値は javascript からは全く利用できないようです。(おそらく、@anddoutoi がサーバーサイドを介さないリファレンスが見つからないと述べている理由でしょう)。

私は回避策をコード化しました。google app engineのスクリプトを以下の場所に作成しました。 http://ajaxhttpheaders.appspot.com HTTPリクエストヘッダをJSONPで返します。

(注意: これは、バックエンドがない場合にのみ使用するハックです。一般的には、ホストに対して非常に高いレベルの信頼がない限り、ページ内でサードパーティがホストするJavaScriptファイルを呼び出すべきではありません)。

私はこれを永久に残しておくつもりなので、あなたのコードで自由に使ってください。

以下は、その使用方法についてのサンプルコードです(jQuery)。

$.ajax({ 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) {
        language = headers['Accept-Language'];
        nowDoSomethingWithIt(language);
    }
});

誰かがこれを役に立つと思うことを願っています。

編集:この機能をラップする小さなjQueryプラグインをgithubに書きました。 https://github.com/dansingerman/jQuery-Browser-Language

編集2:ご要望にお応えして、AppEngine上で動作するコードを掲載します(本当に些細なことです)。

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: アプリエンジンコードはこちらでオープンソース化しています。 https://github.com/dansingerman/app-engine-headers