プラグインやテーマの国際化を少し楽に

すっかり忘れていたのですが

と思い出させてもらったので、ここに書いておきましょう。

これは世界で人気のプラグインやテーマの開発者向けの情報です。もとより私はプラグインもテーマも書かないし、したがって世界中から言語ファイルを送られて「大変だー」なんて思いをしたことはないのですが、たまたまその声を聞いて Makefile を miya さん に贈り、それがここで使われています。

WordPress の国際化

おさらいです。WordPress では gettext ライブラリおよびツールを使用して国際化します

プラグインやテーマの開発者は、その中の翻訳されるべきメッセージに __()_e() などのマークを付けておきます。こうしたプラグインやテーマから、マークされた文字列を抽出して POT ファイルと呼ばれる、翻訳者にとって原本となるものを作成します。この作業は WordPress の本家で配布されているスクリプト wordpress-i18n tools を入手して、これで行います。

翻訳者はこの POT ファイルを元に、メッセージをそれぞれの言語に翻訳した PO ファイルと呼ばれるものを作り、これを開発者に送ります。

開発者は PO ファイルを、実行時にすばやく読み込まれるようにバイナリ化された MO ファイルと呼ばれるものに変換して、これをプラグインやテーマに同梱して配布することになります。

少し楽に

完全に出来上がっていてメッセージが不変で、たまに「新しい言語に翻訳したよ」と送られてくるものを追加するだけなら、手作業でもさほどでもないのでしょう。しかし現時点で既に各言語の翻訳ファイルがあるところに、元のプラグインやテーマに手を加えてメッセージが変わってしまい POT が変更になって、これをいちいち各言語の PO に反映して、MO を作りなおすのがメンドクサー、という工程を自動化するのがこの Makefile です。

プラグインやテーマの開発者にとって詳しい説明は不要でしょうから、あとは簡単に紹介します。

POT の生成には上述の wordpress-i18n tools が必要です。

make pot
で POT を生成します。あとは外部ファイル LINGUAS に作成したい言語の locale を書いておき、適宜
make

で、必要な MO までが生成されます。


POT 生成の部分は本家のスクリプトですし、後半の部分も gettext 関連のところでよく見かけるものから拝借して、前半に WordPress 特有の設定を加えたものです。私ができるのはこの程度です。あとは誰かすばらしいプラグインやテーマを作ってくださいね。

『本格ビジネスサイトを作りながら学ぶ WordPressの教科書』

著者のプライム・ストラテジーさんが『本格ビジネスサイトを作りながら学ぶ WordPressの教科書』を、「日本語作成チームに感謝の気持を込めて」と、この私にもご恵贈くださいました。ありがとうございました。

自分にできることを少しだけやったことが、巡り巡って還ってくるというのを実感できるというのは嬉しいものです。

それはさておき。

最近この種の本を手にすることはあまりなかったのですが、まずきれい。全ページカラーで見やすい。情報量はかなり多そうですが、全体の流れが掴みやすく工夫されていて、通読しやすそうです。一方で、目次がとても充実しており(実際には出版社のページにあるものよりもう一段深く、目次だけで10ページもあります)、あとで辞書的に調べたいところを探すのにも便利そうです。書籍というものの特長をあらためて感じました。

これからじっくり読んで、ここや自分が関わっているサイトももう少し見直してみようという気になりました。

Automattic製テーマ Coraline と Pilcrow の日本語化

Automattic は言わずと知れた WordPress の開発元、そしてブログサービス WordPress.com の運営元です。WordPress 公式テーマディレクトリで、その Automattic 製のテーマが公開されています。

Coraline は、TwentyTen の双子のようなテーマで、むしろこちらのほうが柔軟性があると私は勝手に思っています。Pilcrow は2012年になって登場し、Coraline の後継じゃないかとこれまた勝手に思っていますが、配布版 WordPress のデフォルトとなってもおかしくないと思える作りのテーマです。

たぶん WordPress.com のサービスでは、これらのテーマが様々な言語に対応して提供されているのでしょうが、この公式ディレクトリで配布されているものには言語リソースが(日本語に限らずどの言語のものも)同梱されていません。

