Source

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

The default branch has multiple heads

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

(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]
   `(do
      (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))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.