Add provider arg to /translate command
| @@ -15,7 +15,7 @@ | ||
| 15 | 15 | <label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label> |
| 16 | 16 | <div class="flex-container gap5px flexnowrap marginBot5"> |
| 17 | 17 | <select id="translation_provider" name="provider" class="margin0"> |
| 18 | 18 | <option value="libre">LibreLibreTranslate</option> |
| 19 | 19 | <option value="google">Google</option> |
| 20 | 20 | <option value="lingva">Lingva</option> |
| 21 | 21 | <option value="deepl">DeepL</option> |
| @@ -14,6 +14,8 @@ import { POPUP_RESULT, POPUP_TYPE, callGenericPopup } from '../../popup.js'; | ||
| 14 | 14 | import { findSecret, secret_state, writeSecret } from '../../secrets.js'; |
| 15 | 15 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 16 | 16 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; |
| 17 | +import { enumIcons } from '../../slash-commands/SlashCommandCommonEnumsProvider.js'; | |
| 18 | +import { enumTypes, SlashCommandEnumValue } from '../../slash-commands/SlashCommandEnumValue.js'; | |
| 17 | 19 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; |
| 18 | 20 | import { splitRecursive } from '../../utils.js'; |
| 19 | 21 | |
| @@ -395,9 +397,10 @@ async function chunkedTranslate(text, lang, translateFn, chunkSize = 5000) { | ||
| 395 | 397 | * Translates text using the selected translation provider |
| 396 | 398 | * @param {string} text Text to translate |
| 397 | 399 | * @param {string} lang Target language code |
| 400 | + * @param {string} provider Translation provider to use | |
| 398 | 401 | * @returns {Promise<string>} Translated text |
| 399 | 402 | */ |
| 400 | 403 | async function translate(text, lang, provider = null) { |
| 401 | 404 | try { |
| 402 | 405 | if (text == '') { |
| 403 | 406 | return ''; |
| @@ -407,13 +410,17 @@ async function translate(text, lang) { | ||
| 407 | 410 | lang = extension_settings.translate.target_language; |
| 408 | 411 | } |
| 409 | 412 | |
| 413 | + if (!provider) { | |
| 414 | + provider = extension_settings.translate.provider; | |
| 415 | + } | |
| 416 | + | |
| 410 | 417 | // split text by embedded images links |
| 411 | 418 | const chunks = text.split(/!\[.*?]\([^)]*\)/); |
| 412 | 419 | const links = [...text.matchAll(/!\[.*?]\([^)]*\)/g)]; |
| 413 | 420 | |
| 414 | 421 | let result = ''; |
| 415 | 422 | for (let i = 0; i < chunks.length; i++) { |
| 416 | 423 | result += await translateInner(chunks[i], lang, provider); |
| 417 | 424 | if (i < links.length) result += links[i][0]; |
| 418 | 425 | } |
| 419 | 426 | |
| @@ -424,11 +431,21 @@ async function translate(text, lang) { | ||
| 424 | 431 | } |
| 425 | 432 | } |
| 426 | 433 | |
| 427 | -async function translateInner(text, lang) { | |
| 434 | +/** | |
| 435 | + * Common translation function that handles the translation logic | |
| 436 | + * @param {string} text Text to translate | |
| 437 | + * @param {string} lang Target language code | |
| 438 | + * @param {string} provider Translation provider to use | |
| 439 | + * @returns {Promise<string>} Translated text | |
| 440 | + */ | |
| 441 | +async function translateInner(text, lang, provider) { | |
| 428 | 442 | if (text == '') { |
| 429 | 443 | return ''; |
| 430 | 444 | } |
| 431 | 445 | switchif (extension_settings.translate.!provider) { |
| 446 | + provider = extension_settings.translate.provider; | |
| 447 | + } | |
| 448 | + switch (provider) { | |
| 432 | 449 | case 'libre': |
| 433 | 450 | return await translateProviderLibre(text, lang); |
| 434 | 451 | case 'google': |
| @@ -446,7 +463,7 @@ async function translateInner(text, lang) { | ||
| 446 | 463 | case 'yandex': |
| 447 | 464 | return await translateProviderYandex(text, lang); |
| 448 | 465 | default: |
| 449 | 466 | console.error('Unknown translation provider', extension_settings.translate.provider); |
| 450 | 467 | return text; |
| 451 | 468 | } |
| 452 | 469 | } |
| @@ -688,6 +705,14 @@ jQuery(async () => { | ||
| 688 | 705 | helpString: 'Translate text to a target language. If target language is not provided, the value from the extension settings will be used.', |
| 689 | 706 | namedArgumentList: [ |
| 690 | 707 | new SlashCommandNamedArgument('target', 'The target language code to translate to', ARGUMENT_TYPE.STRING, false, false, '', Object.values(languageCodes)), |
| 708 | + SlashCommandNamedArgument.fromProps({ | |
| 709 | + name: 'provider', | |
| 710 | + description: 'The translation provider to use. If not provided, the value from the extension settings will be used.', | |
| 711 | + typeList: [ARGUMENT_TYPE.STRING], | |
| 712 | + isRequired: false, | |
| 713 | + acceptsMultiple: false, | |
| 714 | + enumProvider: () => Array.from(document.getElementById('translation_provider').querySelectorAll('option')).map((option) => new SlashCommandEnumValue(option.value, option.text, enumTypes.name, enumIcons.server)), | |
| 715 | + }), | |
| 691 | 716 | ], |
| 692 | 717 | unnamedArgumentList: [ |
| 693 | 718 | new SlashCommandArgument('The text to translate', ARGUMENT_TYPE.STRING, true, false, ''), |
| @@ -696,7 +721,8 @@ jQuery(async () => { | ||
| 696 | 721 | const target = args?.target && Object.values(languageCodes).includes(String(args.target)) |
| 697 | 722 | ? String(args.target) |
| 698 | 723 | : extension_settings.translate.target_language; |
| 699 | - return await translate(String(value), target); | |
| 724 | + const provider = args?.provider || extension_settings.translate.provider; | |
| 725 | + return await translate(String(value), target, provider); | |
| 700 | 726 | }, |
| 701 | 727 | returns: ARGUMENT_TYPE.STRING, |
| 702 | 728 | })); |