Files
keyboard/docs/keyboard-language-layout-handover.md
2026-03-02 09:19:06 +08:00

300 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`。”