Подтвердить что ты не робот

Как написать многоязычные приложения в Clojure?

Я пытаюсь понять, как создать веб-сайт на основе Compojure с поддержкой многоязычия. Есть ли какие-либо решения вроде i18n или что-то в этом роде?

4b9b3361

Ответ 1

Самый простой способ - заменить все ваши локализованные строки вызовами функций, например:

(i18n lang "help")

И реализовать эту функцию для чтения локализованной строки из файла .properties, определенного параметром lang.

Для этого вам не нужны библиотеки. Это простая функция.

Во избежание чтения файлов все время, когда вы можете их прочитать в памяти во время ваших приложений, начинайте с def на карте с именем loaded-property-files, где lang - это ключ, а значение - это карта ключей сообщений и соответствующие локализованные сообщения.

Это можно сделать следующим образом:

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

Если производительность загрузки файлов не является проблемой, но вы хотите иметь возможность легче изменять файлы во время выполнения, просто измените def на функцию.

Функция read-properties (первоначально из старой clojure.contrib) выглядит следующим образом:

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

Строка локализации из файла default будет использоваться всякий раз, когда этот ключ не будет найден на указанной карте, т.е. новая строка, которая только что была добавлена, и никто еще не перевел ее по-испански, будет отображаться на языке с default locale.properties

Затем ваша функция i18n выглядит так:

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

Ответ 2

Существует новая библиотека i18n: https://github.com/ptaoussanis/tower с этим основанием:

Башня - это попытка представить простую, идиоматическую историю интернационализации и локализации для Clojure. Он, по возможности, обертывает стандартную функциональность Java, но не боится отойти от соглашений Java, когда есть веские причины.

Ответ 3

Я создал clji18n для этого, но перед тем, как завершить его, мне пришлось переключиться на другой проект. Это "почти" можно использовать, вы можете попробовать.

Ответ 4

kotarak j18n (обратите внимание, что есть еще одна библиотека j18n для Java, но они разные) кажется хорошим.

https://bitbucket.org/kotarak/j18n