diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 34a9dda49..8664320ab 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -39,7 +39,18 @@ import { IconButton } from './icon_button'; const domParser = new DOMParser(); -export const textForScreenReader = (intl, status, rebloggedByText = false) => { +const messages = defineMessages({ + public_short: { id: 'privacy.public.short', defaultMessage: 'Public' }, + unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Quiet public' }, + private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' }, + direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' }, + edited: { id: 'status.edited', defaultMessage: 'Edited {date}' }, + quote_noun: { id: 'status.quote_noun', defaultMessage: 'Quote', description: 'Quote as a noun' }, + contains_quote: { id: 'status.contains_quote', defaultMessage: 'Contains quote' }, + quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' }, +}); + +export const textForScreenReader = ({intl, status, rebloggedByText = false, isQuote = false}) => { const displayName = status.getIn(['account', 'display_name']); const spoilerText = status.getIn(['translation', 'spoiler_text']) || status.get('spoiler_text'); @@ -47,15 +58,14 @@ export const textForScreenReader = (intl, status, rebloggedByText = false) => { const contentText = domParser.parseFromString(contentHtml, 'text/html').documentElement.textContent; const values = [ + isQuote ? intl.formatMessage(messages.quote_noun) : undefined, displayName.length === 0 ? status.getIn(['account', 'acct']).split('@')[0] : displayName, spoilerText && status.get('hidden') ? spoilerText : contentText, + !!status.get('quote') ? intl.formatMessage(messages.contains_quote) : undefined, intl.formatDate(status.get('created_at'), { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }), status.getIn(['account', 'acct']), - ]; - - if (rebloggedByText) { - values.push(rebloggedByText); - } + rebloggedByText, + ].filter(val => !!val); return values.join(', '); }; @@ -72,15 +82,6 @@ export const defaultMediaVisibility = (status) => { return !status.get('matched_media_filters') && (displayMedia !== 'hide_all' && !status.get('sensitive') || displayMedia === 'show_all'); }; -const messages = defineMessages({ - public_short: { id: 'privacy.public.short', defaultMessage: 'Public' }, - unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Quiet public' }, - private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' }, - direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' }, - edited: { id: 'status.edited', defaultMessage: 'Edited {date}' }, - quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' }, -}); - class Status extends ImmutablePureComponent { static contextType = SensitiveMediaContext; @@ -554,7 +555,7 @@ class Status extends ImmutablePureComponent { return ( -
+
{!skipPrepend && prepend}
-
+