WordPressを利用して、ブログではなくCMSとして企業サイト・企業ウェブサイト作成・商用ホームページ制作のテクニックを公開。WordPressの最新ニュースやプラグインの紹介、自作プラグインやテーマも開発中。
Poedit Pro の新機能「WordPress のテーマ・プラグインを翻訳」と_x()や_ex()の翻訳が Poedit で可能だと気付いたこと

Poedit Pro の新機能「WordPress のテーマ・プラグインを翻訳」と_x()や_ex()の翻訳が Poedit で可能だと気付いたこと

WordPress のプラグインやテーマの翻訳で役立っている Poedit の 有料 Pro バージョンがリリースされました。引き続き無料でも利用できるようですが、有料版に「WordPress のテーマ・プラグインを翻訳」という機能が搭載された、ということで早速購入して試してみました。有料の Poedit Pro の概説と購入はこちらから。19.99ドルなので2126円くらいのようです。@naokomc さんが WordPress プラグイン・テーマ翻訳対応を強化した有料版 Poedit Pro を使ってみました – ja.naoko.ccに日本語で解説されています。

Poedit を起動すると以下のような感じです。メニューも日本語で利用できるので大変わかりやすいです。

Poedit Pro 起動画面

一番下に「WordPress のテーマ・プラグインを翻訳」という項目があるのでクリックします。すると、WordPress のテーマまたはプラグインの含まれるフォルダを選択するように促されます。試しに、Custom Field Template のプラグインフォルダを選択してみました。

WordPress の情報抽出に失敗画面

なんとWordPress エラーが表示されて、「WordPress の情報抽出に失敗しました。」と出るではないですか。「ログを表示」というボタンがあるので押してみます。

このログを help@poedit.net. にお送りください。ありがとうございます !
~ Please add any additional information here.
~ If you can attach a ZIP with the plugin/theme folder, it would help greatly.

***
WordPress error: “Custom Field Template” プラグインの翻訳ドメインを検出できませんでした。
Name: 'Custom Field Template'

Analyzing WP directory \custom-field-template
not theme - lacks style.css
in \custom-field-template\custom-field-template.php: found "load_plugin_textdomain\s*\(\s*['"]([^'"]+)['"]\s*, " = "custom-field-template"
in \custom-field-template\custom-field-template.php: found "load_plugin_textdomain\s*\(\s*['"]([^'"]+)['"]\s*, " = "custom-field-template"
in \custom-field-template\custom-field-template.php: found "(^|\s+)Plugin Name:\s*(.*)$" = "Custom Field Template"
*** \custom-field-template\custom-field-template.php is the main plugin file
in \custom-field-template\custom-field-template.php: no matches for "(^|\s+)Text Domain:\s*(.*)$"
in \custom-field-template\custom-field-template.php: no matches for "(^|\s+)Domain Path:\s*(.*)$"
too many load_plugin_textdomain calls (custom-field-template, custom-field-template) and lacking metadata

ずらずらと何やらログが表示されたのでよく見てみると、Text Domain と Domain Path にマッチしないよって書いてあります。検索してみて、わかりました。

@wokamoto さんのWordPress Plugin 作者に覚えておいて欲しいこと | dogmap.jp
I18n for WordPress Developers – WordPress Codex 日本語版で説明されていますが、プラグインヘッダーに Text Domain と Domain Path を追加する必要がある、ということでした。

/*
Plugin Name: Custom Field Template
Plugin URI: https://wpgogo.com/development/custom-field-template.html
Description: This plugin adds the default custom fields on the Write Post/Page.
Author: Hiroaki Miyashita
Author URI: https://wpgogo.com/
Version: 2.1.8
Text Domain: custom-field-template
Domain Path: /
*/

早速、Text Domain と Domain Path を追加して(正確には、Text Domain を指定するだけでエラーは消えました)、再度、Poedit の「WordPress のテーマ・プラグインを翻訳」を実行すると問題なく読み込まれました。

翻訳内容の読込

読込の時に、翻訳言語を選択するので、翻訳して保存すれば、custom-field-template-ja.po と custom-field-template-ja.mo が翻訳言語に合わせて自動的に保存されるようになっていました。ただ、翻訳ファイルの元になる pot ファイルは自動的には生成されないようなので、pot ファイルを用意する場合は、自分で保存しなおす必要がありそうです。

_x()や_ex()の翻訳が Poedit で可能だった!

さて、前半の話よりも、後半のここからが、発見だったのですが、Poedit のカタログの設定を開いて、ソース中のキーワードを表示すると以下のようになっていました。

__
_e
_n:1,2
_x:1,2c
_ex:1,2c
_nx:4c,1,2
esc_attr__
esc_attr_e
esc_attr_x:1,2c
esc_html__
esc_html_e
esc_html_x:1,2c
_n_noop:1,2
_nx_noop:3c,1,2
__ngettext_noop:1,2

__() と _e() の最初の2つの関数は、プラグインやテーマの国際化で非常によく使われているので馴染みがあると思いますが、他の関数はほとんど使ったことがないので、こんなに翻訳関連の関数があったんだ、と驚く感じではあったのですが、_x() と _ex() は以前より使いたいな、と思っていた関数でした。

_x() と _ex() 関数は、WordPress 2.8 より追加された関数で、以下のように3つの引数を取るわけですが、__() や _e() と異なり、2番目の引数に context を指定するようになっています。

 * @param string $text    Text to translate.
 * @param string $context Context information for the translators.
 * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.
 * @return string Translated context string without pipe.
 */
function _x( $text, $context, $domain = 'default' ) {

context って何だ、っていう話ですが、文脈や表示箇所で翻訳を使い分けたい時に別々の翻訳を当てることができる識別子みたいなものです。

例えば、Name という英語の翻訳をする時に、「名前」と翻訳すればいい時と「名」とだけ翻訳して表示したい時があるとします。__() や _e() だと翻訳は一つしか設定できないので、「名前」か「名」のどちらかになってしまうわけです。これが、_x() や _ex() で context を指定すれば、同じ Name でも context ごとに複数の翻訳を割り当てることができます。

ただ、以前、Poedit のソース中のキーワードに _x と _ex を加えても Poedit で context を読み込んでくれる気配がなかったので、Poedit だと、うまく context は使えないんだ、と思い込んでいたんですが、ソース中のキーワードへの設定方法にポイントがあったようです。

_x:1,2c
_ex:1,2c

上記のように指定することで、第2引数を context として読み込むようになりました。これで翻訳を使い分けることができるようになりました。

Poedit Pro の「WordPress のテーマ・プラグインを翻訳」でプラグインを読み込めば、ソース中のキーワードも自動で設定してくれるので、今後プラグインを新しく作成する場合は使ってみたいと思っています。また、_x() や _ex() も Poedit で翻訳できると分かったので、これまでのプラグインやテーマの翻訳箇所も見直していきたいと思います。

One comment

  1. Pingback: 日本語化するための「poファイル」をソースプロジェクトから作成する! | ブログ作成のツボ

Comments are closed.