🏡まったのブログ

Bogoを利用するときの注意点

私は多言語化プラグインBogoでを利用したWordPressサイト多言語化の際の注意点。

はじめに

WordPressの他言語化プラグインといえば WP ML か Bogo らしい。qTranslateは新しくqTranslate X として作り直されたらしいが、他のプラグインと競合しやすい癖がまだ抜けてなさそう。

Bogoは結構絶賛されていたが、「One language per post」と呼ばれる1ページ1言語の考え方なので、つまりは現行ページ数×言語数のページを生成せねばならない。

元々は「poファイルみたいな翻訳ファイルを作ってlanguageフォルダに設置すればOKだろう」くらいで考えていた(これもpoファイルの元となるpotファイルにない単語は翻訳不可)ので、上記の構成で思った以上に工数がかかった。

しかし逆に「one website per language」のマルチサイト型にするよりは楽なようなので、今後もBogoにお世話になろうと思う。

ページタイトルに言語名を付与すべし

WordPressのメニューにおいて、Bogoではメニュー項目ごとに「どの言語で表示させるか」を選択することができる。ただ基本的には1項目1言語でしか表示しないだろう。つまり「日本語のメニュー項目数×言語数」の項目が、外観>メニューのページにズラーッと縦並びすることになる。

さらにBogoでは言語ごとにページを生成するため、メニューに追加したい各ページのタイトルはその言語に翻訳されたタイトルになっている。

例えば中国語では中国・香港・台湾と3種類の違いがあるが、これらの言語は共通している部分も多い。日本語で「予約」というページがある場合、これらの中国語3種の翻訳語のタイトルは「预订 」「預訂 」「 預訂」となる。

これをメニューに追加しようと思った時に、どれがどの言語のページなのかわからなくなる。

そのため、(タイトルはブラウザのタブに表示されるし、SEO的な影響も多少不安だが)「预订(中国) 」「預訂(香港) 」「 預訂(台湾)」のように、タイトルにはどの国のページなのかを括弧書きで記載することをおすすめする。

ページビルダープラグインは WPBakery Page Builder がおすすめ

テーマ付属だったり、SiteOrigin Page Builder プラグインで制作したコンテンツは、Bogoの翻訳を追加によるページ複製機能ではコピーされない。しかし WPBakery Page Builder プラグインなら複製機能でコピーしてくれる。

また最悪できなかったとしてもテンプレート登録&読み込み機能があるので日本語ページを簡単にコピーできておすすめである。

従ってページ数×言語数だけ手動でページビルダーでコンテンツを生成せねばならず骨が折れるので注意。

パーマリンクの更新を忘れずに!

カスタム投稿タイプのアーカイブページが404になった。この記事をみて「もしや」と思いパーマリンク設定を更新したら治りました!URLやスラッグ系ではあるあるですので、もしかするとこちらのケースも治るかもです!

パーマリンクに不具合があるとカスタム投稿タイプの投稿をBogoで生成しても、そのパーマリンクは日本語ページのそれにリダイレクトされてしまいますので注意が必要です。

使用したカスタマイズコード

// Bogo 言語スイッチのEnglishの(United States)を削除
function replace_bogo_text($output){
 return str_replace(' (United States)','',$output);
}
add_filter( 'bogo_language_switcher','replace_bogo_text');

// Bogo 国旗アイコンを削除
function bogo_use_flags_false(){
 return false;
}
add_filter( 'bogo_use_flags','bogo_use_flags_false');

// Support custom post type with bogo.
function my_localizable_post_types( $localizable ) {
    $localizable[] = 'your_post_type_name';
    return $localizable;
}
add_filter( 'bogo_localizable_post_types', 'my_localizable_post_types', 10, 1 );

// Bogoのテンプレート出し分け
function select_locale_template($template){
  $locale = get_locale();
  if($locale == 'en_US'){
    $locale_template = dirname( __FILE__ ) . '/' . basename($template, '.php') . '_en.php';
    if(file_exists($locale_template)){
      $template = $locale_template;
    }
  }
  return $template;
}
add_filter('index_template', 'select_locale_template');
add_filter('404_template', 'select_locale_template');
add_filter('archive_template', 'select_locale_template');
add_filter('author_template', 'select_locale_template');
add_filter('category_template', 'select_locale_template');
add_filter('tag_template', 'select_locale_template');
add_filter('taxonomy_template', 'select_locale_template');
add_filter('date_template', 'select_locale_template');
add_filter('home_template', 'select_locale_template');
add_filter('front_page_template', 'select_locale_template');
add_filter('page_template', 'select_locale_template');
add_filter('paged_template', 'select_locale_template');
add_filter('search_template', 'select_locale_template');
add_filter('single_template', 'select_locale_template');
add_filter('text_template', 'select_locale_template');
add_filter('plain_template', 'select_locale_template');
add_filter('text_plain_template', 'select_locale_template');
add_filter('attachment_template', 'select_locale_template');
add_filter('comments_popup', 'select_locale_template');
add_filter('home_template', 'select_locale_template');
// PHPファイルで言語ごとに表示内容を switch
  <?php $locale = get_locale();
          switch ($locale) {
            case 'en_US':
            break;

            case 'zh_CN':
            break;

            case 'zh_TW':
            break;

            case 'zh_HK':
            break;

            default:
            break;
          } ?>

ナビメニューに言語スイッチを埋める

PC版は position: absolute で右上などに絶対配置してしまえばいいが、モバイル版はハンバーガーメニューの中に入れたい場合がある。

今回はTCDテーマ KADAN を利用したサイトであったが、wp_nav_menu()の引数に渡す $args の中にショートコードを入れ込むことで綺麗に埋め込めた。

スラッグは英語でなければならない

投稿だけかもしれないが、スラッグ(URLに使われる一部)を日本語にしておくと以下の警告が出た。

Too few arguments in/home/example/example.com/public_html/wp-includes/nav-menu-template.phpon line261

これはナビメニューに使用されるsprintf()関数の引数が足りない時に吐かれるエラーだが、今回は日本語スラッグの投稿だけで(正確には日本語スラッグの投稿の外国語の投稿を生成し公開すると)エラーが出たので原因がスラッグと分かった。

パーマリンクを基本に変更するのは要注意

タイトルをそのままスラッグに使われてしまわないよう、パーマリンクを基本?p=123形式にしようと考えるかもしれない。しかしこれをしてしまうと固定ページのパーマリンク形式も変更されてしまうため、各ページに設置しているリンク先を変更しなければならなくなる。

URLがexample.com/?p=123&lang=enみたいな形式になって美しくもないので、スラッグを英語にする点だけ注意して使う方がいいかなと。

参考リンク

bogoで表示中の言語ごとに別のテンプレートを使う

無料なのに最強!WordPressの多言語化プラグインBogoの使い方これ便利!

ワードプレスサイトを多言語化するプラグイン「Bogo」使い方まとめ

WordPressプラグイン『Bogo』の言語スイッチの見た目をカスタムする | oku-log

Bogoを使ってWordpressを多言語化 – 株式会社クオックス|QOX Inc.

WordPressプラグイン「Bogo」:翻訳ページが表示されないときの対処 | 記事 | ShitTakaBull

Bogoプラグイン使用時、get_postsで投稿を取得すると全部の言語が対象になる | WordPress.org

WordPress|多言語化プラグイン「bogo」のメモメモ - エフスタジオのテクニカルメモ

WordPress サイトの多言語化に もう迷わない そう、Bogo ならね | Design Hack and Slash