gpt4 book ai didi

internationalization - 如何在 Clojure 中编写多语言应用程序?

转载 作者:行者123 更新时间:2023-12-03 10:57:55 27 4
gpt4 key购买 nike

我试图弄清楚如何创建一个具有多语言支持的基于 Compojure 的网站。有没有像 i18n 这样的解决方案?

最佳答案

最简单的方法是用如下函数调用替换所有本地化字符串:
(i18n lang "help")
并实现该函数以从 .properties 读取本地化字符串文件由 lang 确定范围。

为此,您不需要任何库。这是一个简单的功能。

为了避免一直读取文件,您可以在应用程序以 def 开头时在内存中读取它们。进入名为 loaded-property-files 的 map 其中,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 的本地化字符串只要在指定的映射中找不到该键,就会使用文件,即刚刚添加的新字符串,并且还没有人将其翻译成西类牙语,将以默认语言显示 locale.properties
那么你的 i18n函数看起来像这样:
(defn i18n [lang code]
((loaded-property-files lang) code))

关于internationalization - 如何在 Clojure 中编写多语言应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4478874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com