Files
keyboard/docs/keyboard-language-layout-handover.md

300 lines
9.5 KiB
Markdown
Raw Normal View History

2026-03-02 09:19:06 +08:00
# Keyboard 多语言/多布局功能交接文档(给下一个 AI
## 1. 背景与目标
### 1.1 需求目标
主 App 需要支持:
1. 新增语言:西班牙语、葡萄牙语、繁体中文、印尼语。
2. 切换语言时,键盘输入配置(语言 + 布局)同步切换。
3. 支持多布局语言:
- 西班牙语:`QWERTY / AZERTY / QWERTZ`
- 繁体中文(台湾):`拼音(繁体) / 注音全键盘 / 注音标准`
4. 主 App 切换语言后给键盘扩展下发该语言默认皮肤zip 方案)。
5. 交互要求(最新确认):
-`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_SelectedKeyboardProfileId`
- `AppGroup_SelectedKeyboardLanguageCode`
- `AppGroup_SelectedKeyboardLayoutVariant`
用于主 App 写入、扩展读取当前输入配置。
---
### 2.3 个人资料页接入“输入语言”流程(含二级布局页 + Confirm 交互)
#### 文件
- `/Users/mac/Desktop/项目/公司/KeyBoard/keyBoard/Class/Me/VC/KBPersonInfoVC.m`
#### 已做内容
1. 在 section0 新增一行:`Input Language`
2. 在该文件内新增两个页面类(当前是内嵌实现):
- `KBKeyboardLanguageSelectVC`
- `KBKeyboardLayoutSelectVC`
3. 交互逻辑改为“先选后确认”:
- 点击列表项仅更新 pending 选中态。
- 仅点击底部 `Confirm` 才触发 `onSelect`
4. 语言页按钮显示规则:
- 单布局语言:显示 `Confirm`
- 多布局语言:隐藏 `Confirm`,进入布局页。
5. 选择确认后执行主流程:
- 写 App Group`languageCode + layoutVariant + profileId`
- `[[KBLocalizationManager shared] setCurrentLanguageCode: persist:YES]`
- 下发默认皮肤请求(`KBSkinInstallBridge publishBundleSkinRequestWithId`
- 提示后调用 `setupRootVC` 重建首页。
---
### 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` 方法。
### 已配置项
1. `English`:
- `en_US_qwerty`
2. `Español`:
- `es_ES_qwerty`
- `es_ES_azerty`
- `es_ES_qwertz`
3. `Português`:
- `pt_PT_qwerty`
4. `繁體中文(台灣)`:
- `zh_Hant_TW_pinyin`
- `zh_Hant_TW_bopomofo_full`
- `zh_Hant_TW_bopomofo_standard`
5. `Bahasa Indonesia`:
- `id_ID_qwerty`
---
## 4. 默认皮肤下发(当前已接)
#### 入口
`KBPersonInfoVC.m` -> `publishDefaultSkinIfNeededForLanguageCode:`
#### 当前映射
- `zh-Hant` -> `normal_hei_them.zip`
- `es/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`,并加载实际键盘布局。
#### 建议实现
1. 新建 `KBKeyboardLayoutResolver`(扩展侧)
- 输入:`profileId`
- 输出:`layoutConfigName`(或 JSON 节点路径)
2. 修改布局加载入口(建议)
- `CustomKeyboard/View/KBKeyboardView.m`
- `CustomKeyboard/KeyboardViewControllerHelp/KeyboardViewController+Layout.m`
3. 更新布局配置 JSON
- `/Users/mac/Desktop/项目/公司/KeyBoard/CustomKeyboard/Resource/kb_keyboard_layout_config.json`
- 补齐:
- `latin_es_qwerty`
- `latin_es_azerty`
- `latin_es_qwertz`
- `zh_hant_pinyin_qwerty`
- `zh_hant_bpmf_full`
- `zh_hant_bpmf_standard`
---
### 5.2 繁体联想引擎分流(重点)
#### 现状风险
当前联想引擎偏英文/拉丁逻辑,繁体注音联想未打通。
#### 目标
- `zh_Hant_TW_pinyin` -> 繁体拼音联想引擎
- `zh_Hant_TW_bopomofo_*` -> 注音联想引擎
#### 建议改动位置
- `CustomKeyboard/Manager/KBSuggestionEngine.m`
- `CustomKeyboard/KeyboardViewControllerHelp/KeyboardViewController+Suggestions.m`
---
### 5.3 InputProfile 配置中心外置(技术债)
#### 现状
配置硬编码在 `KBPersonInfoVC.m`,不利于扩展复用。
#### 建议
1. 新建共享配置文件:
- `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Resource/kb_input_profiles.json`
2. 新建管理器:
- `KBInputProfileManager`Shared
3. 主 App 与扩展统一走此管理器,避免重复映射。
---
### 5.4 本地化资源补齐
#### 现状
`en/zh-Hans` 两套 strings 完整。新增语言目录尚未补齐。
#### 待办
新增并接入:
- `es.lproj`
- `pt.lproj`
- `zh-Hant.lproj`
- `id.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
1. **先做扩展布局切换最小闭环**
- 扩展读取 `profileId`
- 根据映射切换到不同布局 JSON
2. **再做繁体联想分流**
- pinyin_traditional / bopomofo 两套策略
3. **再做配置中心外置**
- 把硬编码配置迁移到 `Shared/Resource/kb_input_profiles.json`
4. **最后补齐多语言 strings + 工程配置**
- 避免 UI 出现 key 原样文本
---
## 8. 回归测试清单(手测)
### 8.1 主流程
1. 进入个人资料页,看到 `Input Language` 行。
2. 进入语言页,选单布局语言(如葡语):
- 底部 `Confirm` 显示
- 点击语言行不触发切换
- 点击 `Confirm` 后才触发切换
3. 进入语言页,选多布局语言(如西语/繁体):
- 底部 `Confirm` 隐藏
- 进入 `Choose Layout`
-`Choose Layout` 点击布局行不触发切换
- 点击 `Confirm` 后才触发切换
### 8.2 数据落盘
确认 App Group 键值写入:
- `AppGroup_SelectedKeyboardLanguageCode`
- `AppGroup_SelectedKeyboardLayoutVariant`
- `AppGroup_SelectedKeyboardProfileId`
### 8.3 皮肤请求
切语言后确认已发布 pending 皮肤请求(扩展可消费)。
### 8.4 异常回退
- profileId 空值
- layoutVariant 空值
- zip 名不存在
都不应导致崩溃。
---
## 9. 已知问题 / 风险
1. 目前语言配置写在 `KBPersonInfoVC.m`,应尽快抽离。
2. 扩展侧尚未接 profileId -> layout JSON当前只是主 App 流程完成。
3. 本次环境无法可靠运行 xcodebuild 完整编译验证(沙箱限制)。
4. `KBLocalized(@"Choose")` 在现有 strings 中可能无 key可能出现英文 key 原样显示(建议补 key
---
## 10. 本次变更文件清单
1. `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBConfig.h`
2. `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.h`
3. `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/KBLocalizationManager.m`
4. `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/en.lproj/Localizable.strings`
5. `/Users/mac/Desktop/项目/公司/KeyBoard/Shared/Localization/zh-Hans.lproj/Localizable.strings`
6. `/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`。”