Merge pull request #2798 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes up to dd53792714
This commit is contained in:
Claire 2024-07-27 18:20:23 +02:00 committed by GitHub
commit e79b2a742c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
182 changed files with 2237 additions and 1778 deletions

View file

@ -1,3 +1,5 @@
import { createAction } from '@reduxjs/toolkit';
import { import {
apiGetNotificationPolicy, apiGetNotificationPolicy,
apiUpdateNotificationsPolicy, apiUpdateNotificationsPolicy,
@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk(
'notificationPolicy/update', 'notificationPolicy/update',
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy), (policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
); );
export const decreasePendingNotificationsCount = createAction<number>(
'notificationPolicy/decreasePendingNotificationCount',
);

View file

@ -18,6 +18,7 @@ import {
importFetchedStatuses, importFetchedStatuses,
} from './importer'; } from './importer';
import { submitMarkers } from './markers'; import { submitMarkers } from './markers';
import { decreasePendingNotificationsCount } from './notification_policies';
import { notificationsUpdate } from "./notifications_typed"; import { notificationsUpdate } from "./notifications_typed";
import { register as registerPushNotifications } from './push_notifications'; import { register as registerPushNotifications } from './push_notifications';
import { saveSettings } from './settings'; import { saveSettings } from './settings';
@ -96,6 +97,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => {
} }
}; };
const selectNotificationCountForRequest = (state, id) => {
const requests = state.getIn(['notificationRequests', 'items']);
const thisRequest = requests.find(request => request.get('id') === id);
return thisRequest ? thisRequest.get('notifications_count') : 0;
};
export const loadPending = () => ({ export const loadPending = () => ({
type: NOTIFICATIONS_LOAD_PENDING, type: NOTIFICATIONS_LOAD_PENDING,
}); });
@ -521,11 +528,13 @@ export const fetchNotificationRequestFail = (id, error) => ({
error, error,
}); });
export const acceptNotificationRequest = id => (dispatch) => { export const acceptNotificationRequest = (id) => (dispatch, getState) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(acceptNotificationRequestRequest(id)); dispatch(acceptNotificationRequestRequest(id));
api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => {
dispatch(acceptNotificationRequestSuccess(id)); dispatch(acceptNotificationRequestSuccess(id));
dispatch(decreasePendingNotificationsCount(count));
}).catch(err => { }).catch(err => {
dispatch(acceptNotificationRequestFail(id, err)); dispatch(acceptNotificationRequestFail(id, err));
}); });
@ -547,11 +556,13 @@ export const acceptNotificationRequestFail = (id, error) => ({
error, error,
}); });
export const dismissNotificationRequest = id => (dispatch) => { export const dismissNotificationRequest = (id) => (dispatch, getState) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(dismissNotificationRequestRequest(id)); dispatch(dismissNotificationRequestRequest(id));
api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{
dispatch(dismissNotificationRequestSuccess(id)); dispatch(dismissNotificationRequestSuccess(id));
dispatch(decreasePendingNotificationsCount(count));
}).catch(err => { }).catch(err => {
dispatch(dismissNotificationRequestFail(id, err)); dispatch(dismissNotificationRequestFail(id, err));
}); });

View file

@ -3,6 +3,8 @@ import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl'; import { defineMessages, useIntl } from 'react-intl';
import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react';
import { unblockDomain } from 'flavours/glitch/actions/domain_blocks';
import { useAppDispatch } from 'flavours/glitch/store';
import { IconButton } from './icon_button'; import { IconButton } from './icon_button';
@ -13,17 +15,15 @@ const messages = defineMessages({
}, },
}); });
interface Props { export const Domain: React.FC<{
domain: string; domain: string;
onUnblockDomain: (domain: string) => void; }> = ({ domain }) => {
}
export const Domain: React.FC<Props> = ({ domain, onUnblockDomain }) => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch();
const handleDomainUnblock = useCallback(() => { const handleDomainUnblock = useCallback(() => {
onUnblockDomain(domain); dispatch(unblockDomain(domain));
}, [domain, onUnblockDomain]); }, [dispatch, domain]);
return ( return (
<div className='domain'> <div className='domain'>

View file

@ -1,12 +1,11 @@
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; import { useIntl, defineMessages } from 'react-intl';
import { useIdentity } from '@/flavours/glitch/identity_context'; import { useIdentity } from '@/flavours/glitch/identity_context';
import { import {
fetchRelationships, fetchRelationships,
followAccount, followAccount,
unfollowAccount,
} from 'flavours/glitch/actions/accounts'; } from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import { Button } from 'flavours/glitch/components/button'; import { Button } from 'flavours/glitch/components/button';
@ -59,29 +58,14 @@ export const FollowButton: React.FC<{
if (accountId === me) { if (accountId === me) {
return; return;
} else if (relationship.following || relationship.requested) { } else if (account && (relationship.following || relationship.requested)) {
dispatch( dispatch(
openModal({ openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }),
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account?.acct}</strong> }}
/>
),
confirm: intl.formatMessage(messages.unfollow),
onConfirm: () => {
dispatch(unfollowAccount(accountId));
},
},
}),
); );
} else { } else {
dispatch(followAccount(accountId)); dispatch(followAccount(accountId));
} }
}, [dispatch, intl, accountId, relationship, account, signedIn]); }, [dispatch, accountId, relationship, account, signedIn]);
let label; let label;

View file

@ -1,24 +1,20 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { openModal } from 'flavours/glitch/actions/modal';
import { import {
followAccount, followAccount,
unfollowAccount,
blockAccount, blockAccount,
unblockAccount, unblockAccount,
muteAccount, muteAccount,
unmuteAccount, unmuteAccount,
} from '../actions/accounts'; } from '../actions/accounts';
import { openModal } from '../actions/modal';
import { initMuteModal } from '../actions/mutes'; import { initMuteModal } from '../actions/mutes';
import Account from '../components/account'; import Account from '../components/account';
import { makeGetAccount } from '../selectors'; import { makeGetAccount } from '../selectors';
const messages = defineMessages({
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
@ -29,18 +25,11 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onFollow (account) { onFollow (account) {
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }));
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
},
}));
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }

View file

@ -1,36 +0,0 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import { blockDomain, unblockDomain } from '../actions/domain_blocks';
import { openModal } from '../actions/modal';
import { Domain } from '../components/domain';
const messages = defineMessages({
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
});
const makeMapStateToProps = () => {
const mapStateToProps = () => ({});
return mapStateToProps;
};
const mapDispatchToProps = (dispatch, { intl }) => ({
onBlockDomain (domain) {
dispatch(openModal({
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,
confirm: intl.formatMessage(messages.blockDomainConfirm),
onConfirm: () => dispatch(blockDomain(domain)),
},
}));
},
onUnblockDomain (domain) {
dispatch(unblockDomain(domain));
},
});
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain));

View file

@ -1,5 +1,3 @@
import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initBlockModal } from 'flavours/glitch/actions/blocks';
@ -19,7 +17,6 @@ import {
pin, pin,
unpin, unpin,
} from 'flavours/glitch/actions/interactions'; } from 'flavours/glitch/actions/interactions';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture'; import { deployPictureInPicture } from 'flavours/glitch/actions/picture_in_picture';
@ -39,21 +36,6 @@ import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selector
import { showAlertForError } from '../actions/alerts'; import { showAlertForError } from '../actions/alerts';
const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' },
author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' },
matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' },
editFilter: { id: 'confirmations.unfilter.edit_filter', defaultMessage: 'Edit filter' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getStatus = makeGetStatus(); const getStatus = makeGetStatus();
const getPictureInPicture = makeGetPictureInPicture(); const getPictureInPicture = makeGetPictureInPicture();
@ -88,22 +70,14 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ const mapDispatchToProps = (dispatch, { contextType }) => ({
onReply (status) { onReply (status) {
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),
onConfirm: () => dispatch(replyCompose(status)),
},
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -148,14 +122,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}, },
@ -163,14 +130,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.editMessage),
confirm: intl.formatMessage(messages.editConfirm),
onConfirm: () => dispatch(editStatus(status.get('id'))),
},
}));
} else { } else {
dispatch(editStatus(status.get('id'))); dispatch(editStatus(status.get('id')));
} }
@ -257,4 +217,4 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
}); });
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status)); export default connect(makeMapStateToProps, mapDispatchToProps)(Status);

View file

@ -1,10 +1,9 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { import {
followAccount, followAccount,
unfollowAccount,
unblockAccount, unblockAccount,
unmuteAccount, unmuteAccount,
pinAccount, pinAccount,
@ -22,11 +21,6 @@ import { initReport } from '../../../actions/reports';
import { makeGetAccount, getAccountHidden } from '../../../selectors'; import { makeGetAccount, getAccountHidden } from '../../../selectors';
import Header from '../components/header'; import Header from '../components/header';
const messages = defineMessages({
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
@ -39,18 +33,11 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onFollow (account) { onFollow (account) {
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }));
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
},
}));
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }

View file

@ -7,7 +7,6 @@ import { useDispatch } from 'react-redux';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { logOut } from 'flavours/glitch/utils/log_out';
const messages = defineMessages({ const messages = defineMessages({
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
@ -23,8 +22,6 @@ const messages = defineMessages({
filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' },
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
}); });
export const ActionBar = () => { export const ActionBar = () => {
@ -32,16 +29,8 @@ export const ActionBar = () => {
const intl = useIntl(); const intl = useIntl();
const handleLogoutClick = useCallback(() => { const handleLogoutClick = useCallback(() => {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM', }, [dispatch]);
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, [dispatch, intl]);
let menu = []; let menu = [];

View file

@ -24,7 +24,6 @@ import { Icon } from 'flavours/glitch/components/icon';
import glitchedElephant1 from 'flavours/glitch/images/mbstobon-ui-0.png'; import glitchedElephant1 from 'flavours/glitch/images/mbstobon-ui-0.png';
import glitchedElephant2 from 'flavours/glitch/images/mbstobon-ui-1.png'; import glitchedElephant2 from 'flavours/glitch/images/mbstobon-ui-1.png';
import glitchedElephant3 from 'flavours/glitch/images/mbstobon-ui-2.png'; import glitchedElephant3 from 'flavours/glitch/images/mbstobon-ui-2.png';
import { logOut } from 'flavours/glitch/utils/log_out';
import elephantUIPlane from '../../../../images/elephant_ui_plane.svg'; import elephantUIPlane from '../../../../images/elephant_ui_plane.svg';
import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose'; import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose';
@ -45,8 +44,6 @@ const messages = defineMessages({
settings: { id: 'navigation_bar.app_settings', defaultMessage: 'App settings' }, settings: { id: 'navigation_bar.app_settings', defaultMessage: 'App settings' },
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' }, compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' },
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
}); });
const mapStateToProps = (state, ownProps) => ({ const mapStateToProps = (state, ownProps) => ({
@ -88,20 +85,12 @@ class Compose extends PureComponent {
} }
handleLogoutClick = e => { handleLogoutClick = e => {
const { dispatch, intl } = this.props; const { dispatch } = this.props;
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
return false; return false;
}; };

View file

@ -37,8 +37,6 @@ const messages = defineMessages({
delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' },
muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
}); });
const getAccounts = createSelector( const getAccounts = createSelector(
@ -121,19 +119,12 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status: lastStatus } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(lastStatus)),
},
}));
} else { } else {
dispatch(replyCompose(lastStatus)); dispatch(replyCompose(lastStatus));
} }
}); });
}, [dispatch, lastStatus, intl]); }, [dispatch, lastStatus]);
const handleDelete = useCallback(() => { const handleDelete = useCallback(() => {
dispatch(deleteConversation(id)); dispatch(deleteConversation(id));

View file

@ -7,7 +7,6 @@ import classNames from 'classnames';
import { import {
followAccount, followAccount,
unfollowAccount,
unblockAccount, unblockAccount,
unmuteAccount, unmuteAccount,
} from 'flavours/glitch/actions/accounts'; } from 'flavours/glitch/actions/accounts';
@ -29,20 +28,12 @@ const messages = defineMessages({
id: 'account.cancel_follow_request', id: 'account.cancel_follow_request',
defaultMessage: 'Withdraw follow request', defaultMessage: 'Withdraw follow request',
}, },
cancelFollowRequestConfirm: {
id: 'confirmations.cancel_follow_request.confirm',
defaultMessage: 'Withdraw request',
},
requested: { requested: {
id: 'account.requested', id: 'account.requested',
defaultMessage: 'Awaiting approval. Click to cancel follow request', defaultMessage: 'Awaiting approval. Click to cancel follow request',
}, },
unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' }, unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },
unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' }, unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },
unfollowConfirm: {
id: 'confirmations.unfollow.confirm',
defaultMessage: 'Unfollow',
},
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
}); });
@ -89,48 +80,17 @@ export const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => {
const handleFollow = useCallback(() => { const handleFollow = useCallback(() => {
if (!account) return; if (!account) return;
if (account.getIn(['relationship', 'following'])) { if (
account.getIn(['relationship', 'following']) ||
account.getIn(['relationship', 'requested'])
) {
dispatch( dispatch(
openModal({ openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }),
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account.get('acct')}</strong> }}
/>
),
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => {
dispatch(unfollowAccount(account.get('id')));
},
},
}),
);
} else if (account.getIn(['relationship', 'requested'])) {
dispatch(
openModal({
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.cancel_follow_request.message'
defaultMessage='Are you sure you want to withdraw your request to follow {name}?'
values={{ name: <strong>@{account.get('acct')}</strong> }}
/>
),
confirm: intl.formatMessage(messages.cancelFollowRequestConfirm),
onConfirm: () => {
dispatch(unfollowAccount(account.get('id')));
},
},
}),
); );
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }
}, [account, dispatch, intl]); }, [account, dispatch]);
const handleBlock = useCallback(() => { const handleBlock = useCallback(() => {
if (account?.relationship?.blocking) { if (account?.relationship?.blocking) {

View file

@ -11,16 +11,15 @@ import { connect } from 'react-redux';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react';
import { Domain } from 'flavours/glitch/components/domain';
import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';
import { LoadingIndicator } from '../../components/loading_indicator'; import { LoadingIndicator } from '../../components/loading_indicator';
import ScrollableList from '../../components/scrollable_list'; import ScrollableList from '../../components/scrollable_list';
import DomainContainer from '../../containers/domain_container';
import Column from '../ui/components/column'; import Column from '../ui/components/column';
const messages = defineMessages({ const messages = defineMessages({
heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' }, heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' },
unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },
}); });
const mapStateToProps = state => ({ const mapStateToProps = state => ({
@ -70,7 +69,7 @@ class Blocks extends ImmutablePureComponent {
bindToDocument={!multiColumn} bindToDocument={!multiColumn}
> >
{domains.map(domain => {domains.map(domain =>
<DomainContainer key={domain} domain={domain} />, <Domain key={domain} domain={domain} />,
)} )}
</ScrollableList> </ScrollableList>

View file

@ -15,7 +15,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';
import { fetchList, deleteList, updateList } from 'flavours/glitch/actions/lists'; import { fetchList, updateList } from 'flavours/glitch/actions/lists';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import { connectListStream } from 'flavours/glitch/actions/streaming'; import { connectListStream } from 'flavours/glitch/actions/streaming';
import { expandListTimeline } from 'flavours/glitch/actions/timelines'; import { expandListTimeline } from 'flavours/glitch/actions/timelines';
@ -29,8 +29,6 @@ import StatusListContainer from 'flavours/glitch/features/ui/containers/status_l
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
const messages = defineMessages({ const messages = defineMessages({
deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' },
deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' },
followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' }, followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' },
none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' }, none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' },
list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' }, list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' },
@ -125,25 +123,10 @@ class ListTimeline extends PureComponent {
}; };
handleDeleteClick = () => { handleDeleteClick = () => {
const { dispatch, columnId, intl } = this.props; const { dispatch, columnId } = this.props;
const { id } = this.props.params; const { id } = this.props.params;
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_LIST', modalProps: { listId: id, columnId } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.deleteMessage),
confirm: intl.formatMessage(messages.deleteConfirm),
onConfirm: () => {
dispatch(deleteList(id));
if (columnId) {
dispatch(removeColumn(columnId));
} else {
this.props.history.push('/lists');
}
},
},
}));
}; };
handleRepliesPolicyChange = ({ target }) => { handleRepliesPolicyChange = ({ target }) => {

View file

@ -2,11 +2,10 @@ import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { openModal } from 'flavours/glitch/actions/modal';
import { initializeNotifications } from 'flavours/glitch/actions/notifications_migration'; import { initializeNotifications } from 'flavours/glitch/actions/notifications_migration';
import { showAlert } from '../../../actions/alerts'; import { showAlert } from '../../../actions/alerts';
import { openModal } from '../../../actions/modal';
import { clearNotifications } from '../../../actions/notification_groups';
import { updateNotificationsPolicy } from '../../../actions/notification_policies'; import { updateNotificationsPolicy } from '../../../actions/notification_policies';
import { setFilter, requestBrowserPermission } from '../../../actions/notifications'; import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
@ -14,8 +13,6 @@ import { changeSetting } from '../../../actions/settings';
import ColumnSettings from '../components/column_settings'; import ColumnSettings from '../components/column_settings';
const messages = defineMessages({ const messages = defineMessages({
clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },
clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },
permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' }, permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' },
}); });
@ -31,7 +28,7 @@ const mapStateToProps = state => ({
notificationPolicy: state.notificationPolicy, notificationPolicy: state.notificationPolicy,
}); });
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onChange (path, checked) { onChange (path, checked) {
if (path[0] === 'push') { if (path[0] === 'push') {
@ -70,14 +67,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
}, },
onClear () { onClear () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_CLEAR_NOTIFICATIONS' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.clearMessage),
confirm: intl.formatMessage(messages.clearConfirm),
onConfirm: () => dispatch(clearNotifications()),
},
}));
}, },
onRequestNotificationPermission () { onRequestNotificationPermission () {

View file

@ -31,8 +31,6 @@ const messages = defineMessages({
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
open: { id: 'status.open', defaultMessage: 'Expand this status' }, open: { id: 'status.open', defaultMessage: 'Expand this status' },
}); });
@ -73,19 +71,13 @@ class Footer extends ImmutablePureComponent {
}; };
handleReplyClick = () => { handleReplyClick = () => {
const { dispatch, askReplyConfirmation, status, intl } = this.props; const { dispatch, askReplyConfirmation, status, onClose } = this.props;
const { signedIn } = this.props.identity; const { signedIn } = this.props.identity;
if (signedIn) { if (signedIn) {
if (askReplyConfirmation) { if (askReplyConfirmation) {
dispatch(openModal({ onClose(true);
modalType: 'CONFIRM', dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: this._performReply,
},
}));
} else { } else {
this._performReply(); this._performReply();
} }

View file

@ -1,4 +1,4 @@
import { defineMessages, injectIntl } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
@ -27,15 +27,6 @@ import { deleteModal } from '../../../initial_state';
import { makeGetStatus } from '../../../selectors'; import { makeGetStatus } from '../../../selectors';
import DetailedStatus from '../components/detailed_status'; import DetailedStatus from '../components/detailed_status';
const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getStatus = makeGetStatus(); const getStatus = makeGetStatus();
@ -48,20 +39,13 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onReply (status) { onReply (status) {
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(status)),
},
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -98,14 +82,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}, },

View file

@ -39,7 +39,6 @@ import {
pin, pin,
unpin, unpin,
} from '../../actions/interactions'; } from '../../actions/interactions';
import { changeLocalSetting } from '../../actions/local_settings';
import { openModal } from '../../actions/modal'; import { openModal } from '../../actions/modal';
import { initMuteModal } from '../../actions/mutes'; import { initMuteModal } from '../../actions/mutes';
import { initReport } from '../../actions/reports'; import { initReport } from '../../actions/reports';
@ -67,16 +66,10 @@ import DetailedStatus from './components/detailed_status';
const messages = defineMessages({ const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' },
detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' }, tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' },
}); });
@ -294,20 +287,12 @@ class Status extends ImmutablePureComponent {
}; };
handleReplyClick = (status) => { handleReplyClick = (status) => {
const { askReplyConfirmation, dispatch, intl } = this.props; const { askReplyConfirmation, dispatch } = this.props;
const { signedIn } = this.props.identity; const { signedIn } = this.props.identity;
if (signedIn) { if (signedIn) {
if (askReplyConfirmation) { if (askReplyConfirmation) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),
onConfirm: () => dispatch(replyCompose(status)),
},
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -350,24 +335,23 @@ class Status extends ImmutablePureComponent {
}; };
handleDeleteClick = (status, withRedraft = false) => { handleDeleteClick = (status, withRedraft = false) => {
const { dispatch, intl } = this.props; const { dispatch } = this.props;
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}; };
handleEditClick = (status) => { handleEditClick = (status) => {
this.props.dispatch(editStatus(status.get('id'))); const { dispatch, askReplyConfirmation } = this.props;
if (askReplyConfirmation) {
dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } }));
} else {
dispatch(editStatus(status.get('id')));
}
}; };
handleDirectClick = (account) => { handleDirectClick = (account) => {

View file

@ -1,83 +0,0 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { injectIntl, FormattedMessage } from 'react-intl';
import { Button } from '../../../components/button';
class ConfirmationModal extends PureComponent {
static propTypes = {
message: PropTypes.node.isRequired,
confirm: PropTypes.string.isRequired,
onClose: PropTypes.func.isRequired,
onConfirm: PropTypes.func.isRequired,
secondary: PropTypes.string,
onSecondary: PropTypes.func,
closeWhenConfirm: PropTypes.bool,
onDoNotAsk: PropTypes.func,
intl: PropTypes.object.isRequired,
};
static defaultProps = {
closeWhenConfirm: true,
};
handleClick = () => {
if (this.props.closeWhenConfirm) {
this.props.onClose();
}
this.props.onConfirm();
if (this.props.onDoNotAsk && this.doNotAskCheckbox.checked) {
this.props.onDoNotAsk();
}
};
handleSecondary = () => {
this.props.onClose();
this.props.onSecondary();
};
handleCancel = () => {
this.props.onClose();
};
setDoNotAskRef = (c) => {
this.doNotAskCheckbox = c;
};
render () {
const { message, confirm, secondary, onDoNotAsk } = this.props;
return (
<div className='modal-root__modal confirmation-modal'>
<div className='confirmation-modal__container'>
{message}
</div>
<div>
{ onDoNotAsk && (
<div className='confirmation-modal__do_not_ask_again'>
<input type='checkbox' id='confirmation-modal__do_not_ask_again-checkbox' ref={this.setDoNotAskRef} />
<label htmlFor='confirmation-modal__do_not_ask_again-checkbox'>
<FormattedMessage id='confirmation_modal.do_not_ask_again' defaultMessage='Do not ask for confirmation again' />
</label>
</div>
)}
<div className='confirmation-modal__action-bar'>
<Button onClick={this.handleCancel} className='confirmation-modal__cancel-button'>
<FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
</Button>
{secondary !== undefined && (
<Button text={secondary} onClick={this.handleSecondary} className='confirmation-modal__secondary-button' />
)}
<Button text={confirm} onClick={this.handleClick} autoFocus />
</div>
</div>
</div>
);
}
}
export default injectIntl(ConfirmationModal);

View file

@ -0,0 +1,46 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { clearNotifications } from 'flavours/glitch/actions/notification_groups';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
clearTitle: {
id: 'notifications.clear_title',
defaultMessage: 'Clear notifications?',
},
clearMessage: {
id: 'notifications.clear_confirmation',
defaultMessage:
'Are you sure you want to permanently clear all your notifications?',
},
clearConfirm: {
id: 'notifications.clear',
defaultMessage: 'Clear notifications',
},
});
export const ConfirmClearNotificationsModal: React.FC<
BaseConfirmationModalProps
> = ({ onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
void dispatch(clearNotifications());
}, [dispatch]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.clearTitle)}
message={intl.formatMessage(messages.clearMessage)}
confirm={intl.formatMessage(messages.clearConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,87 @@
import { useCallback } from 'react';
import { FormattedMessage, defineMessages } from 'react-intl';
import { Button } from 'flavours/glitch/components/button';
export interface BaseConfirmationModalProps {
onClose: () => void;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- keep the message around while we find a place to show it
const messages = defineMessages({
doNotAskAgain: {
id: 'confirmation_modal.do_not_ask_again',
defaultMessage: 'Do not ask for confirmation again',
},
});
export const ConfirmationModal: React.FC<
{
title: React.ReactNode;
message: React.ReactNode;
confirm: React.ReactNode;
secondary?: React.ReactNode;
onSecondary?: () => void;
onConfirm: () => void;
closeWhenConfirm?: boolean;
} & BaseConfirmationModalProps
> = ({
title,
message,
confirm,
onClose,
onConfirm,
secondary,
onSecondary,
closeWhenConfirm = true,
}) => {
const handleClick = useCallback(() => {
if (closeWhenConfirm) {
onClose();
}
onConfirm();
}, [onClose, onConfirm, closeWhenConfirm]);
const handleSecondary = useCallback(() => {
onClose();
onSecondary?.();
}, [onClose, onSecondary]);
const handleCancel = useCallback(() => {
onClose();
}, [onClose]);
return (
<div className='modal-root__modal safety-action-modal'>
<div className='safety-action-modal__top'>
<div className='safety-action-modal__confirmation'>
<h1>{title}</h1>
<p>{message}</p>
</div>
</div>
<div className='safety-action-modal__bottom'>
<div className='safety-action-modal__actions'>
{secondary && (
<>
<Button onClick={handleSecondary}>{secondary}</Button>
<div className='spacer' />
</>
)}
<button onClick={handleCancel} className='link-button'>
<FormattedMessage
id='confirmation_modal.cancel'
defaultMessage='Cancel'
/>
</button>
<Button onClick={handleClick}>{confirm}</Button>
</div>
</div>
</div>
);
};

View file

@ -0,0 +1,58 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { useHistory } from 'react-router';
import { removeColumn } from 'flavours/glitch/actions/columns';
import { deleteList } from 'flavours/glitch/actions/lists';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
deleteListTitle: {
id: 'confirmations.delete_list.title',
defaultMessage: 'Delete list?',
},
deleteListMessage: {
id: 'confirmations.delete_list.message',
defaultMessage: 'Are you sure you want to permanently delete this list?',
},
deleteListConfirm: {
id: 'confirmations.delete_list.confirm',
defaultMessage: 'Delete',
},
});
export const ConfirmDeleteListModal: React.FC<
{
listId: string;
columnId: string;
} & BaseConfirmationModalProps
> = ({ listId, columnId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const history = useHistory();
const onConfirm = useCallback(() => {
dispatch(deleteList(listId));
if (columnId) {
dispatch(removeColumn(columnId));
} else {
history.push('/lists');
}
}, [dispatch, history, columnId, listId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.deleteListTitle)}
message={intl.formatMessage(messages.deleteListMessage)}
confirm={intl.formatMessage(messages.deleteListConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,67 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { deleteStatus } from 'flavours/glitch/actions/statuses';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
deleteAndRedraftTitle: {
id: 'confirmations.redraft.title',
defaultMessage: 'Delete & redraft post?',
},
deleteAndRedraftMessage: {
id: 'confirmations.redraft.message',
defaultMessage:
'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.',
},
deleteAndRedraftConfirm: {
id: 'confirmations.redraft.confirm',
defaultMessage: 'Delete & redraft',
},
deleteTitle: {
id: 'confirmations.delete.title',
defaultMessage: 'Delete post?',
},
deleteMessage: {
id: 'confirmations.delete.message',
defaultMessage: 'Are you sure you want to delete this status?',
},
deleteConfirm: {
id: 'confirmations.delete.confirm',
defaultMessage: 'Delete',
},
});
export const ConfirmDeleteStatusModal: React.FC<
{
statusId: string;
withRedraft: boolean;
} & BaseConfirmationModalProps
> = ({ statusId, withRedraft, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(deleteStatus(statusId, withRedraft));
}, [dispatch, statusId, withRedraft]);
return (
<ConfirmationModal
title={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftTitle : messages.deleteTitle,
)}
message={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftMessage : messages.deleteMessage,
)}
confirm={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftConfirm : messages.deleteConfirm,
)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,45 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { editStatus } from 'flavours/glitch/actions/statuses';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
editTitle: {
id: 'confirmations.edit.title',
defaultMessage: 'Overwrite post?',
},
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: {
id: 'confirmations.edit.message',
defaultMessage:
'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmEditStatusModal: React.FC<
{
statusId: string;
} & BaseConfirmationModalProps
> = ({ statusId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(editStatus(statusId));
}, [dispatch, statusId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.editTitle)}
message={intl.formatMessage(messages.editMessage)}
confirm={intl.formatMessage(messages.editConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,8 @@
export { ConfirmationModal } from './confirmation_modal';
export { ConfirmDeleteStatusModal } from './delete_status';
export { ConfirmDeleteListModal } from './delete_list';
export { ConfirmReplyModal } from './reply';
export { ConfirmEditStatusModal } from './edit_status';
export { ConfirmUnfollowModal } from './unfollow';
export { ConfirmClearNotificationsModal } from './clear_notifications';
export { ConfirmLogOutModal } from './log_out';

View file

@ -0,0 +1,40 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { logOut } from 'flavours/glitch/utils/log_out';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
logoutTitle: { id: 'confirmations.logout.title', defaultMessage: 'Log out?' },
logoutMessage: {
id: 'confirmations.logout.message',
defaultMessage: 'Are you sure you want to log out?',
},
logoutConfirm: {
id: 'confirmations.logout.confirm',
defaultMessage: 'Log out',
},
});
export const ConfirmLogOutModal: React.FC<BaseConfirmationModalProps> = ({
onClose,
}) => {
const intl = useIntl();
const onConfirm = useCallback(() => {
logOut();
}, []);
return (
<ConfirmationModal
title={intl.formatMessage(messages.logoutTitle)}
message={intl.formatMessage(messages.logoutMessage)}
confirm={intl.formatMessage(messages.logoutConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,46 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { replyCompose } from 'flavours/glitch/actions/compose';
import type { Status } from 'flavours/glitch/models/status';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
replyTitle: {
id: 'confirmations.reply.title',
defaultMessage: 'Overwrite post?',
},
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: {
id: 'confirmations.reply.message',
defaultMessage:
'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmReplyModal: React.FC<
{
status: Status;
} & BaseConfirmationModalProps
> = ({ status, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(replyCompose(status));
}, [dispatch, status]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.replyTitle)}
message={intl.formatMessage(messages.replyMessage)}
confirm={intl.formatMessage(messages.replyConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,50 @@
import { useCallback } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { unfollowAccount } from 'flavours/glitch/actions/accounts';
import type { Account } from 'flavours/glitch/models/account';
import { useAppDispatch } from 'flavours/glitch/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
unfollowTitle: {
id: 'confirmations.unfollow.title',
defaultMessage: 'Unfollow user?',
},
unfollowConfirm: {
id: 'confirmations.unfollow.confirm',
defaultMessage: 'Unfollow',
},
});
export const ConfirmUnfollowModal: React.FC<
{
account: Account;
} & BaseConfirmationModalProps
> = ({ account, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(unfollowAccount(account.id));
}, [dispatch, account.id]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.unfollowTitle)}
message={
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account.acct}</strong> }}
/>
}
confirm={intl.formatMessage(messages.unfollowConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { PureComponent } from 'react'; import { PureComponent } from 'react';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage, injectIntl } from 'react-intl';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
@ -9,29 +9,15 @@ import { connect } from 'react-redux';
import { openModal } from 'flavours/glitch/actions/modal'; import { openModal } from 'flavours/glitch/actions/modal';
import { disabledAccountId, movedToAccountId, domain } from 'flavours/glitch/initial_state'; import { disabledAccountId, movedToAccountId, domain } from 'flavours/glitch/initial_state';
import { logOut } from 'flavours/glitch/utils/log_out';
const messages = defineMessages({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
});
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']), disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']),
movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined, movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined,
}); });
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onLogout () { onLogout () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, },
}); });

