From f979b56b6a631eeeb671caaca276316b63b5fb82 Mon Sep 17 00:00:00 2001 From: Chris Hasson Date: Tue, 16 Dec 2025 22:50:06 -0800 Subject: [PATCH] And tooltips to the microphone icon explaining why it might be disabled (#4512) * Refactor speech-to-text availability handling Updated the speech-to-text availability check to return a detailed status object, including availability and potential reasons for unavailability. Adjusted related components to utilize the new status structure, enhancing error messaging and UI feedback for users. This change improves clarity on configuration requirements for speech-to-text functionality. * Enhance speech-to-text error messages and localization support Updated the speech-to-text component to utilize localized error messages for various unavailability reasons, including missing OpenAI API key and FFmpeg installation. Added corresponding translations for these messages in multiple languages, improving user experience and clarity on configuration requirements. --- .changeset/clean-dogs-teach.md | 5 ++++ src/core/webview/ClineProvider.ts | 9 ++++-- src/core/webview/speechToTextCheck.ts | 29 ++++++++++++------- src/shared/ExtensionMessage.ts | 2 +- .../src/components/chat/ChatTextArea.tsx | 12 +++++--- .../src/components/chat/MicrophoneButton.tsx | 7 +++-- .../src/context/ExtensionStateContext.tsx | 2 +- webview-ui/src/i18n/locales/ar/kilocode.json | 7 +++-- webview-ui/src/i18n/locales/ca/kilocode.json | 5 +++- webview-ui/src/i18n/locales/cs/kilocode.json | 5 +++- webview-ui/src/i18n/locales/de/kilocode.json | 5 +++- webview-ui/src/i18n/locales/en/kilocode.json | 5 +++- webview-ui/src/i18n/locales/es/kilocode.json | 5 +++- webview-ui/src/i18n/locales/fr/kilocode.json | 5 +++- webview-ui/src/i18n/locales/hi/kilocode.json | 7 +++-- webview-ui/src/i18n/locales/id/kilocode.json | 7 +++-- webview-ui/src/i18n/locales/it/kilocode.json | 7 +++-- webview-ui/src/i18n/locales/ja/kilocode.json | 5 +++- webview-ui/src/i18n/locales/ko/kilocode.json | 5 +++- webview-ui/src/i18n/locales/nl/kilocode.json | 5 +++- webview-ui/src/i18n/locales/pl/kilocode.json | 5 +++- .../src/i18n/locales/pt-BR/kilocode.json | 5 +++- webview-ui/src/i18n/locales/ru/kilocode.json | 5 +++- webview-ui/src/i18n/locales/th/kilocode.json | 7 +++-- webview-ui/src/i18n/locales/tr/kilocode.json | 5 +++- webview-ui/src/i18n/locales/uk/kilocode.json | 5 +++- webview-ui/src/i18n/locales/vi/kilocode.json | 7 +++-- .../src/i18n/locales/zh-CN/kilocode.json | 5 +++- .../src/i18n/locales/zh-TW/kilocode.json | 5 +++- 29 files changed, 138 insertions(+), 50 deletions(-) create mode 100644 .changeset/clean-dogs-teach.md diff --git a/.changeset/clean-dogs-teach.md b/.changeset/clean-dogs-teach.md new file mode 100644 index 00000000000..57c599f4594 --- /dev/null +++ b/.changeset/clean-dogs-teach.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Add a tooltip explaining why speech-to-text may be unavailable diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 70604eb5e6f..52436dccdb1 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2213,8 +2213,11 @@ ${prompt} // kilocode_change end // kilocode_change start - checkSpeechToTextAvailable (only when experiment enabled) - let speechToTextAvailable = - experiments?.speechToText && (await checkSpeechToTextAvailable(this.providerSettingsManager)) + let speechToTextStatus: { available: boolean; reason?: "openaiKeyMissing" | "ffmpegNotInstalled" } | undefined = + undefined + if (experiments?.speechToText) { + speechToTextStatus = await checkSpeechToTextAvailable(this.providerSettingsManager) + } // kilocode_change end - checkSpeechToTextAvailable let cloudOrganizations: CloudOrganizationMembership[] = [] @@ -2440,7 +2443,7 @@ ${prompt} featureRoomoteControlEnabled, virtualQuotaActiveModel, // kilocode_change: Include virtual quota active model in state debug: vscode.workspace.getConfiguration(Package.name).get("debug", false), - speechToTextAvailable, // kilocode_change: Whether speech-to-text is fully configured + speechToTextStatus, // kilocode_change: Speech-to-text availability status with failure reason } } diff --git a/src/core/webview/speechToTextCheck.ts b/src/core/webview/speechToTextCheck.ts index 2db06b10a0b..9279df24691 100644 --- a/src/core/webview/speechToTextCheck.ts +++ b/src/core/webview/speechToTextCheck.ts @@ -3,10 +3,19 @@ import type { ProviderSettingsManager } from "../config/ProviderSettingsManager" import { getOpenAiApiKey } from "../../services/stt/utils/getOpenAiCredentials" import { FFmpegCaptureService } from "../../services/stt/FFmpegCaptureService" +/** + * Result type for speech-to-text availability check + */ +export type SpeechToTextAvailabilityResult = { + available: boolean + reason?: "openaiKeyMissing" | "ffmpegNotInstalled" +} + /** * Cached availability result with timestamp */ -let cachedResult: { available: boolean; timestamp: number } | null = null +let cachedResult: { available: boolean; reason?: "openaiKeyMissing" | "ffmpegNotInstalled"; timestamp: number } | null = + null const CACHE_DURATION_MS = 30000 // 30 seconds /** @@ -21,17 +30,17 @@ const CACHE_DURATION_MS = 30000 // 30 seconds * * @param providerSettingsManager - Provider settings manager for API configuration * @param forceRecheck - Force a fresh check, ignoring cache (default: false) - * @returns Promise - true if prerequisites are met + * @returns Promise - Result with availability status and failure reason if unavailable */ export async function checkSpeechToTextAvailable( providerSettingsManager: ProviderSettingsManager, forceRecheck = false, -): Promise { +): Promise { // Return cached result if valid and not forcing recheck if (cachedResult !== null && !forceRecheck) { const age = Date.now() - cachedResult.timestamp if (age < CACHE_DURATION_MS) { - return cachedResult.available + return { available: cachedResult.available, reason: cachedResult.reason } } } @@ -39,21 +48,21 @@ export async function checkSpeechToTextAvailable( // Check 1: OpenAI API key const apiKey = await getOpenAiApiKey(providerSettingsManager) if (!apiKey) { - cachedResult = { available: false, timestamp: Date.now() } - return false + cachedResult = { available: false, reason: "openaiKeyMissing", timestamp: Date.now() } + return { available: false, reason: "openaiKeyMissing" } } // Check 2: FFmpeg installed const ffmpegResult = FFmpegCaptureService.findFFmpeg() if (!ffmpegResult.available) { - cachedResult = { available: false, timestamp: Date.now() } - return false + cachedResult = { available: false, reason: "ffmpegNotInstalled", timestamp: Date.now() } + return { available: false, reason: "ffmpegNotInstalled" } } cachedResult = { available: true, timestamp: Date.now() } - return true + return { available: true } } catch (error) { cachedResult = { available: false, timestamp: Date.now() } - return false + return { available: false } } } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 0b383a7541e..6f7645c9150 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -538,7 +538,7 @@ export type ExtensionState = Pick< virtualQuotaActiveModel?: { id: string; info: ModelInfo } // kilocode_change: Add virtual quota active model for UI display showTimestamps?: boolean // kilocode_change: Show timestamps in chat messages debug?: boolean - speechToTextAvailable?: boolean // kilocode_change: Whether speech-to-text is fully configured (FFmpeg + OpenAI key) + speechToTextStatus?: { available: boolean; reason?: "openaiKeyMissing" | "ffmpegNotInstalled" } // kilocode_change: Speech-to-text availability status with failure reason } export interface ClineSayTool { diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 1c0beeb8299..801a1dc0463 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -162,7 +162,7 @@ export const ChatTextArea = forwardRef( ghostServiceSettings, // kilocode_change language, // User's VSCode display language experiments, // kilocode_change: For speechToText experiment flag - speechToTextAvailable, // kilocode_change: Whether voice transcription is configured + speechToTextStatus, // kilocode_change: Speech-to-text availability status with failure reason } = useExtensionState() // kilocode_change start - autocomplete profile type system @@ -1712,10 +1712,14 @@ export const ChatTextArea = forwardRef( diff --git a/webview-ui/src/components/chat/MicrophoneButton.tsx b/webview-ui/src/components/chat/MicrophoneButton.tsx index 20a274fa32f..5365e762cba 100644 --- a/webview-ui/src/components/chat/MicrophoneButton.tsx +++ b/webview-ui/src/components/chat/MicrophoneButton.tsx @@ -40,10 +40,11 @@ export const MicrophoneButton: React.FC = ({ "rounded-md min-w-[28px] min-h-[28px]", "transition-all duration-150", "focus:outline-none focus-visible:ring-1 focus-visible:ring-vscode-focusBorder", - "cursor-pointer", isRecording - ? "opacity-100 text-red-500 animate-pulse hover:text-red-600" - : "opacity-60 hover:opacity-100 text-vscode-descriptionForeground hover:text-vscode-foreground hover:bg-[rgba(255,255,255,0.03)] hover:border-[rgba(255,255,255,0.15)] active:bg-[rgba(255,255,255,0.1)]", + ? "opacity-100 text-red-500 animate-pulse hover:text-red-600 cursor-pointer" + : disabled + ? "opacity-40 cursor-not-allowed grayscale-[30%] hover:bg-transparent hover:border-[rgba(255,255,255,0.08)] active:bg-transparent text-vscode-descriptionForeground" + : "opacity-60 hover:opacity-100 text-vscode-descriptionForeground hover:text-vscode-foreground hover:bg-[rgba(255,255,255,0.03)] hover:border-[rgba(255,255,255,0.15)] active:bg-[rgba(255,255,255,0.1)] cursor-pointer", containerWidth !== undefined && { hidden: containerWidth < 235 }, )}> {isRecording ? : } diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index ffbb5bb16fc..c8b6731c124 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -98,7 +98,7 @@ export interface ExtensionStateContextType extends ExtensionState { setCustomCondensingPrompt: (value: string) => void yoloGatekeeperApiConfigId?: string // kilocode_change: AI gatekeeper for YOLO mode setYoloGatekeeperApiConfigId: (value: string) => void // kilocode_change: AI gatekeeper for YOLO mode - speechToTextAvailable?: boolean // kilocode_change: Whether voice transcription is fully configured + speechToTextStatus?: { available: boolean; reason?: "openaiKeyMissing" | "ffmpegNotInstalled" } // kilocode_change: Speech-to-text availability status with failure reason marketplaceItems?: any[] marketplaceInstalledMetadata?: MarketplaceInstalledMetadata profileThresholds: Record diff --git a/webview-ui/src/i18n/locales/ar/kilocode.json b/webview-ui/src/i18n/locales/ar/kilocode.json index c82b842c387..93e5fbb2cf6 100644 --- a/webview-ui/src/i18n/locales/ar/kilocode.json +++ b/webview-ui/src/i18n/locales/ar/kilocode.json @@ -326,7 +326,10 @@ "initiating": "جاري بدء المصادقة..." }, "speechToText": { - "stopRecording": "إيقاف الإدخال الصوتي", - "startRecording": "ابدأ الإدخال الصوتي" + "stopRecording": "إيقاف إدخال الصوت", + "startRecording": "بدء الإدخال الصوتي", + "unavailableFfmpegNotInstalled": "التحويل من الكلام إلى نص غير متاح. قم بتثبيت FFmpeg لاستخدام النسخ الصوتي.", + "unavailableBoth": "تحويل الصوت إلى نص غير متاح. يتطلب ذلك مزود OpenAI صالح ويجب تثبيت FFmpeg.", + "unavailableOpenAiKeyMissing": "تحويل الكلام إلى نص غير متاح. يتطلب استخدام مزود OpenAI صالح مع مفتاح API لاستخدام خاصية نسخ الصوت." } } diff --git a/webview-ui/src/i18n/locales/ca/kilocode.json b/webview-ui/src/i18n/locales/ca/kilocode.json index e208693b62c..f2def5a8103 100644 --- a/webview-ui/src/i18n/locales/ca/kilocode.json +++ b/webview-ui/src/i18n/locales/ca/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "stopRecording": "Atura l'entrada de veu", - "startRecording": "Inicia l'entrada de veu" + "startRecording": "Inicia l'entrada de veu", + "unavailableFfmpegNotInstalled": "La transcripció de veu a text no està disponible. Instal·leu FFmpeg per utilitzar la transcripció de veu.", + "unavailableOpenAiKeyMissing": "La transcripció de veu a text no està disponible. Requereix un proveïdor d'OpenAI vàlid amb una clau API per utilitzar la transcripció de veu.", + "unavailableBoth": "La conversió de veu a text no està disponible. Requereix un proveïdor vàlid d'OpenAI i FFmpeg ha d'estar instal·lat." } } diff --git a/webview-ui/src/i18n/locales/cs/kilocode.json b/webview-ui/src/i18n/locales/cs/kilocode.json index 9ac249b8c5a..6bcbcea22dc 100644 --- a/webview-ui/src/i18n/locales/cs/kilocode.json +++ b/webview-ui/src/i18n/locales/cs/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Spustit hlasový vstup", - "stopRecording": "Zastavit hlasový vstup" + "stopRecording": "Zastavit hlasový vstup", + "unavailableBoth": "Převod řeči na text není k dispozici. Vyžaduje platného poskytovatele OpenAI a musí být nainstalován FFmpeg.", + "unavailableFfmpegNotInstalled": "Převod řeči na text není k dispozici. Nainstalujte FFmpeg pro využití transkripce hlasu.", + "unavailableOpenAiKeyMissing": "Převod řeči na text není k dispozici. Pro použití hlasového přepisu vyžaduje platného poskytovatele OpenAI s API klíčem." } } diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index a2cd7cf5ac1..f7c8e710d5d 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -327,6 +327,9 @@ }, "speechToText": { "startRecording": "Spracheingabe starten", - "stopRecording": "Spracheingabe stoppen" + "stopRecording": "Spracheingabe beenden", + "unavailableBoth": "Spracherkennung ist nicht verfügbar. Es erfordert einen gültigen OpenAI-Anbieter und FFmpeg muss installiert sein.", + "unavailableFfmpegNotInstalled": "Sprache-zu-Text ist nicht verfügbar. Installieren Sie FFmpeg, um Sprachtranskription zu nutzen.", + "unavailableOpenAiKeyMissing": "Sprache-zu-Text ist nicht verfügbar. Es erfordert einen gültigen OpenAI-Anbieter mit einem API-Schlüssel, um Sprachtranskription zu nutzen." } } diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index 365e9c8a265..7a849f0573b 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -326,6 +326,9 @@ }, "speechToText": { "startRecording": "Start voice input", - "stopRecording": "Stop voice input" + "stopRecording": "Stop voice input", + "unavailableOpenAiKeyMissing": "Speech-to-text is unavailable. It requires a valid OpenAI provider with an API key to use voice transcription.", + "unavailableFfmpegNotInstalled": "Speech-to-text is unavailable. Install FFmpeg to use voice transcription.", + "unavailableBoth": "Speech-to-text is unavailable. It requires a valid OpenAI provider and FFmpeg must be installed." } } diff --git a/webview-ui/src/i18n/locales/es/kilocode.json b/webview-ui/src/i18n/locales/es/kilocode.json index c49e012eca0..f0883096c7d 100644 --- a/webview-ui/src/i18n/locales/es/kilocode.json +++ b/webview-ui/src/i18n/locales/es/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Iniciar entrada de voz", - "stopRecording": "Detener entrada de voz" + "stopRecording": "Detener entrada de voz", + "unavailableOpenAiKeyMissing": "La conversión de voz a texto no está disponible. Requiere un proveedor OpenAI válido con una clave API para utilizar la transcripción de voz.", + "unavailableFfmpegNotInstalled": "La conversión de voz a texto no está disponible. Instale FFmpeg para usar la transcripción de voz.", + "unavailableBoth": "El reconocimiento de voz a texto no está disponible. Requiere un proveedor válido de OpenAI y FFmpeg debe estar instalado." } } diff --git a/webview-ui/src/i18n/locales/fr/kilocode.json b/webview-ui/src/i18n/locales/fr/kilocode.json index 7b205648513..8bfa4b258ce 100644 --- a/webview-ui/src/i18n/locales/fr/kilocode.json +++ b/webview-ui/src/i18n/locales/fr/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Démarrer la saisie vocale", - "stopRecording": "Arrêter la saisie vocale" + "stopRecording": "Arrêter la saisie vocale", + "unavailableOpenAiKeyMissing": "La reconnaissance vocale est indisponible. Elle nécessite un fournisseur OpenAI valide avec une clé API pour utiliser la transcription vocale.", + "unavailableFfmpegNotInstalled": "La reconnaissance vocale n'est pas disponible. Installez FFmpeg pour utiliser la transcription vocale.", + "unavailableBoth": "La reconnaissance vocale n'est pas disponible. Elle nécessite un fournisseur OpenAI valide et FFmpeg doit être installé." } } diff --git a/webview-ui/src/i18n/locales/hi/kilocode.json b/webview-ui/src/i18n/locales/hi/kilocode.json index b3e2bf2d595..ee5073948fa 100644 --- a/webview-ui/src/i18n/locales/hi/kilocode.json +++ b/webview-ui/src/i18n/locales/hi/kilocode.json @@ -327,7 +327,10 @@ "initiating": "प्रमाणीकरण शुरू हो रहा है..." }, "speechToText": { - "stopRecording": "वॉइस इनपुट बंद करें", - "startRecording": "वॉयस इनपुट शुरू करें" + "stopRecording": "आवाज़ इनपुट बंद करें", + "startRecording": "आवाज से इनपुट शुरू करें", + "unavailableFfmpegNotInstalled": "स्पीच-टू-टेक्स्ट अनुपलब्ध है। वॉयस ट्रांसक्रिप्शन का उपयोग करने के लिए FFmpeg इंस्टॉल करें।", + "unavailableOpenAiKeyMissing": "स्पीच-से-टेक्स्ट उपलब्ध नहीं है। इसके लिए आवाज़ ट्रांसक्रिप्शन का उपयोग करने के लिए एक वैध OpenAI प्रदाता और API कुंजी की आवश्यकता है।", + "unavailableBoth": "स्पीच-टू-टेक्स्ट उपलब्ध नहीं है। इसके लिए एक मान्य OpenAI प्रदाता की आवश्यकता है और FFmpeg इंस्टॉल होना चाहिए।" } } diff --git a/webview-ui/src/i18n/locales/id/kilocode.json b/webview-ui/src/i18n/locales/id/kilocode.json index c92c6632eb8..74c4c6c7c20 100644 --- a/webview-ui/src/i18n/locales/id/kilocode.json +++ b/webview-ui/src/i18n/locales/id/kilocode.json @@ -327,7 +327,10 @@ "initiating": "Memulai autentikasi..." }, "speechToText": { - "startRecording": "Mulai input suara", - "stopRecording": "Hentikan input suara" + "startRecording": "Mulai masukan suara", + "stopRecording": "Hentikan input suara", + "unavailableOpenAiKeyMissing": "Ucapan-ke-teks tidak tersedia. Ini memerlukan penyedia OpenAI yang valid dengan kunci API untuk menggunakan transkripsi suara.", + "unavailableFfmpegNotInstalled": "Ucapan-ke-teks tidak tersedia. Pasang FFmpeg untuk menggunakan transkripsi suara.", + "unavailableBoth": "Ucapan-ke-teks tidak tersedia. Fitur ini memerlukan penyedia OpenAI yang valid dan FFmpeg harus terpasang." } } diff --git a/webview-ui/src/i18n/locales/it/kilocode.json b/webview-ui/src/i18n/locales/it/kilocode.json index 1e18bc4a938..0dbd05d9bbf 100644 --- a/webview-ui/src/i18n/locales/it/kilocode.json +++ b/webview-ui/src/i18n/locales/it/kilocode.json @@ -327,7 +327,10 @@ "initiating": "Avvio autenticazione..." }, "speechToText": { - "startRecording": "Avvia input vocale", - "stopRecording": "Interrompi input vocale" + "startRecording": "Inizia l'input vocale", + "stopRecording": "Interrompi input vocale", + "unavailableOpenAiKeyMissing": "La conversione da voce a testo non è disponibile. Richiede un provider OpenAI valido con una chiave API per utilizzare la trascrizione vocale.", + "unavailableFfmpegNotInstalled": "La conversione vocale in testo non è disponibile. Installa FFmpeg per utilizzare la trascrizione vocale.", + "unavailableBoth": "Il riconoscimento vocale non è disponibile. Richiede un provider OpenAI valido e FFmpeg deve essere installato." } } diff --git a/webview-ui/src/i18n/locales/ja/kilocode.json b/webview-ui/src/i18n/locales/ja/kilocode.json index e47bd6b775e..8fb86d9585a 100644 --- a/webview-ui/src/i18n/locales/ja/kilocode.json +++ b/webview-ui/src/i18n/locales/ja/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "音声入力を開始", - "stopRecording": "音声入力を停止" + "stopRecording": "音声入力を停止", + "unavailableOpenAiKeyMissing": "音声認識は利用できません。音声文字変換を使用するには、APIキーを持つ有効なOpenAIプロバイダーが必要です。", + "unavailableFfmpegNotInstalled": "音声からテキストへの変換は利用できません。音声の文字起こしを使用するにはFFmpegをインストールしてください。", + "unavailableBoth": "音声からテキストへの変換は利用できません。有効なOpenAIプロバイダーが必要で、FFmpegがインストールされている必要があります。" } } diff --git a/webview-ui/src/i18n/locales/ko/kilocode.json b/webview-ui/src/i18n/locales/ko/kilocode.json index 64993f14772..0128986567f 100644 --- a/webview-ui/src/i18n/locales/ko/kilocode.json +++ b/webview-ui/src/i18n/locales/ko/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "stopRecording": "음성 입력 중지", - "startRecording": "음성 입력 시작" + "startRecording": "음성 입력 시작", + "unavailableBoth": "음성-텍스트 변환을 사용할 수 없습니다. OpenAI 제공업체가 유효해야 하며 FFmpeg가 설치되어 있어야 합니다.", + "unavailableFfmpegNotInstalled": "음성-텍스트 변환을 사용할 수 없습니다. 음성 전사를 위해 FFmpeg를 설치하세요.", + "unavailableOpenAiKeyMissing": "음성-텍스트 변환을 사용할 수 없습니다. 음성 전사를 사용하려면 API 키가 있는 유효한 OpenAI 제공업체가 필요합니다." } } diff --git a/webview-ui/src/i18n/locales/nl/kilocode.json b/webview-ui/src/i18n/locales/nl/kilocode.json index ba89823e5e0..7b4a7aedade 100644 --- a/webview-ui/src/i18n/locales/nl/kilocode.json +++ b/webview-ui/src/i18n/locales/nl/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Start spraakinvoer", - "stopRecording": "Stop sprakinvoer" + "stopRecording": "Stop spraakinvoer", + "unavailableOpenAiKeyMissing": "Spraak-naar-tekst is niet beschikbaar. Het vereist een geldige OpenAI provider met een API-sleutel om spraaktranscriptie te gebruiken.", + "unavailableBoth": "Spraak-naar-tekst is niet beschikbaar. Het vereist een geldige OpenAI-provider en FFmpeg moet geïnstalleerd zijn.", + "unavailableFfmpegNotInstalled": "Spraak-naar-tekst is niet beschikbaar. Installeer FFmpeg om spraaktranscriptie te gebruiken." } } diff --git a/webview-ui/src/i18n/locales/pl/kilocode.json b/webview-ui/src/i18n/locales/pl/kilocode.json index b1abde3f3b6..3a55404042f 100644 --- a/webview-ui/src/i18n/locales/pl/kilocode.json +++ b/webview-ui/src/i18n/locales/pl/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Rozpocznij wprowadzanie głosowe", - "stopRecording": "Zatrzymaj wprowadzanie głosowe" + "stopRecording": "Zatrzymaj wprowadzanie głosowe", + "unavailableFfmpegNotInstalled": "Transkrypcja mowy na tekst jest niedostępna. Zainstaluj FFmpeg, aby korzystać z transkrypcji głosowej.", + "unavailableOpenAiKeyMissing": "Zamiana mowy na tekst jest niedostępna. Wymaga poprawnego dostawcy OpenAI z kluczem API, aby korzystać z transkrypcji głosowej.", + "unavailableBoth": "Funkcja zamiany mowy na tekst jest niedostępna. Wymaga ona prawidłowego dostawcy OpenAI oraz zainstalowanego FFmpeg." } } diff --git a/webview-ui/src/i18n/locales/pt-BR/kilocode.json b/webview-ui/src/i18n/locales/pt-BR/kilocode.json index 2f6aae94bc8..e164a3f9b0d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/kilocode.json +++ b/webview-ui/src/i18n/locales/pt-BR/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Iniciar entrada de voz", - "stopRecording": "Parar entrada de voz" + "stopRecording": "Parar entrada de voz", + "unavailableOpenAiKeyMissing": "Conversão de voz para texto indisponível. É necessário um provedor OpenAI válido com uma chave de API para usar a transcrição de voz.", + "unavailableBoth": "O reconhecimento de voz não está disponível. Ele requer um provedor OpenAI válido e o FFmpeg deve estar instalado.", + "unavailableFfmpegNotInstalled": "Transcrição de voz não está disponível. Instale o FFmpeg para usar a transcrição de voz." } } diff --git a/webview-ui/src/i18n/locales/ru/kilocode.json b/webview-ui/src/i18n/locales/ru/kilocode.json index 7bd92666fcf..cac2fdfb609 100644 --- a/webview-ui/src/i18n/locales/ru/kilocode.json +++ b/webview-ui/src/i18n/locales/ru/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Начать голосовой ввод", - "stopRecording": "Остановить голосовой ввод" + "stopRecording": "Остановить голосовой ввод", + "unavailableOpenAiKeyMissing": "Преобразование речи в текст недоступно. Для использования голосовой транскрипции требуется действительный поставщик OpenAI с API-ключом.", + "unavailableFfmpegNotInstalled": "Преобразование речи в текст недоступно. Установите FFmpeg для использования транскрипции голоса.", + "unavailableBoth": "Преобразование речи в текст недоступно. Для этого требуется действительный провайдер OpenAI, и должен быть установлен FFmpeg." } } diff --git a/webview-ui/src/i18n/locales/th/kilocode.json b/webview-ui/src/i18n/locales/th/kilocode.json index 69b8a5ae55d..c1e49c20642 100644 --- a/webview-ui/src/i18n/locales/th/kilocode.json +++ b/webview-ui/src/i18n/locales/th/kilocode.json @@ -327,7 +327,10 @@ "initiating": "กำลังเริ่มการยืนยันตัวตน..." }, "speechToText": { - "startRecording": "เริ่มการป้อนเสียง", - "stopRecording": "หยุดการป้อนเสียง" + "startRecording": "เริ่มต้นป้อนข้อมูลด้วยเสียง", + "stopRecording": "หยุดการป้อนข้อมูลด้วยเสียง", + "unavailableOpenAiKeyMissing": "การแปลงเสียงเป็นข้อความไม่สามารถใช้งานได้ จำเป็นต้องมีผู้ให้บริการ OpenAI ที่ถูกต้องพร้อมกับ API key เพื่อใช้งานการถอดเสียง", + "unavailableBoth": "การแปลงเสียงเป็นข้อความไม่สามารถใช้งานได้ จำเป็นต้องมีผู้ให้บริการ OpenAI ที่ถูกต้องและต้องติดตั้ง FFmpeg", + "unavailableFfmpegNotInstalled": "ไม่สามารถใช้การแปลงเสียงเป็นข้อความได้ โปรดติดตั้ง FFmpeg เพื่อใช้งานการถอดเสียง" } } diff --git a/webview-ui/src/i18n/locales/tr/kilocode.json b/webview-ui/src/i18n/locales/tr/kilocode.json index 688bd768319..5871322b947 100644 --- a/webview-ui/src/i18n/locales/tr/kilocode.json +++ b/webview-ui/src/i18n/locales/tr/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Sesli girişi başlat", - "stopRecording": "Sesli girişi durdur" + "stopRecording": "Sesli girişi durdur", + "unavailableOpenAiKeyMissing": "Konuşmadan metne dönüştürme kullanılamıyor. Ses transkripsiyonunu kullanabilmek için API anahtarına sahip geçerli bir OpenAI sağlayıcısı gerekiyor.", + "unavailableFfmpegNotInstalled": "Konuşmayı metne dönüştürme kullanılamıyor. Ses transkripsiyonunu kullanmak için FFmpeg'i yükleyin.", + "unavailableBoth": "Konuşmadan metne dönüştürme özelliği kullanılamıyor. Geçerli bir OpenAI sağlayıcısı gerektirir ve FFmpeg yüklü olmalıdır." } } diff --git a/webview-ui/src/i18n/locales/uk/kilocode.json b/webview-ui/src/i18n/locales/uk/kilocode.json index 6cfad3724eb..db8bc5fb3be 100644 --- a/webview-ui/src/i18n/locales/uk/kilocode.json +++ b/webview-ui/src/i18n/locales/uk/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "Почати голосове введення", - "stopRecording": "Зупинити голосове введення" + "stopRecording": "Зупинити голосове введення", + "unavailableFfmpegNotInstalled": "Розпізнавання мовлення недоступне. Встановіть FFmpeg для використання голосової транскрипції.", + "unavailableBoth": "Перетворення мови в текст недоступне. Воно потребує дійсного провайдера OpenAI, а також має бути встановлено FFmpeg.", + "unavailableOpenAiKeyMissing": "Розпізнавання мовлення недоступне. Для використання транскрипції голосу потрібен дійсний провайдер OpenAI з API-ключем." } } diff --git a/webview-ui/src/i18n/locales/vi/kilocode.json b/webview-ui/src/i18n/locales/vi/kilocode.json index eb5ac32091f..fe4f4839749 100644 --- a/webview-ui/src/i18n/locales/vi/kilocode.json +++ b/webview-ui/src/i18n/locales/vi/kilocode.json @@ -327,7 +327,10 @@ "initiating": "Đang bắt đầu xác thực..." }, "speechToText": { - "stopRecording": "Dừng nhập bằng giọng nói", - "startRecording": "Bắt đầu nhập bằng giọng nói" + "stopRecording": "Dừng nhập giọng nói", + "startRecording": "Bắt đầu nhập giọng nói", + "unavailableBoth": "Chuyển đổi giọng nói thành văn bản không khả dụng. Nó yêu cầu nhà cung cấp OpenAI hợp lệ và FFmpeg phải được cài đặt.", + "unavailableFfmpegNotInstalled": "Chuyển giọng nói thành văn bản hiện không khả dụng. Hãy cài đặt FFmpeg để sử dụng tính năng chuyển giọng nói.", + "unavailableOpenAiKeyMissing": "Chuyển giọng nói thành văn bản không khả dụng. Tính năng này yêu cầu một nhà cung cấp OpenAI hợp lệ với khóa API để sử dụng chức năng chuyển giọng nói thành văn bản." } } diff --git a/webview-ui/src/i18n/locales/zh-CN/kilocode.json b/webview-ui/src/i18n/locales/zh-CN/kilocode.json index f09bafe07f4..7e2e57de20f 100644 --- a/webview-ui/src/i18n/locales/zh-CN/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-CN/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "开始语音输入", - "stopRecording": "停止语音输入" + "stopRecording": "停止语音输入", + "unavailableOpenAiKeyMissing": "语音转文字功能不可用。使用语音转录需要有效的OpenAI提供商及其API密钥。", + "unavailableFfmpegNotInstalled": "语音转文字功能不可用。请安装FFmpeg以使用语音转录功能。", + "unavailableBoth": "语音转文字功能不可用。它需要有效的OpenAI提供商,且必须安装FFmpeg。" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/kilocode.json b/webview-ui/src/i18n/locales/zh-TW/kilocode.json index 83ec484cfaf..cc4c713240d 100644 --- a/webview-ui/src/i18n/locales/zh-TW/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-TW/kilocode.json @@ -328,6 +328,9 @@ }, "speechToText": { "startRecording": "开始语音输入", - "stopRecording": "停止语音输入" + "stopRecording": "停止语音输入", + "unavailableFfmpegNotInstalled": "语音转文本功能不可用。请安装FFmpeg以使用语音转录功能。", + "unavailableOpenAiKeyMissing": "语音转文字功能不可用。使用语音转录功能需要有效的OpenAI提供商及API密钥。", + "unavailableBoth": "语音转文字功能不可用。它需要有效的OpenAI提供商,并且必须安装FFmpeg。" } }