wordpressで作成したホームページを二か国語(日本語、英語)ホームページにしました。二か国語にするために、qTranslateプラグインを使用し、「qTranslateプラグインによるホームページの英語化 」に続き、次に示すwordpressのロジック自身を修正しました。

ロゴの下に英語/日本語切替えボタンの設置

今度は、フロントページで、ユーザーが閲覧する表示言語を選択できるようにします。ヘッダーやindex.phpテンプレートの、言語選択リンクボタンを表示させる適当な場所に下記のコードを埋め込みます。今回は、ロゴの下に言語切り替えボタンを右記のような形で設置します。

言語り替えボタン

header.phpファイルのロゴを表示している下に次のphpコードを追加します。

<div id="logo">
   <a href="<?php echo home_url('/'); ?>"><img src="<?php header_image(); ?>" 
   width="<?php      if(function_exists('get_custom_header')) 
   { echo get_custom_header() ->    width;} else { echo HEADER_IMAGE_WIDTH;} ?>" 
   height="<?php  if(function_exists('get_custom_header')) 
   { echo get_custom_header() -> height;} else { echo HEADER_IMAGE_HEIGHT;} ?>" 
   alt="<?php bloginfo('name'); ?>" /></a>

   <?php echo qtrans_generateLanguageSelectCode('both'); ?>

</div><!-- end of #logo -->

style.cssファイルに次のqTranslate用のCSSコードを記述します。

ul.qtrans_language_chooser {
     margin:0;
     padding:0;
}
ul.qtrans_language_chooser li{
     width:80px;
     height:20px;
     float:left;
     background:#c7b299;
     text-align:center;
     padding:2px 0;
     margin:2px;
     list-style:none;
}
ul.qtrans_language_chooser li a {
     text-decoration:none;
     color:#fff;
     font-weight:bold;
}

言語切り替えボタンで日本語と英語でメニューバーの切り替え

front-page.phpで言語切り替えボタンが英語かどうかを判断して、header.phpに制御を移すと、Topページは、切り替えボタンに従って、英語と日本語のメニューバーが表示されますが、この方法では、固定ページの部分に反映されない(front-page.phpはTopページを表示するファイル)ため、qtrans_getLanguage関数による判断をheader.phpに入れます。qtrans_getLanguage関数の戻り値が「en」の場合、英語表示とします。

今回のWordpressのテーマでは、sub-header-menuを英語用のメニューバーとしました。これによりWordPressの管理画面で「外観」から「メニュー」を選択し、「サブヘッダメニュー」によりメニュー項目が管理できるようにしました。管理画面の外観を次に示します。

メニューバー管理画面

header.phpファイルのメニュー表示の部分を次に示します。

<?php get_sidebar('top'); ?>
<?php wp_nav_menu(array( 
   'container'       => 'div',
   'container_class' => 'main-nav',
   'fallback_cb'     =>  'responsive_fallback_menu',
   'theme_location'  => 'header-menu')
  ); 
?>
<?php if (has_nav_menu('sub-header-menu', 'responsive')) { ?>
<?php wp_nav_menu(array(
   'container'       => '',
   'menu_class'      => 'sub-header-menu',
   'theme_location'  => 'sub-header-menu')
  ); 
?>
<?php } ?>
<?php responsive_header_bottom(); // after header content hook ?>

次のように変更します。

<?php get_sidebar('top'); ?>
<?php if (qtrans_getLanguage() != 'en') { ?>
<!-- 日本語サイトだけに表示する内容  --> 
   <?php wp_nav_menu(array(
       'container'       => 'div',
       'container_class' => 'main-nav',
       'fallback_cb'	 => 'responsive_fallback_menu',
       'theme_location'  => 'header-menu')
      ); 
   ?>
<?php } else { ?>
   <?php wp_nav_menu(array(
       'container'         => 'div',
       'container_class'   => 'main-nav',
       'fallback_cb'	   => 'responsive_fallback_menu',
       'theme_location'    => 'sub-header-menu')
      ); 
    ?>
<?php } ?>

英語HomeのURLの切り替え

HomeのURLは、デフォルトだと日本語HomeのURLが使われてしまいます。作成した英語用のメニューバーのURLに英語HomeのURL「xxx/?lang=en」(xxxは日本語URL)を次のように設定します。

英語HomeのURLの設定

qTranslateでは、いちばん後ろに?lang=xxが付くパターン、ドメイン直後に/xx/が付くやり方、xx.example.com/なサブドメインコースの3つの形式で、言語別のコンテンツを表示させることができます。

これは、次のようにAdvanced Settings > URL Modification Modeのところで設定できます。

言語別コンテンツのURL形式

日本語のみのHPの処理

英語では表示されない日本語ページで、言語切り替えボタン押して英語ページに切り替えるときに、Homeを表示する仕様としました。このため、qtrans_getLanguage関数をベースにqtrans_SelectCode関数を作成し、functions.phpファイルに登録しました。qtrans_SelectCode関数のコードを次に示します。

function qtrans_SelectCode( $style='both', $id = '' ) {
	global $q_config;
	
	if($style=='') $style='text';
	if(is_bool($style)&&$style) $style='image';
	if(is_404()) $url = get_option('home'); else $url = '';
	if($id=='') $id = 'qtranslate';
	$id .= '-chooser';

	echo '<ul class="qtrans_language_chooser" id="'.$id.'">';
	foreach(qtrans_getSortedLanguages() as $language) {
		echo '<li';
		if($language == $q_config['language'])
			echo ' class="active"';
		echo '><a href="'.qtrans_convertURL(get_home_url(), $language).'"';
		echo ' class="qtrans_flag_'.$language.' qtrans_flag_and_text" title="'.$q_config['language_name'][$language].'"';
		echo '><span>'.$q_config['language_name'][$language].'</span></a></li>';
	}
	echo "</ul><div class=\"qtrans_widget_end\"></div>";
}