多言語サイトの制作が重なったので、少しまとめておきます。
多言語化を実現しようとするとWordPress単体ではやはり難しくプラグインを利用することになります。いくつか確認したプラグインの中で「Bogo」が唯一の選択肢でした。
2022.10.4 現状に合わせて記事を書き直しました。やはりとても良いプラグインです。
多言語サイトのハードル
多言語サイトは言語ごとに同じサイトが複数あるイメージです。これをWordPressで実現するには下記の課題があります。
- 同じ内容のページを言語ごとに複数持つ
- 対応したページ間のリンクを貼る(存在しない場合はリンクしない)
- SEOのため正しいHTMLを記述にする
- 運用をわかりやすい形にする
もしWordPress単体で行う場合は、WordPressのマルチサイト機能を使った設計になりそうです。ただ設定項目が多くなり、投稿時にスラッグを合わせるなど約束事も増えます。マルチサイトに対応していないプラグインも多いようなので、かなりハードルは高いように思います。
Googleの自動翻訳を利用するプラグインなどもありますが、コーポレートサイトなどで自動翻訳を利用するケースもあまりないため、これも採用できません。
その中で必要十分な選択肢が「Bogo」でした。
興味のある方に少し技術の詳細を説明しましょう。Bogo は一投稿につき一言語を割り当てるタイプの多言語化プラグインです。Bogo の設計は WordPress と親和性が高く、このカテゴリーの他のプラグインとは異なり、データベースに独自のテーブルを追加するようなことがありません。この設計が Bogo の高い信頼性と堅牢性、コンフリクトが起きにくいといった利点を生み出しています。
基本的には通常のWordPressの構成のまま、各言語ページを相互に結びつけるという機能を追加してくれます。仕組みとしてはページのカスタムフィールドを使って対応させているようです。
またサイト名やカテゴリー名も言語ごとに切り替える必要がありますが、その点もWordPressの標準的な機能(翻訳ファイル)が使われています。
プラグインの説明にもある通り、WordPressを素直に使用した設計になっているため、他のプラグインともぶつかりづらいようです。
ただURLの操作についてはWordPressのルールから外れた仕様になっているので、この点はリスクになっています。
例えば、日本語サイトに英語サイトを追加した場合はURLに「/en/」がつくようになります。これは多言語サイトとしては一般的な形で良いのですが、WordPressとしてはイレギュラーな仕様のため若干無理をしている部分です。
またもう一点、「/about」と「/en/about」のように実際には別のページでも同じスラッグ(=URLになるページ名称)を付けられるようになっています。多言語サイトのURL設計としてはとてもわかりやすく理想的な形です。ただ本来スラッグはサイト内で唯一のものとすることが原則なので、何らかの問題を起こす可能性はあります(この点後述します)。
多言語サイトに関するGoogleの説明
Googleのサポートページ「多地域、多言語のサイトの管理」にSEO上の留意点がまとめられています。
重要と思える点は下記の2点です。
- 言語のバージョンごとに異なる URL を使用する
=言語ごとにページを分ける - 複数の言語のバージョンがあることを Google に知らせる
=ページの中に対応する言語ページのURLを書く
例えば、日本語の文章とその英語翻訳が同じ1ページに記載されている場合がありますが、これはNGということになります。JavaScriptで表示を切り替えていてもGoogleには正しく伝わりません。
「Bogo」は言語ごとにページを分ける形になり、HTMLの中に対応する言語ページも自動で記述します。SEOの面でも問題ありません。
以前あった不具合も改修されています
1、Gutenbergにも対応済み
以前は「Gutenberg」にて下記の点がありましたが解決されています。
- 固定ページの親子関係を指定できなくなる
- 各言語ページのスラッグを統一できない
2、切り替えボタンのマークアップが改善
デザイン面で、言語の切り替えボタンのマークアップにやや固定化しすぎている点がネックでしたが、CSSにて細かく調整できるよう改善されています。基本的にはデザインしなくても表現できるように国旗などが表示されるようになっていますが、きちんとカスタマイズしたい場合はそれらを削除するという形になります。functions.phpにて削除も可能です。
テーマファイル内の留意点
テーマファイル内で間違いやすい点として、翻訳した「サイト名」や「キャッチフレーズ」を取得したい場合、「get_bloginfo(‘description’)」ではメインの言語しか取得できません。表示しているページに対応した出力をする場合は、「bloginfo(‘description’)」と記述する必要があります。複数箇所で表示させる場合も変数に入れるのではなく、その場で表示する形になります。
また少し混み入った仕組みにしていくと、各ページデータの取得などで言語指定が思うようにいかないことがあります。プラグインの中にある「includes/functions.php」を一通り眺めると、解決できる関数が見つかるかもしれません。
改めて深く利用する機会があり、多言語サイトには本当に理想的なプラグインだと思いました。