Displaying posts tagged with

“Rails3”

Rails3のi18n機能および日本語化

必要な情報はRails Guidesの中の以下のページにまとまっている。

Rails Internationalization (I18n) API

  • I18n.translate メソッドを使って「抽象化されたキー」から、ロケールに基づく「自然言語」に変換する。いきなり英語で文章を考えなくて済む分、日本人には取っ付きやすいかもしれない。同様に、 I18n.localize メソッドで日付や時刻のフォーマットを行う。
    • それぞれ I18n.t, I18n.l という省略形が用意されている。さらに多くのコンテクストでは t, l というショートカットメソッドが使える。
  • Railsフレームワーク自体もこのメカニズムで国際化されているため、各コンポーネントが要求するキーに対して適切な翻訳を用意することで、フレームワーク全体が翻訳される。
  • キーは階層化することができる。またRailsが要求するキーも、コンポーネントごとに階層化されている(例: activerecord.errors.messages.record_invalid など)
    • 標準のメッセージファイルにおいては、YAML(.yml)またはRuby(.rb)のハッシュを使って、キーの階層をそのまま再現する。
    • 階層の上位部分をスコープ(scope)と呼ぶが、どこまでがスコープかという区別は明確ではない。
  • I18n.locale= で使用するロケールを設定する。
    • 使用するロケールの決定方法について。Web”サイト”においてはURL中にロケールを含めるべきである。一方で、Web”アプリケーション/サービス”においてはAcceptヘッダやDBに保存した個人設定を使うことも有効である。

フレームワーク全体の日本語化

とにかく手っ取り早く”日本語化”をしたいという場合は

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

を config/locales/ に放り込んで、config/application.rb に

config.i18n.default_locale = :ja

と書いておけば、フレームワークが自動で出力する各種メッセージは日本語になる。ただ標準ではエラーメッセージのフィールド名の後に空白が入るので、errors.formatを次のように修正しておいた方が良いかもしれない(好みの問題だが)。

--- ja.yml.orig     2011-06-22 22:38:21.000000000 +0900
+++ ja.yml     2011-06-22 22:38:33.000000000 +0900
@@ -188,7 +188,7 @@
       submit: "保存する"
 
   errors:
-    format: "%{attribute} %{message}"
+    format: "%{attribute}%{message}"
 
     messages: &errors_messages
       inclusion: "は一覧にありません。"

以後、この ja.yml に自分のアプリ用のメッセージを追加していっても良いが、やはり専用の翻訳ファイルを追加した方が扱いやすいだろう。翻訳ファイルは config/locales/ の中に拡張子 .yml か .rb で作成する。ファイル名は何でもいいし、言語ごとに分けてもいいし分けなくてもいい。ただしサブディレクトリの中に入れた場合は追加の設定が必要になる(参照 3.4 Organization of Locale Files)。また新たにファイルを追加した場合はサーバを再起動しなければならない。

ActiveRecordのモデル名・フィールド名の日本語化

上の手順でvalidationのエラーメッセージは日本語化されるが、モデル名やフィールド名は自分で翻訳を用意する必要がある。詳細については下ページ参照。

Translations for Active Record Models

ActiveModelのモデル名・フィールド名の日本語化

任意のクラスにおいて ActiveModel::Translation モジュールをextendすることで、ActiveRecord同様の翻訳機能が有効になる。

class MyForm
  extend ActiveModel::Translation
end

Active Model Translation

ただしスコープが activerecord ではなく activemodel であることに注意(サブクラスで i18n_scope メソッドをオーバライドすれば変更できるが)。

activemodel:
  models:
    my_form: "モデル名"
  attributes:
    my_form
      attr_name: "属性名"

なおvalidationに関してはActiveRecordと共通である。

Rails3+Rspecでファイルアップロードのテストをする

標準のTest::Unitに含まれている fixture_file_upload はrspec-railsに含まれていないので、自分でspec_helper.rbに追加する。

def fixture_file_upload(path, type)
  Rack::Test::UploadedFile.new(fixture_path + path, type)
end

標準の fixture_file_upload 同様、Rack::Test::UploadedFile のインスタンスを返すだけ。

テストに使用するファイルは spec/fixtures/ 以下に置く。例えば spec/fixtures/files/dummy.txt を使用するには

fixture_file_upload("/files/dummy.txt", "text/plain")

Rails3でjQueryを使う場合の注意点

新規プロジェクトの作成時に -J オプションを付けてprototype.jsの読み込みをスキップした場合、config/application.rb の中で以下の設定が有効になる。

config.action_view.javascript_expansions[:defaults] = %w()

あとからjQueryを使うためにjquery-railsをインストールしたとき、この設定が有効なままだとビューの中で

javascript_include_tag :defaults

を書いてもjquery.js等が読み込まれない。

忘れずにコメントアウトしておく(コメントアウトすることで、jquery-railsが自動設定した値が有効になる)。

#config.action_view.javascript_expansions[:defaults] = %w()

あるいは、jqueryとapplication.js以外に常時読み込みたい.jsファイルがあるのなら、+= で配列に追加しておく。

config.action_view.javascript_expansions[:defaults]+= %w(mylib.js otherlib.js)