海外IT企業で働いていた純日本人エンジニアがいろいろと考えてみる。

i18nしてますか?(symfonyその2)

»

Creative Commons License This work is licensed under Creative Commons Attribution-Share Alike 3.0 Unported License.

 どうも、鹿島和郎(かしまかずお)です。秋の夜長にプログラムというのは平安時代からの日本の風景ですが、「その0」「その1」とやってきたsymfonyでのi18nの説明も今回で最後となります。

 前回は、symfonyでi18n対応アプリを作るための設定がほぼ完了しました。あとは、以下のような定常的な作業が残っているので、それについて説明します。

  • ソースコード中のテキストを__()でくくる
  • テキストの抽出
  • テキストの翻訳

■ソースコード中のテキストを__()でくくる

 以前のコラム「i18nしてますか?(PHP+gettext)」(その1その2)を読んで下さった方は文字列を_()でくくる作業を覚えていると思いますが、symfonyの場合には__()でくくります。アンダースコアが2つですのでご注意ください。

 例えばこんな感じです。

# 変更前
echo 'Hello World!';
# 変更後
echo __('Hello World!');

 文字列中に変数が入る場合は、以下のようにします。

# 変更前
echo "Hello, ${name}!";
# 変更後
echo __("Hello, %name%!", array('%name%' => $name));

 変数が入る部分を%name%というプレースホルダーにして、そこに変数の値を入れるという形です。

 さて、前回の最後で以下のようなファイルを作成しました。

<!-- apps/frontend/modules/default/templates/indexSuccess.php -->
<h1>Welcome to my i18n test page.</h1>
Go to <?php echo link_to('list page', 'post/index') ?>

 それを、以下のように変更します。

<!-- apps/frontend/modules/default/templates/indexSuccess.php -->
<h1><?php echo __('Welcome to my i18n test page.'); ?></h1>
<?php echo __('Go to the %list_page%',
   array('%list_page%' => link_to('list page', 'post/index'))); ?>

■テキストの抽出

 次に、__()でくくったテキストを以下のコマンドで抽出します。概念としてはgettextと大体同じです。

$ symfony i18n:extract frontend ja --auto-save

 コマンドを実行すると、以下のファイルが作成されます。

apps/frontend/i18n/ja/messages.xml

 messages.xmlの中身は以下のようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff version="1.0">
  <file source-language="EN" target-language="ja" datatype="plaintext" original="messages" date="2010-09-18T15:07:56Z" product-name="messages">
    <header/>
    <body>
      <trans-unit id="1">
        <source>Welcome to my i18n test page.</source>
        <target/>
      </trans-unit>
      <trans-unit id="2">
        <source>Go to %list_page%</source>
        <target/>
      </trans-unit>
      <trans-unit id="3">
        <source>list page</source>
        <target/>
      </trans-unit>
    </body>
  </file>
</xliff>

■テキストの翻訳

 あとは、ひたすら翻訳するだけです。翻訳後のmessages.xmlは以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff version="1.0">
  <file source-language="EN" target-language="ja" datatype="plaintext" original="messages" date="2010-09-18T15:07:56Z" product-name="messages">
    <header/>
    <body>
      <trans-unit id="1">
        <source>Welcome to my i18n test page.</source>
        <target>私のi18nのテストページにようこそ。</target>
      </trans-unit>
      <trans-unit id="2">
        <source>Go to %list_page%</source>
        <target>%list_page%に行く。</target>
      </trans-unit>
      <trans-unit id="3">
        <source>list page</source>
        <target>一覧ページ</target>
      </trans-unit>
    </body>
  </file>
</xliff>

 変更したら、以下のコマンドでキャッシュをクリアしてください。

$ symfony cc

■完成&その後

○動作確認

 以上でi18n対応は完成です。下記URLにアクセスすると、

http://www.example.com/i18ntest/frontend.php/

このように日本語のメッセージが表示されるはずです。

I18nsymfonytopja

 言語切り替えのプルダウンが動作するかどうかも確かめましょう。

○宣伝しよう、そうしよう

 これでsymfonyアプリのi18nが完了しました。後は、海外のMLやFacebookとかで宣伝したり、Twitterで英語でつぶやいたりして、みんなに使ってもらいましょう。

メールの例文:

Hi there,

I'm developing a small app for XX(用途、ターゲットユーザーなど)
and it's available at the following page.
http://www.example.com/super-cool-app-by-a-japanese-programmer.html

I hope some of you find it useful(ゲームとかならfunとか).
Any feedback would be appreciated.

Thanks,
名前

○テキストの追加・修正

 PHP+gettextのときに、ソースコード中のテキストが追加・修正された場合の対応方法について説明しましたが、symfonyの場合は面倒なマージ作業などは必要ありません。以下のコマンドを実行するとmessages.xmlが更新されますので、messages.xml内の翻訳を追加・修正してください。

$ symfony i18n:extract frontend ja --auto-save

■まとめ

 symfonyはそれなりの規模のサイト作成にも耐えられる本格的なフレームワークで、本コラムで示したような比較的簡単な手順でi18n対応できます。

 これから新規でサイトやサービスを作る場合には、symfonyは有力な選択肢となり得ると思いますが、その際に、最初からi18n対応しておくと最近ブームの海外展開がスムーズに行えると思います。

 さて、3回に渡って書いてきた「i18nしてますか?(symfony)」は今回で終了です。疑問点、間違いのご指摘などはコメントいただけると助かります。

 今回のコードはLaunchpad上に置いてありますので、興味のある方は以下のブランチを取得してください。

lp:~k4200/+junk/i18ntest-symfony

 次回は、技術から離れて久しぶりに軽い話題にしようと思っているのですが、若干ネタ切れ気味です。多分海外ネタで何か書きます。

 それではまた。

Comment(0)

コメント

コメントを投稿する