多言語サポートを備えた Compojure ベースの Web サイトを作成する方法を見つけようとしています。i18n などのソリューションはありますか?
4 に答える
最も簡単な方法は、ローカライズされたすべての文字列を次のような関数呼び出しに置き換えることです。
(i18n lang "help")
そして、その関数を実装して、パラメータ.properties
によって決定されるファイルからローカライズされた文字列を読み取りlang
ます。
そのためには、ライブラリは必要ありません。シンプルな機能です。
常にファイルを読み取らないようにするには、アプリケーション中にメモリ内でファイルを読み取ることができます。ここで、はキーで、値はメッセージ キーと適切なローカライズされたメッセージのマップですdef
。loaded-property-files
lang
これは次のように行うことができます。
(defn load-property-files [langs]
(let [default (into {} (read-properties "locale.properties"))]
(apply merge
(for [lang langs]
(assoc {} lang
(merge default
(into {} (read-properties (str "locale_" lang ".properties")))))))))
(def loaded-property-files
(load-property-files ["en" "es" "de"]))
ファイル読み込みのパフォーマンスは問題にならないが、実行時にファイルをより簡単に変更できるようにしたい場合は、def
を関数に変更するだけです。
関数read-properties
(元は old からclojure.contrib
) は次のようになります。
(defn read-properties
"Read properties from file-able."
([fileable]
(into {} (map #(vector (keyword (key %)) (val %))
(try
(with-open [f (java.io.FileInputStream. (new java.io.File fileable))]
(doto (new java.util.Properties)
(.load f)))
(catch java.io.FileNotFoundException e {})))))
([fileable defaults] (merge (read-properties fileable) defaults)))
そのキーが指定されたマップで見つからない場合は常に、ファイルからのローカライズ文字列default
が使用されます。つまり、追加されたばかりの新しい文字列で、まだ誰もスペイン語に翻訳していない場合は、デフォルトの言語で表示されます。locale.properties
次に、i18n
関数は次のようになります。
(defn i18n [lang code]
((loaded-property-files lang) code))
新しい i18n ライブラリがあります: https://github.com/ptaoussanis/towerこの根拠:
Tower は、Clojure のシンプルで慣用的な国際化とローカリゼーションのストーリーを提示する試みです。可能な場合は標準の Java 機能をラップしますが、正当な理由がある場合は、Java の規則から離れることを恐れません。
kotarak の j18n (Java 用の別の j18n ライブラリーがありますが、それらは別のものであることに注意してください) は良さそうです。