9.5 KiB
Keyboard 多语言/多布局功能交接文档(给下一个 AI)
1. 背景与目标
1.1 需求目标
主 App 需要支持:
- 新增语言:西班牙语、葡萄牙语、繁体中文、印尼语。
- 切换语言时,键盘输入配置(语言 + 布局)同步切换。
- 支持多布局语言:
- 西班牙语:
QWERTY / AZERTY / QWERTZ - 繁体中文(台湾):
拼音(繁体) / 注音全键盘 / 注音标准
- 西班牙语:
- 主 App 切换语言后,给键盘扩展下发该语言默认皮肤(zip 方案)。
- 交互要求(最新确认):
- 在
Input Language界面:- 若该语言无多布局:底部显示
Confirm,点击后才生效。 - 若该语言有多布局:隐藏
Confirm,进入Choose Layout。
- 若该语言无多布局:底部显示
- 在
Choose Layout界面:底部显示Confirm,点击后才生效。 - 只有点击
Confirm才触发切换逻辑。
- 在
2. 当前已完成内容(本次已落地)
说明:下面这些改动已经在代码中完成。
2.1 语言常量与默认支持语言扩展
文件
/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.h/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.m
已做内容
新增语言常量:
KBLanguageCodeTraditionalChinese = @"zh-Hant"KBLanguageCodeSpanish = @"es"KBLanguageCodePortuguese = @"pt"KBLanguageCodeIndonesian = @"id"
并扩展 KBDefaultSupportedLanguageCodes():
en, zh-Hans, zh-Hant, es, pt, id
2.2 App Group 键盘配置键新增
文件
/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBConfig.h
已做内容
新增共享键:
AppGroup_SelectedKeyboardProfileIdAppGroup_SelectedKeyboardLanguageCodeAppGroup_SelectedKeyboardLayoutVariant
用于主 App 写入、扩展读取当前输入配置。
2.3 个人资料页接入“输入语言”流程(含二级布局页 + Confirm 交互)
文件
/Users/mac/Desktop/项目/公司/KeyBoard/keyBoard/Class/Me/VC/KBPersonInfoVC.m
已做内容
- 在 section0 新增一行:
Input Language。 - 在该文件内新增两个页面类(当前是内嵌实现):
KBKeyboardLanguageSelectVCKBKeyboardLayoutSelectVC
- 交互逻辑改为“先选后确认”:
- 点击列表项仅更新 pending 选中态。
- 仅点击底部
Confirm才触发onSelect。
- 语言页按钮显示规则:
- 单布局语言:显示
Confirm。 - 多布局语言:隐藏
Confirm,进入布局页。
- 单布局语言:显示
- 选择确认后执行主流程:
- 写 App Group:
languageCode + layoutVariant + profileId [[KBLocalizationManager shared] setCurrentLanguageCode: persist:YES]- 下发默认皮肤请求(
KBSkinInstallBridge publishBundleSkinRequestWithId) - 提示后调用
setupRootVC重建首页。
- 写 App Group:
2.4 新增文案 key(中英文)
文件
/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/en.lproj/Localizable.strings/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/zh-Hans.lproj/Localizable.strings
已做内容
新增:
"Input Language""Choose Layout""Multiple Keyboard Layouts"
3. 当前实现的配置模型(暂时硬编码在 VC)
当前为快速落地,语言-布局-profile 映射硬编码在
KBPersonInfoVC.m的languageConfigs方法。
已配置项
English:en_US_qwerty
Español:es_ES_qwertyes_ES_azertyes_ES_qwertz
Português:pt_PT_qwerty
繁體中文(台灣):zh_Hant_TW_pinyinzh_Hant_TW_bopomofo_fullzh_Hant_TW_bopomofo_standard
Bahasa Indonesia:id_ID_qwerty
4. 默认皮肤下发(当前已接)
入口
KBPersonInfoVC.m -> publishDefaultSkinIfNeededForLanguageCode:
当前映射
zh-Hant->normal_hei_them.zipes/pt/id/en->normal_them.zip
调用方式
通过:
KBSkinInstallBridge publishBundleSkinRequestWithId:name:zipName:iconShortNames:
注意:这是“发布请求”,扩展侧消费请求逻辑在现有 Theme 类中已存在。
5. 尚未完成(必须由下一个 AI 继续)
目前只完成了“主 App 选择流程 + 数据写入 + 皮肤请求发布”。 扩展侧还没有按
profileId真正切换键盘 JSON 布局。
5.1 扩展按 profileId 加载布局 JSON(核心待办)
目标
扩展读取 App Group 的:
AppGroup_SelectedKeyboardProfileId
然后路由到对应 layoutJsonId,并加载实际键盘布局。
建议实现
- 新建
KBKeyboardLayoutResolver(扩展侧)- 输入:
profileId - 输出:
layoutConfigName(或 JSON 节点路径)
- 输入:
- 修改布局加载入口(建议)
CustomKeyboard/View/KBKeyboardView.mCustomKeyboard/KeyboardViewControllerHelp/KeyboardViewController+Layout.m
- 更新布局配置 JSON
/Users/mac/Desktop/项目/公司/KeyBoard/CustomKeyboard/Resource/kb_keyboard_layout_config.json- 补齐:
latin_es_qwertylatin_es_azertylatin_es_qwertzzh_hant_pinyin_qwertyzh_hant_bpmf_fullzh_hant_bpmf_standard
5.2 繁体联想引擎分流(重点)
现状风险
当前联想引擎偏英文/拉丁逻辑,繁体注音联想未打通。
目标
zh_Hant_TW_pinyin-> 繁体拼音联想引擎zh_Hant_TW_bopomofo_*-> 注音联想引擎
建议改动位置
CustomKeyboard/Manager/KBSuggestionEngine.mCustomKeyboard/KeyboardViewControllerHelp/KeyboardViewController+Suggestions.m
5.3 InputProfile 配置中心外置(技术债)
现状
配置硬编码在 KBPersonInfoVC.m,不利于扩展复用。
建议
- 新建共享配置文件:
/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Resource/kb_input_profiles.json
- 新建管理器:
KBInputProfileManager(Shared)
- 主 App 与扩展统一走此管理器,避免重复映射。
5.4 本地化资源补齐
现状
仅 en/zh-Hans 两套 strings 完整。新增语言目录尚未补齐。
待办
新增并接入:
es.lprojpt.lprojzh-Hant.lprojid.lproj
并在 project.pbxproj 中更新 knownRegions 与变体组。
6. 关键行为说明(给接手 AI)
6.1 触发逻辑时机
- 现在是“仅 Confirm 才触发”。
- 禁止在
didSelectRowAtIndexPath里直接调用最终切换。
6.2 导航回退逻辑
openLanguageSelector里vc.onSelect会回调到KBPersonInfoVC并执行:applyInputProfileWithLanguageCode:layoutVariant:profileId:popToViewController:weakSelf
6.3 兼容注意
- 如果 profile 不合法要回退到
en_US_qwerty。 - 如果布局 JSON 不存在,不要崩溃,回退默认布局。
- 皮肤 zip 缺失时不阻断输入流程。
7. 建议下一步实施顺序(给下一个 AI)
- 先做扩展布局切换最小闭环
- 扩展读取
profileId - 根据映射切换到不同布局 JSON
- 扩展读取
- 再做繁体联想分流
- pinyin_traditional / bopomofo 两套策略
- 再做配置中心外置
- 把硬编码配置迁移到
Shared/Resource/kb_input_profiles.json
- 把硬编码配置迁移到
- 最后补齐多语言 strings + 工程配置
- 避免 UI 出现 key 原样文本
8. 回归测试清单(手测)
8.1 主流程
- 进入个人资料页,看到
Input Language行。 - 进入语言页,选单布局语言(如葡语):
- 底部
Confirm显示 - 点击语言行不触发切换
- 点击
Confirm后才触发切换
- 底部
- 进入语言页,选多布局语言(如西语/繁体):
- 底部
Confirm隐藏 - 进入
Choose Layout - 在
Choose Layout点击布局行不触发切换 - 点击
Confirm后才触发切换
- 底部
8.2 数据落盘
确认 App Group 键值写入:
AppGroup_SelectedKeyboardLanguageCodeAppGroup_SelectedKeyboardLayoutVariantAppGroup_SelectedKeyboardProfileId
8.3 皮肤请求
切语言后确认已发布 pending 皮肤请求(扩展可消费)。
8.4 异常回退
- profileId 空值
- layoutVariant 空值
- zip 名不存在 都不应导致崩溃。
9. 已知问题 / 风险
- 目前语言配置写在
KBPersonInfoVC.m,应尽快抽离。 - 扩展侧尚未接 profileId -> layout JSON,当前只是主 App 流程完成。
- 本次环境无法可靠运行 xcodebuild 完整编译验证(沙箱限制)。
KBLocalized(@"Choose")在现有 strings 中可能无 key,可能出现英文 key 原样显示(建议补 key)。
10. 本次变更文件清单
/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBConfig.h/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.h/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.m/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/en.lproj/Localizable.strings/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/zh-Hans.lproj/Localizable.strings/Users/mac/Desktop/项目/公司/KeyBoard/keyBoard/Class/Me/VC/KBPersonInfoVC.m
11. 给下一个 AI 的一句话任务描述(可直接复制)
“请基于现有主 App 已完成的语言/布局选择与 Confirm 触发流程,继续完成扩展侧按 AppGroup_SelectedKeyboardProfileId 切换键盘 JSON 布局,并实现繁体拼音与注音(全键盘/标准)的联想引擎分流,同时将 KBPersonInfoVC.m 中硬编码语言配置抽离到 Shared/Resource/kb_input_profiles.json + KBInputProfileManager。”