View file

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { PureComponent } from 'react'; import { PureComponent } from 'react';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage, injectIntl } from 'react-intl';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
@ -11,24 +11,11 @@ import { openModal } from 'flavours/glitch/actions/modal';
import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context'; import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';
import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'flavours/glitch/initial_state'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'flavours/glitch/initial_state';
import { PERMISSION_INVITE_USERS } from 'flavours/glitch/permissions'; import { PERMISSION_INVITE_USERS } from 'flavours/glitch/permissions';
import { logOut } from 'flavours/glitch/utils/log_out';
const messages = defineMessages({ const mapDispatchToProps = (dispatch) => ({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
});
const mapDispatchToProps = (dispatch, { intl }) => ({
onLogout () { onLogout () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, },
}); });

View file

@ -28,7 +28,16 @@ import ActionsModal from './actions_modal';
import AudioModal from './audio_modal'; import AudioModal from './audio_modal';
import { BoostModal } from './boost_modal'; import { BoostModal } from './boost_modal';
import BundleModalError from './bundle_modal_error'; import BundleModalError from './bundle_modal_error';
import ConfirmationModal from './confirmation_modal'; import {
ConfirmationModal,
ConfirmDeleteStatusModal,
ConfirmDeleteListModal,
ConfirmReplyModal,
ConfirmEditStatusModal,
ConfirmUnfollowModal,
ConfirmClearNotificationsModal,
ConfirmLogOutModal,
} from './confirmation_modals';
import DeprecatedSettingsModal from './deprecated_settings_modal'; import DeprecatedSettingsModal from './deprecated_settings_modal';
import DoodleModal from './doodle_modal'; import DoodleModal from './doodle_modal';
import FavouriteModal from './favourite_modal'; import FavouriteModal from './favourite_modal';
@ -47,6 +56,13 @@ export const MODAL_COMPONENTS = {
'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }), 'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }),
'DOODLE': () => Promise.resolve({ default: DoodleModal }), 'DOODLE': () => Promise.resolve({ default: DoodleModal }),
'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),
'CONFIRM_DELETE_STATUS': () => Promise.resolve({ default: ConfirmDeleteStatusModal }),
'CONFIRM_DELETE_LIST': () => Promise.resolve({ default: ConfirmDeleteListModal }),
'CONFIRM_REPLY': () => Promise.resolve({ default: ConfirmReplyModal }),
'CONFIRM_EDIT_STATUS': () => Promise.resolve({ default: ConfirmEditStatusModal }),
'CONFIRM_UNFOLLOW': () => Promise.resolve({ default: ConfirmUnfollowModal }),
'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }),
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
'MUTE': MuteModal, 'MUTE': MuteModal,
'BLOCK': BlockModal, 'BLOCK': BlockModal,
'DOMAIN_BLOCK': DomainBlockModal, 'DOMAIN_BLOCK': DomainBlockModal,

View file

@ -34,10 +34,6 @@
"confirmations.missing_media_description.confirm": "Send anyway", "confirmations.missing_media_description.confirm": "Send anyway",
"confirmations.missing_media_description.edit": "Edit media", "confirmations.missing_media_description.edit": "Edit media",
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.", "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
"confirmations.unfilter.author": "Author",
"confirmations.unfilter.confirm": "Show",
"confirmations.unfilter.edit_filter": "Edit filter",
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
"direct.group_by_conversations": "Group by conversation", "direct.group_by_conversations": "Group by conversation",
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts", "endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
"favourite_modal.combo": "You can press {combo} to skip this next time", "favourite_modal.combo": "You can press {combo} to skip this next time",

View file

@ -2,13 +2,21 @@ import { createReducer, isAnyOf } from '@reduxjs/toolkit';
import { import {
fetchNotificationPolicy, fetchNotificationPolicy,
decreasePendingNotificationsCount,
updateNotificationsPolicy, updateNotificationsPolicy,
} from 'flavours/glitch/actions/notification_policies'; } from 'flavours/glitch/actions/notification_policies';
import type { NotificationPolicy } from 'flavours/glitch/models/notification_policy'; import type { NotificationPolicy } from 'flavours/glitch/models/notification_policy';
export const notificationPolicyReducer = export const notificationPolicyReducer =
createReducer<NotificationPolicy | null>(null, (builder) => { createReducer<NotificationPolicy | null>(null, (builder) => {
builder.addMatcher( builder
.addCase(decreasePendingNotificationsCount, (state, action) => {
if (state) {
state.summary.pending_notifications_count -= action.payload;
state.summary.pending_requests_count -= 1;
}
})
.addMatcher(
isAnyOf( isAnyOf(
fetchNotificationPolicy.fulfilled, fetchNotificationPolicy.fulfilled,
updateNotificationsPolicy.fulfilled, updateNotificationsPolicy.fulfilled,

View file

@ -6523,6 +6523,25 @@ a.status-card {
} }
} }
&__confirmation {
font-size: 14px;
line-height: 20px;
color: $darker-text-color;
h1 {
font-size: 16px;
line-height: 24px;
color: $primary-text-color;
font-weight: 500;
margin-bottom: 8px;
}
strong {
font-weight: 700;
color: $primary-text-color;
}
}
&__bullet-points { &__bullet-points {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -6609,11 +6628,8 @@ a.status-card {
.doodle-modal, .doodle-modal,
.boost-modal, .boost-modal,
.confirmation-modal,
.report-modal, .report-modal,
.actions-modal, .actions-modal,
.mute-modal,
.block-modal,
.compare-history-modal { .compare-history-modal {
background: lighten($ui-secondary-color, 8%); background: lighten($ui-secondary-color, 8%);
color: $inverted-text-color; color: $inverted-text-color;
@ -6648,10 +6664,7 @@ a.status-card {
} }
.doodle-modal__action-bar, .doodle-modal__action-bar,
.boost-modal__action-bar, .boost-modal__action-bar {
.confirmation-modal__action-bar,
.mute-modal__action-bar,
.block-modal__action-bar {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@ -6674,16 +6687,6 @@ a.status-card {
} }
} }
.mute-modal,
.block-modal {
line-height: 24px;
}
.mute-modal .react-toggle,
.block-modal .react-toggle {
vertical-align: middle;
}
.report-modal { .report-modal {
width: 90vw; width: 90vw;
max-width: 700px; max-width: 700px;
@ -7078,31 +7081,7 @@ a.status-card {
} }
} }
.confirmation-modal__action-bar, // TODO
.mute-modal__action-bar,
.block-modal__action-bar {
.confirmation-modal__secondary-button {
flex-shrink: 1;
}
}
.confirmation-modal__secondary-button,
.confirmation-modal__cancel-button,
.mute-modal__cancel-button,
.block-modal__cancel-button {
background-color: transparent;
color: $lighter-text-color;
font-size: 14px;
font-weight: 500;
&:hover,
&:focus,
&:active {
color: darken($lighter-text-color, 4%);
background-color: transparent;
}
}
.confirmation-modal__do_not_ask_again { .confirmation-modal__do_not_ask_again {
padding-inline-start: 20px; padding-inline-start: 20px;
padding-inline-end: 20px; padding-inline-end: 20px;
@ -7115,9 +7094,6 @@ a.status-card {
} }
} }
.confirmation-modal__container,
.mute-modal__container,
.block-modal__container,
.report-modal__target { .report-modal__target {
padding: 30px; padding: 30px;
font-size: 16px; font-size: 16px;
@ -7151,31 +7127,10 @@ a.status-card {
} }
} }
.confirmation-modal__container,
.report-modal__target { .report-modal__target {
text-align: center; text-align: center;
} }
.block-modal,
.mute-modal {
&__explanation {
margin-top: 20px;
}
.setting-toggle {
margin-top: 20px;
margin-bottom: 24px;
display: flex;
align-items: center;
&__label {
color: $inverted-text-color;
margin: 0;
margin-inline-start: 8px;
}
}
}
.report-modal__target { .report-modal__target {
padding: 15px; padding: 15px;

View file

@ -1,3 +1,5 @@
import { createAction } from '@reduxjs/toolkit';
import { import {
apiGetNotificationPolicy, apiGetNotificationPolicy,
apiUpdateNotificationsPolicy, apiUpdateNotificationsPolicy,
@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk(
'notificationPolicy/update', 'notificationPolicy/update',
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy), (policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
); );
export const decreasePendingNotificationsCount = createAction<number>(
'notificationPolicy/decreasePendingNotificationCount',
);

View file

@ -18,6 +18,7 @@ import {
importFetchedStatuses, importFetchedStatuses,
} from './importer'; } from './importer';
import { submitMarkers } from './markers'; import { submitMarkers } from './markers';
import { decreasePendingNotificationsCount } from './notification_policies';
import { notificationsUpdate } from "./notifications_typed"; import { notificationsUpdate } from "./notifications_typed";
import { register as registerPushNotifications } from './push_notifications'; import { register as registerPushNotifications } from './push_notifications';
import { saveSettings } from './settings'; import { saveSettings } from './settings';
@ -84,6 +85,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => {
} }
}; };
const selectNotificationCountForRequest = (state, id) => {
const requests = state.getIn(['notificationRequests', 'items']);
const thisRequest = requests.find(request => request.get('id') === id);
return thisRequest ? thisRequest.get('notifications_count') : 0;
};
export const loadPending = () => ({ export const loadPending = () => ({
type: NOTIFICATIONS_LOAD_PENDING, type: NOTIFICATIONS_LOAD_PENDING,
}); });
@ -433,11 +440,13 @@ export const fetchNotificationRequestFail = (id, error) => ({
error, error,
}); });
export const acceptNotificationRequest = id => (dispatch) => { export const acceptNotificationRequest = (id) => (dispatch, getState) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(acceptNotificationRequestRequest(id)); dispatch(acceptNotificationRequestRequest(id));
api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => {
dispatch(acceptNotificationRequestSuccess(id)); dispatch(acceptNotificationRequestSuccess(id));
dispatch(decreasePendingNotificationsCount(count));
}).catch(err => { }).catch(err => {
dispatch(acceptNotificationRequestFail(id, err)); dispatch(acceptNotificationRequestFail(id, err));
}); });
@ -459,11 +468,13 @@ export const acceptNotificationRequestFail = (id, error) => ({
error, error,
}); });
export const dismissNotificationRequest = id => (dispatch) => { export const dismissNotificationRequest = (id) => (dispatch, getState) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(dismissNotificationRequestRequest(id)); dispatch(dismissNotificationRequestRequest(id));
api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{
dispatch(dismissNotificationRequestSuccess(id)); dispatch(dismissNotificationRequestSuccess(id));
dispatch(decreasePendingNotificationsCount(count));
}).catch(err => { }).catch(err => {
dispatch(dismissNotificationRequestFail(id, err)); dispatch(dismissNotificationRequestFail(id, err));
}); });

View file

