概要
JavaScriptではnavigatorオブジェクトのプロパティであるlanguageを利用することで、ブラウザで設定されている使用言語を簡単に検出することができます。
ここではlanguageプロパティと各ブラウザによる挙動の違いについてまとめます。
Languageプロパティとは
navigatorとはユーザーが利用しているブラウザの詳細な情報を取得するオブジェクトであり、そのプロパティであるlanguageではブラウザの使用言語を検出することができます。
navigatorオブジェクトはwindowオブジェクトのプロパティの一つであるため、そのプロパティのプロパティであるlanguageにはwindow.navigator.language
といったコードでアクセスします。
このlanguageプロパティは主要なブラウザではほぼ使用可能ですが、ブラウザのバージョンによっては未対応な場合もあります。
各ブラウザの動き
Chrome / Safari / Firefox / Edge
Chrome・Safari・Firefox・Edgeではlanguageプロパティが利用できます。
これらのブラウザは使用言語を複数設定できますが、languageプロパティはその中で一番優先順位が高い言語を取得します。
以下はChromeの動作例です。
> window.navigator.language
> "ja"
一番上に設定されている日本語が返ってくることがわかります。
また、navigatorオブジェクトにはlanguagesプロパティという設定している全ての使用言語を取得できるプロパティも存在します。この一覧はブラウザで設定している優先順位通りの順で返ります。
> window.navigator.languages
> (5) ["ja", "en", "az", "en-US", "en-GB"]
なおlanguageプロパティは基本的には"ja"や"en"などの言語コードのみを返しますが、英語(アメリカ合衆国)、英語(イギリス)など国名を含めた言語を選択している場合は言語コードに国コードを組み合わせた"en-US""en-GB"といった値になるため注意が必要です。
Internet Explorer
最新バージョンのIE11はlanguageプロパティを利用できますが、それより前のバージョンでは非対応であり使おうとするとundefined
が返ります。
代替としてIEではブラウザの言語設定を検出するためのプロパティとしてbrowserLanguage
が存在し、これは古いバージョンでも使えます。また最新のIE11でもこのプロパティは残っています。
なおChromeなどで利用できるlanguagesプロパティには非対応です。
前提条件
日本語を最優先に2つの言語を設定してあります。私が検証したIE11&Windows10の環境ではブラウザの言語設定をしようとするとWindows全体の言語設定画面に遷移しました。
> window.navigator.browserLanguage
> "ja-JP"
補足
TypeScriptを使っている場合上記のwindow.navigator.browserLanguage
という書き方では以下のようなエラーが出ます。
Property 'browserLanguage' does not exist on type 'Navigator'
これはTypeScriptがbrowserLanguageをnavigatorオブジェクトのプロパティとして認識していないことが原因であり、ドットではなく角括弧を使うことで回避できます。
> window.navigator['browserLanguage']
> "ja-JP"
IEでは単に「日本語」を選択しても"ja-JP"といった国名付きの言語コードが返るようです。
Opera
OperaもIE同様、古いバージョンではlanguageプロパティに対応しておらず、代わりにbrowserLanguage
やuserLanguage
などを使う必要がありました。
しかし現行のバージョンではlanguageプロパティ及びlanguagesプロパティに対応しています。
その代わりなのかbrowserLanguage
やuserLanguage
は利用できなくなっています。こちらはIEと異なる点です。
まとめ
- 主なブラウザの最新バージョンはどれもlanguageプロパティが使える
- まだまだ古いバージョンのIEを使っている人は多いのでその辺りのフォローは必要
- OperaなどIE以外でも古いバージョンだとlanguageプロパティが使えないブラウザはあるが、少しマイナー感があるブラウザをどこまでサポートするかは悩みどころ