var _gaq = _gaq || []; _gaq.push([\'_setAccount\', \'UA-13211647-1\']); _gaq.push([\'_trackPageview\']); (function() { var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true; ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\'; var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s); })();

qTranslate でサイトを多言語化する

※ 以前に書いた記事 (Web サイトをリニューアルしました) の一部を切り出して作成。

qTranslate

WordPress で Web サイトを多言語化する方法には、大まかに次の 4 つがあると思います。

別々のデータベースにインストール
2 つのブログは完全に独立しているため管理コストは 2 倍になる。レンタルサーバーなどで利用できるデータベース数が 1 つの場合は利用不可。
同じデータベースに異なるテーブルプレフィックスでインストール
2 つのブログはほとんど独立しているため管理コストはほぼ 2 倍。phpMyAdmin などのデータベース管理ツールで、同じデータベース内のブログに対して共通処理する場合は作業コストが軽減される。
インストール後にネットワーク (マルチサイト) を作成
ネットワーク作成後にサイトと呼ばれるブログを追加していく。データは 2 つあるため各サイトは独立したブログと同じように管理できる。一方でファイルは 1 つなので WordPress 本体やテーマ、プラグインなどは共有される。運用してみた感じでは管理コストは約 1.5 倍。たまにマルチサイト未対応のプラグインがある。
インストール後に qTranslate プラグインをインストール
qTranslate プラグインをインストールして設定を行う。ブログの管理コストは基本的には変わらない。

以前検討したときは WPML プラグインがちょうど有料化した後で、qTranslate プラグインも扱いにくそうだったので、最終的にはマルチサイト機能を採用しました。けど利用するプラグインの設定などは 2 回行う必要があるので、もう少し作業を減らせないかなと思っていました。そんなときに以下の記事を読んだら qTranslate がなかなかに使えそうだったので、今回のリニューアルに併せ qTranslate でサイトを多言語化することにしました。

日付/時刻のフォーマット

デフォルトの設定では日付/時刻のフォーマットの設定が適切でなかったため、次のように修正しました。

English
  • Date Format: %A %B %e%q, %Y から F j, Y に変更
  • Time Format: %I:%M %p から g:i A に変更
日本語
  • Date Format: %Y年%m月%d日 から Y年n月j日 に変更
  • Time Format: %H:%M から H:i に変更

説明では次のように書かれていて「PHP の strftime 関数や date 関数で指定するフォーマットが利用できる」みたいなことが書いてありますが、おそらくこれは誤りで WordPress の日付と時刻の書式を指定するものと思われます。つまりダッシュボードの [一般設定] の [日付のフォーマット] や [時刻フォーマット] と同じ書式です。

Date Format
Depending on your Date / Time Conversion Mode, you can either enter a strftime (use %q for day suffix (st,nd,rd,th)) or date format. This field is optional. (Example: %A %B %e%q, %Y)
Time Format
Depending on your Date / Time Conversion Mode, you can either enter a strftime or date format. This field is optional. (Example: %I:%M %p)

言語選択メニュー

サイドバーやフッターなどで qTranslate Language Chooser ウィジェットが利用できますが、カスタムメニューから言語を切り替えたかったので、次のようなコードを functions.php に記述しています。

function my_nav_menu_items($items) {
	// Language Chooser
	global $q_config;
	$url = is_404() ? get_option('home') : '';
	$lang = qtrans_getLanguage() == 'ja' ? 'en' : 'ja';
	return $items . "<li id='menu-item-lang' class='lang-{$lang} menu-item menu-item-type-custom menu-item-object-lang'><a href='" . qtrans_convertURL($url, $lang) . "' hreflang='{$lang}'>{$q_config['language_name'][$lang]}</a></li>";
}
add_filter('wp_nav_menu_items', 'my_nav_menu_items');

こんな感じで表示されるようになります。

言語選択メニュー

ホームメニューのリンク先

カスタムメニューの「ホーム」のリンク先はブログのトップページ ([一般設定] の [サイトアドレス (URL)]) で固定されています。現在の言語に応じたトップページとなるように、次のようなコードを上記の関数に追記しています。もっとうまいやり方があるような気がしますが…思いつきませんでした。

function my_nav_menu_items($items) {
	// Home URL
	$items = str_replace('"' . get_home_url() . '/"', '"' . qtrans_convertURL(get_home_url()) . '/"', $items);

テンプレートファイルの翻訳

参照した記事では次のようなコードが紹介されていましたが、

<?php _e("<!--:en-->english<!--:--><!--:ja-->にほんご<!--:-->"); ?>

よりシンプルな書き方として次のようなコードも使えます。

<?php _e("[:en]english[:ja]にほんご"); ?>

当たり前ですが、どちらの書き方でも _e() 関数ではなく __() 関数を使えば値が出力されずに戻り値として返ります。

テーマの qTranslate 対応

qTranslate には開発者向けに便利な関数がいくつか用意されています。たとえば現在の言語を返す qtrans_getLanguage() 関数や、現在の言語に応じた URL に変換する qtrans_convertURL() 関数などがあります。その他の関数は以下のページにまとめられています。

これらの関数を利用すると当然そのテーマは qTranslate 必須となります。qTranslate がない場合にも対応させる場合は、function_exists 関数を使います。

Post Tagged with

コメントを残す

メールアドレスが公開されることはありません。