「非公式」日本語リソース

そこでこの Coraline と Pilcrow の日本語リソースを作成したので公開します。と言っても、デフォルトのテーマ TwentyEleven とほとんど同じメッセージですのでそれを取り込んで、独自に訳す必要があったのはほんの数個です。

中身はそれぞれの ja.po と ja.mo だけです。テーマをインストールしたディレクトリの languages/ 以下に ja.mo を置いてください。

「公式」日本語リソース

Twitter でひょんなことからこの Automattic 製テーマの日本語リソースの話になったところ、Nao さんから

Naoko McCracken
@mako0901 @urepko こちらもよかったらどうぞー。http://t.co/SqfNQ51P WP.com アカウントでログインすればページの下の方からエクスポートできますが。。。 このやり方どっかに書いたほうが良いですね。
2012年3月20日 – 22:02

というリプライがありました。「公式」リソースが、普通には気付けないこんなところに隠れていました。「このやり方」をここに書いてみます。この短縮されているけれど本当は長い URL には、次のようにしてたどりつけます。

まず、http://translate.wordpress.com/にアクセスします。Projects の WordPress.com に進みます。さらに日本語の Japanese に進みます。ここで、右上の Log in で、WordPress.com のアカウントを使ってログインしておきます。

左端にある Filter↓ をクリックします。Term: に、絞り込みたい語を入力します。ここでは、coraline と入力します。その右側の選択肢は、Either と Current/waiting/fuzzy のままでかまいません。そして「Filter」ボタンをクリックすると、テーマ coraline に関するメッセージだけが抽出されます。

画面の一番下に行き、only matching the filter を po として、Export すれば、目的のものが手に入ります。テーマ pilcrow のものだったら、検索語を pilcrow にするだけです。

これで po が手に入りますので、ja.mo に変換して、適切な場所に配置します。


【追記】 Nao さんのところに、より詳しい解説が出ました。「GlotPress から WordPress.com の無料テーマの翻訳をエクスポートする

WordPress に記述できるプロトコル(スキーム)を拡張する

WordPress の記事の中などでリンクを記述する場合、特定のスキームしか書くことができません。たとえば http://mailto: は書くことができますが、git://skype: などと書こうとしても、自動的に削除され、http:// とみなされてしまいます (管理者権限で記事を書いている場合は適用されず、自由に書くことができます。権限が編集者以下の場合です)。

調べてみると、WordPress 3.3 からこの制限は wp-includes/functions.phpwp_allowed_protocols() に書かれています。そこを見てみると、スキーム名を追加するには kses_allowed_protocols というフックを使えばよさそうです。

いま xmpp: というスキームのリンクを記述したいので、テーマの functions.php あたりに

function ext_protocols ($protocols) {
  $protocols[] = 'xmpp';
  return $protocols;
}
add_filter('kses_allowed_protocols', 'ext_protocols');

と書きました。これで記事中にxmpp:mako@pasero.netxmpp:なんでも談話室@muc.step.im?join などのリンクを記述できるようになりました。

フォントの指定をやめる

久々に Windows を使う機会があって、この自分のページを見てみた。見難い。醜い。明朝体の表示がこうも汚いのは何かの陰謀だろうかと思えるほどだ。WordPress のテーマのカスタマイズの記事などで「まずゴシック系を指定して」という記述をよく目にするのはこういう訳だったのかと今更ながら思った。

身の周りにある本らしい本を見てみれば、見出はともかく、本文はたいてい明朝 (serif) 系ではないか、という信念で、この自分のページは明朝 (serif) 系で表示するようにしていたのだが、こんな表示では逆効果なのであった。Windows の設定をいろいろいじればもう少し何とかなるのかもしれないが、普段からしっかり使いこなしている訳でもないから、簡単にできることではなさそうだ。きっと大多数のユーザーもそんなものだろう。

さて、ではなるべく多くの人にきれいに見せるにはページの制作側では CSS での font-family をどう設定したものか、と考え始めた。いろいろ探しまわって考えているうちに、もうそういうのはやめて見る側にまかせてしまえばいいや、という気になってきた。

