问题描述
我目前正在尝试将i18n支持添加到kotlin js项目中(无反应)。
return document.create.div {
span("mid-title") {
+i18n here (ResourceBundle.getBundle()?)
}....
- 添加了资源束文件(strings.properties,strings_en.properties)
- 试图通过ResourceBundle.getBundle获取它们
- 找到了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错误
解决方法
'about.json'
因为我用的是Koin
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()
}