Google検索結果の日本語と英語を切り換えるブックマークレットを修正した

ここまでの経緯

しげふみメモさんのGoogle検索の日本語版と英語版の切り替えというエントリがありました。Google検索の日本語版と英語版を切り替えるGreasemonkeyスクリプトに関する話題です。

僕は何日か前に、同じことをするブックマークレットを作りました(その時のエントリ)。これはちょうど良いと思い、コメントでそれを紹介しました。

しげふみさんからコメントで、「動作しないよ」という返事がありました。僕は、せっかくなので修正しました。そうしたらもう一度「動作しないよ」という返事がありました。なので、ちゃんと動作しない理由を調べて修正することにしました。

原因

Google検索のパラメータのことがちゃんと分かっていなかったから。言語設定に関するパラメータはhl、lrと2つあって、僕はhlしか考慮していなかった。まずはGoogle検索のパラメータをちゃんと調べることにした。参考にしたページは以下。

パラメータの説明

  • hl

"web interface language"、つまり、Google検索結果のページのインターフェイス言語を指定する。例えば検索ボタンの表記が「検索」、「Search」と切り替わる。

このパラメータは省略可能。その場合、HTTPリクエストのAccept-Languageに基づいて値が選択される。それも無い場合はenとみなされる。

使ってよい値の一覧ページを見れば、どの言語がサポートされているか分かる。英語の場合はhl=en、日本語の場合はhl=jaと指定する。

  • lr

"search language"、つまり、検索対象を指定した言語で書かれたページに制限する。Web検索に限りサポートされている(画像検索などではサポートされていない)。

このパラメータは省略可能。その場合、検索対象を制限しない。

使ってよい値の一覧ページを見れば、どの言語がサポートされているか分かる。英語の場合はlr=lang_en、日本語の場合はlr=lang_jaと指定する。

ブックマークレットの仕様

これを踏まえて、Google検索結果の日本語/英語を切り換えるブックマークレットの仕様は以下の通りとした。

切り換え前のhl 切り換え後のhl
指定なし google.comの場合ja、google.co.jpの場合en
en ja
ja en
切り換え前のlr 切り換え後のlr
指定なし 指定なし
lang_en lang_ja
lang_ja lang_en

ソースコード

結局ブックマークレットソースコードは以下になった。

javascript:(function(){var result=location.hostname.match(/^[a-zA-Z]+\.google\.(com|co\.jp)$/);if(result!==null&&location.search.match(/^\?[a-zA-Z]/)){var defaultLang=result[1]=="com"?"ja":"en";var newUri=location.href.replace(/\bhl=(en|ja)\b/,function(x0,x1){return x1=="en"?"hl=ja":"hl=en";});if(newUri==location.href){newUri=location.href.replace(/\?/,"?hl="+defaultLang+"&");}newUri=newUri.replace(/\blr=(lang_en|lang_ja)\b/,function(x0,x1){return x1=="lang_en"?"lr=lang_ja":"lr=lang_en";});location.href=newUri;}})();

スペース、改行を入れると以下のようになる。

javascript:
(
    function(){
        var result = location.hostname.match(/^[a-zA-Z]+\.google\.(com|co\.jp)$/);

        if (result !== null && location.search.match(/^\?[a-zA-Z]/)) {
            /* hlを切り換える */
            var defaultLang = result[1] == "com" ? "ja" : "en";
            var newUri = location.href.replace(/\bhl=(en|ja)\b/,
                function(x0, x1) {return x1 == "en" ? "hl=ja" : "hl=en";});
            if (newUri == location.href) {
                newUri = location.href.replace(/\?/, "?hl=" + defaultLang + "&");
            }

            /* lrを切り換える */
            newUri = newUri.replace(/\blr=(lang_en|lang_ja)\b/,
                function(x0, x1) {return x1 == "lang_en" ? "lr=lang_ja" : "lr=lang_en";});

            location.href = newUri;
        }
    }
)();

ブックマークレットにしては長いような気がする。

最後に

そもそも、hlがインターフェイス言語なのに検索結果にまで影響してしまうのがおかしいと思う。普通の日本人なら、インターフェイスは日本語のまま検索結果を「日本語ページに限定」/「英語ページに限定」と切り換えたいはずだ。

Googleドキュメントによると、hl=jaのままlrをlang_ja/lang_enと切り換えれば実現できるはずだ。試してみた。

2つ目の場合www.mozilla.com/firefox/が1番上になっていて、英語限定っぽくなっている。でもhl=en, lr=lang_enの場合と結果が全然違う。そもそも5番目ぐらいに日本語ページがあって、英語限定になっていない。

結局hlとlrはそろえておかないと意味が無いということか。それならいっそ一つに統合してほしいと思った。