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 <>"}

(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))))