diff options
Diffstat (limited to 'src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt')
-rw-r--r-- | src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt | 123 |
1 files changed, 7 insertions, 116 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt b/src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt index 343c18ef..b61d6e40 100644 --- a/src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt +++ b/src/main/kotlin/pl/treksoft/kvision/i18n/I18n.kt @@ -21,24 +21,15 @@ */ package pl.treksoft.kvision.i18n -import org.w3c.xhr.XMLHttpRequest import pl.treksoft.kvision.panel.Root import kotlin.browser.window -import kotlin.js.Promise - -external class Jed(json: dynamic) { - fun gettext(key: String): String - fun ngettext(singularKey: String, pluralKey: String, value: Int): String - fun sprintf(format: String, value: Int): String -} - -private const val I18N_SINGLE_DELIMITER = "###KvI18nS###" -private const val I18N_PLURAL_DELIMITER = "###KvI18nP###" /** * A singleton object used for translations. */ -object I18n { +object I18n : I18nManager { + + var manager: I18nManager = SimpleI18nManager() private val defaultLanguage = window.navigator.language.split("-")[0] @@ -51,112 +42,12 @@ object I18n { Root.roots.forEach { it.restart() } } - private val cache = mutableMapOf<String, Jed>() - - /** - * I18n initialization function. - * Should be called in the main function of the application. - * @param languages a list of supported languages. - * @param initCallback a code to run after the initialization process is complete. - */ - fun init(vararg languages: String, initCallback: () -> Unit) { - val promises = languages.map { - I18n.readMessages(it) - }.toTypedArray() - Promise.all(promises).then { initCallback() } + override fun gettext(key: String): String { + return manager.gettext(key) } - @Suppress("MagicNumber") - private fun readMessages(language: String): Promise<Jed> { - return Promise { resolve, _ -> - val xmlHttpRequest = XMLHttpRequest() - xmlHttpRequest.overrideMimeType("application/json") - xmlHttpRequest.open("GET", "js/messages-$language.json", true) - xmlHttpRequest.onreadystatechange = { - if (xmlHttpRequest.readyState.toInt() == 4 && (xmlHttpRequest.status.toInt() == 200 || - xmlHttpRequest.status.toInt() == 0) - ) { - val json = JSON.parse<dynamic>(xmlHttpRequest.responseText) - val jed = Jed(json) - cache[language] = jed - resolve(jed) - } - } - xmlHttpRequest.send() - } + override fun ngettext(singularKey: String, pluralKey: String, value: Int): String { + return manager.ngettext(singularKey, pluralKey, value) } - /** - * A static translation function for a singular form. - * @param key a translation key. - * @return translated text. - */ - fun gettext(key: String): String { - return cache[language]?.gettext(key) ?: key - } - - /** - * A static translation function for a plural form. - * @param singularKey a translation key for a singular form. - * @param pluralKey a translation key for a plural form. - * @param value a count value. - * @return translated text. - */ - fun ngettext(singularKey: String, pluralKey: String, value: Int): String { - return cache[language]?.run { - sprintf(ngettext(singularKey, pluralKey, value), value) - } ?: if (value == 1) singularKey else pluralKey - } - - /** - * A dynamic translation function for a singular form. - * @param key a translation key. - * @return text marked for a dynamic translation. - */ - fun tr(key: String): String { - return I18N_SINGLE_DELIMITER + key - } - - /** - * A dynamic translation function for a plural form. - * @param singularKey a translation key for a singular form. - * @param pluralKey a translation key for a plural form. - * @param value a count value. - * @return text marked for a dynamic translation. - */ - fun ntr(singularKey: String, pluralKey: String, value: Int): String { - return I18N_PLURAL_DELIMITER + singularKey + I18N_PLURAL_DELIMITER + pluralKey + I18N_PLURAL_DELIMITER + value - } - - /** - * A dynamic translation function. - * @param text text marked for a dynamic translation. - * @return translated text. - */ - fun trans(text: String): String { - return if (text.startsWith(I18N_SINGLE_DELIMITER)) { - gettext(text.substring(I18N_SINGLE_DELIMITER.length)) - } else if (text.startsWith(I18N_PLURAL_DELIMITER)) { - val tab = text.substring(I18N_PLURAL_DELIMITER.length).split(I18N_PLURAL_DELIMITER) - @Suppress("MagicNumber") - if (tab.size == 3) { - ngettext(tab[0], tab[1], tab[2].toIntOrNull() ?: 1) - } else { - text - } - } else { - text - } - } - - /** - * A dynamic translation function. - * @param text text marked for a dynamic translation. - * @return translated text. - */ - fun trans(text: String?): String? { - return text?.let { - trans(it) - } - } } |