Add Deepl endpoint selection Fixes #3224

29acc2e2db8fcc3e108b0fb1b0f889bc06f9ae6d

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +35 -7Ignore whitespace
public/scripts/extensions/translate/index.html+6 -2
@@ -14,16 +14,20 @@
1414 </select>
1515 <label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label>
1616 <div class="flex-container gap5px flexnowrap marginBot5">
1717 <select id="translation_provider" name="provider" class="margin0 text_pole flex2">
1818 <option value="libre">LibreTranslate</option>
1919 <option value="google">Google</option>
2020 <option value="lingva">Lingva</option>
2121 <option value="deepl">DeepL API</option>
2222 <option value="deeplx">DeepLX</option>
2323 <option value="bing">Bing</option>
2424 <option value="oneringtranslator">OneRingTranslator</option>
2525 <option value="yandex">Yandex</option>
2626 <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>
2731 <div id="translate_key_button" class="menu_button fa-solid fa-key margin0"></div>
2832 <div id="translate_url_button" class="menu_button fa-solid fa-link margin0"></div>
2933 </div>
public/scripts/extensions/translate/index.js+24 -4
@@ -34,6 +34,7 @@ const defaultSettings = {
3434 internal_language: 'en',
3535 provider: 'google',
3636 auto_mode: autoModeOptions.NONE,
37+ deepl_endpoint: 'free',
3738};
3839
3940const languageCodes = {
@@ -154,6 +155,7 @@ function showKeysButton() {
154155 $('#translate_key_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider]));
155156 $('#translate_url_button').toggle(providerOptionalUrl);
156157 $('#translate_url_button').toggleClass('success', Boolean(secret_state[extension_settings.translate.provider + '_url']));
158+ $('#deepl_api_endpoint').toggle(extension_settings.translate.provider === 'deepl');
157159}
158160
159161function loadSettings() {
@@ -163,9 +165,10 @@ function loadSettings() {
163165 }
164166 }
165167
166168 $(`#translation_provider option[value="${extension_settings.translate.provider}"]`).attr('selected', 'true');
167169 $(`#translation_target_language option[value="${extension_settings.translate.target_language}"]`).attr('selected', 'true');
168170 $(`#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');
169172 showKeysButton();
170173}
171174
@@ -287,10 +290,11 @@ async function translateProviderDeepl(text, lang) {
287290 throw new Error('No DeepL API key');
288291 }
289292
293+ const endpoint = extension_settings.translate.deepl_endpoint || 'free';
290294 const response = await fetch('/api/translate/deepl', {
291295 method: 'POST',
292296 headers: getRequestHeaders(),
293297 body: JSON.stringify({ text: text, lang: lang, endpoint: endpoint }),
294298 });
295299
296300 if (response.ok) {
@@ -618,18 +622,34 @@ jQuery(async () => {
618622 }
619623
620624 $('#translation_auto_mode').on('change', (event) => {
625+ if (!(event.target instanceof HTMLSelectElement)) {
626+ return;
627+ }
621628 extension_settings.translate.auto_mode = event.target.value;
622629 saveSettingsDebounced();
623630 });
624631 $('#translation_provider').on('change', (event) => {
632+ if (!(event.target instanceof HTMLSelectElement)) {
633+ return;
634+ }
625635 extension_settings.translate.provider = event.target.value;
626636 showKeysButton();
627637 saveSettingsDebounced();
628638 });
629639 $('#translation_target_language').on('change', (event) => {
640+ if (!(event.target instanceof HTMLSelectElement)) {
641+ return;
642+ }
630643 extension_settings.translate.target_language = event.target.value;
631644 saveSettingsDebounced();
632645 });
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+ });
633653 $(document).on('click', '.mes_translate', onMessageTranslateClick);
634654 $('#translate_key_button').on('click', async () => {
635655 const optionText = $('#translation_provider option:selected').text();
src/endpoints/translate.js+5 -1
@@ -264,7 +264,11 @@ router.post('/deepl', jsonParser, async (request, response) => {
264264 params.append('formality', formality);
265265 }
266266
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, {
268272 method: 'POST',
269273 body: params,
270274 headers: {