Play2で日本語パスのルーティングを記述する

Play2で日本語を含むパスをコントローラにマッピングする場合、routesにはURLエンコード済みのパスを記述しておく必要があるのですが、数が増えると後から見たときにわけわかめな感じになってしまいます。

GET    /%E3%83%8F%E3%83%AD%E3%83%BC    controllers.Application.hello

そこでこんな感じのGlobalを用意しておきます。URLがエンコードされてるっぽいパスで始まっている場合はデコードしてからルーティングを行うようにしています。

import play.api._
import play.api.mvc._
import java.net.URLDecoder.decode

object Global extends GlobalSettings {

  override def onRouteRequest(req: RequestHeader): Option[Handler] = {
    super.onRouteRequest(
      if(req.path.startsWith("/%")) req.copy(path = decode(req.path, "UTF-8")) else req)
  }

}

するとroutesに以下のような感じで日本語ルーティングを書けるようになります。

GET    /ハロー    controllers.Application.hello

日本語パスを多用する場合はこんな技を使うのもありかもしれません。