国際化が重要な理由

WordPressは、母国語が使用されていない国々を含む世界中で使用されています。WordPressのテーマ内の文字列は、他の言語に簡単に翻訳できるように特別な方法でコーディングする必要があります。

たとえあなた自身が複数の言語を知らなくても、国際化は翻訳者がテキストをローカライズするための扉を開きます。ローカリゼーションは、国際化されたテキストを特定の言語と地域に翻訳するプロセスです。これはしばしば「l10n」と略されます。

WordPressには、テーマのソースコードを変更することなくテーマをローカライズできる組み込みの翻訳システムがあります。これは重要です。なぜなら、ユーザーが好みの翻訳を使用しながらテーマの更新に追いつくことができるからです。

国際化なしでWordPressテーマを構築することは確かに可能ですが、特に翻訳されることがないとわかっているサイトの場合はそうです。しかし、ほとんどの場合、テーマのすべてのテキストを国際化することは標準的な慣行と見なされます。一つには、それは他の言語を話す人々によって使用される可能性があることを意味し、より広いオーディエンスを得ることができます。また、公式の テーマディレクトリ にテーマを提出する際の要件でもあります。

テーマを国際化する方法

テキストドメインの取得

テキストドメインは、WordPressがすべての読み込まれた翻訳を区別できるようにするユニークな識別子です。つまり、WordPressがそれに属する翻訳を認識できるように、テーマに対して何かユニークなものが必要です。

テキストドメインは、テーマ内の3つの異なる場所で使用されます:

  • style.css ファイルヘッダー内。
  • 国際化関数の引数として。
  • 翻訳を読み込む際の引数として(WordPressの テーマディレクトリ に提出されたテーマにはオプション)。

テーマのテキストドメインは、このハンドブックを読む ドキュメントで説明されているように、常にテーマスラッグと一致する必要があります。これは、テーマが翻訳の準備ができていることを確認するための中心的な要素です。

de facto 標準(およびWordPressテーマディレクトリにテーマを提出する場合の要件)は、テーマ名の kebab-case バージョンを使用することです。これは次のことを意味します:

  • すべて小文字を使用する。
  • スペースを含まない。
  • 複数の単語がある場合はハイフンで区切る。

したがって、テーマ名が Fabled Sunset の場合、テキストドメインは fabled-sunset であるべきです。

テキストドメインの定義

メインスタイルシート ドキュメントで説明されているように、style.css ファイルヘッダーを介してテーマに関するいくつかの重要なメタデータを構成できます。特に、国際化に関連する2つのメタ値を定義できます:

  • テキストドメイン: 翻訳のためのテキストドメインに使用される文字列。
  • ドメインパス: テーマ翻訳が保存されている相対パス。WordPressは、テーマが無効になっているときにこのフィールドを使用して翻訳を検出します。定義されていない場合は /languages にデフォルト設定されます。

翻訳が正しく機能するためには、少なくとも Text Domain フィールドを定義する必要があります。これはテーマのスラッグであるべきです。

テーマ名が「Fabled Sunset」で、翻訳をテーマの /assets/lang フォルダーに保存したいとしましょう。テーマの style.css は、次のようにこれらのフィールドを定義する必要があります:

  1. /**
  2. * Theme Name: Fabled Sunset
  3. * ...
  4. * Text Domain: fabled-sunset
  5. * Domain Path: /assets/lang
  6. * ...
  7. */

このメタデータを style.css ファイルに追加することが重要です。なぜなら、WordPressはテーマが有効でないときでもそれを使用するからです(たとえば、管理画面の 外観 > テーマ 画面で全テーマを表示する際など)。

国際化関数でテキストをラップする

テーマ内のテキストが簡単に翻訳できるようにするためには、ハードコーディングするのではなく、国際化関数でラップする必要があります。利用可能な 国際化関数 は、Common APIs ハンドブックにリストされています。

典型的なHTMLベースのウェブページでは、プレーンテキスト文字列を追加します。たとえば、この見出しの例を見てみましょう:

  1. <h2>Latest Posts</h2>

