メッセージ国際化関連のライブラリを作った
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>