internationalization clojure multilingual compojure

internationalization - ¿Cómo escribir aplicaciones multilingües en Clojure?



multilingual compojure (4)

El j18n de kotarak (tenga en cuenta que hay otra biblioteca j18n para Java pero son diferentes) parece bueno.

https://bitbucket.org/kotarak/j18n

Estoy intentando descubrir cómo crear un sitio web basado en Compojure con soporte multilingüe. ¿Hay alguna solución como i18n o algo así?


Hay una nueva biblioteca i18n: https://github.com/ptaoussanis/tower con esta justificación:

Tower es un intento de presentar una historia simple, idiomática de internacionalización y localización para Clojure. Envuelve la funcionalidad estándar de Java cuando es posible, pero no teme alejarse de las convenciones de Java cuando hay una buena razón para hacerlo.


La forma más sencilla es reemplazar todas las cadenas localizadas con una función llamada como:

(i18n lang "help")

E implemente esa función para leer una cadena localizada de un archivo .properties determinado por el parámetro lang .

Para eso no necesitas ninguna librería. Es una función simple.

Para evitar leer archivos todo el tiempo, puede leerlos en la memoria durante sus aplicaciones. Comience con una def en un mapa denominado loaded-property-files , donde lang es la clave y el valor es un mapa de claves de mensajes y mensajes localizados apropiados.

Esto se puede hacer así:

(defn load-property-files [langs] (let [default (into {} (read-properties "locale.properties"))] (apply merge (for [lang langs] (assoc {} lang (merge default (into {} (read-properties (str "locale_" lang ".properties"))))))))) (def loaded-property-files (load-property-files ["en" "es" "de"]))

Si el rendimiento de carga de archivos no es un problema, pero le gustaría poder cambiar los archivos más fácilmente durante el tiempo de ejecución, simplemente cambie la def a una función.

La función read-properties (originalmente de old clojure.contrib ) se ve así:

(defn read-properties "Read properties from file-able." ([fileable] (into {} (map #(vector (keyword (key %)) (val %)) (try (with-open [f (java.io.FileInputStream. (new java.io.File fileable))] (doto (new java.util.Properties) (.load f))) (catch java.io.FileNotFoundException e {}))))) ([fileable defaults] (merge (read-properties fileable) defaults)))

La cadena de localización del archivo default se usaría siempre que esa clave no se encuentre en el mapa especificado, es decir, la nueva cadena que se acaba de agregar, y nadie la haya traducido al español todavía, se mostrará en el idioma desde la locale.properties predeterminada locale.properties

Entonces su función i18n ve así:

(defn i18n [lang code] ((loaded-property-files lang) code))


clji18n para esto, pero tuve que cambiar a otro proyecto antes de completarlo. Es "casi" utilizable, puedes intentarlo.