@ -3,6 +3,8 @@ import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl'; import { defineMessages, useIntl } from 'react-intl';
import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react';
import { unblockDomain } from 'mastodon/actions/domain_blocks';
import { useAppDispatch } from 'mastodon/store';
import { IconButton } from './icon_button'; import { IconButton } from './icon_button';
@ -13,17 +15,15 @@ const messages = defineMessages({
}, },
}); });
interface Props { export const Domain: React.FC<{
domain: string; domain: string;
onUnblockDomain: (domain: string) => void; }> = ({ domain }) => {
}
export const Domain: React.FC<Props> = ({ domain, onUnblockDomain }) => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch();
const handleDomainUnblock = useCallback(() => { const handleDomainUnblock = useCallback(() => {
onUnblockDomain(domain); dispatch(unblockDomain(domain));
}, [domain, onUnblockDomain]); }, [dispatch, domain]);
return ( return (
<div className='domain'> <div className='domain'>

View file

@ -1,13 +1,9 @@
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; import { useIntl, defineMessages } from 'react-intl';
import { useIdentity } from '@/mastodon/identity_context'; import { useIdentity } from '@/mastodon/identity_context';
import { import { fetchRelationships, followAccount } from 'mastodon/actions/accounts';
fetchRelationships,
followAccount,
unfollowAccount,
} from 'mastodon/actions/accounts';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
import { Button } from 'mastodon/components/button'; import { Button } from 'mastodon/components/button';
import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { LoadingIndicator } from 'mastodon/components/loading_indicator';
@ -60,29 +56,14 @@ export const FollowButton: React.FC<{
if (accountId === me) { if (accountId === me) {
return; return;
} else if (relationship.following || relationship.requested) { } else if (account && (relationship.following || relationship.requested)) {
dispatch( dispatch(
openModal({ openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }),
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account?.acct}</strong> }}
/>
),
confirm: intl.formatMessage(messages.unfollow),
onConfirm: () => {
dispatch(unfollowAccount(accountId));
},
},
}),
); );
} else { } else {
dispatch(followAccount(accountId)); dispatch(followAccount(accountId));
} }
}, [dispatch, intl, accountId, relationship, account, signedIn]); }, [dispatch, accountId, relationship, account, signedIn]);
let label; let label;

View file

@ -1,24 +1,20 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { openModal } from 'mastodon/actions/modal';
import { import {
followAccount, followAccount,
unfollowAccount,
blockAccount, blockAccount,
unblockAccount, unblockAccount,
muteAccount, muteAccount,
unmuteAccount, unmuteAccount,
} from '../actions/accounts'; } from '../actions/accounts';
import { openModal } from '../actions/modal';
import { initMuteModal } from '../actions/mutes'; import { initMuteModal } from '../actions/mutes';
import Account from '../components/account'; import Account from '../components/account';
import { makeGetAccount } from '../selectors'; import { makeGetAccount } from '../selectors';
const messages = defineMessages({
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
@ -29,18 +25,11 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onFollow (account) { onFollow (account) {
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }));
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
},
}));
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }

View file

@ -1,36 +0,0 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import { blockDomain, unblockDomain } from '../actions/domain_blocks';
import { openModal } from '../actions/modal';
import { Domain } from '../components/domain';
const messages = defineMessages({
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
});
const makeMapStateToProps = () => {
const mapStateToProps = () => ({});
return mapStateToProps;
};
const mapDispatchToProps = (dispatch, { intl }) => ({
onBlockDomain (domain) {
dispatch(openModal({
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,
confirm: intl.formatMessage(messages.blockDomainConfirm),
onConfirm: () => dispatch(blockDomain(domain)),
},
}));
},
onUnblockDomain (domain) {
dispatch(unblockDomain(domain));
},
});
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain));

View file

@ -1,4 +1,4 @@
import { defineMessages, injectIntl } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
@ -46,18 +46,6 @@ import Status from '../components/status';
import { deleteModal } from '../initial_state'; import { deleteModal } from '../initial_state';
import { makeGetStatus, makeGetPictureInPicture } from '../selectors'; import { makeGetStatus, makeGetPictureInPicture } from '../selectors';
const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getStatus = makeGetStatus(); const getStatus = makeGetStatus();
const getPictureInPicture = makeGetPictureInPicture(); const getPictureInPicture = makeGetPictureInPicture();
@ -71,20 +59,14 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ const mapDispatchToProps = (dispatch, { contextType }) => ({
onReply (status) { onReply (status) {
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(status)) },
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -129,14 +111,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}, },
@ -144,14 +119,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.editMessage),
confirm: intl.formatMessage(messages.editConfirm),
onConfirm: () => dispatch(editStatus(status.get('id'))),
},
}));
} else { } else {
dispatch(editStatus(status.get('id'))); dispatch(editStatus(status.get('id')));
} }

View file

@ -1,4 +1,4 @@
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
@ -6,7 +6,6 @@ import { openURL } from 'mastodon/actions/search';
import { import {
followAccount, followAccount,
unfollowAccount,
unblockAccount, unblockAccount,
unmuteAccount, unmuteAccount,
pinAccount, pinAccount,
@ -24,11 +23,6 @@ import { initReport } from '../../../actions/reports';
import { makeGetAccount, getAccountHidden } from '../../../selectors'; import { makeGetAccount, getAccountHidden } from '../../../selectors';
import Header from '../components/header'; import Header from '../components/header';
const messages = defineMessages({
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
@ -41,18 +35,11 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onFollow (account) { onFollow (account) {
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }));
modalType: 'CONFIRM',
modalProps: {
message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
},
}));
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }

View file

