CRUDifyを日本語化してみる

CRUDifyを日本語化してみます。Liftには標準で国際化のための仕組みが提供されています。
CRUDifyが使うメッセージリソースはi18n.lift-coreというリソースバンドルで定義されています(lift-webkit-xxxx.jarの中に入っています)。残念ながら最新のLift 2.3でも日本語用のプロパティファイルは含まれていないようなので、src/main/resources配下にi18nパッケージを作成し、lift-core_ja.propertiesを作成します。
とりあえずCRUDifyで使っていそうなメッセージだけ翻訳してみました(他にもあるかも…)。プロパティファイルはnative2asciiしておく必要があります。

View=参照
Edit=編集
Delete=削除
Create=作成
Save=保存
crudify.menu.view.displayName=%sの参照
crudify.menu.edit.displayName=%sの編集
crudify.menu.delete.displayName=%sの削除

ただ、CRUDifyはメッセージの外部化がいまいちいけてないところがあって、以下のようなコードがあったりします。

def createMenuName = S.??("Create")+" "+displayName

S.??("Create") の部分だけ翻訳してもダメなので、こういう部分はMetaMapperでcreateMenuName自体をオーバーライドします。ついでにdisplayNameをオーバーライドしてモデルの表示名も日本語にしてみます。

object Message extends Message 
  with LongKeyedMetaMapper[Message] with CRUDify[Long, Message]{
  
  override def displayName = "メッセージ"
  
  override def showAllMenuName = "メッセージの一覧"
  override def createMenuName = "メッセージの作成"
  override def editMenuName = "メッセージの編集"
}

これでCRUDifyによるCRUDアプリが一通り日本語になりました。

CRUDifyでリレーション

CRUDifyでリレーションを持つモデルの操作を行ってみます。親モデルはこんな感じ。

package code.model

import _root_.net.liftweb.mapper._

class Dept extends LongKeyedMapper[Dept] with IdPK {
  def getSingleton = Dept
  object deptName extends MappedString(this, 20)
}

object Dept extends Dept
  with LongKeyedMetaMapper[Dept] with CRUDify[Long, Dept]{
}

このモデルに多対一の関係を持つ以下のようなモデルを定義します。DeptとのリレーションはMappedLongForeignKeyで表し、CRUDifyでDeptを選択できるようにするためにvalidSelectValuesをオーバーライドしています。これによってプルダウンでDeptを選択できるようになります。

package code.model

import _root_.net.liftweb.mapper._
import _root_.net.liftweb.common._

class Emp extends LongKeyedMapper[Emp] with IdPK {
  def getSingleton = Emp
  object empName extends MappedString(this, 20)
  object dept extends MappedLongForeignKey(this, Dept){
    override def dbIndexed_? = true
    override def validSelectValues =
      Full(Dept.findAll.map{dept => (dept.id.is, dept.deptName.is)})
  }
}

object Emp extends Emp
  with LongKeyedMetaMapper[Emp] with CRUDify[Long, Emp]{
}

こんな感じになりました。