TempuraとBaumの相性がいいという話
これはClojure Advent Calendar 2017のために書かれた記事です。
とは言っても、そんなたいしたことを書くつもりは無くて、いつも書く記事の延長線上にある比較的実践的で軽いトピックです。本当は11月に書いて公開しようかなと思っていたのを、時期をずらして12月にしたっていうだけなので過度な期待はしないでください。
Tempuraはご存知の通りi18nのためのライブラリです。Baumも知っての通りEDNフォーマットを拡張するためのライブラリです。このふたつを組み合わせるとちょっと嬉しいことがあるので、簡単に説明します。 code:clojure
(def dict
{:en-US
{:hello "Hello, %1"}
:ja-JP
{:hello "こんにちは、%1"
:byebye "バイバイ"}})
;;=> "Hello, ayato-p"
;;=> "バイバイ"
上の例だと dict を直接ソースコード上に記述しているので、良くないですが実際は resources ディレクトリなどにEDNファイルを作って読み込むようにしたりします。
code:clojure
;; resources/simple-dict.edn
{:en-US
{:hello "Hello, %1"}
:ja-JP
{:hello "こんにちは、%1"
:byebye "バイバイ"}}
code:clojure
(def dict (edn/read-string (slurp (io/resource "simple-dict.edn"))))
;;=> "Hello, ayato-p"
このようにEDNファイルに記述して読み込むようにすると、ソースコードの中に翻訳の情報が紛れ込まずに済みます。
さて、Tempuraを利用すると国際化の対応ができることは分かりましたが、何処にBaumを使う余地があるのでしょう。 先程の辞書(simple-dict.edn)では、ひとつのファイルの中に複数の言語を書いていました。これがふたつの言語で少ししか翻訳するソースがない、というのであればこれでも良いでしょう。
しかし、現実のプログラムでは複数の言語、大量の翻訳対象があることが多々あります。となると、先程の管理方法ではすぐに破綻してしまうのが目に見えています。
そこで、普通に考えると辞書ファイルとなっているEDNファイルをどうにか分割したいと考えるのではないでしょうか。例えば言語ごとにファイルを分割できると嬉しそうです。 普通に言語ごとにファイルを分けると次のようになると思います。
code:clojure
;; resources/ja-jp.edn
{:ja-JP
{:hello "こんにちは、%1"
:byebye "バイバイ"}}
code:clojure
;; resources/en-us.edn
{:en-US
{:hello "Hello, %1"}}
code:clojure
(def dict (merge (edn/read-string (slurp (io/resource "ja-jp.edn")))
(edn/read-string (slurp (io/resource "en-us.edn")))))
;;=> "Hello, ayato-p"
ただ、これでは言語が増えたり、同じ言語の中でもカテゴリ毎にファイルを分割したい(例えばエラーメッセージは別にするとか)場合などといった場合に、それに合わせて毎回コードを修正する必要があり不便です。
そこで活躍するのが、Baumというわけです。上記のようなふたつの言語に分けた場合は、以下のようなEDNファイルをひとつ足します。 code:clojure
;; resources/ext-dict.edn
{$include [#resource "ja-jp.edn"
こういうファイルを用意すれば、次のように辞書を読み込んで利用することができます。
code:clojure
(def dict (b/read-file (io/resource "ext-dict.edn")))
dict
;;=> {:ja-JP {:hello "こんにちは、%1", :byebye "バイバイ"},
;; :en-US {:hello "Hello, %1"}}
あとは先程までと同じようにTempura側でこれを辞書として使えばいいわけですね。 このようにBaumを使うと簡単にEDNファイルを統合したりすることができます。とても便利なので使っていきましょう :) 細かい使い方については去年のアドベントカレンダーに作者自ら書いた記事があるので、そちらを参照すると良いでしょう。
毎日ケーキは飽きるので軽めのトピックでしたよっと。
宣伝
ところでサイボウズスタートアップスでは、Clojureを書きたいエンジニア募集してます。もし、Clojureを書きたくて興味があって、話だけでも聞いてみたいという方はayato-p.iconまでご連絡ください(/icons/twitter.iconのDMあたりで)。カジュアルにお寿司を食べながらお話しましょう :)