@ -7,7 +7,6 @@ import { useDispatch } from 'react-redux';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
import { logOut } from 'mastodon/utils/log_out';
const messages = defineMessages({ const messages = defineMessages({
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
@ -23,8 +22,6 @@ const messages = defineMessages({
filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' },
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
}); });
export const ActionBar = () => { export const ActionBar = () => {
@ -32,16 +29,8 @@ export const ActionBar = () => {
const intl = useIntl(); const intl = useIntl();
const handleLogoutClick = useCallback(() => { const handleLogoutClick = useCallback(() => {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM', }, [dispatch]);
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, [dispatch, intl]);
let menu = []; let menu = [];

View file

@ -21,7 +21,6 @@ import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
import Column from 'mastodon/components/column'; import Column from 'mastodon/components/column';
import { Icon } from 'mastodon/components/icon'; import { Icon } from 'mastodon/components/icon';
import { logOut } from 'mastodon/utils/log_out';
import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; import elephantUIPlane from '../../../images/elephant_ui_plane.svg';
import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose'; import { changeComposing, mountCompose, unmountCompose } from '../../actions/compose';
@ -42,8 +41,6 @@ const messages = defineMessages({
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' }, compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new post' },
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
}); });
const mapStateToProps = (state, ownProps) => ({ const mapStateToProps = (state, ownProps) => ({
@ -72,20 +69,12 @@ class Compose extends PureComponent {
} }
handleLogoutClick = e => { handleLogoutClick = e => {
const { dispatch, intl } = this.props; const { dispatch } = this.props;
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
return false; return false;
}; };

View file

@ -36,8 +36,6 @@ const messages = defineMessages({
delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' },
muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
}); });
const getAccounts = createSelector( const getAccounts = createSelector(
@ -103,19 +101,12 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status: lastStatus } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(lastStatus)),
},
}));
} else { } else {
dispatch(replyCompose(lastStatus)); dispatch(replyCompose(lastStatus));
} }
}); });
}, [dispatch, lastStatus, intl]); }, [dispatch, lastStatus]);
const handleDelete = useCallback(() => { const handleDelete = useCallback(() => {
dispatch(deleteConversation(id)); dispatch(deleteConversation(id));

View file

@ -8,7 +8,6 @@ import { Link } from 'react-router-dom';
import { import {
followAccount, followAccount,
unfollowAccount,
unblockAccount, unblockAccount,
unmuteAccount, unmuteAccount,
} from 'mastodon/actions/accounts'; } from 'mastodon/actions/accounts';
@ -29,20 +28,12 @@ const messages = defineMessages({
id: 'account.cancel_follow_request', id: 'account.cancel_follow_request',
defaultMessage: 'Withdraw follow request', defaultMessage: 'Withdraw follow request',
}, },
cancelFollowRequestConfirm: {
id: 'confirmations.cancel_follow_request.confirm',
defaultMessage: 'Withdraw request',
},
requested: { requested: {
id: 'account.requested', id: 'account.requested',
defaultMessage: 'Awaiting approval. Click to cancel follow request', defaultMessage: 'Awaiting approval. Click to cancel follow request',
}, },
unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' }, unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },
unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' }, unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },
unfollowConfirm: {
id: 'confirmations.unfollow.confirm',
defaultMessage: 'Unfollow',
},
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
}); });
@ -89,48 +80,17 @@ export const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => {
const handleFollow = useCallback(() => { const handleFollow = useCallback(() => {
if (!account) return; if (!account) return;
if (account.getIn(['relationship', 'following'])) { if (
account.getIn(['relationship', 'following']) ||
account.getIn(['relationship', 'requested'])
) {
dispatch( dispatch(
openModal({ openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }),
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account.get('acct')}</strong> }}
/>
),
confirm: intl.formatMessage(messages.unfollowConfirm),
onConfirm: () => {
dispatch(unfollowAccount(account.get('id')));
},
},
}),
);
} else if (account.getIn(['relationship', 'requested'])) {
dispatch(
openModal({
modalType: 'CONFIRM',
modalProps: {
message: (
<FormattedMessage
id='confirmations.cancel_follow_request.message'
defaultMessage='Are you sure you want to withdraw your request to follow {name}?'
values={{ name: <strong>@{account.get('acct')}</strong> }}
/>
),
confirm: intl.formatMessage(messages.cancelFollowRequestConfirm),
onConfirm: () => {
dispatch(unfollowAccount(account.get('id')));
},
},
}),
); );
} else { } else {
dispatch(followAccount(account.get('id'))); dispatch(followAccount(account.get('id')));
} }
}, [account, dispatch, intl]); }, [account, dispatch]);
const handleBlock = useCallback(() => { const handleBlock = useCallback(() => {
if (account?.relationship?.blocking) { if (account?.relationship?.blocking) {

View file

@ -11,16 +11,15 @@ import { connect } from 'react-redux';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react';
import { Domain } from 'mastodon/components/domain';
import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';
import { LoadingIndicator } from '../../components/loading_indicator'; import { LoadingIndicator } from '../../components/loading_indicator';
import ScrollableList from '../../components/scrollable_list'; import ScrollableList from '../../components/scrollable_list';
import DomainContainer from '../../containers/domain_container';
import Column from '../ui/components/column'; import Column from '../ui/components/column';
const messages = defineMessages({ const messages = defineMessages({
heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' }, heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' },
unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },
}); });
const mapStateToProps = state => ({ const mapStateToProps = state => ({
@ -70,7 +69,7 @@ class Blocks extends ImmutablePureComponent {
bindToDocument={!multiColumn} bindToDocument={!multiColumn}
> >
{domains.map(domain => {domains.map(domain =>
<DomainContainer key={domain} domain={domain} />, <Domain key={domain} domain={domain} />,
)} )}
</ScrollableList> </ScrollableList>

View file

@ -15,7 +15,7 @@ import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns';
import { fetchList, deleteList, updateList } from 'mastodon/actions/lists'; import { fetchList, updateList } from 'mastodon/actions/lists';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
import { connectListStream } from 'mastodon/actions/streaming'; import { connectListStream } from 'mastodon/actions/streaming';
import { expandListTimeline } from 'mastodon/actions/timelines'; import { expandListTimeline } from 'mastodon/actions/timelines';
@ -29,8 +29,6 @@ import StatusListContainer from 'mastodon/features/ui/containers/status_list_con
import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { WithRouterPropTypes } from 'mastodon/utils/react_router';
const messages = defineMessages({ const messages = defineMessages({
deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' },
deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' },
followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' }, followed: { id: 'lists.replies_policy.followed', defaultMessage: 'Any followed user' },
none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' }, none: { id: 'lists.replies_policy.none', defaultMessage: 'No one' },
list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' }, list: { id: 'lists.replies_policy.list', defaultMessage: 'Members of the list' },
@ -125,25 +123,10 @@ class ListTimeline extends PureComponent {
}; };
handleDeleteClick = () => { handleDeleteClick = () => {
const { dispatch, columnId, intl } = this.props; const { dispatch, columnId } = this.props;
const { id } = this.props.params; const { id } = this.props.params;
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_LIST', modalProps: { listId: id, columnId } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.deleteMessage),
confirm: intl.formatMessage(messages.deleteConfirm),
onConfirm: () => {
dispatch(deleteList(id));
if (columnId) {
dispatch(removeColumn(columnId));
} else {
this.props.history.push('/lists');
}
},
},
}));
}; };
handleRepliesPolicyChange = ({ target }) => { handleRepliesPolicyChange = ({ target }) => {

View file

@ -2,11 +2,10 @@ import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { openModal } from 'mastodon/actions/modal';
import { initializeNotifications } from 'mastodon/actions/notifications_migration'; import { initializeNotifications } from 'mastodon/actions/notifications_migration';
import { showAlert } from '../../../actions/alerts'; import { showAlert } from '../../../actions/alerts';
import { openModal } from '../../../actions/modal';
import { clearNotifications } from '../../../actions/notification_groups';
import { updateNotificationsPolicy } from '../../../actions/notification_policies'; import { updateNotificationsPolicy } from '../../../actions/notification_policies';
import { setFilter, requestBrowserPermission } from '../../../actions/notifications'; import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications'; import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
@ -14,8 +13,6 @@ import { changeSetting } from '../../../actions/settings';
import ColumnSettings from '../components/column_settings'; import ColumnSettings from '../components/column_settings';
const messages = defineMessages({ const messages = defineMessages({
clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },
clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },
permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' }, permissionDenied: { id: 'notifications.permission_denied_alert', defaultMessage: 'Desktop notifications can\'t be enabled, as browser permission has been denied before' },
}); });
@ -31,7 +28,7 @@ const mapStateToProps = state => ({
notificationPolicy: state.notificationPolicy, notificationPolicy: state.notificationPolicy,
}); });
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onChange (path, checked) { onChange (path, checked) {
if (path[0] === 'push') { if (path[0] === 'push') {
@ -70,14 +67,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
}, },
onClear () { onClear () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_CLEAR_NOTIFICATIONS' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.clearMessage),
confirm: intl.formatMessage(messages.clearConfirm),
onConfirm: () => dispatch(clearNotifications()),
},
}));
}, },
onRequestNotificationPermission () { onRequestNotificationPermission () {

View file

@ -31,8 +31,6 @@ const messages = defineMessages({
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
open: { id: 'status.open', defaultMessage: 'Expand this status' }, open: { id: 'status.open', defaultMessage: 'Expand this status' },
}); });
@ -71,19 +69,13 @@ class Footer extends ImmutablePureComponent {
}; };
handleReplyClick = () => { handleReplyClick = () => {
const { dispatch, askReplyConfirmation, status, intl } = this.props; const { dispatch, askReplyConfirmation, status, onClose } = this.props;
const { signedIn } = this.props.identity; const { signedIn } = this.props.identity;
if (signedIn) { if (signedIn) {
if (askReplyConfirmation) { if (askReplyConfirmation) {
dispatch(openModal({ onClose(true);
modalType: 'CONFIRM', dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: this._performReply,
},
}));
} else { } else {
this._performReply(); this._performReply();
} }

View file

@ -1,4 +1,4 @@
import { defineMessages, injectIntl } from 'react-intl'; import { injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
@ -28,15 +28,6 @@ import { deleteModal } from '../../../initial_state';
import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors'; import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors';
import DetailedStatus from '../components/detailed_status'; import DetailedStatus from '../components/detailed_status';
const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
});
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getStatus = makeGetStatus(); const getStatus = makeGetStatus();
const getPictureInPicture = makeGetPictureInPicture(); const getPictureInPicture = makeGetPictureInPicture();
@ -50,20 +41,13 @@ const makeMapStateToProps = () => {
return mapStateToProps; return mapStateToProps;
}; };
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onReply (status) { onReply (status) {
dispatch((_, getState) => { dispatch((_, getState) => {
let state = getState(); let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) { if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(status)),
},
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -100,14 +84,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}, },

View file

@ -72,17 +72,10 @@ import DetailedStatus from './components/detailed_status';
const messages = defineMessages({ const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' },
detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },
}); });
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
@ -264,19 +257,12 @@ class Status extends ImmutablePureComponent {
}; };
handleReplyClick = (status) => { handleReplyClick = (status) => {
const { askReplyConfirmation, dispatch, intl } = this.props; const { askReplyConfirmation, dispatch } = this.props;
const { signedIn } = this.props.identity; const { signedIn } = this.props.identity;
if (signedIn) { if (signedIn) {
if (askReplyConfirmation) { if (askReplyConfirmation) {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.replyMessage),
confirm: intl.formatMessage(messages.replyConfirm),
onConfirm: () => dispatch(replyCompose(status)),
},
}));
} else { } else {
dispatch(replyCompose(status)); dispatch(replyCompose(status));
} }
@ -319,24 +305,23 @@ class Status extends ImmutablePureComponent {
}; };
handleDeleteClick = (status, withRedraft = false) => { handleDeleteClick = (status, withRedraft = false) => {
const { dispatch, intl } = this.props; const { dispatch } = this.props;
if (!deleteModal) { if (!deleteModal) {
dispatch(deleteStatus(status.get('id'), withRedraft)); dispatch(deleteStatus(status.get('id'), withRedraft));
} else { } else {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)),
},
}));
} }
}; };
handleEditClick = (status) => { handleEditClick = (status) => {
this.props.dispatch(editStatus(status.get('id'))); const { dispatch, askReplyConfirmation } = this.props;
if (askReplyConfirmation) {
dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } }));
} else {
dispatch(editStatus(status.get('id')));
}
}; };
handleDirectClick = (account) => { handleDirectClick = (account) => {

View file

@ -1,65 +0,0 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { injectIntl, FormattedMessage } from 'react-intl';
import { Button } from '../../../components/button';
class ConfirmationModal extends PureComponent {
static propTypes = {
message: PropTypes.node.isRequired,
confirm: PropTypes.string.isRequired,
onClose: PropTypes.func.isRequired,
onConfirm: PropTypes.func.isRequired,
secondary: PropTypes.string,
onSecondary: PropTypes.func,
closeWhenConfirm: PropTypes.bool,
intl: PropTypes.object.isRequired,
};
static defaultProps = {
closeWhenConfirm: true,
};
handleClick = () => {
if (this.props.closeWhenConfirm) {
this.props.onClose();
}
this.props.onConfirm();
};
handleSecondary = () => {
this.props.onClose();
this.props.onSecondary();
};
handleCancel = () => {
this.props.onClose();
};
render () {
const { message, confirm, secondary } = this.props;
return (
<div className='modal-root__modal confirmation-modal'>
<div className='confirmation-modal__container'>
{message}
</div>
<div className='confirmation-modal__action-bar'>
<Button onClick={this.handleCancel} className='confirmation-modal__cancel-button'>
<FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
</Button>
{secondary !== undefined && (
<Button text={secondary} onClick={this.handleSecondary} className='confirmation-modal__secondary-button' />
)}
<Button text={confirm} onClick={this.handleClick} autoFocus />
</div>
</div>
);
}
}
export default injectIntl(ConfirmationModal);

View file

@ -0,0 +1,46 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { clearNotifications } from 'mastodon/actions/notification_groups';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
clearTitle: {
id: 'notifications.clear_title',
defaultMessage: 'Clear notifications?',
},
clearMessage: {
id: 'notifications.clear_confirmation',
defaultMessage:
'Are you sure you want to permanently clear all your notifications?',
},
clearConfirm: {
id: 'notifications.clear',
defaultMessage: 'Clear notifications',
},
});
export const ConfirmClearNotificationsModal: React.FC<
BaseConfirmationModalProps
> = ({ onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
void dispatch(clearNotifications());
}, [dispatch]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.clearTitle)}
message={intl.formatMessage(messages.clearMessage)}
confirm={intl.formatMessage(messages.clearConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,79 @@
import { useCallback } from 'react';
import { FormattedMessage } from 'react-intl';
import { Button } from 'mastodon/components/button';
export interface BaseConfirmationModalProps {
onClose: () => void;
}
export const ConfirmationModal: React.FC<
{
title: React.ReactNode;
message: React.ReactNode;
confirm: React.ReactNode;
secondary?: React.ReactNode;
onSecondary?: () => void;
onConfirm: () => void;
closeWhenConfirm?: boolean;
} & BaseConfirmationModalProps
> = ({
title,
message,
confirm,
onClose,
onConfirm,
secondary,
onSecondary,
closeWhenConfirm = true,
}) => {
const handleClick = useCallback(() => {
if (closeWhenConfirm) {
onClose();
}
onConfirm();
}, [onClose, onConfirm, closeWhenConfirm]);
const handleSecondary = useCallback(() => {
onClose();
onSecondary?.();
}, [onClose, onSecondary]);
const handleCancel = useCallback(() => {
onClose();
}, [onClose]);
return (
<div className='modal-root__modal safety-action-modal'>
<div className='safety-action-modal__top'>
<div className='safety-action-modal__confirmation'>
<h1>{title}</h1>
<p>{message}</p>
</div>
</div>
<div className='safety-action-modal__bottom'>
<div className='safety-action-modal__actions'>
{secondary && (
<>
<Button onClick={handleSecondary}>{secondary}</Button>
<div className='spacer' />
</>
)}
<button onClick={handleCancel} className='link-button'>
<FormattedMessage
id='confirmation_modal.cancel'
defaultMessage='Cancel'
/>
</button>
<Button onClick={handleClick}>{confirm}</Button>
</div>
</div>
</div>
);
};

View file

@ -0,0 +1,58 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { useHistory } from 'react-router';
import { removeColumn } from 'mastodon/actions/columns';
import { deleteList } from 'mastodon/actions/lists';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
deleteListTitle: {
id: 'confirmations.delete_list.title',
defaultMessage: 'Delete list?',
},
deleteListMessage: {
id: 'confirmations.delete_list.message',
defaultMessage: 'Are you sure you want to permanently delete this list?',
},
deleteListConfirm: {
id: 'confirmations.delete_list.confirm',
defaultMessage: 'Delete',
},
});
export const ConfirmDeleteListModal: React.FC<
{
listId: string;
columnId: string;
} & BaseConfirmationModalProps
> = ({ listId, columnId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const history = useHistory();
const onConfirm = useCallback(() => {
dispatch(deleteList(listId));
if (columnId) {
dispatch(removeColumn(columnId));
} else {
history.push('/lists');
}
}, [dispatch, history, columnId, listId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.deleteListTitle)}
message={intl.formatMessage(messages.deleteListMessage)}
confirm={intl.formatMessage(messages.deleteListConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,67 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { deleteStatus } from 'mastodon/actions/statuses';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
deleteAndRedraftTitle: {
id: 'confirmations.redraft.title',
defaultMessage: 'Delete & redraft post?',
},
deleteAndRedraftMessage: {
id: 'confirmations.redraft.message',
defaultMessage:
'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.',
},
deleteAndRedraftConfirm: {
id: 'confirmations.redraft.confirm',
defaultMessage: 'Delete & redraft',
},
deleteTitle: {
id: 'confirmations.delete.title',
defaultMessage: 'Delete post?',
},
deleteMessage: {
id: 'confirmations.delete.message',
defaultMessage: 'Are you sure you want to delete this status?',
},
deleteConfirm: {
id: 'confirmations.delete.confirm',
defaultMessage: 'Delete',
},
});
export const ConfirmDeleteStatusModal: React.FC<
{
statusId: string;
withRedraft: boolean;
} & BaseConfirmationModalProps
> = ({ statusId, withRedraft, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(deleteStatus(statusId, withRedraft));
}, [dispatch, statusId, withRedraft]);
return (
<ConfirmationModal
title={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftTitle : messages.deleteTitle,
)}
message={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftMessage : messages.deleteMessage,
)}
confirm={intl.formatMessage(
withRedraft ? messages.deleteAndRedraftConfirm : messages.deleteConfirm,
)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,45 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { editStatus } from 'mastodon/actions/statuses';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
editTitle: {
id: 'confirmations.edit.title',
defaultMessage: 'Overwrite post?',
},
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: {
id: 'confirmations.edit.message',
defaultMessage:
'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmEditStatusModal: React.FC<
{
statusId: string;
} & BaseConfirmationModalProps
> = ({ statusId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(editStatus(statusId));
}, [dispatch, statusId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.editTitle)}
message={intl.formatMessage(messages.editMessage)}
confirm={intl.formatMessage(messages.editConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,8 @@
export { ConfirmationModal } from './confirmation_modal';
export { ConfirmDeleteStatusModal } from './delete_status';
export { ConfirmDeleteListModal } from './delete_list';
export { ConfirmReplyModal } from './reply';
export { ConfirmEditStatusModal } from './edit_status';
export { ConfirmUnfollowModal } from './unfollow';
export { ConfirmClearNotificationsModal } from './clear_notifications';
export { ConfirmLogOutModal } from './log_out';

View file

@ -0,0 +1,40 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { logOut } from 'mastodon/utils/log_out';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
logoutTitle: { id: 'confirmations.logout.title', defaultMessage: 'Log out?' },
logoutMessage: {
id: 'confirmations.logout.message',
defaultMessage: 'Are you sure you want to log out?',
},
logoutConfirm: {
id: 'confirmations.logout.confirm',
defaultMessage: 'Log out',
},
});
export const ConfirmLogOutModal: React.FC<BaseConfirmationModalProps> = ({
onClose,
}) => {
const intl = useIntl();
const onConfirm = useCallback(() => {
logOut();
}, []);
return (
<ConfirmationModal
title={intl.formatMessage(messages.logoutTitle)}
message={intl.formatMessage(messages.logoutMessage)}
confirm={intl.formatMessage(messages.logoutConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,46 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { replyCompose } from 'mastodon/actions/compose';
import type { Status } from 'mastodon/models/status';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
replyTitle: {
id: 'confirmations.reply.title',
defaultMessage: 'Overwrite post?',
},
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: {
id: 'confirmations.reply.message',
defaultMessage:
'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmReplyModal: React.FC<
{
status: Status;
} & BaseConfirmationModalProps
> = ({ status, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(replyCompose(status));
}, [dispatch, status]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.replyTitle)}
message={intl.formatMessage(messages.replyMessage)}
confirm={intl.formatMessage(messages.replyConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -0,0 +1,50 @@
import { useCallback } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { unfollowAccount } from 'mastodon/actions/accounts';
import type { Account } from 'mastodon/models/account';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
unfollowTitle: {
id: 'confirmations.unfollow.title',
defaultMessage: 'Unfollow user?',
},
unfollowConfirm: {
id: 'confirmations.unfollow.confirm',
defaultMessage: 'Unfollow',
},
});
export const ConfirmUnfollowModal: React.FC<
{
account: Account;
} & BaseConfirmationModalProps
> = ({ account, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(unfollowAccount(account.id));
}, [dispatch, account.id]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.unfollowTitle)}
message={
<FormattedMessage
id='confirmations.unfollow.message'
defaultMessage='Are you sure you want to unfollow {name}?'
values={{ name: <strong>@{account.acct}</strong> }}
/>
}
confirm={intl.formatMessage(messages.unfollowConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View file

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { PureComponent } from 'react'; import { PureComponent } from 'react';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage, injectIntl } from 'react-intl';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
@ -9,29 +9,15 @@ import { connect } from 'react-redux';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
import { disabledAccountId, movedToAccountId, domain } from 'mastodon/initial_state'; import { disabledAccountId, movedToAccountId, domain } from 'mastodon/initial_state';
import { logOut } from 'mastodon/utils/log_out';
const messages = defineMessages({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
});
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']), disabledAcct: state.getIn(['accounts', disabledAccountId, 'acct']),
movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined, movedToAcct: movedToAccountId ? state.getIn(['accounts', movedToAccountId, 'acct']) : undefined,
}); });
const mapDispatchToProps = (dispatch, { intl }) => ({ const mapDispatchToProps = (dispatch) => ({
onLogout () { onLogout () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, },
}); });

View file

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { PureComponent } from 'react'; import { PureComponent } from 'react';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage, injectIntl } from 'react-intl';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
@ -11,24 +11,11 @@ import { openModal } from 'mastodon/actions/modal';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state'; import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state';
import { PERMISSION_INVITE_USERS } from 'mastodon/permissions'; import { PERMISSION_INVITE_USERS } from 'mastodon/permissions';
import { logOut } from 'mastodon/utils/log_out';
const messages = defineMessages({ const mapDispatchToProps = (dispatch) => ({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },
});
const mapDispatchToProps = (dispatch, { intl }) => ({
onLogout () { onLogout () {
dispatch(openModal({ dispatch(openModal({ modalType: 'CONFIRM_LOG_OUT' }));
modalType: 'CONFIRM',
modalProps: {
message: intl.formatMessage(messages.logoutMessage),
confirm: intl.formatMessage(messages.logoutConfirm),
closeWhenConfirm: false,
onConfirm: () => logOut(),
},
}));
}, },
}); });

View file

@ -26,7 +26,16 @@ import ActionsModal from './actions_modal';
import AudioModal from './audio_modal'; import AudioModal from './audio_modal';
import { BoostModal } from './boost_modal'; import { BoostModal } from './boost_modal';
import BundleModalError from './bundle_modal_error'; import BundleModalError from './bundle_modal_error';
import ConfirmationModal from './confirmation_modal'; import {
ConfirmationModal,
ConfirmDeleteStatusModal,
ConfirmDeleteListModal,
ConfirmReplyModal,
ConfirmEditStatusModal,
ConfirmUnfollowModal,
ConfirmClearNotificationsModal,
ConfirmLogOutModal,
} from './confirmation_modals';
import FocalPointModal from './focal_point_modal'; import FocalPointModal from './focal_point_modal';
import ImageModal from './image_modal'; import ImageModal from './image_modal';
import MediaModal from './media_modal'; import MediaModal from './media_modal';
@ -40,6 +49,13 @@ export const MODAL_COMPONENTS = {
'IMAGE': () => Promise.resolve({ default: ImageModal }), 'IMAGE': () => Promise.resolve({ default: ImageModal }),
'BOOST': () => Promise.resolve({ default: BoostModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }),
'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),
'CONFIRM_DELETE_STATUS': () => Promise.resolve({ default: ConfirmDeleteStatusModal }),
'CONFIRM_DELETE_LIST': () => Promise.resolve({ default: ConfirmDeleteListModal }),
'CONFIRM_REPLY': () => Promise.resolve({ default: ConfirmReplyModal }),
'CONFIRM_EDIT_STATUS': () => Promise.resolve({ default: ConfirmEditStatusModal }),
'CONFIRM_UNFOLLOW': () => Promise.resolve({ default: ConfirmUnfollowModal }),
'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }),
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
'MUTE': MuteModal, 'MUTE': MuteModal,
'BLOCK': BlockModal, 'BLOCK': BlockModal,
'DOMAIN_BLOCK': DomainBlockModal, 'DOMAIN_BLOCK': DomainBlockModal,

View file

@ -119,8 +119,6 @@
"compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by", "compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by",
"confirmation_modal.cancel": "Kanselleer", "confirmation_modal.cancel": "Kanselleer",
"confirmations.block.confirm": "Blokkeer", "confirmations.block.confirm": "Blokkeer",
"confirmations.cancel_follow_request.confirm": "Herroep versoek",
"confirmations.cancel_follow_request.message": "Is jy seker jy wil jou versoek om {name} te volg, terugtrek?",
"confirmations.delete.confirm": "Wis uit", "confirmations.delete.confirm": "Wis uit",
"confirmations.delete.message": "Is jy seker jy wil hierdie plasing uitvee?", "confirmations.delete.message": "Is jy seker jy wil hierdie plasing uitvee?",
"confirmations.delete_list.confirm": "Wis uit", "confirmations.delete_list.confirm": "Wis uit",

View file

@ -130,15 +130,12 @@
"compose_form.spoiler.unmarked": "Texto no amagau", "compose_form.spoiler.unmarked": "Texto no amagau",
"confirmation_modal.cancel": "Cancelar", "confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Blocar", "confirmations.block.confirm": "Blocar",
"confirmations.cancel_follow_request.confirm": "Retirar solicitut",
"confirmations.cancel_follow_request.message": "Yes seguro que deseyas retirar la tuya solicitut pa seguir a {name}?",
"confirmations.delete.confirm": "Eliminar", "confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "Yes seguro que quiers borrar esta publicación?", "confirmations.delete.message": "Yes seguro que quiers borrar esta publicación?",
"confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "Seguro que quiers borrar esta lista permanentment?", "confirmations.delete_list.message": "Seguro que quiers borrar esta lista permanentment?",
"confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tiens cambios sin alzar en a descripción u vista previa d'o fichero audiovisual, descartar-los de totz modos?", "confirmations.discard_edit_media.message": "Tiens cambios sin alzar en a descripción u vista previa d'o fichero audiovisual, descartar-los de totz modos?",
"confirmations.domain_block.message": "Yes seguro que quiers blocar lo dominio {domain} entero? En cheneral ye prou, y preferible, fer uns quantos bloqueyos y silenciaus concretos. Los tuyos seguidros d'ixe dominio serán eliminaus.",
"confirmations.logout.confirm": "Zarrar sesión", "confirmations.logout.confirm": "Zarrar sesión",
"confirmations.logout.message": "Yes seguro de querer zarrar la sesión?", "confirmations.logout.message": "Yes seguro de querer zarrar la sesión?",
"confirmations.mute.confirm": "Silenciar", "confirmations.mute.confirm": "Silenciar",

View file

@ -167,16 +167,12 @@
"compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)", "compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)",
"confirmation_modal.cancel": "إلغاء", "confirmation_modal.cancel": "إلغاء",
"confirmations.block.confirm": "حظر", "confirmations.block.confirm": "حظر",
"confirmations.cancel_follow_request.confirm": "إلغاء الطلب",
"confirmations.cancel_follow_request.message": "متأكد من أنك تريد إلغاء طلب متابعتك لـ {name}؟",
"confirmations.delete.confirm": "حذف", "confirmations.delete.confirm": "حذف",
"confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟", "confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟",
"confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟", "confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟",
"confirmations.discard_edit_media.confirm": "تجاهل", "confirmations.discard_edit_media.confirm": "تجاهل",
"confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟", "confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟",
"confirmations.domain_block.confirm": "حظر الخادم",
"confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.",
"confirmations.edit.confirm": "تعديل", "confirmations.edit.confirm": "تعديل",
"confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟", "confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟",
"confirmations.logout.confirm": "خروج", "confirmations.logout.confirm": "خروج",

View file

@ -111,8 +111,6 @@
"compose_form.publish_form": "Artículu nuevu", "compose_form.publish_form": "Artículu nuevu",
"confirmation_modal.cancel": "Encaboxar", "confirmation_modal.cancel": "Encaboxar",
"confirmations.block.confirm": "Bloquiar", "confirmations.block.confirm": "Bloquiar",
"confirmations.cancel_follow_request.confirm": "Retirala",
"confirmations.cancel_follow_request.message": "¿De xuru que quies retirar la solicitú pa siguir a {name}?",
"confirmations.delete.confirm": "Desaniciar", "confirmations.delete.confirm": "Desaniciar",
"confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?", "confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?",
"confirmations.delete_list.confirm": "Desaniciar", "confirmations.delete_list.confirm": "Desaniciar",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)", "compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)",
"confirmation_modal.cancel": "Скасаваць", "confirmation_modal.cancel": "Скасаваць",
"confirmations.block.confirm": "Заблакіраваць", "confirmations.block.confirm": "Заблакіраваць",
"confirmations.cancel_follow_request.confirm": "Скасаваць запыт",
"confirmations.cancel_follow_request.message": "Сапраўды хочаце скасаваць свой запыт на падпіску на {name}?",
"confirmations.delete.confirm": "Выдаліць", "confirmations.delete.confirm": "Выдаліць",
"confirmations.delete.message": "Вы ўпэўненыя, што хочаце выдаліць гэты допіс?", "confirmations.delete.message": "Вы ўпэўненыя, што хочаце выдаліць гэты допіс?",
"confirmations.delete_list.confirm": "Выдаліць", "confirmations.delete_list.confirm": "Выдаліць",
"confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?", "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?",
"confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.confirm": "Адмяніць",
"confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?",
"confirmations.domain_block.confirm": "Заблакіраваць сервер",
"confirmations.domain_block.message": "Вы абсалютна дакладна ўпэўнены, што хочаце заблакіраваць {domain} зусім? У большасці выпадкаў, дастаткова некалькіх мэтавых блакіровак ці ігнараванняў. Вы перастанеце бачыць змесціва з гэтага дамену ва ўсіх стужках і апавяшчэннях. Вашы падпіскі з гэтага дамену будуць выдаленыя.",
"confirmations.edit.confirm": "Рэдагаваць", "confirmations.edit.confirm": "Рэдагаваць",
"confirmations.edit.message": "Калі вы зменіце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?", "confirmations.edit.message": "Калі вы зменіце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?",
"confirmations.logout.confirm": "Выйсці", "confirmations.logout.confirm": "Выйсці",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)", "compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)",
"confirmation_modal.cancel": "Отказ", "confirmation_modal.cancel": "Отказ",
"confirmations.block.confirm": "Блокиране", "confirmations.block.confirm": "Блокиране",
"confirmations.cancel_follow_request.confirm": "Оттегляне на заявката",
"confirmations.cancel_follow_request.message": "Наистина ли искате да оттеглите заявката си за последване на {name}?",
"confirmations.delete.confirm": "Изтриване", "confirmations.delete.confirm": "Изтриване",
"confirmations.delete.message": "Наистина ли искате да изтриете публикацията?", "confirmations.delete.message": "Наистина ли искате да изтриете публикацията?",
"confirmations.delete_list.confirm": "Изтриване", "confirmations.delete_list.confirm": "Изтриване",
"confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?", "confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?",
"confirmations.discard_edit_media.confirm": "Отхвърляне", "confirmations.discard_edit_media.confirm": "Отхвърляне",
"confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?", "confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?",
"confirmations.domain_block.confirm": "Блокиране на сървър",
"confirmations.domain_block.message": "Наистина ли искате да блокирате целия {domain}? В повечето случаи няколко блокирания или заглушавания са достатъчно и за предпочитане. Няма да виждате съдържание от домейна из публични часови оси или известията си. Вашите последователи от този домейн ще се премахнат.",
"confirmations.edit.confirm": "Редактиране", "confirmations.edit.confirm": "Редактиране",
"confirmations.edit.message": "Редактирането сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", "confirmations.edit.message": "Редактирането сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?",
"confirmations.logout.confirm": "Излизане", "confirmations.logout.confirm": "Излизане",

View file

@ -146,15 +146,12 @@
"compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই", "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই",
"confirmation_modal.cancel": "বাতিল করুন", "confirmation_modal.cancel": "বাতিল করুন",
"confirmations.block.confirm": "ব্লক করুন", "confirmations.block.confirm": "ব্লক করুন",
"confirmations.cancel_follow_request.confirm": "অনুরোধ বাতিল করুন",
"confirmations.cancel_follow_request.message": "আপনি কি নিশ্চিত যে আপনি {name} কে অনুসরণ করার অনুরোধ প্রত্যাহার করতে চান?",
"confirmations.delete.confirm": "মুছে ফেলুন", "confirmations.delete.confirm": "মুছে ফেলুন",
"confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?", "confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?",
"confirmations.delete_list.confirm": "মুছে ফেলুন", "confirmations.delete_list.confirm": "মুছে ফেলুন",
"confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?",
"confirmations.discard_edit_media.confirm": "বাতিল করো", "confirmations.discard_edit_media.confirm": "বাতিল করো",
"confirmations.discard_edit_media.message": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?", "confirmations.discard_edit_media.message": "মিডিয়া Description বা Preview তে আপনার আপনার অসংরক্ষিত পরিবর্তন আছে, সেগুলো বাতিল করবেন?",
"confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।",
"confirmations.edit.confirm": "সম্পাদন", "confirmations.edit.confirm": "সম্পাদন",
"confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?", "confirmations.edit.message": "এখন সম্পাদনা করলে আপনি যে মেসেজ লিখছেন তা overwrite করবে, চালিয়ে যেতে চান?",
"confirmations.logout.confirm": "প্রস্থান", "confirmations.logout.confirm": "প্রস্থান",

View file

