こんにちは。 先日 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 がリリースされる予定とのことなので、正座して待たずに、
情報を掴んでいきたいところですね。
—
次回は懇親会とか行きたいお。