From 6d5b7df0ac52349f0260964e23614f1b2d4733b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 11 Dec 2025 14:15:40 +0100 Subject: [PATCH] pl-fe: cleanup translation code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../pl-fe/src/components/translate-button.tsx | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/pl-fe/src/components/translate-button.tsx b/packages/pl-fe/src/components/translate-button.tsx index da907e7cd..e072b6366 100644 --- a/packages/pl-fe/src/components/translate-button.tsx +++ b/packages/pl-fe/src/components/translate-button.tsx @@ -12,8 +12,31 @@ import { useStatusTranslation } from 'pl-fe/queries/statuses/use-status-translat import { useSettings } from 'pl-fe/stores/settings'; import { useStatusMeta, useStatusMetaActions } from 'pl-fe/stores/status-meta'; +import type { Instance } from 'pl-api'; import type { Status } from 'pl-fe/normalizers/status'; +const canRemoteTranslate = (status: ITranslateButton['status'], instance: Instance, supportedLanguages: Record>, locale: string, isLoggedIn?: boolean) => { + const { + allow_remote: allowRemote, + allow_unauthenticated: allowUnauthenticated, + } = instance.pleroma.metadata.translation; + + if (status.content.length > 0) return false; + + // TODO: support language detection + if (status.language === null || locale === status.language || status.content_map?.[locale]) return false; + + if (!['public', 'unlisted'].includes(status.visibility)) return false; + + if (!isLoggedIn && !allowUnauthenticated) return false; + + if (!status.account.local && !allowRemote) return false; + + if (!supportedLanguages[status.language!]?.includes(locale)) return false; + + return true; +}; + interface ITranslateButton { status: Pick; } @@ -33,14 +56,7 @@ const TranslateButton: React.FC = ({ status }) => { const translationQuery = useStatusTranslation(status.id, targetLanguage); - const { - allow_remote: allowRemote, - allow_unauthenticated: allowUnauthenticated, - } = instance.pleroma.metadata.translation; - - const renderTranslate = (me || allowUnauthenticated) && (allowRemote || status.account.local) && ['public', 'unlisted'].includes(status.visibility) && status.content.length > 0 && status.language !== null && intl.locale !== status.language && !status.content_map?.[intl.locale]; - - const supportsLanguages = (translationLanguages[status.language!]?.includes(intl.locale)); + const remoteTranslate = features.translations && canRemoteTranslate(status, instance, translationLanguages, intl.locale, !!me); const handleTranslate: React.MouseEventHandler = (e) => { e.stopPropagation(); @@ -53,12 +69,12 @@ const TranslateButton: React.FC = ({ status }) => { }; useEffect(() => { - if (translationQuery.data === undefined && settings.autoTranslate && features.translations && renderTranslate && supportsLanguages && translationQuery.data !== false && status.language !== null && !knownLanguages.includes(status.language)) { + if (translationQuery.data === undefined && settings.autoTranslate && remoteTranslate && status.language !== null && !knownLanguages.includes(status.language)) { fetchTranslation(status.id, intl.locale); } }, []); - if (!features.translations || !renderTranslate || !supportsLanguages || translationQuery.data === false) return null; + if (!remoteTranslate || translationQuery.data === false) return null; const button = (