@ -159,15 +159,12 @@
"compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn",
"confirmation_modal.cancel": "Nullañ", "confirmation_modal.cancel": "Nullañ",
"confirmations.block.confirm": "Stankañ", "confirmations.block.confirm": "Stankañ",
"confirmations.cancel_follow_request.confirm": "Nullañ ar reked",
"confirmations.cancel_follow_request.message": "Ha sur oc'h e fell deoc'h nullañ ho reked evit heuliañ {name} ?",
"confirmations.delete.confirm": "Dilemel", "confirmations.delete.confirm": "Dilemel",
"confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?", "confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?",
"confirmations.delete_list.confirm": "Dilemel", "confirmations.delete_list.confirm": "Dilemel",
"confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?", "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
"confirmations.discard_edit_media.confirm": "Nac'hañ", "confirmations.discard_edit_media.confirm": "Nac'hañ",
"confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?", "confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?",
"confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.",
"confirmations.edit.confirm": "Kemmañ", "confirmations.edit.confirm": "Kemmañ",
"confirmations.logout.confirm": "Digevreañ", "confirmations.logout.confirm": "Digevreañ",
"confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?", "confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Avís de contingut (opcional)", "compose_form.spoiler_placeholder": "Avís de contingut (opcional)",
"confirmation_modal.cancel": "Cancel·la", "confirmation_modal.cancel": "Cancel·la",
"confirmations.block.confirm": "Bloca", "confirmations.block.confirm": "Bloca",
"confirmations.cancel_follow_request.confirm": "Retirar la sol·licitud",
"confirmations.cancel_follow_request.message": "Segur que vols retirar la sol·licitud de seguiment de {name}?",
"confirmations.delete.confirm": "Elimina", "confirmations.delete.confirm": "Elimina",
"confirmations.delete.message": "Segur que vols eliminar aquest tut?", "confirmations.delete.message": "Segur que vols eliminar aquest tut?",
"confirmations.delete.title": "Elimina la publicació?",
"confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.confirm": "Elimina",
"confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?",
"confirmations.delete_list.title": "Elimina la llista?",
"confirmations.discard_edit_media.confirm": "Descarta", "confirmations.discard_edit_media.confirm": "Descarta",
"confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?", "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?",
"confirmations.domain_block.confirm": "Bloca el servidor",
"confirmations.domain_block.message": "Segur que vols blocar {domain} del tot? En la majoria dels casos, només amb blocar o silenciar uns pocs comptes n'hi ha prou i és millor. No veuràs el contingut daquest domini en cap de les línies de temps ni en les notificacions. S'eliminaran els teus seguidors daquest domini.",
"confirmations.edit.confirm": "Edita", "confirmations.edit.confirm": "Edita",
"confirmations.edit.message": "Editant ara sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", "confirmations.edit.message": "Editant ara sobreescriuràs el missatge que estàs editant. Segur que vols continuar?",
"confirmations.edit.title": "Sobreescriu la publicació?",
"confirmations.logout.confirm": "Tanca la sessió", "confirmations.logout.confirm": "Tanca la sessió",
"confirmations.logout.message": "Segur que vols tancar la sessió?", "confirmations.logout.message": "Segur que vols tancar la sessió?",
"confirmations.logout.title": "Tanca la sessió?",
"confirmations.mute.confirm": "Silencia", "confirmations.mute.confirm": "Silencia",
"confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.confirm": "Esborra i reescriu",
"confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.",
"confirmations.redraft.title": "Esborra i reescriu la publicació?",
"confirmations.reply.confirm": "Respon", "confirmations.reply.confirm": "Respon",
"confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?", "confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?",
"confirmations.reply.title": "Sobreescriu la publicació?",
"confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.confirm": "Deixa de seguir",
"confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
"confirmations.unfollow.title": "Deixa de seguir l'usuari?",
"conversation.delete": "Elimina la conversa", "conversation.delete": "Elimina la conversa",
"conversation.mark_as_read": "Marca com a llegida", "conversation.mark_as_read": "Marca com a llegida",
"conversation.open": "Mostra la conversa", "conversation.open": "Mostra la conversa",
@ -507,6 +510,7 @@
"notification_requests.title": "Notificacions filtrades", "notification_requests.title": "Notificacions filtrades",
"notifications.clear": "Esborra les notificacions", "notifications.clear": "Esborra les notificacions",
"notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?",
"notifications.clear_title": "Esborra les notificacions?",
"notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.report": "Nous informes:",
"notifications.column_settings.admin.sign_up": "Registres nous:", "notifications.column_settings.admin.sign_up": "Registres nous:",
"notifications.column_settings.alert": "Notificacions d'escriptori", "notifications.column_settings.alert": "Notificacions d'escriptori",

View file

@ -158,15 +158,12 @@
"compose_form.spoiler_placeholder": "ئاگادارکردنەوەی ناوەڕۆک (ئیختیاری)", "compose_form.spoiler_placeholder": "ئاگادارکردنەوەی ناوەڕۆک (ئیختیاری)",
"confirmation_modal.cancel": "هەڵوەشاندنەوه", "confirmation_modal.cancel": "هەڵوەشاندنەوه",
"confirmations.block.confirm": "بلۆک", "confirmations.block.confirm": "بلۆک",
"confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە",
"confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟",
"confirmations.delete.confirm": "سڕینەوە", "confirmations.delete.confirm": "سڕینەوە",
"confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?", "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
"confirmations.delete_list.confirm": "سڕینەوە", "confirmations.delete_list.confirm": "سڕینەوە",
"confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?", "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
"confirmations.discard_edit_media.confirm": "ڕەتکردنەوە", "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە",
"confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟", "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟",
"confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
"confirmations.edit.confirm": "دەستکاری", "confirmations.edit.confirm": "دەستکاری",
"confirmations.edit.message": "دەستکاری کردنی ئێستا: دەبێتە هۆی نووسینەوەی ئەو پەیامەی، کە ئێستا داتدەڕشت. ئایا دڵنیای، کە دەتەوێت بەردەوام بیت؟", "confirmations.edit.message": "دەستکاری کردنی ئێستا: دەبێتە هۆی نووسینەوەی ئەو پەیامەی، کە ئێستا داتدەڕشت. ئایا دڵنیای، کە دەتەوێت بەردەوام بیت؟",
"confirmations.logout.confirm": "چوونە دەرەوە", "confirmations.logout.confirm": "چوونە دەرەوە",

View file

@ -89,7 +89,6 @@
"confirmations.delete_list.confirm": "Toglie", "confirmations.delete_list.confirm": "Toglie",
"confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?", "confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?",
"confirmations.discard_edit_media.confirm": "Scartà", "confirmations.discard_edit_media.confirm": "Scartà",
"confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.",
"confirmations.logout.confirm": "Scunnettassi", "confirmations.logout.confirm": "Scunnettassi",
"confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?", "confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?",
"confirmations.mute.confirm": "Piattà", "confirmations.mute.confirm": "Piattà",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)", "compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)",
"confirmation_modal.cancel": "Zrušit", "confirmation_modal.cancel": "Zrušit",
"confirmations.block.confirm": "Blokovat", "confirmations.block.confirm": "Blokovat",
"confirmations.cancel_follow_request.confirm": "Zrušit žádost",
"confirmations.cancel_follow_request.message": "Opravdu chcete zrušit svou žádost o sledování {name}?",
"confirmations.delete.confirm": "Smazat", "confirmations.delete.confirm": "Smazat",
"confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?", "confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?",
"confirmations.delete_list.confirm": "Smazat", "confirmations.delete_list.confirm": "Smazat",
"confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?", "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
"confirmations.discard_edit_media.confirm": "Zahodit", "confirmations.discard_edit_media.confirm": "Zahodit",
"confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?", "confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?",
"confirmations.domain_block.confirm": "Blokovat server",
"confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
"confirmations.edit.confirm": "Upravit", "confirmations.edit.confirm": "Upravit",
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?", "confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
"confirmations.logout.confirm": "Odhlásit se", "confirmations.logout.confirm": "Odhlásit se",

View file

@ -166,16 +166,12 @@
"compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)",
"confirmation_modal.cancel": "Canslo", "confirmation_modal.cancel": "Canslo",
"confirmations.block.confirm": "Blocio", "confirmations.block.confirm": "Blocio",
"confirmations.cancel_follow_request.confirm": "Tynnu'r cais yn ôl",
"confirmations.cancel_follow_request.message": "Ydych chi'n siŵr eich bod am dynnu'ch cais i ddilyn {name} yn ôl?",
"confirmations.delete.confirm": "Dileu", "confirmations.delete.confirm": "Dileu",
"confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?",
"confirmations.delete_list.confirm": "Dileu", "confirmations.delete_list.confirm": "Dileu",
"confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?",
"confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.confirm": "Dileu",
"confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?",
"confirmations.domain_block.confirm": "Blocio gweinydd",
"confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.",
"confirmations.edit.confirm": "Golygu", "confirmations.edit.confirm": "Golygu",
"confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?", "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?",
"confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.confirm": "Allgofnodi",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)",
"confirmation_modal.cancel": "Afbryd", "confirmation_modal.cancel": "Afbryd",
"confirmations.block.confirm": "Blokér", "confirmations.block.confirm": "Blokér",
"confirmations.cancel_follow_request.confirm": "Annullér anmodning",
"confirmations.cancel_follow_request.message": "Er du sikker på, at anmodningen om at følge {name} skal annulleres?",
"confirmations.delete.confirm": "Slet", "confirmations.delete.confirm": "Slet",
"confirmations.delete.message": "Er du sikker på, at du vil slette dette indlæg?", "confirmations.delete.message": "Er du sikker på, at du vil slette dette indlæg?",
"confirmations.delete.title": "Slet indlæg?",
"confirmations.delete_list.confirm": "Slet", "confirmations.delete_list.confirm": "Slet",
"confirmations.delete_list.message": "Er du sikker på, at du vil slette denne liste permanent?", "confirmations.delete_list.message": "Er du sikker på, at du vil slette denne liste permanent?",
"confirmations.delete_list.title": "Slet liste?",
"confirmations.discard_edit_media.confirm": "Kassér", "confirmations.discard_edit_media.confirm": "Kassér",
"confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?", "confirmations.discard_edit_media.message": "Der er ugemte ændringer i mediebeskrivelsen eller forhåndsvisningen, kassér dem alligevel?",
"confirmations.domain_block.confirm": "Blokér server",
"confirmations.domain_block.message": "Er du fuldstændig sikker på, at du vil blokere hele {domain}-domænet? Oftest vil nogle få målrettede blokeringer eller skjulninger være tilstrækkelige og at foretrække. Du vil ikke se indhold fra dette domæne i nogle offentlige tidslinjer eller i dine notifikationer, og dine følgere herfra fjernes ligeledes.",
"confirmations.edit.confirm": "Redigér", "confirmations.edit.confirm": "Redigér",
"confirmations.edit.message": "Redigeres nu, overskrive den besked, der forfattes pt. Fortsæt alligevel?", "confirmations.edit.message": "Redigeres nu, overskrive den besked, der forfattes pt. Fortsæt alligevel?",
"confirmations.edit.title": "Overskriv indlæg?",
"confirmations.logout.confirm": "Log ud", "confirmations.logout.confirm": "Log ud",
"confirmations.logout.message": "Er du sikker på, at du vil logge ud?", "confirmations.logout.message": "Er du sikker på, at du vil logge ud?",
"confirmations.logout.title": "Log ud?",
"confirmations.mute.confirm": "Skjul (mute)", "confirmations.mute.confirm": "Skjul (mute)",
"confirmations.redraft.confirm": "Slet og omformulér", "confirmations.redraft.confirm": "Slet og omformulér",
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.", "confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
"confirmations.redraft.title": "Slet og omformulér indlæg?",
"confirmations.reply.confirm": "Svar", "confirmations.reply.confirm": "Svar",
"confirmations.reply.message": "Hvis du svarer nu, vil det overskrive den besked, du er ved at skrive. Fortsæt alligevel?", "confirmations.reply.message": "Hvis du svarer nu, vil det overskrive den besked, du er ved at skrive. Fortsæt alligevel?",
"confirmations.reply.title": "Overskriv indlæg?",
"confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.confirm": "Følg ikke længere",
"confirmations.unfollow.message": "Er du sikker på, at du ikke længere vil følge {name}?", "confirmations.unfollow.message": "Er du sikker på, at du ikke længere vil følge {name}?",
"confirmations.unfollow.title": "Følg ikke længere bruger?",
"conversation.delete": "Slet samtale", "conversation.delete": "Slet samtale",
"conversation.mark_as_read": "Markér som læst", "conversation.mark_as_read": "Markér som læst",
"conversation.open": "Vis samtale", "conversation.open": "Vis samtale",
@ -507,6 +510,7 @@
"notification_requests.title": "Filtrerede notifikationer", "notification_requests.title": "Filtrerede notifikationer",
"notifications.clear": "Ryd notifikationer", "notifications.clear": "Ryd notifikationer",
"notifications.clear_confirmation": "Er du sikker på, at du vil rydde alle dine notifikationer permanent?", "notifications.clear_confirmation": "Er du sikker på, at du vil rydde alle dine notifikationer permanent?",
"notifications.clear_title": "Ryd notifikationer?",
"notifications.column_settings.admin.report": "Nye anmeldelser:", "notifications.column_settings.admin.report": "Nye anmeldelser:",
"notifications.column_settings.admin.sign_up": "Nye tilmeldinger:", "notifications.column_settings.admin.sign_up": "Nye tilmeldinger:",
"notifications.column_settings.alert": "Computernotifikationer", "notifications.column_settings.alert": "Computernotifikationer",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Inhaltswarnung (optional)", "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)",
"confirmation_modal.cancel": "Abbrechen", "confirmation_modal.cancel": "Abbrechen",
"confirmations.block.confirm": "Blockieren", "confirmations.block.confirm": "Blockieren",
"confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen",
"confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?",
"confirmations.delete.confirm": "Löschen", "confirmations.delete.confirm": "Löschen",
"confirmations.delete.message": "Möchtest du diesen Beitrag wirklich löschen?", "confirmations.delete.message": "Möchtest du diesen Beitrag wirklich löschen?",
"confirmations.delete.title": "Beitrag löschen?",
"confirmations.delete_list.confirm": "Löschen", "confirmations.delete_list.confirm": "Löschen",
"confirmations.delete_list.message": "Möchtest du diese Liste für immer löschen?", "confirmations.delete_list.message": "Möchtest du diese Liste für immer löschen?",
"confirmations.delete_list.title": "Liste löschen?",
"confirmations.discard_edit_media.confirm": "Verwerfen", "confirmations.discard_edit_media.confirm": "Verwerfen",
"confirmations.discard_edit_media.message": "Du hast Änderungen an der Medienbeschreibung oder -vorschau vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?", "confirmations.discard_edit_media.message": "Du hast Änderungen an der Medienbeschreibung oder -vorschau vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?",
"confirmations.domain_block.confirm": "Server blockieren",
"confirmations.domain_block.message": "Möchtest du die gesamte Domain {domain} wirklich blockieren? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Du wirst den Inhalt von dieser Domain nicht in irgendwelchen öffentlichen Timelines oder den Benachrichtigungen finden. Auch deine Follower von dieser Domain werden entfernt.",
"confirmations.edit.confirm": "Bearbeiten", "confirmations.edit.confirm": "Bearbeiten",
"confirmations.edit.message": "Das Bearbeiten überschreibt die Nachricht, die du gerade verfasst. Möchtest du wirklich fortfahren?", "confirmations.edit.message": "Das Bearbeiten überschreibt die Nachricht, die du gerade verfasst. Möchtest du wirklich fortfahren?",
"confirmations.edit.title": "Beitrag überschreiben?",
"confirmations.logout.confirm": "Abmelden", "confirmations.logout.confirm": "Abmelden",
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
"confirmations.logout.title": "Abmelden?",
"confirmations.mute.confirm": "Stummschalten", "confirmations.mute.confirm": "Stummschalten",
"confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.confirm": "Löschen und neu erstellen",
"confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.", "confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.",
"confirmations.redraft.title": "Beitrag löschen & neu verfassen?",
"confirmations.reply.confirm": "Antworten", "confirmations.reply.confirm": "Antworten",
"confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?", "confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?",
"confirmations.reply.title": "Beitrag überschreiben?",
"confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.confirm": "Entfolgen",
"confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?", "confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?",
"confirmations.unfollow.title": "Profil entfolgen?",
"conversation.delete": "Unterhaltung löschen", "conversation.delete": "Unterhaltung löschen",
"conversation.mark_as_read": "Als gelesen markieren", "conversation.mark_as_read": "Als gelesen markieren",
"conversation.open": "Unterhaltung anzeigen", "conversation.open": "Unterhaltung anzeigen",
@ -507,6 +510,7 @@
"notification_requests.title": "Gefilterte Benachrichtigungen", "notification_requests.title": "Gefilterte Benachrichtigungen",
"notifications.clear": "Benachrichtigungen löschen", "notifications.clear": "Benachrichtigungen löschen",
"notifications.clear_confirmation": "Möchtest du wirklich alle Benachrichtigungen für immer löschen?", "notifications.clear_confirmation": "Möchtest du wirklich alle Benachrichtigungen für immer löschen?",
"notifications.clear_title": "Benachrichtigungen löschen?",
"notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.report": "Neue Meldungen:",
"notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:",
"notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.alert": "Desktop-Benachrichtigungen",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)", "compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)",
"confirmation_modal.cancel": "Άκυρο", "confirmation_modal.cancel": "Άκυρο",
"confirmations.block.confirm": "Αποκλεισμός", "confirmations.block.confirm": "Αποκλεισμός",
"confirmations.cancel_follow_request.confirm": "Απόσυρση αιτήματος",
"confirmations.cancel_follow_request.message": "Είσαι σίγουρος/η ότι θέλεις να αποσύρεις το αίτημά σου να ακολουθείς τον/την {name};",
"confirmations.delete.confirm": "Διαγραφή", "confirmations.delete.confirm": "Διαγραφή",
"confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτή τη δημοσίευση;", "confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτή τη δημοσίευση;",
"confirmations.delete_list.confirm": "Διαγραφή", "confirmations.delete_list.confirm": "Διαγραφή",
"confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;", "confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;",
"confirmations.discard_edit_media.confirm": "Απόρριψη", "confirmations.discard_edit_media.confirm": "Απόρριψη",
"confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;", "confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;",
"confirmations.domain_block.confirm": "Αποκλεισμός διακομιστή",
"confirmations.domain_block.message": "Σίγουρα θες να αποκλείσεις ολόκληρο τον {domain}; Συνήθως μερικοί συγκεκρίμένοι αποκλεισμοί ή σιγάσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον τομέα σε καμία δημόσια ροή ή στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον τομέα θα αφαιρεθούν.",
"confirmations.edit.confirm": "Επεξεργασία", "confirmations.edit.confirm": "Επεξεργασία",
"confirmations.edit.message": "Αν το επεξεργαστείς τώρα θα αντικατασταθεί το μήνυμα που συνθέτεις. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;", "confirmations.edit.message": "Αν το επεξεργαστείς τώρα θα αντικατασταθεί το μήνυμα που συνθέτεις. Είσαι σίγουρος ότι θέλεις να συνεχίσεις;",
"confirmations.logout.confirm": "Αποσύνδεση", "confirmations.logout.confirm": "Αποσύνδεση",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Content warning (optional)", "compose_form.spoiler_placeholder": "Content warning (optional)",
"confirmation_modal.cancel": "Cancel", "confirmation_modal.cancel": "Cancel",
"confirmations.block.confirm": "Block", "confirmations.block.confirm": "Block",
"confirmations.cancel_follow_request.confirm": "Withdraw request",
"confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
"confirmations.delete.confirm": "Delete", "confirmations.delete.confirm": "Delete",
"confirmations.delete.message": "Are you sure you want to delete this post?", "confirmations.delete.message": "Are you sure you want to delete this post?",
"confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Block server",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.edit.confirm": "Edit", "confirmations.edit.confirm": "Edit",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.logout.confirm": "Log out", "confirmations.logout.confirm": "Log out",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Content warning (optional)", "compose_form.spoiler_placeholder": "Content warning (optional)",
"confirmation_modal.cancel": "Cancel", "confirmation_modal.cancel": "Cancel",
"confirmations.block.confirm": "Block", "confirmations.block.confirm": "Block",
"confirmations.cancel_follow_request.confirm": "Withdraw request",
"confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
"confirmations.delete.confirm": "Delete", "confirmations.delete.confirm": "Delete",
"confirmations.delete.message": "Are you sure you want to delete this post?", "confirmations.delete.message": "Are you sure you want to delete this post?",
"confirmations.delete.title": "Delete post?",
"confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.delete_list.title": "Delete list?",
"confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Block server",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.edit.confirm": "Edit", "confirmations.edit.confirm": "Edit",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.edit.title": "Overwrite post?",
"confirmations.logout.confirm": "Log out", "confirmations.logout.confirm": "Log out",
"confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.message": "Are you sure you want to log out?",
"confirmations.logout.title": "Log out?",
"confirmations.mute.confirm": "Mute", "confirmations.mute.confirm": "Mute",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.",
"confirmations.redraft.title": "Delete & redraft post?",
"confirmations.reply.confirm": "Reply", "confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.reply.title": "Overwrite post?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"confirmations.unfollow.title": "Unfollow user?",
"conversation.delete": "Delete conversation", "conversation.delete": "Delete conversation",
"conversation.mark_as_read": "Mark as read", "conversation.mark_as_read": "Mark as read",
"conversation.open": "View conversation", "conversation.open": "View conversation",
@ -507,6 +510,7 @@
"notification_requests.title": "Filtered notifications", "notification_requests.title": "Filtered notifications",
"notifications.clear": "Clear notifications", "notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
"notifications.clear_title": "Clear notifications?",
"notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.report": "New reports:",
"notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.alert": "Desktop notifications",

View file

