diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index 6aaab00f..1c6dfcef 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -4,10 +4,11 @@ import AutoresizeArea from "../UI/GUI/TextAreaResizable.svelte"; import { alertConfirm } from "../../ts/alert"; import { language } from "../../lang"; - import { DataBase, type character, type groupChat } from "../../ts/storage/database"; + import { DataBase, type groupChat } from "../../ts/storage/database"; import { CurrentChat, selectedCharID } from "../../ts/stores"; - import { translate } from "../../ts/translator/translator"; + import { translate, translateHTML } from "../../ts/translator/translator"; import { risuChatParser } from "src/ts/process/scripts"; + import { get } from "svelte/store"; export let message = '' export let name = '' export let largePortrait = false @@ -24,8 +25,7 @@ export let altGreeting = false let msgDisplay = '' - let msgTranslated = '' - let translated = false; + let translated = get(DataBase).autoTranslate async function rm(){ const rm = $DataBase.askRemoval ? await alertConfirm(language.removeChat) : true if(rm){ @@ -55,14 +55,7 @@ } async function displaya(message:string){ - if($DataBase.autoTranslate && $DataBase.translator !== ''){ - msgDisplay = risuChatParser(message, {chara: name, chatID: idx, rmVar: true}) - msgDisplay = await translate(risuChatParser(message, {chara: name, chatID: idx, rmVar: true}), false) - - } - else{ - msgDisplay = risuChatParser(message, {chara: name, chatID: idx, rmVar: true}) - } + msgDisplay = risuChatParser(message, {chara: name, chatID: idx, rmVar: true}) } const setStatusMessage = (message:string, timeout:number = 0)=>{ @@ -73,6 +66,20 @@ }, timeout) } + let lastParsed = '' + + const markParsing = async (data: string, charArg?: string | groupChat | simpleCharacterArgument, mode?: "normal" | "back", chatID?: number, translateText?:boolean) => { + const marked = await ParseMarkdown(data, charArg, mode, chatID) + lastParsed = marked + if(translateText){ + translating = true + const translated = await translateHTML(marked, false) + translating = false + return translated + } + return marked + } + $: displaya(message)
@@ -107,11 +114,9 @@ @@ -157,18 +152,21 @@ {#if editMode} {:else} - {#await ParseMarkdown(msgDisplay, character, 'normal', idx) then md} - - { - if($DataBase.clickToEdit && idx > -1){ - editMode = true - msgTranslated = "" - } - }} - style:font-size="{0.875 * ($DataBase.zoomsize / 100)}rem" - style:line-height="{1.25 * ($DataBase.zoomsize / 100)}rem" - >{@html md} + + { + if($DataBase.clickToEdit && idx > -1){ + editMode = true + } + }} + style:font-size="{0.875 * ($DataBase.zoomsize / 100)}rem" + style:line-height="{1.25 * ($DataBase.zoomsize / 100)}rem" + > + {#await markParsing(msgDisplay, character, 'normal', idx, translated)} + {@html lastParsed} + {:then md} + {@html md} {/await} + {/if} diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 7d8809c3..21b1036e 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -156,4 +156,35 @@ export async function translateVox(text:string) { async function jaTrans(text:string) { return await runTranslator(text, true, 'en','ja') +} + + + +export async function translateHTML(html: string, reverse:boolean): Promise { + const dom = new DOMParser().parseFromString(html, 'text/html'); + + // Recursive function to translate all text nodes + async function translateNode(node: Node): Promise { + if (node.nodeType === Node.TEXT_NODE) { + // Translate the text content of the node + if(node.textContent){ + node.textContent = await translate(node.textContent || '', reverse); + } + } else { + // Translate child nodes + for (const child of Array.from(node.childNodes)) { + await translateNode(child); + } + } + } + + // Start translation from the body element + await translateNode(dom.body); + + // Serialize the DOM back to HTML + const serializer = new XMLSerializer(); + const translatedHTML = serializer.serializeToString(dom.body); + + // Return the translated HTML, excluding the outer tags if needed + return translatedHTML } \ No newline at end of file