mirror of
https://github.com/logseq/logseq.git
synced 2026-05-03 02:16:30 +00:00
Simplify i18n translate
No need for translate fn to be stateful. No reason to check preferred language on _every_ translation
This commit is contained in:
@@ -1,33 +1,27 @@
|
||||
(ns frontend.context.i18n
|
||||
"Handles translation for the entire application. The dependencies for this ns
|
||||
must be small since it is used throughout the application."
|
||||
(:require [frontend.dicts :as dicts]
|
||||
[frontend.modules.shortcut.dicts :as shortcut-dicts]
|
||||
[medley.core :refer [deep-merge]]
|
||||
[tongue.core :as tongue]
|
||||
[frontend.state :as state]))
|
||||
|
||||
;; TODO
|
||||
;; - [x] Get the preferred language from state
|
||||
;; - [x] Update the preferred language
|
||||
;; - [x] Create t functiona which takes a keyword and returns text with the current preferred language
|
||||
;; - [x] Add fetch for local browser preferred language if user has set it already
|
||||
;; - [ ] Fetch preferred language from backend if user is logged in
|
||||
(def dicts
|
||||
(merge-with merge dicts/dicts shortcut-dicts/dicts))
|
||||
|
||||
(defn fetch-local-language []
|
||||
(.. js/window -navigator -language))
|
||||
|
||||
(defonce translate-dicts (atom {}))
|
||||
|
||||
(defn- translate [dicts]
|
||||
(def translate
|
||||
(tongue/build-translate dicts))
|
||||
|
||||
(defn t
|
||||
[& args]
|
||||
(let [preferred-language (keyword (state/sub :preferred-language))
|
||||
_ (when (nil? preferred-language)
|
||||
(state/set-preferred-language! (fetch-local-language)))
|
||||
dicts (or (get @translate-dicts preferred-language)
|
||||
(let [result (some-> (deep-merge dicts/dicts shortcut-dicts/dicts)
|
||||
translate)]
|
||||
(swap! translate-dicts assoc preferred-language result)
|
||||
result))]
|
||||
(apply (partial dicts preferred-language) args)))
|
||||
(let [preferred-language (keyword (state/sub :preferred-language))]
|
||||
(apply translate preferred-language args)))
|
||||
|
||||
(defn- fetch-local-language []
|
||||
(.. js/window -navigator -language))
|
||||
|
||||
;; TODO: Fetch preferred language from backend if user is logged in
|
||||
(defn start []
|
||||
(let [preferred-language (state/sub :preferred-language)]
|
||||
(when (nil? preferred-language)
|
||||
(state/set-preferred-language! (fetch-local-language)))))
|
||||
|
||||
Reference in New Issue
Block a user