Javscriptでブラウザーロケール(Locale)を取得したい。
教科書を読むと、ブラウザーロケールを取得をするには以下のようなコードを書けばいいという。
if (window.navigator.language){ // for FF, Chrome, Safari _locale = window.navigator.language.toLowerCase(); } else if (window.navigator.userLanguage){ // For IE _locale = window.navigator.userLanguage.toLowerCase(); }
だが、これはうまく動かず、ブラウザーの「言語の優先度」を変えても「ja」が戻ってしまう(IE7、FF3、Chrome1)。
ググってみても、古いスレッドが多いので、よく分からない。
指し当たって必要ないのだが、なんとなく気持ちが悪い。
これに対して、サーバーに送ったリクエストからは、ロケールの取得ができる。
たとえば、PHP5で
<?php /* getLocale.php リクエスト情報をもとにロケールを取得&返却する。 author ; t.odaka date ; 2009/4/22 */ switch($_SERVER['REQUEST_METHOD']) { case 'GET' : $rMethod = &$_GET; break; case 'POST' : $rMethod = &$_POST; break; default: } // リクエストからlocaleを取り出す。 $locale = substr(strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']),0,2); // 結果の返却 header("Content-Type:text/html"); echo $locale; ?>
と書けば、「言語の優先度」に設定したロケールが取得できる。
とすれば、scriptからAjaxで取得してしまうのが楽なのかなぁ。
たとえば、
<script type="text/javascript" src="../scripts/lib/yui/build/yahoo/yahoo-min.js"> </script> <script type="text/javascript" src="../scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js"> </script> <script type="text/javascript" src="../scripts/lib/yui/build/connection/connection-min.js" > </script> <script type="text/javascript"> MyLocale = function() { var locale; /** * ロケールの取得 * リモートサーバーにリクエストを送り、ブラウザーロケールを取得する。 * dependencies; YUI2.7.0 */ var getLocale = function(){ YAHOO.util.Connect.asyncRequest('POST','getLocale.php', localeCallback, null); } /* * ロケール取得時のAjaxハンドラー * dependencies; YUI2.7.0 * */ var localeHandlers = { // 受信成功時の処理 responseSuccess: function(_oj){ //alert("responseSuccess"); // ロケールの取得 locale = _oj.responseText; }, // 受信失敗時の処理 responseFailure: function(_oj){ // エラーのハンドル(皆さん適当に) } }; /* * ロケール取得時のコールバック成功/失敗時の振り分け * dependencies; YUI2.7.0 * */ var localeCallback = { success: localeHandlers.responseSuccess, failure: localeHandlers.responseFailure, cache: false, scope: localeHandlers, argument: null }; return { /** * * 初期処理 */ init: function() { // ロケールを取得する。 getLocale(); } // initの終わり }; }();
とか書いてしまって、MyLocale.initを初期処理として呼べば、(MyLocaleスコープにおいた)localeにはブラウザーロケールを取得できる。
なんか無駄な気がする。。。