Ariver
2026-06-03 94992b563fdfddce683fc07ef5bb70e18ff910fe
privatevoice.src/frontend/src/App.svelte
@@ -9,11 +9,20 @@
  import { indicatorVisible, indicatorStatus, indicatorVolume, hotkeyName } from './lib/stores/indicator'
  import { updateAvailable, type UpdateInfo } from './lib/stores/update'
  import { deviceName, engineHardwareInfo } from './lib/stores/app'
  import { setLocale, localeRevision } from './lib/i18n'
  import { languageMode, languageID, effectiveLanguageID, uiLocale } from './lib/stores/config'
  let isIndicatorRoute = $state(window.location.hash === '#/indicator')
  let showUpdateDialog = $state(false)
  let languageReady = $state(false)
  onMount(() => {
    Call.ByName('voicesnap/services.ConfigService.GetLanguageSettings').then((settings: any) => {
      applyLanguageSettings(settings)
    }).catch(() => {
      languageReady = true
    })
    Events.On('indicator:show', (ev: any) => {
      indicatorVisible.set(true)
      if (ev?.data?.status) {
@@ -75,11 +84,7 @@
      }
    })
    Call.ByName('voicesnap/services.EngineService.ModelExists').then((exists: any) => {
      if (!exists) {
        engineStatus.set('need_model')
      }
    })
    refreshCurrentModelAvailability()
    // Load actual hotkey name from backend (store default is generic "Ctrl")
    Call.ByName('voicesnap/services.HotkeyService.GetHotkeyName').then((name: any) => {
@@ -88,15 +93,48 @@
      }
    })
  })
  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'
    languageMode.set(mode)
    languageID.set(configured)
    effectiveLanguageID.set(effective)
    uiLocale.set(locale)
    setLocale(locale)
    languageReady = true
  }
  async function refreshCurrentModelAvailability() {
    try {
      const current: any = await Call.ByName('voicesnap/services.EngineService.GetCurrentModelStatus')
      if (!current?.installed) {
        engineStatus.set('need_model')
      }
    } catch {
      try {
        const exists: any = await Call.ByName('voicesnap/services.EngineService.ModelExists')
        if (!exists) {
          engineStatus.set('need_model')
        }
      } catch {}
    }
  }
</script>
{#if isIndicatorRoute}
  <FloatingIndicator />
{:else}
  {#if $engineStatus === 'need_model'}
    <OnboardingView />
  {:else}
    <SettingsWindow />
  {#if languageReady}
    {#key $localeRevision}
      {#if $engineStatus === 'need_model'}
        <OnboardingView />
      {:else}
        <SettingsWindow />
      {/if}
    {/key}
  {/if}
  {#if showUpdateDialog && $updateAvailable}