add experimental features to ui + reorg everything (#620)

This commit is contained in:
CJ Pais 2026-01-19 10:33:04 +08:00 committed by GitHub
parent f9d2aa68c3
commit 28d1d814b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 311 additions and 84 deletions

View file

@ -252,6 +252,7 @@ pub fn run() {
shortcut::change_paste_method_setting, shortcut::change_paste_method_setting,
shortcut::change_clipboard_handling_setting, shortcut::change_clipboard_handling_setting,
shortcut::change_post_process_enabled_setting, shortcut::change_post_process_enabled_setting,
shortcut::change_experimental_enabled_setting,
shortcut::change_post_process_base_url_setting, shortcut::change_post_process_base_url_setting,
shortcut::change_post_process_api_key_setting, shortcut::change_post_process_api_key_setting,
shortcut::change_post_process_model_setting, shortcut::change_post_process_model_setting,

View file

@ -293,6 +293,8 @@ pub struct AppSettings {
pub append_trailing_space: bool, pub append_trailing_space: bool,
#[serde(default = "default_app_language")] #[serde(default = "default_app_language")]
pub app_language: String, pub app_language: String,
#[serde(default)]
pub experimental_enabled: bool,
} }
fn default_model() -> String { fn default_model() -> String {
@ -581,6 +583,7 @@ pub fn get_default_settings() -> AppSettings {
mute_while_recording: false, mute_while_recording: false,
append_trailing_space: false, append_trailing_space: false,
app_language: default_app_language(), app_language: default_app_language(),
experimental_enabled: false,
} }
} }

View file