これは単なるプレーンテキストであるため、コードを直接変更せずに他の言語に翻訳することはできません。

そのテキストを _e() 国際化関数でラップしましょう。これにより、WordPressは内部のテキストが翻訳可能であり、エコー(画面に印刷)されるべきであることを示します:

  1. <h2><?php _e( 'Latest Posts', 'themeslug' ); ?></h2>

これで、ユーザーはコードに触れることなくテーマの翻訳を追加できます。

お気づきかもしれませんが、_e() 関数は themeslug の2番目のパラメータを受け入れました。これは、あなたのテキストドメインに置き換える必要があります。

使用する他の多くの国際化関数がありますが、後でそれらについて学びます。今のところ、基本的な概念を紹介することが目的です。

国際化されたテキストは技術的にはPHP変数であるため、悪用されてセキュリティの脆弱性になる可能性があります。可能な限り 翻訳とエスケープ関数 を使用するべきです。そうでない場合は、出力時にエスケープ関数でラップすることを確認してください。これは セキュリティ ドキュメントで説明されています。

翻訳の読み込み

WordPressの テーマディレクトリ にホストされているテーマでは、翻訳を読み込む必要はありません。WordPressは自動的にユーザーのインストール内の wp-content/languages ディレクトリをチェックし、Translating WordPress サイトから翻訳をダウンロードします。すべての翻訳はそこで処理され、テーマから保存または読み込むことを心配する必要はありません。

WordPressの翻訳は、.po(人間が読みやすい)および .mo(機械が読みやすい)ファイルに保存されます。.mo ファイルは、実際にWordPressによって使用されるファイルです。

WordPressは、サイトに定義されたユーザーのロケールに基づいて翻訳ファイルを2つの場所で探します:

  • wp-content/themes/your-theme/{domain-path}/{locale}.mo
  • wp-content/languages/themes/{textdomain}-{locale}.mo

テーマから翻訳ファイルを読み込むには、次の2つの関数のいずれかを使用する必要があります:

load_theme_textdomain() 関数のシグネチャを見てみましょう(両方の関数で同じです):

  1. load_theme_textdomain(
  2. string $domain,
  3. string|false $path = false
  4. ): bool

この関数は2つのパラメータを受け入れます:

  • $domain これは、style.css で定義されたテーマのテキストドメインであるべきです。
  • $path これは、テーマ内の翻訳の場所への完全なディレクトリパスでなければなりません。未定義のままにすると、WordPressはテーマのルートフォルダーにフォールバックします。

前述の「Fabled Sunset」テーマの例を使用し、翻訳が /assets/lang フォルダーに保存されていると仮定して、テーマから翻訳を読み込んでみましょう。

このコードをテーマの functions.php ファイルに追加します:

  1. add_action( 'after_setup_theme', 'themeslug_load_textdomain' );
  2. function themeslug_load_textdomain() {
  3. load_theme_textdomain(
  4. 'fabled-sunset',
  5. get_parent_theme_file_path( 'assets/lang' )
  6. );
  7. }

上記の load_theme_textdomain() への呼び出しは、テーマの functions.php が読み込まれた直後に発火する after_setup_theme アクションフックで実行されました。

子テーマを構築している場合、functions.php コードは次のようになります:

  1. add_action( 'after_setup_theme', 'themeslug_load_textdomain' );
  2. function themeslug_load_textdomain() {
  3. load_child_theme_textdomain(
  4. 'fabled-sunset',
  5. get_theme_file_path( 'assets/lang' )
  6. );
  7. }

リソース

国際化は大きなトピックであり、Common APIs ハンドブックの 国際化章 で完全にカバーされています。そこで学んだことは、テーマとプラグインの開発の両方に適用されます。

WordPressには、テキストをラップする際に使用できる多くの 国際化関数 があります。どれを使用するかは文脈に依存します。各関数を学ぶための時間を取り、いつ使用するかを知っておくと良いでしょう。国際化ガイドライン は、正しい道を示してくれます。