@mdaemon/html-editor 1.2.0 → 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/README.md +3 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +1138 -90
- package/dist/index.mjs +1138 -90
- package/dist/styles.css +214 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -17437,6 +17437,26 @@ function canInsertNode(state, nodeType) {
|
|
|
17437
17437
|
}
|
|
17438
17438
|
return false;
|
|
17439
17439
|
}
|
|
17440
|
+
function getStyleProperty(element, propertyName) {
|
|
17441
|
+
const styleAttr = element.getAttribute("style");
|
|
17442
|
+
if (!styleAttr) {
|
|
17443
|
+
return null;
|
|
17444
|
+
}
|
|
17445
|
+
const decls = styleAttr.split(";").map((decl) => decl.trim()).filter(Boolean);
|
|
17446
|
+
const target = propertyName.toLowerCase();
|
|
17447
|
+
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
17448
|
+
const decl = decls[i];
|
|
17449
|
+
const colonIndex = decl.indexOf(":");
|
|
17450
|
+
if (colonIndex === -1) {
|
|
17451
|
+
continue;
|
|
17452
|
+
}
|
|
17453
|
+
const prop = decl.slice(0, colonIndex).trim().toLowerCase();
|
|
17454
|
+
if (prop === target) {
|
|
17455
|
+
return decl.slice(colonIndex + 1).trim();
|
|
17456
|
+
}
|
|
17457
|
+
}
|
|
17458
|
+
return null;
|
|
17459
|
+
}
|
|
17440
17460
|
var markdown_exports = {};
|
|
17441
17461
|
__export$1(markdown_exports, {
|
|
17442
17462
|
createAtomBlockMarkdownSpec: () => createAtomBlockMarkdownSpec,
|
|
@@ -18874,7 +18894,7 @@ var Italic = Mark2.create({
|
|
|
18874
18894
|
];
|
|
18875
18895
|
}
|
|
18876
18896
|
});
|
|
18877
|
-
const encodedTlds = "
|
|
18897
|
+
const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
18878
18898
|
const encodedUtlds = "ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2";
|
|
18879
18899
|
const numeric = "numeric";
|
|
18880
18900
|
const ascii = "ascii";
|
|
@@ -19804,8 +19824,6 @@ function init$1({
|
|
|
19804
19824
|
ta(Email$1, groups.domain, EmailDomain);
|
|
19805
19825
|
tt(Email$1, DOT, EmailDomainDot);
|
|
19806
19826
|
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
19807
|
-
const EmailColon = tt(Email$1, COLON);
|
|
19808
|
-
ta(EmailColon, groups.numeric, Email);
|
|
19809
19827
|
const DomainHyphen = tt(Domain, HYPHEN);
|
|
19810
19828
|
const DomainDot = tt(Domain, DOT);
|
|
19811
19829
|
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
@@ -19869,11 +19887,11 @@ function init$1({
|
|
|
19869
19887
|
const [OPEN, CLOSE] = bracketPairs[i];
|
|
19870
19888
|
const UrlOpen = tt(Url$1, OPEN);
|
|
19871
19889
|
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
19872
|
-
tt(UrlOpen, CLOSE, Url$1);
|
|
19873
19890
|
const UrlOpenQ = makeState(Url);
|
|
19874
19891
|
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
19875
19892
|
const UrlOpenSyms = makeState();
|
|
19876
|
-
ta(UrlOpen, qsNonAccepting);
|
|
19893
|
+
ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
|
|
19894
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
19877
19895
|
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
19878
19896
|
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
19879
19897
|
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
@@ -22608,6 +22626,7 @@ var CharacterCount = Extension.create({
|
|
|
22608
22626
|
addOptions() {
|
|
22609
22627
|
return {
|
|
22610
22628
|
limit: null,
|
|
22629
|
+
autoTrim: true,
|
|
22611
22630
|
mode: "textSize",
|
|
22612
22631
|
textCounter: (text) => text.length,
|
|
22613
22632
|
wordCounter: (text) => text.split(" ").filter((word) => word !== "").length
|
|
@@ -22645,7 +22664,8 @@ var CharacterCount = Extension.create({
|
|
|
22645
22664
|
return;
|
|
22646
22665
|
}
|
|
22647
22666
|
const limit = this.options.limit;
|
|
22648
|
-
|
|
22667
|
+
const autoTrim = this.options.autoTrim;
|
|
22668
|
+
if (limit === null || limit === void 0 || limit === 0 || autoTrim === false) {
|
|
22649
22669
|
initialEvaluationDone = true;
|
|
22650
22670
|
return;
|
|
22651
22671
|
}
|
|
@@ -23195,21 +23215,8 @@ var BackgroundColor = Extension.create({
|
|
|
23195
23215
|
default: null,
|
|
23196
23216
|
parseHTML: (element) => {
|
|
23197
23217
|
var _a;
|
|
23198
|
-
const
|
|
23199
|
-
|
|
23200
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
23201
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
23202
|
-
const parts = decls[i].split(":");
|
|
23203
|
-
if (parts.length >= 2) {
|
|
23204
|
-
const prop = parts[0].trim().toLowerCase();
|
|
23205
|
-
const val = parts.slice(1).join(":").trim();
|
|
23206
|
-
if (prop === "background-color") {
|
|
23207
|
-
return val.replace(/['"]+/g, "");
|
|
23208
|
-
}
|
|
23209
|
-
}
|
|
23210
|
-
}
|
|
23211
|
-
}
|
|
23212
|
-
return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
23218
|
+
const value = (_a = getStyleProperty(element, "background-color")) != null ? _a : element.style.backgroundColor;
|
|
23219
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
23213
23220
|
},
|
|
23214
23221
|
renderHTML: (attributes) => {
|
|
23215
23222
|
if (!attributes.backgroundColor) {
|
|
@@ -23251,21 +23258,8 @@ var Color = Extension.create({
|
|
|
23251
23258
|
default: null,
|
|
23252
23259
|
parseHTML: (element) => {
|
|
23253
23260
|
var _a;
|
|
23254
|
-
const
|
|
23255
|
-
|
|
23256
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
23257
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
23258
|
-
const parts = decls[i].split(":");
|
|
23259
|
-
if (parts.length >= 2) {
|
|
23260
|
-
const prop = parts[0].trim().toLowerCase();
|
|
23261
|
-
const val = parts.slice(1).join(":").trim();
|
|
23262
|
-
if (prop === "color") {
|
|
23263
|
-
return val.replace(/['"]+/g, "");
|
|
23264
|
-
}
|
|
23265
|
-
}
|
|
23266
|
-
}
|
|
23267
|
-
}
|
|
23268
|
-
return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
23261
|
+
const value = (_a = getStyleProperty(element, "color")) != null ? _a : element.style.color;
|
|
23262
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
23269
23263
|
},
|
|
23270
23264
|
renderHTML: (attributes) => {
|
|
23271
23265
|
if (!attributes.color) {
|
|
@@ -23305,7 +23299,14 @@ var FontFamily = Extension.create({
|
|
|
23305
23299
|
attributes: {
|
|
23306
23300
|
fontFamily: {
|
|
23307
23301
|
default: null,
|
|
23308
|
-
|
|
23302
|
+
// Prefer the raw inline `style` attribute so unquoted or
|
|
23303
|
+
// single-quoted multi-word names are preserved instead of being
|
|
23304
|
+
// canonicalized by `element.style.fontFamily`, which forces double
|
|
23305
|
+
// quotes that then get HTML-encoded to `"` on serialization.
|
|
23306
|
+
parseHTML: (element) => {
|
|
23307
|
+
var _a;
|
|
23308
|
+
return (_a = getStyleProperty(element, "font-family")) != null ? _a : element.style.fontFamily;
|
|
23309
|
+
},
|
|
23309
23310
|
renderHTML: (attributes) => {
|
|
23310
23311
|
if (!attributes.fontFamily) {
|
|
23311
23312
|
return {};
|
|
@@ -23344,7 +23345,13 @@ var FontSize$1 = Extension.create({
|
|
|
23344
23345
|
attributes: {
|
|
23345
23346
|
fontSize: {
|
|
23346
23347
|
default: null,
|
|
23347
|
-
|
|
23348
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
23349
|
+
// is preserved instead of the canonicalized value returned by
|
|
23350
|
+
// `element.style.fontSize`.
|
|
23351
|
+
parseHTML: (element) => {
|
|
23352
|
+
var _a;
|
|
23353
|
+
return (_a = getStyleProperty(element, "font-size")) != null ? _a : element.style.fontSize;
|
|
23354
|
+
},
|
|
23348
23355
|
renderHTML: (attributes) => {
|
|
23349
23356
|
if (!attributes.fontSize) {
|
|
23350
23357
|
return {};
|
|
@@ -23383,7 +23390,13 @@ var LineHeight$1 = Extension.create({
|
|
|
23383
23390
|
attributes: {
|
|
23384
23391
|
lineHeight: {
|
|
23385
23392
|
default: null,
|
|
23386
|
-
|
|
23393
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
23394
|
+
// is preserved instead of the canonicalized value returned by
|
|
23395
|
+
// `element.style.lineHeight`.
|
|
23396
|
+
parseHTML: (element) => {
|
|
23397
|
+
var _a;
|
|
23398
|
+
return (_a = getStyleProperty(element, "line-height")) != null ? _a : element.style.lineHeight;
|
|
23399
|
+
},
|
|
23387
23400
|
renderHTML: (attributes) => {
|
|
23388
23401
|
if (!attributes.lineHeight) {
|
|
23389
23402
|
return {};
|
|
@@ -23450,7 +23463,11 @@ var Highlight = Mark2.create({
|
|
|
23450
23463
|
return {
|
|
23451
23464
|
color: {
|
|
23452
23465
|
default: null,
|
|
23453
|
-
|
|
23466
|
+
// Prefer `data-color` (set by our own `renderHTML`) for lossless
|
|
23467
|
+
// round-trips. Otherwise parse the raw inline `style` attribute so
|
|
23468
|
+
// the original color format (e.g. `#rrggbb`) is preserved instead of
|
|
23469
|
+
// the canonicalized `rgb(...)` value from `element.style.backgroundColor`.
|
|
23470
|
+
parseHTML: (element) => element.getAttribute("data-color") || getStyleProperty(element, "background-color") || element.style.backgroundColor,
|
|
23454
23471
|
renderHTML: (attributes) => {
|
|
23455
23472
|
if (!attributes.color) {
|
|
23456
23473
|
return {};
|
|
@@ -42870,6 +42887,567 @@ class LinkEditor {
|
|
|
42870
42887
|
}
|
|
42871
42888
|
}
|
|
42872
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
|
+
}
|
|
42873
43451
|
const DEFAULT_BUTTON_PRIORITY = {
|
|
42874
43452
|
bold: 1,
|
|
42875
43453
|
italic: 1,
|
|
@@ -42932,6 +43510,8 @@ class Toolbar {
|
|
|
42932
43510
|
searchReplace = null;
|
|
42933
43511
|
sourceEditor = null;
|
|
42934
43512
|
linkEditor = null;
|
|
43513
|
+
speechToText = null;
|
|
43514
|
+
dictation = null;
|
|
42935
43515
|
updateInterval = null;
|
|
42936
43516
|
boundClickHandler = null;
|
|
42937
43517
|
boundKeydownHandler = null;
|
|
@@ -43248,6 +43828,32 @@ class Toolbar {
|
|
|
43248
43828
|
return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
|
|
43249
43829
|
this.openSearchReplace();
|
|
43250
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
|
+
}
|
|
43251
43857
|
case "template":
|
|
43252
43858
|
return this.createTemplateDropdown();
|
|
43253
43859
|
default:
|
|
@@ -43680,6 +44286,31 @@ class Toolbar {
|
|
|
43680
44286
|
}
|
|
43681
44287
|
this.searchReplace.open();
|
|
43682
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
|
+
}
|
|
43683
44314
|
openSourceCode() {
|
|
43684
44315
|
if (!this.sourceEditor) {
|
|
43685
44316
|
this.sourceEditor = new SourceEditor({
|
|
@@ -43728,6 +44359,10 @@ class Toolbar {
|
|
|
43728
44359
|
this.imageUpload = null;
|
|
43729
44360
|
this.searchReplace?.destroy();
|
|
43730
44361
|
this.searchReplace = null;
|
|
44362
|
+
this.speechToText?.destroy();
|
|
44363
|
+
this.speechToText = null;
|
|
44364
|
+
this.dictation?.destroy();
|
|
44365
|
+
this.dictation = null;
|
|
43731
44366
|
this.buttonElements.clear();
|
|
43732
44367
|
this.dropdowns.clear();
|
|
43733
44368
|
this.removeBodyMenus();
|
|
@@ -43750,6 +44385,8 @@ class Toolbar {
|
|
|
43750
44385
|
this.emojiPicker?.destroy();
|
|
43751
44386
|
this.imageUpload?.destroy();
|
|
43752
44387
|
this.searchReplace?.destroy();
|
|
44388
|
+
this.speechToText?.destroy();
|
|
44389
|
+
this.dictation?.destroy();
|
|
43753
44390
|
this.buttonElements.clear();
|
|
43754
44391
|
this.dropdowns.clear();
|
|
43755
44392
|
this.removeBodyMenus();
|
|
@@ -43799,6 +44436,8 @@ const DEFAULT_ICONS = {
|
|
|
43799
44436
|
ltr: "⇐",
|
|
43800
44437
|
rtl: "⇒",
|
|
43801
44438
|
searchreplace: "🔍",
|
|
44439
|
+
speechtotext: "🎤",
|
|
44440
|
+
dictate: "🎙️",
|
|
43802
44441
|
togglemore: "…"
|
|
43803
44442
|
};
|
|
43804
44443
|
const CONFAB_ICONS = {
|
|
@@ -43832,6 +44471,8 @@ const CONFAB_ICONS = {
|
|
|
43832
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>',
|
|
43833
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>',
|
|
43834
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>',
|
|
43835
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>'
|
|
43836
44477
|
};
|
|
43837
44478
|
const FontSize = Extension.create({
|
|
@@ -44481,7 +45122,20 @@ const en = {
|
|
|
44481
45122
|
"Title": "Title",
|
|
44482
45123
|
"Open link in...": "Open link in...",
|
|
44483
45124
|
"Current window": "Current window",
|
|
44484
|
-
"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"
|
|
44485
45139
|
};
|
|
44486
45140
|
const ar = {
|
|
44487
45141
|
"Bold": "غامق",
|
|
@@ -44539,7 +45193,7 @@ const ar = {
|
|
|
44539
45193
|
"Browse...": "استعراض...",
|
|
44540
45194
|
"Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
|
|
44541
45195
|
"Alt text": "نص بديل",
|
|
44542
|
-
"Insert": "
|
|
45196
|
+
"Insert": "?????",
|
|
44543
45197
|
"Cancel": "إلغاء",
|
|
44544
45198
|
"Uploading...": "جارٍ الرفع...",
|
|
44545
45199
|
"Upload failed": "فشل الرفع",
|
|
@@ -44553,7 +45207,20 @@ const ar = {
|
|
|
44553
45207
|
"Title": "Title",
|
|
44554
45208
|
"Open link in...": "Open link in...",
|
|
44555
45209
|
"Current window": "Current window",
|
|
44556
|
-
"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"
|
|
44557
45224
|
};
|
|
44558
45225
|
const ca = {
|
|
44559
45226
|
"Bold": "Negreta",
|
|
@@ -44625,7 +45292,20 @@ const ca = {
|
|
|
44625
45292
|
"Title": "Title",
|
|
44626
45293
|
"Open link in...": "Open link in...",
|
|
44627
45294
|
"Current window": "Current window",
|
|
44628
|
-
"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"
|
|
44629
45309
|
};
|
|
44630
45310
|
const zh = {
|
|
44631
45311
|
"Bold": "粗体",
|
|
@@ -44683,7 +45363,7 @@ const zh = {
|
|
|
44683
45363
|
"Browse...": "浏览...",
|
|
44684
45364
|
"Drop image here or click to browse": "将图片拖放到此处或点击浏览",
|
|
44685
45365
|
"Alt text": "替代文本",
|
|
44686
|
-
"Insert": "
|
|
45366
|
+
"Insert": "??",
|
|
44687
45367
|
"Cancel": "取消",
|
|
44688
45368
|
"Uploading...": "上传中...",
|
|
44689
45369
|
"Upload failed": "上传失败",
|
|
@@ -44697,7 +45377,20 @@ const zh = {
|
|
|
44697
45377
|
"Title": "Title",
|
|
44698
45378
|
"Open link in...": "Open link in...",
|
|
44699
45379
|
"Current window": "Current window",
|
|
44700
|
-
"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"
|
|
44701
45394
|
};
|
|
44702
45395
|
const cs = {
|
|
44703
45396
|
"Bold": "Tučné",
|
|
@@ -44755,7 +45448,7 @@ const cs = {
|
|
|
44755
45448
|
"Browse...": "Procházet...",
|
|
44756
45449
|
"Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
|
|
44757
45450
|
"Alt text": "Alternativní text",
|
|
44758
|
-
"Insert": "
|
|
45451
|
+
"Insert": "Vlo�it",
|
|
44759
45452
|
"Cancel": "Zrušit",
|
|
44760
45453
|
"Uploading...": "Nahrávání...",
|
|
44761
45454
|
"Upload failed": "Nahrávání selhalo",
|
|
@@ -44769,7 +45462,20 @@ const cs = {
|
|
|
44769
45462
|
"Title": "Title",
|
|
44770
45463
|
"Open link in...": "Open link in...",
|
|
44771
45464
|
"Current window": "Current window",
|
|
44772
|
-
"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"
|
|
44773
45479
|
};
|
|
44774
45480
|
const da = {
|
|
44775
45481
|
"Bold": "Fed",
|
|
@@ -44827,7 +45533,7 @@ const da = {
|
|
|
44827
45533
|
"Browse...": "Gennemse...",
|
|
44828
45534
|
"Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
|
|
44829
45535
|
"Alt text": "Alternativ tekst",
|
|
44830
|
-
"Insert": "
|
|
45536
|
+
"Insert": "Inds�t",
|
|
44831
45537
|
"Cancel": "Annuller",
|
|
44832
45538
|
"Uploading...": "Uploader...",
|
|
44833
45539
|
"Upload failed": "Upload mislykkedes",
|
|
@@ -44841,7 +45547,20 @@ const da = {
|
|
|
44841
45547
|
"Title": "Title",
|
|
44842
45548
|
"Open link in...": "Open link in...",
|
|
44843
45549
|
"Current window": "Current window",
|
|
44844
|
-
"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"
|
|
44845
45564
|
};
|
|
44846
45565
|
const enGb = {
|
|
44847
45566
|
"Bold": "Bold",
|
|
@@ -44913,7 +45632,20 @@ const enGb = {
|
|
|
44913
45632
|
"Title": "Title",
|
|
44914
45633
|
"Open link in...": "Open link in...",
|
|
44915
45634
|
"Current window": "Current window",
|
|
44916
|
-
"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"
|
|
44917
45649
|
};
|
|
44918
45650
|
const fi = {
|
|
44919
45651
|
"Bold": "Lihavoitu",
|
|
@@ -44971,7 +45703,7 @@ const fi = {
|
|
|
44971
45703
|
"Browse...": "Selaa...",
|
|
44972
45704
|
"Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
|
|
44973
45705
|
"Alt text": "Vaihtoehtoinen teksti",
|
|
44974
|
-
"Insert": "
|
|
45706
|
+
"Insert": "Lis��",
|
|
44975
45707
|
"Cancel": "Peruuta",
|
|
44976
45708
|
"Uploading...": "Ladataan...",
|
|
44977
45709
|
"Upload failed": "Lataus epäonnistui",
|
|
@@ -44985,7 +45717,20 @@ const fi = {
|
|
|
44985
45717
|
"Title": "Title",
|
|
44986
45718
|
"Open link in...": "Open link in...",
|
|
44987
45719
|
"Current window": "Current window",
|
|
44988
|
-
"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"
|
|
44989
45734
|
};
|
|
44990
45735
|
const fr = {
|
|
44991
45736
|
"Bold": "Gras",
|
|
@@ -45043,7 +45788,7 @@ const fr = {
|
|
|
45043
45788
|
"Browse...": "Parcourir...",
|
|
45044
45789
|
"Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
|
|
45045
45790
|
"Alt text": "Texte alternatif",
|
|
45046
|
-
"Insert": "
|
|
45791
|
+
"Insert": "Ins�rer",
|
|
45047
45792
|
"Cancel": "Annuler",
|
|
45048
45793
|
"Uploading...": "Téléchargement...",
|
|
45049
45794
|
"Upload failed": "Échec du téléchargement",
|
|
@@ -45057,7 +45802,20 @@ const fr = {
|
|
|
45057
45802
|
"Title": "Title",
|
|
45058
45803
|
"Open link in...": "Open link in...",
|
|
45059
45804
|
"Current window": "Current window",
|
|
45060
|
-
"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"
|
|
45061
45819
|
};
|
|
45062
45820
|
const frCa = {
|
|
45063
45821
|
"Bold": "Gras",
|
|
@@ -45115,7 +45873,7 @@ const frCa = {
|
|
|
45115
45873
|
"Browse...": "Parcourir...",
|
|
45116
45874
|
"Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
|
|
45117
45875
|
"Alt text": "Texte alternatif",
|
|
45118
|
-
"Insert": "
|
|
45876
|
+
"Insert": "Ins�rer",
|
|
45119
45877
|
"Cancel": "Annuler",
|
|
45120
45878
|
"Uploading...": "Téléversement...",
|
|
45121
45879
|
"Upload failed": "Échec du téléversement",
|
|
@@ -45129,7 +45887,20 @@ const frCa = {
|
|
|
45129
45887
|
"Title": "Title",
|
|
45130
45888
|
"Open link in...": "Open link in...",
|
|
45131
45889
|
"Current window": "Current window",
|
|
45132
|
-
"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"
|
|
45133
45904
|
};
|
|
45134
45905
|
const de = {
|
|
45135
45906
|
"Bold": "Fett",
|
|
@@ -45187,7 +45958,7 @@ const de = {
|
|
|
45187
45958
|
"Browse...": "Durchsuchen...",
|
|
45188
45959
|
"Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
|
|
45189
45960
|
"Alt text": "Alternativtext",
|
|
45190
|
-
"Insert": "
|
|
45961
|
+
"Insert": "Einf�gen",
|
|
45191
45962
|
"Cancel": "Abbrechen",
|
|
45192
45963
|
"Uploading...": "Wird hochgeladen...",
|
|
45193
45964
|
"Upload failed": "Hochladen fehlgeschlagen",
|
|
@@ -45201,7 +45972,20 @@ const de = {
|
|
|
45201
45972
|
"Title": "Title",
|
|
45202
45973
|
"Open link in...": "Open link in...",
|
|
45203
45974
|
"Current window": "Current window",
|
|
45204
|
-
"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"
|
|
45205
45989
|
};
|
|
45206
45990
|
const el = {
|
|
45207
45991
|
"Bold": "Έντονα",
|
|
@@ -45259,7 +46043,7 @@ const el = {
|
|
|
45259
46043
|
"Browse...": "Αναζήτηση...",
|
|
45260
46044
|
"Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
|
|
45261
46045
|
"Alt text": "Εναλλακτικό κείμενο",
|
|
45262
|
-
"Insert": "
|
|
46046
|
+
"Insert": "??sa????",
|
|
45263
46047
|
"Cancel": "Ακύρωση",
|
|
45264
46048
|
"Uploading...": "Μεταφόρτωση...",
|
|
45265
46049
|
"Upload failed": "Η μεταφόρτωση απέτυχε",
|
|
@@ -45273,7 +46057,20 @@ const el = {
|
|
|
45273
46057
|
"Title": "Title",
|
|
45274
46058
|
"Open link in...": "Open link in...",
|
|
45275
46059
|
"Current window": "Current window",
|
|
45276
|
-
"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"
|
|
45277
46074
|
};
|
|
45278
46075
|
const hu = {
|
|
45279
46076
|
"Bold": "Félkövér",
|
|
@@ -45331,7 +46128,7 @@ const hu = {
|
|
|
45331
46128
|
"Browse...": "Tallózás...",
|
|
45332
46129
|
"Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
|
|
45333
46130
|
"Alt text": "Alternatív szöveg",
|
|
45334
|
-
"Insert": "
|
|
46131
|
+
"Insert": "Besz�r�s",
|
|
45335
46132
|
"Cancel": "Mégse",
|
|
45336
46133
|
"Uploading...": "Feltöltés...",
|
|
45337
46134
|
"Upload failed": "A feltöltés sikertelen",
|
|
@@ -45345,7 +46142,20 @@ const hu = {
|
|
|
45345
46142
|
"Title": "Title",
|
|
45346
46143
|
"Open link in...": "Open link in...",
|
|
45347
46144
|
"Current window": "Current window",
|
|
45348
|
-
"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"
|
|
45349
46159
|
};
|
|
45350
46160
|
const id = {
|
|
45351
46161
|
"Bold": "Tebal",
|
|
@@ -45417,7 +46227,20 @@ const id = {
|
|
|
45417
46227
|
"Title": "Title",
|
|
45418
46228
|
"Open link in...": "Open link in...",
|
|
45419
46229
|
"Current window": "Current window",
|
|
45420
|
-
"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"
|
|
45421
46244
|
};
|
|
45422
46245
|
const it = {
|
|
45423
46246
|
"Bold": "Grassetto",
|
|
@@ -45489,7 +46312,20 @@ const it = {
|
|
|
45489
46312
|
"Title": "Title",
|
|
45490
46313
|
"Open link in...": "Open link in...",
|
|
45491
46314
|
"Current window": "Current window",
|
|
45492
|
-
"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"
|
|
45493
46329
|
};
|
|
45494
46330
|
const ja = {
|
|
45495
46331
|
"Bold": "太字",
|
|
@@ -45547,7 +46383,7 @@ const ja = {
|
|
|
45547
46383
|
"Browse...": "参照...",
|
|
45548
46384
|
"Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
|
|
45549
46385
|
"Alt text": "代替テキスト",
|
|
45550
|
-
"Insert": "
|
|
46386
|
+
"Insert": "??",
|
|
45551
46387
|
"Cancel": "キャンセル",
|
|
45552
46388
|
"Uploading...": "アップロード中...",
|
|
45553
46389
|
"Upload failed": "アップロードに失敗しました",
|
|
@@ -45561,7 +46397,20 @@ const ja = {
|
|
|
45561
46397
|
"Title": "Title",
|
|
45562
46398
|
"Open link in...": "Open link in...",
|
|
45563
46399
|
"Current window": "Current window",
|
|
45564
|
-
"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"
|
|
45565
46414
|
};
|
|
45566
46415
|
const ko = {
|
|
45567
46416
|
"Bold": "굵게",
|
|
@@ -45619,7 +46468,7 @@ const ko = {
|
|
|
45619
46468
|
"Browse...": "찾아보기...",
|
|
45620
46469
|
"Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
|
|
45621
46470
|
"Alt text": "대체 텍스트",
|
|
45622
|
-
"Insert": "
|
|
46471
|
+
"Insert": "??",
|
|
45623
46472
|
"Cancel": "취소",
|
|
45624
46473
|
"Uploading...": "업로드 중...",
|
|
45625
46474
|
"Upload failed": "업로드 실패",
|
|
@@ -45633,7 +46482,20 @@ const ko = {
|
|
|
45633
46482
|
"Title": "Title",
|
|
45634
46483
|
"Open link in...": "Open link in...",
|
|
45635
46484
|
"Current window": "Current window",
|
|
45636
|
-
"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"
|
|
45637
46499
|
};
|
|
45638
46500
|
const nl = {
|
|
45639
46501
|
"Bold": "Vet",
|
|
@@ -45705,7 +46567,20 @@ const nl = {
|
|
|
45705
46567
|
"Title": "Title",
|
|
45706
46568
|
"Open link in...": "Open link in...",
|
|
45707
46569
|
"Current window": "Current window",
|
|
45708
|
-
"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"
|
|
45709
46584
|
};
|
|
45710
46585
|
const nb = {
|
|
45711
46586
|
"Bold": "Fet",
|
|
@@ -45777,7 +46652,20 @@ const nb = {
|
|
|
45777
46652
|
"Title": "Title",
|
|
45778
46653
|
"Open link in...": "Open link in...",
|
|
45779
46654
|
"Current window": "Current window",
|
|
45780
|
-
"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"
|
|
45781
46669
|
};
|
|
45782
46670
|
const pl = {
|
|
45783
46671
|
"Bold": "Pogrubienie",
|
|
@@ -45849,7 +46737,20 @@ const pl = {
|
|
|
45849
46737
|
"Title": "Title",
|
|
45850
46738
|
"Open link in...": "Open link in...",
|
|
45851
46739
|
"Current window": "Current window",
|
|
45852
|
-
"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"
|
|
45853
46754
|
};
|
|
45854
46755
|
const pt = {
|
|
45855
46756
|
"Bold": "Negrito",
|
|
@@ -45921,7 +46822,20 @@ const pt = {
|
|
|
45921
46822
|
"Title": "Title",
|
|
45922
46823
|
"Open link in...": "Open link in...",
|
|
45923
46824
|
"Current window": "Current window",
|
|
45924
|
-
"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"
|
|
45925
46839
|
};
|
|
45926
46840
|
const ro = {
|
|
45927
46841
|
"Bold": "Îngroșat",
|
|
@@ -45979,7 +46893,7 @@ const ro = {
|
|
|
45979
46893
|
"Browse...": "Răsfoiește...",
|
|
45980
46894
|
"Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
|
|
45981
46895
|
"Alt text": "Text alternativ",
|
|
45982
|
-
"Insert": "
|
|
46896
|
+
"Insert": "Inserare",
|
|
45983
46897
|
"Cancel": "Anulează",
|
|
45984
46898
|
"Uploading...": "Se încarcă...",
|
|
45985
46899
|
"Upload failed": "Încarcare eșuată",
|
|
@@ -45993,7 +46907,20 @@ const ro = {
|
|
|
45993
46907
|
"Title": "Title",
|
|
45994
46908
|
"Open link in...": "Open link in...",
|
|
45995
46909
|
"Current window": "Current window",
|
|
45996
|
-
"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"
|
|
45997
46924
|
};
|
|
45998
46925
|
const ru = {
|
|
45999
46926
|
"Bold": "Полужирный",
|
|
@@ -46051,7 +46978,7 @@ const ru = {
|
|
|
46051
46978
|
"Browse...": "Обзор...",
|
|
46052
46979
|
"Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
|
|
46053
46980
|
"Alt text": "Альтернативный текст",
|
|
46054
|
-
"Insert": "
|
|
46981
|
+
"Insert": "????????",
|
|
46055
46982
|
"Cancel": "Отмена",
|
|
46056
46983
|
"Uploading...": "Загрузка...",
|
|
46057
46984
|
"Upload failed": "Ошибка загрузки",
|
|
@@ -46065,7 +46992,20 @@ const ru = {
|
|
|
46065
46992
|
"Title": "Title",
|
|
46066
46993
|
"Open link in...": "Open link in...",
|
|
46067
46994
|
"Current window": "Current window",
|
|
46068
|
-
"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"
|
|
46069
47009
|
};
|
|
46070
47010
|
const sr = {
|
|
46071
47011
|
"Bold": "Подебљано",
|
|
@@ -46123,7 +47063,7 @@ const sr = {
|
|
|
46123
47063
|
"Browse...": "Претражи...",
|
|
46124
47064
|
"Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
|
|
46125
47065
|
"Alt text": "Алтернативни текст",
|
|
46126
|
-
"Insert": "
|
|
47066
|
+
"Insert": "?????",
|
|
46127
47067
|
"Cancel": "Откажи",
|
|
46128
47068
|
"Uploading...": "Отпремање...",
|
|
46129
47069
|
"Upload failed": "Отпремање није успело",
|
|
@@ -46137,7 +47077,20 @@ const sr = {
|
|
|
46137
47077
|
"Title": "Title",
|
|
46138
47078
|
"Open link in...": "Open link in...",
|
|
46139
47079
|
"Current window": "Current window",
|
|
46140
|
-
"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"
|
|
46141
47094
|
};
|
|
46142
47095
|
const sl = {
|
|
46143
47096
|
"Bold": "Krepko",
|
|
@@ -46209,7 +47162,20 @@ const sl = {
|
|
|
46209
47162
|
"Title": "Title",
|
|
46210
47163
|
"Open link in...": "Open link in...",
|
|
46211
47164
|
"Current window": "Current window",
|
|
46212
|
-
"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"
|
|
46213
47179
|
};
|
|
46214
47180
|
const es = {
|
|
46215
47181
|
"Bold": "Negrita",
|
|
@@ -46281,7 +47247,20 @@ const es = {
|
|
|
46281
47247
|
"Title": "Title",
|
|
46282
47248
|
"Open link in...": "Open link in...",
|
|
46283
47249
|
"Current window": "Current window",
|
|
46284
|
-
"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"
|
|
46285
47264
|
};
|
|
46286
47265
|
const sv = {
|
|
46287
47266
|
"Bold": "Fet",
|
|
@@ -46353,7 +47332,20 @@ const sv = {
|
|
|
46353
47332
|
"Title": "Title",
|
|
46354
47333
|
"Open link in...": "Open link in...",
|
|
46355
47334
|
"Current window": "Current window",
|
|
46356
|
-
"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"
|
|
46357
47349
|
};
|
|
46358
47350
|
const zhTw = {
|
|
46359
47351
|
"Bold": "粗體",
|
|
@@ -46411,7 +47403,7 @@ const zhTw = {
|
|
|
46411
47403
|
"Browse...": "瀏覽...",
|
|
46412
47404
|
"Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
|
|
46413
47405
|
"Alt text": "替代文字",
|
|
46414
|
-
"Insert": "
|
|
47406
|
+
"Insert": "??",
|
|
46415
47407
|
"Cancel": "取消",
|
|
46416
47408
|
"Uploading...": "上傳中...",
|
|
46417
47409
|
"Upload failed": "上傳失敗",
|
|
@@ -46425,7 +47417,20 @@ const zhTw = {
|
|
|
46425
47417
|
"Title": "Title",
|
|
46426
47418
|
"Open link in...": "Open link in...",
|
|
46427
47419
|
"Current window": "Current window",
|
|
46428
|
-
"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"
|
|
46429
47434
|
};
|
|
46430
47435
|
const th = {
|
|
46431
47436
|
"Bold": "ตัวหนา",
|
|
@@ -46483,7 +47488,7 @@ const th = {
|
|
|
46483
47488
|
"Browse...": "เรียกดู...",
|
|
46484
47489
|
"Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
|
|
46485
47490
|
"Alt text": "ข้อความทดแทน",
|
|
46486
|
-
"Insert": "
|
|
47491
|
+
"Insert": "????",
|
|
46487
47492
|
"Cancel": "ยกเลิก",
|
|
46488
47493
|
"Uploading...": "กำลังอัปโหลด...",
|
|
46489
47494
|
"Upload failed": "อัปโหลดล้มเหลว",
|
|
@@ -46497,7 +47502,20 @@ const th = {
|
|
|
46497
47502
|
"Title": "Title",
|
|
46498
47503
|
"Open link in...": "Open link in...",
|
|
46499
47504
|
"Current window": "Current window",
|
|
46500
|
-
"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"
|
|
46501
47519
|
};
|
|
46502
47520
|
const tr = {
|
|
46503
47521
|
"Bold": "Kalın",
|
|
@@ -46569,7 +47587,20 @@ const tr = {
|
|
|
46569
47587
|
"Title": "Title",
|
|
46570
47588
|
"Open link in...": "Open link in...",
|
|
46571
47589
|
"Current window": "Current window",
|
|
46572
|
-
"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"
|
|
46573
47604
|
};
|
|
46574
47605
|
const vi = {
|
|
46575
47606
|
"Bold": "In đậm",
|
|
@@ -46627,7 +47658,7 @@ const vi = {
|
|
|
46627
47658
|
"Browse...": "Duyệt...",
|
|
46628
47659
|
"Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
|
|
46629
47660
|
"Alt text": "Văn bản thay thế",
|
|
46630
|
-
"Insert": "
|
|
47661
|
+
"Insert": "Ch�n",
|
|
46631
47662
|
"Cancel": "Hủy",
|
|
46632
47663
|
"Uploading...": "Đang tải lên...",
|
|
46633
47664
|
"Upload failed": "Tải lên thất bại",
|
|
@@ -46641,7 +47672,20 @@ const vi = {
|
|
|
46641
47672
|
"Title": "Title",
|
|
46642
47673
|
"Open link in...": "Open link in...",
|
|
46643
47674
|
"Current window": "Current window",
|
|
46644
|
-
"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"
|
|
46645
47689
|
};
|
|
46646
47690
|
const locales = {
|
|
46647
47691
|
en,
|
|
@@ -46782,7 +47826,8 @@ class HTMLEditor {
|
|
|
46782
47826
|
format_empty_lines: config.format_empty_lines ?? true,
|
|
46783
47827
|
toolbar_narrow_breakpoint: config.toolbar_narrow_breakpoint,
|
|
46784
47828
|
toolbar_priority: config.toolbar_priority,
|
|
46785
|
-
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
|
|
46786
47831
|
};
|
|
46787
47832
|
}
|
|
46788
47833
|
createEditor() {
|
|
@@ -47205,6 +48250,7 @@ exports.CHAR_MAP = CHAR_MAP;
|
|
|
47205
48250
|
exports.CONFAB_ICONS = CONFAB_ICONS;
|
|
47206
48251
|
exports.CharacterMap = CharacterMap;
|
|
47207
48252
|
exports.DEFAULT_ICONS = DEFAULT_ICONS;
|
|
48253
|
+
exports.Dictation = Dictation;
|
|
47208
48254
|
exports.EMOJI_CATEGORIES = EMOJI_CATEGORIES;
|
|
47209
48255
|
exports.EmojiPicker = EmojiPicker;
|
|
47210
48256
|
exports.FontSize = FontSize;
|
|
@@ -47216,6 +48262,7 @@ exports.PasteFromOffice = PasteFromOffice;
|
|
|
47216
48262
|
exports.SearchReplace = SearchReplace;
|
|
47217
48263
|
exports.SignatureBlock = SignatureBlock;
|
|
47218
48264
|
exports.SourceEditor = SourceEditor;
|
|
48265
|
+
exports.SpeechToText = SpeechToText;
|
|
47219
48266
|
exports.TRANSLATION_KEYS = TRANSLATION_KEYS;
|
|
47220
48267
|
exports.TextDirection = TextDirection;
|
|
47221
48268
|
exports.Toolbar = Toolbar;
|
|
@@ -47225,6 +48272,7 @@ exports.fontNames = fontNames;
|
|
|
47225
48272
|
exports.getGetFileSrc = getGetFileSrc;
|
|
47226
48273
|
exports.getLocale = getLocale;
|
|
47227
48274
|
exports.getTranslate = getTranslate;
|
|
48275
|
+
exports.isSpeechRecognitionSupported = isSpeechRecognitionSupported;
|
|
47228
48276
|
exports.resetTranslate = resetTranslate;
|
|
47229
48277
|
exports.setGetFileSrc = setGetFileSrc;
|
|
47230
48278
|
exports.setTranslate = setTranslate;
|