@mdaemon/html-editor 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -42885,6 +42885,567 @@ class LinkEditor {
42885
42885
  }
42886
42886
  }
42887
42887
  }
42888
+ const SPEECH_LANGUAGES = [
42889
+ { code: "ar-SA", name: "العربية" },
42890
+ { code: "ca-ES", name: "Català" },
42891
+ { code: "cs-CZ", name: "Čeština" },
42892
+ { code: "da-DK", name: "Dansk" },
42893
+ { code: "de-DE", name: "Deutsch" },
42894
+ { code: "el-GR", name: "Ελληνικά" },
42895
+ { code: "en-US", name: "English (US)" },
42896
+ { code: "en-GB", name: "English (UK)" },
42897
+ { code: "es-ES", name: "Español" },
42898
+ { code: "fi-FI", name: "Suomi" },
42899
+ { code: "fr-FR", name: "Français" },
42900
+ { code: "fr-CA", name: "Français (Canada)" },
42901
+ { code: "hu-HU", name: "Magyar" },
42902
+ { code: "id-ID", name: "Bahasa Indonesia" },
42903
+ { code: "it-IT", name: "Italiano" },
42904
+ { code: "ja-JP", name: "日本語" },
42905
+ { code: "ko-KR", name: "한국어" },
42906
+ { code: "nb-NO", name: "Norsk Bokmål" },
42907
+ { code: "nl-NL", name: "Nederlands" },
42908
+ { code: "pl-PL", name: "Polski" },
42909
+ { code: "pt-BR", name: "Português" },
42910
+ { code: "ro-RO", name: "Română" },
42911
+ { code: "ru-RU", name: "Русский" },
42912
+ { code: "sl-SI", name: "Slovenščina" },
42913
+ { code: "sr-RS", name: "Српски" },
42914
+ { code: "sv-SE", name: "Svenska" },
42915
+ { code: "th-TH", name: "ไทย" },
42916
+ { code: "tr-TR", name: "Türkçe" },
42917
+ { code: "vi-VN", name: "Tiếng Việt" },
42918
+ { code: "zh-CN", name: "中文 (简体)" },
42919
+ { code: "zh-TW", name: "中文 (繁體)" }
42920
+ ];
42921
+ const LOCALE_TO_BCP47$1 = {
42922
+ "ar": "ar-SA",
42923
+ "ca": "ca-ES",
42924
+ "cs": "cs-CZ",
42925
+ "da": "da-DK",
42926
+ "de": "de-DE",
42927
+ "el": "el-GR",
42928
+ "en": "en-US",
42929
+ "en-gb": "en-GB",
42930
+ "es": "es-ES",
42931
+ "fi": "fi-FI",
42932
+ "fr": "fr-FR",
42933
+ "fr-ca": "fr-CA",
42934
+ "hu": "hu-HU",
42935
+ "id": "id-ID",
42936
+ "it": "it-IT",
42937
+ "ja": "ja-JP",
42938
+ "ko": "ko-KR",
42939
+ "nb": "nb-NO",
42940
+ "nl": "nl-NL",
42941
+ "pl": "pl-PL",
42942
+ "pt": "pt-BR",
42943
+ "ro": "ro-RO",
42944
+ "ru": "ru-RU",
42945
+ "sl": "sl-SI",
42946
+ "sr": "sr-RS",
42947
+ "sv": "sv-SE",
42948
+ "th": "th-TH",
42949
+ "tr": "tr-TR",
42950
+ "vi": "vi-VN",
42951
+ "zh": "zh-CN",
42952
+ "zh-tw": "zh-TW"
42953
+ };
42954
+ function isSpeechRecognitionSupported() {
42955
+ return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
42956
+ }
42957
+ function getSpeechRecognitionConstructor$1() {
42958
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
42959
+ }
42960
+ class SpeechToText {
42961
+ options;
42962
+ overlay = null;
42963
+ dialog = null;
42964
+ recognition = null;
42965
+ isListening = false;
42966
+ finalTranscript = "";
42967
+ interimTranscript = "";
42968
+ lastConfidence = 0;
42969
+ restartTimer = null;
42970
+ // DOM references
42971
+ transcriptArea = null;
42972
+ confidenceEl = null;
42973
+ statusEl = null;
42974
+ startStopBtn = null;
42975
+ insertBtn = null;
42976
+ clearBtn = null;
42977
+ languageSelect = null;
42978
+ constructor(options) {
42979
+ this.options = options;
42980
+ }
42981
+ open() {
42982
+ if (this.overlay) {
42983
+ this.overlay.style.display = "flex";
42984
+ return;
42985
+ }
42986
+ this.createDialog();
42987
+ }
42988
+ close() {
42989
+ if (this.overlay) {
42990
+ this.overlay.style.display = "none";
42991
+ }
42992
+ this.stopRecognition();
42993
+ }
42994
+ destroy() {
42995
+ this.stopRecognition();
42996
+ this.overlay?.remove();
42997
+ this.overlay = null;
42998
+ this.dialog = null;
42999
+ this.transcriptArea = null;
43000
+ this.confidenceEl = null;
43001
+ this.statusEl = null;
43002
+ this.startStopBtn = null;
43003
+ this.insertBtn = null;
43004
+ this.clearBtn = null;
43005
+ this.languageSelect = null;
43006
+ }
43007
+ get editorLanguage() {
43008
+ return this.options.editor.getConfig().language ?? "en";
43009
+ }
43010
+ getDefaultSpeechLang() {
43011
+ return LOCALE_TO_BCP47$1[this.editorLanguage] ?? "en-US";
43012
+ }
43013
+ createDialog() {
43014
+ const trans = this.options.trans;
43015
+ this.overlay = document.createElement("div");
43016
+ this.overlay.className = "md-dialog-overlay";
43017
+ this.overlay.addEventListener("click", (e) => {
43018
+ if (e.target === this.overlay) this.close();
43019
+ });
43020
+ this.dialog = document.createElement("div");
43021
+ this.dialog.className = "md-dialog md-speechtotext-dialog";
43022
+ const header = document.createElement("div");
43023
+ header.className = "md-dialog-header";
43024
+ header.innerHTML = `
43025
+ <h3>${trans("Speech to Text")}</h3>
43026
+ <button type="button" class="md-dialog-close">×</button>
43027
+ `;
43028
+ header.querySelector(".md-dialog-close").addEventListener("click", () => this.close());
43029
+ const body = document.createElement("div");
43030
+ body.className = "md-dialog-body md-speechtotext-body";
43031
+ const langRow = document.createElement("div");
43032
+ langRow.className = "md-speechtotext-lang-row";
43033
+ const langLabel = document.createElement("label");
43034
+ langLabel.className = "md-speechtotext-label";
43035
+ langLabel.textContent = trans("Language");
43036
+ this.languageSelect = document.createElement("select");
43037
+ this.languageSelect.className = "md-speechtotext-language";
43038
+ const defaultLang = this.getDefaultSpeechLang();
43039
+ for (const lang of SPEECH_LANGUAGES) {
43040
+ const opt = document.createElement("option");
43041
+ opt.value = lang.code;
43042
+ opt.textContent = lang.name;
43043
+ if (lang.code === defaultLang) opt.selected = true;
43044
+ this.languageSelect.appendChild(opt);
43045
+ }
43046
+ langRow.appendChild(langLabel);
43047
+ langRow.appendChild(this.languageSelect);
43048
+ this.statusEl = document.createElement("div");
43049
+ this.statusEl.className = "md-speechtotext-status";
43050
+ this.statusEl.textContent = "";
43051
+ this.transcriptArea = document.createElement("div");
43052
+ this.transcriptArea.className = "md-speechtotext-transcript";
43053
+ this.confidenceEl = document.createElement("div");
43054
+ this.confidenceEl.className = "md-speechtotext-confidence";
43055
+ this.confidenceEl.textContent = "";
43056
+ const controls = document.createElement("div");
43057
+ controls.className = "md-speechtotext-controls";
43058
+ this.startStopBtn = document.createElement("button");
43059
+ this.startStopBtn.type = "button";
43060
+ this.startStopBtn.className = "md-speechtotext-btn md-speechtotext-btn-start";
43061
+ this.startStopBtn.textContent = trans("Start");
43062
+ this.startStopBtn.addEventListener("click", () => this.toggleRecognition());
43063
+ this.insertBtn = document.createElement("button");
43064
+ this.insertBtn.type = "button";
43065
+ this.insertBtn.className = "md-speechtotext-btn md-speechtotext-btn-insert";
43066
+ this.insertBtn.textContent = trans("Insert");
43067
+ this.insertBtn.addEventListener("click", () => this.insertTranscript());
43068
+ this.clearBtn = document.createElement("button");
43069
+ this.clearBtn.type = "button";
43070
+ this.clearBtn.className = "md-speechtotext-btn md-speechtotext-btn-clear";
43071
+ this.clearBtn.textContent = trans("Clear");
43072
+ this.clearBtn.addEventListener("click", () => this.clearTranscript());
43073
+ controls.appendChild(this.startStopBtn);
43074
+ controls.appendChild(this.insertBtn);
43075
+ controls.appendChild(this.clearBtn);
43076
+ body.appendChild(langRow);
43077
+ body.appendChild(this.statusEl);
43078
+ body.appendChild(this.transcriptArea);
43079
+ body.appendChild(this.confidenceEl);
43080
+ body.appendChild(controls);
43081
+ this.dialog.appendChild(header);
43082
+ this.dialog.appendChild(body);
43083
+ this.overlay.appendChild(this.dialog);
43084
+ document.body.appendChild(this.overlay);
43085
+ this.dialog.addEventListener("keydown", (e) => {
43086
+ if (e.key === "Escape") {
43087
+ this.close();
43088
+ }
43089
+ });
43090
+ }
43091
+ toggleRecognition() {
43092
+ if (this.isListening) {
43093
+ this.stopRecognition();
43094
+ } else {
43095
+ this.startRecognition();
43096
+ }
43097
+ }
43098
+ startRecognition() {
43099
+ const SpeechRecognitionCtor = getSpeechRecognitionConstructor$1();
43100
+ if (!SpeechRecognitionCtor) return;
43101
+ this.recognition = new SpeechRecognitionCtor();
43102
+ this.recognition.continuous = true;
43103
+ this.recognition.interimResults = true;
43104
+ this.recognition.maxAlternatives = 1;
43105
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43106
+ this.recognition.onresult = this.handleResult.bind(this);
43107
+ this.recognition.onerror = this.handleError.bind(this);
43108
+ this.recognition.onend = this.handleEnd.bind(this);
43109
+ try {
43110
+ this.recognition.start();
43111
+ this.isListening = true;
43112
+ this.updateButtonState();
43113
+ this.setStatus(this.options.trans("Listening..."));
43114
+ } catch {
43115
+ }
43116
+ }
43117
+ handleResult(event) {
43118
+ this.interimTranscript = "";
43119
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43120
+ const result = event.results[i];
43121
+ if (result.isFinal) {
43122
+ const text = result[0].transcript;
43123
+ if (this.finalTranscript.length > 0 && !this.finalTranscript.endsWith(" ") && !text.startsWith(" ")) {
43124
+ this.finalTranscript += " ";
43125
+ }
43126
+ this.finalTranscript += text;
43127
+ this.lastConfidence = result[0].confidence;
43128
+ } else {
43129
+ this.interimTranscript += result[0].transcript;
43130
+ }
43131
+ }
43132
+ this.updateTranscriptDisplay();
43133
+ this.updateConfidenceDisplay();
43134
+ }
43135
+ handleError(event) {
43136
+ const trans = this.options.trans;
43137
+ if (event.error === "no-speech") ;
43138
+ else if (event.error === "not-allowed") {
43139
+ this.stopRecognition();
43140
+ this.setStatus(trans("Microphone access denied"));
43141
+ } else if (event.error === "audio-capture") {
43142
+ this.stopRecognition();
43143
+ this.setStatus(trans("No microphone found"));
43144
+ } else if (event.error === "network") {
43145
+ this.stopRecognition();
43146
+ this.setStatus(trans("Network error - speech recognition requires internet"));
43147
+ } else if (event.error !== "aborted") ;
43148
+ }
43149
+ handleEnd() {
43150
+ if (this.isListening) {
43151
+ this.restartTimer = setTimeout(() => {
43152
+ if (!this.isListening) return;
43153
+ try {
43154
+ this.recognition?.start();
43155
+ } catch {
43156
+ const Ctor = getSpeechRecognitionConstructor$1();
43157
+ if (!Ctor) return;
43158
+ this.recognition = new Ctor();
43159
+ this.recognition.continuous = true;
43160
+ this.recognition.interimResults = true;
43161
+ this.recognition.maxAlternatives = 1;
43162
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43163
+ this.recognition.onresult = this.handleResult.bind(this);
43164
+ this.recognition.onerror = this.handleError.bind(this);
43165
+ this.recognition.onend = this.handleEnd.bind(this);
43166
+ try {
43167
+ this.recognition.start();
43168
+ } catch {
43169
+ this.stopRecognition();
43170
+ }
43171
+ }
43172
+ }, 300);
43173
+ }
43174
+ }
43175
+ stopRecognition() {
43176
+ this.isListening = false;
43177
+ if (this.restartTimer) {
43178
+ clearTimeout(this.restartTimer);
43179
+ this.restartTimer = null;
43180
+ }
43181
+ if (this.recognition) {
43182
+ try {
43183
+ this.recognition.stop();
43184
+ } catch {
43185
+ }
43186
+ this.recognition = null;
43187
+ }
43188
+ this.updateButtonState();
43189
+ this.setStatus("");
43190
+ }
43191
+ updateButtonState() {
43192
+ const trans = this.options.trans;
43193
+ if (this.startStopBtn) {
43194
+ if (this.isListening) {
43195
+ this.startStopBtn.textContent = trans("Stop");
43196
+ this.startStopBtn.classList.remove("md-speechtotext-btn-start");
43197
+ this.startStopBtn.classList.add("md-speechtotext-btn-stop");
43198
+ } else {
43199
+ this.startStopBtn.textContent = trans("Start");
43200
+ this.startStopBtn.classList.remove("md-speechtotext-btn-stop");
43201
+ this.startStopBtn.classList.add("md-speechtotext-btn-start");
43202
+ }
43203
+ }
43204
+ if (this.statusEl) {
43205
+ this.statusEl.classList.toggle("md-speechtotext-status-active", this.isListening);
43206
+ }
43207
+ }
43208
+ setStatus(text) {
43209
+ if (this.statusEl) {
43210
+ this.statusEl.textContent = text;
43211
+ }
43212
+ }
43213
+ updateTranscriptDisplay() {
43214
+ if (!this.transcriptArea) return;
43215
+ const finalSpan = `<span class="md-speechtotext-final">${this.escapeHtml(this.finalTranscript)}</span>`;
43216
+ const interimSpan = this.interimTranscript ? `<span class="md-speechtotext-interim">${this.escapeHtml(this.interimTranscript)}</span>` : "";
43217
+ this.transcriptArea.innerHTML = finalSpan + interimSpan;
43218
+ this.transcriptArea.scrollTop = this.transcriptArea.scrollHeight;
43219
+ }
43220
+ updateConfidenceDisplay() {
43221
+ if (!this.confidenceEl) return;
43222
+ if (this.lastConfidence > 0) {
43223
+ const pct = Math.round(this.lastConfidence * 100);
43224
+ this.confidenceEl.textContent = `${this.options.trans("Confidence")}: ${pct}%`;
43225
+ }
43226
+ }
43227
+ insertTranscript() {
43228
+ const text = this.finalTranscript.trim();
43229
+ if (!text) return;
43230
+ const tiptap = this.options.editor.getTipTap();
43231
+ if (tiptap) {
43232
+ tiptap.chain().focus().insertContent(text).run();
43233
+ }
43234
+ this.clearTranscript();
43235
+ this.close();
43236
+ }
43237
+ clearTranscript() {
43238
+ this.finalTranscript = "";
43239
+ this.interimTranscript = "";
43240
+ this.lastConfidence = 0;
43241
+ if (this.transcriptArea) {
43242
+ this.transcriptArea.innerHTML = "";
43243
+ }
43244
+ if (this.confidenceEl) {
43245
+ this.confidenceEl.textContent = "";
43246
+ }
43247
+ }
43248
+ escapeHtml(text) {
43249
+ const div = document.createElement("div");
43250
+ div.textContent = text;
43251
+ return div.innerHTML;
43252
+ }
43253
+ }
43254
+ const LOCALE_TO_BCP47 = {
43255
+ "ar": "ar-SA",
43256
+ "ca": "ca-ES",
43257
+ "cs": "cs-CZ",
43258
+ "da": "da-DK",
43259
+ "de": "de-DE",
43260
+ "el": "el-GR",
43261
+ "en": "en-US",
43262
+ "en-gb": "en-GB",
43263
+ "es": "es-ES",
43264
+ "fi": "fi-FI",
43265
+ "fr": "fr-FR",
43266
+ "fr-ca": "fr-CA",
43267
+ "hu": "hu-HU",
43268
+ "id": "id-ID",
43269
+ "it": "it-IT",
43270
+ "ja": "ja-JP",
43271
+ "ko": "ko-KR",
43272
+ "nb": "nb-NO",
43273
+ "nl": "nl-NL",
43274
+ "pl": "pl-PL",
43275
+ "pt": "pt-BR",
43276
+ "ro": "ro-RO",
43277
+ "ru": "ru-RU",
43278
+ "sl": "sl-SI",
43279
+ "sr": "sr-RS",
43280
+ "sv": "sv-SE",
43281
+ "th": "th-TH",
43282
+ "tr": "tr-TR",
43283
+ "vi": "vi-VN",
43284
+ "zh": "zh-CN",
43285
+ "zh-tw": "zh-TW"
43286
+ };
43287
+ function getSpeechRecognitionConstructor() {
43288
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
43289
+ }
43290
+ class Dictation {
43291
+ options;
43292
+ recognition = null;
43293
+ _isActive = false;
43294
+ restartTimer = null;
43295
+ // Tracks the start position of current interim text so we can replace it
43296
+ interimStart = null;
43297
+ interimLength = 0;
43298
+ constructor(options) {
43299
+ this.options = options;
43300
+ }
43301
+ get isActive() {
43302
+ return this._isActive;
43303
+ }
43304
+ toggle() {
43305
+ if (this._isActive) {
43306
+ this.stop();
43307
+ } else {
43308
+ this.start();
43309
+ }
43310
+ }
43311
+ start() {
43312
+ const Ctor = getSpeechRecognitionConstructor();
43313
+ if (!Ctor) return;
43314
+ this.recognition = new Ctor();
43315
+ this.recognition.continuous = true;
43316
+ this.recognition.interimResults = true;
43317
+ this.recognition.maxAlternatives = 1;
43318
+ this.recognition.lang = this.getSpeechLang();
43319
+ this.recognition.onresult = this.handleResult.bind(this);
43320
+ this.recognition.onerror = this.handleError.bind(this);
43321
+ this.recognition.onend = this.handleEnd.bind(this);
43322
+ try {
43323
+ this.recognition.start();
43324
+ this._isActive = true;
43325
+ this.interimStart = null;
43326
+ this.interimLength = 0;
43327
+ this.options.onStateChange?.(true);
43328
+ } catch {
43329
+ }
43330
+ }
43331
+ stop() {
43332
+ this._isActive = false;
43333
+ if (this.restartTimer) {
43334
+ clearTimeout(this.restartTimer);
43335
+ this.restartTimer = null;
43336
+ }
43337
+ this.clearInterim();
43338
+ if (this.recognition) {
43339
+ try {
43340
+ this.recognition.stop();
43341
+ } catch {
43342
+ }
43343
+ this.recognition = null;
43344
+ }
43345
+ this.options.onStateChange?.(false);
43346
+ }
43347
+ destroy() {
43348
+ this.stop();
43349
+ }
43350
+ getSpeechLang() {
43351
+ const locale = this.options.editor.getConfig().language ?? "en";
43352
+ return LOCALE_TO_BCP47[locale] ?? "en-US";
43353
+ }
43354
+ handleResult(event) {
43355
+ const tiptap = this.options.editor.getTipTap();
43356
+ if (!tiptap) return;
43357
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43358
+ const result = event.results[i];
43359
+ const transcript = result[0].transcript;
43360
+ if (result.isFinal) {
43361
+ this.clearInterim();
43362
+ let text = transcript;
43363
+ if (this.needsLeadingSpace(text)) {
43364
+ text = " " + text;
43365
+ }
43366
+ tiptap.chain().focus().insertContent(text).run();
43367
+ } else {
43368
+ let text = transcript;
43369
+ if (this.interimStart === null && this.needsLeadingSpace(text)) {
43370
+ text = " " + text;
43371
+ }
43372
+ this.replaceInterim(text);
43373
+ }
43374
+ }
43375
+ }
43376
+ /** Replace the current interim text in the editor with new interim text */
43377
+ replaceInterim(text) {
43378
+ const tiptap = this.options.editor.getTipTap();
43379
+ if (!tiptap) return;
43380
+ if (this.interimStart !== null && this.interimLength > 0) {
43381
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43382
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43383
+ return true;
43384
+ }).run();
43385
+ }
43386
+ if (this.interimStart === null) {
43387
+ this.interimStart = tiptap.state.selection.from;
43388
+ }
43389
+ tiptap.chain().focus().insertContent(text).run();
43390
+ this.interimLength = text.length;
43391
+ }
43392
+ /** Remove interim text without inserting anything */
43393
+ clearInterim() {
43394
+ if (this.interimStart !== null && this.interimLength > 0) {
43395
+ const tiptap = this.options.editor.getTipTap();
43396
+ if (tiptap) {
43397
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43398
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43399
+ return true;
43400
+ }).run();
43401
+ }
43402
+ }
43403
+ this.interimStart = null;
43404
+ this.interimLength = 0;
43405
+ }
43406
+ needsLeadingSpace(newText) {
43407
+ if (newText.startsWith(" ")) return false;
43408
+ const tiptap = this.options.editor.getTipTap();
43409
+ if (!tiptap) return false;
43410
+ const { from: from2 } = tiptap.state.selection;
43411
+ if (from2 === 0) return false;
43412
+ const textBefore = tiptap.state.doc.textBetween(Math.max(0, from2 - 1), from2, "");
43413
+ if (!textBefore) return false;
43414
+ return textBefore.trim().length > 0;
43415
+ }
43416
+ handleError(event) {
43417
+ if (event.error === "no-speech") ;
43418
+ else if (event.error === "not-allowed" || event.error === "audio-capture" || event.error === "network") {
43419
+ this.stop();
43420
+ }
43421
+ }
43422
+ handleEnd() {
43423
+ if (this._isActive) {
43424
+ this.restartTimer = setTimeout(() => {
43425
+ if (!this._isActive) return;
43426
+ try {
43427
+ this.recognition?.start();
43428
+ } catch {
43429
+ const Ctor = getSpeechRecognitionConstructor();
43430
+ if (!Ctor) return;
43431
+ this.recognition = new Ctor();
43432
+ this.recognition.continuous = true;
43433
+ this.recognition.interimResults = true;
43434
+ this.recognition.maxAlternatives = 1;
43435
+ this.recognition.lang = this.getSpeechLang();
43436
+ this.recognition.onresult = this.handleResult.bind(this);
43437
+ this.recognition.onerror = this.handleError.bind(this);
43438
+ this.recognition.onend = this.handleEnd.bind(this);
43439
+ try {
43440
+ this.recognition.start();
43441
+ } catch {
43442
+ this.stop();
43443
+ }
43444
+ }
43445
+ }, 300);
43446
+ }
43447
+ }
43448
+ }
42888
43449
  const DEFAULT_BUTTON_PRIORITY = {
42889
43450
  bold: 1,
42890
43451
  italic: 1,
@@ -42947,6 +43508,8 @@ class Toolbar {
42947
43508
  searchReplace = null;
42948
43509
  sourceEditor = null;
42949
43510
  linkEditor = null;
43511
+ speechToText = null;
43512
+ dictation = null;
42950
43513
  updateInterval = null;
42951
43514
  boundClickHandler = null;
42952
43515
  boundKeydownHandler = null;
@@ -43263,6 +43826,32 @@ class Toolbar {
43263
43826
  return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
43264
43827
  this.openSearchReplace();
43265
43828
  });
43829
+ case "speechtotext": {
43830
+ if (this.options.config.speech_to_text === false) return null;
43831
+ if (!isSpeechRecognitionSupported()) {
43832
+ const btn = this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to text is not supported in this browser"), () => {
43833
+ });
43834
+ btn.classList.add("md-toolbar-btn-disabled");
43835
+ btn.setAttribute("aria-disabled", "true");
43836
+ return btn;
43837
+ }
43838
+ return this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to Text"), () => {
43839
+ this.openSpeechToText();
43840
+ });
43841
+ }
43842
+ case "dictate": {
43843
+ if (this.options.config.speech_to_text === false) return null;
43844
+ if (!isSpeechRecognitionSupported()) {
43845
+ const btn = this.createActionButton("dictate", this.icon("dictate"), this.trans("Speech to text is not supported in this browser"), () => {
43846
+ });
43847
+ btn.classList.add("md-toolbar-btn-disabled");
43848
+ btn.setAttribute("aria-disabled", "true");
43849
+ return btn;
43850
+ }
43851
+ return this.createActionButton("dictate", this.icon("dictate"), this.trans("Dictate"), () => {
43852
+ this.toggleDictation();
43853
+ });
43854
+ }
43266
43855
  case "template":
