feat: add configurable auto-submit after transcription paste (#765)
* feat: add configurable auto-submit after transcription paste Add an Advanced output setting that can send Enter, Ctrl+Enter, or Cmd+Enter after text insertion so Handy works smoothly with different editor and agent submit shortcuts. This keeps the behavior opt-in, persists it in settings, and adds focused Rust tests for defaults and paste auto-submit decision logic. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: simplify auto submit configuration UX Replace the auto-submit toggle and key dropdown with a single dropdown that includes an Off state, so output behavior is clearer and faster to configure. Clarify Meta-key behavior by showing Cmd+Enter on macOS and Super+Enter on Windows/Linux, with matching localized copy. Co-authored-by: Cursor <cursoragent@cursor.com> * use bindings generated on macos * and translations. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: CJ Pais <cj@cjpais.com>
This commit is contained in:
parent
6f3fd9babc
commit
bf2a59f5ef
24 changed files with 424 additions and 5 deletions
|
|
@ -1,6 +1,6 @@
|
|||
use crate::input::{self, EnigoState};
|
||||
use crate::settings::{get_settings, ClipboardHandling, PasteMethod};
|
||||
use enigo::Enigo;
|
||||
use crate::settings::{get_settings, AutoSubmitKey, ClipboardHandling, PasteMethod};
|
||||
use enigo::{Direction, Enigo, Key, Keyboard};
|
||||
use log::info;
|
||||
use std::time::Duration;
|
||||
use tauri::{AppHandle, Manager};
|
||||
|
|
@ -446,6 +446,53 @@ fn paste_direct(enigo: &mut Enigo, text: &str) -> Result<(), String> {
|
|||
input::paste_text_direct(enigo, text)
|
||||
}
|
||||
|
||||
fn send_return_key(enigo: &mut Enigo, key_type: AutoSubmitKey) -> Result<(), String> {
|
||||
match key_type {
|
||||
AutoSubmitKey::Enter => {
|
||||
enigo
|
||||
.key(Key::Return, Direction::Press)
|
||||
.map_err(|e| format!("Failed to press Return key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Return, Direction::Release)
|
||||
.map_err(|e| format!("Failed to release Return key: {}", e))?;
|
||||
}
|
||||
AutoSubmitKey::CtrlEnter => {
|
||||
enigo
|
||||
.key(Key::Control, Direction::Press)
|
||||
.map_err(|e| format!("Failed to press Control key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Return, Direction::Press)
|
||||
.map_err(|e| format!("Failed to press Return key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Return, Direction::Release)
|
||||
.map_err(|e| format!("Failed to release Return key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Control, Direction::Release)
|
||||
.map_err(|e| format!("Failed to release Control key: {}", e))?;
|
||||
}
|
||||
AutoSubmitKey::CmdEnter => {
|
||||
enigo
|
||||
.key(Key::Meta, Direction::Press)
|
||||
.map_err(|e| format!("Failed to press Meta/Cmd key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Return, Direction::Press)
|
||||
.map_err(|e| format!("Failed to press Return key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Return, Direction::Release)
|
||||
.map_err(|e| format!("Failed to release Return key: {}", e))?;
|
||||
enigo
|
||||
.key(Key::Meta, Direction::Release)
|
||||
.map_err(|e| format!("Failed to release Meta/Cmd key: {}", e))?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn should_send_auto_submit(auto_submit: bool, paste_method: PasteMethod) -> bool {
|
||||
auto_submit && paste_method != PasteMethod::None
|
||||
}
|
||||
|
||||
pub fn paste(text: String, app_handle: AppHandle) -> Result<(), String> {
|
||||
let settings = get_settings(&app_handle);
|
||||
let paste_method = settings.paste_method;
|
||||
|
|
@ -491,6 +538,11 @@ pub fn paste(text: String, app_handle: AppHandle) -> Result<(), String> {
|
|||
}
|
||||
}
|
||||
|
||||
if should_send_auto_submit(settings.auto_submit, paste_method) {
|
||||
std::thread::sleep(Duration::from_millis(50));
|
||||
send_return_key(&mut enigo, settings.auto_submit_key)?;
|
||||
}
|
||||
|
||||
// After pasting, optionally copy to clipboard based on settings
|
||||
if settings.clipboard_handling == ClipboardHandling::CopyToClipboard {
|
||||
let clipboard = app_handle.clipboard();
|
||||
|
|
@ -501,3 +553,27 @@ pub fn paste(text: String, app_handle: AppHandle) -> Result<(), String> {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn auto_submit_requires_setting_enabled() {
|
||||
assert!(!should_send_auto_submit(false, PasteMethod::CtrlV));
|
||||
assert!(!should_send_auto_submit(false, PasteMethod::Direct));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn auto_submit_skips_none_paste_method() {
|
||||
assert!(!should_send_auto_submit(true, PasteMethod::None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn auto_submit_runs_for_active_paste_methods() {
|
||||
assert!(should_send_auto_submit(true, PasteMethod::CtrlV));
|
||||
assert!(should_send_auto_submit(true, PasteMethod::Direct));
|
||||
assert!(should_send_auto_submit(true, PasteMethod::CtrlShiftV));
|
||||
assert!(should_send_auto_submit(true, PasteMethod::ShiftInsert));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -275,6 +275,8 @@ pub fn run() {
|
|||
shortcut::change_word_correction_threshold_setting,
|
||||
shortcut::change_paste_method_setting,
|
||||
shortcut::change_clipboard_handling_setting,
|
||||
shortcut::change_auto_submit_setting,
|
||||
shortcut::change_auto_submit_key_setting,
|
||||
shortcut::change_post_process_enabled_setting,
|
||||
shortcut::change_experimental_enabled_setting,
|
||||
shortcut::change_post_process_base_url_setting,
|
||||
|
|
|
|||
|
|
@ -141,6 +141,14 @@ pub enum ClipboardHandling {
|
|||
CopyToClipboard,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Type)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum AutoSubmitKey {
|
||||
Enter,
|
||||
CtrlEnter,
|
||||
CmdEnter,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Type)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum RecordingRetentionPeriod {
|
||||
|
|
@ -191,6 +199,12 @@ impl Default for ClipboardHandling {
|
|||
}
|
||||
}
|
||||
|
||||
impl Default for AutoSubmitKey {
|
||||
fn default() -> Self {
|
||||
AutoSubmitKey::Enter
|
||||
}
|
||||
}
|
||||
|
||||
impl ModelUnloadTimeout {
|
||||
pub fn to_minutes(self) -> Option<u64> {
|
||||
match self {
|
||||
|
|
@ -291,6 +305,10 @@ pub struct AppSettings {
|
|||
pub paste_method: PasteMethod,
|
||||
#[serde(default)]
|
||||
pub clipboard_handling: ClipboardHandling,
|
||||
#[serde(default = "default_auto_submit")]
|
||||
pub auto_submit: bool,
|
||||
#[serde(default)]
|
||||
pub auto_submit_key: AutoSubmitKey,
|
||||
#[serde(default = "default_post_process_enabled")]
|
||||
pub post_process_enabled: bool,
|
||||
#[serde(default = "default_post_process_provider_id")]
|
||||
|
|
@ -372,6 +390,10 @@ fn default_paste_delay_ms() -> u64 {
|
|||
60
|
||||
}
|
||||
|
||||
fn default_auto_submit() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
fn default_history_limit() -> usize {
|
||||
5
|
||||
}
|
||||
|
|
@ -625,6 +647,8 @@ pub fn get_default_settings() -> AppSettings {
|
|||
recording_retention_period: default_recording_retention_period(),
|
||||
paste_method: PasteMethod::default(),
|
||||
clipboard_handling: ClipboardHandling::default(),
|
||||
auto_submit: default_auto_submit(),
|
||||
auto_submit_key: AutoSubmitKey::default(),
|
||||
post_process_enabled: default_post_process_enabled(),
|
||||
post_process_provider_id: default_post_process_provider_id(),
|
||||
post_process_providers: default_post_process_providers(),
|
||||
|
|
@ -771,3 +795,15 @@ pub fn get_recording_retention_period(app: &AppHandle) -> RecordingRetentionPeri
|
|||
let settings = get_settings(app);
|
||||
settings.recording_retention_period
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn default_settings_disable_auto_submit() {
|
||||
let settings = get_default_settings();
|
||||
assert!(!settings.auto_submit);
|
||||
assert_eq!(settings.auto_submit_key, AutoSubmitKey::Enter);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ use tauri::{AppHandle, Emitter, Manager};
|
|||
use tauri_plugin_autostart::ManagerExt;
|
||||
|
||||
use crate::settings::{
|
||||
self, get_settings, ClipboardHandling, KeyboardImplementation, LLMPrompt, OverlayPosition,
|
||||
PasteMethod, ShortcutBinding, SoundTheme, APPLE_INTELLIGENCE_DEFAULT_MODEL_ID,
|
||||
self, get_settings, AutoSubmitKey, ClipboardHandling, KeyboardImplementation, LLMPrompt,
|
||||
OverlayPosition, PasteMethod, ShortcutBinding, SoundTheme, APPLE_INTELLIGENCE_DEFAULT_MODEL_ID,
|
||||
APPLE_INTELLIGENCE_PROVIDER_ID,
|
||||
};
|
||||
use crate::tray;
|
||||
|
|
@ -698,6 +698,33 @@ pub fn change_clipboard_handling_setting(app: AppHandle, handling: String) -> Re
|
|||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub fn change_auto_submit_setting(app: AppHandle, enabled: bool) -> Result<(), String> {
|
||||
let mut settings = settings::get_settings(&app);
|
||||
settings.auto_submit = enabled;
|
||||
settings::write_settings(&app, settings);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub fn change_auto_submit_key_setting(app: AppHandle, key: String) -> Result<(), String> {
|
||||
let mut settings = settings::get_settings(&app);
|
||||
let parsed = match key.as_str() {
|
||||
"enter" => AutoSubmitKey::Enter,
|
||||
"ctrl_enter" => AutoSubmitKey::CtrlEnter,
|
||||
"cmd_enter" => AutoSubmitKey::CmdEnter,
|
||||
other => {
|
||||
warn!("Invalid auto submit key '{}', defaulting to enter", other);
|
||||
AutoSubmitKey::Enter
|
||||
}
|
||||
};
|
||||
settings.auto_submit_key = parsed;
|
||||
settings::write_settings(&app, settings);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub fn change_post_process_enabled_setting(app: AppHandle, enabled: bool) -> Result<(), String> {
|
||||
|
|
|
|||
|
|
@ -125,6 +125,22 @@ async changeClipboardHandlingSetting(handling: string) : Promise<Result<null, st
|
|||
else return { status: "error", error: e as any };
|
||||
}
|
||||
},
|
||||
async changeAutoSubmitSetting(enabled: boolean) : Promise<Result<null, string>> {
|
||||
try {
|
||||
return { status: "ok", data: await TAURI_INVOKE("change_auto_submit_setting", { enabled }) };
|
||||
} catch (e) {
|
||||
if(e instanceof Error) throw e;
|
||||
else return { status: "error", error: e as any };
|
||||
}
|
||||
},
|
||||
async changeAutoSubmitKeySetting(key: string) : Promise<Result<null, string>> {
|
||||
try {
|
||||
return { status: "ok", data: await TAURI_INVOKE("change_auto_submit_key_setting", { key }) };
|
||||
} catch (e) {
|
||||
if(e instanceof Error) throw e;
|
||||
else return { status: "error", error: e as any };
|
||||
}
|
||||
},
|
||||
async changePostProcessEnabledSetting(enabled: boolean) : Promise<Result<null, string>> {
|
||||
try {
|
||||
return { status: "ok", data: await TAURI_INVOKE("change_post_process_enabled_setting", { enabled }) };
|
||||
|
|
@ -703,8 +719,9 @@ async isLaptop() : Promise<Result<boolean, string>> {
|
|||
|
||||
/** 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; experimental_enabled?: boolean; keyboard_implementation?: KeyboardImplementation; show_tray_icon?: boolean; paste_delay_ms?: number }
|
||||
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; auto_submit?: boolean; auto_submit_key?: AutoSubmitKey; 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; keyboard_implementation?: KeyboardImplementation; show_tray_icon?: boolean; paste_delay_ms?: number }
|
||||
export type AudioDevice = { index: string; name: string; is_default: boolean }
|
||||
export type AutoSubmitKey = "enter" | "ctrl_enter" | "cmd_enter"
|
||||
export type BindingResponse = { success: boolean; binding: ShortcutBinding | null; error: string | null }
|
||||
export type ClipboardHandling = "dont_modify" | "copy_to_clipboard"
|
||||
export type CustomSounds = { start: boolean; stop: boolean }
|
||||
|
|
|
|||
80
src/components/settings/AutoSubmit.tsx
Normal file
80
src/components/settings/AutoSubmit.tsx
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
import React from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Dropdown } from "../ui/Dropdown";
|
||||
import { SettingContainer } from "../ui/SettingContainer";
|
||||
import { useSettings } from "../../hooks/useSettings";
|
||||
import { useOsType } from "../../hooks/useOsType";
|
||||
import type { AutoSubmitKey } from "@/bindings";
|
||||
|
||||
interface AutoSubmitProps {
|
||||
descriptionMode?: "inline" | "tooltip";
|
||||
grouped?: boolean;
|
||||
}
|
||||
|
||||
type AutoSubmitOptionValue = AutoSubmitKey | "off";
|
||||
|
||||
export const AutoSubmit: React.FC<AutoSubmitProps> = React.memo(
|
||||
({ descriptionMode = "tooltip", grouped = false }) => {
|
||||
const { t } = useTranslation();
|
||||
const osType = useOsType();
|
||||
const { getSetting, updateSetting, isUpdating } = useSettings();
|
||||
|
||||
const enabled = getSetting("auto_submit") ?? false;
|
||||
const selectedKey = (getSetting("auto_submit_key") ||
|
||||
"enter") as AutoSubmitKey;
|
||||
const selectedValue: AutoSubmitOptionValue = enabled ? selectedKey : "off";
|
||||
const submitWithMetaLabel =
|
||||
osType === "macos"
|
||||
? t("settings.advanced.autoSubmit.options.cmdEnter")
|
||||
: t("settings.advanced.autoSubmit.options.superEnter");
|
||||
|
||||
const autoSubmitOptions = [
|
||||
{
|
||||
value: "off",
|
||||
label: t("settings.advanced.autoSubmit.options.off"),
|
||||
},
|
||||
{
|
||||
value: "enter",
|
||||
label: t("settings.advanced.autoSubmit.options.enter"),
|
||||
},
|
||||
{
|
||||
value: "ctrl_enter",
|
||||
label: t("settings.advanced.autoSubmit.options.ctrlEnter"),
|
||||
},
|
||||
{
|
||||
value: "cmd_enter",
|
||||
label: submitWithMetaLabel,
|
||||
},
|
||||
];
|
||||
|
||||
const handleAutoSubmitSelect = async (value: string) => {
|
||||
const selected = value as AutoSubmitOptionValue;
|
||||
|
||||
if (selected === "off") {
|
||||
await updateSetting("auto_submit", false);
|
||||
return;
|
||||
}
|
||||
|
||||
await updateSetting("auto_submit_key", selected as AutoSubmitKey);
|
||||
if (!enabled) {
|
||||
await updateSetting("auto_submit", true);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<SettingContainer
|
||||
title={t("settings.advanced.autoSubmit.title")}
|
||||
description={t("settings.advanced.autoSubmit.description")}
|
||||
descriptionMode={descriptionMode}
|
||||
grouped={grouped}
|
||||
>
|
||||
<Dropdown
|
||||
options={autoSubmitOptions}
|
||||
selectedValue={selectedValue}
|
||||
onSelect={handleAutoSubmitSelect}
|
||||
disabled={isUpdating("auto_submit") || isUpdating("auto_submit_key")}
|
||||
/>
|
||||
</SettingContainer>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
|
@ -9,6 +9,7 @@ import { AutostartToggle } from "../AutostartToggle";
|
|||
import { ShowTrayIcon } from "../ShowTrayIcon";
|
||||
import { PasteMethodSetting } from "../PasteMethod";
|
||||
import { ClipboardHandlingSetting } from "../ClipboardHandling";
|
||||
import { AutoSubmit } from "../AutoSubmit";
|
||||
import { PostProcessingToggle } from "../PostProcessingToggle";
|
||||
import { AppendTrailingSpace } from "../AppendTrailingSpace";
|
||||
import { HistoryLimit } from "../HistoryLimit";
|
||||
|
|
@ -36,6 +37,7 @@ export const AdvancedSettings: React.FC = () => {
|
|||
<SettingsGroup title={t("settings.advanced.groups.output")}>
|
||||
<PasteMethodSetting descriptionMode="tooltip" grouped={true} />
|
||||
<ClipboardHandlingSetting descriptionMode="tooltip" grouped={true} />
|
||||
<AutoSubmit descriptionMode="tooltip" grouped={true} />
|
||||
</SettingsGroup>
|
||||
|
||||
<SettingsGroup title={t("settings.advanced.groups.transcription")}>
|
||||
|
|
|
|||
|
|
@ -230,6 +230,17 @@
|
|||
"copyToClipboard": "نسخ إلى الحافظة"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "إرسال تلقائي",
|
||||
"description": "إرسال مجموعة المفاتيح المحددة تلقائياً بعد إدراج النص. Cmd+Enter ينطبق على macOS، بينما يستخدم Windows/Linux مفتاح Super+Enter.",
|
||||
"options": {
|
||||
"off": "إيقاف",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "الترجمة إلى الإنجليزية",
|
||||
"description": ".ترجمة الكلام من اللغات الأخرى تلقائياً إلى الإنجليزية أثناء التفريغ",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Kopírovat do schránky"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Automatické odeslání",
|
||||
"description": "Automaticky odešle vybranou kombinaci kláves po vložení textu. Cmd+Enter platí pro macOS, zatímco Windows/Linux používají Super+Enter.",
|
||||
"options": {
|
||||
"off": "Vypnuto",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Překládat do angličtiny",
|
||||
"description": "Během přepisu automaticky překládat řeč z jiných jazyků do angličtiny.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "In Zwischenablage kopieren"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Automatisch absenden",
|
||||
"description": "Sendet nach dem Einfügen von Text automatisch die ausgewählte Tastenkombination. Cmd+Enter gilt für macOS, während Windows/Linux Super+Enter verwenden.",
|
||||
"options": {
|
||||
"off": "Aus",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Ins Englische übersetzen",
|
||||
"description": "Sprache aus anderen Sprachen automatisch während der Transkription ins Englische übersetzen.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Copy to Clipboard"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Auto Submit",
|
||||
"description": "Automatically send the selected key combination after text insertion. Cmd+Enter applies on macOS, while Windows/Linux use Super+Enter.",
|
||||
"options": {
|
||||
"off": "Off",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Translate to English",
|
||||
"description": "Automatically translate speech from other languages to English during transcription.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Copiar al Portapapeles"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Envío automático",
|
||||
"description": "Envía automáticamente la combinación de teclas seleccionada después de insertar el texto. Cmd+Enter se aplica en macOS, mientras que Windows/Linux usan Super+Enter.",
|
||||
"options": {
|
||||
"off": "Desactivado",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Traducir al Inglés",
|
||||
"description": "Traducir automáticamente el habla de otros idiomas al inglés durante la transcripción.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Copier dans le presse-papiers"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Envoi automatique",
|
||||
"description": "Envoie automatiquement la combinaison de touches sélectionnée après l'insertion du texte. Cmd+Enter s'applique sur macOS, tandis que Windows/Linux utilisent Super+Enter.",
|
||||
"options": {
|
||||
"off": "Désactivé",
|
||||
"enter": "Entrée",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Traduire en anglais",
|
||||
"description": "Traduire automatiquement la parole d'autres langues vers l'anglais pendant la transcription.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Copia negli Appunti"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Invio automatico",
|
||||
"description": "Invia automaticamente la combinazione di tasti selezionata dopo l'inserimento del testo. Cmd+Enter si applica su macOS, mentre Windows/Linux usano Super+Enter.",
|
||||
"options": {
|
||||
"off": "Disattivato",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Traduci in inglese",
|
||||
"description": "Traduci automaticamente in inglese la voce in altre lingue durante la trascrizione.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "クリップボードにコピー"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "自動送信",
|
||||
"description": "テキスト挿入後に選択したキーの組み合わせを自動的に送信します。macOSではCmd+Enter、Windows/LinuxではSuper+Enterが適用されます。",
|
||||
"options": {
|
||||
"off": "オフ",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "英語に翻訳",
|
||||
"description": "文字起こし中に他の言語から英語に自動的に翻訳。",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "클립보드에 복사"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "자동 제출",
|
||||
"description": "텍스트 삽입 후 선택한 키 조합을 자동으로 전송합니다. macOS에서는 Cmd+Enter가, Windows/Linux에서는 Super+Enter가 적용됩니다.",
|
||||
"options": {
|
||||
"off": "끄기",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "영어로 번역",
|
||||
"description": "텍스트로 변환시 다른 언어의 음성을 자동으로 영어로 번역합니다.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Kopiuj do schowka"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Automatyczne wysyłanie",
|
||||
"description": "Automatycznie wysyła wybraną kombinację klawiszy po wstawieniu tekstu. Cmd+Enter dotyczy macOS, natomiast Windows/Linux używają Super+Enter.",
|
||||
"options": {
|
||||
"off": "Wyłączone",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Tłumacz na angielski",
|
||||
"description": "Automatycznie tłumacz mowę z innych języków na angielski podczas transkrypcji.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Copiar para Área de Transferência"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Envio automático",
|
||||
"description": "Envia automaticamente a combinação de teclas selecionada após a inserção do texto. Cmd+Enter aplica-se no macOS, enquanto Windows/Linux usam Super+Enter.",
|
||||
"options": {
|
||||
"off": "Desativado",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Traduzir para Inglês",
|
||||
"description": "Traduzir automaticamente fala de outros idiomas para inglês durante a transcrição.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Копировать в буфер обмена"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Автоматическая отправка",
|
||||
"description": "Автоматически отправляет выбранную комбинацию клавиш после вставки текста. Cmd+Enter применяется на macOS, а Windows/Linux используют Super+Enter.",
|
||||
"options": {
|
||||
"off": "Выкл.",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Перевести на английский",
|
||||
"description": "Автоматически переводить речь с других языков на английский во время транскрипции.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Panoya Kopyala"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Otomatik Gönder",
|
||||
"description": "Metin eklendikten sonra seçilen tuş kombinasyonunu otomatik olarak gönderir. macOS'ta Cmd+Enter, Windows/Linux'ta Super+Enter geçerlidir.",
|
||||
"options": {
|
||||
"off": "Kapalı",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "İngilizceye Çevir",
|
||||
"description": "Transkripsiyon sırasında diğer dillerden İngilizceye otomatik olarak çevirir.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Копіювати в буфер обміну"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Автоматичне надсилання",
|
||||
"description": "Автоматично надсилає вибрану комбінацію клавіш після вставки тексту. Cmd+Enter застосовується на macOS, тоді як Windows/Linux використовують Super+Enter.",
|
||||
"options": {
|
||||
"off": "Вимк.",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Перекласти на англійську",
|
||||
"description": "Автоматично перекладати мовлення з інших мов англійською під час транскрипції.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "Sao chép vào Clipboard"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "Gửi tự động",
|
||||
"description": "Tự động gửi tổ hợp phím đã chọn sau khi chèn văn bản. Cmd+Enter áp dụng trên macOS, còn Windows/Linux dùng Super+Enter.",
|
||||
"options": {
|
||||
"off": "Tắt",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "Dịch sang tiếng Anh",
|
||||
"description": "Tự động dịch giọng nói từ các ngôn ngữ khác sang tiếng Anh trong quá trình chuyển đổi.",
|
||||
|
|
|
|||
|
|
@ -252,6 +252,17 @@
|
|||
"copyToClipboard": "复制到剪贴板"
|
||||
}
|
||||
},
|
||||
"autoSubmit": {
|
||||
"title": "自动提交",
|
||||
"description": "在文本插入后自动发送所选的按键组合。macOS 上使用 Cmd+Enter,Windows/Linux 上使用 Super+Enter。",
|
||||
"options": {
|
||||
"off": "关闭",
|
||||
"enter": "Enter",
|
||||
"cmdEnter": "Cmd+Enter",
|
||||
"superEnter": "Super+Enter",
|
||||
"ctrlEnter": "Ctrl+Enter"
|
||||
}
|
||||
},
|
||||
"translateToEnglish": {
|
||||
"label": "翻译为英语",
|
||||
"description": "在转录过程中自动将其他语言的语音翻译为英语。",
|
||||
|
|
|
|||
|
|
@ -114,6 +114,9 @@ const settingUpdaters: {
|
|||
paste_method: (value) => commands.changePasteMethodSetting(value as string),
|
||||
clipboard_handling: (value) =>
|
||||
commands.changeClipboardHandlingSetting(value as string),
|
||||
auto_submit: (value) => commands.changeAutoSubmitSetting(value as boolean),
|
||||
auto_submit_key: (value) =>
|
||||
commands.changeAutoSubmitKeySetting(value as string),
|
||||
history_limit: (value) => commands.updateHistoryLimit(value as number),
|
||||
post_process_enabled: (value) =>
|
||||
commands.changePostProcessEnabledSetting(value as boolean),
|
||||
|
|
|
|||
Loading…
Reference in a new issue