i18n.cljs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. (ns frontend.context.i18n
  2. (:require [frontend.dicts :as dicts]
  3. [frontend.modules.shortcut.dict :as shortcut-dict]
  4. [rum.core :as rum]
  5. [medley.core :refer [deep-merge]]
  6. [frontend.state :as state]))
  7. ;; TODO
  8. ;; - [x] Get the preferred language from state
  9. ;; - [x] Update the preferred language
  10. ;; - [x] Create t functiona which takes a keyword and returns text with the current preferred language
  11. ;; - [x] Add fetch for local browser preferred language if user has set it already
  12. ;; - [ ] Fetch preferred language from backend if user is logged in
  13. (defn fetch-local-language []
  14. (.. js/window -navigator -language))
  15. (rum/defcontext *tongue-context*)
  16. ;; FIXME: reactive
  17. (defonce t
  18. (let [preferred-language (keyword (state/sub :preferred-language))
  19. set-preferred-language state/set-preferred-language!
  20. all-dicts (deep-merge dicts/dicts shortcut-dict/dict)
  21. t (partial (dicts/translate all-dicts) preferred-language)]
  22. (if (nil? preferred-language)
  23. (set-preferred-language (fetch-local-language))
  24. :ok)
  25. t))
  26. (rum/defc tongue-provider [children]
  27. (let [preferred-language (keyword (state/sub :preferred-language))
  28. set-preferred-language state/set-preferred-language!
  29. all-dicts (deep-merge dicts/dicts shortcut-dict/dict)
  30. t (partial (dicts/translate all-dicts) preferred-language)]
  31. (if (nil? preferred-language)
  32. (set-preferred-language (fetch-local-language))
  33. :ok)
  34. (rum/bind-context [*tongue-context* [t preferred-language set-preferred-language]]
  35. children)))
  36. (rum/defc use-tongue []
  37. (rum/with-context [value *tongue-context*]
  38. (if (nil? value)
  39. (throw "use-i18n must be used within a i18n-provider")
  40. value)))