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にはブラウザーロケールを取得できる。
なんか無駄な気がする。。。