feat(i18n): translate the dictation pill, error pill and queued-send copy (#40266)

* fix(dictation): don't throw when the paired web client has no speech catalog

* feat(i18n): translate the dictation pill, error pill and queued-send copy

* fix(i18n): say Chinese queued sends happen automatically
This commit is contained in:
Kelvin Amoaba
2026-11-09 10:03:37 +00:00
committed by GitHub
parent 75c37220b5
commit 0684ef586f
11 changed files with 172 additions and 21 deletions
@@ -75,7 +75,8 @@ function useIsCloudModel(): boolean {
let current = true
if (!catalogRequest) {
catalogRequest = Promise.resolve()
.then(() => window.api.speech.getCatalog())
// The paired web client's fallback resolves with nothing rather than a list.
.then(async () => (await window.api.speech.getCatalog()) ?? [])
.catch(() => [])
}
void catalogRequest.then((catalog) => {
+17 -2
View File
@@ -16974,7 +16974,8 @@
"micFallback": "Ausgewähltes Mikrofon nicht verfügbar. Systemstandard wird verwendet.",
"micDisconnected": "Mikrofon getrennt. Diktat gestoppt.",
"cloudLimitReached": "Diktat am 10-Minuten-Limit der Cloud gestoppt.",
"stoppedAfterSilence": "Nach einer Minute Stille beendet"
"stoppedAfterSilence": "Nach einer Minute Stille beendet",
"retryUnmatched": "Beim erneuten Versuch war nicht erkennbar, welche Wörter schon eingegeben waren, daher wurden alle eingefügt."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "Das Diktat konnte nicht eingefügt werden und wurde in die Zwischenablage kopiert.",
@@ -16982,7 +16983,21 @@
"lost": "Das Diktat konnte weder eingefügt noch kopiert werden."
},
"DictationIndicator": {
"4977162383": "Zu laut"
"4977162383": "Zu laut",
"finishing": "Wird abgeschlossen…",
"listening": "Hört zu…",
"cancel": "Abbrechen",
"finish": "Fertig",
"oneMinuteLeft": "Noch eine Minute.",
"sendsWhenLanded": "Sendet, sobald der Text da ist",
"entersWhenLanded": "Drückt Enter, sobald der Text da ist"
},
"DictationPillFailure": {
"discard": "Aufnahme verwerfen",
"modelFailed": "Modell nicht geladen.",
"transcribeFailed": "Nicht erkannt. Aufnahme behalten.",
"openSettings": "Einstellungen",
"retry": "Wiederholen"
}
},
"dashboard": {
+17 -2
View File
@@ -16700,7 +16700,8 @@
"micFallback": "Micrófono seleccionado no disponible. Se usará el predeterminado del sistema.",
"micDisconnected": "Micrófono desconectado. Dictado detenido.",
"cloudLimitReached": "Dictado detenido al llegar al límite de 10 minutos en la nube.",
"stoppedAfterSilence": "Se detuvo tras un minuto de silencio"
"stoppedAfterSilence": "Se detuvo tras un minuto de silencio",
"retryUnmatched": "Al reintentar no se pudo saber qué palabras ya estaban escritas, así que se insertaron todas."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "No se pudo insertar el dictado, así que se copió al portapapeles.",
@@ -16708,7 +16709,21 @@
"lost": "No se pudo insertar ni copiar el dictado."
},
"DictationIndicator": {
"4977162383": "Volumen demasiado alto"
"4977162383": "Volumen demasiado alto",
"finishing": "Terminando…",
"listening": "Escuchando…",
"cancel": "Cancelar",
"finish": "Terminar",
"oneMinuteLeft": "Queda un minuto.",
"sendsWhenLanded": "Se enviará cuando llegue el texto",
"entersWhenLanded": "Pulsará Enter cuando llegue el texto"
},
"DictationPillFailure": {
"discard": "Descartar grabación",
"modelFailed": "El modelo no cargó.",
"transcribeFailed": "No se transcribió. Grabación guardada.",
"openSettings": "Configuración",
"retry": "Reintentar"
}
},
"dashboard": {
+17 -2
View File
@@ -16925,7 +16925,8 @@
"micFallback": "Micro sélectionné indisponible. Utilisation du micro par défaut du système.",
"micDisconnected": "Micro déconnecté. Dictée arrêtée.",
"cloudLimitReached": "Dictée arrêtée à la limite cloud de 10 minutes.",
"stoppedAfterSilence": "Arrêt après une minute de silence"
"stoppedAfterSilence": "Arrêt après une minute de silence",
"retryUnmatched": "La nouvelle tentative n'a pas pu repérer les mots déjà saisis, ils ont donc tous été insérés."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "La dictée n'a pas pu être insérée, elle a donc été copiée dans le presse-papiers.",
@@ -16933,7 +16934,21 @@
"lost": "La dictée n'a pu être ni insérée ni copiée."
},
"DictationIndicator": {
"4977162383": "Trop fort"
"4977162383": "Trop fort",
"finishing": "Finalisation…",
"listening": "Écoute…",
"cancel": "Annuler",
"finish": "Terminer",
"oneMinuteLeft": "Plus qu’une minute.",
"sendsWhenLanded": "Envoi dès que le texte arrive",
"entersWhenLanded": "Entrée dès que le texte arrive"
},
"DictationPillFailure": {
"discard": "Supprimer l'enregistrement",
"modelFailed": "Modèle non chargé.",
"transcribeFailed": "Échec. Enregistrement conservé.",
"openSettings": "Paramètres",
"retry": "Réessayer"
}
},
"dashboard": {
+17 -2
View File
@@ -16298,7 +16298,8 @@
"micFallback": "選択したマイクが使用できません。システムのデフォルトを使用します。",
"micDisconnected": "マイクが接続されていません。ディクテーションが停止しました。",
"cloudLimitReached": "クラウドの10分の上限に達したため、ディクテーションが停止しました。",
"stoppedAfterSilence": "1分間音声がなかったため停止しました。"
"stoppedAfterSilence": "1分間音声がなかったため停止しました。",
"retryUnmatched": "再試行で入力済みの語句を特定できなかったため、すべて挿入しました。"
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "音声入力を挿入できなかったため、クリップボードにコピーしました。",
@@ -16306,7 +16307,21 @@
"lost": "音声入力を挿入もコピーもできませんでした。"
},
"DictationIndicator": {
"4977162383": "音量が大きすぎます"
"4977162383": "音量が大きすぎます",
"finishing": "仕上げ中…",
"listening": "聞き取り中…",
"cancel": "キャンセル",
"finish": "完了",
"oneMinuteLeft": "残り1分です。",
"sendsWhenLanded": "テキストの入力後に送信します",
"entersWhenLanded": "テキストの入力後に Enter を押します"
},
"DictationPillFailure": {
"discard": "録音を破棄",
"modelFailed": "音声モデルを読み込めません。",
"transcribeFailed": "文字起こしに失敗。録音は保持しました。",
"openSettings": "設定を開く",
"retry": "再試行"
}
},
"dashboard": {
+17 -2
View File
@@ -16298,7 +16298,8 @@
"micFallback": "선택한 마이크를 사용할 수 없습니다. 시스템 기본값을 사용합니다.",
"micDisconnected": "마이크 연결이 끊어졌습니다. 받아쓰기가 중지되었습니다.",
"cloudLimitReached": "클라우드 10분 제한에 도달해 받아쓰기가 중지되었습니다.",
"stoppedAfterSilence": "1분 동안 말소리가 없어 중지했습니다."
"stoppedAfterSilence": "1분 동안 말소리가 없어 중지했습니다.",
"retryUnmatched": "다시 시도할 때 이미 입력된 단어를 찾지 못해 전부 삽입했습니다."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "받아쓰기를 삽입할 수 없어 클립보드에 복사했습니다.",
@@ -16306,7 +16307,21 @@
"lost": "받아쓰기를 삽입하거나 복사할 수 없습니다."
},
"DictationIndicator": {
"4977162383": "음량이 너무 큽니다"
"4977162383": "음량이 너무 큽니다",
"finishing": "마무리 중…",
"listening": "듣는 중…",
"cancel": "취소",
"finish": "완료",
"oneMinuteLeft": "1분 남았습니다.",
"sendsWhenLanded": "텍스트가 입력되면 전송합니다",
"entersWhenLanded": "텍스트가 입력되면 Enter를 누릅니다"
},
"DictationPillFailure": {
"discard": "녹음 삭제",
"modelFailed": "음성 모델을 불러오지 못했습니다.",
"transcribeFailed": "받아쓰기에 실패했습니다. 녹음은 보관됩니다.",
"openSettings": "설정 열기",
"retry": "다시 시도"
}
},
"dashboard": {
+17 -2
View File
@@ -19259,7 +19259,8 @@
"micFallback": "O microfone selecionado não está disponível. Usando o padrão do sistema.",
"micDisconnected": "Microfone desconectado. O ditado foi interrompido.",
"cloudLimitReached": "O ditado foi interrompido no limite de 10 minutos da nuvem.",
"stoppedAfterSilence": "Parou após um minuto de silêncio"
"stoppedAfterSilence": "Parou após um minuto de silêncio",
"retryUnmatched": "Ao tentar de novo, não foi possível saber quais palavras já estavam digitadas, então todas foram inseridas."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "Não foi possível inserir o ditado, então ele foi copiado para a área de transferência.",
@@ -19267,7 +19268,21 @@
"lost": "Não foi possível inserir nem copiar o ditado."
},
"DictationIndicator": {
"4977162383": "Muito alto"
"4977162383": "Muito alto",
"finishing": "Finalizando…",
"listening": "Ouvindo…",
"cancel": "Cancelar",
"finish": "Concluir",
"oneMinuteLeft": "Falta um minuto.",
"sendsWhenLanded": "Envia quando o texto chegar",
"entersWhenLanded": "Pressiona Enter quando o texto chegar"
},
"DictationPillFailure": {
"discard": "Descartar gravação",
"modelFailed": "Modelo não carregou.",
"transcribeFailed": "Não transcrito. Gravação mantida.",
"openSettings": "Configurações",
"retry": "Repetir"
}
},
"link": {
+17 -2
View File
@@ -17470,7 +17470,8 @@
"micFallback": "Выбранный микрофон недоступен. Используется системный микрофон по умолчанию.",
"micDisconnected": "Микрофон отключён. Диктовка остановлена.",
"cloudLimitReached": "Диктовка остановлена: достигнут 10-минутный облачный лимит.",
"stoppedAfterSilence": "Остановлено после минуты тишины"
"stoppedAfterSilence": "Остановлено после минуты тишины",
"retryUnmatched": "При повторе не удалось понять, какие слова уже введены, поэтому вставлено всё."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "Не удалось вставить диктовку, поэтому она скопирована в буфер обмена.",
@@ -17478,7 +17479,21 @@
"lost": "Не удалось ни вставить, ни скопировать диктовку."
},
"DictationIndicator": {
"4977162383": "Слишком громко"
"4977162383": "Слишком громко",
"finishing": "Завершение…",
"listening": "Слушаю…",
"cancel": "Отмена",
"finish": "Готово",
"oneMinuteLeft": "Осталась минута.",
"sendsWhenLanded": "Отправится, когда текст появится",
"entersWhenLanded": "Нажмёт Enter, когда текст появится"
},
"DictationPillFailure": {
"discard": "Удалить запись",
"modelFailed": "Модель не загружена.",
"transcribeFailed": "Не удалось распознать. Запись сохранена.",
"openSettings": "Настройки",
"retry": "Повторить"
}
},
"dashboard": {
+17 -2
View File
@@ -16958,7 +16958,8 @@
"micFallback": "Seçili mikrofon kullanılamıyor. Sistem varsayılanı kullanılıyor.",
"micDisconnected": "Mikrofon bağlantısı kesildi. Dikte durduruldu.",
"cloudLimitReached": "Dikte, 10 dakikalık bulut sınırında durduruldu.",
"stoppedAfterSilence": "Bir dakika sessizlikten sonra durduruldu"
"stoppedAfterSilence": "Bir dakika sessizlikten sonra durduruldu",
"retryUnmatched": "Yeniden deneme hangi kelimelerin zaten yazıldığını anlayamadı, bu yüzden hepsini ekledi."
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "Dikte eklenemedi, bu yüzden panoya kopyalandı.",
@@ -16966,7 +16967,21 @@
"lost": "Dikte eklenemedi ve kopyalanamadı."
},
"DictationIndicator": {
"4977162383": "Çok yüksek sesli"
"4977162383": "Çok yüksek sesli",
"finishing": "Tamamlanıyor…",
"listening": "Dinleniyor…",
"cancel": "İptal",
"finish": "Bitir",
"oneMinuteLeft": "Bir dakika kaldı.",
"sendsWhenLanded": "Metin gelince gönderilecek",
"entersWhenLanded": "Metin gelince Enter'a basılacak"
},
"DictationPillFailure": {
"discard": "Kaydı sil",
"modelFailed": "Model yüklenemedi.",
"transcribeFailed": "Yazıya dökülemedi. Kayıt saklandı.",
"openSettings": "Ayarlar",
"retry": "Yeniden dene"
}
},
"dashboard": {
+17 -2
View File
@@ -16747,7 +16747,8 @@
"micFallback": "所選麥克風不可用。使用系統預設值。",
"micDisconnected": "麥克風已中斷連線。聽寫已停止。",
"cloudLimitReached": "已達 10 分鐘雲端上限。聽寫已停止。",
"stoppedAfterSilence": "靜音一分鐘後已停止"
"stoppedAfterSilence": "靜音一分鐘後已停止",
"retryUnmatched": "重試時無法判斷哪些字詞已輸入,因此已全部插入。"
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "無法插入聽寫內容,已複製到剪貼簿。",
@@ -16755,7 +16756,21 @@
"lost": "無法插入或複製聽寫內容。"
},
"DictationIndicator": {
"4977162383": "聲音太大"
"4977162383": "聲音太大",
"finishing": "正在完成…",
"listening": "正在聆聽…",
"cancel": "取消",
"finish": "完成",
"oneMinuteLeft": "剩下 1 分鐘。",
"sendsWhenLanded": "文字送達後自動傳送",
"entersWhenLanded": "文字送達後自動按 Enter"
},
"DictationPillFailure": {
"discard": "捨棄錄音",
"modelFailed": "無法載入語音模型。",
"transcribeFailed": "無法轉錄。已保留錄音。",
"openSettings": "開啟設定",
"retry": "重試"
}
},
"dashboard": {
+17 -2
View File
@@ -16298,7 +16298,8 @@
"micFallback": "所选麦克风不可用。使用系统默认值。",
"micDisconnected": "麦克风已断开。听写停止了。",
"cloudLimitReached": "已达 10 分钟云端上限。听写已停止。",
"stoppedAfterSilence": "静音一分钟后已停止"
"stoppedAfterSilence": "静音一分钟后已停止",
"retryUnmatched": "重试时无法判断哪些字词已输入,因此已全部插入。"
},
"dictation-transcript-delivery": {
"copiedAfterFailedInsert": "无法插入听写内容,已复制到剪贴板。",
@@ -16306,7 +16307,21 @@
"lost": "无法插入或复制听写内容。"
},
"DictationIndicator": {
"4977162383": "音量过大"
"4977162383": "音量过大",
"finishing": "正在完成…",
"listening": "正在聆听…",
"cancel": "取消",
"finish": "完成",
"oneMinuteLeft": "还剩 1 分钟。",
"sendsWhenLanded": "文字送达后自动发送",
"entersWhenLanded": "文字送达后自动按 Enter"
},
"DictationPillFailure": {
"discard": "舍弃录音",
"modelFailed": "无法加载语音模型。",
"transcribeFailed": "无法转录。已保留录音。",
"openSettings": "打开设置",
"retry": "重试"
}
},
"dashboard": {