status-mobile/src/status_im/i18n.cljs

131 lines
5.4 KiB
Clojure

(ns status-im.i18n
(:require
[status-im.translations.af :as af]
[status-im.translations.ar :as ar]
[status-im.translations.da :as da]
[status-im.translations.de :as de]
[status-im.translations.de-ch :as de-ch]
[status-im.translations.en :as en]
[status-im.translations.es :as es]
[status-im.translations.es-ar :as es-ar]
[status-im.translations.fr :as fr]
[status-im.translations.fr-ch :as fr-ch]
[status-im.translations.hi :as hi]
[status-im.translations.hu :as hu]
[status-im.translations.id :as id]
[status-im.translations.it :as it]
[status-im.translations.it-ch :as it-ch]
[status-im.translations.ja :as ja]
[status-im.translations.ko :as ko]
[status-im.translations.nl :as nl]
[status-im.translations.pl :as pl]
[status-im.translations.pt-br :as pt-br]
[status-im.translations.pt-pt :as pt-pt]
[status-im.translations.ro :as ro]
[status-im.translations.ru :as ru]
[status-im.translations.sl :as sl]
[status-im.translations.sv :as sv]
[status-im.translations.sw :as sw]
[status-im.translations.th :as th]
[status-im.translations.tr :as tr]
[status-im.translations.uk :as uk]
[status-im.translations.ur :as ur]
[status-im.translations.vi :as vi]
[status-im.translations.zh-hans :as zh-hans]
[status-im.translations.zh-hant :as zh-hant]
[status-im.translations.zh-wuu :as zh-wuu]
[status-im.translations.zh-yue :as zh-yue]
[status-im.utils.js-resources :refer [default-contacts]]
[taoensso.timbre :as log]
[clojure.string :as str]))
(def i18n (js/require "react-native-i18n"))
(set! (.-fallbacks i18n) true)
(set! (.-defaultSeparator i18n) "/")
(set! (.-translations i18n) (clj->js {:af af/translations
:ar ar/translations
:da da/translations
:de de/translations
:de-ch de-ch/translations
:en en/translations
:es es/translations
:es-ar es-ar/translations
:fr fr/translations
:fr-ch fr-ch/translations
:hi hi/translations
:hu hu/translations
:id id/translations
:it it/translations
:it-ch it-ch/translations
:ja ja/translations
:ko ko/translations
:nl nl/translations
:pl pl/translations
:pt-br pt-br/translations
:pt-pt pt-pt/translations
:ro ro/translations
:ru ru/translations
:sl sl/translations
:sv sv/translations
:sw sw/translations
:th th/translations
:tr tr/translations
:uk uk/translations
:ur ur/translations
:vi vi/translations
:zh-hans zh-hans/translations
:zh-hant zh-hant/translations
:zh-wuu zh-wuu/translations
:zh-yue zh-yue/translations}))
(def delimeters
"This function is a hack: mobile Safari doesn't support toLocaleString(), so we need to pass
this map to WKWebView to make number formatting work."
(let [n (.toLocaleString (js/Number 1000.1))
delimiter? (= (count n) 7)]
(if delimiter?
{:delimiter (subs n 1 2)
:separator (subs n 5 6)}
{:delimiter ""
:separator (subs n 4 5)})))
(defn label-number [number]
(when number
(let [{:keys [delimiter separator]} delimeters]
(.toNumber i18n
(str/replace number #"," ".")
(clj->js {:precision 10
:strip_insignificant_zeros true
:delimiter delimiter
:separator separator})))))
(defn label
([path] (label path {}))
([path options]
(if (exists? i18n.t)
(let [options (update options :amount label-number)]
(.t i18n (name path) (clj->js options)))
(name path))))
(defn label-pluralize [count path & options]
(if (exists? i18n.t)
(.p i18n count (name path) (clj->js options))
(name path)))
(defn message-status-label [status]
(->> status
(name)
(str "t/status-")
(keyword)
(label)))
(def locale
(.-locale i18n))
(defn get-contact-translated [contact-id key fallback]
(let [translation #(get-in default-contacts [(keyword contact-id) key (keyword %)])]
(or (translation locale)
(translation (subs locale 0 2))
fallback)))