(ns status-im.i18n (:require [status-im.react-native.js-dependencies :as rn-dependencies] [clojure.string :as string] [status-im.i18n-resources :as i18n-resources] [status-im.goog.i18n-module :as goog.i18n])) (set! (.-locale rn-dependencies/i18n) (name i18n-resources/default-device-language)) (set! (.-fallbacks rn-dependencies/i18n) true) (set! (.-defaultSeparator rn-dependencies/i18n) "/") (set! (.-translations rn-dependencies/i18n) (clj->js i18n-resources/translations-by-locale)) (defn set-language [lang] (i18n-resources/load-language lang) (set! (.-locale rn-dependencies/i18n) lang)) ;;:zh, :zh-hans-xx, :zh-hant-xx have been added until this bug will be fixed https://github.com/fnando/i18n-js/issues/460 (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 rn-dependencies/i18n (string/replace number #"," ".") (clj->js {:precision 10 :strip_insignificant_zeros true :delimiter delimiter :separator separator}))))) (def default-option-value "") (defn label-options [options] ;; i18n ignores nil value, leading to misleading messages (into {} (for [[k v] options] [k (or v default-option-value)]))) (defn label ([path] (label path {})) ([path options] (if (exists? rn-dependencies/i18n.t) (let [options (update options :amount label-number)] (.t rn-dependencies/i18n (name path) (clj->js (label-options options)))) (name path)))) (defn label-pluralize [count path & options] (if (exists? rn-dependencies/i18n.t) (.p rn-dependencies/i18n count (name path) (clj->js options)) (name path))) (def locale (.-locale rn-dependencies/i18n)) (def format-currency goog.i18n/format-currency)