@ -150,15 +150,12 @@
"compose_form.spoiler.unmarked": "Aldoni averton de enhavo", "compose_form.spoiler.unmarked": "Aldoni averton de enhavo",
"confirmation_modal.cancel": "Nuligi", "confirmation_modal.cancel": "Nuligi",
"confirmations.block.confirm": "Bloki", "confirmations.block.confirm": "Bloki",
"confirmations.cancel_follow_request.confirm": "Eksigi peton",
"confirmations.cancel_follow_request.message": "Ĉu vi certas ke vi volas eksigi vian peton por sekvi {name}?",
"confirmations.delete.confirm": "Forigi", "confirmations.delete.confirm": "Forigi",
"confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝon?", "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝon?",
"confirmations.delete_list.confirm": "Forigi", "confirmations.delete_list.confirm": "Forigi",
"confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
"confirmations.discard_edit_media.confirm": "Forĵeti", "confirmations.discard_edit_media.confirm": "Forĵeti",
"confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭmontro de la plurmedio, ĉu vi forĵetu ilin malgraŭe?", "confirmations.discard_edit_media.message": "Vi havas nekonservitajn ŝanĝojn de la priskribo aŭ la antaŭmontro de la plurmedio, ĉu vi forĵetu ilin malgraŭe?",
"confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.",
"confirmations.edit.confirm": "Redakti", "confirmations.edit.confirm": "Redakti",
"confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.edit.message": "Redakti nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?",
"confirmations.logout.confirm": "Adiaŭi", "confirmations.logout.confirm": "Adiaŭi",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar", "confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Bloquear", "confirmations.block.confirm": "Bloquear",
"confirmations.cancel_follow_request.confirm": "Retirar solicitud",
"confirmations.cancel_follow_request.message": "¿Estás seguro que querés retirar tu solicitud para seguir a {name}?",
"confirmations.delete.confirm": "Eliminar", "confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?", "confirmations.delete.message": "¿Estás seguro que querés eliminar este mensaje?",
"confirmations.delete.title": "¿Eliminar publicación?",
"confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?",
"confirmations.delete_list.title": "¿Eliminar lista?",
"confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?", "confirmations.discard_edit_media.message": "Tenés cambios sin guardar en la descripción de medios o en la vista previa, ¿querés descartarlos de todos modos?",
"confirmations.domain_block.confirm": "Bloquear servidor",
"confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.",
"confirmations.edit.confirm": "Editar", "confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "Editar ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", "confirmations.edit.message": "Editar ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
"confirmations.edit.title": "¿Sobrescribir publicación?",
"confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.confirm": "Cerrar sesión",
"confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
"confirmations.logout.title": "¿Cerrar sesión?",
"confirmations.mute.confirm": "Silenciar", "confirmations.mute.confirm": "Silenciar",
"confirmations.redraft.confirm": "Eliminar mensaje original y editarlo", "confirmations.redraft.confirm": "Eliminar mensaje original y editarlo",
"confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.", "confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.",
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
"confirmations.reply.confirm": "Responder", "confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
"confirmations.reply.title": "¿Sobrescribir publicación?",
"confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.confirm": "Dejar de seguir",
"confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?",
"confirmations.unfollow.title": "¿Dejar de seguir al usuario?",
"conversation.delete": "Eliminar conversación", "conversation.delete": "Eliminar conversación",
"conversation.mark_as_read": "Marcar como leída", "conversation.mark_as_read": "Marcar como leída",
"conversation.open": "Ver conversación", "conversation.open": "Ver conversación",
@ -507,6 +510,7 @@
"notification_requests.title": "Notificaciones filtradas", "notification_requests.title": "Notificaciones filtradas",
"notifications.clear": "Limpiar notificaciones", "notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?",
"notifications.clear_title": "¿Borrar notificaciones?",
"notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.report": "Nuevas denuncias:",
"notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.admin.sign_up": "Nuevos registros:",
"notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.alert": "Notificaciones de escritorio",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar", "confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Bloquear", "confirmations.block.confirm": "Bloquear",
"confirmations.cancel_follow_request.confirm": "Retirar solicitud",
"confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?",
"confirmations.delete.confirm": "Eliminar", "confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?", "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?",
"confirmations.delete.title": "¿Eliminar publicación?",
"confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
"confirmations.delete_list.title": "¿Eliminar lista?",
"confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo, ¿deseas descartarlos de cualquier manera?",
"confirmations.domain_block.confirm": "Bloquear servidor",
"confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
"confirmations.edit.confirm": "Editar", "confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.edit.message": "Editar sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
"confirmations.edit.title": "¿Sobrescribir publicación?",
"confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.confirm": "Cerrar sesión",
"confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?",
"confirmations.logout.title": "¿Cerrar sesión?",
"confirmations.mute.confirm": "Silenciar", "confirmations.mute.confirm": "Silenciar",
"confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.", "confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
"confirmations.reply.confirm": "Responder", "confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
"confirmations.reply.title": "¿Sobrescribir publicación?",
"confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.confirm": "Dejar de seguir",
"confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
"confirmations.unfollow.title": "¿Dejar de seguir al usuario?",
"conversation.delete": "Borrar conversación", "conversation.delete": "Borrar conversación",
"conversation.mark_as_read": "Marcar como leído", "conversation.mark_as_read": "Marcar como leído",
"conversation.open": "Ver conversación", "conversation.open": "Ver conversación",
@ -507,6 +510,7 @@
"notification_requests.title": "Notificaciones filtradas", "notification_requests.title": "Notificaciones filtradas",
"notifications.clear": "Limpiar notificaciones", "notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?", "notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?",
"notifications.clear_title": "¿Borrar notificaciones?",
"notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.report": "Nuevas denuncias:",
"notifications.column_settings.admin.sign_up": "Registros nuevos:", "notifications.column_settings.admin.sign_up": "Registros nuevos:",
"notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.alert": "Notificaciones de escritorio",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar", "confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Bloquear", "confirmations.block.confirm": "Bloquear",
"confirmations.cancel_follow_request.confirm": "Retirar solicitud",
"confirmations.cancel_follow_request.message": "¿Estás seguro de que deseas retirar tu solicitud para seguir a {name}?",
"confirmations.delete.confirm": "Eliminar", "confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?", "confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?",
"confirmations.delete.title": "¿Eliminar publicación?",
"confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
"confirmations.delete_list.title": "¿Eliminar lista?",
"confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?", "confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?",
"confirmations.domain_block.confirm": "Bloquear servidor",
"confirmations.domain_block.message": "¿Seguro que quieres bloquear todo el dominio {domain}? En general, unos cuantos bloqueos y silenciados concretos es suficiente y preferible. No verás contenido del dominio en ninguna cronología pública ni en tus notificaciones. Se eliminarán tus seguidores procedentes de ese dominio.",
"confirmations.edit.confirm": "Editar", "confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "Editar ahora reemplazará el mensaje que estás escribiendo. ¿Seguro que quieres proceder?", "confirmations.edit.message": "Editar ahora reemplazará el mensaje que estás escribiendo. ¿Seguro que quieres proceder?",
"confirmations.edit.title": "¿Sobrescribir publicación?",
"confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.confirm": "Cerrar sesión",
"confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?", "confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?",
"confirmations.logout.title": "¿Cerrar sesión?",
"confirmations.mute.confirm": "Silenciar", "confirmations.mute.confirm": "Silenciar",
"confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.", "confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.",
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
"confirmations.reply.confirm": "Responder", "confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Seguro que deseas continuar?", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Seguro que deseas continuar?",
"confirmations.reply.title": "¿Sobrescribir publicación?",
"confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.confirm": "Dejar de seguir",
"confirmations.unfollow.message": "¿Seguro que quieres dejar de seguir a {name}?", "confirmations.unfollow.message": "¿Seguro que quieres dejar de seguir a {name}?",
"confirmations.unfollow.title": "¿Dejar de seguir al usuario?",
"conversation.delete": "Borrar conversación", "conversation.delete": "Borrar conversación",
"conversation.mark_as_read": "Marcar como leído", "conversation.mark_as_read": "Marcar como leído",
"conversation.open": "Ver conversación", "conversation.open": "Ver conversación",
@ -507,6 +510,7 @@
"notification_requests.title": "Notificaciones filtradas", "notification_requests.title": "Notificaciones filtradas",
"notifications.clear": "Limpiar notificaciones", "notifications.clear": "Limpiar notificaciones",
"notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?", "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
"notifications.clear_title": "¿Borrar notificaciones?",
"notifications.column_settings.admin.report": "Nuevos informes:", "notifications.column_settings.admin.report": "Nuevos informes:",
"notifications.column_settings.admin.sign_up": "Nuevos registros:", "notifications.column_settings.admin.sign_up": "Nuevos registros:",
"notifications.column_settings.alert": "Notificaciones de escritorio", "notifications.column_settings.alert": "Notificaciones de escritorio",

View file

@ -166,16 +166,12 @@
"compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)", "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)",
"confirmation_modal.cancel": "Katkesta", "confirmation_modal.cancel": "Katkesta",
"confirmations.block.confirm": "Blokeeri", "confirmations.block.confirm": "Blokeeri",
"confirmations.cancel_follow_request.confirm": "Tühista taotlus",
"confirmations.cancel_follow_request.message": "Oled kindel, et soovid kasutaja {name} jälgimistaotluse tagasi võtta?",
"confirmations.delete.confirm": "Kustuta", "confirmations.delete.confirm": "Kustuta",
"confirmations.delete.message": "Oled kindel, et soovid postituse kustutada?", "confirmations.delete.message": "Oled kindel, et soovid postituse kustutada?",
"confirmations.delete_list.confirm": "Kustuta", "confirmations.delete_list.confirm": "Kustuta",
"confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?", "confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?",
"confirmations.discard_edit_media.confirm": "Hülga", "confirmations.discard_edit_media.confirm": "Hülga",
"confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?", "confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?",
"confirmations.domain_block.confirm": "Blokeeri server",
"confirmations.domain_block.message": "Oled ikka päris-päris kindel, et soovid blokeerida terve {domain}? Enamikel juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatavam. Sa ei näe selle domeeni sisu ühelgi avalikul ajajoonel või enda teadetes. Su jälgijad sellest domeenist eemaldatakse.",
"confirmations.edit.confirm": "Muuda", "confirmations.edit.confirm": "Muuda",
"confirmations.edit.message": "Muutes praegu kirjutatakse hetkel loodav sõnum üle. Kas oled kindel, et soovid jätkata?", "confirmations.edit.message": "Muutes praegu kirjutatakse hetkel loodav sõnum üle. Kas oled kindel, et soovid jätkata?",
"confirmations.logout.confirm": "Välju", "confirmations.logout.confirm": "Välju",

View file

@ -166,23 +166,23 @@
"compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)", "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)",
"confirmation_modal.cancel": "Utzi", "confirmation_modal.cancel": "Utzi",
"confirmations.block.confirm": "Blokeatu", "confirmations.block.confirm": "Blokeatu",
"confirmations.cancel_follow_request.confirm": "Baztertu eskaera",
"confirmations.cancel_follow_request.message": "Ziur {name} jarraitzeko eskaera bertan behera utzi nahi duzula?",
"confirmations.delete.confirm": "Ezabatu", "confirmations.delete.confirm": "Ezabatu",
"confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?", "confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?",
"confirmations.delete.title": "Ezabatu bidalketa?",
"confirmations.delete_list.confirm": "Ezabatu", "confirmations.delete_list.confirm": "Ezabatu",
"confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?",
"confirmations.delete_list.title": "Ezabatu zerrenda?",
"confirmations.discard_edit_media.confirm": "Baztertu", "confirmations.discard_edit_media.confirm": "Baztertu",
"confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?", "confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?",
"confirmations.domain_block.confirm": "Blokeatu zerbitzaria",
"confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.",
"confirmations.edit.confirm": "Editatu", "confirmations.edit.confirm": "Editatu",
"confirmations.edit.message": "Orain editatzen baduzu, une honetan idazten ari zaren mezua gainidatziko da. Ziur jarraitu nahi duzula?", "confirmations.edit.message": "Orain editatzen baduzu, une honetan idazten ari zaren mezua gainidatziko da. Ziur jarraitu nahi duzula?",
"confirmations.logout.confirm": "Amaitu saioa", "confirmations.logout.confirm": "Amaitu saioa",
"confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?",
"confirmations.logout.title": "Itxi saioa?",
"confirmations.mute.confirm": "Mututu", "confirmations.mute.confirm": "Mututu",
"confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.confirm": "Ezabatu eta berridatzi",
"confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.", "confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.",
"confirmations.redraft.title": "Ezabatu eta berridatzi bidalketa?",
"confirmations.reply.confirm": "Erantzun", "confirmations.reply.confirm": "Erantzun",
"confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?",
"confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.confirm": "Utzi jarraitzeari",
@ -492,9 +492,12 @@
"notification_requests.title": "Iragazitako jakinarazpenak", "notification_requests.title": "Iragazitako jakinarazpenak",
"notifications.clear": "Garbitu jakinarazpenak", "notifications.clear": "Garbitu jakinarazpenak",
"notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
"notifications.clear_title": "Garbitu jakinarazpenak?",
"notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.report": "Txosten berriak:",
"notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
"notifications.column_settings.beta.category": "Ezaugarri esperimentalak",
"notifications.column_settings.beta.grouping": "Multzokatu jakinarazpenak",
"notifications.column_settings.favourite": "Gogokoak:", "notifications.column_settings.favourite": "Gogokoak:",
"notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak", "notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak",
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra", "notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
@ -659,8 +662,11 @@
"report_notification.attached_statuses": "{count, plural, one {Bidalketa {count}} other {{count} bidalketa}} erantsita", "report_notification.attached_statuses": "{count, plural, one {Bidalketa {count}} other {{count} bidalketa}} erantsita",
"report_notification.categories.legal": "Legala", "report_notification.categories.legal": "Legala",
"report_notification.categories.other": "Bestelakoak", "report_notification.categories.other": "Bestelakoak",
"report_notification.categories.other_sentence": "bestelakoak",
"report_notification.categories.spam": "Spam", "report_notification.categories.spam": "Spam",
"report_notification.categories.spam_sentence": "spama",
"report_notification.categories.violation": "Arau haustea", "report_notification.categories.violation": "Arau haustea",
"report_notification.categories.violation_sentence": "arau haustea",
"report_notification.open": "Ireki salaketa", "report_notification.open": "Ireki salaketa",
"search.no_recent_searches": "Duela gutxiko bilaketarik ez", "search.no_recent_searches": "Duela gutxiko bilaketarik ez",
"search.placeholder": "Bilatu", "search.placeholder": "Bilatu",

View file

@ -158,15 +158,12 @@
"compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)", "compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)",
"confirmation_modal.cancel": "لغو", "confirmation_modal.cancel": "لغو",
"confirmations.block.confirm": "انسداد", "confirmations.block.confirm": "انسداد",
"confirmations.cancel_follow_request.confirm": "رد کردن درخواست",
"confirmations.cancel_follow_request.message": "مطمئنید که می خواهید درخواست پی‌گیری {name} را لغو کنید؟",
"confirmations.delete.confirm": "حذف", "confirmations.delete.confirm": "حذف",
"confirmations.delete.message": "آیا مطمئنید که می‌خواهید این فرسته را حذف کنید؟", "confirmations.delete.message": "آیا مطمئنید که می‌خواهید این فرسته را حذف کنید؟",
"confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "مطمئنید می‌خواهید این سیاهه را برای همیشه حذف کنید؟", "confirmations.delete_list.message": "مطمئنید می‌خواهید این سیاهه را برای همیشه حذف کنید؟",
"confirmations.discard_edit_media.confirm": "دور انداختن", "confirmations.discard_edit_media.confirm": "دور انداختن",
"confirmations.discard_edit_media.message": "تغییرات ذخیره نشده‌ای در توضیحات یا پیش‌نمایش رسانه دارید. همگی نادیده گرفته شوند؟", "confirmations.discard_edit_media.message": "تغییرات ذخیره نشده‌ای در توضیحات یا پیش‌نمایش رسانه دارید. همگی نادیده گرفته شوند؟",
"confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از این دامنه هم برداشته خواهند شد.",
"confirmations.edit.confirm": "ویرایش", "confirmations.edit.confirm": "ویرایش",
"confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. می‌خواهید ادامه دهید؟", "confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. می‌خواهید ادامه دهید؟",
"confirmations.logout.confirm": "خروج از حساب", "confirmations.logout.confirm": "خروج از حساب",

View file

