Ariver
2026-07-02 0ffbf1935c9d091cce22a5583275ac0902f7a693
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 />