多言語サイト

情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。

多言語サイトを構築中です。
以前WPMLというプラグインを使ってみた時、結構ややこしかったので、アクセスするブラウザの言語で条件分岐しコンテンツはカスタムフィールドで切り替えて、と考えていましたが、ページ数もカテゴリーも多いサイトなのでわかりやすく管理しやすい方向で…qTranslate というプラグインを使ってみることにしました。

こちらは、かなりわかりやすいです。http://wordpress.org/extend/plugins/qtranslate/ 参照

投稿欄が言語のタブで切り替えられるところもわかりやすいし、テンプレート上では

<?php _e("<!--:en-->english text<!--:--><!--:de-->german text<!--:-->"); ?>

のように書けばよいらしい。あるいは if (qtrans_getLanguage() == ‘en’) で分岐。
言語だけ変えればいいところと、広い範囲で変えるところと使い分けられるのでテンプレートを作る作業も少し楽かな、と。

7/1 追記
本文の記入がない場合に一覧に表示しない分岐

<?php $language = qtrans_getLanguage(); if(qtrans_isAvailableIn($post->ID, $language)) : ?>

7/24 追記
パンくずプラグインが言語の判別をしてくれないので、パンくず部分のタグを書くのがなかなか大変でした。
IDからカテゴリーのURLを取得は言語を判別してくれる。home_urlは判別してくれない。IDから投稿のパーマリンクを取得は判別してくれない。アーカイブリストの投稿数は本文のないものもカウントする。

テーマファイルがあまり多くなっても大変なので、ヘッダーとトップページのみ言語別とし、その他は同一ファイル内で条件分岐…もなるべく少なくてすむようにカテゴリーへのリンクは

<a href="<?php $category_link = get_category_link('1'); echo $category_link; ?>"><?php $cat_name = get_the_category_by_ID( 1 ); echo $cat_name; ?>

とか。*カテゴリー名は言語別に設定できる。

カスタム投稿タイプごとのサブメニューは *下のコードは表示中のページにクラスを付ける設定

<?php
$IDOutsideLoop = $post->ID;
global $post;
$tmp_post = $post;
$args = array( 'numberposts' => -1, 'exclude'=> 13, 'post_type' => company, 'orderby' => 'post_date', 'order' => 'ASC', );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
	<?php $language = qtrans_getLanguage(); if(qtrans_isAvailableIn($post->ID, $language)) : ?><li<?php if($IDOutsideLoop == $post->ID) {echo " class="self""; } ?>><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php endif; ?>
<?php endforeach; ?>

2013.6.17追記
例えば日本語と英語の設定で英語のページを表示している時にホームへのリンクが日本語トップになってしまう場合、functions に以下を追記

add_filter('home_url','qtrans_convertURL');