メッセージ国際化関連のライブラリを作った

Webアプリなどを作るとき、国際化しておくとかっこいい。
java.utilにそういうものをサポートするResourceBundleという仕組みがあり、Clojureから簡単に使えるものを作成。
類似のライブラリは他にもあるが、これはClojure内でResourceBundleの定義が出来ることと、propertiesファイルに日本語がじかに使えるようにしたことが特徴。(普通は、native2asciiで変換が必要。)

Clojarsに上げてあるので、Leiningenでproject.cljにそのまま書いて使えます。

ResourceBundleを使うライブラリ「i18n

こちらはResourceBundleを簡単に扱えるようにする汎用ライブラリ。

;;;; project.clj
(defproject hellohello
  :dependencies [[jp.taka2ru/i18n "0.0.1"]])

;;;; someprogram.clj
(use 'i18n.core)

;;メッセージを定義(Javaのときと同様、propertiesファイルをクラスパスに置いてもOK)
(gen-resource [:mymessage :ja] ;; [<リソース名> <言語(Locale)>]
  :hello "こんにちは"
  :good-bye "さようなら")

;;メッセージを参照
(... (resource :mymessage :ja :good-bye) ...)

テンプレートエンジンEnliveで国際化するライブラリ「enlive-utils」

テンプレートエンジンEnliveを使ったときに、ページの全テキストを一つのtransformerで一気に置換してくれるのがこちら。

;;;; project.clj
(defproject hellohello
  :dependencies [[jp.taka2ru/enlive-utils "0.0.1-SNAPSHOT"]])

;;;; someprogram.clj
(use 'net.cgrand.enlive-html)
(use 'enlive-utils.core)

;;メッセージを定義
(gen-resource [:mymessage :ja]
  :hello "こんにちは"
  :good-bye "さようなら")

;;テンプレート定義
(deftemplate greeting-page "templates/greeting.html" []
  [:html] (localize-document :mymessage :ja)) ;;←mymessageにある全部を置換

;;テンプレートを使用
(apply str (greeting-page))
templates/greeting.html (クラスパスの通ったところに置いてね)

message属性にメッセージIDを定義。

<html>
  <body>
    <p message="hello">Hello</p>
  </body>
</html>
greeting-pageの出力

message属性が削除され、代わりに中身がメッセージIDに対応する日本語に置換されている。

<html>
  <body>
    <p>こんにちは</p>
  </body>
</html>