import React, { useEffect, useState } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; import { translateStatus, undoStatusTranslation } from 'soapbox/actions/statuses'; import { useAppDispatch, useAppSelector, useFeatures, useInstance, useSettings } from 'soapbox/hooks'; import { HStack, Icon, Stack, Text } from './ui'; import type { Status } from 'soapbox/types/entities'; interface ITranslateButton { status: Status; } const TranslateButton: React.FC = ({ status }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const features = useFeatures(); const instance = useInstance(); const settings = useSettings(); const [autoTranslating, setAutoTranslating] = useState(false); const autoTranslate = settings.autoTranslate; const knownLanguages = autoTranslate ? [...settings.knownLanguages, intl.locale] : [intl.locale]; const me = useAppSelector((state) => state.me); const { allow_remote: allowRemote, allow_unauthenticated: allowUnauthenticated, source_languages: sourceLanguages, target_languages: targetLanguages, } = instance.pleroma.metadata.translation; const renderTranslate = (me || allowUnauthenticated) && (allowRemote || status.account.local) && ['public', 'unlisted'].includes(status.visibility) && status.contentHtml.length > 0 && status.language !== null && intl.locale !== status.language && !status.contentMapHtml?.has(intl.locale); const supportsLanguages = (!sourceLanguages || sourceLanguages.includes(status.language!)) && (!targetLanguages || targetLanguages.includes(intl.locale)); const handleTranslate: React.MouseEventHandler = (e) => { e.stopPropagation(); if (status.translation) { dispatch(undoStatusTranslation(status.id)); } else { dispatch(translateStatus(status.id, intl.locale)); } }; useEffect(() => { if (settings.autoTranslate && features.translations && renderTranslate && supportsLanguages && status.translation !== false && !knownLanguages.includes(status.language)) { setAutoTranslating(true); dispatch(translateStatus(status.id, intl.locale, true)); } }, []); if (!features.translations || !renderTranslate || !supportsLanguages || status.translation === false) return null; if (settings.autoTranslate && !status.translating) return null; const button = ( ); if (status.translation) { if (autoTranslating) return null; const languageNames = new Intl.DisplayNames([intl.locale], { type: 'language' }); const languageName = languageNames.of(status.language!); const provider = status.translation.get('provider'); return ( {button} ); } return button; }; export { TranslateButton as default };