如何使用 kotlin js 支持 i18n

咖啡王

我目前正在尝试向 kotlin js 项目添加 i18n 支持(无反应)。

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 错误

咖啡王
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,
        )
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使Flask扩展支持i18n?

node.js i18n:使用__还是导入?

如何在 Aurelia 中支持多个 i18n 端点?

如何在Drupal 7中使i18n支持文件名?

如何向由MSIX Packaging Toolkit制作的安装文件添加I18N支持

如何使用jQuery.i18n.properties.js + Spring 3 MVC加载i18n属性文件

如何使用Handlebars.js(胡子模板)制作i18n?

如何使用Sails.js获得非平凡的i18n转换?

如何在.js文件中使用Vue i18n翻译?

如何在meteor.js中本地化(i18n)moment.js?

Sails.js:如何在Assets / js / files.js中使用i18n函数

在Vue.js中使用i18n库和直接使用loacle之间的区别

Vue.js vuetify i18n:如何动态翻译工具栏项?

如何使用Express和Kraken.js的Makara模块从I18N属性文件中“拉出”样式HTML标签?

Angular i18n是否支持梵文数字?

Java I18n(不支持的语言环境)

如何使i18n for vuetify

Rails i18n使用数组

I18n :: InvalidLocaleData:I18n gem在js导出中有问题

Nuxt/Vue js - 如何将路径字段同步到路由器中的 i18n 变量。我试过了,但无法进入 i18n

如何使用Spring的i18n机制?

i18n如何使用Javascript工作?

如何使用i18n到盖茨比?

如何在Grails radioGroup中使用i18n?

Vue.js:在 <i18n> 标签上循环

I18N在Next.JS中更改语言

如何在Kotlin中使用Android支持的typedef注释?

如何使用rx-kotlin实施强大的离线支持?

使用 Nuxt.js + i18n 时,我想使用 t 方法作为标签的 href 和自定义数据属性而不是 nuxt-link