feat: sync force-quit Flow teardown and polish macOS local ASR UX

End Live Activities and release the audio session synchronously on
applicationWillTerminate, and continue macOS local-model install,
onboarding, and settings polish on this branch.
This commit is contained in:
Rocky
2026-07-09 17:13:07 +08:00
parent 200265fbd6
commit dcb66a9849
34 changed files with 1936 additions and 340 deletions
+43 -4
View File
@@ -162,6 +162,10 @@
"mac.settings.localSpeechFallback" = "Local Recognition (Apple Speech)";
"mac.settings.localSpeechFallbackDesc" = "On-device Apple Speech when the Qwen3 model is not installed.";
"mac.settings.about" = "About";
"mac.settings.privacyPolicy" = "Privacy Policy";
"mac.settings.thirdPartyLicenses" = "Third-Party Licenses";
"mac.settings.licenses.footer" = "Open-source components used by OSGKeyboard. License texts are reproduced from upstream repositories; model weights are downloaded at runtime and cached on device. OSGKeyboard itself is source-available — commercial licensing: rocky.hk@gmail.com.";
"mac.settings.restartOnboarding" = "Restart First-Run Setup";
"mac.settings.general" = "General";
"mac.settings.input" = "Input & Shortcuts";
"mac.settings.recognitionLanguage" = "Recognition Language";
@@ -185,14 +189,48 @@
"mac.appearance.system" = "System";
"mac.appearance.light" = "Light";
"mac.appearance.dark" = "Dark";
"mac.onboarding.progress" = "Step %lld of %lld";
"mac.onboarding.back" = "Back";
"mac.onboarding.next" = "Next";
"mac.onboarding.finish" = "Finish";
"mac.onboarding.skipForNow" = "Skip for now";
"mac.onboarding.welcome.title" = "Welcome to OSGKeyboard";
"mac.onboarding.welcome.subtitle" = "Set up dictation in a minute. Everything here can be changed later in Settings.";
"mac.onboarding.welcome.privacy" = "Your voice stays local unless you choose a cloud provider.";
"mac.onboarding.welcome.hotkey" = "Hold Option to dictate from any app.";
"mac.onboarding.welcome.local" = "Local Sherpa recognition can be prepared now or later.";
"mac.onboarding.microphone.title" = "Allow microphone access";
"mac.onboarding.microphone.subtitle" = "OSGKeyboard needs the microphone to capture your dictation audio.";
"mac.onboarding.microphone.allow" = "Allow Microphone";
"mac.onboarding.microphone.granted" = "Microphone access is granted.";
"mac.onboarding.microphone.needed" = "Microphone access is needed for recording.";
"mac.onboarding.accessibility.title" = "Enable Accessibility";
"mac.onboarding.accessibility.subtitle" = "Accessibility lets OSGKeyboard listen for the global shortcut and paste text into the front app. You can skip it and grant it later.";
"mac.onboarding.accessibility.open" = "Open System Settings";
"mac.onboarding.accessibility.granted" = "Accessibility permission is granted.";
"mac.onboarding.accessibility.needed" = "Accessibility is not enabled yet.";
"mac.onboarding.engine.title" = "Choose a recognition path";
"mac.onboarding.engine.subtitle" = "Start locally for privacy, or use your own cloud API for provider-based recognition and polish.";
"mac.onboarding.engine.localDesc" = "Private on-device recognition with Sherpa models. Falls back to Apple Speech until a model is installed.";
"mac.onboarding.engine.cloudDesc" = "Use your API key for cloud speech recognition and AI polishing.";
"mac.onboarding.cloud.title" = "Configure API access";
"mac.onboarding.cloud.subtitle" = "Pick a provider and add your key. This step is optional, so you can finish now and fill it later in Settings.";
"mac.onboarding.cloud.skipHint" = "You can leave these blank and finish setup; cloud mode will ask for a key before use.";
"mac.onboarding.model.title" = "Prepare local recognition";
"mac.onboarding.model.subtitle" = "Download the basic Sherpa runtime and default model now, or skip and continue with Apple Speech fallback.";
"mac.onboarding.model.download" = "Download Default Model";
"mac.onboarding.model.done" = "Local model is ready.";
"mac.onboarding.model.skipHint" = "Skipping is safe: Settings keeps the same download controls for later.";
"mac.onboarding.popover.title" = "Finish setup";
"mac.onboarding.popover.subtitle" = "Open the main window to choose permissions, API settings, and local model download.";
"mac.error.noAudio" = "No audio captured";
"mac.error.noCloudASR" = "Selected provider has no cloud ASR";
"mac.error.emptyTranscript" = "No speech recognized";
"mac.error.qwen3ModelMissing" = "Qwen3-ASR model not installed";
"mac.error.qwen3LoadFailed" = "Failed to load Qwen3 model: %@";
"mac.error.qwen3InferenceFailed" = "Qwen3 transcription failed: %@";
"mac.localASR.models" = "Local ASR Models";
"mac.localASR.modelsDesc" = "Sherpa models download directly. For MLX Qwen3, drop your converted weights into the folder opened by “Open folder”. All three share one storage directory.";
"mac.localASR.models" = "Local ASR Engine & Models";
"mac.localASR.modelsDesc" = "Models download directly. China uses ModelScope first; elsewhere Hugging Face first, then GitHub. Qwen3 1.7B downloads as multiple files.";
"mac.localASR.download" = "Download";
"mac.localASR.selectFolder" = "Choose folder";
"mac.localASR.openFolder" = "Open folder";
@@ -202,6 +240,7 @@
"mac.localASR.installDone" = "Install completed.";
"mac.localASR.installed" = "Installed";
"mac.localASR.notInstalled" = "Not installed";
"mac.localASR.personalDictionaryTag" = "Personal dictionary";
"mac.localASR.hotwordsYes" = "Hotwords";
"mac.localASR.hotwordsNo" = "No hotwords";
"mac.localASR.catalogMissing" = "Local ASR catalog is missing from the app bundle.";
@@ -219,8 +258,8 @@
"mac.localASR.redownload" = "Re-download";
"mac.localASR.revealInFinder" = "Reveal in Finder";
"mac.localASR.openStorage" = "Open model storage folder";
"mac.localASR.runtime" = "Sherpa Runtime";
"mac.localASR.runtimeDesc" = "Required for Sherpa Qwen3 and SenseVoice models. Installed automatically with those models.";
"mac.localASR.runtime" = "Local ASR runtime";
"mac.localASR.runtimeDesc" = "Installed automatically with the models above; required for Qwen3, SenseVoice, and similar models.";
"mac.localASR.phase.downloading" = "Downloading";
"mac.localASR.phase.paused" = "Paused";
"mac.localASR.phase.extracting" = "Extracting";