Add provider arg to /translate command

This commit is contained in:
Cohee
2024-12-25 23:31:37 +02:00
parent 0cb82b3288
commit 7f2cf6f7e6
2 changed files with 34 additions and 8 deletions

View File

@@ -15,7 +15,7 @@
<label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label> <label data-i18n="ext_translate_mode_provider" for="translation_provider">Provider</label>
<div class="flex-container gap5px flexnowrap marginBot5"> <div class="flex-container gap5px flexnowrap marginBot5">
<select id="translation_provider" name="provider" class="margin0"> <select id="translation_provider" name="provider" class="margin0">
<option value="libre">Libre</option> <option value="libre">LibreTranslate</option>
<option value="google">Google</option> <option value="google">Google</option>
<option value="lingva">Lingva</option> <option value="lingva">Lingva</option>
<option value="deepl">DeepL</option> <option value="deepl">DeepL</option>

View File

@@ -14,6 +14,8 @@ import { POPUP_RESULT, POPUP_TYPE, callGenericPopup } from '../../popup.js';
import { findSecret, secret_state, writeSecret } from '../../secrets.js'; import { findSecret, secret_state, writeSecret } from '../../secrets.js';
import { SlashCommand } from '../../slash-commands/SlashCommand.js'; import { SlashCommand } from '../../slash-commands/SlashCommand.js';
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js';
import { enumIcons } from '../../slash-commands/SlashCommandCommonEnumsProvider.js';
import { enumTypes, SlashCommandEnumValue } from '../../slash-commands/SlashCommandEnumValue.js';
import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
import { splitRecursive } from '../../utils.js'; import { splitRecursive } from '../../utils.js';
@@ -395,9 +397,10 @@ async function chunkedTranslate(text, lang, translateFn, chunkSize = 5000) {
* Translates text using the selected translation provider * Translates text using the selected translation provider
* @param {string} text Text to translate * @param {string} text Text to translate
* @param {string} lang Target language code * @param {string} lang Target language code
* @param {string} provider Translation provider to use
* @returns {Promise<string>} Translated text * @returns {Promise<string>} Translated text
*/ */
async function translate(text, lang) { async function translate(text, lang, provider = null) {
try { try {
if (text == '') { if (text == '') {
return ''; return '';
@@ -407,13 +410,17 @@ async function translate(text, lang) {
lang = extension_settings.translate.target_language; lang = extension_settings.translate.target_language;
} }
if (!provider) {
provider = extension_settings.translate.provider;
}
// split text by embedded images links // split text by embedded images links
const chunks = text.split(/!\[.*?]\([^)]*\)/); const chunks = text.split(/!\[.*?]\([^)]*\)/);
const links = [...text.matchAll(/!\[.*?]\([^)]*\)/g)]; const links = [...text.matchAll(/!\[.*?]\([^)]*\)/g)];
let result = ''; let result = '';
for (let i = 0; i < chunks.length; i++) { for (let i = 0; i < chunks.length; i++) {
result += await translateInner(chunks[i], lang); result += await translateInner(chunks[i], lang, provider);
if (i < links.length) result += links[i][0]; if (i < links.length) result += links[i][0];
} }
@@ -424,11 +431,21 @@ async function translate(text, lang) {
} }
} }
async function translateInner(text, lang) { /**
* Common translation function that handles the translation logic
* @param {string} text Text to translate
* @param {string} lang Target language code
* @param {string} provider Translation provider to use
* @returns {Promise<string>} Translated text
*/
async function translateInner(text, lang, provider) {
if (text == '') { if (text == '') {
return ''; return '';
} }
switch (extension_settings.translate.provider) { if (!provider) {
provider = extension_settings.translate.provider;
}
switch (provider) {
case 'libre': case 'libre':
return await translateProviderLibre(text, lang); return await translateProviderLibre(text, lang);
case 'google': case 'google':
@@ -446,7 +463,7 @@ async function translateInner(text, lang) {
case 'yandex': case 'yandex':
return await translateProviderYandex(text, lang); return await translateProviderYandex(text, lang);
default: default:
console.error('Unknown translation provider', extension_settings.translate.provider); console.error('Unknown translation provider', provider);
return text; return text;
} }
} }
@@ -688,6 +705,14 @@ jQuery(async () => {
helpString: 'Translate text to a target language. If target language is not provided, the value from the extension settings will be used.', helpString: 'Translate text to a target language. If target language is not provided, the value from the extension settings will be used.',
namedArgumentList: [ namedArgumentList: [
new SlashCommandNamedArgument('target', 'The target language code to translate to', ARGUMENT_TYPE.STRING, false, false, '', Object.values(languageCodes)), new SlashCommandNamedArgument('target', 'The target language code to translate to', ARGUMENT_TYPE.STRING, false, false, '', Object.values(languageCodes)),
SlashCommandNamedArgument.fromProps({
name: 'provider',
description: 'The translation provider to use. If not provided, the value from the extension settings will be used.',
typeList: [ARGUMENT_TYPE.STRING],
isRequired: false,
acceptsMultiple: false,
enumProvider: () => Array.from(document.getElementById('translation_provider').querySelectorAll('option')).map((option) => new SlashCommandEnumValue(option.value, option.text, enumTypes.name, enumIcons.server)),
}),
], ],
unnamedArgumentList: [ unnamedArgumentList: [
new SlashCommandArgument('The text to translate', ARGUMENT_TYPE.STRING, true, false, ''), new SlashCommandArgument('The text to translate', ARGUMENT_TYPE.STRING, true, false, ''),
@@ -696,7 +721,8 @@ jQuery(async () => {
const target = args?.target && Object.values(languageCodes).includes(String(args.target)) const target = args?.target && Object.values(languageCodes).includes(String(args.target))
? String(args.target) ? String(args.target)
: extension_settings.translate.target_language; : extension_settings.translate.target_language;
return await translate(String(value), target); const provider = args?.provider || extension_settings.translate.provider;
return await translate(String(value), target, provider);
}, },
returns: ARGUMENT_TYPE.STRING, returns: ARGUMENT_TYPE.STRING,
})); }));