mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Add provider arg to /translate command
This commit is contained in:
@@ -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>
|
||||||
@@ -35,4 +35,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -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,
|
||||||
}));
|
}));
|
||||||
|
Reference in New Issue
Block a user