こんにちは。 先日 6月4日に、Symfony2勉強会が開催されました。

実は、 Symfony2 勉強会への参加はこれが初めてだったりします。
第2部から参加しました。

今、 Symfony2 で Bundle (いつかオープンソース) をつくっておるので、
「あーこうすりゃいいのか」っていうヒントが多く散りばめられていて良かったです。
あと、スタッフのTシャツがオサレですね。

講演のテーマは

  • Symfony2 + Behat(Bundle)でテストファースト開発 @hidenorigoto
  • Symfony2 のフォームについて @fivestr
  • PHPマイクロフレームワーク Silex 入門 @brtriver
  • Symfony2でより良いソフトウェアを作るために @iteman

ということでした。個別にそれぞれ、感想を書くのもいいですが、
FormComponent を復習したかったので、手を動かしてみました。

以下が発表スライド
http://www.slideshare.net/fivestar/symfony2-8203873

この発表の質問の中に、i18n まわりの事が出ていました。
僕も、大いに気になってしまったので、考えてみました。

Symfony2 の i18n は TranslationComponent という、FormComponent と ValidatorComponent
と分かれているように、これまた別のコンポーネントで管理されています。

となると、何か特別な操作が必要なのでは、と疑うわけです。

結論から言うと、 Label や Error は、 メッセージさえ用意しておけば、 symfony1.x と同じように
勝手に翻訳してくれます。嬉しい\(^o^)/

TranslationComponentの設定や、メッセージファイルの形式・置き方は、
http://symfony.com/doc/2.0/book/translation.html
の通りです。

symfony-standard に入っている、 DemoBundle で試してみます。

まず、fallbackを日本語にします。 (ロケールが明示されていないときの設定)

app/config/config_dev.yml

framework:
    router:   { resource: "%kernel.root_dir%/config/routing_dev.yml" }
    profiler: { only_exceptions: false }
    translator: { fallback: ja } # ← 追加

以下のような src/Acme/DemoBundle/Resources/translations/messages.ja.yml を作ります。
(YAMLじゃなくても、symfony1.x でも使われていた、XLIFF 形式も受け付けるよ!
しかし、ネストされたIDを用意できるのは Symfony2の新機能で、YAML (or PHP) 形式だけの強みのようです。
あと、個人的にYAMLが好き。)

Resources/translations/messages.ja.yml

Email: Eメール
Message: メッセージ

http://example.com/app_dev.php/demo/contact にアクセス

見事、日本語になりました。これで、多言語対応への不安が1つ減りましたね。

仕組みもちょっと調べてみました。

Symfony2 では、 Twig をテンプレートエンジンとして利用している場合、 TwigBundle が TranslationComponent
への導線を用意しているようです。
( PhpEngine の場合は、 FrameworkBundle が導線を用意しているようです。)

TwigBundle/Resources/views/Form/div_layout.html.twig の一部

{% block field_label %}
{% spaceless %}
    
{% endspaceless %}
{% endblock field_label %}

のように、しっかり trans filter を使っているのがわかります。

あと、Doctrine2 ORM のドキュメント翻訳やりたいと思ってます。
6/30 に Doctrine 2.1 がリリースされる予定とのことなので、正座して待たずに、
情報を掴んでいきたいところですね。

次回は懇親会とか行きたいお。

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>