Vista以降の人は見慣れたメイリオで。
XP以前の人は見慣れたMSPゴシックで。
メイリオが気に入った人は、メイリオで。
Macの人はヒラギノ角ゴで。
明朝が好きな人は、明朝で。
へた字とか好きでたまらない特殊なフォントで。
(流儀 font-familyは指定すべきか)

WordPress 関連のページを見る機会が多くデザインを重視する記事をたくさん見ていたのですっかり忘れていたけれど、そもそも HTML というのは、見る側の環境によって違って当たり前なのだった。

「本文は明朝系」という信念の人 (私だ) はブラウザのデフォルトを serif に設定しているだろうし、Windows でも自分の好みの表示になるようにがっちり設定している人には、そのフォントで読めるようにしてあげればいいではないか。

という訳で、このページの本文の font-family の指定はやめることにした[1]。フォントに限らず横幅も何も、本来は見る側の自由なのだという気にだんだんなってきた。

  1. このページは coraline というテーマの子テーマで表示している【注:記事執筆時】。親テーマで font-family が指定されているので、子テーマでこれを消去はできず、そこで存在しないであろうフォント名を指定して上書きしている。
    body, input, textarea {
            font-family: undefined;
    }
    

WordPress で Google マップを使う (再挑戦)

以前に「Google マップを使う」を書きましたが、その後 WordPress も Google マップもずいぶん進化して、時代遅れになってしまいました。

意図してる使い方は次のようなものです。

  • 固定ページに位置情報を持たせる。その固定ページにマップが表示される
  • それらのインデックスとなるような、上記の各ページにリンクされたマークが表示された全体図が、別の固定ページがある

たとえば、会社案内のサイトで各支店ごとに固定ページを作り、それぞれに案内地図を掲載し、「支店一覧」の全体図が別にもうひとつある、というイメージです。Lightweight Google Maps はほぼ条件を満たしていますが、その便利な機能がこちらの思惑には合いませんでした。

ざっと探してみましたが、「固定ページに位置情報」というものはなかなかありません。そこで、固定ページではなく投稿に、というプラグイン RomeLuv Google Maps for WordPress を見つけたので、それを改変することにしました。

RomeLuv Google Maps for WordPress を改変

--- romeluv-maps.php.orig
+++ romeluv-maps.php
@@ -51,6 +51,12 @@
         'romeluv_maps_inner_custom_box',
         'post' 
     );
+    add_meta_box( 
+        'romeluv_maps_sectionid',
+        __( 'Maps', 'romeluv_maps_textdomain' ),
+        'romeluv_maps_inner_custom_box',
+        'page' 
+    );
   
 }
 
@@ -361,6 +367,7 @@
 }
 
 add_action('save_post', 'romeluv_maps_handle_savepost');
+add_action('save_page', 'romeluv_maps_handle_savepost');
 
 
 
@@ -385,7 +392,7 @@
         if ($romeluv_single_map_done) return $post_content_html; else $romeluv_single_map_done=TRUE;
     
     
-       if (!is_single()) return $post_content_html;
+       if (!is_single() && !is_page()) return $post_content_html;
         //return "".$post_content_html;
        global $wpdb,$post,$mapheight;
        $savepost=$post;
@@ -552,13 +559,25 @@
     
     global $wpdb,$post;
     $savepost=$post;
+
     
+    extract( shortcode_atts( array(
+          'cat' => '', // category ID
+       ), $atts ) );
+       if (esc_attr($cat) == '') {
+         if (isset($_GET[cat])) $get_cat = $_GET[cat];
+       } else {
+         $get_cat = esc_attr($cat);
+       };
+
+
+
     ////query all the posts to display on the global map
      $querystr = "
        SELECT wposts.* 
        FROM $wpdb->posts wposts 
        WHERE  wposts.post_status = 'publish' 
-       AND wposts.post_type = 'post' ". $whereadditional ."
+       AND (wposts.post_type = 'post' OR wposts.post_type = 'page') ". $whereadditional ."
        ORDER BY wposts.post_date DESC
     ";
     //echo $querystr; //useful for debugging your custom query
@@ -571,9 +590,7 @@
     
     if ($result_posts):
     
