1. Meikel Brandmeyer
  2. j18n


j18n / src / main / clojure / j18n / core.clj

(ns ^{:doc
  "Provide some Clojure sugar for internationalisation using the usual
  Java infrastructure of ResourceBundles."
      :author "Meikel Brandmeyer <m@kotka.de>"}

(def ^{:private true} bundles (atom {}))

(defmacro defbundle
  "Creates a new bundle with given name. Attaches the Var to the metadata
  of the namespace. If several bundles are defined in one namespace, the
  last one wins as “the official bundle” for that namespace."
  ([bundle-name] `(defbundle ~bundle-name (name (ns-name *ns*))))
  ([bundle-name package]
      (declare ~bundle-name)
      (alter-meta! *ns* assoc ::bundle (var ~bundle-name))
      (swap! @#'bundles assoc (var ~bundle-name) ~package)
      (var ~bundle-name))))

(defn init-bundles!
  "Initialise all bundles defined with defbundle. This should only be called
  once during application startup and initialisation."
  (doseq [[v p] @bundles]
    (alter-var-root v (constantly (ResourceBundle/getBundle p)))))

(defn translate*
  "Translate the given message in the given bundle. This is basically a
  wrapper around ResourceBundle/getString."
  [^String message ^ResourceBundle bundle]
  (.getString bundle message))