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:
Gabriel Horner
2022-03-28 16:14:46 -04:00
parent 918e3511d6
commit 391d3e48f3
2 changed files with 22 additions and 26 deletions

View File

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