@ -6,7 +6,7 @@
"about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä, ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä, ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.",
"about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.",
"about.domain_blocks.silenced.title": "Rajoitettu", "about.domain_blocks.silenced.title": "Rajoitettu",
"about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta eikä vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.",
"about.domain_blocks.suspended.title": "Jäädytetty", "about.domain_blocks.suspended.title": "Jäädytetty",
"about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.", "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.",
"about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}", "about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}",
@ -66,7 +66,7 @@
"account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}",
"account.unblock": "Kumoa käyttäjän @{name} esto", "account.unblock": "Kumoa käyttäjän @{name} esto",
"account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto", "account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto",
"account.unblock_short": "Poista esto", "account.unblock_short": "Kumoa esto",
"account.unendorse": "Kumoa suosittelu profiilissasi", "account.unendorse": "Kumoa suosittelu profiilissasi",
"account.unfollow": "Lopeta seuraaminen", "account.unfollow": "Lopeta seuraaminen",
"account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute": "Poista käyttäjän @{name} mykistys",
@ -82,7 +82,7 @@
"admin.impact_report.instance_followers": "Seuraajat, jotka käyttäjämme menettäisivät", "admin.impact_report.instance_followers": "Seuraajat, jotka käyttäjämme menettäisivät",
"admin.impact_report.instance_follows": "Seuraajat, jotka heidän käyttäjänsä menettäisivät", "admin.impact_report.instance_follows": "Seuraajat, jotka heidän käyttäjänsä menettäisivät",
"admin.impact_report.title": "Vaikutusten yhteenveto", "admin.impact_report.title": "Vaikutusten yhteenveto",
"alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.", "alert.rate_limited.message": "Yritä uudelleen {retry_time, time, medium} jälkeen.",
"alert.rate_limited.title": "Pyyntömäärää rajoitettu", "alert.rate_limited.title": "Pyyntömäärää rajoitettu",
"alert.unexpected.message": "Tapahtui odottamaton virhe.", "alert.unexpected.message": "Tapahtui odottamaton virhe.",
"alert.unexpected.title": "Hups!", "alert.unexpected.title": "Hups!",
@ -103,7 +103,7 @@
"bundle_column_error.error.title": "Voi ei!", "bundle_column_error.error.title": "Voi ei!",
"bundle_column_error.network.body": "Sivun lataamisessa tapahtui virhe. Tämä voi johtua tilapäisestä Internet-yhteyden tai tämän palvelimen ongelmasta.", "bundle_column_error.network.body": "Sivun lataamisessa tapahtui virhe. Tämä voi johtua tilapäisestä Internet-yhteyden tai tämän palvelimen ongelmasta.",
"bundle_column_error.network.title": "Verkkovirhe", "bundle_column_error.network.title": "Verkkovirhe",
"bundle_column_error.retry": "Yritä uudestaan", "bundle_column_error.retry": "Yritä uudelleen",
"bundle_column_error.return": "Palaa takaisin kotiin", "bundle_column_error.return": "Palaa takaisin kotiin",
"bundle_column_error.routing.body": "Pyydettyä sivua ei löytynyt. Oletko varma, että osoitepalkin URL-osoite on oikein?", "bundle_column_error.routing.body": "Pyydettyä sivua ei löytynyt. Oletko varma, että osoitepalkin URL-osoite on oikein?",
"bundle_column_error.routing.title": "404", "bundle_column_error.routing.title": "404",
@ -111,7 +111,7 @@
"bundle_modal_error.message": "Jotain meni pieleen komponenttia ladattaessa.", "bundle_modal_error.message": "Jotain meni pieleen komponenttia ladattaessa.",
"bundle_modal_error.retry": "Yritä uudelleen", "bundle_modal_error.retry": "Yritä uudelleen",
"closed_registrations.other_server_instructions": "Koska Mastodon on hajautettu, voit luoda tilin toiselle palvelimelle ja olla silti vuorovaikutuksessa tämän kanssa.", "closed_registrations.other_server_instructions": "Koska Mastodon on hajautettu, voit luoda tilin toiselle palvelimelle ja olla silti vuorovaikutuksessa tämän kanssa.",
"closed_registrations_modal.description": "Tilin luonti palveluun {domain} ei tällä hetkellä ole mahdollista, mutta huomioi, ettei Mastodonin käyttö edellytä juuri kyseisen palvelun tiliä.", "closed_registrations_modal.description": "Tilin luonti palvelimelle {domain} ei tällä hetkellä ole mahdollista, mutta huomioi, ettei Mastodonin käyttö edellytä juuri kyseisen tuon tiliä.",
"closed_registrations_modal.find_another_server": "Etsi toinen palvelin", "closed_registrations_modal.find_another_server": "Etsi toinen palvelin",
"closed_registrations_modal.preamble": "Mastodon on hajautettu, joten riippumatta siitä, missä luot tilisi, voit seurata ja olla vuorovaikutuksessa kenen tahansa kanssa tällä palvelimella. Voit jopa isännöidä palvelinta!", "closed_registrations_modal.preamble": "Mastodon on hajautettu, joten riippumatta siitä, missä luot tilisi, voit seurata ja olla vuorovaikutuksessa kenen tahansa kanssa tällä palvelimella. Voit jopa isännöidä palvelinta!",
"closed_registrations_modal.title": "Rekisteröityminen Mastodoniin", "closed_registrations_modal.title": "Rekisteröityminen Mastodoniin",
@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)", "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)",
"confirmation_modal.cancel": "Peruuta", "confirmation_modal.cancel": "Peruuta",
"confirmations.block.confirm": "Estä", "confirmations.block.confirm": "Estä",
"confirmations.cancel_follow_request.confirm": "Peruuta pyyntö",
"confirmations.cancel_follow_request.message": "Haluatko varmasti perua pyyntösi seurata käyttäjätiliä {name}?",
"confirmations.delete.confirm": "Poista", "confirmations.delete.confirm": "Poista",
"confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?", "confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?",
"confirmations.delete.title": "Poistetaanko julkaisu?",
"confirmations.delete_list.confirm": "Poista", "confirmations.delete_list.confirm": "Poista",
"confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?", "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?",
"confirmations.delete_list.title": "Poistetaanko lista?",
"confirmations.discard_edit_media.confirm": "Hylkää", "confirmations.discard_edit_media.confirm": "Hylkää",
"confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?", "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?",
"confirmations.domain_block.confirm": "Estä palvelin",
"confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkkotunnuksen {domain}? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimi. Et näe sisältöä tästä verkkotunnuksesta millään julkisilla aikajanoilla tai ilmoituksissa. Tähän verkkotunnukseen kuuluvat seuraajasi poistetaan.",
"confirmations.edit.confirm": "Muokkaa", "confirmations.edit.confirm": "Muokkaa",
"confirmations.edit.message": "Jos muokkaat viestiä nyt, se korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", "confirmations.edit.message": "Jos muokkaat viestiä nyt, se korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?",
"confirmations.edit.title": "Korvataanko julkaisu?",
"confirmations.logout.confirm": "Kirjaudu ulos", "confirmations.logout.confirm": "Kirjaudu ulos",
"confirmations.logout.message": "Haluatko varmasti kirjautua ulos?", "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?",
"confirmations.logout.title": "Kirjaudutaanko ulos?",
"confirmations.mute.confirm": "Mykistä", "confirmations.mute.confirm": "Mykistä",
"confirmations.redraft.confirm": "Poista ja palauta muokattavaksi", "confirmations.redraft.confirm": "Poista ja palauta muokattavaksi",
"confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.", "confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.",
"confirmations.redraft.title": "Poistetaanko julkaisu ja palautetaanko se muokattavaksi?",
"confirmations.reply.confirm": "Vastaa", "confirmations.reply.confirm": "Vastaa",
"confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?",
"confirmations.reply.title": "Korvataanko julkaisu?",
"confirmations.unfollow.confirm": "Lopeta seuraaminen", "confirmations.unfollow.confirm": "Lopeta seuraaminen",
"confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?", "confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?",
"confirmations.unfollow.title": "Lopetetaanko käyttäjän seuraaminen?",
"conversation.delete": "Poista keskustelu", "conversation.delete": "Poista keskustelu",
"conversation.mark_as_read": "Merkitse luetuksi", "conversation.mark_as_read": "Merkitse luetuksi",
"conversation.open": "Näytä keskustelu", "conversation.open": "Näytä keskustelu",
@ -205,9 +208,9 @@
"disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.", "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.",
"dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.", "dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.",
"dismissable_banner.dismiss": "Hylkää", "dismissable_banner.dismiss": "Hylkää",
"dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeammalle.", "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat korkeammalle sijalle.",
"dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat korkeammalle sijalle.",
"dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeammalle.", "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat korkeammalle sijalle.",
"dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.",
"domain_block_modal.block": "Estä palvelin", "domain_block_modal.block": "Estä palvelin",
"domain_block_modal.block_account_instead": "Estä sen sijaan @{name}", "domain_block_modal.block_account_instead": "Estä sen sijaan @{name}",
@ -254,7 +257,7 @@
"empty_column.blocks": "Et ole vielä estänyt käyttäjiä.", "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.",
"empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
"empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!",
"empty_column.direct": "Yksityismainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", "empty_column.direct": "Yksityismainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellainen, näet sen tässä.",
"empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.", "empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.",
"empty_column.explore_statuses": "Mikään ei ole nyt suosittua. Tarkista myöhemmin uudelleen!", "empty_column.explore_statuses": "Mikään ei ole nyt suosittua. Tarkista myöhemmin uudelleen!",
"empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkijulkaisua. Kun lisäät sellaisen, näkyy se tässä.", "empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkijulkaisua. Kun lisäät sellaisen, näkyy se tässä.",
@ -268,7 +271,7 @@
"empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
"empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.", "empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.",
"empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.", "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.",
"empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä", "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti tai seuraa muiden palvelinten käyttäjiä, niin saat sisältöä",
"error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.", "error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.",
"error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.", "error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.",
"error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos se ei auta, voi Mastodonin käyttö ehkä onnistua eri selaimella tai natiivisovelluksella.", "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos se ei auta, voi Mastodonin käyttö ehkä onnistua eri selaimella tai natiivisovelluksella.",
@ -378,7 +381,7 @@
"keyboard_shortcuts.column": "Kohdista sarakkeeseen", "keyboard_shortcuts.column": "Kohdista sarakkeeseen",
"keyboard_shortcuts.compose": "Kohdista kirjoituskenttään", "keyboard_shortcuts.compose": "Kohdista kirjoituskenttään",
"keyboard_shortcuts.description": "Kuvaus", "keyboard_shortcuts.description": "Kuvaus",
"keyboard_shortcuts.direct": "Avaa yksityisten mainintojen sarake", "keyboard_shortcuts.direct": "Avaa yksityismainintojen sarake",
"keyboard_shortcuts.down": "Siirry listassa alaspäin", "keyboard_shortcuts.down": "Siirry listassa alaspäin",
"keyboard_shortcuts.enter": "Avaa julkaisu", "keyboard_shortcuts.enter": "Avaa julkaisu",
"keyboard_shortcuts.favourite": "Lisää julkaisu suosikkeihin", "keyboard_shortcuts.favourite": "Lisää julkaisu suosikkeihin",
@ -412,7 +415,7 @@
"lightbox.next": "Seuraava", "lightbox.next": "Seuraava",
"lightbox.previous": "Edellinen", "lightbox.previous": "Edellinen",
"limited_account_hint.action": "Näytä profiili joka tapauksessa", "limited_account_hint.action": "Näytä profiili joka tapauksessa",
"limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.", "limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.",
"link_preview.author": "Julkaissut {name}", "link_preview.author": "Julkaissut {name}",
"link_preview.more_from_author": "Lisää käyttäjältä {name}", "link_preview.more_from_author": "Lisää käyttäjältä {name}",
"link_preview.shares": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", "link_preview.shares": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}",
@ -428,7 +431,7 @@
"lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.list": "Listan jäsenille",
"lists.replies_policy.none": "Ei kellekään", "lists.replies_policy.none": "Ei kellekään",
"lists.replies_policy.title": "Näytä vastaukset:", "lists.replies_policy.title": "Näytä vastaukset:",
"lists.search": "Etsi seuraamiesi henkilöiden keskuudesta", "lists.search": "Hae seuraamistasi henkilöistä",
"lists.subheading": "Omat listasi", "lists.subheading": "Omat listasi",
"load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}",
"loading_indicator.label": "Ladataan…", "loading_indicator.label": "Ladataan…",
@ -468,7 +471,7 @@
"navigation_bar.pins": "Kiinnitetyt julkaisut", "navigation_bar.pins": "Kiinnitetyt julkaisut",
"navigation_bar.preferences": "Asetukset", "navigation_bar.preferences": "Asetukset",
"navigation_bar.public_timeline": "Yleinen aikajana", "navigation_bar.public_timeline": "Yleinen aikajana",
"navigation_bar.search": "Hae", "navigation_bar.search": "Haku",
"navigation_bar.security": "Turvallisuus", "navigation_bar.security": "Turvallisuus",
"not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.", "not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.",
"notification.admin.report": "{name} raportoi käyttäjän {target}", "notification.admin.report": "{name} raportoi käyttäjän {target}",
@ -483,9 +486,9 @@
"notification.mention": "{name} mainitsi sinut", "notification.mention": "{name} mainitsi sinut",
"notification.moderation-warning.learn_more": "Lue lisää", "notification.moderation-warning.learn_more": "Lue lisää",
"notification.moderation_warning": "Olet saanut moderointivaroituksen", "notification.moderation_warning": "Olet saanut moderointivaroituksen",
"notification.moderation_warning.action_delete_statuses": "Jotkin julkaisusi on poistettu.", "notification.moderation_warning.action_delete_statuses": "Julkaisujasi on poistettu.",
"notification.moderation_warning.action_disable": "Tilisi on poistettu käytöstä.", "notification.moderation_warning.action_disable": "Tilisi on poistettu käytöstä.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Jotkin julkaisusi on merkitty arkaluonteisiksi.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Julkaisujasi on merkitty arkaluonteisiksi.",
"notification.moderation_warning.action_none": "Tilisi on saanut moderointivaroituksen.", "notification.moderation_warning.action_none": "Tilisi on saanut moderointivaroituksen.",
"notification.moderation_warning.action_sensitive": "Tästä lähtien julkaisusi merkitään arkaluonteisiksi.", "notification.moderation_warning.action_sensitive": "Tästä lähtien julkaisusi merkitään arkaluonteisiksi.",
"notification.moderation_warning.action_silence": "Tiliäsi on rajoitettu.", "notification.moderation_warning.action_silence": "Tiliäsi on rajoitettu.",
@ -507,7 +510,8 @@
"notification_requests.title": "Suodatetut ilmoitukset", "notification_requests.title": "Suodatetut ilmoitukset",
"notifications.clear": "Tyhjennä ilmoitukset", "notifications.clear": "Tyhjennä ilmoitukset",
"notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?", "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
"notifications.column_settings.admin.report": "Uudet ilmoitukset:", "notifications.clear_title": "Tyhjennetäänkö ilmoitukset?",
"notifications.column_settings.admin.report": "Uudet raportit:",
"notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:", "notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:",
"notifications.column_settings.alert": "Työpöytäilmoitukset", "notifications.column_settings.alert": "Työpöytäilmoitukset",
"notifications.column_settings.beta.category": "Kokeelliset ominaisuudet", "notifications.column_settings.beta.category": "Kokeelliset ominaisuudet",
@ -534,12 +538,12 @@
"notifications.filter.mentions": "Maininnat", "notifications.filter.mentions": "Maininnat",
"notifications.filter.polls": "Äänestyksen tulokset", "notifications.filter.polls": "Äänestyksen tulokset",
"notifications.filter.statuses": "Päivitykset henkilöiltä, joita seuraat", "notifications.filter.statuses": "Päivitykset henkilöiltä, joita seuraat",
"notifications.grant_permission": "Myönnä lupa.", "notifications.grant_permission": "Myönnä käyttöoikeus.",
"notifications.group": "{count} ilmoitusta", "notifications.group": "{count} ilmoitusta",
"notifications.mark_as_read": "Merkitse jokainen ilmoitus luetuksi", "notifications.mark_as_read": "Merkitse jokainen ilmoitus luetuksi",
"notifications.permission_denied": "Työpöytäilmoitukset eivät ole käytettävissä, koska selaimen käyttöoikeuspyyntö on aiemmin evätty", "notifications.permission_denied": "Työpöytäilmoitukset eivät ole käytettävissä, koska selaimen käyttöoikeuspyyntö on aiemmin evätty",
"notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin estetty", "notifications.permission_denied_alert": "Työpöytäilmoituksia ei voi ottaa käyttöön, koska selaimen käyttöoikeus on aiemmin etty",
"notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa lupaa ei ole myönnetty.", "notifications.permission_required": "Työpöytäilmoitukset eivät ole käytettävissä, koska siihen tarvittavaa käyttöoikeutta ei ole myönnetty.",
"notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viimeisimmän päivän aikana} other {# viime päivän aikana}}", "notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viimeisimmän päivän aikana} other {# viime päivän aikana}}",
"notifications.policy.filter_new_accounts_title": "Uudet tilit", "notifications.policy.filter_new_accounts_title": "Uudet tilit",
"notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivän}} verran sinua seuranneet", "notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivän}} verran sinua seuranneet",
@ -586,7 +590,7 @@
"onboarding.steps.setup_profile.title": "Mukauta profiiliasi", "onboarding.steps.setup_profile.title": "Mukauta profiiliasi",
"onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista", "onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista",
"onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi", "onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi",
"onboarding.tips.2fa": "<strong>Tiesitkö?</strong> Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron antoa!", "onboarding.tips.2fa": "<strong>Tiesitkö?</strong> Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron luovuttamista!",
"onboarding.tips.accounts_from_other_servers": "<strong>Tiesitkö?</strong> Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjänimen jälkiosassa!", "onboarding.tips.accounts_from_other_servers": "<strong>Tiesitkö?</strong> Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjänimen jälkiosassa!",
"onboarding.tips.migration": "<strong>Tiesitkö?</strong> Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!", "onboarding.tips.migration": "<strong>Tiesitkö?</strong> Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!",
"onboarding.tips.verification": "<strong>Tiesitkö?</strong> Voit vahvistaa tilisi lisäämällä omalle verkkosivustollesi linkin Mastodon-profiiliisi ja lisäämällä sitten verkkosivustosi osoitteen Mastodon-profiilisi lisäkenttään. Tämä ei maksa mitään, eikä sinun tarvitse lähetellä asiakirjoja!", "onboarding.tips.verification": "<strong>Tiesitkö?</strong> Voit vahvistaa tilisi lisäämällä omalle verkkosivustollesi linkin Mastodon-profiiliisi ja lisäämällä sitten verkkosivustosi osoitteen Mastodon-profiilisi lisäkenttään. Tämä ei maksa mitään, eikä sinun tarvitse lähetellä asiakirjoja!",
@ -635,24 +639,24 @@
"reply_indicator.poll": "Äänestys", "reply_indicator.poll": "Äänestys",
"report.block": "Estä", "report.block": "Estä",
"report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.", "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.",
"report.categories.legal": "Juridiset tiedot", "report.categories.legal": "Lakiseikat",
"report.categories.other": "Muu", "report.categories.other": "Muu",
"report.categories.spam": "Roskaposti", "report.categories.spam": "Roskaposti",
"report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen säännöistä", "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen säännöistä",
"report.category.subtitle": "Valitse sopivin", "report.category.subtitle": "Valitse sopivin",
"report.category.title": "Kerro meille, miksi tämä {type} pitää raportoida", "report.category.title": "Kerro meille, miksi tämä {type} pitää raportoida",
"report.category.title_account": "profiilissa", "report.category.title_account": "profiili",
"report.category.title_status": "julkaisussa", "report.category.title_status": "julkaisu",
"report.close": "Valmis", "report.close": "Valmis",
"report.comment.title": "Onko vielä jotain muuta, mitä meidän pitäisi tietää?", "report.comment.title": "Onko vielä jotain muuta, mitä meidän pitäisi tietää?",
"report.forward": "Välitä kohteeseen {target}", "report.forward": "Välitä palvelimelle {target}",
"report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?", "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?",
"report.mute": "Mykistä", "report.mute": "Mykistä",
"report.mute_explanation": "Et näe hänen julkaisujaan. Hän voi silti seurata sinua ja nähdä julkaisusi. Hän ei tiedä, että hänet on mykistetty.", "report.mute_explanation": "Et näe hänen julkaisujaan. Hän voi silti seurata sinua ja nähdä julkaisusi. Hän ei tiedä, että hänet on mykistetty.",
"report.next": "Seuraava", "report.next": "Seuraava",
"report.placeholder": "Lisäkommentit", "report.placeholder": "Lisäkommentit",
"report.reasons.dislike": "En pidä siitä", "report.reasons.dislike": "En pidä siitä",
"report.reasons.dislike_description": "Sisältö on sen tyyppistä, ettet halua nähdä sitä", "report.reasons.dislike_description": "Sisältö on sellaista, jota et halua nähdä",
"report.reasons.legal": "Se on laitonta", "report.reasons.legal": "Se on laitonta",
"report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja", "report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja",
"report.reasons.other": "Jotain muuta", "report.reasons.other": "Jotain muuta",
@ -663,18 +667,18 @@
"report.reasons.violation_description": "Tiedät sisällön rikkovan tiettyjä sääntöjä", "report.reasons.violation_description": "Tiedät sisällön rikkovan tiettyjä sääntöjä",
"report.rules.subtitle": "Valitse kaikki sopivat", "report.rules.subtitle": "Valitse kaikki sopivat",
"report.rules.title": "Mitä sääntöjä rikotaan?", "report.rules.title": "Mitä sääntöjä rikotaan?",
"report.statuses.subtitle": "Valitse kaikki soveltuvat julkaisut", "report.statuses.subtitle": "Valitse kaikki sopivat",
"report.statuses.title": "Onko julkaisuja, jotka tukevat tätä raporttia?", "report.statuses.title": "Onko julkaisuja, jotka tukevat tätä raporttia?",
"report.submit": "Lähetä", "report.submit": "Lähetä",
"report.target": "Raportoidaan {target}", "report.target": "Raportoidaan {target}",
"report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:", "report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:",
"report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää @{name} vastaan:", "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimiin käyttäjää @{name} kohtaan:",
"report.thanks.title": "Etkö halua nähdä tätä?", "report.thanks.title": "Etkö halua nähdä tätä?",
"report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.", "report.thanks.title_actionable": "Kiitos raportista tutkimme asiaa.",
"report.unfollow": "Lopeta käyttäjän @{name} seuraaminen", "report.unfollow": "Lopeta käyttäjän @{name} seuraaminen",
"report.unfollow_explanation": "Seuraat tätä tiliä. Estääksesi tilin viestejä näykymästä kotisyötteessäsi, lopeta sen seuraaminen.", "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näkisi sen julkaisuja kotisyötteessäsi, lopeta tilin seuraaminen.",
"report_notification.attached_statuses": "{count, plural, one {{count} julkaisu} other {{count} julkaisua}} liitteenä", "report_notification.attached_statuses": "{count, plural, one {{count} julkaisu} other {{count} julkaisua}} liitteenä",
"report_notification.categories.legal": "Laillinen", "report_notification.categories.legal": "Lakiseikat",
"report_notification.categories.legal_sentence": "laiton sisältö", "report_notification.categories.legal_sentence": "laiton sisältö",
"report_notification.categories.other": "Muu", "report_notification.categories.other": "Muu",
"report_notification.categories.other_sentence": "jokin muu", "report_notification.categories.other_sentence": "jokin muu",
@ -716,9 +720,9 @@
"sign_in_banner.mastodon_is": "Mastodon on paras tapa pysyä ajan tasalla siitä, mitä ympärillä tapahtuu.", "sign_in_banner.mastodon_is": "Mastodon on paras tapa pysyä ajan tasalla siitä, mitä ympärillä tapahtuu.",
"sign_in_banner.sign_in": "Kirjaudu", "sign_in_banner.sign_in": "Kirjaudu",
"sign_in_banner.sso_redirect": "Kirjaudu tai rekisteröidy", "sign_in_banner.sso_redirect": "Kirjaudu tai rekisteröidy",
"status.admin_account": "Avaa tilin @{name} valvontanäkymä", "status.admin_account": "Avaa tilin @{name} moderointinäkymä",
"status.admin_domain": "Avaa palvelimen {domain} valvontanäkymä", "status.admin_domain": "Avaa palvelimen {domain} moderointinäkymä",
"status.admin_status": "Avaa julkaisu valvontanäkymässä", "status.admin_status": "Avaa julkaisu moderointinäkymässä",
"status.block": "Estä @{name}", "status.block": "Estä @{name}",
"status.bookmark": "Lisää kirjanmerkki", "status.bookmark": "Lisää kirjanmerkki",
"status.cancel_reblog_private": "Peru tehostus", "status.cancel_reblog_private": "Peru tehostus",

View file

