| 406 | 406 | lang = extension_settings.translate.target_language; |
| 407 | 407 | } |
| 408 | 408 | |
| 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; |
| 429 | 417 | } |
| 418 | + |
| 419 | + return r; |
| 430 | 420 | } catch (error) { |
| 431 | 421 | console.log(error); |
| 432 | 422 | toastr.error(String(error), 'Failed to translate message'); |
| 433 | 423 | } |
| 434 | 424 | } |
| 435 | 425 | |
| 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 | + |
| 436 | 453 | async function translateOutgoingMessage(messageId) { |
| 437 | 454 | const context = getContext(); |
| 438 | 455 | const message = context.chat[messageId]; |