Skip to content

国际化

GearUI Kit 自带组件内部文案(「确定」「取消」、空状态文字、选择器标题)的字符串,按 BCP 47 语言标签解析,并允许下游库把自己的强类型语言包挂到同一个环境上。App 只设一次语言。

设置语言

kotlin
App(
    languageTag = "zh-Hans",          // BCP 47;"en-US"、"zh-Hant"、…
    fallbackLanguageTag = "en-US",    // languageTag 没有匹配语言包时的回退
) { … }

languageTag,整棵树里所有字符串更新。没有任何东西需要重载。

覆盖内置文案

字段级、按语言,不用 fork 整个语言包:

kotlin
App(
    languageTag = "zh-Hans",
    stringsOverrides = mapOf(
        "zh-Hans" to StringsPatch(common = CommonStringsPatch(confirm = "好的")),
    ),
) { … }

字符串按分组(commonthemefielddateTimefeedbackmediaguide),每个域是一个 @Immutable data class,配一个字段全可空的 …Patch。这不只是为了整洁:一个把所有字符串塞进去的扁平类会撞上 Android 的 255 构造参数上限和 DEX 方法数上限。拆分是硬性要求。

在自己的代码里读字符串

kotlin
val strings = I18n.strings          // composition 内
Text(strings.buttonConfirm)

下游库

如果你在 GearUI Kit 之上写一个库(产品 UI 层、品牌主题包),不要向 App 索要语言标签。读 App 已经提供的那个:

kotlin
@Composable
fun MyLibI18nProvider(overrides: Map<String, MyLibStringsPatch> = emptyMap(), content: @Composable () -> Unit) {
    val tag = LocalLanguageTag.current
    val fallback = LocalFallbackLanguageTag.current
    val strings = remember(tag, fallback, overrides) {
        resolveLanguagePack(tag, MyLibStringPacks.builtIn, fallback).merge(overrides)
    }
    CompositionLocalProvider(LocalMyLibStrings provides strings, content = content)
}

挂在 App 之内、你的页面之外。这样语言切换自动到达你的库,App 也永远不用把标签传第二遍。完整步骤见仓库里的 docs/I18N_INTEGRATION.md

内置语言

标签
en-USEnglish(回退语言)
zh-Hans简体中文
zh-Hant繁體中文

标签进来时会被规范化,zh_CNzh-CNzh-Hans 都解析到简体中文包。其他语言通过 stringsOverrides 为对应标签提供一份 Strings 即可;下游库以同样方式添加自己的语言,不受这张表限制。

GearUI Kit 基于 BSD 3-Clause 协议发布。