43267
43856
  return this.createTemplateDropdown();
43268
43857
  default:
@@ -43695,6 +44284,31 @@ class Toolbar {
43695
44284
  }
43696
44285
  this.searchReplace.open();
43697
44286
  }
44287
+ openSpeechToText() {
44288
+ if (!this.speechToText) {
44289
+ this.speechToText = new SpeechToText({
44290
+ editor: this.options.editor,
44291
+ trans: this.trans
44292
+ });
44293
+ }
44294
+ this.speechToText.open();
44295
+ }
44296
+ toggleDictation() {
44297
+ if (!this.dictation) {
44298
+ this.dictation = new Dictation({
44299
+ editor: this.options.editor,
44300
+ trans: this.trans,
44301
+ onStateChange: (isActive2) => {
44302
+ const btn = this.buttonElements.get("dictate");
44303
+ if (btn) {
44304
+ btn.classList.toggle("md-toolbar-btn-active", isActive2);
44305
+ btn.classList.toggle("md-toolbar-btn-dictating", isActive2);
44306
+ }
44307
+ }
44308
+ });
44309
+ }
44310
+ this.dictation.toggle();
44311
+ }
43698
44312
  openSourceCode() {
43699
44313
  if (!this.sourceEditor) {
43700
44314
  this.sourceEditor = new SourceEditor({
@@ -43743,6 +44357,10 @@ class Toolbar {
43743
44357
  this.imageUpload = null;
43744
44358
  this.searchReplace?.destroy();
43745
44359
  this.searchReplace = null;
44360
+ this.speechToText?.destroy();
44361
+ this.speechToText = null;
44362
+ this.dictation?.destroy();
44363
+ this.dictation = null;
43746
44364
  this.buttonElements.clear();
43747
44365
  this.dropdowns.clear();
43748
44366
  this.removeBodyMenus();
@@ -43765,6 +44383,8 @@ class Toolbar {
43765
44383
  this.emojiPicker?.destroy();
43766
44384
  this.imageUpload?.destroy();
43767
44385
  this.searchReplace?.destroy();
44386
+ this.speechToText?.destroy();
44387
+ this.dictation?.destroy();
43768
44388
  this.buttonElements.clear();
43769
44389
  this.dropdowns.clear();
43770
44390
  this.removeBodyMenus();
@@ -43814,6 +44434,8 @@ const DEFAULT_ICONS = {
43814
44434
  ltr: "⇐",
43815
44435
  rtl: "⇒",
43816
44436
  searchreplace: "🔍",
44437
+ speechtotext: "🎤",
44438
+ dictate: "🎙️",
43817
44439
  togglemore: "…"
43818
44440
  };
43819
44441
  const CONFAB_ICONS = {
@@ -43847,6 +44469,8 @@ const CONFAB_ICONS = {
43847
44469
  ltr: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="18" y1="5" x2="18" y2="19"/><path d="M8 5a4 4 0 0 0 0 8h4"/><polyline points="4 17 8 21 12 17"/></svg>',
43848
44470
  rtl: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="6" y1="5" x2="6" y2="19"/><path d="M16 5a4 4 0 0 1 0 8h-4"/><polyline points="20 17 16 21 12 17"/></svg>',
43849
44471
  searchreplace: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.6" y2="16.6"/></svg>',
44472
+ speechtotext: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>',
44473
+ dictate: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><circle cx="12" cy="12" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="8" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="16" r="0.5" fill="currentColor" stroke="none"/></svg>',
43850
44474
  togglemore: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="5" cy="12" r="1" fill="currentColor"/><circle cx="19" cy="12" r="1" fill="currentColor"/></svg>'
43851
44475
  };
43852
44476
  const FontSize = Extension.create({
@@ -44496,7 +45120,20 @@ const en = {
44496
45120
  "Title": "Title",
44497
45121
  "Open link in...": "Open link in...",
44498
45122
  "Current window": "Current window",
44499
- "New window": "New window"
45123
+ "New window": "New window",
45124
+ "Speech to Text": "Speech to Text",
45125
+ "Dictate": "Dictate",
45126
+ "Start": "Start",
45127
+ "Stop": "Stop",
45128
+ "Clear": "Clear",
45129
+ "Language": "Language",
45130
+ "Confidence": "Confidence",
45131
+ "Listening...": "Listening...",
45132
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45133
+ "No speech detected": "No speech detected",
45134
+ "Microphone access denied": "Microphone access denied",
45135
+ "No microphone found": "No microphone found",
45136
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44500
45137
  };
44501
45138
  const ar = {
44502
45139
  "Bold": "غامق",
@@ -44554,7 +45191,7 @@ const ar = {
44554
45191
  "Browse...": "استعراض...",
44555
45192
  "Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
44556
45193
  "Alt text": "نص بديل",
44557
- "Insert": "إدراج",
45194
+ "Insert": "?????",
44558
45195
  "Cancel": "إلغاء",
44559
45196
  "Uploading...": "جارٍ الرفع...",
44560
45197
  "Upload failed": "فشل الرفع",
@@ -44568,7 +45205,20 @@ const ar = {
44568
45205
  "Title": "Title",
44569
45206
  "Open link in...": "Open link in...",
44570
45207
  "Current window": "Current window",
44571
- "New window": "New window"
45208
+ "New window": "New window",
45209
+ "Speech to Text": "????? ?????? ??? ??",
45210
+ "Dictate": "إملاء",
45211
+ "Start": "???",
45212
+ "Stop": "?????",
45213
+ "Clear": "???",
45214
+ "Language": "?????",
45215
+ "Confidence": "?????",
45216
+ "Listening...": "???? ????????...",
45217
+ "Speech to text is not supported in this browser": "????? ?????? ??? ?? ??? ????? ?? ??? ???????",
45218
+ "No speech detected": "?? ??? ?????? ????",
45219
+ "Microphone access denied": "?? ??? ?????? ??? ??????????",
45220
+ "No microphone found": "No microphone found",
45221
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44572
45222
  };
44573
45223
  const ca = {
44574
45224
  "Bold": "Negreta",
@@ -44640,7 +45290,20 @@ const ca = {
44640
45290
  "Title": "Title",
44641
45291
  "Open link in...": "Open link in...",
44642
45292
  "Current window": "Current window",
44643
- "New window": "New window"
45293
+ "New window": "New window",
45294
+ "Speech to Text": "Veu a text",
45295
+ "Dictate": "Dictar",
45296
+ "Start": "Iniciar",
45297
+ "Stop": "Aturar",
45298
+ "Clear": "Esborrar",
45299
+ "Language": "Idioma",
45300
+ "Confidence": "Confian�a",
45301
+ "Listening...": "Escoltant...",
45302
+ "Speech to text is not supported in this browser": "La veu a text no �s compatible amb aquest navegador",
45303
+ "No speech detected": "No s'ha detectat veu",
45304
+ "Microphone access denied": "Acc�s al micr�fon denegat",
45305
+ "No microphone found": "No microphone found",
45306
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44644
45307
  };
44645
45308
  const zh = {
44646
45309
  "Bold": "粗体",
@@ -44698,7 +45361,7 @@ const zh = {
44698
45361
  "Browse...": "浏览...",
44699
45362
  "Drop image here or click to browse": "将图片拖放到此处或点击浏览",
44700
45363
  "Alt text": "替代文本",
44701
- "Insert": "插入",
45364
+ "Insert": "??",
44702
45365
  "Cancel": "取消",
44703
45366
  "Uploading...": "上传中...",
44704
45367
  "Upload failed": "上传失败",
@@ -44712,7 +45375,20 @@ const zh = {
44712
45375
  "Title": "Title",
44713
45376
  "Open link in...": "Open link in...",
44714
45377
  "Current window": "Current window",
44715
- "New window": "New window"
45378
+ "New window": "New window",
45379
+ "Speech to Text": "?????",
45380
+ "Dictate": "听写",
45381
+ "Start": "??",
45382
+ "Stop": "??",
45383
+ "Clear": "??",
45384
+ "Language": "??",
45385
+ "Confidence": "???",
45386
+ "Listening...": "????...",
45387
+ "Speech to text is not supported in this browser": "????????????",
45388
+ "No speech detected": "??????",
45389
+ "Microphone access denied": "????????",
45390
+ "No microphone found": "No microphone found",
45391
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44716
45392
  };
44717
45393
  const cs = {
44718
45394
  "Bold": "Tučné",
@@ -44770,7 +45446,7 @@ const cs = {
44770
45446
  "Browse...": "Procházet...",
44771
45447
  "Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
44772
45448
  "Alt text": "Alternativní text",
44773
- "Insert": "Vložit",
45449
+ "Insert": "Vlo�it",
44774
45450
  "Cancel": "Zrušit",
44775
45451
  "Uploading...": "Nahrávání...",
44776
45452
  "Upload failed": "Nahrávání selhalo",
@@ -44784,7 +45460,20 @@ const cs = {
44784
45460
  "Title": "Title",
44785
45461
  "Open link in...": "Open link in...",
44786
45462
  "Current window": "Current window",
44787
- "New window": "New window"
45463
+ "New window": "New window",
45464
+ "Speech to Text": "Rec na text",
45465
+ "Dictate": "Diktovat",
45466
+ "Start": "Spustit",
45467
+ "Stop": "Zastavit",
45468
+ "Clear": "Vymazat",
45469
+ "Language": "Jazyk",
45470
+ "Confidence": "Spolehlivost",
45471
+ "Listening...": "Poslouch�m...",
45472
+ "Speech to text is not supported in this browser": "Rec na text nen� v tomto prohl�eci podporov�na",
45473
+ "No speech detected": "Nebyla detekov�na rec",
45474
+ "Microphone access denied": "Pr�stup k mikrofonu zam�tnut",
45475
+ "No microphone found": "No microphone found",
45476
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44788
45477
  };
44789
45478
  const da = {
44790
45479
  "Bold": "Fed",
@@ -44842,7 +45531,7 @@ const da = {
44842
45531
  "Browse...": "Gennemse...",
44843
45532
  "Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
44844
45533
  "Alt text": "Alternativ tekst",
44845
- "Insert": "Indsæt",
45534
+ "Insert": "Inds�t",
44846
45535
  "Cancel": "Annuller",
44847
45536
  "Uploading...": "Uploader...",
44848
45537
  "Upload failed": "Upload mislykkedes",
@@ -44856,7 +45545,20 @@ const da = {
44856
45545
  "Title": "Title",
44857
45546
  "Open link in...": "Open link in...",
44858
45547
  "Current window": "Current window",
44859
- "New window": "New window"
45548
+ "New window": "New window",
45549
+ "Speech to Text": "Tale til tekst",
45550
+ "Dictate": "Dikter",
45551
+ "Start": "Start",
45552
+ "Stop": "Stop",
45553
+ "Clear": "Ryd",
45554
+ "Language": "Sprog",
45555
+ "Confidence": "Tillid",
45556
+ "Listening...": "Lytter...",
45557
+ "Speech to text is not supported in this browser": "Tale til tekst underst�ttes ikke i denne browser",
45558
+ "No speech detected": "Ingen tale registreret",
45559
+ "Microphone access denied": "Mikrofonadgang n�gtet",
45560
+ "No microphone found": "No microphone found",
45561
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44860
45562
  };
44861
45563
  const enGb = {
44862
45564
  "Bold": "Bold",
@@ -44928,7 +45630,20 @@ const enGb = {
44928
45630
  "Title": "Title",
44929
45631
  "Open link in...": "Open link in...",
44930
45632
  "Current window": "Current window",
44931
- "New window": "New window"
45633
+ "New window": "New window",
45634
+ "Speech to Text": "Speech to Text",
45635
+ "Dictate": "Dictate",
45636
+ "Start": "Start",
45637
+ "Stop": "Stop",
45638
+ "Clear": "Clear",
45639
+ "Language": "Language",
45640
+ "Confidence": "Confidence",
45641
+ "Listening...": "Listening...",
45642
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45643
+ "No speech detected": "No speech detected",
45644
+ "Microphone access denied": "Microphone access denied",
45645
+ "No microphone found": "No microphone found",
45646
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44932
45647
  };
44933
45648
  const fi = {
44934
45649
  "Bold": "Lihavoitu",
@@ -44986,7 +45701,7 @@ const fi = {
44986
45701
  "Browse...": "Selaa...",
44987
45702
  "Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
44988
45703
  "Alt text": "Vaihtoehtoinen teksti",
44989
- "Insert": "Lisää",
45704
+ "Insert": "Lis��",
44990
45705
  "Cancel": "Peruuta",
44991
45706
  "Uploading...": "Ladataan...",
44992
45707
  "Upload failed": "Lataus epäonnistui",
@@ -45000,7 +45715,20 @@ const fi = {
45000
45715
  "Title": "Title",
45001
45716
  "Open link in...": "Open link in...",
45002
45717
  "Current window": "Current window",
45003
- "New window": "New window"
45718
+ "New window": "New window",
45719
+ "Speech to Text": "Puhe tekstiksi",
45720
+ "Dictate": "Sanele",
45721
+ "Start": "Aloita",
45722
+ "Stop": "Lopeta",
45723
+ "Clear": "Tyhjenn�",
45724
+ "Language": "Kieli",
45725
+ "Confidence": "Luotettavuus",
45726
+ "Listening...": "Kuuntelee...",
45727
+ "Speech to text is not supported in this browser": "Puhe tekstiksi ei ole tuettu t�ss� selaimessa",
45728
+ "No speech detected": "Puhetta ei havaittu",
45729
+ "Microphone access denied": "Mikrofonin k�ytt� estetty",
45730
+ "No microphone found": "No microphone found",
45731
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45004
45732
  };
45005
45733
  const fr = {
45006
45734
  "Bold": "Gras",
@@ -45058,7 +45786,7 @@ const fr = {
45058
45786
  "Browse...": "Parcourir...",
45059
45787
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45060
45788
  "Alt text": "Texte alternatif",
45061
- "Insert": "Insérer",
45789
+ "Insert": "Ins�rer",
45062
45790
  "Cancel": "Annuler",
45063
45791
  "Uploading...": "Téléchargement...",
45064
45792
  "Upload failed": "Échec du téléchargement",
@@ -45072,7 +45800,20 @@ const fr = {
45072
45800
  "Title": "Title",
45073
45801
  "Open link in...": "Open link in...",
45074
45802
  "Current window": "Current window",
45075
- "New window": "New window"
45803
+ "New window": "New window",
45804
+ "Speech to Text": "Reconnaissance vocale",
45805
+ "Dictate": "Dicter",
45806
+ "Start": "D�marrer",
45807
+ "Stop": "Arr�ter",
45808
+ "Clear": "Effacer",
45809
+ "Language": "Langue",
45810
+ "Confidence": "Confiance",
45811
+ "Listening...": "�coute en cours...",
45812
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45813
+ "No speech detected": "Aucune parole d�tect�e",
45814
+ "Microphone access denied": "Acc�s au microphone refus�",
45815
+ "No microphone found": "No microphone found",
45816
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45076
45817
  };
45077
45818
  const frCa = {
45078
45819
  "Bold": "Gras",
@@ -45130,7 +45871,7 @@ const frCa = {
45130
45871
  "Browse...": "Parcourir...",
45131
45872
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45132
45873
  "Alt text": "Texte alternatif",
45133
- "Insert": "Insérer",
45874
+ "Insert": "Ins�rer",
45134
45875
  "Cancel": "Annuler",
45135
45876
  "Uploading...": "Téléversement...",
45136
45877
  "Upload failed": "Échec du téléversement",
@@ -45144,7 +45885,20 @@ const frCa = {
45144
45885
  "Title": "Title",
45145
45886
  "Open link in...": "Open link in...",
45146
45887
  "Current window": "Current window",
45147
- "New window": "New window"
45888
+ "New window": "New window",
45889
+ "Speech to Text": "Reconnaissance vocale",
45890
+ "Dictate": "Dicter",
45891
+ "Start": "D�marrer",
45892
+ "Stop": "Arr�ter",
45893
+ "Clear": "Effacer",
45894
+ "Language": "Langue",
45895
+ "Confidence": "Confiance",
45896
+ "Listening...": "�coute en cours...",
45897
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45898
+ "No speech detected": "Aucune parole d�tect�e",
45899
+ "Microphone access denied": "Acc�s au microphone refus�",
45900
+ "No microphone found": "No microphone found",
45901
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45148
45902
  };
45149
45903
  const de = {
45150
45904
  "Bold": "Fett",
@@ -45202,7 +45956,7 @@ const de = {
45202
45956
  "Browse...": "Durchsuchen...",
45203
45957
  "Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
45204
45958
  "Alt text": "Alternativtext",
45205
- "Insert": "Einfügen",
45959
+ "Insert": "Einf�gen",
45206
45960
  "Cancel": "Abbrechen",
45207
45961
  "Uploading...": "Wird hochgeladen...",
45208
45962
  "Upload failed": "Hochladen fehlgeschlagen",
@@ -45216,7 +45970,20 @@ const de = {
45216
45970
  "Title": "Title",
45217
45971
  "Open link in...": "Open link in...",
45218
45972
  "Current window": "Current window",
45219
- "New window": "New window"
45973
+ "New window": "New window",
45974
+ "Speech to Text": "Sprache zu Text",
45975
+ "Dictate": "Diktieren",
45976
+ "Start": "Starten",
45977
+ "Stop": "Stoppen",
45978
+ "Clear": "L�schen",
45979
+ "Language": "Sprache",
45980
+ "Confidence": "Zuverl�ssigkeit",
45981
+ "Listening...": "Zuh�ren...",
45982
+ "Speech to text is not supported in this browser": "Sprache-zu-Text wird in diesem Browser nicht unterst�tzt",
45983
+ "No speech detected": "Keine Sprache erkannt",
45984
+ "Microphone access denied": "Mikrofonzugriff verweigert",
45985
+ "No microphone found": "No microphone found",
45986
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45220
45987
  };
45221
45988
  const el = {
45222
45989
  "Bold": "Έντονα",
@@ -45274,7 +46041,7 @@ const el = {
45274
46041
  "Browse...": "Αναζήτηση...",
45275
46042
  "Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
45276
46043
  "Alt text": "Εναλλακτικό κείμενο",
45277
- "Insert": "Εισαγωγή",
46044
+ "Insert": "??sa????",
45278
46045
  "Cancel": "Ακύρωση",
45279
46046
  "Uploading...": "Μεταφόρτωση...",
45280
46047
  "Upload failed": "Η μεταφόρτωση απέτυχε",
@@ -45288,7 +46055,20 @@ const el = {
45288
46055
  "Title": "Title",
45289
46056
  "Open link in...": "Open link in...",
45290
46057
  "Current window": "Current window",
45291
- "New window": "New window"
46058
+ "New window": "New window",
46059
+ "Speech to Text": "?�???a se ?e?�e??",
46060
+ "Dictate": "Υπαγόρευση",
46061
+ "Start": "??????s?",
46062
+ "Stop": "??a??p?",
46063
+ "Clear": "???a????s?",
46064
+ "Language": "G??ssa",
46065
+ "Confidence": "????p?st?a",
46066
+ "Listening...": "????e?...",
46067
+ "Speech to text is not supported in this browser": "? ?�???a se ?e?�e?? de? ?p?st????eta? se a?t?? t?? pe?????t?",
46068
+ "No speech detected": "?e? a????e????e ?�???a",
46069
+ "Microphone access denied": "? p??s�as? st? �????f??? ap????f???e",
46070
+ "No microphone found": "No microphone found",
46071
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45292
46072
  };
45293
46073
  const hu = {
45294
46074
  "Bold": "Félkövér",
@@ -45346,7 +46126,7 @@ const hu = {
45346
46126
  "Browse...": "Tallózás...",
45347
46127
  "Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
45348
46128
  "Alt text": "Alternatív szöveg",
45349
- "Insert": "Beszúrás",
46129
+ "Insert": "Besz�r�s",
45350
46130
  "Cancel": "Mégse",
45351
46131
  "Uploading...": "Feltöltés...",
45352
46132
  "Upload failed": "A feltöltés sikertelen",
@@ -45360,7 +46140,20 @@ const hu = {
45360
46140
  "Title": "Title",
45361
46141
  "Open link in...": "Open link in...",
45362
46142
  "Current window": "Current window",
45363
- "New window": "New window"
46143
+ "New window": "New window",
46144
+ "Speech to Text": "Besz�d sz�vegg�",
46145
+ "Dictate": "Diktálás",
46146
+ "Start": "Ind�t�s",
46147
+ "Stop": "Le�ll�t�s",
46148
+ "Clear": "T�rl�s",
46149
+ "Language": "Nyelv",
46150
+ "Confidence": "Megb�zhat�s�g",
46151
+ "Listening...": "Hallgat�s...",
46152
+ "Speech to text is not supported in this browser": "A besz�d sz�vegg� alak�t�s nem t�mogatott ebben a b�ng�szoben",
46153
+ "No speech detected": "Nem �szlelheto besz�d",
46154
+ "Microphone access denied": "Mikrofon hozz�f�r�s megtagadva",
46155
+ "No microphone found": "No microphone found",
46156
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45364
46157
  };
45365
46158
  const id = {
45366
46159
  "Bold": "Tebal",
@@ -45432,7 +46225,20 @@ const id = {
45432
46225
  "Title": "Title",
45433
46226
  "Open link in...": "Open link in...",
45434
46227
  "Current window": "Current window",
45435
- "New window": "New window"
46228
+ "New window": "New window",
46229
+ "Speech to Text": "Ucapan ke teks",
46230
+ "Dictate": "Dikte",
46231
+ "Start": "Mulai",
46232
+ "Stop": "Berhenti",
46233
+ "Clear": "Hapus",
46234
+ "Language": "Bahasa",
46235
+ "Confidence": "Kepercayaan",
46236
+ "Listening...": "Mendengarkan...",
46237
+ "Speech to text is not supported in this browser": "Ucapan ke teks tidak didukung di browser ini",
46238
+ "No speech detected": "Tidak ada ucapan terdeteksi",
46239
+ "Microphone access denied": "Akses mikrofon ditolak",
46240
+ "No microphone found": "No microphone found",
46241
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45436
46242
  };
45437
46243
  const it = {
45438
46244
  "Bold": "Grassetto",
@@ -45504,7 +46310,20 @@ const it = {
45504
46310
  "Title": "Title",
45505
46311
  "Open link in...": "Open link in...",
45506
46312
  "Current window": "Current window",
45507
- "New window": "New window"
46313
+ "New window": "New window",
46314
+ "Speech to Text": "Riconoscimento vocale",
46315
+ "Dictate": "Dettare",
46316
+ "Start": "Avvia",
46317
+ "Stop": "Ferma",
46318
+ "Clear": "Cancella",
46319
+ "Language": "Lingua",
46320
+ "Confidence": "Affidabilit�",
46321
+ "Listening...": "Ascolto in corso...",
46322
+ "Speech to text is not supported in this browser": "Il riconoscimento vocale non � supportato in questo browser",
46323
+ "No speech detected": "Nessun discorso rilevato",
46324
+ "Microphone access denied": "Accesso al microfono negato",
46325
+ "No microphone found": "No microphone found",
46326
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45508
46327
  };
45509
46328
  const ja = {
45510
46329
  "Bold": "太字",
@@ -45562,7 +46381,7 @@ const ja = {
45562
46381
  "Browse...": "参照...",
45563
46382
  "Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
45564
46383
  "Alt text": "代替テキスト",
45565
- "Insert": "挿入",
46384
+ "Insert": "??",
45566
46385
  "Cancel": "キャンセル",
45567
46386
  "Uploading...": "アップロード中...",
45568
46387
  "Upload failed": "アップロードに失敗しました",
@@ -45576,7 +46395,20 @@ const ja = {
45576
46395
  "Title": "Title",
45577
46396
  "Open link in...": "Open link in...",
45578
46397
  "Current window": "Current window",
45579
- "New window": "New window"
46398
+ "New window": "New window",
46399
+ "Speech to Text": "????",
46400
+ "Dictate": "音声入力",
46401
+ "Start": "??",
46402
+ "Stop": "??",
46403
+ "Clear": "???",
46404
+ "Language": "??",
46405
+ "Confidence": "???",
46406
+ "Listening...": "?????...",
46407
+ "Speech to text is not supported in this browser": "????????????????????????",
46408
+ "No speech detected": "?????????????",
46409
+ "Microphone access denied": "?????????????????",
46410
+ "No microphone found": "No microphone found",
46411
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45580
46412
  };
45581
46413
  const ko = {
45582
46414
  "Bold": "굵게",
@@ -45634,7 +46466,7 @@ const ko = {
45634
46466
  "Browse...": "찾아보기...",
45635
46467
  "Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
45636
46468
  "Alt text": "대체 텍스트",
45637
- "Insert": "삽입",
46469
+ "Insert": "??",
45638
46470
  "Cancel": "취소",
45639
46471
  "Uploading...": "업로드 중...",
45640
46472
  "Upload failed": "업로드 실패",
@@ -45648,7 +46480,20 @@ const ko = {
45648
46480
  "Title": "Title",
45649
46481
  "Open link in...": "Open link in...",
45650
46482
  "Current window": "Current window",
45651
- "New window": "New window"
46483
+ "New window": "New window",
46484
+ "Speech to Text": "?? ??",
46485
+ "Dictate": "받아쓰기",
46486
+ "Start": "??",
46487
+ "Stop": "??",
46488
+ "Clear": "???",
46489
+ "Language": "??",
46490
+ "Confidence": "???",
46491
+ "Listening...": "?? ?...",
46492
+ "Speech to text is not supported in this browser": "? ??????? ?? ??? ???? ????",
46493
+ "No speech detected": "??? ???? ?????",
46494
+ "Microphone access denied": "??? ??? ???????",
46495
+ "No microphone found": "No microphone found",
46496
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45652
46497
  };
45653
46498
  const nl = {
45654
46499
  "Bold": "Vet",
@@ -45720,7 +46565,20 @@ const nl = {
45720
46565
  "Title": "Title",
45721
46566
  "Open link in...": "Open link in...",
45722
46567
  "Current window": "Current window",
45723
- "New window": "New window"
46568
+ "New window": "New window",
46569
+ "Speech to Text": "Spraak naar tekst",
46570
+ "Dictate": "Dicteren",
46571
+ "Start": "Starten",
46572
+ "Stop": "Stoppen",
46573
+ "Clear": "Wissen",
46574
+ "Language": "Taal",
46575
+ "Confidence": "Betrouwbaarheid",
46576
+ "Listening...": "Luisteren...",
46577
+ "Speech to text is not supported in this browser": "Spraak naar tekst wordt niet ondersteund in deze browser",
46578
+ "No speech detected": "Geen spraak gedetecteerd",
46579
+ "Microphone access denied": "Toegang tot microfoon geweigerd",
46580
+ "No microphone found": "No microphone found",
46581
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45724
46582
  };
45725
46583
  const nb = {
45726
46584
  "Bold": "Fet",
@@ -45792,7 +46650,20 @@ const nb = {
45792
46650
  "Title": "Title",
45793
46651
  "Open link in...": "Open link in...",
45794
46652
  "Current window": "Current window",
45795
- "New window": "New window"
46653
+ "New window": "New window",
46654
+ "Speech to Text": "Tale til tekst",
46655
+ "Dictate": "Dikter",
46656
+ "Start": "Start",
46657
+ "Stop": "Stopp",
46658
+ "Clear": "T�m",
46659
+ "Language": "Spr�k",
46660
+ "Confidence": "P�litelighet",
46661
+ "Listening...": "Lytter...",
46662
+ "Speech to text is not supported in this browser": "Tale til tekst st�ttes ikke i denne nettleseren",
46663
+ "No speech detected": "Ingen tale oppdaget",
46664
+ "Microphone access denied": "Mikrofontilgang nektet",
46665
+ "No microphone found": "No microphone found",
46666
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45796
46667
  };
45797
46668
  const pl = {
45798
46669
  "Bold": "Pogrubienie",
@@ -45864,7 +46735,20 @@ const pl = {
45864
46735
  "Title": "Title",
45865
46736
  "Open link in...": "Open link in...",
45866
46737
  "Current window": "Current window",
45867
- "New window": "New window"
46738
+ "New window": "New window",
46739
+ "Speech to Text": "Mowa na tekst",
46740
+ "Dictate": "Dyktuj",
46741
+ "Start": "Rozpocznij",
46742
+ "Stop": "Zatrzymaj",
46743
+ "Clear": "Wyczysc",
46744
+ "Language": "Jezyk",
46745
+ "Confidence": "Pewnosc",
46746
+ "Listening...": "Nasluchiwanie...",
46747
+ "Speech to text is not supported in this browser": "Mowa na tekst nie jest obslugiwana w tej przegladarce",
46748
+ "No speech detected": "Nie wykryto mowy",
46749
+ "Microphone access denied": "Odmowa dostepu do mikrofonu",
46750
+ "No microphone found": "No microphone found",
46751
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45868
46752
  };
45869
46753
  const pt = {
45870
46754
  "Bold": "Negrito",
@@ -45936,7 +46820,20 @@ const pt = {
45936
46820
  "Title": "Title",
45937
46821
  "Open link in...": "Open link in...",
45938
46822
  "Current window": "Current window",
45939
- "New window": "New window"
46823
+ "New window": "New window",
46824
+ "Speech to Text": "Voz para texto",
46825
+ "Dictate": "Ditar",
46826
+ "Start": "Iniciar",
46827
+ "Stop": "Parar",
46828
+ "Clear": "Limpar",
46829
+ "Language": "Idioma",
46830
+ "Confidence": "Confian�a",
46831
+ "Listening...": "Ouvindo...",
46832
+ "Speech to text is not supported in this browser": "Voz para texto n�o � suportado neste navegador",
46833
+ "No speech detected": "Nenhuma fala detectada",
46834
+ "Microphone access denied": "Acesso ao microfone negado",
46835
+ "No microphone found": "No microphone found",
46836
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45940
46837
  };
45941
46838
  const ro = {
45942
46839
  "Bold": "Îngroșat",
@@ -45994,7 +46891,7 @@ const ro = {
45994
46891
  "Browse...": "Răsfoiește...",
45995
46892
  "Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
45996
46893
  "Alt text": "Text alternativ",
45997
- "Insert": "Inserează",
46894
+ "Insert": "Inserare",
45998
46895
  "Cancel": "Anulează",
45999
46896
  "Uploading...": "Se încarcă...",
46000
46897
  "Upload failed": "Încarcare eșuată",
@@ -46008,7 +46905,20 @@ const ro = {
46008
46905
  "Title": "Title",
46009
46906
  "Open link in...": "Open link in...",
46010
46907
  "Current window": "Current window",
46011
- "New window": "New window"
46908
+ "New window": "New window",
46909
+ "Speech to Text": "Voce �n text",
46910
+ "Dictate": "Dictare",
46911
+ "Start": "Pornire",
46912
+ "Stop": "Oprire",
46913
+ "Clear": "?tergere",
46914
+ "Language": "Limba",
46915
+ "Confidence": "�ncredere",
46916
+ "Listening...": "Ascultare...",
46917
+ "Speech to text is not supported in this browser": "Voce �n text nu este acceptata �n acest browser",
46918
+ "No speech detected": "Nu a fost detectata nicio voce",
46919
+ "Microphone access denied": "Accesul la microfon a fost refuzat",
46920
+ "No microphone found": "No microphone found",
46921
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46012
46922
  };
46013
46923
  const ru = {
46014
46924
  "Bold": "Полужирный",
@@ -46066,7 +46976,7 @@ const ru = {
46066
46976
  "Browse...": "Обзор...",
46067
46977
  "Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
46068
46978
  "Alt text": "Альтернативный текст",
46069
- "Insert": "Вставить",
46979
+ "Insert": "????????",
46070
46980
  "Cancel": "Отмена",
46071
46981
  "Uploading...": "Загрузка...",
46072
46982
  "Upload failed": "Ошибка загрузки",
@@ -46080,7 +46990,20 @@ const ru = {
46080
46990
  "Title": "Title",
46081
46991
  "Open link in...": "Open link in...",
46082
46992
  "Current window": "Current window",
46083
- "New window": "New window"
46993
+ "New window": "New window",
46994
+ "Speech to Text": "????? ? ?????",
46995
+ "Dictate": "Диктовать",
46996
+ "Start": "??????",
46997
+ "Stop": "??????????",
46998
+ "Clear": "????????",
46999
+ "Language": "????",
47000
+ "Confidence": "????????",
47001
+ "Listening...": "??????...",
47002
+ "Speech to text is not supported in this browser": "????????? ???? ?? ?????????????? ? ???? ????????",
47003
+ "No speech detected": "???? ?? ??????????",
47004
+ "Microphone access denied": "?????? ? ????????? ????????",
47005
+ "No microphone found": "No microphone found",
47006
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46084
47007
  };
46085
47008
  const sr = {
46086
47009
  "Bold": "Подебљано",
@@ -46138,7 +47061,7 @@ const sr = {
46138
47061
  "Browse...": "Претражи...",
46139
47062
  "Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
46140
47063
  "Alt text": "Алтернативни текст",
46141
- "Insert": "Уметни",
47064
+ "Insert": "?????",
46142
47065
  "Cancel": "Откажи",
46143
47066
  "Uploading...": "Отпремање...",
46144
47067
  "Upload failed": "Отпремање није успело",
@@ -46152,7 +47075,20 @@ const sr = {
46152
47075
  "Title": "Title",
46153
47076
  "Open link in...": "Open link in...",
46154
47077
  "Current window": "Current window",
46155
- "New window": "New window"
47078
+ "New window": "New window",
47079
+ "Speech to Text": "????? ? ?????",
47080
+ "Dictate": "Диктирање",
47081
+ "Start": "???????",
47082
+ "Stop": "????????",
47083
+ "Clear": "??????",
47084
+ "Language": "?????",
47085
+ "Confidence": "??????????",
47086
+ "Listening...": "??????...",
47087
+ "Speech to text is not supported in this browser": "????? ? ????? ???? ??????? ? ???? ??????????",
47088
+ "No speech detected": "????? ???? ????????",
47089
+ "Microphone access denied": "??????? ????????? ???????",
47090
+ "No microphone found": "No microphone found",
47091
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46156
47092
  };
46157
47093
  const sl = {
46158
47094
  "Bold": "Krepko",
@@ -46224,7 +47160,20 @@ const sl = {
46224
47160
  "Title": "Title",
46225
47161
  "Open link in...": "Open link in...",
46226
47162
  "Current window": "Current window",
46227
- "New window": "New window"
47163
+ "New window": "New window",
47164
+ "Speech to Text": "Govor v besedilo",
47165
+ "Dictate": "Narekovanje",
47166
+ "Start": "Zacni",
47167
+ "Stop": "Ustavi",
47168
+ "Clear": "Pocisti",
47169
+ "Language": "Jezik",
47170
+ "Confidence": "Zaupanje",
47171
+ "Listening...": "Poslu�am...",
47172
+ "Speech to text is not supported in this browser": "Govor v besedilo ni podprt v tem brskalniku",
47173
+ "No speech detected": "Govor ni bil zaznan",
47174
+ "Microphone access denied": "Dostop do mikrofona zavrnjen",
47175
+ "No microphone found": "No microphone found",
47176
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46228
47177
  };
46229
47178
  const es = {
46230
47179
  "Bold": "Negrita",
@@ -46296,7 +47245,20 @@ const es = {
46296
47245
  "Title": "Title",
46297
47246
  "Open link in...": "Open link in...",
46298
47247
  "Current window": "Current window",
46299
- "New window": "New window"
47248
+ "New window": "New window",
47249
+ "Speech to Text": "Voz a texto",
47250
+ "Dictate": "Dictar",
47251
+ "Start": "Iniciar",
47252
+ "Stop": "Detener",
47253
+ "Clear": "Borrar",
47254
+ "Language": "Idioma",
47255
+ "Confidence": "Confianza",
47256
+ "Listening...": "Escuchando...",
47257
+ "Speech to text is not supported in this browser": "La voz a texto no es compatible con este navegador",
47258
+ "No speech detected": "No se detect� voz",
47259
+ "Microphone access denied": "Acceso al micr�fono denegado",
47260
+ "No microphone found": "No microphone found",
47261
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46300
47262
  };
46301
47263
  const sv = {
46302
47264
  "Bold": "Fet",
@@ -46368,7 +47330,20 @@ const sv = {
46368
47330
  "Title": "Title",
46369
47331
  "Open link in...": "Open link in...",
46370
47332
  "Current window": "Current window",
46371
- "New window": "New window"
47333
+ "New window": "New window",
47334
+ "Speech to Text": "Tal till text",
47335
+ "Dictate": "Diktera",
47336
+ "Start": "Starta",
47337
+ "Stop": "Stoppa",
47338
+ "Clear": "Rensa",
47339
+ "Language": "Spr�k",
47340
+ "Confidence": "Tillf�rlitlighet",
47341
+ "Listening...": "Lyssnar...",
47342
+ "Speech to text is not supported in this browser": "Tal till text st�ds inte i denna webbl�sare",
47343
+ "No speech detected": "Inget tal detekterat",
47344
+ "Microphone access denied": "Mikrofon�tkomst nekad",
47345
+ "No microphone found": "No microphone found",
47346
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46372
47347
  };
46373
47348
  const zhTw = {
46374
47349
  "Bold": "粗體",
@@ -46426,7 +47401,7 @@ const zhTw = {
46426
47401
  "Browse...": "瀏覽...",
46427
47402
  "Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
46428
47403
  "Alt text": "替代文字",
46429
- "Insert": "插入",
47404
+ "Insert": "??",
46430
47405
  "Cancel": "取消",
46431
47406
  "Uploading...": "上傳中...",
46432
47407
  "Upload failed": "上傳失敗",
@@ -46440,7 +47415,20 @@ const zhTw = {
46440
47415
  "Title": "Title",
46441
47416
  "Open link in...": "Open link in...",
46442
47417
  "Current window": "Current window",
46443
- "New window": "New window"
47418
+ "New window": "New window",
47419
+ "Speech to Text": "?????",
47420
+ "Dictate": "聽寫",
47421
+ "Start": "??",
47422
+ "Stop": "??",
47423
+ "Clear": "??",
47424
+ "Language": "??",
47425
+ "Confidence": "???",
47426
+ "Listening...": "????...",
47427
+ "Speech to text is not supported in this browser": "????????????",
47428
+ "No speech detected": "??????",
47429
+ "Microphone access denied": "????????",
47430
+ "No microphone found": "No microphone found",
47431
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46444
47432
  };
46445
47433
  const th = {
46446
47434
  "Bold": "ตัวหนา",
@@ -46498,7 +47486,7 @@ const th = {
46498
47486
  "Browse...": "เรียกดู...",
46499
47487
  "Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
46500
47488
  "Alt text": "ข้อความทดแทน",
46501
- "Insert": "แทรก",
47489
+ "Insert": "????",
46502
47490
  "Cancel": "ยกเลิก",
46503
47491
  "Uploading...": "กำลังอัปโหลด...",
46504
47492
  "Upload failed": "อัปโหลดล้มเหลว",
@@ -46512,7 +47500,20 @@ const th = {
46512
47500
  "Title": "Title",
46513
47501
  "Open link in...": "Open link in...",
46514
47502
  "Current window": "Current window",
46515
- "New window": "New window"
47503
+ "New window": "New window",
47504
+ "Speech to Text": "????????????????",
47505
+ "Dictate": "เขียนตามคำบอก",
47506
+ "Start": "?????",
47507
+ "Stop": "????",
47508
+ "Clear": "????",
47509
+ "Language": "????",
47510
+ "Confidence": "?????????????",
47511
+ "Listening...": "????????...",
47512
+ "Speech to text is not supported in this browser": "?????????????????????????????????????????",
47513
+ "No speech detected": "?????????????",
47514
+ "Microphone access denied": "???????????????????????????",
47515
+ "No microphone found": "No microphone found",
47516
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46516
47517
  };
46517
47518
  const tr = {
46518
47519
  "Bold": "Kalın",
@@ -46584,7 +47585,20 @@ const tr = {
46584
47585
  "Title": "Title",
46585
47586
  "Open link in...": "Open link in...",
46586
47587
  "Current window": "Current window",
46587
- "New window": "New window"
47588
+ "New window": "New window",
47589
+ "Speech to Text": "Konusmayi metne �evir",
47590
+ "Dictate": "Dikte et",
47591
+ "Start": "Baslat",
47592
+ "Stop": "Durdur",
47593
+ "Clear": "Temizle",
47594
+ "Language": "Dil",
47595
+ "Confidence": "G�venilirlik",
47596
+ "Listening...": "Dinliyor...",
47597
+ "Speech to text is not supported in this browser": "Bu tarayicida konusmayi metne �evirme desteklenmiyor",
47598
+ "No speech detected": "Konusma algilanmadi",
47599
+ "Microphone access denied": "Mikrofon erisimi reddedildi",
47600
+ "No microphone found": "No microphone found",
47601
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46588
47602
  };
46589
47603
  const vi = {
46590
47604
  "Bold": "In đậm",
@@ -46642,7 +47656,7 @@ const vi = {
46642
47656
  "Browse...": "Duyệt...",
46643
47657
  "Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
46644
47658
  "Alt text": "Văn bản thay thế",
46645
- "Insert": "Chèn",
47659
+ "Insert": "Ch�n",
46646
47660
  "Cancel": "Hủy",
46647
47661
  "Uploading...": "Đang tải lên...",
46648
47662
  "Upload failed": "Tải lên thất bại",
@@ -46656,7 +47670,20 @@ const vi = {
46656
47670
  "Title": "Title",
46657
47671
  "Open link in...": "Open link in...",
46658
47672
  "Current window": "Current window",
46659
- "New window": "New window"
47673
+ "New window": "New window",
47674
+ "Speech to Text": "Gi?ng n�i th�nh van b?n",
47675
+ "Dictate": "Đọc chính tả",
47676
+ "Start": "B?t d?u",
47677
+ "Stop": "D?ng",
47678
+ "Clear": "X�a",
47679
+ "Language": "Ng�n ng?",
47680
+ "Confidence": "�? tin c?y",
47681
+ "Listening...": "�ang nghe...",
47682
+ "Speech to text is not supported in this browser": "Gi?ng n�i th�nh van b?n kh�ng du?c h? tr? trong tr�nh duy?t n�y",
47683
+ "No speech detected": "Kh�ng ph�t hi?n gi?ng n�i",
47684
+ "Microphone access denied": "Quy?n truy c?p micr� b? t? ch?i",
47685
+ "No microphone found": "No microphone found",
47686
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46660
47687
  };
46661
47688
  const locales = {
46662
47689
  en,
@@ -46797,7 +47824,8 @@ class HTMLEditor {
46797
47824
  format_empty_lines: config.format_empty_lines ?? true,
46798
47825
  toolbar_narrow_breakpoint: config.toolbar_narrow_breakpoint,
46799
47826
  toolbar_priority: config.toolbar_priority,
46800
- paste_from_office: config.paste_from_office ?? true
47827
+ paste_from_office: config.paste_from_office ?? true,
47828
+ speech_to_text: config.speech_to_text ?? true
46801
47829
  };
46802
47830
  }
46803
47831
  createEditor() {
@@ -47221,6 +48249,7 @@ export {
47221
48249
  CONFAB_ICONS,
47222
48250
  CharacterMap,
47223
48251
  DEFAULT_ICONS,
48252
+ Dictation,
47224
48253
  EMOJI_CATEGORIES,
47225
48254
  EmojiPicker,
47226
48255
  FontSize,
@@ -47232,6 +48261,7 @@ export {
47232
48261
  SearchReplace,
47233
48262
  SignatureBlock,
47234
48263
  SourceEditor,
48264
+ SpeechToText,
47235
48265
  TRANSLATION_KEYS,
47236
48266
  TextDirection,
47237
48267
  Toolbar,
@@ -47241,6 +48271,7 @@ export {
47241
48271
  getGetFileSrc,
47242
48272
  getLocale,
47243
48273
  getTranslate,
48274
+ isSpeechRecognitionSupported,
47244
48275
  resetTranslate,
47245
48276
  setGetFileSrc,
47246
48277
  setTranslate