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 @@
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>
public/scripts/extensions/translate/index.js+24 -4
@@ -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};
3839
39const languageCodes = {40const 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}
158160
159function loadSettings() {161function loadSettings() {
@@ -163,9 +165,10 @@ function loadSettings() {
163 }165 }
164 }166 }
165167
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}
171174
@@ -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 }
289292
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 });
295299
296 if (response.ok) {300 if (response.ok) {
@@ -618,18 +622,34 @@ jQuery(async () => {
618 }622 }
619623
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();
src/endpoints/translate.js+5 -1
@@ -264,7 +264,11 @@ router.post('/deepl', jsonParser, async (request, response) => {
264 params.append('formality', formality);264 params.append('formality', formality);
265 }265 }
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, {
268 method: 'POST',272 method: 'POST',
269 body: params,273 body: params,
270 headers: {274 headers: {