ここではDrupalのモジュールやテーマを開発する時に将来的に他言語への翻訳を意識したコーディングをするためのTipsを紹介します。(といいつつ本当は自分用の覚え書きです)
プログラム中で文字列を出力する場合には以下のようにすると良いです。基本としてはt()関数を表示する文字部分に使用することで置き換えを可能にします。
t('Hello')とすると、もし翻訳データに「Hello」=>「こんにちは」という翻訳があれば、t('Hello')の代わりに「こんにちは」という文字が使われることになります。
例
ノードを削除したメッセージを画面に表示する。
$num_deletedは削除したノードの数が入る変数とし、ここでは2が代入されているものとする。
悪い例
- t('deleted') . ' ' . $num_deleted . ' ' . t('node');
この場合は、「deleted」と「node」という部分を個別に翻訳することになります。
仮に、「deleted」を「削除 」、「node」を「ノード」と翻訳したとしてもできあがる文章は
「deleted 2 node」が「削除 2 ノード」、というようになり、このままではあまりいい翻訳になりません。
良い例
こうすると、翻訳者は「deleted !num node」の部分を翻訳することになるので、日本語であれば「!num個のノードを削除しました」というように翻訳することができます。
したがって、この例では!numが実際の変数の値と置き換わり最終的には日本語で「2個のノードを削除しました」と置き換えられることになる。
ちなみにt()関数の変わりに以下のようにsprintf()関数を使うことも可能ではあります。
ただしt()関数の場合は置換パラメータ「!」「%」「@」などを使い分けてセキュリティ対策も同時にできるのに対してsprintf()は単純な値の代入になるので、Drupalではt関数を使う方がより便利です。
置換パラメータの種類
| ! | 単純なテキスト代入 |
| @ | テキスト代入する前にcheck_plain()関数をコールしてHTMLとして表示する上で特殊文字のエスケープ処理とUTF-8文字列であることの検証をおこなう |
| % | @の場合の処理に加えてtheme_placeholder()関数コールによりハイライト表示にする(通常は<em></em>で括られてハイライトされる) |
ユーザーからの入力やURLの一部など何がくるかわからないようなテキストを代入する場合には、必ず「!」ではなく「@」か「%」を使うようにしましょう。
単数複数形への対応
上記の例で、単数複数に対応するには以下のようformat_plural()関数を使用します。
- t('deleted !num %node',
- '!node' => format_plural($num_deleted, 'node', 'nodes'),
- )
- );
もちろんif文を使っても可能ですが用意されているformat_plural()関数を利用する方がベターです。format_plural()関数は第一引数の値に応じて単数形か複数形かを判断し、単数の場合は第二引数のテキストを、複数の場合は第三引数のテキストを返します。
ちなみにformat_plural()関数では数が0(ゼロ)の場合に単数形として扱うか複数形として扱うかは言語設定に応じて決定されるようになっています。
この点がif文ではなくformat_plural()関数を使うメリットといえましょう。