-    if (isset($_GET[cat]))  echo '<h3 id="map-category-heading">'.get_cat_name($_GET[cat]).'</h3>';
-    
-    
+    if (isset($get_cat))  echo '<h3 id="map-category-heading">'.get_cat_name($get_cat).'</h3>';
     
     $mapwidth=get_option('global_romeluv_mapwidth');
     $mapheight=get_option('global_romeluv_mapheight');
@@ -614,7 +631,7 @@
                            
                              $count++;  
                            
-                           if (isset($_GET[cat])) if (!in_category($_GET[cat],$post->ID)) continue; //this allows category filtering adding the $_GET parameter ?cat=xx
+                           if (isset($get_cat)) if (!in_category($get_cat,$post->ID)) continue; //this allows category filtering adding the $_GET parameter ?cat=xx
                            
                            if (is_category()) { if (!in_category($cat_ID,$post->ID)) continue;  }   //skip posts if viewing a category page, if those do not match the current category
                            

改変の内容は、

  • 固定ページの作成画面にも「Maps」の入力欄を表示する
  • 全体図の出力の際に固定ページも対象にする
  • 全体図を出力するショートコード [GLOBALMAP] に、オプションcat を追加する

です。この最後の項目は次のような事情です。

このプラグインのオリジナル版では、全体図を表示させるには、固定ページでショートコード [GLOBALMAP] を用います。特定のカテゴリーに属する投稿だけを全体図に表示するという絞り込みができます。その方法は、カテゴリーの ID をパラメータで付加して、http://www.example.com/map?cat=6 のような形で、全体図のページを呼ぶようにします。

しかし、WordPress 標準のメニュー機能でこのような形式のリンクを作る方法が思い浮かびません。そこで、むしろ複数の全体図のページを用意することにして(たとえば http://www.example.com/map1 と http://www.example.com/map6)、それぞれのページでのショートコードにオプションでカテゴリー ID を付けるようにしました(たとえば [GLOBALMAP cat="1"][GLOBALMAP cat="6"])

さて、ここでは固定ページに位置情報を付加して、全体図を作ることを想定しています。すると固定ページにもカテゴリーが設定されていないと、上記の絞り込みができません。テーマの functions.php か何かで

function add_category_to_page() {
    register_taxonomy_for_object_type('category', 'page'); 
}
add_action('init', 'add_category_to_page');

とやって、固定ページにもカテゴリーを設定できるようにしておく必要があります。

twentyeleven で Google マップが壊れる

実際に使用してみると、表示される地図が微妙に壊れていました。タイルの継ぎ目が合わずに道や川がずれているような感じになります。はじめ、自分が使っているブラウザか何かの環境のせいかと思って、いろいろ調べましたがわかりません。ようやく、テーマ twentyeleven にすると壊れて、twentyten にすると正常に表示されることに気がつきました。それから今度は twentyeleven のスタイルシートのどの記述が影響しているのか順に見ていき、ついに imgmax-width が付いているとこの現象が起こることがわかりました。これだけで随分と時間を費やしました。

このプラグインの影響下の img のみ max-width を解除するため、

div#romeluv-global-map img,
div#single-post-map img {
        max-width: none;
}

をスタイルシートに書いて、解決しました。

WordPress 3.2.1 日本語版への更新

WordPress 3.2.1 日本語版がリリースされました。この案内にもきちんと書かれていますが、読みようによっては誤解したり不安を感じたりする方もあるようですので、ここにやや詳しく書いてみます。

WordPress 日本語版パッケージ

配布されているWordPress 日本語版パッケージに含まれているものは

日本語リソース
本体のメッセージを日本語に置き換えて表示するためのもの
WordPress 本体
日本語リソースでカバーできない変更のため、いくつかのファイルを差し替えている

のほかに、オマケとして

テーマ Twenty Eleven
日本語版ではこのテーマのメッセージを日本語に置き換える日本語リソースを同梱している
テーマ Twenty Ten
日本語版ではこのテーマのメッセージを日本語に置き換える日本語リソースを同梱している
プラグイン Hello Dolly
日本語版では、「プラグイン」の一覧で表示される説明文を翻訳している
プラグイン Akismet
日本語版では、「プラグイン」の一覧で表示される説明文を翻訳している
プラグイン WP Multibyte Patch
マルチバイト文字の取り扱いに関する不具合の累積的修正と強化を行うもので、日本語版で独自に同梱しているもの

