国际化
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 = "好的")),
),
) { … }字符串按域分组(common、theme、field、dateTime、feedback、media、guide),每个域是一个 @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-US | English(回退语言) |
zh-Hans | 简体中文 |
zh-Hant | 繁體中文 |
标签进来时会被规范化,zh_CN、zh-CN、zh-Hans 都解析到简体中文包。其他语言通过 stringsOverrides 为对应标签提供一份 Strings 即可;下游库以同样方式添加自己的语言,不受这张表限制。
