Files
TankIC/TankiOffline/app/src/jsMain/kotlin/App/Browser/Translations.kt
T

52 lines
1.6 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Translations.kt —— 真实 UI 文案(运行时拉取游戏自带的 zh-CN 翻译)
//
// 资源路径来自 3DTank/src/resources.json 的 resourceMap(id 19144)。
// 拉取失败时回退到调用点给的默认文案,UI 不会因网络问题变空白。
package App.Browser
object Translations {
private var Root: dynamic = null
private var Loading = false
val Loaded: Boolean get() = Root != null
private val FetchJson: (String, (dynamic) -> Unit) -> Unit = js(
"""
(function (Url, Cb) {
if (typeof fetch !== 'function') { Cb(null); return; }
fetch(Url, { mode: 'cors' })
.then(function (R) { return R.ok ? R.json() : null; })
.then(function (J) { Cb(J); })
.catch(function () { Cb(null); });
})
"""
)
/** 拉取 zh-CN 翻译;完成后调用 OnReady(用于重绘)。 */
fun Load(OnReady: () -> Unit) {
if (Loaded || Loading) {
OnReady()
return
}
Loading = true
FetchJson("/play/static/translations/zh-CN.61d6ab60.json") { Json ->
Root = Json
Loading = false
OnReady()
}
}
/** 按 `a.b.c` 取值;缺失或非字符串时返回 Default。 */
fun T(Key: String, Default: String): String {
var Cur: dynamic = Root
if (Cur == null) return Default
for (Part in Key.split('.')) {
if (Cur == null) return Default
Cur = Cur[Part]
if (Cur == null) return Default
}
return Cur as? String ?: Default
}
}