@ -373,6 +373,15 @@ pub fn change_post_process_enabled_setting(app: AppHandle, enabled: bool) -> Res
Ok(()) Ok(())
} }
#[tauri::command]
#[specta::specta]
pub fn change_experimental_enabled_setting(app: AppHandle, enabled: bool) -> Result<(), String> {
let mut settings = settings::get_settings(&app);
settings.experimental_enabled = enabled;
settings::write_settings(&app, settings);
Ok(())
}
#[tauri::command] #[tauri::command]
#[specta::specta] #[specta::specta]
pub fn change_post_process_base_url_setting( pub fn change_post_process_base_url_setting(

View file

@ -133,6 +133,14 @@ async changePostProcessEnabledSetting(enabled: boolean) : Promise<Result<null, s
else return { status: "error", error: e as any }; else return { status: "error", error: e as any };
} }
}, },
async changeExperimentalEnabledSetting(enabled: boolean) : Promise<Result<null, string>> {
try {
return { status: "ok", data: await TAURI_INVOKE("change_experimental_enabled_setting", { enabled }) };
} catch (e) {
if(e instanceof Error) throw e;
else return { status: "error", error: e as any };
}
},
async changePostProcessBaseUrlSetting(providerId: string, baseUrl: string) : Promise<Result<null, string>> { async changePostProcessBaseUrlSetting(providerId: string, baseUrl: string) : Promise<Result<null, string>> {
try { try {
return { status: "ok", data: await TAURI_INVOKE("change_post_process_base_url_setting", { providerId, baseUrl }) }; return { status: "ok", data: await TAURI_INVOKE("change_post_process_base_url_setting", { providerId, baseUrl }) };
@ -640,7 +648,7 @@ async isLaptop() : Promise<Result<boolean, string>> {
/** user-defined types **/ /** user-defined types **/
export type AppSettings = { bindings: Partial<{ [key in string]: ShortcutBinding }>; push_to_talk: boolean; audio_feedback: boolean; audio_feedback_volume?: number; sound_theme?: SoundTheme; start_hidden?: boolean; autostart_enabled?: boolean; update_checks_enabled?: boolean; selected_model?: string; always_on_microphone?: boolean; selected_microphone?: string | null; clamshell_microphone?: string | null; selected_output_device?: string | null; translate_to_english?: boolean; selected_language?: string; overlay_position?: OverlayPosition; debug_mode?: boolean; log_level?: LogLevel; custom_words?: string[]; model_unload_timeout?: ModelUnloadTimeout; word_correction_threshold?: number; history_limit?: number; recording_retention_period?: RecordingRetentionPeriod; paste_method?: PasteMethod; clipboard_handling?: ClipboardHandling; post_process_enabled?: boolean; post_process_provider_id?: string; post_process_providers?: PostProcessProvider[]; post_process_api_keys?: Partial<{ [key in string]: string }>; post_process_models?: Partial<{ [key in string]: string }>; post_process_prompts?: LLMPrompt[]; post_process_selected_prompt_id?: string | null; mute_while_recording?: boolean; append_trailing_space?: boolean; app_language?: string } export type AppSettings = { bindings: Partial<{ [key in string]: ShortcutBinding }>; push_to_talk: boolean; audio_feedback: boolean; audio_feedback_volume?: number; sound_theme?: SoundTheme; start_hidden?: boolean; autostart_enabled?: boolean; update_checks_enabled?: boolean; selected_model?: string; always_on_microphone?: boolean; selected_microphone?: string | null; clamshell_microphone?: string | null; selected_output_device?: string | null; translate_to_english?: boolean; selected_language?: string; overlay_position?: OverlayPosition; debug_mode?: boolean; log_level?: LogLevel; custom_words?: string[]; model_unload_timeout?: ModelUnloadTimeout; word_correction_threshold?: number; history_limit?: number; recording_retention_period?: RecordingRetentionPeriod; paste_method?: PasteMethod; clipboard_handling?: ClipboardHandling; post_process_enabled?: boolean; post_process_provider_id?: string; post_process_providers?: PostProcessProvider[]; post_process_api_keys?: Partial<{ [key in string]: string }>; post_process_models?: Partial<{ [key in string]: string }>; post_process_prompts?: LLMPrompt[]; post_process_selected_prompt_id?: string | null; mute_while_recording?: boolean; append_trailing_space?: boolean; app_language?: string; experimental_enabled?: boolean }
export type AudioDevice = { index: string; name: string; is_default: boolean } export type AudioDevice = { index: string; name: string; is_default: boolean }
export type BindingResponse = { success: boolean; binding: ShortcutBinding | null; error: string | null } export type BindingResponse = { success: boolean; binding: ShortcutBinding | null; error: string | null }
export type ClipboardHandling = "dont_modify" | "copy_to_clipboard" export type ClipboardHandling = "dont_modify" | "copy_to_clipboard"

View file

@ -0,0 +1,30 @@
import React from "react";
import { useTranslation } from "react-i18next";
import { ToggleSwitch } from "../ui/ToggleSwitch";
import { useSettings } from "../../hooks/useSettings";
interface ExperimentalToggleProps {
descriptionMode?: "inline" | "tooltip";
grouped?: boolean;
}
export const ExperimentalToggle: React.FC<ExperimentalToggleProps> = React.memo(
({ descriptionMode = "tooltip", grouped = false }) => {
const { t } = useTranslation();
const { getSetting, updateSetting, isUpdating } = useSettings();
const enabled = getSetting("experimental_enabled") || false;
return (
<ToggleSwitch
checked={enabled}
onChange={(enabled) => updateSetting("experimental_enabled", enabled)}
isUpdating={isUpdating("experimental_enabled")}
label={t("settings.advanced.experimentalToggle.label")}
description={t("settings.advanced.experimentalToggle.description")}
descriptionMode={descriptionMode}
grouped={grouped}
/>
);
},
);

View file

@ -7,6 +7,7 @@ import { SettingContainer } from "../../ui/SettingContainer";
import { Button } from "../../ui/Button"; import { Button } from "../../ui/Button";
import { AppDataDirectory } from "../AppDataDirectory"; import { AppDataDirectory } from "../AppDataDirectory";
import { AppLanguageSelector } from "../AppLanguageSelector"; import { AppLanguageSelector } from "../AppLanguageSelector";
import { LogDirectory } from "../debug";
export const AboutSettings: React.FC = () => { export const AboutSettings: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -47,7 +48,15 @@ export const AboutSettings: React.FC = () => {
<span className="text-sm font-mono">v{version}</span> <span className="text-sm font-mono">v{version}</span>
</SettingContainer> </SettingContainer>
<AppDataDirectory descriptionMode="tooltip" grouped={true} /> <SettingContainer
title={t("settings.about.supportDevelopment.title")}
description={t("settings.about.supportDevelopment.description")}
grouped={true}
>
<Button variant="primary" size="md" onClick={handleDonateClick}>
{t("settings.about.supportDevelopment.button")}
</Button>
</SettingContainer>
<SettingContainer <SettingContainer
title={t("settings.about.sourceCode.title")} title={t("settings.about.sourceCode.title")}
@ -63,15 +72,8 @@ export const AboutSettings: React.FC = () => {
</Button> </Button>
</SettingContainer> </SettingContainer>
<SettingContainer <AppDataDirectory descriptionMode="tooltip" grouped={true} />
title={t("settings.about.supportDevelopment.title")} <LogDirectory grouped={true} />
description={t("settings.about.supportDevelopment.description")}
grouped={true}
>
<Button variant="primary" size="md" onClick={handleDonateClick}>
{t("settings.about.supportDevelopment.button")}
</Button>
</SettingContainer>
</SettingsGroup> </SettingsGroup>
<SettingsGroup title={t("settings.about.acknowledgments.title")}> <SettingsGroup title={t("settings.about.acknowledgments.title")}>

View file

@ -10,27 +10,58 @@ import { AutostartToggle } from "../AutostartToggle";
import { PasteMethodSetting } from "../PasteMethod"; import { PasteMethodSetting } from "../PasteMethod";
import { ClipboardHandlingSetting } from "../ClipboardHandling"; import { ClipboardHandlingSetting } from "../ClipboardHandling";
import { useModelStore } from "../../../stores/modelStore"; import { useModelStore } from "../../../stores/modelStore";
import { PostProcessingToggle } from "../PostProcessingToggle";
import { AppendTrailingSpace } from "../AppendTrailingSpace";
import { HistoryLimit } from "../HistoryLimit";
import { RecordingRetentionPeriodSelector } from "../RecordingRetentionPeriod";
import { ExperimentalToggle } from "../ExperimentalToggle";
import { useSettings } from "../../../hooks/useSettings";
export const AdvancedSettings: React.FC = () => { export const AdvancedSettings: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { currentModel, getModelInfo } = useModelStore(); const { currentModel, getModelInfo } = useModelStore();
const { getSetting } = useSettings();
const currentModelInfo = getModelInfo(currentModel); const currentModelInfo = getModelInfo(currentModel);
const showTranslateToEnglish = const showTranslateToEnglish =
currentModelInfo?.engine_type === "Whisper" && currentModel !== "turbo"; currentModelInfo?.engine_type === "Whisper" && currentModel !== "turbo";
const experimentalEnabled = getSetting("experimental_enabled") || false;
return ( return (
<div className="max-w-3xl w-full mx-auto space-y-6"> <div className="max-w-3xl w-full mx-auto space-y-6">
<SettingsGroup title={t("settings.advanced.title")}> <SettingsGroup title={t("settings.advanced.groups.app")}>
<StartHidden descriptionMode="tooltip" grouped={true} /> <StartHidden descriptionMode="tooltip" grouped={true} />
<AutostartToggle descriptionMode="tooltip" grouped={true} /> <AutostartToggle descriptionMode="tooltip" grouped={true} />
<ShowOverlay descriptionMode="tooltip" grouped={true} /> <ShowOverlay descriptionMode="tooltip" grouped={true} />
<ModelUnloadTimeoutSetting descriptionMode="tooltip" grouped={true} />
<ExperimentalToggle descriptionMode="tooltip" grouped={true} />
</SettingsGroup>
<SettingsGroup title={t("settings.advanced.groups.output")}>
<PasteMethodSetting descriptionMode="tooltip" grouped={true} /> <PasteMethodSetting descriptionMode="tooltip" grouped={true} />
<ClipboardHandlingSetting descriptionMode="tooltip" grouped={true} /> <ClipboardHandlingSetting descriptionMode="tooltip" grouped={true} />
</SettingsGroup>
<SettingsGroup title={t("settings.advanced.groups.transcription")}>
{showTranslateToEnglish && ( {showTranslateToEnglish && (
<TranslateToEnglish descriptionMode="tooltip" grouped={true} /> <TranslateToEnglish descriptionMode="tooltip" grouped={true} />
)} )}
<ModelUnloadTimeoutSetting descriptionMode="tooltip" grouped={true} />
<CustomWords descriptionMode="tooltip" grouped /> <CustomWords descriptionMode="tooltip" grouped />
<AppendTrailingSpace descriptionMode="tooltip" grouped={true} />
</SettingsGroup> </SettingsGroup>
<SettingsGroup title={t("settings.advanced.groups.history")}>
<HistoryLimit descriptionMode="tooltip" grouped={true} />
<RecordingRetentionPeriodSelector
descriptionMode="tooltip"
grouped={true}
/>
</SettingsGroup>
{experimentalEnabled && (
<SettingsGroup title={t("settings.advanced.groups.experimental")}>
<PostProcessingToggle descriptionMode="tooltip" grouped={true} />
</SettingsGroup>
)}
</div> </div>
); );
}; };

View file

@ -2,16 +2,10 @@ import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { type } from "@tauri-apps/plugin-os"; import { type } from "@tauri-apps/plugin-os";
import { WordCorrectionThreshold } from "./WordCorrectionThreshold"; import { WordCorrectionThreshold } from "./WordCorrectionThreshold";
import { LogDirectory } from "./LogDirectory";
import { LogLevelSelector } from "./LogLevelSelector"; import { LogLevelSelector } from "./LogLevelSelector";
import { SettingsGroup } from "../../ui/SettingsGroup"; import { SettingsGroup } from "../../ui/SettingsGroup";
import { HistoryLimit } from "../HistoryLimit";
import { AlwaysOnMicrophone } from "../AlwaysOnMicrophone"; import { AlwaysOnMicrophone } from "../AlwaysOnMicrophone";
import { SoundPicker } from "../SoundPicker"; import { SoundPicker } from "../SoundPicker";
import { PostProcessingToggle } from "../PostProcessingToggle";
import { MuteWhileRecording } from "../MuteWhileRecording";
import { AppendTrailingSpace } from "../AppendTrailingSpace";
import { RecordingRetentionPeriodSelector } from "../RecordingRetentionPeriod";
import { ClamshellMicrophoneSelector } from "../ClamshellMicrophoneSelector"; import { ClamshellMicrophoneSelector } from "../ClamshellMicrophoneSelector";
import { HandyShortcut } from "../HandyShortcut"; import { HandyShortcut } from "../HandyShortcut";
import { UpdateChecksToggle } from "../UpdateChecksToggle"; import { UpdateChecksToggle } from "../UpdateChecksToggle";
@ -26,7 +20,6 @@ export const DebugSettings: React.FC = () => {
return ( return (
<div className="max-w-3xl w-full mx-auto space-y-6"> <div className="max-w-3xl w-full mx-auto space-y-6">
<SettingsGroup title={t("settings.debug.title")}> <SettingsGroup title={t("settings.debug.title")}>
<LogDirectory grouped={true} />
<LogLevelSelector grouped={true} /> <LogLevelSelector grouped={true} />
<UpdateChecksToggle descriptionMode="tooltip" grouped={true} /> <UpdateChecksToggle descriptionMode="tooltip" grouped={true} />
<SoundPicker <SoundPicker
@ -34,16 +27,8 @@ export const DebugSettings: React.FC = () => {
description={t("settings.debug.soundTheme.description")} description={t("settings.debug.soundTheme.description")}
/> />
<WordCorrectionThreshold descriptionMode="tooltip" grouped={true} /> <WordCorrectionThreshold descriptionMode="tooltip" grouped={true} />
<HistoryLimit descriptionMode="tooltip" grouped={true} />
<RecordingRetentionPeriodSelector
descriptionMode="tooltip"
grouped={true}
/>
<AlwaysOnMicrophone descriptionMode="tooltip" grouped={true} /> <AlwaysOnMicrophone descriptionMode="tooltip" grouped={true} />
<ClamshellMicrophoneSelector descriptionMode="tooltip" grouped={true} /> <ClamshellMicrophoneSelector descriptionMode="tooltip" grouped={true} />
<PostProcessingToggle descriptionMode="tooltip" grouped={true} />
<MuteWhileRecording descriptionMode="tooltip" grouped={true} />
<AppendTrailingSpace descriptionMode="tooltip" grouped={true} />
{/* Cancel shortcut is disabled on Linux due to instability with dynamic shortcut registration */} {/* Cancel shortcut is disabled on Linux due to instability with dynamic shortcut registration */}
{!isLinux && ( {!isLinux && (
<HandyShortcut <HandyShortcut

View file

@ -10,6 +10,7 @@ import { AudioFeedback } from "../AudioFeedback";
import { useSettings } from "../../../hooks/useSettings"; import { useSettings } from "../../../hooks/useSettings";
import { useModelStore } from "../../../stores/modelStore"; import { useModelStore } from "../../../stores/modelStore";
import { VolumeSlider } from "../VolumeSlider"; import { VolumeSlider } from "../VolumeSlider";
import { MuteWhileRecording } from "../MuteWhileRecording";
export const GeneralSettings: React.FC = () => { export const GeneralSettings: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -28,6 +29,7 @@ export const GeneralSettings: React.FC = () => {
</SettingsGroup> </SettingsGroup>
<SettingsGroup title={t("settings.sound.title")}> <SettingsGroup title={t("settings.sound.title")}>
<MicrophoneSelector descriptionMode="tooltip" grouped={true} /> <MicrophoneSelector descriptionMode="tooltip" grouped={true} />
<MuteWhileRecording descriptionMode="tooltip" grouped={true} />
<AudioFeedback descriptionMode="tooltip" grouped={true} /> <AudioFeedback descriptionMode="tooltip" grouped={true} />
<OutputDeviceSelector <OutputDeviceSelector
descriptionMode="tooltip" descriptionMode="tooltip"

View file

@ -93,12 +93,12 @@
"pressKeys": "Stiskněte klávesy...", "pressKeys": "Stiskněte klávesy...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Přepsat", "name": "Zkratka přepisu",
"description": "Převádí vaši řeč na text." "description": "Klávesová zkratka pro nahrávání a přepis vašeho hlasu."
}, },
"cancel": { "cancel": {
"name": "Zrušit", "name": "Zkratka zrušení",
"description": "Zruší aktuální nahrávání." "description": "Klávesová zkratka pro zrušení aktuálního nahrávání."
} }
}, },
"errors": { "errors": {
@ -145,6 +145,17 @@
}, },
"advanced": { "advanced": {
"title": "Pokročilé", "title": "Pokročilé",
"groups": {
"app": "Aplikace",
"output": "Výstup",
"transcription": "Přepis",
"history": "Historie",
"experimental": "Experimentální"
},
"experimentalToggle": {
"label": "Experimentální funkce",
"description": "Povolit experimentální funkce, které jsou stále ve vývoji."
},
"startHidden": { "startHidden": {
"label": "Spouštět skrytě", "label": "Spouštět skrytě",
"description": "Spustit do systémové lišty bez otevření okna." "description": "Spustit do systémové lišty bez otevření okna."

View file

@ -109,12 +109,12 @@
"pressKeys": "Tasten drücken...", "pressKeys": "Tasten drücken...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transkribieren", "name": "Transkriptions-Tastenkürzel",
"description": "Wandelt Sprache in Text um." "description": "Das Tastenkürzel zum Aufnehmen und Transkribieren Ihrer Stimme."
}, },
"cancel": { "cancel": {
"name": "Abbrechen", "name": "Abbrechen-Tastenkürzel",
"description": "Bricht die aktuelle Aufnahme ab." "description": "Das Tastenkürzel zum Abbrechen der aktuellen Aufnahme."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Erweitert", "title": "Erweitert",
"groups": {
"app": "App",
"output": "Ausgabe",
"transcription": "Transkription",
"history": "Verlauf",
"experimental": "Experimentell"
},
"experimentalToggle": {
"label": "Experimentelle Funktionen",
"description": "Experimentelle Funktionen aktivieren, die sich noch in Entwicklung befinden."
},
"startHidden": { "startHidden": {
"label": "Versteckt starten", "label": "Versteckt starten",
"description": "In den Systembereich starten, ohne das Fenster zu öffnen." "description": "In den Systembereich starten, ohne das Fenster zu öffnen."

View file

@ -113,12 +113,12 @@
"pressKeys": "Press keys...", "pressKeys": "Press keys...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transcribe", "name": "Transcribe Shortcut",
"description": "Converts your speech into text." "description": "The keyboard shortcut to record and transcribe your voice."
}, },
"cancel": { "cancel": {
"name": "Cancel", "name": "Cancel Shortcut",
"description": "Cancels the current recording." "description": "The keyboard shortcut to cancel the current recording."
} }
}, },
"errors": { "errors": {
@ -165,6 +165,17 @@
}, },
"advanced": { "advanced": {
"title": "Advanced", "title": "Advanced",
"groups": {
"app": "App",
"output": "Output",
"transcription": "Transcription",
"history": "History",
"experimental": "Experimental"
},
"experimentalToggle": {
"label": "Experimental Features",
"description": "Enable experimental features that are still in development."
},
"startHidden": { "startHidden": {
"label": "Start Hidden", "label": "Start Hidden",
"description": "Launch to system tray without opening the window." "description": "Launch to system tray without opening the window."

View file

@ -109,12 +109,12 @@
"pressKeys": "Presiona teclas...", "pressKeys": "Presiona teclas...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transcribir", "name": "Atajo de Transcripción",
"description": "Convierte tu voz en texto." "description": "El atajo de teclado para grabar y transcribir tu voz."
}, },
"cancel": { "cancel": {
"name": "Cancelar", "name": "Atajo de Cancelar",
"description": "Cancela la grabación actual." "description": "El atajo de teclado para cancelar la grabación actual."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Avanzado", "title": "Avanzado",
"groups": {
"app": "Aplicación",
"output": "Salida",
"transcription": "Transcripción",
"history": "Historial",
"experimental": "Experimental"
},
"experimentalToggle": {
"label": "Funciones Experimentales",
"description": "Habilitar funciones experimentales que aún están en desarrollo."
},
"startHidden": { "startHidden": {
"label": "Iniciar Oculto", "label": "Iniciar Oculto",
"description": "Lanzar en la bandeja del sistema sin abrir la ventana." "description": "Lanzar en la bandeja del sistema sin abrir la ventana."

View file

@ -110,12 +110,12 @@
"pressKeys": "Appuyez sur les touches...", "pressKeys": "Appuyez sur les touches...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Démarrer la transcription", "name": "Raccourci de Transcription",
"description": "Convertir votre voix en texte." "description": "Le raccourci clavier pour enregistrer et transcrire votre voix."
}, },
"cancel": { "cancel": {
"name": "Annuler", "name": "Raccourci d'Annulation",
"description": "Annule l'enregistrement en cours." "description": "Le raccourci clavier pour annuler l'enregistrement en cours."
} }
}, },
"errors": { "errors": {
@ -162,6 +162,17 @@
}, },
"advanced": { "advanced": {
"title": "Avancé", "title": "Avancé",
"groups": {
"app": "Application",
"output": "Sortie",
"transcription": "Transcription",
"history": "Historique",
"experimental": "Expérimental"
},
"experimentalToggle": {
"label": "Fonctionnalités Expérimentales",
"description": "Activer les fonctionnalités expérimentales encore en développement."
},
"startHidden": { "startHidden": {
"label": "Démarrer masqué", "label": "Démarrer masqué",
"description": "Lancer dans la barre système sans ouvrir la fenêtre." "description": "Lancer dans la barre système sans ouvrir la fenêtre."

View file

@ -109,12 +109,12 @@
"pressKeys": "Premi i tasti...", "pressKeys": "Premi i tasti...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Trascrivi", "name": "Scorciatoia Trascrizione",
"description": "Converti la tua voce in testo." "description": "La scorciatoia da tastiera per registrare e trascrivere la tua voce."
}, },
"cancel": { "cancel": {
"name": "Annulla", "name": "Scorciatoia Annulla",
"description": "Annulla la registrazione in corso." "description": "La scorciatoia da tastiera per annullare la registrazione in corso."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Avanzate", "title": "Avanzate",
"groups": {
"app": "App",
"output": "Output",
"transcription": "Trascrizione",
"history": "Cronologia",
"experimental": "Sperimentale"
},
"experimentalToggle": {
"label": "Funzionalità Sperimentali",
"description": "Abilita le funzionalità sperimentali ancora in fase di sviluppo."
},
"startHidden": { "startHidden": {
"label": "Avvia in Background", "label": "Avvia in Background",
"description": "Avvia l'applicazione in background senza aprire la finestra." "description": "Avvia l'applicazione in background senza aprire la finestra."

View file

@ -109,12 +109,12 @@
"pressKeys": "キーを押してください...", "pressKeys": "キーを押してください...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "文字起こし", "name": "文字起こしショートカット",
"description": "音声をテキストに変換します。" "description": "音声を録音して文字起こしするためのキーボードショートカット。"
}, },
"cancel": { "cancel": {
"name": "キャンセル", "name": "キャンセルショートカット",
"description": "現在の録音をキャンセルします。" "description": "現在の録音をキャンセルるためのキーボードショートカット。"
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "詳細設定", "title": "詳細設定",
"groups": {
"app": "アプリ",
"output": "出力",
"transcription": "文字起こし",
"history": "履歴",
"experimental": "実験的"
},
"experimentalToggle": {
"label": "実験的機能",
"description": "まだ開発中の実験的機能を有効にします。"
},
"startHidden": { "startHidden": {
"label": "非表示で起動", "label": "非表示で起動",
"description": "ウィンドウを開かずにシステムトレイに起動。" "description": "ウィンドウを開かずにシステムトレイに起動。"

View file

@ -109,12 +109,12 @@
"pressKeys": "Naciśnij klawisze...", "pressKeys": "Naciśnij klawisze...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transkrybuj", "name": "Skrót transkrypcji",
"description": "Konwertuje Twoją mowę na tekst." "description": "Skrót klawiaturowy do nagrywania i transkrypcji głosu."
}, },
"cancel": { "cancel": {
"name": "Anuluj", "name": "Skrót anulowania",
"description": "Anuluje bieżące nagrywanie." "description": "Skrót klawiaturowy do anulowania bieżącego nagrywania."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Zaawansowane", "title": "Zaawansowane",
"groups": {
"app": "Aplikacja",
"output": "Wyjście",
"transcription": "Transkrypcja",
"history": "Historia",
"experimental": "Eksperymentalne"
},
"experimentalToggle": {
"label": "Funkcje Eksperymentalne",
"description": "Włącz funkcje eksperymentalne, które są jeszcze w fazie rozwoju."
},
"startHidden": { "startHidden": {
"label": "Uruchom ukryty", "label": "Uruchom ukryty",
"description": "Uruchom w zasobniku systemowym bez otwierania okna." "description": "Uruchom w zasobniku systemowym bez otwierania okna."

View file

@ -109,12 +109,12 @@
"pressKeys": "Pressione as teclas...", "pressKeys": "Pressione as teclas...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transcrever", "name": "Atalho de Transcrição",
"description": "Converte sua fala em texto." "description": "O atalho de teclado para gravar e transcrever sua voz."
}, },
"cancel": { "cancel": {
"name": "Cancelar", "name": "Atalho de Cancelar",
"description": "Cancela a gravação atual." "description": "O atalho de teclado para cancelar a gravação atual."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Avançado", "title": "Avançado",
"groups": {
"app": "Aplicativo",
"output": "Saída",
"transcription": "Transcrição",
"history": "Histórico",
"experimental": "Experimental"
},
"experimentalToggle": {
"label": "Recursos Experimentais",
"description": "Ativar recursos experimentais que ainda estão em desenvolvimento."
},
"startHidden": { "startHidden": {
"label": "Iniciar Oculto", "label": "Iniciar Oculto",
"description": "Iniciar na bandeja do sistema sem abrir a janela." "description": "Iniciar na bandeja do sistema sem abrir a janela."

View file

@ -109,12 +109,12 @@
"pressKeys": "Нажимайте клавиши...", "pressKeys": "Нажимайте клавиши...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Расшифровать", "name": "Горячая клавиша транскрипции",
"description": "Преобразует вашу речь в текст." "description": "Сочетание клавиш для записи и транскрибирования вашего голоса."
}, },
"cancel": { "cancel": {
"name": "Отмена", "name": "Горячая клавиша отмены",
"description": "Отменяет текущую запись." "description": "Сочетание клавиш для отмены текущей записи."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Продвинутые", "title": "Продвинутые",
"groups": {
"app": "Приложение",
"output": "Вывод",
"transcription": "Транскрипция",
"history": "История",
"experimental": "Экспериментальное"
},
"experimentalToggle": {
"label": "Экспериментальные функции",
"description": "Включить экспериментальные функции, которые находятся в разработке."
},
"startHidden": { "startHidden": {
"label": "Запускать скрыто", "label": "Запускать скрыто",
"description": "Запускать в системный трей, не открывая окно." "description": "Запускать в системный трей, не открывая окно."

View file

@ -113,12 +113,12 @@
"pressKeys": "Tuşlara basın...", "pressKeys": "Tuşlara basın...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Transkribe Et", "name": "Transkripsiyon Kısayolu",
"description": "Konuşmanızı metne dönüştürür." "description": "Sesinizi kaydetmek ve metne dönüştürmek için klavye kısayolu."
}, },
"cancel": { "cancel": {
"name": "İptal", "name": "İptal Kısayolu",
"description": "Mevcut kaydı iptal eder." "description": "Mevcut kaydı iptal etmek için klavye kısayolu."
} }
}, },
"errors": { "errors": {
@ -165,6 +165,17 @@
}, },
"advanced": { "advanced": {
"title": "Gelişmiş", "title": "Gelişmiş",
"groups": {
"app": "Uygulama",
"output": ıktı",
"transcription": "Transkripsiyon",
"history": "Geçmiş",
"experimental": "Deneysel"
},
"experimentalToggle": {
"label": "Deneysel Özellikler",
"description": "Hala geliştirme aşamasında olan deneysel özellikleri etkinleştir."
},
"startHidden": { "startHidden": {
"label": "Gizli Başlat", "label": "Gizli Başlat",
"description": "Pencereyi açmadan sistem tepsisinde başlatır." "description": "Pencereyi açmadan sistem tepsisinde başlatır."

View file

@ -109,12 +109,12 @@
"pressKeys": "Натисніть клавіші...", "pressKeys": "Натисніть клавіші...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Диктувати", "name": "Гаряча клавіша транскрипції",
"description": "Перетворює ваше мовлення в текст" "description": "Комбінація клавіш для запису та транскрибування вашого голосу."
}, },
"cancel": { "cancel": {
"name": "Скасувати", "name": "Гаряча клавіша скасування",
"description": "Скасовує поточний запис" "description": "Комбінація клавіш для скасування поточного запису."
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "Розширені", "title": "Розширені",
"groups": {
"app": "Додаток",
"output": "Вивід",
"transcription": "Транскрипція",
"history": "Історія",
"experimental": "Експериментальне"
},
"experimentalToggle": {
"label": "Експериментальні функції",
"description": "Увімкнути експериментальні функції, які ще в розробці."
},
"startHidden": { "startHidden": {
"label": "Запуск у фоні", "label": "Запуск у фоні",
"description": "Запускати в системному треї без відкриття вікна" "description": "Запускати в системному треї без відкриття вікна"

View file

@ -110,12 +110,12 @@
"pressKeys": "Nhấn phím...", "pressKeys": "Nhấn phím...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "Chuyển đổi", "name": "Phím tắt chuyển đổi",
"description": "Chuyển đổi giọng nói của bạn thành văn bản." "description": "Phím tắt để ghi âm và chuyển đổi giọng nói của bạn."
}, },
"cancel": { "cancel": {
"name": "Hủy", "name": "Phím tắt hủy",
"description": "Hủy bản ghi hiện tại." "description": "Phím tắt để hủy bản ghi hiện tại."
} }
}, },
"errors": { "errors": {
@ -162,6 +162,17 @@
}, },
"advanced": { "advanced": {
"title": "Nâng cao", "title": "Nâng cao",
"groups": {
"app": "Ứng dụng",
"output": "Đầu ra",
"transcription": "Chuyển đổi",
"history": "Lịch sử",
"experimental": "Thử nghiệm"
},
"experimentalToggle": {
"label": "Tính năng thử nghiệm",
"description": "Bật các tính năng thử nghiệm đang trong quá trình phát triển."
},
"startHidden": { "startHidden": {
"label": "Khởi động ẩn", "label": "Khởi động ẩn",
"description": "Khởi động vào khay hệ thống mà không mở cửa sổ." "description": "Khởi động vào khay hệ thống mà không mở cửa sổ."

View file

@ -109,12 +109,12 @@
"pressKeys": "请按键...", "pressKeys": "请按键...",
"bindings": { "bindings": {
"transcribe": { "transcribe": {
"name": "转录", "name": "转录快捷键",
"description": "将语音转换为文字。" "description": "用于录制和转录语音的键盘快捷键。"
}, },
"cancel": { "cancel": {
"name": "取消", "name": "取消快捷键",
"description": "取消当前录制。" "description": "用于取消当前录制的键盘快捷键。"
} }
}, },
"errors": { "errors": {
@ -161,6 +161,17 @@
}, },
"advanced": { "advanced": {
"title": "高级", "title": "高级",
"groups": {
"app": "应用",
"output": "输出",
"transcription": "转录",
"history": "历史",
"experimental": "实验性"
},
"experimentalToggle": {
"label": "实验性功能",
"description": "启用仍在开发中的实验性功能。"
},
"startHidden": { "startHidden": {
"label": "隐藏启动", "label": "隐藏启动",
"description": "启动到系统托盘而不打开窗口。" "description": "启动到系统托盘而不打开窗口。"

View file

@ -125,6 +125,8 @@ const settingUpdaters: {
commands.changeAppendTrailingSpaceSetting(value as boolean), commands.changeAppendTrailingSpaceSetting(value as boolean),
log_level: (value) => commands.setLogLevel(value as any), log_level: (value) => commands.setLogLevel(value as any),
app_language: (value) => commands.changeAppLanguageSetting(value as string), app_language: (value) => commands.changeAppLanguageSetting(value as string),
experimental_enabled: (value) =>
commands.changeExperimentalEnabledSetting(value as boolean),
}; };
export const useSettingsStore = create<SettingsStore>()( export const useSettingsStore = create<SettingsStore>()(