diff --git a/public/scripts/extensions/translate/index.js b/public/scripts/extensions/translate/index.js index 5b1e1f009..668c6d2e2 100644 --- a/public/scripts/extensions/translate/index.js +++ b/public/scripts/extensions/translate/index.js @@ -1,4 +1,13 @@ -import { eventSource, event_types, getRequestHeaders, messageFormatting, saveSettingsDebounced, substituteParams } from "../../../script.js"; +import { + callPopup, + eventSource, + event_types, + getRequestHeaders, + messageFormatting, + reloadCurrentChat, + saveSettingsDebounced, + substituteParams, +} from "../../../script.js"; import { extension_settings, getContext } from "../../extensions.js"; const autoModeOptions = { @@ -217,6 +226,54 @@ function createEventHandler(translateFunction, shouldTranslateFunction) { }; } +// Prevents the chat from being translated in parallel +let translateChatExecuting = false; + +async function onTranslateChatClick() { + if (translateChatExecuting) { + return; + } + + try { + translateChatExecuting = true; + const context = getContext(); + const chat = context.chat; + + toastr.info(`${chat.length} message(s) queued for translation.`, 'Please wait...'); + + for (let i = 0; i < chat.length; i++) { + await translateIncomingMessage(i); + } + + await context.saveChat(); + } catch (error) { + console.log(error); + toastr.error('Failed to translate chat'); + } finally { + translateChatExecuting = false; + } +} + +async function onTranslationsClearClick() { + const confirm = await callPopup('

Are you sure?

This will remove translated text from all messages in the current chat. This action cannot be undone.', 'confirm'); + + if (!confirm) { + return; + } + + const context = getContext(); + const chat = context.chat; + + for (const mes of chat) { + if (mes.extra) { + delete mes.extra.display_text; + } + } + + await context.saveChat(); + await reloadCurrentChat(); +} + jQuery(() => { const html = `
@@ -239,11 +296,23 @@ jQuery(() => { +
`; + const buttonHtml = ` +
+
+ Translate Chat +
`; + $('#extensionsMenu').append(buttonHtml); $('#extensions_settings').append(html); + $('#translate_chat').on('click', onTranslateChatClick); + $('#translation_clear').on('click', onTranslationsClearClick); for (const [key, value] of Object.entries(languageCodes)) { $('#translation_target_language').append(``); diff --git a/public/scripts/extensions/translate/style.css b/public/scripts/extensions/translate/style.css index e69de29bb..6947934c5 100644 --- a/public/scripts/extensions/translate/style.css +++ b/public/scripts/extensions/translate/style.css @@ -0,0 +1,7 @@ +.translation_settings .menu_button { + width: fit-content; + display: flex; + gap: 10px; + align-items: baseline; + flex-direction: row; +}