Merge commit 'ac59772dc6cda646258e61debfd792f9057c1c39' into glitch-soc/merge-upstream

Conflicts:
- `app/controllers/api/v1/statuses_controller.rb`:
  Conflict because upstream added a parameter where glitch-soc had an extra one.
  Added upstream's parameter while keeping glitch-soc's.
- `app/serializers/activitypub/note_serializer.rb`:
  Conflict because upstream added an extension where glitch-soc had an extra one.
  Added upstream's extension while keeping glitch-soc's.
- `app/services/update_status_service.rb`:
  Conflict because upstream added a parameter where glitch-soc had an extra one.
  Added upstream's parameter while keeping glitch-soc's.
This commit is contained in:
Claire committed 2025-08-06 22:02:55 +02:00
commit 235037a3b2
59 files changed
+444 -57

No files matched your search

@@ -1 +1,3 @@
Images in this folder are based on [Tabler.io icons](https://tabler.io/icons).
Seems to be 1.5 width icons scaled to 64×64px and centered above a blue square with round corners (24px).
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,4 +1,8 @@
import { apiReblog, apiUnreblog } from 'mastodon/api/interactions';
import {
apiReblog,
apiUnreblog,
apiRevokeQuote,
} from 'mastodon/api/interactions';
import type { StatusVisibility } from 'mastodon/models/status';
import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
@@ -33,3 +37,19 @@ export const unreblog = createDataLoadingThunk(
return discardLoadData;
},
);
export const revokeQuote = createDataLoadingThunk(
'status/revoke_quote',
({
statusId,
quotedStatusId,
}: {
statusId: string;
quotedStatusId: string;
}) => apiRevokeQuote(quotedStatusId, statusId),
(data, { dispatch, discardLoadData }) => {
dispatch(importFetchedStatus(data));
return discardLoadData;
},
);
@@ -31,7 +31,9 @@ import { NOTIFICATIONS_FILTER_SET } from './notifications';
import { saveSettings } from './settings';
function excludeAllTypesExcept(filter: string) {
return allNotificationTypes.filter((item) => item !== filter);
return allNotificationTypes.filter(
(item) => item !== filter && !(item === 'quote' && filter === 'mention'),
);
}
function getExcludedTypes(state: RootState) {
@@ -156,12 +158,15 @@ export const processNewNotificationForGroups = createAppAsyncThunk(
const showInColumn =
activeFilter === 'all'
? notificationShows[notification.type] !== false
: activeFilter === notification.type;
: activeFilter === notification.type ||
(activeFilter === 'mention' && notification.type === 'quote');
if (!showInColumn) return;
if (
(notification.type === 'mention' || notification.type === 'update') &&
(notification.type === 'mention' ||
notification.type === 'update' ||
notification.type === 'quote') &&
notification.status?.filtered
) {
const filters = notification.status.filtered.filter((result) =>
@@ -31,7 +31,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
let filtered = false;
if (['mention', 'status'].includes(notification.type) && notification.status.filtered) {
if (['mention', 'status', 'quote'].includes(notification.type) && notification.status.filtered) {
const filters = notification.status.filtered.filter(result => result.filter.context.includes('notifications'));
if (filters.some(result => result.filter.filter_action === 'hide')) {
@@ -8,3 +8,8 @@ export const apiReblog = (statusId: string, visibility: StatusVisibility) =>
export const apiUnreblog = (statusId: string) =>
apiRequestPost<Status>(`v1/statuses/${statusId}/unreblog`);
export const apiRevokeQuote = (quotedStatusId: string, statusId: string) =>
apiRequestPost<Status>(
`v1/statuses/${quotedStatusId}/quotes/${statusId}/revoke`,
);
@@ -67,21 +67,28 @@ const messages = defineMessages({
unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
filter: { id: 'status.filter', defaultMessage: 'Filter this post' },
openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
revokeQuote: { id: 'status.revoke_quote', defaultMessage: 'Remove my post from @{name}’s post' },
});
const mapStateToProps = (state, { status }) => ({
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
});
const mapStateToProps = (state, { status }) => {
const quotedStatusId = status.getIn(['quote', 'quoted_status']);
return ({
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
quotedAccountId: quotedStatusId ? state.getIn(['statuses', quotedStatusId, 'account']) : null,
});
};
class StatusActionBar extends ImmutablePureComponent {
static propTypes = {
identity: identityContextPropShape,
status: ImmutablePropTypes.map.isRequired,
relationship: ImmutablePropTypes.record,
quotedAccountId: ImmutablePropTypes.string,
onReply: PropTypes.func,
onFavourite: PropTypes.func,
onReblog: PropTypes.func,
onDelete: PropTypes.func,
onRevokeQuote: PropTypes.func,
onDirect: PropTypes.func,
onMention: PropTypes.func,
onMute: PropTypes.func,
@@ -110,6 +117,7 @@ class StatusActionBar extends ImmutablePureComponent {
updateOnProps = [
'status',
'relationship',
'quotedAccountId',
'withDismiss',
];
@@ -190,6 +198,10 @@ class StatusActionBar extends ImmutablePureComponent {
}
};
handleRevokeQuoteClick = () => {
this.props.onRevokeQuote(this.props.status);
}
handleBlockClick = () => {
const { status, relationship, onBlock, onUnblock } = this.props;
const account = status.get('account');
@@ -241,7 +253,7 @@ class StatusActionBar extends ImmutablePureComponent {
};
render () {
const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props;
const { status, relationship, quotedAccountId, intl, withDismiss, withCounters, scrollKey } = this.props;
const { signedIn, permissions } = this.props.identity;
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
@@ -291,6 +303,10 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.handleDirectClick });
menu.push(null);
if (quotedAccountId === me) {
menu.push({ text: intl.formatMessage(messages.revokeQuote, { name: account.get('username') }), action: this.handleRevokeQuoteClick, dangerous: true });
}
if (relationship && relationship.get('muting')) {
menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });
} else {
@@ -111,6 +111,10 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
}
},
onRevokeQuote (status) {
dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }}));
},
onEdit (status) {
dispatch((_, getState) => {
let state = getState();
@@ -143,6 +143,17 @@ class ColumnSettings extends PureComponent {
</div>
</section>
<section role='group' aria-labelledby='notifications-quote'>
<h3 id='notifications-quote'><FormattedMessage id='notifications.column_settings.quote' defaultMessage='Quotes:' /></h3>
<div className='column-settings__row'>
<SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'quote']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'quote']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'quote']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'quote']} onChange={onChange} label={soundStr} />
</div>
</section>
<section role='group' aria-labelledby='notifications-poll'>
<h3 id='notifications-poll'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></h3>
@@ -61,22 +61,29 @@ const messages = defineMessages({
unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
revokeQuote: { id: 'status.revoke_quote', defaultMessage: 'Remove my post from @{name}’s post' },
});
const mapStateToProps = (state, { status }) => ({
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
});
const mapStateToProps = (state, { status }) => {
const quotedStatusId = status.getIn(['quote', 'quoted_status']);
return ({
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
quotedAccountId: quotedStatusId ? state.getIn(['statuses', quotedStatusId, 'account']) : null,
});
};
class ActionBar extends PureComponent {
static propTypes = {
identity: identityContextPropShape,
status: ImmutablePropTypes.map.isRequired,
relationship: ImmutablePropTypes.record,
quotedAccountId: ImmutablePropTypes.string,
onReply: PropTypes.func.isRequired,
onReblog: PropTypes.func.isRequired,
onFavourite: PropTypes.func.isRequired,
onBookmark: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
onRevokeQuote: PropTypes.func,
onEdit: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
@@ -113,6 +120,10 @@ class ActionBar extends PureComponent {
this.props.onDelete(this.props.status);
};
handleRevokeQuoteClick = () => {
this.props.onRevokeQuote(this.props.status);
}
handleRedraftClick = () => {
this.props.onDelete(this.props.status, true);
};
@@ -193,7 +204,7 @@ class ActionBar extends PureComponent {
};
render () {
const { status, relationship, intl } = this.props;
const { status, relationship, quotedAccountId, intl } = this.props;
const { signedIn, permissions } = this.props.identity;
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
@@ -237,6 +248,10 @@ class ActionBar extends PureComponent {
menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
menu.push(null);
if (quotedAccountId === me) {
menu.push({ text: intl.formatMessage(messages.revokeQuote, { name: account.get('username') }), action: this.handleRevokeQuoteClick, dangerous: true });
}
if (relationship && relationship.get('muting')) {
menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });
} else {
@@ -259,6 +259,12 @@ class Status extends ImmutablePureComponent {
}
};
handleRevokeQuoteClick = (status) => {
const { dispatch } = this.props;
dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }}));
};
handleEditClick = (status) => {
const { dispatch, askReplyConfirmation } = this.props;
@@ -635,6 +641,7 @@ class Status extends ImmutablePureComponent {
onReblog={this.handleReblogClick}
onBookmark={this.handleBookmarkClick}
onDelete={this.handleDeleteClick}
onRevokeQuote={this.handleRevokeQuoteClick}
onEdit={this.handleEditClick}
onDirect={this.handleDirectClick}
onMention={this.handleMentionClick}
@@ -10,3 +10,4 @@ export { ConfirmClearNotificationsModal } from './clear_notifications';
export { ConfirmLogOutModal } from './log_out';
export { ConfirmFollowToListModal } from './follow_to_list';
export { ConfirmMissingAltTextModal } from './missing_alt_text';
export { ConfirmRevokeQuoteModal } from './revoke_quote';
@@ -0,0 +1,48 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { revokeQuote } from 'mastodon/actions/interactions_typed';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
revokeQuoteTitle: {
id: 'confirmations.revoke_quote.title',
defaultMessage: 'Remove post?',
},
revokeQuoteMessage: {
id: 'confirmations.revoke_quote.message',
defaultMessage: 'This action cannot be undone.',
},
revokeQuoteConfirm: {
id: 'confirmations.revoke_quote.confirm',
defaultMessage: 'Remove post',
},
});
export const ConfirmRevokeQuoteModal: React.FC<
{
statusId: string;
quotedStatusId: string;
} & BaseConfirmationModalProps
> = ({ statusId, quotedStatusId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
void dispatch(revokeQuote({ quotedStatusId, statusId }));
}, [dispatch, statusId, quotedStatusId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.revokeQuoteTitle)}
message={intl.formatMessage(messages.revokeQuoteMessage)}
confirm={intl.formatMessage(messages.revokeQuoteConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};
@@ -37,6 +37,7 @@ import {
ConfirmLogOutModal,
ConfirmFollowToListModal,
ConfirmMissingAltTextModal,
ConfirmRevokeQuoteModal,
} from './confirmation_modals';
import { ImageModal } from './image_modal';
import MediaModal from './media_modal';
@@ -59,6 +60,7 @@ export const MODAL_COMPONENTS = {
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }),
'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }),
'CONFIRM_REVOKE_QUOTE': () => Promise.resolve({ default: ConfirmRevokeQuoteModal }),
'MUTE': MuteModal,
'BLOCK': BlockModal,
'DOMAIN_BLOCK': DomainBlockModal,
+2
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "Zmínka",
"notification.label.private_mention": "Soukromá zmínka",
"notification.label.private_reply": "Privátní odpověď",
"notification.label.quote": "{name} citovali váš příspěvek",
"notification.label.reply": "Odpověď",
"notification.mention": "Zmínka",
"notification.mentioned_you": "{name} vás zmínil",
@@ -657,6 +658,7 @@
"notifications.column_settings.mention": "Zmínky:",
"notifications.column_settings.poll": "Výsledky anket:",
"notifications.column_settings.push": "Push oznámení",
"notifications.column_settings.quote": "Citace:",
"notifications.column_settings.reblog": "Boosty:",
"notifications.column_settings.show": "Zobrazit ve sloupci",
"notifications.column_settings.sound": "Přehrát zvuk",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Omtaler:",
"notifications.column_settings.poll": "Afstemningsresultater:",
"notifications.column_settings.push": "Push-notifikationer",
"notifications.column_settings.quote": "Citater:",
"notifications.column_settings.reblog": "Fremhævelser:",
"notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Afspil lyd",
+2
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "Erwähnung",
"notification.label.private_mention": "Private Erwähnung",
"notification.label.private_reply": "Private Antwort",
"notification.label.quote": "{name} zitierte deinen Beitrag",
"notification.label.reply": "Antwort",
"notification.mention": "Erwähnung",
"notification.mentioned_you": "{name} erwähnte dich",
@@ -657,6 +658,7 @@
"notifications.column_settings.mention": "Erwähnungen:",
"notifications.column_settings.poll": "Umfrageergebnisse:",
"notifications.column_settings.push": "Push-Benachrichtigungen",
"notifications.column_settings.quote": "Zitate:",
"notifications.column_settings.reblog": "Geteilte Beiträge:",
"notifications.column_settings.show": "In dieser Spalte anzeigen",
"notifications.column_settings.sound": "Ton abspielen",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Επισημάνσεις:",
"notifications.column_settings.poll": "Αποτελέσματα δημοσκόπησης:",
"notifications.column_settings.push": "Ειδοποιήσεις Push",
"notifications.column_settings.quote": "Παραθέσεις:",
"notifications.column_settings.reblog": "Ενισχύσεις:",
"notifications.column_settings.show": "Εμφάνισε σε στήλη",
"notifications.column_settings.sound": "Αναπαραγωγή ήχου",
+5
View File
@@ -245,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Remove follower",
"confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?",
"confirmations.remove_from_followers.title": "Remove follower?",
"confirmations.revoke_quote.confirm": "Remove post",
"confirmations.revoke_quote.message": "This action cannot be undone.",
"confirmations.revoke_quote.title": "Remove post?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"confirmations.unfollow.title": "Unfollow user?",
@@ -658,6 +661,7 @@
"notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.poll": "Poll results:",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.quote": "Quotes:",
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
@@ -895,6 +899,7 @@
"status.reply": "Reply",
"status.replyAll": "Reply to thread",
"status.report": "Report @{name}",
"status.revoke_quote": "Remove my post from @{name}’s post",
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less_all": "Show less for all",
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Menciones:",
"notifications.column_settings.poll": "Resultados de la encuesta:",
"notifications.column_settings.push": "Notificaciones push",
"notifications.column_settings.quote": "Citas:",
"notifications.column_settings.reblog": "Adhesiones:",
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Menciones:",
"notifications.column_settings.poll": "Resultados de la votación:",
"notifications.column_settings.push": "Notificaciones push",
"notifications.column_settings.quote": "Citas:",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Menciones:",
"notifications.column_settings.poll": "Resultados de la votación:",
"notifications.column_settings.push": "Notificaciones push",
"notifications.column_settings.quote": "Citas:",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido",
+2
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "Maininta",
"notification.label.private_mention": "Yksityismaininta",
"notification.label.private_reply": "Yksityinen vastaus",
"notification.label.quote": "{name} lainasi julkaisuasi",
"notification.label.reply": "Vastaus",
"notification.mention": "Maininta",
"notification.mentioned_you": "{name} mainitsi sinut",
@@ -657,6 +658,7 @@
"notifications.column_settings.mention": "Maininnat:",
"notifications.column_settings.poll": "Äänestystulokset:",
"notifications.column_settings.push": "Puskuilmoitukset",
"notifications.column_settings.quote": "Lainaukset:",
"notifications.column_settings.reblog": "Tehostukset:",
"notifications.column_settings.show": "Näytä sarakkeessa",
"notifications.column_settings.sound": "Äänimerkki",
+1
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "Mención",
"notification.label.private_mention": "Mención privada",
"notification.label.private_reply": "Resposta privada",
"notification.label.quote": "{name} citou a túa publicación",
"notification.label.reply": "Resposta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} mencionoute",
+1
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "אזכור",
"notification.label.private_mention": "אזכור פרטי",
"notification.label.private_reply": "תשובה בפרטי",
"notification.label.quote": "{name} ציטט.ה את הודעתך",
"notification.label.reply": "תשובה",
"notification.mention": "אזכור",
"notification.mentioned_you": "אוזכרת על ידי {name}",
+2
View File
@@ -600,6 +600,7 @@
"notification.label.mention": "Minnst á",
"notification.label.private_mention": "Einkaspjall",
"notification.label.private_reply": "Einkasvar",
"notification.label.quote": "{name} vitnaði í færsluna þína",
"notification.label.reply": "Svara",
"notification.mention": "Minnst á",
"notification.mentioned_you": "{name} minntist á þig",
@@ -657,6 +658,7 @@
"notifications.column_settings.mention": "Tilvísanir:",
"notifications.column_settings.poll": "Niðurstöður könnunar:",
"notifications.column_settings.push": "Ýti-tilkynningar",
"notifications.column_settings.quote": "Tilvitnanir:",
"notifications.column_settings.reblog": "Endurbirtingar:",
"notifications.column_settings.show": "Sýna í dálki",
"notifications.column_settings.sound": "Spila hljóð",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Menzioni:",
"notifications.column_settings.poll": "Risultati del sondaggio:",
"notifications.column_settings.push": "Notifiche push",
"notifications.column_settings.quote": "Citazioni:",
"notifications.column_settings.reblog": "Reblog:",
"notifications.column_settings.show": "Mostra nella colonna",
"notifications.column_settings.sound": "Riproduci suono",
+8
View File
@@ -34,6 +34,7 @@
"account.followers": "Imeḍfaren",
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
"account.followers_counter": "{count, plural, one {{counter} n umḍfar} other {{counter} n yimeḍfaren}}",
"account.followers_you_know_counter": "Tessneḍ {counter}",
"account.following": "Yeṭṭafaṛ",
"account.following_counter": "{count, plural, one {{counter} yettwaḍfaren} other {{counter} yettwaḍfaren}}",
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
@@ -51,10 +52,12 @@
"account.mute_notifications_short": "Susem ilɣa",
"account.mute_short": "Sgugem",
"account.muted": "Yettwasgugem",
"account.mutual": "Temmeḍfaṛem",
"account.no_bio": "Ulac aglam i d-yettunefken.",
"account.open_original_page": "Ldi asebter anasli",
"account.posts": "Tisuffaɣ",
"account.posts_with_replies": "Tisuffaɣ d tririyin",
"account.remove_from_followers": "Kkes {name} seg ineḍfaren",
"account.report": "Cetki ɣef @{name}",
"account.requested": "Di laɛḍil ad yettwaqbel. Ssit i wakken ad yefsex usuter n uḍfar",
"account.requested_follow": "{name} yessuter ad k·m-yeḍfer",
@@ -85,6 +88,7 @@
"annual_report.summary.most_used_app.most_used_app": "asnas yettwasqedcen s waṭas",
"annual_report.summary.most_used_hashtag.none": "Ula yiwen",
"annual_report.summary.new_posts.new_posts": "tisuffaɣ timaynutin",
"annual_report.summary.thanks": "Tanemmirt imi i tettekkiḍ deg Mastodon!",
"audio.hide": "Ffer amesli",
"block_modal.show_less": "Ssken-d drus",
"block_modal.show_more": "Ssken-d ugar",
@@ -352,6 +356,8 @@
"keyboard_shortcuts.toot": "i wakken attebdud tajewwaqt tamaynut",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "i tulin ɣer d asawen n tebdart",
"learn_more_link.got_it": "Gziɣ-t",
"learn_more_link.learn_more": "Issin ugar",
"lightbox.close": "Mdel",
"lightbox.next": "Ɣer zdat",
"lightbox.previous": "Ɣer deffir",
@@ -417,6 +423,8 @@
"notification.admin.sign_up": "Ijerred {name}",
"notification.annual_report.view": "Wali #Wrapstodon",
"notification.favourite": "{name} yesmenyaf addad-ik·im",
"notification.favourite_pm": "{name} yesmenyef abdar-ik·im uslig",
"notification.favourite_pm.name_and_others_with_link": "{name} akked <a>{count, plural, one {# nnayeḍ} other {# nniḍen}}</a> rnan abdar-ik·im uslig ar ismenyafen-nsen",
"notification.follow": "iṭṭafar-ik·em-id {name}",
"notification.follow.name_and_others": "{name} akked <a>{count, plural, one {# nniḍen} other {# nniḍen}}</a> iḍfeṛ-k·m-id",
"notification.follow_request": "{name} yessuter-d ad k·m-yeḍfeṛ",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Vermeldingen:",
"notifications.column_settings.poll": "Peilingresultaten:",
"notifications.column_settings.push": "Pushmeldingen",
"notifications.column_settings.quote": "Citaten:",
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen",
@@ -498,6 +498,8 @@
"keyboard_shortcuts.translate": "traduzir uma publicação",
"keyboard_shortcuts.unfocus": "remover o foco da área de texto / pesquisa",
"keyboard_shortcuts.up": "mover para cima na lista",
"learn_more_link.got_it": "Entendido",
"learn_more_link.learn_more": "Saber mais",
"lightbox.close": "Fechar",
"lightbox.next": "Próximo",
"lightbox.previous": "Anterior",
@@ -598,6 +600,7 @@
"notification.label.mention": "Menção",
"notification.label.private_mention": "Menção privada",
"notification.label.private_reply": "Resposta privada",
"notification.label.quote": "{name} citou a sua publicação",
"notification.label.reply": "Resposta",
"notification.mention": "Menção",
"notification.mentioned_you": "{name} mencionou-te",
@@ -655,6 +658,7 @@
"notifications.column_settings.mention": "Menções:",
"notifications.column_settings.poll": "Resultados da sondagem:",
"notifications.column_settings.push": "Notificações \"push\"",
"notifications.column_settings.quote": "Citações:",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostrar na coluna",
"notifications.column_settings.sound": "Reproduzir som",
@@ -873,6 +877,11 @@
"status.open": "Expandir esta publicação",
"status.pin": "Afixar no perfil",
"status.quote_error.filtered": "Oculto devido a um dos seus filtros",
"status.quote_error.not_available": "Publicação indisponível",
"status.quote_error.pending_approval": "Publicação pendente",
"status.quote_error.pending_approval_popout.body": "As citações partilhadas no Fediverso podem demorar algum tempo a ser exibidas, uma vez que diferentes servidores têm protocolos diferentes.",
"status.quote_error.pending_approval_popout.title": "Citação pendente? Mantenha a calma",
"status.quote_post_author": "Citou uma publicação de @{name}",
"status.read_more": "Ler mais",
"status.reblog": "Impulsionar",
"status.reblog_private": "Impulsionar com a visibilidade original",
+1
View File
@@ -321,6 +321,7 @@
"explore.trending_links": "Новини",
"explore.trending_statuses": "Дописи",
"explore.trending_tags": "Хештеґи",
"featured_carousel.next": "Далі",
"filter_modal.added.context_mismatch_explanation": "Ця категорія фільтра не застосовується до контексту, в якому ви отримали доступ до цього допису. Якщо ви хочете, щоб дописи також фільтрувалися за цим контекстом, вам доведеться редагувати фільтр.",
"filter_modal.added.context_mismatch_title": "Невідповідність контексту!",
"filter_modal.added.expired_explanation": "Категорія цього фільтра застаріла, Вам потрібно змінити дату закінчення терміну дії, щоб застосувати її.",
+1
View File
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Lượt nhắc đến:",
"notifications.column_settings.poll": "Kết quả vốt:",
"notifications.column_settings.push": "Thông báo đẩy",
"notifications.column_settings.quote": "Trích dẫn:",
"notifications.column_settings.reblog": "Lượt đăng lại:",
"notifications.column_settings.show": "Báo trên thanh bên",
"notifications.column_settings.sound": "Kèm âm báo",
@@ -658,6 +658,7 @@
"notifications.column_settings.mention": "提及:",
"notifications.column_settings.poll": "投票結果:",
"notifications.column_settings.push": "推播通知",
"notifications.column_settings.quote": "引用嘟文:",
"notifications.column_settings.reblog": "轉嘟:",
"notifications.column_settings.show": "於欄位中顯示",
"notifications.column_settings.sound": "播放音效",
@@ -36,6 +36,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: false,
reblog: false,
quote: false,
mention: false,
poll: false,
status: false,
@@ -59,6 +60,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: true,
reblog: true,
quote: true,
mention: true,
poll: true,
status: true,
@@ -72,6 +74,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: true,
reblog: true,
quote: true,
mention: true,
poll: true,
status: true,
@@ -26,7 +26,10 @@ const filterNotificationsByAllowedTypes = (
);
}
return notifications.filter(
(item) => item.type === 'gap' || allowedType === item.type,
(item) =>
item.type === 'gap' ||
allowedType === item.type ||
(allowedType === 'mention' && item.type === 'quote'),
);
};