Ruby言語やLinuxのネタが多いです。
November 29, 2005 [おもひで]
■ [Rails] Modelのローカライズ (2)
ActiveRecordのRuby-GetText化をする上で、偶然なんだけど、最近Rails MLで話題のCustom Validation Messages pluginと同等の機能も実装できちゃったことに気づいた。具体的には以下のような感じ。
#app/models/article.rb
class Article < ActiveRecord::Base
validates_presence_of :title, :message => _("%{field_name} can't be empty!")
validates_length_of :description, :minimum => 10,
:message => _("%{field_name} is too short (min is %d characters)")
end
_()で囲わなければCustom Validation Messages pluginとほぼ同様。あとは、"[Cheer up!]"という[]で囲う記法をサポートするとCustom Validation Messages pluginと同機能となる。でも、どうしようかなぁ。
今のところ、後方互換性のために、%{field_name}が無い場合は先頭にfield_nameをつけるという仕様にしているんだよね。
まぁ、要望があったら追加する、ってとこかなぁ。
■ ちと、%{field_name}って長いな。%{fname}にすっかな。それだとfilenameっぽいか。
■ 追記:%{fn}にしてみた。短い方が良いよね。
■ たとえば、上記の(2)のArticleクラスの例で言うと、Articleクラスには一切手を加えずにフィールド名がローカライズされる。
その、ローカライズされるフィールド名はpoファイルに記述されてる必要があるんだけどね(ApplicationControllerのinit_gettextで記述したテキストドメイン、この前の例ではblog)
# po/ja/blog.poの内容に以下を追記。 msgid "Article" msgstr "記事" msgid "Description" msgstr "内容"
■ 実は上記の部分までは実装済み。次のリリースまでに自動抽出機能をrgettextに持たせる予定で、そこまでやれば、開発者はほとんど意識することなくModel部分のローカライズ文字列をpoファイルにはき出すことができてしまうわけだ。
ね。この機能、圧倒的にローカライゼイションのアドバンテージになるでしょ。
■ [Rails] Modelのローカライズ (4)
で、ちょっと悩んだのが、(3)の時のmsgidを素のフィールド名にしておいて良いか、という問題。多くの場合は問題ないと思うんだけど、複数のテーブルに同じ"name"というフィールドがあったとして、それを日本語化したい場合はどうだろう。
場合によっては両方とも「名前」で良いかもしれないけど、もしかしたら違うようにしたいのかもしれないよね。
例えば、ArticleテーブルのnameとGroupテーブルのnameがあったとき、前者は「記事名称」後者は「グループ名」という風に和訳したいかもしれない。
もちろん、元々のテーブル設計がこの違いを意識して分けてれば(前者をarticle_name, 後者をgnameにする等)問題ないんだけど、普通はそんなところをユニークにしたりしないよね。
ってことは、やっぱり、ここはsgettextの登場かな。テーブル名を頭にくっつけて以下のような感じにすっか。
# po/ja/blog.poの内容に以下を追記。 msgid "Article|Name" msgstr "記事名称" msgid "Group|Name" msgstr "グループ名称"
この例では英語版ではどちらも"Name"と表示されることになる。英語の場合はそれで問題ない(RoRの場合、少なくともそこは表示名となるわけだからそれを意識したフィールド名にするはず)はず。でも、さらに、英語でもこの名称を変更したい場合はCかenロケールのpoファイル作ればいいという代替案も提供できるところがこのアイデアのナイスなところ(自画自賛(^^;))。
■ あ、そっか。このアイデアだと、テーブル名・フィールド名毎にhuman_attribute_nameをRDBのテーブル名・フィールド名とは別に定義できる、というのが売りになるね。それがたとえC(en)ロケールであってもね。
■ この辺、今、もりもり実装中なのでアドバイスやグッドアイデアがある人はお早めにご連絡お願いしま〜す。
#といっても、まだ部分的にCVSに反映できてませんが(^^;)。
