52 lines
1.6 KiB
Kotlin
52 lines
1.6 KiB
Kotlin
// 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
|
||
}
|
||
}
|