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

The default branch has multiple heads

Diff from to

src/main/clojure/j18n/core.clj

   (:import
     java.util.ResourceBundle))
 
-(def ^{:private true} bundles (atom {}))
+(def ^{:private true :tag Set} bundle-keys
+ (memoize #(.keySet ^ResourceBundle %)))
 
-(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 (munge (name (ns-name *ns*)))))
-  ([bundle-name package]
-   `(do
-      (def ~bundle-name nil)
-      (alter-meta! *ns* assoc ::bundle (symbol (name (ns-name *ns*)) ~(name 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 ^{:private true} message-to-bundle
-  [message]
-  (when (keyword? message)
-    (when-let [nspace (namespace message)]
-      (::bundle (meta (the-ns (symbol nspace)))))))
-
-(def ^{:private true :tag java.util.HashSet} bundle-keys
-  (memoize
-    (fn [^ResourceBundle bundle]
-      (.keySet bundle))))
+(defn ^{:private true :tag String} message-to-bundle
+ [message]
+ (when (keyword? message)
+   (when-let [bundle (namespace message)]
+     (munge bundle))))
 
 (defn translate*
-  "Translate the given message in the given bundle. For resolution rules see
-  translate. However, if message is a string or an unqualified keyword, the
-  bundle has to be given! Only qualified keywords may be used without explicit
-  bundle!"
-  ([message]
-   {:pre [(keyword? message) (namespace message)]}
-   (let [bundle @(resolve (message-to-bundle message))]
-     (translate* message bundle)))
-  ([message ^ResourceBundle bundle]
-   (let [message (name message)]
-     (when (.contains (bundle-keys bundle) message)
-       (.getString bundle (name message))))))
+ "Translate the given message in the given bundle. For resolution rules see
+ translate. However, if message is a string or an unqualified keyword, the
+ bundle has to be given! Only qualified keywords may be used without explicit
+ bundle!"
+ ([message]
+  {:pre [(keyword? message) (namespace message)]}
+  (translate* message (ResourceBundle/getBundle (message-to-bundle message))))
+ ([message ^ResourceBundle bundle]
+  (let [message (name message)]
+    (when (.contains (bundle-keys bundle) message)
+      (.getString bundle message)))))
 
 (defmacro translate
-  "Translate the given message. Message may be a qualified or non-qualified
-  keyword or a String. The message is looked up in the given bundle. If no
-  bundle is given, the official bundle of the namespace of the qualified
-  keyword will be used. If the keyword is not qualified or the message key
-  is given as String, the official bundle of the current namespace will be
-  used."
-  ([message]
-   {:pre [(or (string? message) (keyword? message))]}
-   (let [bundle (or (message-to-bundle message) (::bundle (meta *ns*)))]
-     `(translate ~message ~bundle)))
-  ([message bundle]
-   {:pre [(or (string? message) (keyword? message))]}
-   `(translate* ~(name message) ~bundle)))
+ "Translate the given message. Message may be a qualified or non-qualified
+ keyword or a String. The message is looked up in the given bundle. If no
+ bundle is given, the bundle of the namespace of the qualified keyword will
+ be used. Note, that this namespace does not have to exist! If the keyword
+ is not qualified or the message key is given as String, the bundle of the
+ current namespace will be used."
+ ([message]
+  {:pre [(or (string? message) (keyword? message))]}
+  (let [bundle (or (message-to-bundle message)
+                   (munge (name (ns-name *ns*))))]
+    `(translate ~message (ResourceBundle/getBundle ~bundle))))
+ ([message bundle]
+  {:pre [(or (string? message) (keyword? message))]}
+  `(translate* ~message ~bundle)))
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.