Exclude links to embedded images from translation

ba2b251d6e109e40938c40fbcdf683a6b88619eb

Yaroslav Sivakov <yar3333@gmail.com>

1 files changed, +37 -20Ignore whitespace
public/scripts/extensions/translate/index.js+37 -20
@@ -406,33 +406,50 @@ async function translate(text, lang) {
406406 lang = extension_settings.translate.target_language;
407407 }
408408
409- switch (extension_settings.translate.provider) {
409+ // split text by embedded images links
410- case 'libre':
410+ const chunks = text.split(/!\[.*?]\([^)]*\)/);
411- return await translateProviderLibre(text, lang);
411+ const links = [ ...text.matchAll(/!\[.*?]\([^)]*\)/g) ];
412- case 'google':
412+
413- return await chunkedTranslate(text, lang, translateProviderGoogle, 5000);
413+ let r = "";
414- case 'lingva':
414+ for (let i = 0; i < chunks.length; i++) {
415- return await chunkedTranslate(text, lang, translateProviderLingva, 5000);
415+ r += await translateInner(chunks[i], lang);
416- case 'deepl':
416+ if (i < links.length) r += links[i][0];
417- return await translateProviderDeepl(text, lang);
418- case 'deeplx':
419- return await chunkedTranslate(text, lang, translateProviderDeepLX, 1500);
420- case 'oneringtranslator':
421- return await translateProviderOneRing(text, lang);
422- case 'bing':
423- return await chunkedTranslate(text, lang, translateProviderBing, 1000);
424- case 'yandex':
425- return await translateProviderYandex(text, lang);
426- default:
427- console.error('Unknown translation provider', extension_settings.translate.provider);
428- return text;
429417 }
418+
419+ return r;
430420 } catch (error) {
431421 console.log(error);
432422 toastr.error(String(error), 'Failed to translate message');
433423 }
434424}
435425
426+async function translateInner(text, lang) {
427+ if (text == '') {
428+ return '';
429+ }
430+ switch (extension_settings.translate.provider) {
431+ case 'libre':
432+ return await translateProviderLibre(text, lang);
433+ case 'google':
434+ return await chunkedTranslate(text, lang, translateProviderGoogle, 5000);
435+ case 'lingva':
436+ return await chunkedTranslate(text, lang, translateProviderLingva, 5000);
437+ case 'deepl':
438+ return await translateProviderDeepl(text, lang);
439+ case 'deeplx':
440+ return await chunkedTranslate(text, lang, translateProviderDeepLX, 1500);
441+ case 'oneringtranslator':
442+ return await translateProviderOneRing(text, lang);
443+ case 'bing':
444+ return await chunkedTranslate(text, lang, translateProviderBing, 1000);
445+ case 'yandex':
446+ return await translateProviderYandex(text, lang);
447+ default:
448+ console.error('Unknown translation provider', extension_settings.translate.provider);
449+ return text;
450+ }
451+}
452+
436453async function translateOutgoingMessage(messageId) {
437454 const context = getContext();
438455 const message = context.chat[messageId];