В настоящее время я пытаюсь добавить поддержку i18n в проект kotlin js (без реакции).

return document.create.div {
        span("mid-title") {
            +i18n here (ResourceBundle.getBundle()?)
        }....
  • Добавлены файлы пакетов ресурсов (strings.properties, strings_en.properties)
  • Пытался получить их через ResourceBundle.getBundle <- kotlin не умеет пользоваться
  • Нашел github, но мне не нравится такой подход

Так есть ли удобный способ работы с kotlin js?

Обновить:

 fun loadJSON(callback: (response: String) -> Unit) {
    val xobj = XMLHttpRequest()
    xobj.overrideMimeType("application/json")
    xobj.open("GET", "test.json", true)
    xobj.onreadystatechange = {

        if (xobj.readyState.toInt() == 4 && xobj.status.toInt() == 200) {
            // Required use of an anonymous callback
            // as .open() will NOT return a value but simply returns undefined in asynchronous mode
            callback(xobj.responseText);
        }
    }
    xobj.send(null)
}

Обновление 2:

Понял сейчас

Как я уже писал ранее, я использую javascript для загрузки файла. После этого у меня есть объект Json, где я могу получить значение по ключу. Я также добавил перегрузку для замены аргументов в строке. Кроме того, я добавил переменную MuatableStateFlow для наблюдения за состоянием загрузки языка. Но имейте в виду, что эту концепцию всегда нужно запускать на сервере. Локально вы получаете ошибку CORS

0
coffeLord 10 Ноя 2020 в 11:24

1 ответ

Лучший ответ
class LanguageSupport(private val folder: String = "", private val lang: String) {
    private lateinit var currentLang: Json

    private val languageMutableStateFlow = MutableStateFlow<LanguageSupportState>(
        LanguageSupportState.LanguageInit
    )
    val languageStateFlow: StateFlow<LanguageSupportState> = languageMutableStateFlow

    init {
        loadJSON()
    }

    fun get(key: String): String {
        val value = currentLang[key]
        check(value != null) {
            throw Exception("key not found to load language definition")
        }
        return if (value is String) {
            value
        } else {
            throw Exception("value of key is not a string")
        }
    }

    fun get(key: String, vararg placeholders: String): String {
        val value = currentLang[key]
        check(value != null) {
            throw Exception("key not found to load language definition")
        }
        return if (value is String) {
            var finalValue: String = value
            for (item in placeholders) {
                finalValue = finalValue.replaceFirst(PLACEHOLDER, item)
            }
            finalValue
        } else {
            throw Exception("value of key is not a string")
        }
    }

    private fun loadJSON() {
        val xobj = XMLHttpRequest()
        xobj.overrideMimeType("application/json")
        xobj.open("GET", "${folder}test_${lang}.json", true)
        xobj.onreadystatechange = {

            if (xobj.readyState.toInt() == 4 && xobj.status.toInt() == 200) {
                // Required use of an anonymous callback
                // as .open() will NOT return a value but simply returns undefined in asynchronous mode
                currentLang = JSON.parse(xobj.responseText)
                languageMutableStateFlow.value = LanguageSupportState.LanguageLoaded
            }
        }
        xobj.send(null)
    }

    companion object {
        const val PLACEHOLDER = "%s"
    }
}

sealed class LanguageSupportState {
    object LanguageLoaded : LanguageSupportState()
    object LanguageError : LanguageSupportState()
    object LanguageInit : LanguageSupportState()
}

И поскольку я использую Koin

single { (folder: String, language: String) ->
        LanguageSupport(
            folder = folder,
            lang = language,
        )
    }
0
coffeLord 11 Ноя 2020 в 12:55