unoh.github.com

symfonyでgettext

Thu Oct 25 03:40:29 -0700 2007

yamaokaです。最近、PHPのフレームワークのsymfonyをいじっています。

symfonyでメッセージの国際化を行う場合、 デフォルトではXLIFFの形式を使うようになっています。 その他、gettextやデータベースからメッセージリソースを取得できるようにもなっているのですが、 その方法があまり公開されていません。

今回はgettextを利用してメッセージの国際化を行う方法を紹介します。 gettextに関する基本的な情報については、 Wikipediaの該当項目ウノウラボの過去記事 などを参考にどうぞ。実際の動作はsymfony 1.0.8で確認しています。

  1. apps/<yourapp>/config/settings.ymlに下記を追記
    all:
      .settings:
        i18n: on                   # 国際化を有効に
        standard_helpers: [I18N]   # ヘルパーとしてI18Nを追加
        charset: UTF-8             # 文字コード設定
    
  2. apps/<yourapp>/config/i18n.ymlを編集
    all:
      default_culture: ja_JP   # デフォルト言語を日本語に
      source: gettext          # gettextを使う設定
    
  3. テンプレートファイル内にメッセージを記述しておく
    <p><?php echo __('Hello!'); ?></p>
  4. アプリケーションディレクトリに移動
  5. xgettextコマンドを使ってi18n/messages.potを作成
    $ xgettext --keyword=__ -l php -o i18n/messages.pot \
       `find modules -name \*.php -type f`
    
  6. msginitコマンドを使ってi18n/ja_JP/messages.poを作成
    $ msginit -i i18n/messages.pot -o i18n/ja_JP/messages.po -l ja
  7. messages.poの文字コード設定の部分をUTF-8に変更、リソースを追記
    "Content-Type: text/plain; charset=UTF-8\n"
    msgid "Hello!"
    msgstr "こんにちはこんにちは!"
    
  8. msgfmtコマンドを使ってi18n/ja_JP/messages.moを作成
    $ msgfmt -o i18n/ja_JP/messages.mo i18n/ja_JP/messages.po
  9. 表示させてみる
    こんにちはこんにちは!

いかがでしょうか。XML形式でわかりやすいXLIFFもいいのですが、 Pootleなどの周辺ツールも揃っているので、 使い慣れたgettextを使うことができるメリットはまだまだあると思います。

symfonyでgettextを使おうと思っている方の手助けになれば幸いです。