From fdc5c43b2cf8ebc3d67099cfba9936c838281561 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Tue, 30 Jun 2026 03:36:45 +0800
Subject: [PATCH] Add Windows QA evidence verifier

---
 privatevoice.src/frontend/src/App.svelte |   33 ++++++++++++++++++++++++++-------
 1 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/privatevoice.src/frontend/src/App.svelte b/privatevoice.src/frontend/src/App.svelte
index d0bfc4e..8406d60 100755
--- a/privatevoice.src/frontend/src/App.svelte
+++ b/privatevoice.src/frontend/src/App.svelte
@@ -11,10 +11,12 @@
   import { deviceName, engineHardwareInfo } from './lib/stores/app'
   import { setLocale, localeRevision } from './lib/i18n'
   import { languageMode, languageID, effectiveLanguageID, uiLocale } from './lib/stores/config'
+  import type { UILocale } from './lib/stores/config'
 
   let isIndicatorRoute = $state(window.location.hash === '#/indicator')
   let showUpdateDialog = $state(false)
   let languageReady = $state(false)
+  let showOnboarding = $state(false)
 
   onMount(() => {
     Call.ByName('voicesnap/services.ConfigService.GetLanguageSettings').then((settings: any) => {
@@ -52,6 +54,9 @@
       const data = ev?.data
       if (data?.status) {
         engineStatus.set(data.status as any)
+        if (data.status === 'ready') {
+          showOnboarding = false
+        }
       }
       if (data?.hardwareInfo) {
         engineHardwareInfo.set(data.hardwareInfo)
@@ -78,6 +83,9 @@
     Call.ByName('voicesnap/services.EngineService.GetStatus').then((data: any) => {
       if (data?.status) {
         engineStatus.set(data.status as any)
+        if (data.status === 'ready') {
+          showOnboarding = false
+        }
       }
       if (data?.hardwareInfo) {
         engineHardwareInfo.set(data.hardwareInfo)
@@ -96,13 +104,13 @@
 
   function applyLanguageSettings(settings: any) {
     const mode = settings?.languageMode === 'manual' ? 'manual' : 'auto'
-    const configured = settings?.languageID === 'en' ? 'en' : 'zh-CN'
-    const effective = settings?.effectiveLanguageID === 'en' ? 'en' : 'zh-CN'
-    const locale = settings?.uiLocale === 'en' ? 'en' : 'zh'
+    const configured = typeof settings?.languageID === 'string' && settings.languageID ? settings.languageID : 'zh-CN'
+    const effective = typeof settings?.effectiveLanguageID === 'string' && settings.effectiveLanguageID ? settings.effectiveLanguageID : configured
+    const locale = typeof settings?.uiLocale === 'string' && settings.uiLocale ? settings.uiLocale : 'en'
     languageMode.set(mode)
     languageID.set(configured)
     effectiveLanguageID.set(effective)
-    uiLocale.set(locale)
+    uiLocale.set(locale as UILocale)
     setLocale(locale)
     languageReady = true
   }
@@ -111,13 +119,24 @@
     try {
       const current: any = await Call.ByName('voicesnap/services.EngineService.GetCurrentModelStatus')
       if (!current?.installed) {
-        engineStatus.set('need_model')
+        const hasAnyInstalled: any = await Call.ByName('voicesnap/services.EngineService.HasAnyInstalledModel')
+        showOnboarding = !hasAnyInstalled
+        if (!hasAnyInstalled) {
+          engineStatus.set('need_model')
+        }
+      } else {
+        showOnboarding = false
       }
     } catch {
       try {
         const exists: any = await Call.ByName('voicesnap/services.EngineService.ModelExists')
         if (!exists) {
-          engineStatus.set('need_model')
+          const hasAnyInstalled: any = await Call.ByName('voicesnap/services.EngineService.HasAnyInstalledModel')
+            .catch(() => false)
+          showOnboarding = !hasAnyInstalled
+          if (!hasAnyInstalled) {
+            engineStatus.set('need_model')
+          }
         }
       } catch {}
     }
@@ -129,7 +148,7 @@
 {:else}
   {#if languageReady}
     {#key $localeRevision}
-      {#if $engineStatus === 'need_model'}
+      {#if showOnboarding && $engineStatus === 'need_model'}
         <OnboardingView />
       {:else}
         <SettingsWindow />

--
Gitblit v1.9.3