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