i18n.cljs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  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. (rum/defc tongue-provider [children]
  17. (let [preferred-language (keyword (state/sub :preferred-language))
  18. set-preferred-language state/set-preferred-language!
  19. all-dicts (deep-merge dicts/dicts shortcut-dict/dict)
  20. t (partial (dicts/translate all-dicts) preferred-language)]
  21. (if (nil? preferred-language)
  22. (set-preferred-language (fetch-local-language))
  23. :ok)
  24. (rum/bind-context [*tongue-context* [t preferred-language set-preferred-language]]
  25. children)))
  26. (rum/defc use-tongue []
  27. (rum/with-context [value *tongue-context*]
  28. (if (nil? value)
  29. (throw "use-i18n must be used within a i18n-provider")
  30. value)))