はてなブックマークで上に上がってくるWordPress系のエントリーは大体読んでいるつもりなのですが、本日ブログを強化改造する!為に参考にさせて頂いたサイト一覧という記事を見かけ、さらにそこから過去記事をツイートする「Tweet Old Post」を使うなら絶対やるべき10行のおまじない!という記事を見てちょっと「もったいないな」と思ったのでまとめます。なんか上から目線っぽいですが、他意はありません。
日本語リソースを自分のサイトで配布する場合の問題点
WordPressは有名なブログツールですが、その最大の特徴は「よくわかんなくても使える」という点にあります。おそらくPHPを見下しているPerlモンガーでもWordPressでブログを書くというケースがあるんじゃないかというぐらい、WordPressは便利なツールです。しょせん言語は手段なので、こういう「言語に対する評価」と「言語の成果物への評価」における逆転現象はよく起こります。僕も積極的にRubyを使おうと思わない(新しい言語を覚えるのがめんどくさいから)ですが、Redmineは使いまくってますし、大した有用性のないカスタマイズをリファレンスとにらめっこしながら数時間かけて行うこともあります。もっと一般的な例を挙げれば、反米だけどマックは食いまくってるみたいなかんじですかね。
とまあ、WordPressは巨大なシェアを持つブログツールなので、ユーザーのレベルもピンキリです。わからないことがあった場合にググることすら思いつかないレベルのユーザーもいれば、その一方で自分でカスタマイズして使っている人もたくさんいるわけです。
そんな状況を考えたとき、せっかく頑張ってWordPressのテーマなりプラグインなりを日本語化しても、そこに辿りつけない人がいるのは大変もったいない状況です。
僕は自分の作ったもの以外、公式リポジトリに上がっていないものは使いません。「テスト段階だから」とか「有料で特別な配布形態が必要」とかの理由があるならいいですが、それ以外のケースで「公式リポジトリに上げない」と判断する開発者の気持ちがよくわからないからです。なぜ自動更新の便利さを享受しないのか、と。自動更新できるようにすれば、ググる必要すらないわけですし、プラグインや開発者自身に対する満足度も向上するはずです。
というわけで、せっかく日本語化をした人がもっと多くの人にその成果をあじわってもらえるようになるため、要するにもっと「俺Tueeeeee!!」できるようにするために必要なステップをケース・バイ・ケースで説明します。
翻訳者のレベル
まず、WordPressのプラグインなりテーマなりを日本語化しようという人は以下の3種類に大別されると思います。このレベル別に説明します。面倒なので、レベルの高い人はレベルの低い人の知っていることをすべて知っているという想定でいきます。もちろん、「レベルの高い」というのは人間としてじゃないですよ! 変に捉えないでくださいね!
- Level-1. PHPを作ったのは松下幸之助だと思ってるけど英語ができる人
- たぶんPHPがわかる人よりも英語をわかる人の方が多いと思うので、最優先で紹介します。WordPressはアメリカ発のソフトウェアなので、おおむね英語です。ウルトラCとしては、「このプラグインは日本製だけど、英語でも紹介してあげたい!」というケースが考えられますが、まずないと思いますので割愛。「プログラムとかよくわかんないけど、英語はできるよ!」という人ですね。
- Level-1.1 HTMLとCSSだけできる人
- この層が一番WordPressを使ってるんじゃないかと思いますが、「PHPとかMySQLとか聞いただけでもうんざりするけど、ある程度のことはわかるよ!」という方ですね。今回、このタイプの人は「英語ができる人」と同じスキルレベルということにさせて頂きます。ほんとうは「DreamWeaver知ってるよ!」とかそういうスキルの差はあるんですが、めんどくさいので一緒にします。
- Level-2 PHPとWordPressのことをちょっと知ってる人
- PHPとは拡張子が.phpであり、<?php ?>の中と外に書かれているものがちょっと違うっぽいぞということがわかる人です。Webデザイナーと名乗っている人でもこういう人はたくさんいるでしょうし、一番頑張って欲しい層です。
- Level-3 「PHPぐらい普通知ってるし、コマンドラインでビビってる奴なんなの?」という人
- 普通のプログラマは複数の言語を使うものですし、ある程度の概念は抑えていると思います。紹介する内容はLevel-2の人とあんまり変わらないと思うのですが、一応わけて説明します。
WordPressのプラグイン・テーマを翻訳して広める
それでは、ようやく本題です。まずは何も言わずにPoeditというソフトをダウンロードしてインストールしてください。
Level-1. PHPを作ったのは松下幸之助だと思ってるけど英語ができる人
さて、あなたの使っているプラグインが日本語だけど、いいプラグインだから日本語にしてあげたいなと思ったとします。では、管理画面の「プラグイン」> 「新規追加」からプラグインの説明ページを開いてください。
開いたら、翻訳したいプラグインの名前で検索し、「詳細」をクリックします。そうするとウィンドが開来ますので、「WordPress.orgプラグインページ」をクリックしてください。新しいウィンドまたはタブが開くので、右上の赤い「Download」をクリックします。プラグインファイルがダウンロードされます。
ダウンロードされたzipファイルを解凍し、languageまたはlanguagesフォルダを探します。有りましたか? なかったらそれで終了です。お疲れ様でした。
追記@2011-08-03
dogmap.jpというWordPressの深いネタを書かせたら5本の指に入るをかもと先生からコメントにてご指摘を受けたので、追記します。.potファイルはlanguageフォルダ以外の場所(プラグインのあるフォルダ直下とか)にもあるかもしれません。とにかく.potを探してみましょう。
languageフォルダが見つかったら
languageフォルダの中に「なんたら.pot」というファイルはありましたか? なかったら終了です。お疲れ様でし…え? あった? では、それを先ほどインストールしたPoeditをオープン。.potファイルを無策にクリックするとPowerPointが立ち上がってしまうので、右クリックとかしてください。
Poeditが立ち上がったら、「ファイル」 > 「potファイルを元に新しいカタログを作成します」を選んでください。ファイルの選択を求められたら、先程見つけた「なんたら.pot」を選びます。
そうすると、ファイルの保存を求められるので「なんたら-ja.po」として保存します。ポイントはハイフンとjaをつけることです。
なんたら-ja.poを保存したら、開いてください。一行翻訳したら保存してみましょう。「なんたら-ja.mo」というファイルが作られているはずです。WordPressの画面でも該当部分が翻訳されていることでしょう。ここからはもりもり翻訳です。大事なポイントは下記の通り。
- 逐語訳せず、画面を確認する。文脈によって訳語は変わるので、最終的な出力を確認する
- %2$sとか<a href=\”$s\”>とか、意味がわからないものは翻訳しない。触らぬ神に祟りなし。
どのプラグインも数百行しかないので、英語が得意な人なら小一時間で終わると思います。お疲れ様でした。
翻訳ファイルを届ける
さて、大体のWPerはここで自分のブログに「***の日本語リソースを作りました」とか書いて、ダウンロードしたら解凍してうんたらかんたらという記事を書くのですが、今回はもう一歩先まで言ってみましょう。
先程開いたWordPress.orgのプラグインページを開きます。そうすると、Authorという覧があって、ここからコンタクトできるんじゃないかと思いますが、メールアドレスは書いていません。ていうか、Mattにすごいヒゲが生えてるんだけど、大丈夫なの?
なんとかしてプラグイン作者にコンタクトを取らなければいけないのですが、安心してください。だいたいDescriptionかFAQに書いてあります。なければ、ダウンロードしたプラグインフォルダのreadme.txtにメールアドレスがあるので、そこにさっき作った「なんたら-ja.mo」と「なんたら-ja.po」を送りつけましょう。文面としては「あんたの作ったプラグインがあまりにも素晴らしかったので、日本語訳したよ、よかったら使ってよ!」という感じでいいでしょう。
こういう場合、「無視されたらどうしよう!」とか思う必要はまったくないです。僕は昔「途中下車」というAmazonで1円で投売りされている本を12,000部ほど幻冬舎に刷ってもらったんですが、そのときはファンレターが4通ぐらいしか来ませんでした。そんなものです。反響というのは本当に少ないもので、はてなの「セルクマ」とか、Twitterの【拡散希望】がなくならないのもしょうがないなと感じます。マザー・テレサも「愛情の反対は憎悪でなく無関心」と言ってるぐらいですしね。
というわけで、普通は送りつけたら採用されると思いますので、安心して送りつけましょう。次回からは自動アップデートで日本語化されるはずです。親切なプラグイン作者なら「Thank you for 誰々」という感じで謝辞を掲げてくれるはずです。よかったですね。
Level-2. PHPとWordPressのことをちょっと知ってる人
Level-2の人が何をできるのか? それは「languageフォルダがなかった場合」ですね。この場合、「国際化対応をしていない」というケースです。今回紹介したTwitter Old Postsは「国際化対応の準備だけしてあったけど翻訳ファイルがない」という状況だったのですが、普通はそんなことないです。
WordPressの翻訳に必要な手続き
プラグインやテーマが翻訳可能になるためには、下記の手順を踏んで作成される必要があります。
- 翻訳用のドメイン(名前)を持っている。これはプラグインAにおける”Word”が”単語”を意味し、プラグインBにおける”Word”がマイクロソフトのWordを意味する場合の競合を避ける意味があります。
- すべての文字列が翻訳用関数で出力されている
- 翻訳ファイルが存在する
Step1. ドメイン決定
さて、まずは翻訳用のドメインを決めましょう。これはなんでもいいと思います。プラグインがBunbukuChagamaだったとしたら、bunbuku-chagamaとかでいいでしょう。いずれにせよ、一貫している必要があります。
ドメインを”bunbuku-chagama”に設定したとしましょう。決定したら、コアファイルを見つけます。いまどき一個のファイルむき出しのプラグインは少ないので、プラグインフォルダ内の一番重要そうなファイルを見つけてください。先頭にこんなコメントが書いてあるやつです。
<!--?php <br ?-->/** * Plugin Name: Bunbuku Chagama * Plugin URI: http://hametuha.co.jp/plugins/bunbuku-chagama * Description: Boil water with tea pot. * Author: Takahashi Fumiki * Version: 0.2 * Author URI: http://hametuha.co.jp/ * Package WordPress * License: GPLv2
そのコメントの直後に以下のような一行を付け加えましょう。コピペで大丈夫です。
load_plugin_textdomain("bunbuku-chagama", false, basename(dirname(__FILE__)).DIRECTORY_SEPARATOR."language");
さて、コピペしたら、プラグインフォルダのルートに”language”というフォルダを作ります。
Step2. 翻訳用関数に変換
さて、続いて翻訳用関数に変換します。これは正直超めんどくさいので、コミュ力と意識の高い人は作者に「国際化対応してくれ」とお願いする方がいいかもしれません。でも一応最後まで書きます。
翻訳したいプラグインが出力しているであろう文字列を見つけてください。例えば、BunbukuChagamaプラグインにおいて”This teapot is walking on tight rope!”という文字列が”この茶釜、綱を渡りよる”という意味だとしましょう。プラグインフォルダで”This teapot is walking on tight rope!”を検索し、該当箇所を見つけてください。どのように書かれているかによって対応はわかれます。念の為追記しますが、Dreamweaverとかのフォルダ内検索機能を使ってください。
<?php /* * <?php ?>の外に書かれている */ ?> This teapot is walking on tight rope! //↓ <?php _e("This teapot is walking on tight rope!", "bunbuku-chagama"); ?> <?php /* * <?php?>の中に書かれている */ $var = "This teapot is walking on tight rope!"; //↓ $var = __("This teapot is walking on tight rope!", "bunbuku-chagama"); echo "This teapot is walking on tight rope!"; //↓ _e("This teapot is walking on tight rope!", "bunbuku-chagama"); ?>
要するに、出力する場合は_eを使い、変数として使う場合は__を使うということですね。二つ目の引数は必ず上で定義したドメインを使います。この関数で出力される文字列は必ず翻訳対象となります。
Step3. 翻訳ファイルを作る
さて、それでは翻訳ファイルを作りましょう。Poeditのファイル > 新規カタログで新しいカタログを作ります。設定はこんな感じです。ポイントとしては下記の通りです。
- 文字コードおよび符号化はUTF-8に統一
- パスに.と..を含める
- キーワードに__と_eを追加
これを「ドメイン名.po」としてlanguageフォルダに保存します。そうすると__と_eで囲んだ文字列がずらっと追加されます。もし後から_eや__を追加した場合は、.potを開いて「カタログ」>「ソースから更新」を選ぶと新しく追加されます。
追加されたら保存しておもむろに閉じましょう。そして、「ドメイン名.po」を「ドメイン名.pot」に改名し、「ドメイン名.mo」に変換を削除します。残った.potが原典となります。これであとはLevel-1と同じです。おつかれさまでした。
追記@2011-11-09
おでさんからご指摘頂きました。
昨日読んでて思ったのですが、プラグインディレクトリに登録すべき、という流れの中では、こちら側で無理やりプラグインをi18n対応に書き換えてしまうのは、作者がどうしても対応してくれない場合に限るべきという注釈があったほうがよいかと思いました。@odyssey
ある程度英語でコミュニケーションが取れる人はgetttext化しないで頼んじゃった方が楽かもしれません。ソースを勝手に書き換えられるというのは、人によって家の中を勝手に掃除されるぐらいのインパクトがあるようです。(※フォーラムでこんな議論があったので、ご参考までに。>> プラグイン日本語化などの成果の開発元へのマージのサポートを組織的に)個人的には、GithubのPull Requestみたいな仕組みがあるといいのかなと思いますが、それだと技術的なハードルが高すぎるので、WordPress文化にそぐわないかもしれません。
Level-3 「PHPぐらい普通知ってるし、コマンドラインでビビってる奴なんなの?」という人
このレベルの人が対応できるケースというのは、過去記事をツイートする「Tweet Old Post」を使うなら絶対やるべき10行のおまじない!というエントリーに書いてあったようなケースですね。翻訳ではなく、国際化対応に不備があるものです。おそらく詳しい方だと思いますので、ポイントだけかいつまんで説明します。
- str系関数をそのまま使っているなら、mb_*に直す。preg_*もu修飾子をつけたいところ。
- _eや__で翻訳対応していても、printfやsprintfで語順を変えられない書き方をしている場合もあり。%1$sなどの位置指定子を使うようにしましょう。
- 日付や数値のフォーマットベタ書きに注意。「作者の常識、世界の非常識」はけっこう多い。
- AjaxやJavascriptの国際化をしていない場合が結構ある。詳しくはI18n for WordPressのHandling Javascriptの項をご覧あれ。
- 外部APIを使っている場合は文字コードに注意。
- できる限りパッチファイルで送り、バージョンを明記する。wordpress.orgのSubversionをメインで使っていない人もけっこう多いはず。
その他の細かいところはCodexのWordPressの翻訳を見てください。よく考えたら僕も大したプラグイン作者ではないので、あんまり有効なアドバイスはできません。お疲れさまでした。
まとめ 大通りには人がよく来る
どのプラグインもそうだと思うのですが、公式リポジトリからダウンロードされる数はおそらく自分のブログで配れる数よりも多いはずです。「自分のサイトのトラフィックを増やしたい」という要望もあるとは思いますが、結果的に公式リポジトリを使ったほうがユーザーのためにもなるはずです。
一番のネックは「公式リポジトリに上げるための手続きがめんどくさい」ということでしょうか。作者の視点に立つと「国際化対応しない方が楽」というのもありますね。ここら辺が解消されるともっと便利になるなのになとは思いますが、何事も代価が必要なので難しいですね。終わり。