Add Deepl endpoint selection Fixes #3224
| @@ -14,16 +14,20 @@ | |||
| 14 | </select> | 14 | </select> |
| 15 | <label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label> | 15 | <label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label> |
| 16 | <div class="flex-container gap5px flexnowrap marginBot5"> | 16 | <div class="flex-container gap5px flexnowrap marginBot5"> |
| 17 | <select id="translation_provider" name="provider" class="margin0"> | 17 | <select id="translation_provider" name="provider" class="margin0 text_pole flex2"> |
| 18 | <option value="libre">LibreTranslate</option> | 18 | <option value="libre">LibreTranslate</option> |
| 19 | <option value="google">Google</option> | 19 | <option value="google">Google</option> |
| 20 | <option value="lingva">Lingva</option> | 20 | <option value="lingva">Lingva</option> |
| 21 | <option value="deepl">DeepL</option> | 21 | <option value="deepl">DeepL API</option> |
| 22 | <option value="deeplx">DeepLX</option> | 22 | <option value="deeplx">DeepLX</option> |
| 23 | <option value="bing">Bing</option> | 23 | <option value="bing">Bing</option> |
| 24 | <option value="oneringtranslator">OneRingTranslator</option> | 24 | <option value="oneringtranslator">OneRingTranslator</option> |
| 25 | <option value="yandex">Yandex</option> | 25 | <option value="yandex">Yandex</option> |
| 26 | <select> | 26 | <select> |
| 27 | <select id="deepl_api_endpoint" class="margin0 text_pole flex1" title="DeepL API Endpoint"> | ||
| 28 | <option value="free">Free</option> | ||
| 29 | <option value="pro">Pro</option> | ||
| 30 | </select> | ||
| 27 | <div id="translate_key_button" class="menu_button fa-solid fa-key margin0"></div> | 31 | <div id="translate_key_button" class="menu_button fa-solid fa-key margin0"></div> |
| 28 | <div id="translate_url_button" class="menu_button fa-solid fa-link margin0"></div> | 32 | <div id="translate_url_button" class="menu_button fa-solid fa-link margin0"></div> |
| 29 | </div> | 33 | </div> |
| @@ -34,6 +34,7 @@ const defaultSettings = { | |||
| 34 | internal_language: 'en', | 34 | internal_language: 'en', |
| 35 | provider: 'google', | 35 | provider: 'google', |
| 36 | auto_mode: autoModeOptions.NONE, | 36 | auto_mode: autoModeOptions.NONE, |
| 37 | deepl_endpoint: 'free', | ||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | const languageCodes = { | 40 | const languageCodes = { |
| @@ -154,6 +155,7 @@ function showKeysButton() { | |||
| 154 | $('#translate_key_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider])); | 155 | $('#translate_key_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider])); |
| 155 | $('#translate_url_button').toggle(providerOptionalUrl); | 156 | $('#translate_url_button').toggle(providerOptionalUrl); |
| 156 | $('#translate_url_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider + '_url'])); | 157 | $('#translate_url_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider + '_url'])); |
| 158 | $('#deepl_api_endpoint').toggle(extension_settings.translate.provider === 'deepl'); | ||
| 157 | } | 159 | } |
| 158 | 160 | ||
| 159 | function loadSettings() { | 161 | function loadSettings() { |
| @@ -163,9 +165,10 @@ function loadSettings() { | |||
| 163 | } | 165 | } |
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | $(`#translation_provider option[value="${extension_settings.translate.provider}"]`).attr('selected', true); | 168 | $(`#translation_provider option[value="${extension_settings.translate.provider}"]`).attr('selected', 'true'); |
| 167 | $(`#translation_target_language option[value="${extension_settings.translate.target_language}"]`).attr('selected', true); | 169 | $(`#translation_target_language option[value="${extension_settings.translate.target_language}"]`).attr('selected', 'true'); |
| 168 | $(`#translation_auto_mode option[value="${extension_settings.translate.auto_mode}"]`).attr('selected', true); | 170 | $(`#translation_auto_mode option[value="${extension_settings.translate.auto_mode}"]`).attr('selected', 'true'); |
| 171 | $('#deepl_api_endpoint').val(extension_settings.translate.deepl_endpoint).toggle(extension_settings.translate.provider === 'deepl'); | ||
| 169 | showKeysButton(); | 172 | showKeysButton(); |
| 170 | } | 173 | } |
| 171 | 174 | ||
| @@ -287,10 +290,11 @@ async function translateProviderDeepl(text, lang) { | |||
| 287 | throw new Error('No DeepL API key'); | 290 | throw new Error('No DeepL API key'); |
| 288 | } | 291 | } |
| 289 | 292 | ||
| 293 | const endpoint = extension_settings.translate.deepl_endpoint || 'free'; | ||
| 290 | const response = await fetch('/api/translate/deepl', { | 294 | const response = await fetch('/api/translate/deepl', { |
| 291 | method: 'POST', | 295 | method: 'POST', |
| 292 | headers: getRequestHeaders(), | 296 | headers: getRequestHeaders(), |
| 293 | body: JSON.stringify({ text: text, lang: lang }), | 297 | body: JSON.stringify({ text: text, lang: lang, endpoint: endpoint }), |
| 294 | }); | 298 | }); |
| 295 | 299 | ||
| 296 | if (response.ok) { | 300 | if (response.ok) { |
| @@ -618,18 +622,34 @@ jQuery(async () => { | |||
| 618 | } | 622 | } |
| 619 | 623 | ||
| 620 | $('#translation_auto_mode').on('change', (event) => { | 624 | $('#translation_auto_mode').on('change', (event) => { |
| 625 | if (!(event.target instanceof HTMLSelectElement)) { | ||
| 626 | return; | ||
| 627 | } | ||
| 621 | extension_settings.translate.auto_mode = event.target.value; | 628 | extension_settings.translate.auto_mode = event.target.value; |
| 622 | saveSettingsDebounced(); | 629 | saveSettingsDebounced(); |
| 623 | }); | 630 | }); |
| 624 | $('#translation_provider').on('change', (event) => { | 631 | $('#translation_provider').on('change', (event) => { |
| 632 | if (!(event.target instanceof HTMLSelectElement)) { | ||
| 633 | return; | ||
| 634 | } | ||
| 625 | extension_settings.translate.provider = event.target.value; | 635 | extension_settings.translate.provider = event.target.value; |
| 626 | showKeysButton(); | 636 | showKeysButton(); |
| 627 | saveSettingsDebounced(); | 637 | saveSettingsDebounced(); |
| 628 | }); | 638 | }); |
| 629 | $('#translation_target_language').on('change', (event) => { | 639 | $('#translation_target_language').on('change', (event) => { |
| 640 | if (!(event.target instanceof HTMLSelectElement)) { | ||
| 641 | return; | ||
| 642 | } | ||
| 630 | extension_settings.translate.target_language = event.target.value; | 643 | extension_settings.translate.target_language = event.target.value; |
| 631 | saveSettingsDebounced(); | 644 | saveSettingsDebounced(); |
| 632 | }); | 645 | }); |
| 646 | $('#deepl_api_endpoint').on('change', (event) => { | ||
| 647 | if (!(event.target instanceof HTMLSelectElement)) { | ||
| 648 | return; | ||
| 649 | } | ||
| 650 | extension_settings.translate.deepl_endpoint = event.target.value; | ||
| 651 | saveSettingsDebounced(); | ||
| 652 | }); | ||
| 633 | $(document).on('click', '.mes_translate', onMessageTranslateClick); | 653 | $(document).on('click', '.mes_translate', onMessageTranslateClick); |
| 634 | $('#translate_key_button').on('click', async () => { | 654 | $('#translate_key_button').on('click', async () => { |
| 635 | const optionText = $('#translation_provider option:selected').text(); | 655 | const optionText = $('#translation_provider option:selected').text(); |
| @@ -264,7 +264,11 @@ router.post('/deepl', jsonParser, async (request, response) => { | |||
| 264 | params.append('formality', formality); | 264 | params.append('formality', formality); |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | const result = await fetch('https://api-free.deepl.com/v2/translate', { | 267 | const endpoint = request.body.endpoint === 'pro' |
| 268 | ? 'https://api.deepl.com/v2/translate' | ||
| 269 | : 'https://api-free.deepl.com/v2/translate'; | ||
| 270 | |||
| 271 | const result = await fetch(endpoint, { | ||
| 268 | method: 'POST', | 272 | method: 'POST', |
| 269 | body: params, | 273 | body: params, |
| 270 | headers: { | 274 | headers: { |