@ -112,13 +112,10 @@
"compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman", "compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman",
"confirmation_modal.cancel": "Pagpaliban", "confirmation_modal.cancel": "Pagpaliban",
"confirmations.block.confirm": "Harangan", "confirmations.block.confirm": "Harangan",
"confirmations.cancel_follow_request.confirm": "Bawiin ang kahilingan",
"confirmations.cancel_follow_request.message": "Sigurdo ka bang gusto mong bawiin ang kahilingang sundan si/ang {name}?",
"confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?", "confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?",
"confirmations.delete_list.confirm": "Tanggalin", "confirmations.delete_list.confirm": "Tanggalin",
"confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?", "confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?",
"confirmations.discard_edit_media.confirm": "Ipagpaliban", "confirmations.discard_edit_media.confirm": "Ipagpaliban",
"confirmations.domain_block.confirm": "Harangan ang serbiro",
"confirmations.edit.confirm": "Baguhin", "confirmations.edit.confirm": "Baguhin",
"confirmations.reply.confirm": "Tumugon", "confirmations.reply.confirm": "Tumugon",
"conversation.mark_as_read": "Markahan bilang nabasa na", "conversation.mark_as_read": "Markahan bilang nabasa na",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)", "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)",
"confirmation_modal.cancel": "Strika", "confirmation_modal.cancel": "Strika",
"confirmations.block.confirm": "Banna", "confirmations.block.confirm": "Banna",
"confirmations.cancel_follow_request.confirm": "Tak umbønina aftur",
"confirmations.cancel_follow_request.message": "Er tað tilætlað, at tú tekur umbønina at fylgja {name} aftur?",
"confirmations.delete.confirm": "Strika", "confirmations.delete.confirm": "Strika",
"confirmations.delete.message": "Er tað tilætlað, at tú strikar hetta uppslagið?", "confirmations.delete.message": "Er tað tilætlað, at tú strikar hetta uppslagið?",
"confirmations.delete.title": "Strika post?",
"confirmations.delete_list.confirm": "Strika", "confirmations.delete_list.confirm": "Strika",
"confirmations.delete_list.message": "Ert tú vís/ur í, at tú vilt strika hetta uppslagið?", "confirmations.delete_list.message": "Ert tú vís/ur í, at tú vilt strika hetta uppslagið?",
"confirmations.delete_list.title": "Strika lista?",
"confirmations.discard_edit_media.confirm": "Vraka", "confirmations.discard_edit_media.confirm": "Vraka",
"confirmations.discard_edit_media.message": "Tú hevur broytingar í miðlalýsingini ella undansýningini, sum ikki eru goymdar. Vilt tú kortini vraka?", "confirmations.discard_edit_media.message": "Tú hevur broytingar í miðlalýsingini ella undansýningini, sum ikki eru goymdar. Vilt tú kortini vraka?",
"confirmations.domain_block.confirm": "Banna ambætara",
"confirmations.domain_block.message": "Ert tú púra, púra vís/ur í, at tú vilt banna øllum {domain}? Í flestu førum er nóg mikið og betri, bert at banna ella doyva onkrum ávísum. Tú fert eingi evni at síggja frá økisnavninum á nakrari almennari tíðarrás ella í tínum fráboðanum. Tínir fylgjarar undir økisnavninum verða eisini strikaðir.",
"confirmations.edit.confirm": "Rætta", "confirmations.edit.confirm": "Rætta",
"confirmations.edit.message": "Rættingar, sum verða gjørdar nú, skriva yvir boðini, sum tú ert í holt við. Ert tú vís/ur í, at tú vilt halda fram?", "confirmations.edit.message": "Rættingar, sum verða gjørdar nú, skriva yvir boðini, sum tú ert í holt við. Ert tú vís/ur í, at tú vilt halda fram?",
"confirmations.edit.title": "Skriva omaná post?",
"confirmations.logout.confirm": "Rita út", "confirmations.logout.confirm": "Rita út",
"confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?", "confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?",
"confirmations.logout.title": "Rita út?",
"confirmations.mute.confirm": "Doyv", "confirmations.mute.confirm": "Doyv",
"confirmations.redraft.confirm": "Sletta og skriva umaftur", "confirmations.redraft.confirm": "Sletta og skriva umaftur",
"confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.", "confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.",
"confirmations.redraft.title": "Strika & ger nýtt uppskot um post?",
"confirmations.reply.confirm": "Svara", "confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Svarar tú nú, verða boðini, sum tú ert í holt við at skriva yvirskrivað. Ert tú vís/ur í, at tú vilt halda fram?", "confirmations.reply.message": "Svarar tú nú, verða boðini, sum tú ert í holt við at skriva yvirskrivað. Ert tú vís/ur í, at tú vilt halda fram?",
"confirmations.reply.title": "Skriva omaná post?",
"confirmations.unfollow.confirm": "Fylg ikki", "confirmations.unfollow.confirm": "Fylg ikki",
"confirmations.unfollow.message": "Ert tú vís/ur í, at tú vil steðga við at fylgja {name}?", "confirmations.unfollow.message": "Ert tú vís/ur í, at tú vil steðga við at fylgja {name}?",
"confirmations.unfollow.title": "Gevst at fylgja brúkara?",
"conversation.delete": "Strika samrøðu", "conversation.delete": "Strika samrøðu",
"conversation.mark_as_read": "Merk sum lisið", "conversation.mark_as_read": "Merk sum lisið",
"conversation.open": "Vís samrøðu", "conversation.open": "Vís samrøðu",
@ -507,6 +510,7 @@
"notification_requests.title": "Sáldaðar fráboðanir", "notification_requests.title": "Sáldaðar fráboðanir",
"notifications.clear": "Rudda fráboðanir", "notifications.clear": "Rudda fráboðanir",
"notifications.clear_confirmation": "Ert tú vís/ur í, at tú vilt strika allar tínar fráboðanir?", "notifications.clear_confirmation": "Ert tú vís/ur í, at tú vilt strika allar tínar fráboðanir?",
"notifications.clear_title": "Rudda fráboðanir?",
"notifications.column_settings.admin.report": "Nýggjar fráboðanir:", "notifications.column_settings.admin.report": "Nýggjar fráboðanir:",
"notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:", "notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:",
"notifications.column_settings.alert": "Skriviborðsfráboðanir", "notifications.column_settings.alert": "Skriviborðsfráboðanir",

View file

@ -166,27 +166,30 @@
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
"confirmation_modal.cancel": "Annuler", "confirmation_modal.cancel": "Annuler",
"confirmations.block.confirm": "Bloquer", "confirmations.block.confirm": "Bloquer",
"confirmations.cancel_follow_request.confirm": "Retirer cette demande",
"confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name}?",
"confirmations.delete.confirm": "Supprimer", "confirmations.delete.confirm": "Supprimer",
"confirmations.delete.message": "Voulez-vous vraiment supprimer cette publication?", "confirmations.delete.message": "Voulez-vous vraiment supprimer cette publication?",
"confirmations.delete.title": "Supprimer la publication ?",
"confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.confirm": "Supprimer",
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?",
"confirmations.delete_list.title": "Supprimer la liste ?",
"confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.confirm": "Rejeter",
"confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?",
"confirmations.domain_block.confirm": "Bloquer le serveur",
"confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.",
"confirmations.edit.confirm": "Éditer", "confirmations.edit.confirm": "Éditer",
"confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?",
"confirmations.edit.title": "Remplacer le message ?",
"confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.confirm": "Se déconnecter",
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?",
"confirmations.logout.title": "Se déconnecter ?",
"confirmations.mute.confirm": "Masquer", "confirmations.mute.confirm": "Masquer",
"confirmations.redraft.confirm": "Supprimer et réécrire", "confirmations.redraft.confirm": "Supprimer et réécrire",
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.",
"confirmations.redraft.title": "Supprimer et réécrire le message ?",
"confirmations.reply.confirm": "Répondre", "confirmations.reply.confirm": "Répondre",
"confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez présentement. Voulez-vous vraiment continuer?", "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez présentement. Voulez-vous vraiment continuer?",
"confirmations.reply.title": "Remplacer le message ?",
"confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.confirm": "Ne plus suivre",
"confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?", "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?",
"confirmations.unfollow.title": "Se désabonner de l'utilisateur ?",
"conversation.delete": "Supprimer cette conversation", "conversation.delete": "Supprimer cette conversation",
"conversation.mark_as_read": "Marquer comme lu", "conversation.mark_as_read": "Marquer comme lu",
"conversation.open": "Afficher cette conversation", "conversation.open": "Afficher cette conversation",
@ -480,6 +483,7 @@
"notification_requests.title": "Notifications filtrées", "notification_requests.title": "Notifications filtrées",
"notifications.clear": "Effacer notifications", "notifications.clear": "Effacer notifications",
"notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?",
"notifications.clear_title": "Effacer les notifications ?",
"notifications.column_settings.admin.report": "Nouveaux signalements:", "notifications.column_settings.admin.report": "Nouveaux signalements:",
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:",
"notifications.column_settings.alert": "Notifications navigateur", "notifications.column_settings.alert": "Notifications navigateur",

View file

@ -166,27 +166,30 @@
"compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)",
"confirmation_modal.cancel": "Annuler", "confirmation_modal.cancel": "Annuler",
"confirmations.block.confirm": "Bloquer", "confirmations.block.confirm": "Bloquer",
"confirmations.cancel_follow_request.confirm": "Retirer la demande",
"confirmations.cancel_follow_request.message": "Êtes-vous sûr de vouloir retirer votre demande pour suivre {name} ?",
"confirmations.delete.confirm": "Supprimer", "confirmations.delete.confirm": "Supprimer",
"confirmations.delete.message": "Voulez-vous vraiment supprimer ce message ?", "confirmations.delete.message": "Voulez-vous vraiment supprimer ce message ?",
"confirmations.delete.title": "Supprimer la publication ?",
"confirmations.delete_list.confirm": "Supprimer", "confirmations.delete_list.confirm": "Supprimer",
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?", "confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?",
"confirmations.delete_list.title": "Supprimer la liste ?",
"confirmations.discard_edit_media.confirm": "Rejeter", "confirmations.discard_edit_media.confirm": "Rejeter",
"confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?", "confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?",
"confirmations.domain_block.confirm": "Bloquer le serveur",
"confirmations.domain_block.message": "Voulez-vous vraiment, vraiment bloquer {domain} en entier? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans vos fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.",
"confirmations.edit.confirm": "Modifier", "confirmations.edit.confirm": "Modifier",
"confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", "confirmations.edit.message": "Modifier maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?",
"confirmations.edit.title": "Remplacer le message ?",
"confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.confirm": "Se déconnecter",
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?",
"confirmations.logout.title": "Se déconnecter ?",
"confirmations.mute.confirm": "Masquer", "confirmations.mute.confirm": "Masquer",
"confirmations.redraft.confirm": "Supprimer et ré-écrire", "confirmations.redraft.confirm": "Supprimer et ré-écrire",
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses partages ainsi que ses mises en favori seront perdus et ses réponses seront orphelines.",
"confirmations.redraft.title": "Supprimer et réécrire le message ?",
"confirmations.reply.confirm": "Répondre", "confirmations.reply.confirm": "Répondre",
"confirmations.reply.message": "Répondre maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?", "confirmations.reply.message": "Répondre maintenant écrasera votre message en cours de rédaction. Voulez-vous vraiment continuer ?",
"confirmations.reply.title": "Remplacer le message ?",
"confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.confirm": "Ne plus suivre",
"confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name}?", "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name}?",
"confirmations.unfollow.title": "Se désabonner de l'utilisateur ?",
"conversation.delete": "Supprimer la conversation", "conversation.delete": "Supprimer la conversation",
"conversation.mark_as_read": "Marquer comme lu", "conversation.mark_as_read": "Marquer comme lu",
"conversation.open": "Afficher la conversation", "conversation.open": "Afficher la conversation",
@ -480,6 +483,7 @@
"notification_requests.title": "Notifications filtrées", "notification_requests.title": "Notifications filtrées",
"notifications.clear": "Effacer les notifications", "notifications.clear": "Effacer les notifications",
"notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?", "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications?",
"notifications.clear_title": "Effacer les notifications ?",
"notifications.column_settings.admin.report": "Nouveaux signalements :", "notifications.column_settings.admin.report": "Nouveaux signalements :",
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :", "notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :",
"notifications.column_settings.alert": "Notifications du navigateur", "notifications.column_settings.alert": "Notifications du navigateur",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)", "compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)",
"confirmation_modal.cancel": "Annulearje", "confirmation_modal.cancel": "Annulearje",
"confirmations.block.confirm": "Blokkearje", "confirmations.block.confirm": "Blokkearje",
"confirmations.cancel_follow_request.confirm": "Fersyk annulearje",
"confirmations.cancel_follow_request.message": "Binne jo wis dat jo jo fersyk om {name} te folgjen annulearje wolle?",
"confirmations.delete.confirm": "Fuortsmite", "confirmations.delete.confirm": "Fuortsmite",
"confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?", "confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?",
"confirmations.delete_list.confirm": "Fuortsmite", "confirmations.delete_list.confirm": "Fuortsmite",
"confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?", "confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?",
"confirmations.discard_edit_media.confirm": "Fuortsmite", "confirmations.discard_edit_media.confirm": "Fuortsmite",
"confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?", "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?",
"confirmations.domain_block.confirm": "Server blokkearje",
"confirmations.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.",
"confirmations.edit.confirm": "Bewurkje", "confirmations.edit.confirm": "Bewurkje",
"confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?", "confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
"confirmations.logout.confirm": "Ofmelde", "confirmations.logout.confirm": "Ofmelde",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Rabhadh ábhair (roghnach)", "compose_form.spoiler_placeholder": "Rabhadh ábhair (roghnach)",
"confirmation_modal.cancel": "Cealaigh", "confirmation_modal.cancel": "Cealaigh",
"confirmations.block.confirm": "Bac", "confirmations.block.confirm": "Bac",
"confirmations.cancel_follow_request.confirm": "Éirigh as iarratas",
"confirmations.cancel_follow_request.message": "An bhfuil tú cinnte gur mhaith leat éirigh as an iarratas leanta {name}?",
"confirmations.delete.confirm": "Scrios", "confirmations.delete.confirm": "Scrios",
"confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?", "confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?",
"confirmations.delete.title": "Scrios postáil?",
"confirmations.delete_list.confirm": "Scrios", "confirmations.delete_list.confirm": "Scrios",
"confirmations.delete_list.message": "An bhfuil tú cinnte gur mhaith leat an liosta seo a scriosadh go buan?", "confirmations.delete_list.message": "An bhfuil tú cinnte gur mhaith leat an liosta seo a scriosadh go buan?",
"confirmations.delete_list.title": "Scrios liosta?",
"confirmations.discard_edit_media.confirm": "Faigh réidh de", "confirmations.discard_edit_media.confirm": "Faigh réidh de",
"confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?", "confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?",
"confirmations.domain_block.confirm": "Bloc freastalaí",
"confirmations.domain_block.message": "An bhfuil tú iontach cinnte gur mhaith leat bac an t-ainm fearainn {domain} in iomlán? I bhformhór na gcásanna, is leor agus is fearr cúpla baic a cur i bhfeidhm nó cúpla úsáideoirí a balbhú. Ní fheicfidh tú ábhair ón t-ainm fearainn sin in amlíne ar bith, nó i d'fhógraí. Scaoilfear do leantóirí ón ainm fearainn sin.",
"confirmations.edit.confirm": "Eagar", "confirmations.edit.confirm": "Eagar",
"confirmations.edit.message": "Má dhéanann tú eagarthóireacht anois, déanfar an teachtaireacht atá á cumadh agat faoi láthair a fhorscríobh. An bhfuil tú cinnte gur mhaith leat leanúint ar aghaidh?", "confirmations.edit.message": "Má dhéanann tú eagarthóireacht anois, déanfar an teachtaireacht atá á cumadh agat faoi láthair a fhorscríobh. An bhfuil tú cinnte gur mhaith leat leanúint ar aghaidh?",
"confirmations.edit.title": "Forscríobh postáil?",
"confirmations.logout.confirm": "Logáil amach", "confirmations.logout.confirm": "Logáil amach",
"confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?", "confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?",
"confirmations.logout.title": "Logáil Amach?",
"confirmations.mute.confirm": "Balbhaigh", "confirmations.mute.confirm": "Balbhaigh",
"confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh", "confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh",
"confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.", "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.",
"confirmations.redraft.title": "Scrios & athdhréachtú postáil?",
"confirmations.reply.confirm": "Freagair", "confirmations.reply.confirm": "Freagair",
"confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?", "confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?",
"confirmations.reply.title": "Forscríobh postáil?",
"confirmations.unfollow.confirm": "Ná lean", "confirmations.unfollow.confirm": "Ná lean",
"confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?", "confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?",
"confirmations.unfollow.title": "Dílean an t-úsáideoir?",
"conversation.delete": "Scrios comhrá", "conversation.delete": "Scrios comhrá",
"conversation.mark_as_read": "Marcáil mar léite", "conversation.mark_as_read": "Marcáil mar léite",
"conversation.open": "Féach ar comhrá", "conversation.open": "Féach ar comhrá",
@ -507,6 +510,7 @@
"notification_requests.title": "Fógraí scagtha", "notification_requests.title": "Fógraí scagtha",
"notifications.clear": "Glan fógraí", "notifications.clear": "Glan fógraí",
"notifications.clear_confirmation": "An bhfuil tú cinnte gur mhaith leat d'fhógraí go léir a ghlanadh go buan?", "notifications.clear_confirmation": "An bhfuil tú cinnte gur mhaith leat d'fhógraí go léir a ghlanadh go buan?",
"notifications.clear_title": "Glan fógraí?",
"notifications.column_settings.admin.report": "Tuairiscí nua:", "notifications.column_settings.admin.report": "Tuairiscí nua:",
"notifications.column_settings.admin.sign_up": "Clárúcháin nua:", "notifications.column_settings.admin.sign_up": "Clárúcháin nua:",
"notifications.column_settings.alert": "Fógraí deisce", "notifications.column_settings.alert": "Fógraí deisce",

View file

@ -166,16 +166,12 @@
"compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)", "compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)",
"confirmation_modal.cancel": "Sguir dheth", "confirmation_modal.cancel": "Sguir dheth",
"confirmations.block.confirm": "Bac", "confirmations.block.confirm": "Bac",
"confirmations.cancel_follow_request.confirm": "Cuir d iarrtas dhan dàrna taobh",
"confirmations.cancel_follow_request.message": "A bheil thu cinnteach gu bheil thu airson d iarrtas airson {name} a leantainn a chur dhan dàrna taobh?",
"confirmations.delete.confirm": "Sguab às", "confirmations.delete.confirm": "Sguab às",
"confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?", "confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?",
"confirmations.delete_list.confirm": "Sguab às", "confirmations.delete_list.confirm": "Sguab às",
"confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?", "confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?",
"confirmations.discard_edit_media.confirm": "Tilg air falbh", "confirmations.discard_edit_media.confirm": "Tilg air falbh",
"confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?", "confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?",
"confirmations.domain_block.confirm": "Bac am frithealaiche",
"confirmations.domain_block.message": "A bheil thu cinnteach dha-rìribh gu bheil thu airson an àrainn {domain} a bhacadh uile gu lèir? Mar as trice, foghnaidh gun dèan thu bacadh no mùchadh no dhà gu sònraichte agus bhiodh sin na b fheàrr. Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.",
"confirmations.edit.confirm": "Deasaich", "confirmations.edit.confirm": "Deasaich",
"confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", "confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
"confirmations.logout.confirm": "Clàraich a-mach", "confirmations.logout.confirm": "Clàraich a-mach",

View file

@ -169,27 +169,30 @@
"compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)", "compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)",
"confirmation_modal.cancel": "Cancelar", "confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Bloquear", "confirmations.block.confirm": "Bloquear",
"confirmations.cancel_follow_request.confirm": "Retirar solicitude",
"confirmations.cancel_follow_request.message": "Tes a certeza de querer retirar a solicitude para seguir a {name}?",
"confirmations.delete.confirm": "Eliminar", "confirmations.delete.confirm": "Eliminar",
"confirmations.delete.message": "Tes a certeza de querer eliminar esta publicación?", "confirmations.delete.message": "Tes a certeza de querer eliminar esta publicación?",
"confirmations.delete.title": "Eliminar a publicación?",
"confirmations.delete_list.confirm": "Eliminar", "confirmations.delete_list.confirm": "Eliminar",
"confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?", "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?",
"confirmations.delete_list.title": "Eliminar a lista?",
"confirmations.discard_edit_media.confirm": "Descartar", "confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?", "confirmations.discard_edit_media.message": "Tes cambios sen gardar para a vista previa ou descrición do multimedia, descartamos os cambios?",
"confirmations.domain_block.confirm": "Bloquear servidor",
"confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.",
"confirmations.edit.confirm": "Editar", "confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", "confirmations.edit.message": "Ao editar sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
"confirmations.edit.title": "Editar a publicación?",
"confirmations.logout.confirm": "Pechar sesión", "confirmations.logout.confirm": "Pechar sesión",
"confirmations.logout.message": "Desexas pechar a sesión?", "confirmations.logout.message": "Desexas pechar a sesión?",
"confirmations.logout.title": "Pechar sesión?",
"confirmations.mute.confirm": "Acalar", "confirmations.mute.confirm": "Acalar",
"confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.confirm": "Eliminar e reescribir",
"confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.", "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.",
"confirmations.redraft.title": "Eliminar e reescribir a publicación?",
"confirmations.reply.confirm": "Responder", "confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", "confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
"confirmations.reply.title": "Editar a publicación?",
"confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Desexas deixar de seguir a {name}?", "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
"confirmations.unfollow.title": "Deixar de seguir á usuaria?",
"conversation.delete": "Eliminar conversa", "conversation.delete": "Eliminar conversa",
"conversation.mark_as_read": "Marcar como lido", "conversation.mark_as_read": "Marcar como lido",
"conversation.open": "Ver conversa", "conversation.open": "Ver conversa",
@ -507,6 +510,7 @@
"notification_requests.title": "Notificacións filtradas", "notification_requests.title": "Notificacións filtradas",
"notifications.clear": "Limpar notificacións", "notifications.clear": "Limpar notificacións",
"notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?", "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
"notifications.clear_title": "Limpar as notificacións?",
"notifications.column_settings.admin.report": "Novas denuncias:", "notifications.column_settings.admin.report": "Novas denuncias:",
"notifications.column_settings.admin.sign_up": "Novas usuarias:", "notifications.column_settings.admin.sign_up": "Novas usuarias:",
"notifications.column_settings.alert": "Notificacións de escritorio", "notifications.column_settings.alert": "Notificacións de escritorio",

View file

@ -169,16 +169,12 @@
"compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)", "compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)",
"confirmation_modal.cancel": "ביטול", "confirmation_modal.cancel": "ביטול",
"confirmations.block.confirm": "לחסום", "confirmations.block.confirm": "לחסום",
"confirmations.cancel_follow_request.confirm": "ויתור על בקשה",
"confirmations.cancel_follow_request.message": "לבטל את בקשת המעקב אחרי {name}?",
"confirmations.delete.confirm": "למחוק", "confirmations.delete.confirm": "למחוק",
"confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?", "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?",
"confirmations.delete_list.confirm": "למחוק", "confirmations.delete_list.confirm": "למחוק",
"confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?", "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?",
"confirmations.discard_edit_media.confirm": "השלך", "confirmations.discard_edit_media.confirm": "השלך",
"confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?",
"confirmations.domain_block.confirm": "חסימת שרת",
"confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו",
"confirmations.edit.confirm": "עריכה", "confirmations.edit.confirm": "עריכה",
"confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?", "confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?",
"confirmations.logout.confirm": "התנתקות", "confirmations.logout.confirm": "התנתקות",

Some files were not shown because too many files have changed in this diff Show more