pict-drupal.png 自作モジュールが多言語に翻訳されやすいようにするためのコーディングのTipsを紹介します。

Drupalではtという関数を使って、t('文字列')という記述をおこなうことで、該当する言語の翻訳がある場合に文字列部分を翻訳された文字列に置き換えることができます。

$message = t('welcome');

という場合に、welcomeの翻訳文字「ようこそ」が存在している場合には、$messageには'ようこそ'が代入されます。

特別な記号文字をプレイスホルダーとして使うことで動的な情報を元に翻訳をおこなうようにすることができるようになります。

たとえば以下のようになります。

  1. $output = t('現在の会員数:%members、オンラインしている人数:%visitors',
  2.   array(
  3.     '%members' => $total_users,
  4.     '%visitors' => $guests->count,
  5.   )
  6. );
この例では、%membersと%visitorsがそれぞれ$total_usersと$guests->count変数の値で置き換えられます。

このプレイスホルダーには以下の3種類があります。

「!」これは特別な処理はおこなわずそのままテキストの置き換えをします。
  1. $message[] = t("Please visit my web site at !url",
  2.   array(
  3.     '!url' => url("user/$account->uid", array('absolute' => TRUE))
  4.   )
  5. );

「@」これは置き換えられるテキスト中のHTML特殊文字のエスケープ処理をまずおこなってから置き換えがされます。セキュリティのためにも通常はこれを使用するのが好ましいです。
  1. $title = t("@name's blog",
  2.   array(
  3.     '@name' => $account->name
  4.   )
  5. );

「%」これは置き換えられるテキスト中のHTML特殊文字のエスケープ処理をおこない、次にtheme_placeholder()関数でハイライト処理をしたのちに置き換えられます。theme_placeholder()関数はデフォルトでは<em></em>タグで囲んで強調をします。
  1. $message = t('%name-from sent %name-to an e-mail.',
  2.   array(
  3.     '%name-from' => $user->name,
  4.     '%name-to' => $account->name
  5.   )
  6. );

t()関数を使う場合にはできるだけ1つの文は分断することなく1つのt()関数コールに含めるようにするべきです。これは言語によっては主語や述語の位置などがまったく異なることもあり、1つの文が複数に分割されてt()コールされると、適切な翻訳をおこなうことが困難になるからです。

複数形の処理

  1. $output = t('There are currently %members and %visitors online.',
  2.   array(
  3.     '%members' => format_plural($total_users, '1 user', '@count users'),
  4.     '%visitors' => format_plural($guests->count, '1 guest', '@count guests')
  5.   )
  6. );
この例のようにformat_plural()関数を使うことで単数の場合と複数の場合に置き換えるテキストを変えることができます。

format_plural(カウント、1の場合のテキスト、複数の場合のテキスト);

複数の場合のテキストにおいては「@count」を記述することで実際のカウント値に置き換えられます。

参考ページ

t()関数
http://api.drupal.org/api/function/t

format_plural()関数
http://api.drupal.org/api/function/format_plural/

 

No votes yet