です。

はじめてのインストールは問題ない

これまで WordPress を使用していなかったところに、はじめて導入する場合は、何も考えることはありません。最新版をダウンロードしてインストールしてください。

自動更新

WordPress 日本語版の新しいバージョンがリリースされると、WordPress の管理画面(ダッシュボード)で、その旨の通知があります。案内に従って手順をすすめれば、新しいバージョンに更新されます。従来(3.2まで)は、この手順でパッケージに含まれるすべて、つまり上述の本体とオマケのすべてがパッケージ内のものに更新されていました。

オマケは更新されなくなった

3.2.1 以降、自動更新では、本体のみが更新され、オマケの部分は自動更新されないことになりました。たとえばテーマ Twenty Eleven のバージョンは、WordPress 3.2 日本語版では 1.1 で、WordPress 3.2.1 日本語版では 1.2 です。もし 3.2 日本語版で運用しているところで、本体の自動更新を行っても Twenty Eleven は 1.1 のままです。

もし、これらのオマケをまったく利用していなければ、以下の話は読み飛ばしてもかまいません。

テーマやプラグインは別途に

オマケのテーマやプラグインに、もし新しいバージョンがリリースされた場合、本体の更新とは別に、個別に「更新」の通知があります。後から独自に導入したテーマやプラグインとまったく同等の扱いになるということです。

オマケのテーマやプラグインであっても、本体のリリースとは無関係に新しいバージョンがリリースされることがあります。

日本語リソースはさらに別途に

テーマやプラグインは、本体とまったく別途に更新できます。しかし、ここで注意することがあります。従来のように本体のオマケとして配布されていたときには、それらの日本語リソースや説明文を翻訳していたものを配布できていました。しかし今後、個別に更新される際には、それらの含まれないオリジナル(英語版)になってしまうのです。

テーマ Twenty Eleven を例にとります。「更新」の通知があったら、まずこの Twenty Eleven を更新します。その状態では日本語リソースは存在しません (1.1 のときに存在していても 1.2 に更新したら消えてしまいます)。そこで、日本語リソースを別途入手して、適切に配置します。現時点での最新の日本語リソースは http://i18n.svn.wordpress.org/ja/branches/3.2/messages/twentyeleven/ja.mo です (この記事をずっと後にご覧になる方はバージョンやテーマ名にご注意ください)。これをダウンロードして、wp-content/themes/twentyeleven/languages/ の下に置き、サーバーが読める状態にしておきます。

同様に、テーマ Twenty Ten の日本語リソースはhttp://i18n.svn.wordpress.org/ja/branches/3.2/messages/twentyten/ja.mo にあります。

プラグイン Akismet や Hello Dolly をもし更新した場合は、「プラグイン」一覧に表示される説明文が日本語ではなく英語になってしまいますが、動作には何ら影響はありません (この説明文はそれぞれの php の冒頭にコメントの形で書かれているものです)。どうしても気になる場合は、やはり日本語版の配布元 (http://i18n.svn.wordpress.org/ja/branches/3.2/dist/wp-content/plugins/ あたりにあります) から、その部分を差し替えたものを入手して、適切に配置してください

WP Multibyte Patch

WP Multibyte Patch は新しいバージョン 1.5 で、この自動更新の振る舞いの変更に対応されました。

WP Multibyte Patch 1.5 をリリースしました。
今回は重要な変更があります。設定ファイル (wpmp-config.php) の設置場所が /wp-content の下に変わりました。設定ファイルをサイトでご利用中の方は、以下配置で再設定を行ってください。

/wp-content/wpmp-config.php

この作業は設定ファイルをご利用中のサイトにおいて 1.5 より古いバージョンから 1.5 以降のバージョンにはじめてアップデートした場合に1度だけ必要となります。設定ファイルをご利用でない場合は作業の必要はありません。

ということですから、注意してください。