@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.mjs
CHANGED
|
@@ -17435,6 +17435,26 @@ function canInsertNode(state, nodeType) {
|
|
|
17435
17435
|
}
|
|
17436
17436
|
return false;
|
|
17437
17437
|
}
|
|
17438
|
+
function getStyleProperty(element, propertyName) {
|
|
17439
|
+
const styleAttr = element.getAttribute("style");
|
|
17440
|
+
if (!styleAttr) {
|
|
17441
|
+
return null;
|
|
17442
|
+
}
|
|
17443
|
+
const decls = styleAttr.split(";").map((decl) => decl.trim()).filter(Boolean);
|
|
17444
|
+
const target = propertyName.toLowerCase();
|
|
17445
|
+
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
17446
|
+
const decl = decls[i];
|
|
17447
|
+
const colonIndex = decl.indexOf(":");
|
|
17448
|
+
if (colonIndex === -1) {
|
|
17449
|
+
continue;
|
|
17450
|
+
}
|
|
17451
|
+
const prop = decl.slice(0, colonIndex).trim().toLowerCase();
|
|
17452
|
+
if (prop === target) {
|
|
17453
|
+
return decl.slice(colonIndex + 1).trim();
|
|
17454
|
+
}
|
|
17455
|
+
}
|
|
17456
|
+
return null;
|
|
17457
|
+
}
|
|
17438
17458
|
var markdown_exports = {};
|
|
17439
17459
|
__export$1(markdown_exports, {
|
|
17440
17460
|
createAtomBlockMarkdownSpec: () => createAtomBlockMarkdownSpec,
|
|
@@ -18872,7 +18892,7 @@ var Italic = Mark2.create({
|
|
|
18872
18892
|
];
|
|
18873
18893
|
}
|
|
18874
18894
|
});
|
|
18875
|
-
const encodedTlds = "
|
|
18895
|
+
const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
18876
18896
|
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";
|
|
18877
18897
|
const numeric = "numeric";
|
|
18878
18898
|
const ascii = "ascii";
|
|
@@ -19802,8 +19822,6 @@ function init$1({
|
|
|
19802
19822
|
ta(Email$1, groups.domain, EmailDomain);
|
|
19803
19823
|
tt(Email$1, DOT, EmailDomainDot);
|
|
19804
19824
|
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
19805
|
-
const EmailColon = tt(Email$1, COLON);
|
|
19806
|
-
ta(EmailColon, groups.numeric, Email);
|
|
19807
19825
|
const DomainHyphen = tt(Domain, HYPHEN);
|
|
19808
19826
|
const DomainDot = tt(Domain, DOT);
|
|
19809
19827
|
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
@@ -19867,11 +19885,11 @@ function init$1({
|
|
|
19867
19885
|
const [OPEN, CLOSE] = bracketPairs[i];
|
|
19868
19886
|
const UrlOpen = tt(Url$1, OPEN);
|
|
19869
19887
|
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
19870
|
-
tt(UrlOpen, CLOSE, Url$1);
|
|
19871
19888
|
const UrlOpenQ = makeState(Url);
|
|
19872
19889
|
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
19873
19890
|
const UrlOpenSyms = makeState();
|
|
19874
|
-
ta(UrlOpen, qsNonAccepting);
|
|
19891
|
+
ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
|
|
19892
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
19875
19893
|
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
19876
19894
|
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
19877
19895
|
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
@@ -22606,6 +22624,7 @@ var CharacterCount = Extension.create({
|
|
|
22606
22624
|
addOptions() {
|
|
22607
22625
|
return {
|
|
22608
22626
|
limit: null,
|
|
22627
|
+
autoTrim: true,
|
|
22609
22628
|
mode: "textSize",
|
|
22610
22629
|
textCounter: (text) => text.length,
|
|
22611
22630
|
wordCounter: (text) => text.split(" ").filter((word) => word !== "").length
|
|
@@ -22643,7 +22662,8 @@ var CharacterCount = Extension.create({
|
|
|
22643
22662
|
return;
|
|
22644
22663
|
}
|
|
22645
22664
|
const limit = this.options.limit;
|
|
22646
|
-
|
|
22665
|
+
const autoTrim = this.options.autoTrim;
|
|
22666
|
+
if (limit === null || limit === void 0 || limit === 0 || autoTrim === false) {
|
|
22647
22667
|
initialEvaluationDone = true;
|
|
22648
22668
|
return;
|
|
22649
22669
|
}
|
|
@@ -23193,21 +23213,8 @@ var BackgroundColor = Extension.create({
|
|
|
23193
23213
|
default: null,
|
|
23194
23214
|
parseHTML: (element) => {
|
|
23195
23215
|
var _a;
|
|
23196
|
-
const
|
|
23197
|
-
|
|
23198
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
23199
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
23200
|
-
const parts = decls[i].split(":");
|
|
23201
|
-
if (parts.length >= 2) {
|
|
23202
|
-
const prop = parts[0].trim().toLowerCase();
|
|
23203
|
-
const val = parts.slice(1).join(":").trim();
|
|
23204
|
-
if (prop === "background-color") {
|
|
23205
|
-
return val.replace(/['"]+/g, "");
|
|
23206
|
-
}
|
|
23207
|
-
}
|
|
23208
|
-
}
|
|
23209
|
-
}
|
|
23210
|
-
return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
23216
|
+
const value = (_a = getStyleProperty(element, "background-color")) != null ? _a : element.style.backgroundColor;
|
|
23217
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
23211
23218
|
},
|
|
23212
23219
|
renderHTML: (attributes) => {
|
|
23213
23220
|
if (!attributes.backgroundColor) {
|
|
@@ -23249,21 +23256,8 @@ var Color = Extension.create({
|
|
|
23249
23256
|
default: null,
|
|
23250
23257
|
parseHTML: (element) => {
|
|
23251
23258
|
var _a;
|
|
23252
|
-
const
|
|
23253
|
-
|
|
23254
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
23255
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
23256
|
-
const parts = decls[i].split(":");
|
|
23257
|
-
if (parts.length >= 2) {
|
|
23258
|
-
const prop = parts[0].trim().toLowerCase();
|
|
23259
|
-
const val = parts.slice(1).join(":").trim();
|
|
23260
|
-
if (prop === "color") {
|
|
23261
|
-
return val.replace(/['"]+/g, "");
|
|
23262
|
-
}
|
|
23263
|
-
}
|
|
23264
|
-
}
|
|
23265
|
-
}
|
|
23266
|
-
return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
23259
|
+
const value = (_a = getStyleProperty(element, "color")) != null ? _a : element.style.color;
|
|
23260
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
23267
23261
|
},
|
|
23268
23262
|
renderHTML: (attributes) => {
|
|
23269
23263
|
if (!attributes.color) {
|
|
@@ -23303,7 +23297,14 @@ var FontFamily = Extension.create({
|
|
|
23303
23297
|
attributes: {
|
|
23304
23298
|
fontFamily: {
|
|
23305
23299
|
default: null,
|
|
23306
|
-
|
|
23300
|
+
// Prefer the raw inline `style` attribute so unquoted or
|
|
23301
|
+
// single-quoted multi-word names are preserved instead of being
|
|
23302
|
+
// canonicalized by `element.style.fontFamily`, which forces double
|
|
23303
|
+
// quotes that then get HTML-encoded to `"` on serialization.
|
|
23304
|
+
parseHTML: (element) => {
|
|
23305
|
+
var _a;
|
|
23306
|
+
return (_a = getStyleProperty(element, "font-family")) != null ? _a : element.style.fontFamily;
|
|
23307
|
+
},
|
|
23307
23308
|
renderHTML: (attributes) => {
|
|
23308
23309
|
if (!attributes.fontFamily) {
|
|
23309
23310
|
return {};
|
|
@@ -23342,7 +23343,13 @@ var FontSize$1 = Extension.create({
|
|
|
23342
23343
|
attributes: {
|
|
23343
23344
|
fontSize: {
|
|
23344
23345
|
default: null,
|
|
23345
|
-
|
|
23346
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
23347
|
+
// is preserved instead of the canonicalized value returned by
|
|
23348
|
+
// `element.style.fontSize`.
|
|
23349
|
+
parseHTML: (element) => {
|
|
23350
|
+
var _a;
|
|
23351
|
+
return (_a = getStyleProperty(element, "font-size")) != null ? _a : element.style.fontSize;
|
|
23352
|
+
},
|
|
23346
23353
|
renderHTML: (attributes) => {
|
|
23347
23354
|
if (!attributes.fontSize) {
|
|
23348
23355
|
return {};
|
|
@@ -23381,7 +23388,13 @@ var LineHeight$1 = Extension.create({
|
|
|
23381
23388
|
attributes: {
|
|
23382
23389
|
lineHeight: {
|
|
23383
23390
|
default: null,
|
|
23384
|
-
|
|
23391
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
23392
|
+
// is preserved instead of the canonicalized value returned by
|
|
23393
|
+
// `element.style.lineHeight`.
|
|
23394
|
+
parseHTML: (element) => {
|
|
23395
|
+
var _a;
|
|
23396
|
+
return (_a = getStyleProperty(element, "line-height")) != null ? _a : element.style.lineHeight;
|
|
23397
|
+
},
|
|
23385
23398
|
renderHTML: (attributes) => {
|
|
23386
23399
|
if (!attributes.lineHeight) {
|
|
23387
23400
|
return {};
|
|
@@ -23448,7 +23461,11 @@ var Highlight = Mark2.create({
|
|
|
23448
23461
|
return {
|
|
23449
23462
|
color: {
|
|
23450
23463
|
default: null,
|
|
23451
|
-
|
|
23464
|
+
// Prefer `data-color` (set by our own `renderHTML`) for lossless
|
|
23465
|
+
// round-trips. Otherwise parse the raw inline `style` attribute so
|
|
23466
|
+
// the original color format (e.g. `#rrggbb`) is preserved instead of
|
|
23467
|
+
// the canonicalized `rgb(...)` value from `element.style.backgroundColor`.
|
|
23468
|
+
parseHTML: (element) => element.getAttribute("data-color") || getStyleProperty(element, "background-color") || element.style.backgroundColor,
|
|
23452
23469
|
renderHTML: (attributes) => {
|
|
23453
23470
|
if (!attributes.color) {
|
|
23454
23471
|
return {};
|
|
@@ -42868,6 +42885,567 @@ class LinkEditor {
|
|
|
42868
42885
|
}
|
|
42869
42886
|
}
|
|
42870
42887
|
}
|
|
42888
|
+
const SPEECH_LANGUAGES = [
|
|
42889
|
+
{ code: "ar-SA", name: "العربية" },
|
|
42890
|
+
{ code: "ca-ES", name: "Català" },
|
|
42891
|
+
{ code: "cs-CZ", name: "Čeština" },
|
|
42892
|
+
{ code: "da-DK", name: "Dansk" },
|
|
42893
|
+
{ code: "de-DE", name: "Deutsch" },
|
|
42894
|
+
{ code: "el-GR", name: "Ελληνικά" },
|
|
42895
|
+
{ code: "en-US", name: "English (US)" },
|
|
42896
|
+
{ code: "en-GB", name: "English (UK)" },
|
|
42897
|
+
{ code: "es-ES", name: "Español" },
|
|
42898
|
+
{ code: "fi-FI", name: "Suomi" },
|
|
42899
|
+
{ code: "fr-FR", name: "Français" },
|
|
42900
|
+
{ code: "fr-CA", name: "Français (Canada)" },
|
|
42901
|
+
{ code: "hu-HU", name: "Magyar" },
|
|
42902
|
+
{ code: "id-ID", name: "Bahasa Indonesia" },
|
|
42903
|
+
{ code: "it-IT", name: "Italiano" },
|
|
42904
|
+
{ code: "ja-JP", name: "日本語" },
|
|
42905
|
+
{ code: "ko-KR", name: "한국어" },
|
|
42906
|
+
{ code: "nb-NO", name: "Norsk Bokmål" },
|
|
42907
|
+
{ code: "nl-NL", name: "Nederlands" },
|
|
42908
|
+
{ code: "pl-PL", name: "Polski" },
|
|
42909
|
+
{ code: "pt-BR", name: "Português" },
|
|
42910
|
+
{ code: "ro-RO", name: "Română" },
|
|
42911
|
+
{ code: "ru-RU", name: "Русский" },
|
|
42912
|
+
{ code: "sl-SI", name: "Slovenščina" },
|
|
42913
|
+
{ code: "sr-RS", name: "Српски" },
|
|
42914
|
+
{ code: "sv-SE", name: "Svenska" },
|
|
42915
|
+
{ code: "th-TH", name: "ไทย" },
|
|
42916
|
+
{ code: "tr-TR", name: "Türkçe" },
|
|
42917
|
+
{ code: "vi-VN", name: "Tiếng Việt" },
|
|
42918
|
+
{ code: "zh-CN", name: "中文 (简体)" },
|
|
42919
|
+
{ code: "zh-TW", name: "中文 (繁體)" }
|
|
42920
|
+
];
|
|
42921
|
+
const LOCALE_TO_BCP47$1 = {
|
|
42922
|
+
"ar": "ar-SA",
|
|
42923
|
+
"ca": "ca-ES",
|
|
42924
|
+
"cs": "cs-CZ",
|
|
42925
|
+
"da": "da-DK",
|
|
42926
|
+
"de": "de-DE",
|
|
42927
|
+
"el": "el-GR",
|
|
42928
|
+
"en": "en-US",
|
|
42929
|
+
"en-gb": "en-GB",
|
|
42930
|
+
"es": "es-ES",
|
|
42931
|
+
"fi": "fi-FI",
|
|
42932
|
+
"fr": "fr-FR",
|
|
42933
|
+
"fr-ca": "fr-CA",
|
|
42934
|
+
"hu": "hu-HU",
|
|
42935
|
+
"id": "id-ID",
|
|
42936
|
+
"it": "it-IT",
|
|
42937
|
+
"ja": "ja-JP",
|
|
42938
|
+
"ko": "ko-KR",
|
|
42939
|
+
"nb": "nb-NO",
|
|
42940
|
+
"nl": "nl-NL",
|
|
42941
|
+
"pl": "pl-PL",
|
|
42942
|
+
"pt": "pt-BR",
|
|
42943
|
+
"ro": "ro-RO",
|
|
42944
|
+
"ru": "ru-RU",
|
|
42945
|
+
"sl": "sl-SI",
|
|
42946
|
+
"sr": "sr-RS",
|
|
42947
|
+
"sv": "sv-SE",
|
|
42948
|
+
"th": "th-TH",
|
|
42949
|
+
"tr": "tr-TR",
|
|
42950
|
+
"vi": "vi-VN",
|
|
42951
|
+
"zh": "zh-CN",
|
|
42952
|
+
"zh-tw": "zh-TW"
|
|
42953
|
+
};
|
|
42954
|
+
function isSpeechRecognitionSupported() {
|
|
42955
|
+
return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
|
|
42956
|
+
}
|
|
42957
|
+
function getSpeechRecognitionConstructor$1() {
|
|
42958
|
+
return window.SpeechRecognition || window.webkitSpeechRecognition || null;
|
|
42959
|
+
}
|
|
42960
|
+
class SpeechToText {
|
|
42961
|
+
options;
|
|
42962
|
+
overlay = null;
|
|
42963
|
+
dialog = null;
|
|
42964
|
+
recognition = null;
|
|
42965
|
+
isListening = false;
|
|
42966
|
+
finalTranscript = "";
|
|
42967
|
+
interimTranscript = "";
|
|
42968
|
+
lastConfidence = 0;
|
|
42969
|
+
restartTimer = null;
|
|
42970
|
+
// DOM references
|
|
42971
|
+
transcriptArea = null;
|
|
42972
|
+
confidenceEl = null;
|
|
42973
|
+
statusEl = null;
|
|
42974
|
+
startStopBtn = null;
|
|
42975
|
+
insertBtn = null;
|
|
42976
|
+
clearBtn = null;
|
|
42977
|
+
languageSelect = null;
|
|
42978
|
+
constructor(options) {
|
|
42979
|
+
this.options = options;
|
|
42980
|
+
}
|
|
42981
|
+
open() {
|
|
42982
|
+
if (this.overlay) {
|
|
42983
|
+
this.overlay.style.display = "flex";
|
|
42984
|
+
return;
|
|
42985
|
+
}
|
|
42986
|
+
this.createDialog();
|
|
42987
|
+
}
|
|
42988
|
+
close() {
|
|
42989
|
+
if (this.overlay) {
|
|
42990
|
+
this.overlay.style.display = "none";
|
|
42991
|
+
}
|
|
42992
|
+
this.stopRecognition();
|
|
42993
|
+
}
|
|
42994
|
+
destroy() {
|
|
42995
|
+
this.stopRecognition();
|
|
42996
|
+
this.overlay?.remove();
|
|
42997
|
+
this.overlay = null;
|
|
42998
|
+
this.dialog = null;
|
|
42999
|
+
this.transcriptArea = null;
|
|
43000
|
+
this.confidenceEl = null;
|
|
43001
|
+
this.statusEl = null;
|
|
43002
|
+
this.startStopBtn = null;
|
|
43003
|
+
this.insertBtn = null;
|
|
43004
|
+
this.clearBtn = null;
|
|
43005
|
+
this.languageSelect = null;
|
|
43006
|
+
}
|
|
43007
|
+
get editorLanguage() {
|
|
43008
|
+
return this.options.editor.getConfig().language ?? "en";
|
|
43009
|
+
}
|
|
43010
|
+
getDefaultSpeechLang() {
|
|
43011
|
+
return LOCALE_TO_BCP47$1[this.editorLanguage] ?? "en-US";
|
|
43012
|
+
}
|
|
43013
|
+
createDialog() {
|
|
43014
|
+
const trans = this.options.trans;
|
|
43015
|
+
this.overlay = document.createElement("div");
|
|
43016
|
+
this.overlay.className = "md-dialog-overlay";
|
|
43017
|
+
this.overlay.addEventListener("click", (e) => {
|
|
43018
|
+
if (e.target === this.overlay) this.close();
|
|
43019
|
+
});
|
|
43020
|
+
this.dialog = document.createElement("div");
|
|
43021
|
+
this.dialog.className = "md-dialog md-speechtotext-dialog";
|
|
43022
|
+
const header = document.createElement("div");
|
|
43023
|
+
header.className = "md-dialog-header";
|
|
43024
|
+
header.innerHTML = `
|
|
43025
|
+
<h3>${trans("Speech to Text")}</h3>
|
|
43026
|
+
<button type="button" class="md-dialog-close">×</button>
|
|
43027
|
+
`;
|
|
43028
|
+
header.querySelector(".md-dialog-close").addEventListener("click", () => this.close());
|
|
43029
|
+
const body = document.createElement("div");
|
|
43030
|
+
body.className = "md-dialog-body md-speechtotext-body";
|
|
43031
|
+
const langRow = document.createElement("div");
|
|
43032
|
+
langRow.className = "md-speechtotext-lang-row";
|
|
43033
|
+
const langLabel = document.createElement("label");
|
|
43034
|
+
langLabel.className = "md-speechtotext-label";
|
|
43035
|
+
langLabel.textContent = trans("Language");
|
|
43036
|
+
this.languageSelect = document.createElement("select");
|
|
43037
|
+
this.languageSelect.className = "md-speechtotext-language";
|
|
43038
|
+
const defaultLang = this.getDefaultSpeechLang();
|
|
43039
|
+
for (const lang of SPEECH_LANGUAGES) {
|
|
43040
|
+
const opt = document.createElement("option");
|
|
43041
|
+
opt.value = lang.code;
|
|
43042
|
+
opt.textContent = lang.name;
|
|
43043
|
+
if (lang.code === defaultLang) opt.selected = true;
|
|
43044
|
+
this.languageSelect.appendChild(opt);
|
|
43045
|
+
}
|
|
43046
|
+
langRow.appendChild(langLabel);
|
|
43047
|
+
langRow.appendChild(this.languageSelect);
|
|
43048
|
+
this.statusEl = document.createElement("div");
|
|
43049
|
+
this.statusEl.className = "md-speechtotext-status";
|
|
43050
|
+
this.statusEl.textContent = "";
|
|
43051
|
+
this.transcriptArea = document.createElement("div");
|
|
43052
|
+
this.transcriptArea.className = "md-speechtotext-transcript";
|
|
43053
|
+
this.confidenceEl = document.createElement("div");
|
|
43054
|
+
this.confidenceEl.className = "md-speechtotext-confidence";
|
|
43055
|
+
this.confidenceEl.textContent = "";
|
|
43056
|
+
const controls = document.createElement("div");
|
|
43057
|
+
controls.className = "md-speechtotext-controls";
|
|
43058
|
+
this.startStopBtn = document.createElement("button");
|
|
43059
|
+
this.startStopBtn.type = "button";
|
|
43060
|
+
this.startStopBtn.className = "md-speechtotext-btn md-speechtotext-btn-start";
|
|
43061
|
+
this.startStopBtn.textContent = trans("Start");
|
|
43062
|
+
this.startStopBtn.addEventListener("click", () => this.toggleRecognition());
|
|
43063
|
+
this.insertBtn = document.createElement("button");
|
|
43064
|
+
this.insertBtn.type = "button";
|
|
43065
|
+
this.insertBtn.className = "md-speechtotext-btn md-speechtotext-btn-insert";
|
|
43066
|
+
this.insertBtn.textContent = trans("Insert");
|
|
43067
|
+
this.insertBtn.addEventListener("click", () => this.insertTranscript());
|
|
43068
|
+
this.clearBtn = document.createElement("button");
|
|
43069
|
+
this.clearBtn.type = "button";
|
|
43070
|
+
this.clearBtn.className = "md-speechtotext-btn md-speechtotext-btn-clear";
|
|
43071
|
+
this.clearBtn.textContent = trans("Clear");
|
|
43072
|
+
this.clearBtn.addEventListener("click", () => this.clearTranscript());
|
|
43073
|
+
controls.appendChild(this.startStopBtn);
|
|
43074
|
+
controls.appendChild(this.insertBtn);
|
|
43075
|
+
controls.appendChild(this.clearBtn);
|
|
43076
|
+
body.appendChild(langRow);
|
|
43077
|
+
body.appendChild(this.statusEl);
|
|
43078
|
+
body.appendChild(this.transcriptArea);
|
|
43079
|
+
body.appendChild(this.confidenceEl);
|
|
43080
|
+
body.appendChild(controls);
|
|
43081
|
+
this.dialog.appendChild(header);
|
|
43082
|
+
this.dialog.appendChild(body);
|
|
43083
|
+
this.overlay.appendChild(this.dialog);
|
|
43084
|
+
document.body.appendChild(this.overlay);
|
|
43085
|
+
this.dialog.addEventListener("keydown", (e) => {
|
|
43086
|
+
if (e.key === "Escape") {
|
|
43087
|
+
this.close();
|
|
43088
|
+
}
|
|
43089
|
+
});
|
|
43090
|
+
}
|
|
43091
|
+
toggleRecognition() {
|
|
43092
|
+
if (this.isListening) {
|
|
43093
|
+
this.stopRecognition();
|
|
43094
|
+
} else {
|
|
43095
|
+
this.startRecognition();
|
|
43096
|
+
}
|
|
43097
|
+
}
|
|
43098
|
+
startRecognition() {
|
|
43099
|
+
const SpeechRecognitionCtor = getSpeechRecognitionConstructor$1();
|
|
43100
|
+
if (!SpeechRecognitionCtor) return;
|
|
43101
|
+
this.recognition = new SpeechRecognitionCtor();
|
|
43102
|
+
this.recognition.continuous = true;
|
|
43103
|
+
this.recognition.interimResults = true;
|
|
43104
|
+
this.recognition.maxAlternatives = 1;
|
|
43105
|
+
this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
|
|
43106
|
+
this.recognition.onresult = this.handleResult.bind(this);
|
|
43107
|
+
this.recognition.onerror = this.handleError.bind(this);
|
|
43108
|
+
this.recognition.onend = this.handleEnd.bind(this);
|
|
43109
|
+
try {
|
|
43110
|
+
this.recognition.start();
|
|
43111
|
+
this.isListening = true;
|
|
43112
|
+
this.updateButtonState();
|
|
43113
|
+
this.setStatus(this.options.trans("Listening..."));
|
|
43114
|
+
} catch {
|
|
43115
|
+
}
|
|
43116
|
+
}
|
|
43117
|
+
handleResult(event) {
|
|
43118
|
+
this.interimTranscript = "";
|
|
43119
|
+
for (let i = event.resultIndex; i < event.results.length; i++) {
|
|
43120
|
+
const result = event.results[i];
|
|
43121
|
+
if (result.isFinal) {
|
|
43122
|
+
const text = result[0].transcript;
|
|
43123
|
+
if (this.finalTranscript.length > 0 && !this.finalTranscript.endsWith(" ") && !text.startsWith(" ")) {
|
|
43124
|
+
this.finalTranscript += " ";
|
|
43125
|
+
}
|
|
43126
|
+
this.finalTranscript += text;
|
|
43127
|
+
this.lastConfidence = result[0].confidence;
|
|
43128
|
+
} else {
|
|
43129
|
+
this.interimTranscript += result[0].transcript;
|
|
43130
|
+
}
|
|
43131
|
+
}
|
|
43132
|
+
this.updateTranscriptDisplay();
|
|
43133
|
+
this.updateConfidenceDisplay();
|
|
43134
|
+
}
|
|
43135
|
+
handleError(event) {
|
|
43136
|
+
const trans = this.options.trans;
|
|
43137
|
+
if (event.error === "no-speech") ;
|
|
43138
|
+
else if (event.error === "not-allowed") {
|
|
43139
|
+
this.stopRecognition();
|
|
43140
|
+
this.setStatus(trans("Microphone access denied"));
|
|
43141
|
+
} else if (event.error === "audio-capture") {
|
|
43142
|
+
this.stopRecognition();
|
|
43143
|
+
this.setStatus(trans("No microphone found"));
|
|
43144
|
+
} else if (event.error === "network") {
|
|
43145
|
+
this.stopRecognition();
|
|
43146
|
+
this.setStatus(trans("Network error - speech recognition requires internet"));
|
|
43147
|
+
} else if (event.error !== "aborted") ;
|
|
43148
|
+
}
|
|
43149
|
+
handleEnd() {
|
|
43150
|
+
if (this.isListening) {
|
|
43151
|
+
this.restartTimer = setTimeout(() => {
|
|
43152
|
+
if (!this.isListening) return;
|
|
43153
|
+
try {
|
|
43154
|
+
this.recognition?.start();
|
|
43155
|
+
} catch {
|
|
43156
|
+
const Ctor = getSpeechRecognitionConstructor$1();
|
|
43157
|
+
if (!Ctor) return;
|
|
43158
|
+
this.recognition = new Ctor();
|
|
43159
|
+
this.recognition.continuous = true;
|
|
43160
|
+
this.recognition.interimResults = true;
|
|
43161
|
+
this.recognition.maxAlternatives = 1;
|
|
43162
|
+
this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
|
|
43163
|
+
this.recognition.onresult = this.handleResult.bind(this);
|
|
43164
|
+
this.recognition.onerror = this.handleError.bind(this);
|
|
43165
|
+
this.recognition.onend = this.handleEnd.bind(this);
|
|
43166
|
+
try {
|
|
43167
|
+
this.recognition.start();
|
|
43168
|
+
} catch {
|
|
43169
|
+
this.stopRecognition();
|
|
43170
|
+
}
|
|
43171
|
+
}
|
|
43172
|
+
}, 300);
|
|
43173
|
+
}
|
|
43174
|
+
}
|
|
43175
|
+
stopRecognition() {
|
|
43176
|
+
this.isListening = false;
|
|
43177
|
+
if (this.restartTimer) {
|
|
43178
|
+
clearTimeout(this.restartTimer);
|
|
43179
|
+
this.restartTimer = null;
|
|
43180
|
+
}
|
|
43181
|
+
if (this.recognition) {
|
|
43182
|
+
try {
|
|
43183
|
+
this.recognition.stop();
|
|
43184
|
+
} catch {
|
|
43185
|
+
}
|
|
43186
|
+
this.recognition = null;
|
|
43187
|
+
}
|
|
43188
|
+
this.updateButtonState();
|
|
43189
|
+
this.setStatus("");
|
|
43190
|
+
}
|
|
43191
|
+
updateButtonState() {
|
|
43192
|
+
const trans = this.options.trans;
|
|
43193
|
+
if (this.startStopBtn) {
|
|
43194
|
+
if (this.isListening) {
|
|
43195
|
+
this.startStopBtn.textContent = trans("Stop");
|
|
43196
|
+
this.startStopBtn.classList.remove("md-speechtotext-btn-start");
|
|
43197
|
+
this.startStopBtn.classList.add("md-speechtotext-btn-stop");
|
|
43198
|
+
} else {
|
|
43199
|
+
this.startStopBtn.textContent = trans("Start");
|
|
43200
|
+
this.startStopBtn.classList.remove("md-speechtotext-btn-stop");
|
|
43201
|
+
this.startStopBtn.classList.add("md-speechtotext-btn-start");
|
|
43202
|
+
}
|
|
43203
|
+
}
|
|
43204
|
+
if (this.statusEl) {
|
|
43205
|
+
this.statusEl.classList.toggle("md-speechtotext-status-active", this.isListening);
|
|
43206
|
+
}
|
|
43207
|
+
}
|
|
43208
|
+
setStatus(text) {
|
|
43209
|
+
if (this.statusEl) {
|
|
43210
|
+
this.statusEl.textContent = text;
|
|
43211
|
+
}
|
|
43212
|
+
}
|
|
43213
|
+
updateTranscriptDisplay() {
|
|
43214
|
+
if (!this.transcriptArea) return;
|
|
43215
|
+
const finalSpan = `<span class="md-speechtotext-final">${this.escapeHtml(this.finalTranscript)}</span>`;
|
|
43216
|
+
const interimSpan = this.interimTranscript ? `<span class="md-speechtotext-interim">${this.escapeHtml(this.interimTranscript)}</span>` : "";
|
|
43217
|
+
this.transcriptArea.innerHTML = finalSpan + interimSpan;
|
|
43218
|
+
this.transcriptArea.scrollTop = this.transcriptArea.scrollHeight;
|
|
43219
|
+
}
|
|
43220
|
+
updateConfidenceDisplay() {
|
|
43221
|
+
if (!this.confidenceEl) return;
|
|
43222
|
+
if (this.lastConfidence > 0) {
|
|
43223
|
+
const pct = Math.round(this.lastConfidence * 100);
|
|
43224
|
+
this.confidenceEl.textContent = `${this.options.trans("Confidence")}: ${pct}%`;
|
|
43225
|
+
}
|
|
43226
|
+
}
|
|
43227
|
+
insertTranscript() {
|
|
43228
|
+
const text = this.finalTranscript.trim();
|
|
43229
|
+
if (!text) return;
|
|
43230
|
+
const tiptap = this.options.editor.getTipTap();
|
|
43231
|
+
if (tiptap) {
|
|
43232
|
+
tiptap.chain().focus().insertContent(text).run();
|
|
43233
|
+
}
|
|
43234
|
+
this.clearTranscript();
|
|
43235
|
+
this.close();
|
|
43236
|
+
}
|
|
43237
|
+
clearTranscript() {
|
|
43238
|
+
this.finalTranscript = "";
|
|
43239
|
+
this.interimTranscript = "";
|
|
43240
|
+
this.lastConfidence = 0;
|
|
43241
|
+
if (this.transcriptArea) {
|
|
43242
|
+
this.transcriptArea.innerHTML = "";
|
|
43243
|
+
}
|
|
43244
|
+
if (this.confidenceEl) {
|
|
43245
|
+
this.confidenceEl.textContent = "";
|
|
43246
|
+
}
|
|
43247
|
+
}
|
|
43248
|
+
escapeHtml(text) {
|
|
43249
|
+
const div = document.createElement("div");
|
|
43250
|
+
div.textContent = text;
|
|
43251
|
+
return div.innerHTML;
|
|
43252
|
+
}
|
|
43253
|
+
}
|
|
43254
|
+
const LOCALE_TO_BCP47 = {
|
|
43255
|
+
"ar": "ar-SA",
|
|
43256
|
+
"ca": "ca-ES",
|
|
43257
|
+
"cs": "cs-CZ",
|
|
43258
|
+
"da": "da-DK",
|
|
43259
|
+
"de": "de-DE",
|
|
43260
|
+
"el": "el-GR",
|
|
43261
|
+
"en": "en-US",
|
|
43262
|
+
"en-gb": "en-GB",
|
|
43263
|
+
"es": "es-ES",
|
|
43264
|
+
"fi": "fi-FI",
|
|
43265
|
+
"fr": "fr-FR",
|
|
43266
|
+
"fr-ca": "fr-CA",
|
|
43267
|
+
"hu": "hu-HU",
|
|
43268
|
+
"id": "id-ID",
|
|
43269
|
+
"it": "it-IT",
|
|
43270
|
+
"ja": "ja-JP",
|
|
43271
|
+
"ko": "ko-KR",
|
|
43272
|
+
"nb": "nb-NO",
|
|
43273
|
+
"nl": "nl-NL",
|
|
43274
|
+
"pl": "pl-PL",
|
|
43275
|
+
"pt": "pt-BR",
|
|
43276
|
+
"ro": "ro-RO",
|
|
43277
|
+
"ru": "ru-RU",
|
|
43278
|
+
"sl": "sl-SI",
|
|
43279
|
+
"sr": "sr-RS",
|
|
43280
|
+
"sv": "sv-SE",
|
|
43281
|
+
"th": "th-TH",
|
|
43282
|
+
"tr": "tr-TR",
|
|
43283
|
+
"vi": "vi-VN",
|
|
43284
|
+
"zh": "zh-CN",
|
|
43285
|
+
"zh-tw": "zh-TW"
|
|
43286
|
+
};
|
|
43287
|
+
function getSpeechRecognitionConstructor() {
|
|
43288
|
+
return window.SpeechRecognition || window.webkitSpeechRecognition || null;
|
|
43289
|
+
}
|
|
43290
|
+
class Dictation {
|
|
43291
|
+
options;
|
|
43292
|
+
recognition = null;
|
|
43293
|
+
_isActive = false;
|
|
43294
|
+
restartTimer = null;
|
|
43295
|
+
// Tracks the start position of current interim text so we can replace it
|
|
43296
|
+
interimStart = null;
|
|
43297
|
+
interimLength = 0;
|
|
43298
|
+
constructor(options) {
|
|
43299
|
+
this.options = options;
|
|
43300
|
+
}
|
|
43301
|
+
get isActive() {
|
|
43302
|
+
return this._isActive;
|
|
43303
|
+
}
|
|
43304
|
+
toggle() {
|
|
43305
|
+
if (this._isActive) {
|
|
43306
|
+
this.stop();
|
|
43307
|
+
} else {
|
|
43308
|
+
this.start();
|
|
43309
|
+
}
|
|
43310
|
+
}
|
|
43311
|
+
start() {
|
|
43312
|
+
const Ctor = getSpeechRecognitionConstructor();
|
|
43313
|
+
if (!Ctor) return;
|
|
43314
|
+
this.recognition = new Ctor();
|
|
43315
|
+
this.recognition.continuous = true;
|
|
43316
|
+
this.recognition.interimResults = true;
|
|
43317
|
+
this.recognition.maxAlternatives = 1;
|
|
43318
|
+
this.recognition.lang = this.getSpeechLang();
|
|
43319
|
+
this.recognition.onresult = this.handleResult.bind(this);
|
|
43320
|
+
this.recognition.onerror = this.handleError.bind(this);
|
|
43321
|
+
this.recognition.onend = this.handleEnd.bind(this);
|
|
43322
|
+
try {
|
|
43323
|
+
this.recognition.start();
|
|
43324
|
+
this._isActive = true;
|
|
43325
|
+
this.interimStart = null;
|
|
43326
|
+
this.interimLength = 0;
|
|
43327
|
+
this.options.onStateChange?.(true);
|
|
43328
|
+
} catch {
|
|
43329
|
+
}
|
|
43330
|
+
}
|
|
43331
|
+
stop() {
|
|
43332
|
+
this._isActive = false;
|
|
43333
|
+
if (this.restartTimer) {
|
|
43334
|
+
clearTimeout(this.restartTimer);
|
|
43335
|
+
this.restartTimer = null;
|
|
43336
|
+
}
|
|
43337
|
+
this.clearInterim();
|
|
43338
|
+
if (this.recognition) {
|
|
43339
|
+
try {
|
|
43340
|
+
this.recognition.stop();
|
|
43341
|
+
} catch {
|
|
43342
|
+
}
|
|
43343
|
+
this.recognition = null;
|
|
43344
|
+
}
|
|
43345
|
+
this.options.onStateChange?.(false);
|
|
43346
|
+
}
|
|
43347
|
+
destroy() {
|
|
43348
|
+
this.stop();
|
|
43349
|
+
}
|
|
43350
|
+
getSpeechLang() {
|
|
43351
|
+
const locale = this.options.editor.getConfig().language ?? "en";
|
|
43352
|
+
return LOCALE_TO_BCP47[locale] ?? "en-US";
|
|
43353
|
+
}
|
|
43354
|
+
handleResult(event) {
|
|
43355
|
+
const tiptap = this.options.editor.getTipTap();
|
|
43356
|
+
if (!tiptap) return;
|
|
43357
|
+
for (let i = event.resultIndex; i < event.results.length; i++) {
|
|
43358
|
+
const result = event.results[i];
|
|
43359
|
+
const transcript = result[0].transcript;
|
|
43360
|
+
if (result.isFinal) {
|
|
43361
|
+
this.clearInterim();
|
|
43362
|
+
let text = transcript;
|
|
43363
|
+
if (this.needsLeadingSpace(text)) {
|
|
43364
|
+
text = " " + text;
|
|
43365
|
+
}
|
|
43366
|
+
tiptap.chain().focus().insertContent(text).run();
|
|
43367
|
+
} else {
|
|
43368
|
+
let text = transcript;
|
|
43369
|
+
if (this.interimStart === null && this.needsLeadingSpace(text)) {
|
|
43370
|
+
text = " " + text;
|
|
43371
|
+
}
|
|
43372
|
+
this.replaceInterim(text);
|
|
43373
|
+
}
|
|
43374
|
+
}
|
|
43375
|
+
}
|
|
43376
|
+
/** Replace the current interim text in the editor with new interim text */
|
|
43377
|
+
replaceInterim(text) {
|
|
43378
|
+
const tiptap = this.options.editor.getTipTap();
|
|
43379
|
+
if (!tiptap) return;
|
|
43380
|
+
if (this.interimStart !== null && this.interimLength > 0) {
|
|
43381
|
+
tiptap.chain().focus().command(({ tr: tr2 }) => {
|
|
43382
|
+
tr2.delete(this.interimStart, this.interimStart + this.interimLength);
|
|
43383
|
+
return true;
|
|
43384
|
+
}).run();
|
|
43385
|
+
}
|
|
43386
|
+
if (this.interimStart === null) {
|
|
43387
|
+
this.interimStart = tiptap.state.selection.from;
|
|
43388
|
+
}
|
|
43389
|
+
tiptap.chain().focus().insertContent(text).run();
|
|
43390
|
+
this.interimLength = text.length;
|
|
43391
|
+
}
|
|
43392
|
+
/** Remove interim text without inserting anything */
|
|
43393
|
+
clearInterim() {
|
|
43394
|
+
if (this.interimStart !== null && this.interimLength > 0) {
|
|
43395
|
+
const tiptap = this.options.editor.getTipTap();
|
|
43396
|
+
if (tiptap) {
|
|
43397
|
+
tiptap.chain().focus().command(({ tr: tr2 }) => {
|
|
43398
|
+
tr2.delete(this.interimStart, this.interimStart + this.interimLength);
|
|
43399
|
+
return true;
|
|
43400
|
+
}).run();
|
|
43401
|
+
}
|
|
43402
|
+
}
|
|
43403
|
+
this.interimStart = null;
|
|
43404
|
+
this.interimLength = 0;
|
|
43405
|
+
}
|
|
43406
|
+
needsLeadingSpace(newText) {
|
|
43407
|
+
if (newText.startsWith(" ")) return false;
|
|
43408
|
+
const tiptap = this.options.editor.getTipTap();
|
|
43409
|
+
if (!tiptap) return false;
|
|
43410
|
+
const { from: from2 } = tiptap.state.selection;
|
|
43411
|
+
if (from2 === 0) return false;
|
|
43412
|
+
const textBefore = tiptap.state.doc.textBetween(Math.max(0, from2 - 1), from2, "");
|
|
43413
|
+
if (!textBefore) return false;
|
|
43414
|
+
return textBefore.trim().length > 0;
|
|
43415
|
+
}
|
|
43416
|
+
handleError(event) {
|
|
43417
|
+
if (event.error === "no-speech") ;
|
|
43418
|
+
else if (event.error === "not-allowed" || event.error === "audio-capture" || event.error === "network") {
|
|
43419
|
+
this.stop();
|
|
43420
|
+
}
|
|
43421
|
+
}
|
|
43422
|
+
handleEnd() {
|
|
43423
|
+
if (this._isActive) {
|
|
43424
|
+
this.restartTimer = setTimeout(() => {
|
|
43425
|
+
if (!this._isActive) return;
|
|
43426
|
+
try {
|
|
43427
|
+
this.recognition?.start();
|
|
43428
|
+
} catch {
|
|
43429
|
+
const Ctor = getSpeechRecognitionConstructor();
|
|
43430
|
+
if (!Ctor) return;
|
|
43431
|
+
this.recognition = new Ctor();
|
|
43432
|
+
this.recognition.continuous = true;
|
|
43433
|
+
this.recognition.interimResults = true;
|
|
43434
|
+
this.recognition.maxAlternatives = 1;
|
|
43435
|
+
this.recognition.lang = this.getSpeechLang();
|
|
43436
|
+
this.recognition.onresult = this.handleResult.bind(this);
|
|
43437
|
+
this.recognition.onerror = this.handleError.bind(this);
|
|
43438
|
+
this.recognition.onend = this.handleEnd.bind(this);
|
|
43439
|
+
try {
|
|
43440
|
+
this.recognition.start();
|
|
43441
|
+
} catch {
|
|
43442
|
+
this.stop();
|
|
43443
|
+
}
|
|
43444
|
+
}
|
|
43445
|
+
}, 300);
|
|
43446
|
+
}
|
|
43447
|
+
}
|
|
43448
|
+
}
|
|
42871
43449
|
const DEFAULT_BUTTON_PRIORITY = {
|
|
42872
43450
|
bold: 1,
|
|
42873
43451
|
italic: 1,
|
|
@@ -42930,6 +43508,8 @@ class Toolbar {
|
|
|
42930
43508
|
searchReplace = null;
|
|
42931
43509
|
sourceEditor = null;
|
|
42932
43510
|
linkEditor = null;
|
|
43511
|
+
speechToText = null;
|
|
43512
|
+
dictation = null;
|
|
42933
43513
|
updateInterval = null;
|
|
42934
43514
|
boundClickHandler = null;
|
|
42935
43515
|
boundKeydownHandler = null;
|
|
@@ -43246,6 +43826,32 @@ class Toolbar {
|
|
|
43246
43826
|
return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
|
|
43247
43827
|
this.openSearchReplace();
|
|
43248
43828
|
});
|
|
43829
|
+
case "speechtotext": {
|
|
43830
|
+
if (this.options.config.speech_to_text === false) return null;
|
|
43831
|
+
if (!isSpeechRecognitionSupported()) {
|
|
43832
|
+
const btn = this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to text is not supported in this browser"), () => {
|
|
43833
|
+
});
|
|
43834
|
+
btn.classList.add("md-toolbar-btn-disabled");
|
|
43835
|
+
btn.setAttribute("aria-disabled", "true");
|
|
43836
|
+
return btn;
|
|
43837
|
+
}
|
|
43838
|
+
return this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to Text"), () => {
|
|
43839
|
+
this.openSpeechToText();
|
|
43840
|
+
});
|
|
43841
|
+
}
|
|
43842
|
+
case "dictate": {
|
|
43843
|
+
if (this.options.config.speech_to_text === false) return null;
|
|
43844
|
+
if (!isSpeechRecognitionSupported()) {
|
|
43845
|
+
const btn = this.createActionButton("dictate", this.icon("dictate"), this.trans("Speech to text is not supported in this browser"), () => {
|
|
43846
|
+
});
|
|
43847
|
+
btn.classList.add("md-toolbar-btn-disabled");
|
|
43848
|
+
btn.setAttribute("aria-disabled", "true");
|
|
43849
|
+
return btn;
|
|
43850
|
+
}
|
|
43851
|
+
return this.createActionButton("dictate", this.icon("dictate"), this.trans("Dictate"), () => {
|
|
43852
|
+
this.toggleDictation();
|
|
43853
|
+
});
|
|
43854
|
+
}
|
|
43249
43855
|
case "template":
|
|
43250
43856
|
return this.createTemplateDropdown();
|
|
43251
43857
|
default:
|
|
@@ -43678,6 +44284,31 @@ class Toolbar {
|
|
|
43678
44284
|
}
|
|
43679
44285
|
this.searchReplace.open();
|
|
43680
44286
|
}
|
|
44287
|
+
openSpeechToText() {
|
|
44288
|
+
if (!this.speechToText) {
|
|
44289
|
+
this.speechToText = new SpeechToText({
|
|
44290
|
+
editor: this.options.editor,
|
|
44291
|
+
trans: this.trans
|
|
44292
|
+
});
|
|
44293
|
+
}
|
|
44294
|
+
this.speechToText.open();
|
|
44295
|
+
}
|
|
44296
|
+
toggleDictation() {
|
|
44297
|
+
if (!this.dictation) {
|
|
44298
|
+
this.dictation = new Dictation({
|
|
44299
|
+
editor: this.options.editor,
|
|
44300
|
+
trans: this.trans,
|
|
44301
|
+
onStateChange: (isActive2) => {
|
|
44302
|
+
const btn = this.buttonElements.get("dictate");
|
|
44303
|
+
if (btn) {
|
|
44304
|
+
btn.classList.toggle("md-toolbar-btn-active", isActive2);
|
|
44305
|
+
btn.classList.toggle("md-toolbar-btn-dictating", isActive2);
|
|
44306
|
+
}
|
|
44307
|
+
}
|
|
44308
|
+
});
|
|
44309
|
+
}
|
|
44310
|
+
this.dictation.toggle();
|
|
44311
|
+
}
|
|
43681
44312
|
openSourceCode() {
|
|
43682
44313
|
if (!this.sourceEditor) {
|
|
43683
44314
|
this.sourceEditor = new SourceEditor({
|
|
@@ -43726,6 +44357,10 @@ class Toolbar {
|
|
|
43726
44357
|
this.imageUpload = null;
|
|
43727
44358
|
this.searchReplace?.destroy();
|
|
43728
44359
|
this.searchReplace = null;
|
|
44360
|
+
this.speechToText?.destroy();
|
|
44361
|
+
this.speechToText = null;
|
|
44362
|
+
this.dictation?.destroy();
|
|
44363
|
+
this.dictation = null;
|
|
43729
44364
|
this.buttonElements.clear();
|
|
43730
44365
|
this.dropdowns.clear();
|
|
43731
44366
|
this.removeBodyMenus();
|
|
@@ -43748,6 +44383,8 @@ class Toolbar {
|
|
|
43748
44383
|
this.emojiPicker?.destroy();
|
|
43749
44384
|
this.imageUpload?.destroy();
|
|
43750
44385
|
this.searchReplace?.destroy();
|
|
44386
|
+
this.speechToText?.destroy();
|
|
44387
|
+
this.dictation?.destroy();
|
|
43751
44388
|
this.buttonElements.clear();
|
|
43752
44389
|
this.dropdowns.clear();
|
|
43753
44390
|
this.removeBodyMenus();
|
|
@@ -43797,6 +44434,8 @@ const DEFAULT_ICONS = {
|
|
|
43797
44434
|
ltr: "⇐",
|
|
43798
44435
|
rtl: "⇒",
|
|
43799
44436
|
searchreplace: "🔍",
|
|
44437
|
+
speechtotext: "🎤",
|
|
44438
|
+
dictate: "🎙️",
|
|
43800
44439
|
togglemore: "…"
|
|
43801
44440
|
};
|
|
43802
44441
|
const CONFAB_ICONS = {
|
|
@@ -43830,6 +44469,8 @@ const CONFAB_ICONS = {
|
|
|
43830
44469
|
ltr: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="18" y1="5" x2="18" y2="19"/><path d="M8 5a4 4 0 0 0 0 8h4"/><polyline points="4 17 8 21 12 17"/></svg>',
|
|
43831
44470
|
rtl: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="6" y1="5" x2="6" y2="19"/><path d="M16 5a4 4 0 0 1 0 8h-4"/><polyline points="20 17 16 21 12 17"/></svg>',
|
|
43832
44471
|
searchreplace: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.6" y2="16.6"/></svg>',
|
|
44472
|
+
speechtotext: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>',
|
|
44473
|
+
dictate: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><circle cx="12" cy="12" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="8" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="16" r="0.5" fill="currentColor" stroke="none"/></svg>',
|
|
43833
44474
|
togglemore: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="5" cy="12" r="1" fill="currentColor"/><circle cx="19" cy="12" r="1" fill="currentColor"/></svg>'
|
|
43834
44475
|
};
|
|
43835
44476
|
const FontSize = Extension.create({
|
|
@@ -44479,7 +45120,20 @@ const en = {
|
|
|
44479
45120
|
"Title": "Title",
|
|
44480
45121
|
"Open link in...": "Open link in...",
|
|
44481
45122
|
"Current window": "Current window",
|
|
44482
|
-
"New window": "New window"
|
|
45123
|
+
"New window": "New window",
|
|
45124
|
+
"Speech to Text": "Speech to Text",
|
|
45125
|
+
"Dictate": "Dictate",
|
|
45126
|
+
"Start": "Start",
|
|
45127
|
+
"Stop": "Stop",
|
|
45128
|
+
"Clear": "Clear",
|
|
45129
|
+
"Language": "Language",
|
|
45130
|
+
"Confidence": "Confidence",
|
|
45131
|
+
"Listening...": "Listening...",
|
|
45132
|
+
"Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
|
|
45133
|
+
"No speech detected": "No speech detected",
|
|
45134
|
+
"Microphone access denied": "Microphone access denied",
|
|
45135
|
+
"No microphone found": "No microphone found",
|
|
45136
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44483
45137
|
};
|
|
44484
45138
|
const ar = {
|
|
44485
45139
|
"Bold": "غامق",
|
|
@@ -44537,7 +45191,7 @@ const ar = {
|
|
|
44537
45191
|
"Browse...": "استعراض...",
|
|
44538
45192
|
"Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
|
|
44539
45193
|
"Alt text": "نص بديل",
|
|
44540
|
-
"Insert": "
|
|
45194
|
+
"Insert": "?????",
|
|
44541
45195
|
"Cancel": "إلغاء",
|
|
44542
45196
|
"Uploading...": "جارٍ الرفع...",
|
|
44543
45197
|
"Upload failed": "فشل الرفع",
|
|
@@ -44551,7 +45205,20 @@ const ar = {
|
|
|
44551
45205
|
"Title": "Title",
|
|
44552
45206
|
"Open link in...": "Open link in...",
|
|
44553
45207
|
"Current window": "Current window",
|
|
44554
|
-
"New window": "New window"
|
|
45208
|
+
"New window": "New window",
|
|
45209
|
+
"Speech to Text": "????? ?????? ??? ??",
|
|
45210
|
+
"Dictate": "إملاء",
|
|
45211
|
+
"Start": "???",
|
|
45212
|
+
"Stop": "?????",
|
|
45213
|
+
"Clear": "???",
|
|
45214
|
+
"Language": "?????",
|
|
45215
|
+
"Confidence": "?????",
|
|
45216
|
+
"Listening...": "???? ????????...",
|
|
45217
|
+
"Speech to text is not supported in this browser": "????? ?????? ??? ?? ??? ????? ?? ??? ???????",
|
|
45218
|
+
"No speech detected": "?? ??? ?????? ????",
|
|
45219
|
+
"Microphone access denied": "?? ??? ?????? ??? ??????????",
|
|
45220
|
+
"No microphone found": "No microphone found",
|
|
45221
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44555
45222
|
};
|
|
44556
45223
|
const ca = {
|
|
44557
45224
|
"Bold": "Negreta",
|
|
@@ -44623,7 +45290,20 @@ const ca = {
|
|
|
44623
45290
|
"Title": "Title",
|
|
44624
45291
|
"Open link in...": "Open link in...",
|
|
44625
45292
|
"Current window": "Current window",
|
|
44626
|
-
"New window": "New window"
|
|
45293
|
+
"New window": "New window",
|
|
45294
|
+
"Speech to Text": "Veu a text",
|
|
45295
|
+
"Dictate": "Dictar",
|
|
45296
|
+
"Start": "Iniciar",
|
|
45297
|
+
"Stop": "Aturar",
|
|
45298
|
+
"Clear": "Esborrar",
|
|
45299
|
+
"Language": "Idioma",
|
|
45300
|
+
"Confidence": "Confian�a",
|
|
45301
|
+
"Listening...": "Escoltant...",
|
|
45302
|
+
"Speech to text is not supported in this browser": "La veu a text no �s compatible amb aquest navegador",
|
|
45303
|
+
"No speech detected": "No s'ha detectat veu",
|
|
45304
|
+
"Microphone access denied": "Acc�s al micr�fon denegat",
|
|
45305
|
+
"No microphone found": "No microphone found",
|
|
45306
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44627
45307
|
};
|
|
44628
45308
|
const zh = {
|
|
44629
45309
|
"Bold": "粗体",
|
|
@@ -44681,7 +45361,7 @@ const zh = {
|
|
|
44681
45361
|
"Browse...": "浏览...",
|
|
44682
45362
|
"Drop image here or click to browse": "将图片拖放到此处或点击浏览",
|
|
44683
45363
|
"Alt text": "替代文本",
|
|
44684
|
-
"Insert": "
|
|
45364
|
+
"Insert": "??",
|
|
44685
45365
|
"Cancel": "取消",
|
|
44686
45366
|
"Uploading...": "上传中...",
|
|
44687
45367
|
"Upload failed": "上传失败",
|
|
@@ -44695,7 +45375,20 @@ const zh = {
|
|
|
44695
45375
|
"Title": "Title",
|
|
44696
45376
|
"Open link in...": "Open link in...",
|
|
44697
45377
|
"Current window": "Current window",
|
|
44698
|
-
"New window": "New window"
|
|
45378
|
+
"New window": "New window",
|
|
45379
|
+
"Speech to Text": "?????",
|
|
45380
|
+
"Dictate": "听写",
|
|
45381
|
+
"Start": "??",
|
|
45382
|
+
"Stop": "??",
|
|
45383
|
+
"Clear": "??",
|
|
45384
|
+
"Language": "??",
|
|
45385
|
+
"Confidence": "???",
|
|
45386
|
+
"Listening...": "????...",
|
|
45387
|
+
"Speech to text is not supported in this browser": "????????????",
|
|
45388
|
+
"No speech detected": "??????",
|
|
45389
|
+
"Microphone access denied": "????????",
|
|
45390
|
+
"No microphone found": "No microphone found",
|
|
45391
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44699
45392
|
};
|
|
44700
45393
|
const cs = {
|
|
44701
45394
|
"Bold": "Tučné",
|
|
@@ -44753,7 +45446,7 @@ const cs = {
|
|
|
44753
45446
|
"Browse...": "Procházet...",
|
|
44754
45447
|
"Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
|
|
44755
45448
|
"Alt text": "Alternativní text",
|
|
44756
|
-
"Insert": "
|
|
45449
|
+
"Insert": "Vlo�it",
|
|
44757
45450
|
"Cancel": "Zrušit",
|
|
44758
45451
|
"Uploading...": "Nahrávání...",
|
|
44759
45452
|
"Upload failed": "Nahrávání selhalo",
|
|
@@ -44767,7 +45460,20 @@ const cs = {
|
|
|
44767
45460
|
"Title": "Title",
|
|
44768
45461
|
"Open link in...": "Open link in...",
|
|
44769
45462
|
"Current window": "Current window",
|
|
44770
|
-
"New window": "New window"
|
|
45463
|
+
"New window": "New window",
|
|
45464
|
+
"Speech to Text": "Rec na text",
|
|
45465
|
+
"Dictate": "Diktovat",
|
|
45466
|
+
"Start": "Spustit",
|
|
45467
|
+
"Stop": "Zastavit",
|
|
45468
|
+
"Clear": "Vymazat",
|
|
45469
|
+
"Language": "Jazyk",
|
|
45470
|
+
"Confidence": "Spolehlivost",
|
|
45471
|
+
"Listening...": "Poslouch�m...",
|
|
45472
|
+
"Speech to text is not supported in this browser": "Rec na text nen� v tomto prohl�eci podporov�na",
|
|
45473
|
+
"No speech detected": "Nebyla detekov�na rec",
|
|
45474
|
+
"Microphone access denied": "Pr�stup k mikrofonu zam�tnut",
|
|
45475
|
+
"No microphone found": "No microphone found",
|
|
45476
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44771
45477
|
};
|
|
44772
45478
|
const da = {
|
|
44773
45479
|
"Bold": "Fed",
|
|
@@ -44825,7 +45531,7 @@ const da = {
|
|
|
44825
45531
|
"Browse...": "Gennemse...",
|
|
44826
45532
|
"Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
|
|
44827
45533
|
"Alt text": "Alternativ tekst",
|
|
44828
|
-
"Insert": "
|
|
45534
|
+
"Insert": "Inds�t",
|
|
44829
45535
|
"Cancel": "Annuller",
|
|
44830
45536
|
"Uploading...": "Uploader...",
|
|
44831
45537
|
"Upload failed": "Upload mislykkedes",
|
|
@@ -44839,7 +45545,20 @@ const da = {
|
|
|
44839
45545
|
"Title": "Title",
|
|
44840
45546
|
"Open link in...": "Open link in...",
|
|
44841
45547
|
"Current window": "Current window",
|
|
44842
|
-
"New window": "New window"
|
|
45548
|
+
"New window": "New window",
|
|
45549
|
+
"Speech to Text": "Tale til tekst",
|
|
45550
|
+
"Dictate": "Dikter",
|
|
45551
|
+
"Start": "Start",
|
|
45552
|
+
"Stop": "Stop",
|
|
45553
|
+
"Clear": "Ryd",
|
|
45554
|
+
"Language": "Sprog",
|
|
45555
|
+
"Confidence": "Tillid",
|
|
45556
|
+
"Listening...": "Lytter...",
|
|
45557
|
+
"Speech to text is not supported in this browser": "Tale til tekst underst�ttes ikke i denne browser",
|
|
45558
|
+
"No speech detected": "Ingen tale registreret",
|
|
45559
|
+
"Microphone access denied": "Mikrofonadgang n�gtet",
|
|
45560
|
+
"No microphone found": "No microphone found",
|
|
45561
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44843
45562
|
};
|
|
44844
45563
|
const enGb = {
|
|
44845
45564
|
"Bold": "Bold",
|
|
@@ -44911,7 +45630,20 @@ const enGb = {
|
|
|
44911
45630
|
"Title": "Title",
|
|
44912
45631
|
"Open link in...": "Open link in...",
|
|
44913
45632
|
"Current window": "Current window",
|
|
44914
|
-
"New window": "New window"
|
|
45633
|
+
"New window": "New window",
|
|
45634
|
+
"Speech to Text": "Speech to Text",
|
|
45635
|
+
"Dictate": "Dictate",
|
|
45636
|
+
"Start": "Start",
|
|
45637
|
+
"Stop": "Stop",
|
|
45638
|
+
"Clear": "Clear",
|
|
45639
|
+
"Language": "Language",
|
|
45640
|
+
"Confidence": "Confidence",
|
|
45641
|
+
"Listening...": "Listening...",
|
|
45642
|
+
"Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
|
|
45643
|
+
"No speech detected": "No speech detected",
|
|
45644
|
+
"Microphone access denied": "Microphone access denied",
|
|
45645
|
+
"No microphone found": "No microphone found",
|
|
45646
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44915
45647
|
};
|
|
44916
45648
|
const fi = {
|
|
44917
45649
|
"Bold": "Lihavoitu",
|
|
@@ -44969,7 +45701,7 @@ const fi = {
|
|
|
44969
45701
|
"Browse...": "Selaa...",
|
|
44970
45702
|
"Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
|
|
44971
45703
|
"Alt text": "Vaihtoehtoinen teksti",
|
|
44972
|
-
"Insert": "
|
|
45704
|
+
"Insert": "Lis��",
|
|
44973
45705
|
"Cancel": "Peruuta",
|
|
44974
45706
|
"Uploading...": "Ladataan...",
|
|
44975
45707
|
"Upload failed": "Lataus epäonnistui",
|
|
@@ -44983,7 +45715,20 @@ const fi = {
|
|
|
44983
45715
|
"Title": "Title",
|
|
44984
45716
|
"Open link in...": "Open link in...",
|
|
44985
45717
|
"Current window": "Current window",
|
|
44986
|
-
"New window": "New window"
|
|
45718
|
+
"New window": "New window",
|
|
45719
|
+
"Speech to Text": "Puhe tekstiksi",
|
|
45720
|
+
"Dictate": "Sanele",
|
|
45721
|
+
"Start": "Aloita",
|
|
45722
|
+
"Stop": "Lopeta",
|
|
45723
|
+
"Clear": "Tyhjenn�",
|
|
45724
|
+
"Language": "Kieli",
|
|
45725
|
+
"Confidence": "Luotettavuus",
|
|
45726
|
+
"Listening...": "Kuuntelee...",
|
|
45727
|
+
"Speech to text is not supported in this browser": "Puhe tekstiksi ei ole tuettu t�ss� selaimessa",
|
|
45728
|
+
"No speech detected": "Puhetta ei havaittu",
|
|
45729
|
+
"Microphone access denied": "Mikrofonin k�ytt� estetty",
|
|
45730
|
+
"No microphone found": "No microphone found",
|
|
45731
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
44987
45732
|
};
|
|
44988
45733
|
const fr = {
|
|
44989
45734
|
"Bold": "Gras",
|
|
@@ -45041,7 +45786,7 @@ const fr = {
|
|
|
45041
45786
|
"Browse...": "Parcourir...",
|
|
45042
45787
|
"Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
|
|
45043
45788
|
"Alt text": "Texte alternatif",
|
|
45044
|
-
"Insert": "
|
|
45789
|
+
"Insert": "Ins�rer",
|
|
45045
45790
|
"Cancel": "Annuler",
|
|
45046
45791
|
"Uploading...": "Téléchargement...",
|
|
45047
45792
|
"Upload failed": "Échec du téléchargement",
|
|
@@ -45055,7 +45800,20 @@ const fr = {
|
|
|
45055
45800
|
"Title": "Title",
|
|
45056
45801
|
"Open link in...": "Open link in...",
|
|
45057
45802
|
"Current window": "Current window",
|
|
45058
|
-
"New window": "New window"
|
|
45803
|
+
"New window": "New window",
|
|
45804
|
+
"Speech to Text": "Reconnaissance vocale",
|
|
45805
|
+
"Dictate": "Dicter",
|
|
45806
|
+
"Start": "D�marrer",
|
|
45807
|
+
"Stop": "Arr�ter",
|
|
45808
|
+
"Clear": "Effacer",
|
|
45809
|
+
"Language": "Langue",
|
|
45810
|
+
"Confidence": "Confiance",
|
|
45811
|
+
"Listening...": "�coute en cours...",
|
|
45812
|
+
"Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
|
|
45813
|
+
"No speech detected": "Aucune parole d�tect�e",
|
|
45814
|
+
"Microphone access denied": "Acc�s au microphone refus�",
|
|
45815
|
+
"No microphone found": "No microphone found",
|
|
45816
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45059
45817
|
};
|
|
45060
45818
|
const frCa = {
|
|
45061
45819
|
"Bold": "Gras",
|
|
@@ -45113,7 +45871,7 @@ const frCa = {
|
|
|
45113
45871
|
"Browse...": "Parcourir...",
|
|
45114
45872
|
"Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
|
|
45115
45873
|
"Alt text": "Texte alternatif",
|
|
45116
|
-
"Insert": "
|
|
45874
|
+
"Insert": "Ins�rer",
|
|
45117
45875
|
"Cancel": "Annuler",
|
|
45118
45876
|
"Uploading...": "Téléversement...",
|
|
45119
45877
|
"Upload failed": "Échec du téléversement",
|
|
@@ -45127,7 +45885,20 @@ const frCa = {
|
|
|
45127
45885
|
"Title": "Title",
|
|
45128
45886
|
"Open link in...": "Open link in...",
|
|
45129
45887
|
"Current window": "Current window",
|
|
45130
|
-
"New window": "New window"
|
|
45888
|
+
"New window": "New window",
|
|
45889
|
+
"Speech to Text": "Reconnaissance vocale",
|
|
45890
|
+
"Dictate": "Dicter",
|
|
45891
|
+
"Start": "D�marrer",
|
|
45892
|
+
"Stop": "Arr�ter",
|
|
45893
|
+
"Clear": "Effacer",
|
|
45894
|
+
"Language": "Langue",
|
|
45895
|
+
"Confidence": "Confiance",
|
|
45896
|
+
"Listening...": "�coute en cours...",
|
|
45897
|
+
"Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
|
|
45898
|
+
"No speech detected": "Aucune parole d�tect�e",
|
|
45899
|
+
"Microphone access denied": "Acc�s au microphone refus�",
|
|
45900
|
+
"No microphone found": "No microphone found",
|
|
45901
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45131
45902
|
};
|
|
45132
45903
|
const de = {
|
|
45133
45904
|
"Bold": "Fett",
|
|
@@ -45185,7 +45956,7 @@ const de = {
|
|
|
45185
45956
|
"Browse...": "Durchsuchen...",
|
|
45186
45957
|
"Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
|
|
45187
45958
|
"Alt text": "Alternativtext",
|
|
45188
|
-
"Insert": "
|
|
45959
|
+
"Insert": "Einf�gen",
|
|
45189
45960
|
"Cancel": "Abbrechen",
|
|
45190
45961
|
"Uploading...": "Wird hochgeladen...",
|
|
45191
45962
|
"Upload failed": "Hochladen fehlgeschlagen",
|
|
@@ -45199,7 +45970,20 @@ const de = {
|
|
|
45199
45970
|
"Title": "Title",
|
|
45200
45971
|
"Open link in...": "Open link in...",
|
|
45201
45972
|
"Current window": "Current window",
|
|
45202
|
-
"New window": "New window"
|
|
45973
|
+
"New window": "New window",
|
|
45974
|
+
"Speech to Text": "Sprache zu Text",
|
|
45975
|
+
"Dictate": "Diktieren",
|
|
45976
|
+
"Start": "Starten",
|
|
45977
|
+
"Stop": "Stoppen",
|
|
45978
|
+
"Clear": "L�schen",
|
|
45979
|
+
"Language": "Sprache",
|
|
45980
|
+
"Confidence": "Zuverl�ssigkeit",
|
|
45981
|
+
"Listening...": "Zuh�ren...",
|
|
45982
|
+
"Speech to text is not supported in this browser": "Sprache-zu-Text wird in diesem Browser nicht unterst�tzt",
|
|
45983
|
+
"No speech detected": "Keine Sprache erkannt",
|
|
45984
|
+
"Microphone access denied": "Mikrofonzugriff verweigert",
|
|
45985
|
+
"No microphone found": "No microphone found",
|
|
45986
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45203
45987
|
};
|
|
45204
45988
|
const el = {
|
|
45205
45989
|
"Bold": "Έντονα",
|
|
@@ -45257,7 +46041,7 @@ const el = {
|
|
|
45257
46041
|
"Browse...": "Αναζήτηση...",
|
|
45258
46042
|
"Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
|
|
45259
46043
|
"Alt text": "Εναλλακτικό κείμενο",
|
|
45260
|
-
"Insert": "
|
|
46044
|
+
"Insert": "??sa????",
|
|
45261
46045
|
"Cancel": "Ακύρωση",
|
|
45262
46046
|
"Uploading...": "Μεταφόρτωση...",
|
|
45263
46047
|
"Upload failed": "Η μεταφόρτωση απέτυχε",
|
|
@@ -45271,7 +46055,20 @@ const el = {
|
|
|
45271
46055
|
"Title": "Title",
|
|
45272
46056
|
"Open link in...": "Open link in...",
|
|
45273
46057
|
"Current window": "Current window",
|
|
45274
|
-
"New window": "New window"
|
|
46058
|
+
"New window": "New window",
|
|
46059
|
+
"Speech to Text": "?�???a se ?e?�e??",
|
|
46060
|
+
"Dictate": "Υπαγόρευση",
|
|
46061
|
+
"Start": "??????s?",
|
|
46062
|
+
"Stop": "??a??p?",
|
|
46063
|
+
"Clear": "???a????s?",
|
|
46064
|
+
"Language": "G??ssa",
|
|
46065
|
+
"Confidence": "????p?st?a",
|
|
46066
|
+
"Listening...": "????e?...",
|
|
46067
|
+
"Speech to text is not supported in this browser": "? ?�???a se ?e?�e?? de? ?p?st????eta? se a?t?? t?? pe?????t?",
|
|
46068
|
+
"No speech detected": "?e? a????e????e ?�???a",
|
|
46069
|
+
"Microphone access denied": "? p??s�as? st? �????f??? ap????f???e",
|
|
46070
|
+
"No microphone found": "No microphone found",
|
|
46071
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45275
46072
|
};
|
|
45276
46073
|
const hu = {
|
|
45277
46074
|
"Bold": "Félkövér",
|
|
@@ -45329,7 +46126,7 @@ const hu = {
|
|
|
45329
46126
|
"Browse...": "Tallózás...",
|
|
45330
46127
|
"Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
|
|
45331
46128
|
"Alt text": "Alternatív szöveg",
|
|
45332
|
-
"Insert": "
|
|
46129
|
+
"Insert": "Besz�r�s",
|
|
45333
46130
|
"Cancel": "Mégse",
|
|
45334
46131
|
"Uploading...": "Feltöltés...",
|
|
45335
46132
|
"Upload failed": "A feltöltés sikertelen",
|
|
@@ -45343,7 +46140,20 @@ const hu = {
|
|
|
45343
46140
|
"Title": "Title",
|
|
45344
46141
|
"Open link in...": "Open link in...",
|
|
45345
46142
|
"Current window": "Current window",
|
|
45346
|
-
"New window": "New window"
|
|
46143
|
+
"New window": "New window",
|
|
46144
|
+
"Speech to Text": "Besz�d sz�vegg�",
|
|
46145
|
+
"Dictate": "Diktálás",
|
|
46146
|
+
"Start": "Ind�t�s",
|
|
46147
|
+
"Stop": "Le�ll�t�s",
|
|
46148
|
+
"Clear": "T�rl�s",
|
|
46149
|
+
"Language": "Nyelv",
|
|
46150
|
+
"Confidence": "Megb�zhat�s�g",
|
|
46151
|
+
"Listening...": "Hallgat�s...",
|
|
46152
|
+
"Speech to text is not supported in this browser": "A besz�d sz�vegg� alak�t�s nem t�mogatott ebben a b�ng�szoben",
|
|
46153
|
+
"No speech detected": "Nem �szlelheto besz�d",
|
|
46154
|
+
"Microphone access denied": "Mikrofon hozz�f�r�s megtagadva",
|
|
46155
|
+
"No microphone found": "No microphone found",
|
|
46156
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45347
46157
|
};
|
|
45348
46158
|
const id = {
|
|
45349
46159
|
"Bold": "Tebal",
|
|
@@ -45415,7 +46225,20 @@ const id = {
|
|
|
45415
46225
|
"Title": "Title",
|
|
45416
46226
|
"Open link in...": "Open link in...",
|
|
45417
46227
|
"Current window": "Current window",
|
|
45418
|
-
"New window": "New window"
|
|
46228
|
+
"New window": "New window",
|
|
46229
|
+
"Speech to Text": "Ucapan ke teks",
|
|
46230
|
+
"Dictate": "Dikte",
|
|
46231
|
+
"Start": "Mulai",
|
|
46232
|
+
"Stop": "Berhenti",
|
|
46233
|
+
"Clear": "Hapus",
|
|
46234
|
+
"Language": "Bahasa",
|
|
46235
|
+
"Confidence": "Kepercayaan",
|
|
46236
|
+
"Listening...": "Mendengarkan...",
|
|
46237
|
+
"Speech to text is not supported in this browser": "Ucapan ke teks tidak didukung di browser ini",
|
|
46238
|
+
"No speech detected": "Tidak ada ucapan terdeteksi",
|
|
46239
|
+
"Microphone access denied": "Akses mikrofon ditolak",
|
|
46240
|
+
"No microphone found": "No microphone found",
|
|
46241
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45419
46242
|
};
|
|
45420
46243
|
const it = {
|
|
45421
46244
|
"Bold": "Grassetto",
|
|
@@ -45487,7 +46310,20 @@ const it = {
|
|
|
45487
46310
|
"Title": "Title",
|
|
45488
46311
|
"Open link in...": "Open link in...",
|
|
45489
46312
|
"Current window": "Current window",
|
|
45490
|
-
"New window": "New window"
|
|
46313
|
+
"New window": "New window",
|
|
46314
|
+
"Speech to Text": "Riconoscimento vocale",
|
|
46315
|
+
"Dictate": "Dettare",
|
|
46316
|
+
"Start": "Avvia",
|
|
46317
|
+
"Stop": "Ferma",
|
|
46318
|
+
"Clear": "Cancella",
|
|
46319
|
+
"Language": "Lingua",
|
|
46320
|
+
"Confidence": "Affidabilit�",
|
|
46321
|
+
"Listening...": "Ascolto in corso...",
|
|
46322
|
+
"Speech to text is not supported in this browser": "Il riconoscimento vocale non � supportato in questo browser",
|
|
46323
|
+
"No speech detected": "Nessun discorso rilevato",
|
|
46324
|
+
"Microphone access denied": "Accesso al microfono negato",
|
|
46325
|
+
"No microphone found": "No microphone found",
|
|
46326
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45491
46327
|
};
|
|
45492
46328
|
const ja = {
|
|
45493
46329
|
"Bold": "太字",
|
|
@@ -45545,7 +46381,7 @@ const ja = {
|
|
|
45545
46381
|
"Browse...": "参照...",
|
|
45546
46382
|
"Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
|
|
45547
46383
|
"Alt text": "代替テキスト",
|
|
45548
|
-
"Insert": "
|
|
46384
|
+
"Insert": "??",
|
|
45549
46385
|
"Cancel": "キャンセル",
|
|
45550
46386
|
"Uploading...": "アップロード中...",
|
|
45551
46387
|
"Upload failed": "アップロードに失敗しました",
|
|
@@ -45559,7 +46395,20 @@ const ja = {
|
|
|
45559
46395
|
"Title": "Title",
|
|
45560
46396
|
"Open link in...": "Open link in...",
|
|
45561
46397
|
"Current window": "Current window",
|
|
45562
|
-
"New window": "New window"
|
|
46398
|
+
"New window": "New window",
|
|
46399
|
+
"Speech to Text": "????",
|
|
46400
|
+
"Dictate": "音声入力",
|
|
46401
|
+
"Start": "??",
|
|
46402
|
+
"Stop": "??",
|
|
46403
|
+
"Clear": "???",
|
|
46404
|
+
"Language": "??",
|
|
46405
|
+
"Confidence": "???",
|
|
46406
|
+
"Listening...": "?????...",
|
|
46407
|
+
"Speech to text is not supported in this browser": "????????????????????????",
|
|
46408
|
+
"No speech detected": "?????????????",
|
|
46409
|
+
"Microphone access denied": "?????????????????",
|
|
46410
|
+
"No microphone found": "No microphone found",
|
|
46411
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45563
46412
|
};
|
|
45564
46413
|
const ko = {
|
|
45565
46414
|
"Bold": "굵게",
|
|
@@ -45617,7 +46466,7 @@ const ko = {
|
|
|
45617
46466
|
"Browse...": "찾아보기...",
|
|
45618
46467
|
"Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
|
|
45619
46468
|
"Alt text": "대체 텍스트",
|
|
45620
|
-
"Insert": "
|
|
46469
|
+
"Insert": "??",
|
|
45621
46470
|
"Cancel": "취소",
|
|
45622
46471
|
"Uploading...": "업로드 중...",
|
|
45623
46472
|
"Upload failed": "업로드 실패",
|
|
@@ -45631,7 +46480,20 @@ const ko = {
|
|
|
45631
46480
|
"Title": "Title",
|
|
45632
46481
|
"Open link in...": "Open link in...",
|
|
45633
46482
|
"Current window": "Current window",
|
|
45634
|
-
"New window": "New window"
|
|
46483
|
+
"New window": "New window",
|
|
46484
|
+
"Speech to Text": "?? ??",
|
|
46485
|
+
"Dictate": "받아쓰기",
|
|
46486
|
+
"Start": "??",
|
|
46487
|
+
"Stop": "??",
|
|
46488
|
+
"Clear": "???",
|
|
46489
|
+
"Language": "??",
|
|
46490
|
+
"Confidence": "???",
|
|
46491
|
+
"Listening...": "?? ?...",
|
|
46492
|
+
"Speech to text is not supported in this browser": "? ??????? ?? ??? ???? ????",
|
|
46493
|
+
"No speech detected": "??? ???? ?????",
|
|
46494
|
+
"Microphone access denied": "??? ??? ???????",
|
|
46495
|
+
"No microphone found": "No microphone found",
|
|
46496
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45635
46497
|
};
|
|
45636
46498
|
const nl = {
|
|
45637
46499
|
"Bold": "Vet",
|
|
@@ -45703,7 +46565,20 @@ const nl = {
|
|
|
45703
46565
|
"Title": "Title",
|
|
45704
46566
|
"Open link in...": "Open link in...",
|
|
45705
46567
|
"Current window": "Current window",
|
|
45706
|
-
"New window": "New window"
|
|
46568
|
+
"New window": "New window",
|
|
46569
|
+
"Speech to Text": "Spraak naar tekst",
|
|
46570
|
+
"Dictate": "Dicteren",
|
|
46571
|
+
"Start": "Starten",
|
|
46572
|
+
"Stop": "Stoppen",
|
|
46573
|
+
"Clear": "Wissen",
|
|
46574
|
+
"Language": "Taal",
|
|
46575
|
+
"Confidence": "Betrouwbaarheid",
|
|
46576
|
+
"Listening...": "Luisteren...",
|
|
46577
|
+
"Speech to text is not supported in this browser": "Spraak naar tekst wordt niet ondersteund in deze browser",
|
|
46578
|
+
"No speech detected": "Geen spraak gedetecteerd",
|
|
46579
|
+
"Microphone access denied": "Toegang tot microfoon geweigerd",
|
|
46580
|
+
"No microphone found": "No microphone found",
|
|
46581
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45707
46582
|
};
|
|
45708
46583
|
const nb = {
|
|
45709
46584
|
"Bold": "Fet",
|
|
@@ -45775,7 +46650,20 @@ const nb = {
|
|
|
45775
46650
|
"Title": "Title",
|
|
45776
46651
|
"Open link in...": "Open link in...",
|
|
45777
46652
|
"Current window": "Current window",
|
|
45778
|
-
"New window": "New window"
|
|
46653
|
+
"New window": "New window",
|
|
46654
|
+
"Speech to Text": "Tale til tekst",
|
|
46655
|
+
"Dictate": "Dikter",
|
|
46656
|
+
"Start": "Start",
|
|
46657
|
+
"Stop": "Stopp",
|
|
46658
|
+
"Clear": "T�m",
|
|
46659
|
+
"Language": "Spr�k",
|
|
46660
|
+
"Confidence": "P�litelighet",
|
|
46661
|
+
"Listening...": "Lytter...",
|
|
46662
|
+
"Speech to text is not supported in this browser": "Tale til tekst st�ttes ikke i denne nettleseren",
|
|
46663
|
+
"No speech detected": "Ingen tale oppdaget",
|
|
46664
|
+
"Microphone access denied": "Mikrofontilgang nektet",
|
|
46665
|
+
"No microphone found": "No microphone found",
|
|
46666
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45779
46667
|
};
|
|
45780
46668
|
const pl = {
|
|
45781
46669
|
"Bold": "Pogrubienie",
|
|
@@ -45847,7 +46735,20 @@ const pl = {
|
|
|
45847
46735
|
"Title": "Title",
|
|
45848
46736
|
"Open link in...": "Open link in...",
|
|
45849
46737
|
"Current window": "Current window",
|
|
45850
|
-
"New window": "New window"
|
|
46738
|
+
"New window": "New window",
|
|
46739
|
+
"Speech to Text": "Mowa na tekst",
|
|
46740
|
+
"Dictate": "Dyktuj",
|
|
46741
|
+
"Start": "Rozpocznij",
|
|
46742
|
+
"Stop": "Zatrzymaj",
|
|
46743
|
+
"Clear": "Wyczysc",
|
|
46744
|
+
"Language": "Jezyk",
|
|
46745
|
+
"Confidence": "Pewnosc",
|
|
46746
|
+
"Listening...": "Nasluchiwanie...",
|
|
46747
|
+
"Speech to text is not supported in this browser": "Mowa na tekst nie jest obslugiwana w tej przegladarce",
|
|
46748
|
+
"No speech detected": "Nie wykryto mowy",
|
|
46749
|
+
"Microphone access denied": "Odmowa dostepu do mikrofonu",
|
|
46750
|
+
"No microphone found": "No microphone found",
|
|
46751
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45851
46752
|
};
|
|
45852
46753
|
const pt = {
|
|
45853
46754
|
"Bold": "Negrito",
|
|
@@ -45919,7 +46820,20 @@ const pt = {
|
|
|
45919
46820
|
"Title": "Title",
|
|
45920
46821
|
"Open link in...": "Open link in...",
|
|
45921
46822
|
"Current window": "Current window",
|
|
45922
|
-
"New window": "New window"
|
|
46823
|
+
"New window": "New window",
|
|
46824
|
+
"Speech to Text": "Voz para texto",
|
|
46825
|
+
"Dictate": "Ditar",
|
|
46826
|
+
"Start": "Iniciar",
|
|
46827
|
+
"Stop": "Parar",
|
|
46828
|
+
"Clear": "Limpar",
|
|
46829
|
+
"Language": "Idioma",
|
|
46830
|
+
"Confidence": "Confian�a",
|
|
46831
|
+
"Listening...": "Ouvindo...",
|
|
46832
|
+
"Speech to text is not supported in this browser": "Voz para texto n�o � suportado neste navegador",
|
|
46833
|
+
"No speech detected": "Nenhuma fala detectada",
|
|
46834
|
+
"Microphone access denied": "Acesso ao microfone negado",
|
|
46835
|
+
"No microphone found": "No microphone found",
|
|
46836
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45923
46837
|
};
|
|
45924
46838
|
const ro = {
|
|
45925
46839
|
"Bold": "Îngroșat",
|
|
@@ -45977,7 +46891,7 @@ const ro = {
|
|
|
45977
46891
|
"Browse...": "Răsfoiește...",
|
|
45978
46892
|
"Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
|
|
45979
46893
|
"Alt text": "Text alternativ",
|
|
45980
|
-
"Insert": "
|
|
46894
|
+
"Insert": "Inserare",
|
|
45981
46895
|
"Cancel": "Anulează",
|
|
45982
46896
|
"Uploading...": "Se încarcă...",
|
|
45983
46897
|
"Upload failed": "Încarcare eșuată",
|
|
@@ -45991,7 +46905,20 @@ const ro = {
|
|
|
45991
46905
|
"Title": "Title",
|
|
45992
46906
|
"Open link in...": "Open link in...",
|
|
45993
46907
|
"Current window": "Current window",
|
|
45994
|
-
"New window": "New window"
|
|
46908
|
+
"New window": "New window",
|
|
46909
|
+
"Speech to Text": "Voce �n text",
|
|
46910
|
+
"Dictate": "Dictare",
|
|
46911
|
+
"Start": "Pornire",
|
|
46912
|
+
"Stop": "Oprire",
|
|
46913
|
+
"Clear": "?tergere",
|
|
46914
|
+
"Language": "Limba",
|
|
46915
|
+
"Confidence": "�ncredere",
|
|
46916
|
+
"Listening...": "Ascultare...",
|
|
46917
|
+
"Speech to text is not supported in this browser": "Voce �n text nu este acceptata �n acest browser",
|
|
46918
|
+
"No speech detected": "Nu a fost detectata nicio voce",
|
|
46919
|
+
"Microphone access denied": "Accesul la microfon a fost refuzat",
|
|
46920
|
+
"No microphone found": "No microphone found",
|
|
46921
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
45995
46922
|
};
|
|
45996
46923
|
const ru = {
|
|
45997
46924
|
"Bold": "Полужирный",
|
|
@@ -46049,7 +46976,7 @@ const ru = {
|
|
|
46049
46976
|
"Browse...": "Обзор...",
|
|
46050
46977
|
"Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
|
|
46051
46978
|
"Alt text": "Альтернативный текст",
|
|
46052
|
-
"Insert": "
|
|
46979
|
+
"Insert": "????????",
|
|
46053
46980
|
"Cancel": "Отмена",
|
|
46054
46981
|
"Uploading...": "Загрузка...",
|
|
46055
46982
|
"Upload failed": "Ошибка загрузки",
|
|
@@ -46063,7 +46990,20 @@ const ru = {
|
|
|
46063
46990
|
"Title": "Title",
|
|
46064
46991
|
"Open link in...": "Open link in...",
|
|
46065
46992
|
"Current window": "Current window",
|
|
46066
|
-
"New window": "New window"
|
|
46993
|
+
"New window": "New window",
|
|
46994
|
+
"Speech to Text": "????? ? ?????",
|
|
46995
|
+
"Dictate": "Диктовать",
|
|
46996
|
+
"Start": "??????",
|
|
46997
|
+
"Stop": "??????????",
|
|
46998
|
+
"Clear": "????????",
|
|
46999
|
+
"Language": "????",
|
|
47000
|
+
"Confidence": "????????",
|
|
47001
|
+
"Listening...": "??????...",
|
|
47002
|
+
"Speech to text is not supported in this browser": "????????? ???? ?? ?????????????? ? ???? ????????",
|
|
47003
|
+
"No speech detected": "???? ?? ??????????",
|
|
47004
|
+
"Microphone access denied": "?????? ? ????????? ????????",
|
|
47005
|
+
"No microphone found": "No microphone found",
|
|
47006
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46067
47007
|
};
|
|
46068
47008
|
const sr = {
|
|
46069
47009
|
"Bold": "Подебљано",
|
|
@@ -46121,7 +47061,7 @@ const sr = {
|
|
|
46121
47061
|
"Browse...": "Претражи...",
|
|
46122
47062
|
"Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
|
|
46123
47063
|
"Alt text": "Алтернативни текст",
|
|
46124
|
-
"Insert": "
|
|
47064
|
+
"Insert": "?????",
|
|
46125
47065
|
"Cancel": "Откажи",
|
|
46126
47066
|
"Uploading...": "Отпремање...",
|
|
46127
47067
|
"Upload failed": "Отпремање није успело",
|
|
@@ -46135,7 +47075,20 @@ const sr = {
|
|
|
46135
47075
|
"Title": "Title",
|
|
46136
47076
|
"Open link in...": "Open link in...",
|
|
46137
47077
|
"Current window": "Current window",
|
|
46138
|
-
"New window": "New window"
|
|
47078
|
+
"New window": "New window",
|
|
47079
|
+
"Speech to Text": "????? ? ?????",
|
|
47080
|
+
"Dictate": "Диктирање",
|
|
47081
|
+
"Start": "???????",
|
|
47082
|
+
"Stop": "????????",
|
|
47083
|
+
"Clear": "??????",
|
|
47084
|
+
"Language": "?????",
|
|
47085
|
+
"Confidence": "??????????",
|
|
47086
|
+
"Listening...": "??????...",
|
|
47087
|
+
"Speech to text is not supported in this browser": "????? ? ????? ???? ??????? ? ???? ??????????",
|
|
47088
|
+
"No speech detected": "????? ???? ????????",
|
|
47089
|
+
"Microphone access denied": "??????? ????????? ???????",
|
|
47090
|
+
"No microphone found": "No microphone found",
|
|
47091
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46139
47092
|
};
|
|
46140
47093
|
const sl = {
|
|
46141
47094
|
"Bold": "Krepko",
|
|
@@ -46207,7 +47160,20 @@ const sl = {
|
|
|
46207
47160
|
"Title": "Title",
|
|
46208
47161
|
"Open link in...": "Open link in...",
|
|
46209
47162
|
"Current window": "Current window",
|
|
46210
|
-
"New window": "New window"
|
|
47163
|
+
"New window": "New window",
|
|
47164
|
+
"Speech to Text": "Govor v besedilo",
|
|
47165
|
+
"Dictate": "Narekovanje",
|
|
47166
|
+
"Start": "Zacni",
|
|
47167
|
+
"Stop": "Ustavi",
|
|
47168
|
+
"Clear": "Pocisti",
|
|
47169
|
+
"Language": "Jezik",
|
|
47170
|
+
"Confidence": "Zaupanje",
|
|
47171
|
+
"Listening...": "Poslu�am...",
|
|
47172
|
+
"Speech to text is not supported in this browser": "Govor v besedilo ni podprt v tem brskalniku",
|
|
47173
|
+
"No speech detected": "Govor ni bil zaznan",
|
|
47174
|
+
"Microphone access denied": "Dostop do mikrofona zavrnjen",
|
|
47175
|
+
"No microphone found": "No microphone found",
|
|
47176
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46211
47177
|
};
|
|
46212
47178
|
const es = {
|
|
46213
47179
|
"Bold": "Negrita",
|
|
@@ -46279,7 +47245,20 @@ const es = {
|
|
|
46279
47245
|
"Title": "Title",
|
|
46280
47246
|
"Open link in...": "Open link in...",
|
|
46281
47247
|
"Current window": "Current window",
|
|
46282
|
-
"New window": "New window"
|
|
47248
|
+
"New window": "New window",
|
|
47249
|
+
"Speech to Text": "Voz a texto",
|
|
47250
|
+
"Dictate": "Dictar",
|
|
47251
|
+
"Start": "Iniciar",
|
|
47252
|
+
"Stop": "Detener",
|
|
47253
|
+
"Clear": "Borrar",
|
|
47254
|
+
"Language": "Idioma",
|
|
47255
|
+
"Confidence": "Confianza",
|
|
47256
|
+
"Listening...": "Escuchando...",
|
|
47257
|
+
"Speech to text is not supported in this browser": "La voz a texto no es compatible con este navegador",
|
|
47258
|
+
"No speech detected": "No se detect� voz",
|
|
47259
|
+
"Microphone access denied": "Acceso al micr�fono denegado",
|
|
47260
|
+
"No microphone found": "No microphone found",
|
|
47261
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46283
47262
|
};
|
|
46284
47263
|
const sv = {
|
|
46285
47264
|
"Bold": "Fet",
|
|
@@ -46351,7 +47330,20 @@ const sv = {
|
|
|
46351
47330
|
"Title": "Title",
|
|
46352
47331
|
"Open link in...": "Open link in...",
|
|
46353
47332
|
"Current window": "Current window",
|
|
46354
|
-
"New window": "New window"
|
|
47333
|
+
"New window": "New window",
|
|
47334
|
+
"Speech to Text": "Tal till text",
|
|
47335
|
+
"Dictate": "Diktera",
|
|
47336
|
+
"Start": "Starta",
|
|
47337
|
+
"Stop": "Stoppa",
|
|
47338
|
+
"Clear": "Rensa",
|
|
47339
|
+
"Language": "Spr�k",
|
|
47340
|
+
"Confidence": "Tillf�rlitlighet",
|
|
47341
|
+
"Listening...": "Lyssnar...",
|
|
47342
|
+
"Speech to text is not supported in this browser": "Tal till text st�ds inte i denna webbl�sare",
|
|
47343
|
+
"No speech detected": "Inget tal detekterat",
|
|
47344
|
+
"Microphone access denied": "Mikrofon�tkomst nekad",
|
|
47345
|
+
"No microphone found": "No microphone found",
|
|
47346
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46355
47347
|
};
|
|
46356
47348
|
const zhTw = {
|
|
46357
47349
|
"Bold": "粗體",
|
|
@@ -46409,7 +47401,7 @@ const zhTw = {
|
|
|
46409
47401
|
"Browse...": "瀏覽...",
|
|
46410
47402
|
"Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
|
|
46411
47403
|
"Alt text": "替代文字",
|
|
46412
|
-
"Insert": "
|
|
47404
|
+
"Insert": "??",
|
|
46413
47405
|
"Cancel": "取消",
|
|
46414
47406
|
"Uploading...": "上傳中...",
|
|
46415
47407
|
"Upload failed": "上傳失敗",
|
|
@@ -46423,7 +47415,20 @@ const zhTw = {
|
|
|
46423
47415
|
"Title": "Title",
|
|
46424
47416
|
"Open link in...": "Open link in...",
|
|
46425
47417
|
"Current window": "Current window",
|
|
46426
|
-
"New window": "New window"
|
|
47418
|
+
"New window": "New window",
|
|
47419
|
+
"Speech to Text": "?????",
|
|
47420
|
+
"Dictate": "聽寫",
|
|
47421
|
+
"Start": "??",
|
|
47422
|
+
"Stop": "??",
|
|
47423
|
+
"Clear": "??",
|
|
47424
|
+
"Language": "??",
|
|
47425
|
+
"Confidence": "???",
|
|
47426
|
+
"Listening...": "????...",
|
|
47427
|
+
"Speech to text is not supported in this browser": "????????????",
|
|
47428
|
+
"No speech detected": "??????",
|
|
47429
|
+
"Microphone access denied": "????????",
|
|
47430
|
+
"No microphone found": "No microphone found",
|
|
47431
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46427
47432
|
};
|
|
46428
47433
|
const th = {
|
|
46429
47434
|
"Bold": "ตัวหนา",
|
|
@@ -46481,7 +47486,7 @@ const th = {
|
|
|
46481
47486
|
"Browse...": "เรียกดู...",
|
|
46482
47487
|
"Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
|
|
46483
47488
|
"Alt text": "ข้อความทดแทน",
|
|
46484
|
-
"Insert": "
|
|
47489
|
+
"Insert": "????",
|
|
46485
47490
|
"Cancel": "ยกเลิก",
|
|
46486
47491
|
"Uploading...": "กำลังอัปโหลด...",
|
|
46487
47492
|
"Upload failed": "อัปโหลดล้มเหลว",
|
|
@@ -46495,7 +47500,20 @@ const th = {
|
|
|
46495
47500
|
"Title": "Title",
|
|
46496
47501
|
"Open link in...": "Open link in...",
|
|
46497
47502
|
"Current window": "Current window",
|
|
46498
|
-
"New window": "New window"
|
|
47503
|
+
"New window": "New window",
|
|
47504
|
+
"Speech to Text": "????????????????",
|
|
47505
|
+
"Dictate": "เขียนตามคำบอก",
|
|
47506
|
+
"Start": "?????",
|
|
47507
|
+
"Stop": "????",
|
|
47508
|
+
"Clear": "????",
|
|
47509
|
+
"Language": "????",
|
|
47510
|
+
"Confidence": "?????????????",
|
|
47511
|
+
"Listening...": "????????...",
|
|
47512
|
+
"Speech to text is not supported in this browser": "?????????????????????????????????????????",
|
|
47513
|
+
"No speech detected": "?????????????",
|
|
47514
|
+
"Microphone access denied": "???????????????????????????",
|
|
47515
|
+
"No microphone found": "No microphone found",
|
|
47516
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46499
47517
|
};
|
|
46500
47518
|
const tr = {
|
|
46501
47519
|
"Bold": "Kalın",
|
|
@@ -46567,7 +47585,20 @@ const tr = {
|
|
|
46567
47585
|
"Title": "Title",
|
|
46568
47586
|
"Open link in...": "Open link in...",
|
|
46569
47587
|
"Current window": "Current window",
|
|
46570
|
-
"New window": "New window"
|
|
47588
|
+
"New window": "New window",
|
|
47589
|
+
"Speech to Text": "Konusmayi metne �evir",
|
|
47590
|
+
"Dictate": "Dikte et",
|
|
47591
|
+
"Start": "Baslat",
|
|
47592
|
+
"Stop": "Durdur",
|
|
47593
|
+
"Clear": "Temizle",
|
|
47594
|
+
"Language": "Dil",
|
|
47595
|
+
"Confidence": "G�venilirlik",
|
|
47596
|
+
"Listening...": "Dinliyor...",
|
|
47597
|
+
"Speech to text is not supported in this browser": "Bu tarayicida konusmayi metne �evirme desteklenmiyor",
|
|
47598
|
+
"No speech detected": "Konusma algilanmadi",
|
|
47599
|
+
"Microphone access denied": "Mikrofon erisimi reddedildi",
|
|
47600
|
+
"No microphone found": "No microphone found",
|
|
47601
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46571
47602
|
};
|
|
46572
47603
|
const vi = {
|
|
46573
47604
|
"Bold": "In đậm",
|
|
@@ -46625,7 +47656,7 @@ const vi = {
|
|
|
46625
47656
|
"Browse...": "Duyệt...",
|
|
46626
47657
|
"Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
|
|
46627
47658
|
"Alt text": "Văn bản thay thế",
|
|
46628
|
-
"Insert": "
|
|
47659
|
+
"Insert": "Ch�n",
|
|
46629
47660
|
"Cancel": "Hủy",
|
|
46630
47661
|
"Uploading...": "Đang tải lên...",
|
|
46631
47662
|
"Upload failed": "Tải lên thất bại",
|
|
@@ -46639,7 +47670,20 @@ const vi = {
|
|
|
46639
47670
|
"Title": "Title",
|
|
46640
47671
|
"Open link in...": "Open link in...",
|
|
46641
47672
|
"Current window": "Current window",
|
|
46642
|
-
"New window": "New window"
|
|
47673
|
+
"New window": "New window",
|
|
47674
|
+
"Speech to Text": "Gi?ng n�i th�nh van b?n",
|
|
47675
|
+
"Dictate": "Đọc chính tả",
|
|
47676
|
+
"Start": "B?t d?u",
|
|
47677
|
+
"Stop": "D?ng",
|
|
47678
|
+
"Clear": "X�a",
|
|
47679
|
+
"Language": "Ng�n ng?",
|
|
47680
|
+
"Confidence": "�? tin c?y",
|
|
47681
|
+
"Listening...": "�ang nghe...",
|
|
47682
|
+
"Speech to text is not supported in this browser": "Gi?ng n�i th�nh van b?n kh�ng du?c h? tr? trong tr�nh duy?t n�y",
|
|
47683
|
+
"No speech detected": "Kh�ng ph�t hi?n gi?ng n�i",
|
|
47684
|
+
"Microphone access denied": "Quy?n truy c?p micr� b? t? ch?i",
|
|
47685
|
+
"No microphone found": "No microphone found",
|
|
47686
|
+
"Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
|
|
46643
47687
|
};
|
|
46644
47688
|
const locales = {
|
|
46645
47689
|
en,
|
|
@@ -46780,7 +47824,8 @@ class HTMLEditor {
|
|
|
46780
47824
|
format_empty_lines: config.format_empty_lines ?? true,
|
|
46781
47825
|
toolbar_narrow_breakpoint: config.toolbar_narrow_breakpoint,
|
|
46782
47826
|
toolbar_priority: config.toolbar_priority,
|
|
46783
|
-
paste_from_office: config.paste_from_office ?? true
|
|
47827
|
+
paste_from_office: config.paste_from_office ?? true,
|
|
47828
|
+
speech_to_text: config.speech_to_text ?? true
|
|
46784
47829
|
};
|
|
46785
47830
|
}
|
|
46786
47831
|
createEditor() {
|
|
@@ -47204,6 +48249,7 @@ export {
|
|
|
47204
48249
|
CONFAB_ICONS,
|
|
47205
48250
|
CharacterMap,
|
|
47206
48251
|
DEFAULT_ICONS,
|
|
48252
|
+
Dictation,
|
|
47207
48253
|
EMOJI_CATEGORIES,
|
|
47208
48254
|
EmojiPicker,
|
|
47209
48255
|
FontSize,
|
|
@@ -47215,6 +48261,7 @@ export {
|
|
|
47215
48261
|
SearchReplace,
|
|
47216
48262
|
SignatureBlock,
|
|
47217
48263
|
SourceEditor,
|
|
48264
|
+
SpeechToText,
|
|
47218
48265
|
TRANSLATION_KEYS,
|
|
47219
48266
|
TextDirection,
|
|
47220
48267
|
Toolbar,
|
|
@@ -47224,6 +48271,7 @@ export {
|
|
|
47224
48271
|
getGetFileSrc,
|
|
47225
48272
|
getLocale,
|
|
47226
48273
|
getTranslate,
|
|
48274
|
+
isSpeechRecognitionSupported,
|
|
47227
48275
|
resetTranslate,
|
|
47228
48276
|
setGetFileSrc,
|
|
47229
48277
|
setTranslate
|