CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

FuelPHPの機能を活用して、良い感じで他言語対応サイトを構築できないか、考えてみました。

そこで、クラスAgent、Cookie、Langを活用したサイト構築にトライしてみました。
今回は、日本語ユーザがブラウザでアクセスした際は日本語表示で、そうでない場合は英語表示でサイトを切り替えることを目指します。

言語ファイルの用意

まず、言語を切り替える文言について、言語ファイルを「/fuel/app/lang/」に用意します。
ファイル名は任意ですが、各言語はフォーマットを含めて統一させます。
例えば以下のファイルを用意します。

「/fuel/app/lang/ja/labels.php」

return array(
	'meta' => array(
		'tit' => 'タイトル',
		'key' => 'キーワード1, :other',
		'des' => 'ディスクリプション',
	),
);

「/fuel/app/lang/en/labels.php」

return array(
	'meta' => array(
		'tit' => 'title',
		'key' => 'keyword1, :other',
		'des' => 'description',
	),
);

言語ファイルの呼び出し

言語ファイルの呼び出し方についてですが、例えばクラス内で日本語の言語ファイルを呼び出す場合は以下のようLangクラスを利用します。

Config::set('language', 'ja');	// 日本語に設定
Lang::load('labels');	// 日本語の言語ファイル「labels.php」を読み込み
echo __('meta.tit');	// 言語ファイルの中から設定値を表示

結果「タイトル」と出力されます。

同様にして英語の言語ファイルを呼び出す場合です

Config::set('language', 'en');
Lang::load('labels');
echo __('meta.tit');

結果「title」と出力されます。

また、以下のようにパラメータを渡して出力することができます。

echo __('meta.key', array('other', 'keyword2, keyword3'));

結果「keyword1, keyword2, keyword3」と出力されます。

言語の自動判定

言語ファイルの用意はできたので、次に、アクセスしてきたユーザが日本語ユーザなのか、英語ユーザなのか、自動判定してみたいと思います。

FuelPHPにはブラウザ情報を取得するAgentクラスがあるので、関数「languages()」を使って判定するとよいでしょう。

$lang = Agent::languages();
if(in_array('ja', $lang)){
	Config::set('language', 'ja');
}else{
	Config::set('language', 'en');
}
Lang::load('labels');

基本的に世界中のブラウザは英語に対応しているので、日本語対応の場合に日本語をセット、そうでない場合は英語というように判定します。

ちなみに「Agent::languages()」はPHPのサーバ変数「$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]」の値を参照しています。

言語を選択可能にする

上記のように自動判定にしてしまうと、日本人の方が英語で見たい場合、またはその逆の場合に、言語を選択することができません。
そこでCookieクラスを利用して言語を選択可能にします。

例えば「日本語」「English」ボタンを用意し、クリックイベントなどで以下のようにクッキーに言語をセットします。

Cookie::set('lang', 'ja');
または
Cookie::set('lang', 'en');

クッキー「lang」の読み込みに成功した場合は、その値をそのまま設定して、そうでない場合は自動判定します。

if(Cookie::get('lang')){
	Config::set('language', Cookie::get('lang'));
}else{
	$lang = Agent::languages();
	if(in_array('ja', $lang)){
		Config::set('language', 'ja');
	}else{
		Config::set('language', 'en');
	}
}
Lang::load('labels');

同様にして、中国語(簡体・繁体)や韓国語など複数言語を追加可能です。
インバウンド需要のあるサイトに有効なシステムになりそうですね。

このエントリーをはてなブックマークに追加

Monthly Archives

Search