From 1d2d71db48257fdf25213ffc54122abc57717103 Mon Sep 17 00:00:00 2001 From: testman Date: Sun, 24 Mar 2024 19:44:55 +0900 Subject: [PATCH 1/5] deeplX function added --- src/lang/cn.ts | 2 ++ src/lang/de.ts | 2 ++ src/lang/en.ts | 2 ++ src/lang/ko.ts | 2 ++ src/lang/vi.ts | 2 ++ src/lib/Setting/Pages/LanguageSettings.svelte | 9 +++++++ src/ts/process/tts.ts | 3 ++- src/ts/storage/database.ts | 10 +++++++- src/ts/translator/translator.ts | 25 ++++++++++++++++++- 9 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/lang/cn.ts b/src/lang/cn.ts index f018dd42..f0e237a7 100644 --- a/src/lang/cn.ts +++ b/src/lang/cn.ts @@ -391,6 +391,8 @@ export const languageChinese = { "translatorType": "翻译类型", "deeplKey": "deepl API密钥", "deeplFreeKey": "deepl 免费 API密钥", + "deeplXUrl": "deepLX URL", + "deeplXToken": "deepLX Token", "exportPersona": "导出角色", "importPersona": "导入角色", "export": "导出", diff --git a/src/lang/de.ts b/src/lang/de.ts index ffab1c6e..080b8e15 100644 --- a/src/lang/de.ts +++ b/src/lang/de.ts @@ -421,6 +421,8 @@ export const languageGerman = { translatorType: "Übersetzer-Typ", deeplKey: "DeepL API-Schlüssel", deeplFreeKey: "DeepL Gratis API-Schlüssel", + deeplXUrl: "deepLX URL", + deeplXToken: "deepLX Token", exportPersona: "Profil exportieren", importPersona: "Profil importieren", export: "Exportieren", diff --git a/src/lang/en.ts b/src/lang/en.ts index 76b07569..523b7c15 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -456,6 +456,8 @@ export const languageEnglish = { translatorType: "Translator Type", deeplKey: "deepL API Key", deeplFreeKey: "deepL Free API Key", + deeplXUrl: "deepLX URL", + deeplXToken: "deepLX Token", exportPersona: "Export Persona", importPersona: "Import Persona", export: "Export", diff --git a/src/lang/ko.ts b/src/lang/ko.ts index b3219bfb..c5bbf533 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -394,6 +394,8 @@ export const languageKorean = { translatorType: "번역기 타입", deeplKey: "deepL API 키", deeplFreeKey: "deepL 무료 API 키", + deeplXUrl: "deepLX URL", + deeplXToken: "deepLX Token", exportPersona: "페르소나 엑스포트", importPersona: "페르소나 임포트", export: "엑스포트", diff --git a/src/lang/vi.ts b/src/lang/vi.ts index c5446148..44fdf8b2 100644 --- a/src/lang/vi.ts +++ b/src/lang/vi.ts @@ -392,6 +392,8 @@ export const LanguageVietnamese = { "translatorType": "Loại dịch giả", "deeplKey": "Khóa API deepL", "deeplFreeKey": "Khóa API miễn phí deepL", + "deeplXUrl": "deepLX URL", + "deeplXToken": "deepLX Token", "exportPersona": "Xuất khẩu nhân vật", "importPersona": "Nhập khẩu nhân vật", "export": "Xuất khẩu", diff --git a/src/lib/Setting/Pages/LanguageSettings.svelte b/src/lib/Setting/Pages/LanguageSettings.svelte index c123ed2b..04218c39 100644 --- a/src/lib/Setting/Pages/LanguageSettings.svelte +++ b/src/lib/Setting/Pages/LanguageSettings.svelte @@ -58,6 +58,7 @@ Google DeepL Ax. Model + DeepL X {#if $DataBase.translatorType === 'deepl'} @@ -71,6 +72,14 @@ {/if} + + {#if $DataBase.translatorType === 'deeplX'} + {language.deeplXUrl} + + + {language.deeplXToken} + + {/if} {#if $DataBase.translatorType === 'llm'} {language.translationPrompt} diff --git a/src/ts/process/tts.ts b/src/ts/process/tts.ts index 1d368db9..db3e32c2 100644 --- a/src/ts/process/tts.ts +++ b/src/ts/process/tts.ts @@ -56,7 +56,8 @@ export async function sayTTS(character:character,text:string) { const audioContext = new AudioContext(); const da = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${character.ttsSpeech}`, { body: JSON.stringify({ - text: text + text: text, + model_id: "eleven_multilingual_v2" }), method: "POST", headers: { diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 87ef9256..c578cc26 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -332,6 +332,10 @@ export function setDatabase(data:Database){ key:'', freeApi: false } + data.deeplXOptions ??= { + url:'', + token:'' + } data.NAIadventure ??= false data.NAIappendName ??= true data.NAIsettings.cfg_scale ??= 1 @@ -555,13 +559,17 @@ export interface Database{ mancerHeader:string emotionProcesser:'submodel'|'embedding', showMenuChatList?:boolean, - translatorType:'google'|'deepl'|'none'|'llm', + translatorType:'google'|'deepl'|'none'|'llm'|'deeplX', NAIadventure?:boolean, NAIappendName?:boolean, deeplOptions:{ key:string, freeApi:boolean } + deeplXOptions:{ + url:string, + token:string + } localStopStrings?:string[] autofillRequestUrl:boolean customProxyRequestModel:string diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 08ef0e03..576790f6 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -127,6 +127,29 @@ async function translateMain(text:string, arg:{from:string, to:string, host:stri return f.data.translations[0].text } + if(db.translatorType === 'deeplX'){ + const body = { + text: [text], + target_lang: arg.to.toLocaleUpperCase(), + source_lang: arg.from.toLocaleUpperCase() + } + let url = db.deeplXOptions.url + const f = await globalFetch(url, { + headers: { + "Content-Type": "application/json", + "Authorization" : "Bearer " + db.deeplXOptions.token + }, + body: body + }) + + if(!f.ok){ + return 'ERR::DeepLX API Error' + (await f.data) + } + return f.data.translations[0].text + + } + + const url = `https://${arg.host}/translate_a/single?client=gtx&dt=t&sl=${arg.from}&tl=${arg.to}&q=` + encodeURIComponent(text) @@ -171,7 +194,7 @@ async function jaTrans(text:string) { export function isExpTranslator(){ const db = get(DataBase) - return db.translatorType === 'llm' || db.translatorType === 'deepl' + return db.translatorType === 'llm' || db.translatorType === 'deepl' || db.translatorType === 'deeplX' } export async function translateHTML(html: string, reverse:boolean, charArg:simpleCharacterArgument|string = ''): Promise { From 4a7f249db4ad17ca514d4f067ecc3f43f5ce49ae Mon Sep 17 00:00:00 2001 From: testman Date: Sun, 24 Mar 2024 20:13:35 +0900 Subject: [PATCH 2/5] =?UTF-8?q?token=20=EB=B6=84=EA=B8=B0=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ts/translator/translator.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 576790f6..894049a9 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -128,20 +128,26 @@ async function translateMain(text:string, arg:{from:string, to:string, host:stri } if(db.translatorType === 'deeplX'){ - const body = { + const body = JSON.stringify({ text: [text], target_lang: arg.to.toLocaleUpperCase(), source_lang: arg.from.toLocaleUpperCase() + }) + let url = db.deeplXOptions.url; + let headers = { + "Content-Type": "application/json" } - let url = db.deeplXOptions.url + + // token이 비어있지 않으면 headers에 Authorization 추가 + if(db.deeplXOptions.token.trim() !== '') { + headers["Authorization"] = "Bearer " + db.deeplXOptions.token; + } + const f = await globalFetch(url, { - headers: { - "Content-Type": "application/json", - "Authorization" : "Bearer " + db.deeplXOptions.token - }, + method: "POST", // 요청 메소드 추가 + headers: headers, body: body }) - if(!f.ok){ return 'ERR::DeepLX API Error' + (await f.data) } From 7444090c9c57fb07b96d2208a3c8a1a185229dfa Mon Sep 17 00:00:00 2001 From: testman Date: Mon, 25 Mar 2024 05:26:35 +0900 Subject: [PATCH 3/5] =?UTF-8?q?globalFetch=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ts/storage/globalApi.ts | 516 ++++++++++++++---------------------- 1 file changed, 197 insertions(+), 319 deletions(-) diff --git a/src/ts/storage/globalApi.ts b/src/ts/storage/globalApi.ts index ce4e4db3..8575670f 100644 --- a/src/ts/storage/globalApi.ts +++ b/src/ts/storage/globalApi.ts @@ -488,335 +488,213 @@ export async function loadData() { } } -const knownHostes = ["localhost","127.0.0.1"] +export async function getFetchData(id:string) { + for(const log of fetchLog){ + if(log.chatId === id){ + return log + } + } + return null +} + +const knownHostes = ["localhost","127.0.0.1","0.0.0.0"] + +interface GlobalFetchArgs { + plainFetchForce?: boolean; + body?: any; + headers?: { [key: string]: string }; + rawResponse?: boolean; + method?: 'POST' | 'GET'; + abortSignal?: AbortSignal; + useRisuToken?: boolean; + chatId?: string; +} + +interface GlobalFetchResult { + ok: boolean; + data: any; + headers: { [key: string]: string }; +} export function addFetchLog(arg:{ - body:any, - headers?:{[key:string]:string}, - response:any, - success:boolean, - url:string, - resType?:string, - chatId?:string + body:any, + headers?:{[key:string]:string}, + response:any, + success:boolean, + url:string, + resType?:string, + chatId?:string }){ - fetchLog.unshift({ - body: typeof(arg.body) === 'string' ? arg.body : JSON.stringify(arg.body, null, 2), - header: JSON.stringify(arg.headers ?? {}, null, 2), - response: typeof(arg.response) === 'string' ? arg.response : JSON.stringify(arg.response, null, 2), - responseType: arg.resType ?? 'json', - success: arg.success, - date: (new Date()).toLocaleTimeString(), - url: arg.url, - chatId: arg.chatId - }) - return fetchLog.length - 1 + fetchLog.unshift({ + body: typeof(arg.body) === 'string' ? arg.body : JSON.stringify(arg.body, null, 2), + header: JSON.stringify(arg.headers ?? {}, null, 2), + response: typeof(arg.response) === 'string' ? arg.response : JSON.stringify(arg.response, null, 2), + responseType: arg.resType ?? 'json', + success: arg.success, + date: (new Date()).toLocaleTimeString(), + url: arg.url, + chatId: arg.chatId + }) + return fetchLog.length - 1 } -export async function getFetchData(id:string) { - for(const log of fetchLog){ - if(log.chatId === id){ - return log - } + + +export async function globalFetch(url: string, arg: GlobalFetchArgs = {}): Promise { + try { + const db = get(DataBase) + const method = arg.method ?? "POST" + db.requestmet = "normal" + + if (arg.abortSignal?.aborted) { return { ok: false, data: 'aborted', headers: {} }} + + const urlHost = new URL(url).hostname + const forcePlainFetch = (knownHostes.includes(urlHost) && !isTauri) || db.usePlainFetch || arg.plainFetchForce + + if (knownHostes.includes(urlHost) && !isTauri && !isNodeServer) + return { ok: false, headers: {}, data: 'You are trying local request on web version. This is not allowed due to browser security policy. Use the desktop version instead, or use a tunneling service like ngrok and set the CORS to allow all.' } + + // Simplify the globalFetch function: Detach built-in functions + const fetchData = async (url, arg) => { + if (forcePlainFetch) { + return await fetchWithPlainFetch(url, arg); + } + if (isTauri) { + return await fetchWithTauri(url, arg); + } + if (Capacitor.isNativePlatform()) { + return await fetchWithCapacitor(url, arg); + } + return await fetchWithProxy(url, arg); + }; + + } catch (error) { + console.error(error); + return { ok: false, data: `${error}`, headers: {} }; + } +} + +// Decoupled globalFetch built-in function +function addFetchLogInGlobalFetch(response:any, success:boolean, url:string, arg:GlobalFetchArgs){ + try{ + fetchLog.unshift({ + body: JSON.stringify(arg.body, null, 2), + header: JSON.stringify(arg.headers ?? {}, null, 2), + response: JSON.stringify(response, null, 2), + success: success, + date: (new Date()).toLocaleTimeString(), + url: url, + chatId: arg.chatId + }) + } + catch{ + fetchLog.unshift({ + body: JSON.stringify(arg.body, null, 2), + header: JSON.stringify(arg.headers ?? {}, null, 2), + response: `${response}`, + success: success, + date: (new Date()).toLocaleTimeString(), + url: url, + chatId: arg.chatId + }) + } +} + +// Decoupled globalFetch built-in function +async function fetchWithPlainFetch(url: string, arg: GlobalFetchArgs): Promise { + try { + const headers = { 'Content-Type': 'application/json', ...arg.headers }; + const response = await fetch(new URL(url), { body: JSON.stringify(arg.body), headers, method: arg.method, signal: arg.abortSignal }); + const data = arg.rawResponse ? new Uint8Array(await response.arrayBuffer()) : await response.json(); + const ok = response.ok && response.status >= 200 && response.status < 300; + addFetchLogInGlobalFetch(data, ok, url, arg); + return { ok, data, headers: Object.fromEntries(response.headers) }; + } catch (error) { + return { ok: false, data: `${error}`, headers: {} }; + } +} + +// Decoupled globalFetch built-in function +async function fetchWithTauri(url: string, arg: GlobalFetchArgs): Promise { + const body = !arg.body ? null : arg.body instanceof URLSearchParams ? Body.text(arg.body.toString()) : Body.json(arg.body); + const headers = arg.headers ?? {}; + const fetchPromise = TauriFetch(url, { + body, + method: arg.method, + headers, + timeout: { secs: get(DataBase).timeOut, nanos: 0 }, + responseType: arg.rawResponse ? ResponseType.Binary : ResponseType.JSON, + }); + + let abortFn = () => {}; + const abortPromise = new Promise<"aborted">((res, rej) => { + abortFn = () => res("aborted"); + arg.abortSignal?.addEventListener('abort', abortFn); + }); + + const result = await Promise.any([fetchPromise, abortPromise]); + arg.abortSignal?.removeEventListener('abort', abortFn); + + if (result === 'aborted') { + return { ok: false, data: 'aborted', headers: {} }; + } + + const data = arg.rawResponse ? new Uint8Array(result.data as number[]) : result.data; + addFetchLogInGlobalFetch(data, result.ok, url, arg); + return { ok: result.ok, data, headers: result.headers }; +} + +// Decoupled globalFetch built-in function +async function fetchWithCapacitor(url: string, arg: GlobalFetchArgs): Promise { + const { body, headers = {}, rawResponse } = arg; + headers["Content-Type"] = body instanceof URLSearchParams ? "application/x-www-form-urlencoded" : "application/json"; + + const res = await CapacitorHttp.request({ url, method: arg.method, headers, data: body, responseType: rawResponse ? "arraybuffer" : "json" }); + + addFetchLogInGlobalFetch(rawResponse ? "Uint8Array Response" : res.data, true, url, arg); + + return { + ok: true, + data: rawResponse ? new Uint8Array(res.data as ArrayBuffer) : res.data, + headers: res.headers, + }; +} + +// Decoupled globalFetch built-in function +async function fetchWithProxy(url: string, arg: GlobalFetchArgs): Promise { + try { + const furl = !isTauri && !isNodeServer ? `${hubURL}/proxy2` : `/proxy2`; + const headers = { + "risu-header": encodeURIComponent(JSON.stringify(arg.headers)), + "risu-url": encodeURIComponent(url), + "Content-Type": arg.body instanceof URLSearchParams ? "application/x-www-form-urlencoded" : "application/json", + ...(arg.useRisuToken && { "x-risu-tk": "use" }), + }; + + const body = arg.body instanceof URLSearchParams ? arg.body.toString() : JSON.stringify(arg.body); + + const response = await fetch(furl, { body, headers, method: arg.method, signal: arg.abortSignal }); + const isSuccess = response.ok && response.status >= 200 && response.status < 300; + + if (arg.rawResponse) { + const data = new Uint8Array(await response.arrayBuffer()); + addFetchLogInGlobalFetch("Uint8Array Response", isSuccess, url, arg); + return { ok: isSuccess, data, headers: Object.fromEntries(response.headers) }; } - return null -} -export async function globalFetch(url:string, arg:{ - plainFetchForce?:boolean, - body?:any, - headers?:{[key:string]:string}, - rawResponse?:boolean, - method?:"POST"|"GET", - abortSignal?:AbortSignal, - useRisuToken?:boolean, - chatId?:string -} = {}): Promise<{ - ok: boolean; - data: any; - headers:{[key:string]:string}, -}> { + const text = await response.text(); try { - const db = get(DataBase) - const method = arg.method ?? "POST" - db.requestmet = "normal" - - if(arg.abortSignal && arg.abortSignal.aborted){ - return { - ok: false, - data: 'aborted', - headers: {} - } - } - - function addFetchLog(response:any, success:boolean){ - try{ - fetchLog.unshift({ - body: JSON.stringify(arg.body, null, 2), - header: JSON.stringify(arg.headers ?? {}, null, 2), - response: JSON.stringify(response, null, 2), - success: success, - date: (new Date()).toLocaleTimeString(), - url: url, - chatId: arg.chatId - }) - } - catch{ - fetchLog.unshift({ - body: JSON.stringify(arg.body, null, 2), - header: JSON.stringify(arg.headers ?? {}, null, 2), - response: `${response}`, - success: success, - date: (new Date()).toLocaleTimeString(), - url: url, - chatId: arg.chatId - }) - } - } - - const urlHost = (new URL(url)).hostname - let forcePlainFetch = (knownHostes.includes(urlHost) && (!isTauri)) || db.usePlainFetch || arg.plainFetchForce - //check if the url is a local url like localhost - if(urlHost.includes("localhost") || urlHost.includes("172.0.0.1") || urlHost.includes("0.0.0.0")){ - if((!isTauri) && (!isNodeServer)){ - return { - ok: false, - data: 'You are trying local request on web version. this is not allowed dude to browser security policy. use the desktop version instead, or use tunneling service like ngrok and set the cors to allow all.', - headers: {} - } - } - } - - if(forcePlainFetch){ - try { - let headers = arg.headers ?? {} - if(!headers["Content-Type"]){ - headers["Content-Type"] = `application/json` - } - const furl = new URL(url) - - const da = await fetch(furl, { - body: JSON.stringify(arg.body), - headers: arg.headers, - method: method, - signal: arg.abortSignal - }) - - if(arg.rawResponse){ - addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300) - return { - ok: da.ok && da.status >= 200 && da.status < 300, - data: new Uint8Array(await da.arrayBuffer()), - headers: Object.fromEntries(da.headers) - } - } - else{ - const dat = await da.json() - addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300) - return { - ok: da.ok && da.status >= 200 && da.status < 300, - data: dat, - headers: Object.fromEntries(da.headers) - } - } - - } catch (error) { - return { - ok: false, - data: `${error}`, - headers: {} - } - } - } - if(isTauri){ - const body = (!arg.body) ? null : - (arg.body instanceof URLSearchParams) ? (Body.text(arg.body.toString())) : (Body.json(arg.body)) - const headers = arg.headers ?? {} - const fetchPromise = TauriFetch(url, { - body: body, - method: method, - headers: headers, - timeout: { - secs: db.timeOut, - nanos: 0 - }, - responseType: arg.rawResponse ? ResponseType.Binary : ResponseType.JSON, - - }) - - //abort the promise when abort signal is triggered - let abortFn:() => void = () => {} - - const abortPromise = (new Promise<"aborted">((res,rej) => { - abortFn = () => { - res("aborted") - } - if(arg.abortSignal){ - arg.abortSignal?.addEventListener('abort', abortFn) - } - })) - - const result = await Promise.any([fetchPromise,abortPromise]) - - if(arg.abortSignal){ - arg.abortSignal.removeEventListener('abort', abortFn) - } - - if(result === 'aborted'){ - return { - ok: false, - data: 'aborted', - headers: {} - } - } - - if(arg.rawResponse){ - addFetchLog("Uint8Array Response", result.ok) - return { - ok: result.ok, - data: new Uint8Array(result.data as number[]), - headers: result.headers - } - } - else{ - addFetchLog(result.data, result.ok) - return { - ok: result.ok, - data: result.data, - headers: result.headers - } - } - } - else if (Capacitor.isNativePlatform()){ - const body = arg.body - const headers = arg.headers ?? {} - if(arg.body instanceof URLSearchParams){ - if(!headers["Content-Type"]){ - headers["Content-Type"] = `application/x-www-form-urlencoded` - } - } - else{ - if(!headers["Content-Type"]){ - headers["Content-Type"] = `application/json` - } - } - const res = await CapacitorHttp.request({ - url: url, - method: method, - headers: headers, - data: body, - responseType: arg.rawResponse ? 'arraybuffer' : 'json' - }) - - if(arg.rawResponse){ - addFetchLog("Uint8Array Response", true) - return { - ok: true, - data: new Uint8Array(res.data as ArrayBuffer), - headers: res.headers - } - } - addFetchLog(res.data, true) - return { - ok: true, - data: res.data, - headers: res.headers - } - } - else{ - try { - let body:any - if(arg.body instanceof URLSearchParams){ - const argBody = arg.body as URLSearchParams - body = argBody.toString() - let headers = arg.headers ?? {} - if(!headers["Content-Type"]){ - headers["Content-Type"] = `application/x-www-form-urlencoded` - } - } - else{ - body = JSON.stringify(arg.body) - let headers = arg.headers ?? {} - if(!headers["Content-Type"]){ - headers["Content-Type"] = `application/json` - } - } - if(arg.rawResponse){ - const furl = ((!isTauri) && (!isNodeServer)) ? `${hubURL}/proxy2` : `/proxy2` - - let headers = { - "risu-header": encodeURIComponent(JSON.stringify(arg.headers)), - "risu-url": encodeURIComponent(url), - "Content-Type": "application/json", - } - if(arg.useRisuToken){ - headers["x-risu-tk"] = "use" - } - - const da = await fetch(furl, { - body: body, - headers: headers, - method: method, - signal: arg.abortSignal - }) - - addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300) - return { - ok: da.ok && da.status >= 200 && da.status < 300, - data: new Uint8Array(await da.arrayBuffer()), - headers: Object.fromEntries(da.headers) - } - } - else{ - const furl = ((!isTauri) && (!isNodeServer)) ? `${hubURL}/proxy2` : `/proxy2` - - let headers = { - "risu-header": encodeURIComponent(JSON.stringify(arg.headers)), - "risu-url": encodeURIComponent(url), - "Content-Type": "application/json" - } - if(arg.useRisuToken){ - headers["x-risu-tk"] = "use" - } - const da = await fetch(furl, { - body: body, - headers: headers, - method: method - }) - const daText = await da.text() - try { - const dat = JSON.parse(daText) - addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300) - return { - ok: da.ok && da.status >= 200 && da.status < 300, - data: dat, - headers: Object.fromEntries(da.headers) - } - } catch (error) { - addFetchLog(daText, false) - let errorMsg = (daText.startsWith(' Date: Mon, 25 Mar 2024 06:06:41 +0900 Subject: [PATCH 4/5] =?UTF-8?q?globalFetch=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EA=B0=9C=EC=84=A0=20=20=EB=B0=8F=20=EB=94=94?= =?UTF-8?q?=EB=B2=84=EA=B9=85=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ts/storage/globalApi.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ts/storage/globalApi.ts b/src/ts/storage/globalApi.ts index 8575670f..d256df69 100644 --- a/src/ts/storage/globalApi.ts +++ b/src/ts/storage/globalApi.ts @@ -555,7 +555,6 @@ export async function globalFetch(url: string, arg: GlobalFetchArgs = {}): Promi return { ok: false, headers: {}, data: 'You are trying local request on web version. This is not allowed due to browser security policy. Use the desktop version instead, or use a tunneling service like ngrok and set the CORS to allow all.' } // Simplify the globalFetch function: Detach built-in functions - const fetchData = async (url, arg) => { if (forcePlainFetch) { return await fetchWithPlainFetch(url, arg); } @@ -566,7 +565,6 @@ export async function globalFetch(url: string, arg: GlobalFetchArgs = {}): Promi return await fetchWithCapacitor(url, arg); } return await fetchWithProxy(url, arg); - }; } catch (error) { console.error(error); From 72a682612a3193fe027ac84e9b245f63ba65332f Mon Sep 17 00:00:00 2001 From: testman Date: Mon, 25 Mar 2024 15:48:59 +0900 Subject: [PATCH 5/5] =?UTF-8?q?DeepLX=20=EC=97=90=EB=9F=AC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ts/translator/translator.ts | 38 +++++++++++++-------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 894049a9..a870f081 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -128,31 +128,23 @@ async function translateMain(text:string, arg:{from:string, to:string, host:stri } if(db.translatorType === 'deeplX'){ - const body = JSON.stringify({ - text: [text], - target_lang: arg.to.toLocaleUpperCase(), - source_lang: arg.from.toLocaleUpperCase() - }) + // URL이 DeeplX 프로그램 실행시키면 CMD에서는 0.0.0.0:1188라고 뜨는데 https://0.0.0.0:1188/translate 로 호출 보내야함 + // 유저가 https://0.0.0.0:1188/translate라고 입력하게 할지, 아니면 0.0.0.0:1188만 입력하면 /translate를 자동으로 붙여줄지 결정필요 let url = db.deeplXOptions.url; - let headers = { - "Content-Type": "application/json" - } - - // token이 비어있지 않으면 headers에 Authorization 추가 - if(db.deeplXOptions.token.trim() !== '') { - headers["Authorization"] = "Bearer " + db.deeplXOptions.token; - } - - const f = await globalFetch(url, { - method: "POST", // 요청 메소드 추가 - headers: headers, - body: body - }) - if(!f.ok){ - return 'ERR::DeepLX API Error' + (await f.data) - } - return f.data.translations[0].text + let headers = { "Content-Type": "application/json" } + const body = {text: text, target_lang: arg.to.toLocaleUpperCase(), source_lang: arg.from.toLocaleUpperCase()} + + + if(db.deeplXOptions.token.trim() !== '') { headers["Authorization"] = "Bearer " + db.deeplXOptions.token} + + console.log(body) + const f = await globalFetch(url, { method: "POST", headers: headers, body: body }) + + if(!f.ok){ return 'ERR::DeepLX API Error' + (await f.data) } + + const jsonResponse = JSON.stringify(f.data.data) + return jsonResponse }