diff --git a/.history/src/modules/services/deepl_20230726092452.ts b/.history/src/modules/services/deepl_20230726092452.ts new file mode 100644 index 0000000..cd5e9a6 --- /dev/null +++ b/.history/src/modules/services/deepl_20230726092452.ts @@ -0,0 +1,25 @@ +import { TranslateTask, TranslateTaskProcessor } from "../../utils/translate"; + +export const deeplfree = async function (data) { + return await deepl("https://api-free.deepl.com/v2/translate", data); +}; + +export const deeplpro = async function (data) { + return await deepl("https://api.deepl.com/v2/translate", data); +}; + +async function deepl(url: string, data: Required) { + const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( + data.raw + )}&source_lang=${data.langfrom + .split("-")[0] + .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; + const xhr = await Zotero.HTTP.request("POST", url, { + responseType: "json", + body: reqBody, + }); + if (xhr?.status !== 200) { + throw `Request error: ${xhr?.status}`; + } + data.result = xhr.response.translations[0].text; +} diff --git a/.history/src/modules/services/deepl_20250610163253.ts b/.history/src/modules/services/deepl_20250610163253.ts new file mode 100644 index 0000000..fa47ecb --- /dev/null +++ b/.history/src/modules/services/deepl_20250610163253.ts @@ -0,0 +1,65 @@ +import { TranslateTask, TranslateTaskProcessor } from "../../utils/translate"; + +export const deeplfree = async function (data) { + return await deepl("https://api-free.deepl.com/v2/translate", data); +}; + +export const deeplpro = async function (data) { + return await deepl("https://api.deepl.com/v2/translate", data); +}; + +// async function deepl(url: string, data: Required) { +// const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( +// data.raw +// )}&source_lang=${data.langfrom +// .split("-")[0] +// .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; +// const xhr = await Zotero.HTTP.request("POST", url, { +// responseType: "json", +// body: reqBody, +// }); +// if (xhr?.status !== 200) { +// throw `Request error: ${xhr?.status}`; +// } +// data.result = xhr.response.translations[0].text; +// } + + +async function deepl(url: string, data: Required) { + const [key, glossary_id]: string[] = data.secret.split("#"); + const xhr = await Zotero.HTTP.request("POST", url, { + headers: { + "Content-Type": "application/json", + Authorization: `DeepL-Auth-Key ${key}`, + "User-Agent": `Translate for Zotero/${Zotero.version}-${Zotero.platform}-${version}`, + }, + responseType: "json", + body: JSON.stringify({ + text: [data.raw], + source_lang: mapLang(data.langfrom), + target_lang: mapLang(data.langto), + glossary_id: glossary_id, + }), + }); + if (xhr?.status !== 200) { + throw `Request error: ${xhr?.status}`; + } + data.result = xhr.response.translations[0].text; +} + +function mapLang(lang: string) { + if (lang in LANG_MAP) { + return LANG_MAP[lang]; + } + return lang.split("-")[0].toUpperCase(); +} + +const LANG_MAP = { + "pt-BR": "PT-BR", + "pt-PT": "PT-PT", + "zh-CN": "ZH-HANS", + "zh-HK": "ZH-HANT", + "zh-MO": "ZH-HANT", + "zh-SG": "ZH-HANS", + "zh-TW": "ZH-HANT", +} as Record; \ No newline at end of file diff --git a/.history/src/modules/services/deepl_20250610163408.ts b/.history/src/modules/services/deepl_20250610163408.ts new file mode 100644 index 0000000..d0608cc --- /dev/null +++ b/.history/src/modules/services/deepl_20250610163408.ts @@ -0,0 +1,74 @@ +import { TranslateTask, TranslateTaskProcessor } from "../../utils/translate"; + +export const deeplfree = async function (data) { + return await deepl("https://api-free.deepl.com/v2/translate", data); +}; + +// export const deeplpro = async function (data) { +// return await deepl("https://api.deepl.com/v2/translate", data); +// }; + +// async function deepl(url: string, data: Required) { +// const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( +// data.raw +// )}&source_lang=${data.langfrom +// .split("-")[0] +// .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; +// const xhr = await Zotero.HTTP.request("POST", url, { +// responseType: "json", +// body: reqBody, +// }); +// if (xhr?.status !== 200) { +// throw `Request error: ${xhr?.status}`; +// } +// data.result = xhr.response.translations[0].text; +// } + +export const deeplpro = async function (data) { + // See https://github.com/windingwind/zotero-pdf-translate/issues/579 + return await deepl( + data.secret.endsWith("dp") + ? "https://api.deepl-pro.com/v2/translate" + : "https://api.deepl.com/v2/translate", + data, + ); +}; + +async function deepl(url: string, data: Required) { + const [key, glossary_id]: string[] = data.secret.split("#"); + const xhr = await Zotero.HTTP.request("POST", url, { + headers: { + "Content-Type": "application/json", + Authorization: `DeepL-Auth-Key ${key}`, + "User-Agent": `Translate for Zotero/${Zotero.version}-${Zotero.platform}-${version}`, + }, + responseType: "json", + body: JSON.stringify({ + text: [data.raw], + source_lang: mapLang(data.langfrom), + target_lang: mapLang(data.langto), + glossary_id: glossary_id, + }), + }); + if (xhr?.status !== 200) { + throw `Request error: ${xhr?.status}`; + } + data.result = xhr.response.translations[0].text; +} + +function mapLang(lang: string) { + if (lang in LANG_MAP) { + return LANG_MAP[lang]; + } + return lang.split("-")[0].toUpperCase(); +} + +const LANG_MAP = { + "pt-BR": "PT-BR", + "pt-PT": "PT-PT", + "zh-CN": "ZH-HANS", + "zh-HK": "ZH-HANT", + "zh-MO": "ZH-HANT", + "zh-SG": "ZH-HANS", + "zh-TW": "ZH-HANT", +} as Record; \ No newline at end of file diff --git a/.history/src/modules/services/deepl_20250610163541.ts b/.history/src/modules/services/deepl_20250610163541.ts new file mode 100644 index 0000000..d0608cc --- /dev/null +++ b/.history/src/modules/services/deepl_20250610163541.ts @@ -0,0 +1,74 @@ +import { TranslateTask, TranslateTaskProcessor } from "../../utils/translate"; + +export const deeplfree = async function (data) { + return await deepl("https://api-free.deepl.com/v2/translate", data); +}; + +// export const deeplpro = async function (data) { +// return await deepl("https://api.deepl.com/v2/translate", data); +// }; + +// async function deepl(url: string, data: Required) { +// const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( +// data.raw +// )}&source_lang=${data.langfrom +// .split("-")[0] +// .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; +// const xhr = await Zotero.HTTP.request("POST", url, { +// responseType: "json", +// body: reqBody, +// }); +// if (xhr?.status !== 200) { +// throw `Request error: ${xhr?.status}`; +// } +// data.result = xhr.response.translations[0].text; +// } + +export const deeplpro = async function (data) { + // See https://github.com/windingwind/zotero-pdf-translate/issues/579 + return await deepl( + data.secret.endsWith("dp") + ? "https://api.deepl-pro.com/v2/translate" + : "https://api.deepl.com/v2/translate", + data, + ); +}; + +async function deepl(url: string, data: Required) { + const [key, glossary_id]: string[] = data.secret.split("#"); + const xhr = await Zotero.HTTP.request("POST", url, { + headers: { + "Content-Type": "application/json", + Authorization: `DeepL-Auth-Key ${key}`, + "User-Agent": `Translate for Zotero/${Zotero.version}-${Zotero.platform}-${version}`, + }, + responseType: "json", + body: JSON.stringify({ + text: [data.raw], + source_lang: mapLang(data.langfrom), + target_lang: mapLang(data.langto), + glossary_id: glossary_id, + }), + }); + if (xhr?.status !== 200) { + throw `Request error: ${xhr?.status}`; + } + data.result = xhr.response.translations[0].text; +} + +function mapLang(lang: string) { + if (lang in LANG_MAP) { + return LANG_MAP[lang]; + } + return lang.split("-")[0].toUpperCase(); +} + +const LANG_MAP = { + "pt-BR": "PT-BR", + "pt-PT": "PT-PT", + "zh-CN": "ZH-HANS", + "zh-HK": "ZH-HANT", + "zh-MO": "ZH-HANT", + "zh-SG": "ZH-HANS", + "zh-TW": "ZH-HANT", +} as Record; \ No newline at end of file diff --git a/src/modules/services/deepl.ts b/src/modules/services/deepl.ts index cd5e9a6..d0608cc 100644 --- a/src/modules/services/deepl.ts +++ b/src/modules/services/deepl.ts @@ -4,22 +4,71 @@ export const deeplfree = async function (data) { return await deepl("https://api-free.deepl.com/v2/translate", data); }; +// export const deeplpro = async function (data) { +// return await deepl("https://api.deepl.com/v2/translate", data); +// }; + +// async function deepl(url: string, data: Required) { +// const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( +// data.raw +// )}&source_lang=${data.langfrom +// .split("-")[0] +// .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; +// const xhr = await Zotero.HTTP.request("POST", url, { +// responseType: "json", +// body: reqBody, +// }); +// if (xhr?.status !== 200) { +// throw `Request error: ${xhr?.status}`; +// } +// data.result = xhr.response.translations[0].text; +// } + export const deeplpro = async function (data) { - return await deepl("https://api.deepl.com/v2/translate", data); + // See https://github.com/windingwind/zotero-pdf-translate/issues/579 + return await deepl( + data.secret.endsWith("dp") + ? "https://api.deepl-pro.com/v2/translate" + : "https://api.deepl.com/v2/translate", + data, + ); }; async function deepl(url: string, data: Required) { - const reqBody = `auth_key=${data.secret}&text=${encodeURIComponent( - data.raw - )}&source_lang=${data.langfrom - .split("-")[0] - .toUpperCase()}&target_lang=${data.langto.split("-")[0].toUpperCase()}`; + const [key, glossary_id]: string[] = data.secret.split("#"); const xhr = await Zotero.HTTP.request("POST", url, { + headers: { + "Content-Type": "application/json", + Authorization: `DeepL-Auth-Key ${key}`, + "User-Agent": `Translate for Zotero/${Zotero.version}-${Zotero.platform}-${version}`, + }, responseType: "json", - body: reqBody, + body: JSON.stringify({ + text: [data.raw], + source_lang: mapLang(data.langfrom), + target_lang: mapLang(data.langto), + glossary_id: glossary_id, + }), }); if (xhr?.status !== 200) { throw `Request error: ${xhr?.status}`; } data.result = xhr.response.translations[0].text; } + +function mapLang(lang: string) { + if (lang in LANG_MAP) { + return LANG_MAP[lang]; + } + return lang.split("-")[0].toUpperCase(); +} + +const LANG_MAP = { + "pt-BR": "PT-BR", + "pt-PT": "PT-PT", + "zh-CN": "ZH-HANS", + "zh-HK": "ZH-HANT", + "zh-MO": "ZH-HANT", + "zh-SG": "ZH-HANS", + "zh-TW": "ZH-HANT", +} as Record; \ No newline at end of file