ブラウザの言語設定によってWordPressプラグインの表示言語を切り替える。

現在、多言語化したウェブサービスを開発してるんですが、ウェブアプリをプラグインで実装してまして、ウェブアプリ側だけ、ユーザーのブラウザの言語設定によって表示言語を切り替える必要が出て来ました。

スクリーンショット_2013_02_26_15_30

要はですね、サイト全体の多言語化を待ってたらあれなので、ウェブアプリの部分だけでも先に多言語化しちゃおうってことです。

こうすると、サイト側はサブドメインで別のWordPressをちまちま量産して、コンパネはそのうちのどれか1つに実装しておけば、あとは各サイトからウェブアプリにリンクを張るだけでいいから楽ちんですよね。

今回のこのアプリはカスタム投稿タイプにデータを保存してるので、なおさらです。

言語切替のポイント

多言語化したプラグインは、load_plugin_textdomain() っていう関数で、言語ファイルを読み込むんですが、その関数の中には、plugin_locale というフックがあります。

そのフックの中で、環境変数 $_SERVER['HTTP_ACCEPT_LANGUAGE'] を取得して、その内容によって異なる言語コードを返すようにするわけです。

public function plugins_loaded()
{
    // plugin_locale は必ず load_plugin_textdomain() の前で
    add_filter("plugin_locale", array(&$this, "plugin_locale"), 10, 2); 
    load_plugin_textdomain(
        "my-textdomain",
        false,
        dirname(plugin_basename(__FILE__)).'/languages'
    );  
}

public function plugin_locale($locale, $domain)
{
    if ($domain === 'my-textdomain') {
        if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            if (preg_match('/^ja/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
                return 'ja';
            }
        }   
    }   

    return 'en';
}
以下 2012/3/3 追記

wp-login.phpも言語設定を切り替える。

ログイン画面やサインアップ画面が英語のままじゃんってことで、そちらも環境変数で言語を切り替えれるようにしました。

add_filter('locale', array(&$this, 'locale'));

public function locale($locale = 'en', $domain = 'default')
{
    $lang = ''; 
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
        if (preg_match('/^ja/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            $lang = 'ja';
        }   
    }
    if (isset($_SERVER['REQUEST_URI']) &&
                preg_match("/^\/wp-login\.php/", $_SERVER['REQUEST_URI'])) {
        if ($lang) {
            return 'ja';
        }
    }

    return 'en';
}