WordPress 3.7 から、コアやプラグインの自動アップデートの仕組みが準備され、今後言語ファイルのアップデートも自動化されることにると思います。2013 年 10 月 28 日現在、まだその準備段階にあるようですが、関連して今後おそらく、言語ファイルのロード方法が変わるようになります。では、今日現在、プラグイン作者はどのようにしておくのが適切なのかをちょっと考えてみました。
なお、今後の言語ファイルの管理全体がちょっと見えていないので、認識不足や間違いがあればご指摘頂けると嬉しいです。
3.6 以前
WordPress 3.6 以前は概ね次のような記述だったと思います。
1 2 3 4 5 6 |
add_action( 'plugin_loaded', function() { load_plugin_textdomain( 'mytextdomain', false, 'myplugin/languages'); } add_action( 'after_setup_theme', function () { load_theme_textdomain( 'mytextdomain', get_template_directory() . '/languages' ); } |
どちらも言語ファイル(.mo)の場所をパスで指定しています。プラグインは相対パス、テーマは絶対パスでの指定と、ちょっと一貫性がなくてややこしかったですね。
3.7 以降で、言語ファイルの自動アップデートを利用する場合
WordPress 3.7 以降で、言語ファイルを自動アップデートを適用する場合、次のような記述になるようです。
1 2 3 4 5 6 |
add_action( 'plugin_loaded', function() { load_plugin_textdomain( 'mytextdomain' ); } add_action( 'after_setup_theme', function () { load_theme_textdomain( 'mytextdomain' ); } |
テキストドメインだけの記述になり、簡潔になりました。これはしっくり来て良いですね。
ではどのように .mo ファイルの場所が特定されるかというと、新しい規定のルールが導入され、それぞれ WordPress 内の次の場所に置かれることになります。
- /wp-content/languages/plugins/{text-domain}-{locale}.mo
- /wp-content/languages/themes/{text-domain}-{locale}.mo
この場所へどうやってデプロイするのか、まだ僕は見つけれていません (^_^;A が、おそらく準備中なのかなーと思っています。
課題
さて、翻訳フォイルを上記の場所にデプロイできる環境が整ってそこの言語ファイルを配置できたら、WordPress 3.7 以降をインストールしている環では言語ファイルの自動アップデートが適用されます。また、開発者視点では、言語ファイルの追加や修正でプラグイン自体をアップデートする必要も無くなる改善です。しかし、次の課題があります。
- 新しい方法だけ採用したら、3.6 以前の環境では言語ファイルが適用されない
- 古い方法だけ採用したら、当然新しい手法の恩恵が受けれず、また古い将来廃止されるかも知れない不安が残る
2013 年 10 月時点の対処
では、現時点でどう対処するのが良いかというと、現時点では次の感じかなーと思っています。
1 2 3 4 5 6 7 8 |
add_action( 'plugin_loaded', function() { load_plugin_textdomain( 'mytextdomain' ) or load_plugin_textdomain( 'mytextdomain', false, 'myplugin/languages'); } add_action( 'after_setup_theme', function () { load_theme_textdomain( 'mytextdomain' ) or load_theme_textdomain( 'mytextdomain', get_template_directory() . '/languages' ); } |
load_plugin_textdomain()、load_theme_textdomain() のいずれの関数もロード出来なかった場合に false が変えるので、まず新しい仕組みでロードし、失敗して false が返ってきた場合にこれまでの方法でロードします。
これで新しい仕組みで言語ファイルを提供できるようになった段階で、リリースしているプラグインやテーマは自動的に新しい言語ファイルを参照するようになるように思います(おそらく・たぶん…というかこの辺り、運用上の実際の計画や具体的な更新の仕様が見えていななくてちょっと心配。情報が見つけられないでおります…)(直子さんがしっかり情報をまとめてくださっていました 。本稿では実装面のお話をさせて頂きましたが、全体の背景、今後についてなどは次のリンク先の直子さんの記事をご覧ください。http://ja.naoko.cc/2013/10/28/wordpress-37-background-update/ )。
当然ながら、これまで同様にプラグインやテーマに言語ファイルを同梱する必要がありますが、過渡的には仕方ないかなーと思います。そして、新しい仕組みの運用体制が十分に安定したら、3.6 以前の環境には言語ファイルの追加・更新を提供しない、というポリシーとするのが妥当かと思います。
おまけ
おまけというか、実はここからが書きたくてこのこの記事を書いたのが本音です。 (*’-‘*)
WordPress 3.7 の load_plugin_textdomain() の実装ですが、次のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) { $locale = get_locale(); /** * Filter a plugin's locale. * * @since 3.0.0 * * @param string $locale The plugin's current locale. * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ $locale = apply_filters( 'plugin_locale', $locale, $domain ); if ( false !== $plugin_rel_path ) { $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' ); } else if ( false !== $deprecated ) { _deprecated_argument( __FUNCTION__, '2.7' ); $path = ABSPATH . trim( $deprecated, '/' ); } else { $path = WP_PLUGIN_DIR; } // Load the textdomain according to the plugin first $mofile = $domain . '-' . $locale . '.mo'; if ( $loaded = load_textdomain( $domain, $path . '/'. $mofile ) ) return $loaded; // Otherwise, load from the languages directory $mofile = WP_LANG_DIR . '/plugins/' . $mofile; return load_textdomain( $domain, $mofile ); } |
これって、次のようにした方が良いと思うんですよね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) { $locale = get_locale(); /** * Filter a plugin's locale. * * @since 3.0.0 * * @param string $locale The plugin's current locale. * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ $locale = apply_filters( 'plugin_locale', $locale, $domain ); //Prepare mofile name $mofile = $domain . '-' . $locale . '.mo'; //Try load from the languages directory $path = WP_LANG_DIR . '/plugins'; if ( load_textdomain( $domain, $path . '/' . $mofile ) ) return true; //Otherwise, load from the legacy filesystem if ( false !== $plugin_rel_path ) { $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' ); } else if ( false !== $deprecated ) { _deprecated_argument( __FUNCTION__, '2.7' ); $path = ABSPATH . trim( $deprecated, '/' ); } else { $path = WP_PLUGIN_DIR; } return load_textdomain( $domain, $path . '/'. $mofile ) ); } |
要するに、新しい仕組みでのロードを先に行うということなのですが、こうしておくとコードの変更無しに、運用で順次新しい仕組みが適用していけた筈なのですが、どうしてこうなって無いのかなーと疑問に思ってしまうわけです。
どなたか理由を知っていたら教えて頂けたら嬉しいです。
(参考URL)
http://ottopress.com/2013/language-packs-101-prepwork/