feat: cursor navigation, key sounds, dictionary tooling, key security

Batch of in-progress app work from the working tree.

- feat(keyboard): CursorNavigation + CursorDragPad for caret movement;
  KeyboardSoundFeedback for system key click sounds
- feat(dictionary): DictionaryAliasGenerator + PersonalDictionaryEntrySheet;
  TranscriptPostProcessor quality gate; retire DictionaryLearner
- feat(ui): TabBarVisibility handling; drop PageHeaderRow /
  PageHeaderConfirmButton; refresh views and localizable strings
- fix(security): move the hardcoded DeepSeek key out of
  PreconfiguredKeys.swift into a gitignored PreconfiguredKeys.local.swift
  (seeded from .example by generate-xcodeproj.sh)
- docs(agents): add Conventional Commits versioning + bilingual changelog rules
- chore(gitignore): ignore PreconfiguredKeys.local.swift, .cache/, pycache

Custom language model / lexicon work stays on
feature/custom-language-model-asr. Changelog bullets added under
[Unreleased]; no version bump.
This commit is contained in:
Rocky
2026-07-05 18:27:23 +08:00
parent 074e24d87f
commit 05e005e9ce
60 changed files with 3247 additions and 1388 deletions
+15 -4
View File
@@ -29,7 +29,7 @@
"onboarding.enable.step3.suffix" = "and select OSGKeyboard";
"onboarding.enable.openSettings" = "Open Settings";
"onboarding.api.title" = "Choose Engine";
"onboarding.api.localModels.hint" = "Download the on-device CoreML ASR model below before you finish setup (only needed when using Qwen3-ASR).";
"onboarding.api.localModels.hint" = "Local engine uses built-in on-device speech recognition and built-in polish — no API key needed.";
"settings.onboarding.replay" = "Restart permission setup";
/* Common navigation */
@@ -39,6 +39,7 @@
"common.continue" = "Continue";
"common.reset" = "Reset";
"common.cancel" = "Cancel";
"common.save" = "Save";
"common.clear" = "Clear";
"common.delete" = "Delete";
"common.space" = "Space";
@@ -119,7 +120,10 @@
"settings.languageModels.title" = "Language & models";
"settings.localModels.title" = "On-device models";
"settings.localModels.speechRole" = "Speech";
"settings.localModels.polishRole" = "Polish";
"settings.localModels.builtIn" = "Built-in";
"settings.localModels.speechEngine" = "Apple iOS Speech";
"settings.localModels.polishEngine" = "OSGKeyboard Built-in";
"settings.localModels.allReady" = "Ready";
"settings.localModels.readiness %lld %lld" = "%lld/%lld ready";
"settings.localModels.cloudPolish.title" = "Cloud polish after ASR";
@@ -139,6 +143,7 @@
"settings.handedness.title" = "Handedness";
"settings.handedness.left" = "Left hand";
"settings.handedness.right" = "Right hand";
"settings.cursorDragNavigation.title" = "Drag beside mic to move cursor";
"settings.systemPrompt.reset" = "Reset";
"settings.asrLocale" = "ASR locale";
"settings.engineBadge.ios26" = "SpeechAnalyzer — always on-device";
@@ -308,6 +313,7 @@
/* Tabs */
"tab.keyboard" = "Keyboard";
"tab.history" = "History";
"tab.dictionary" = "Dictionary";
"tab.settings" = "Settings";
/* History */
@@ -335,12 +341,17 @@
"settings.personalDictionary.sectionTitle" = "Personal dictionary";
"settings.personalDictionary.title" = "Personal dictionary";
"settings.personalDictionary.summary" = "Words the LLM must preserve verbatim when polishing.";
"settings.personalDictionary.intro.title" = "How words get added";
"settings.personalDictionary.intro.body" = "Words you dictate repeatedly are auto-learned. You can also edit or delete any entry here.";
"settings.personalDictionary.intro.title" = "About your dictionary";
"settings.personalDictionary.intro.body" = "Add words manually. Common speech-recognition mishearings are generated automatically after you save. Tap a word to edit.";
"settings.personalDictionary.empty.title" = "No words yet";
"settings.personalDictionary.empty.body" = "Words you dictate often will appear here. You can also delete any entry from this screen.";
"settings.personalDictionary.empty.body" = "Add words you want protected during speech correction.";
"settings.personalDictionary.search.prompt" = "Search words";
"settings.personalDictionary.usageCount" = "%lld uses";
"settings.personalDictionary.add.title" = "Add word";
"settings.personalDictionary.edit.title" = "Edit word";
"settings.personalDictionary.add.field" = "Word";
"settings.personalDictionary.add.footer" = "Common speech-recognition mishearings are generated automatically after you save.";
"settings.personalDictionary.aliases.generating" = "Generating aliases…";
"settings.personalDictionary.clearAll" = "Clear dictionary";
"settings.personalDictionary.clearAll.confirmTitle" = "Clear all dictionary words?";
"settings.personalDictionary.clearAll.message" = "This removes every word the LLM was protecting. This cannot be undone.";