diff --git a/packages/app/src/Const.ts b/packages/app/src/Const.ts index 76695747..634aa8d0 100644 --- a/packages/app/src/Const.ts +++ b/packages/app/src/Const.ts @@ -13,11 +13,6 @@ export const Day = Hour * 24; */ export const ApiHost = "https://api.snort.social"; -/** - * LibreTranslate endpoint - */ -export const TranslateHost = "https://translate.snort.social"; - /** * Void.cat file upload service url */ diff --git a/packages/app/src/Element/Event/NoteContextMenu.tsx b/packages/app/src/Element/Event/NoteContextMenu.tsx index 645690f8..be908fa4 100644 --- a/packages/app/src/Element/Event/NoteContextMenu.tsx +++ b/packages/app/src/Element/Event/NoteContextMenu.tsx @@ -3,7 +3,6 @@ import { FormattedMessage, useIntl } from "react-intl"; import { HexKey, Lists, NostrLink, TaggedNostrEvent } from "@snort/system"; import { Menu, MenuItem } from "@szhsin/react-menu"; -import { TranslateHost } from "Const"; import Icon from "Icons/Icon"; import { setPinned, setBookmarked } from "Login"; import messages from "Element/messages"; @@ -11,6 +10,7 @@ import useLogin from "Hooks/useLogin"; import useModeration from "Hooks/useModeration"; import useEventPublisher from "Hooks/useEventPublisher"; import { ReBroadcaster } from "../ReBroadcaster"; +import SnortApi from "External/SnortApi"; export interface NoteTranslation { text: string; @@ -58,25 +58,18 @@ export function NoteContextMenu({ ev, ...props }: NosteContextMenuProps) { } async function translate() { - const res = await fetch(`${TranslateHost}/translate`, { - method: "POST", - body: JSON.stringify({ - q: ev.content, - source: "auto", - target: lang.split("-")[0], - }), - headers: { "Content-Type": "application/json" }, + const api = new SnortApi(); + const result = await api.translate({ + text: [ev.content], + target_lang: lang.split("-")[0].toUpperCase(), }); - if (res.ok) { - const result = await res.json(); - if (typeof props.onTranslated === "function" && result) { - props.onTranslated({ - text: result.translatedText, - fromLanguage: langNames.of(result.detectedLanguage.language), - confidence: result.detectedLanguage.confidence, - } as NoteTranslation); - } + if (typeof props.onTranslated === "function" && result.translations.length > 0) { + props.onTranslated({ + text: result.translations[0].text, + fromLanguage: langNames.of(result.translations[0].detected_source_language), + confidence: 1, + } as NoteTranslation); } } diff --git a/packages/app/src/Element/Event/NoteInner.tsx b/packages/app/src/Element/Event/NoteInner.tsx index b3cd255a..3311cc57 100644 --- a/packages/app/src/Element/Event/NoteInner.tsx +++ b/packages/app/src/Element/Event/NoteInner.tsx @@ -246,7 +246,9 @@ export function NoteInner(props: NoteProps) {

- {translated.text} +
+
{translated.text}
+
); } else if (translated) { diff --git a/packages/app/src/External/SnortApi.ts b/packages/app/src/External/SnortApi.ts index a89f7759..04ad5335 100644 --- a/packages/app/src/External/SnortApi.ts +++ b/packages/app/src/External/SnortApi.ts @@ -55,6 +55,18 @@ export interface PushNotifications { scope: string; } +export interface TranslationRequest { + text: Array; + target_lang: string; +} + +export interface TranslationResponse { + translations: Array<{ + detected_source_language: string; + text: string; + }>; +} + export default class SnortApi { #url: string; #publisher?: EventPublisher; @@ -104,6 +116,10 @@ export default class SnortApi { return this.#getJsonAuthd("api/v1/notifications/register", "POST", sub); } + translate(tx: TranslationRequest) { + return this.#getJson("api/v1/translate", "POST", tx); + } + async #getJsonAuthd( path: string, method?: "GET" | string,