Merge commit '70988519df66f0b8edeb6ca95140f1d3e436fea8' into glitch-soc/merge-upstream

This commit is contained in:
Claire 2024-09-24 19:34:30 +02:00
commit c6039f99ce
99 changed files with 396 additions and 209 deletions

View file

@ -101,15 +101,15 @@ GEM
awrence (1.2.1)
aws-eventstream (1.3.0)
aws-partitions (1.977.0)
aws-sdk-core (3.207.0)
aws-sdk-core (3.208.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.92.0)
aws-sdk-kms (1.93.0)
aws-sdk-core (~> 3, >= 3.207.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.164.0)
aws-sdk-s3 (1.165.0)
aws-sdk-core (~> 3, >= 3.207.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
@ -893,7 +893,7 @@ GEM
rack-proxy (>= 0.6.1)
railties (>= 5.2)
semantic_range (>= 2.3.0)
webrick (1.8.1)
webrick (1.8.2)
websocket (1.2.11)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)

View file

@ -1,4 +1,5 @@
import { browserHistory } from 'mastodon/components/router';
import { debounceWithDispatchAndArguments } from 'mastodon/utils/debounce';
import api, { getLinks } from '../api';
@ -449,6 +450,20 @@ export function expandFollowingFail(id, error) {
};
}
const debouncedFetchRelationships = debounceWithDispatchAndArguments((dispatch, ...newAccountIds) => {
if (newAccountIds.length === 0) {
return;
}
dispatch(fetchRelationshipsRequest(newAccountIds));
api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
}).catch(error => {
dispatch(fetchRelationshipsFail(error));
});
}, { delay: 500 });
export function fetchRelationships(accountIds) {
return (dispatch, getState) => {
const state = getState();
@ -460,13 +475,7 @@ export function fetchRelationships(accountIds) {
return;
}
dispatch(fetchRelationshipsRequest(newAccountIds));
api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
}).catch(error => {
dispatch(fetchRelationshipsFail(error));
});
debouncedFetchRelationships(dispatch, ...newAccountIds);
};
}

View file

@ -17,6 +17,6 @@ export const updateNotificationsPolicy = createDataLoadingThunk(
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
);
export const decreasePendingNotificationsCount = createAction<number>(
'notificationPolicy/decreasePendingNotificationCount',
export const decreasePendingRequestsCount = createAction<number>(
'notificationPolicy/decreasePendingRequestsCount',
);

View file

@ -13,11 +13,11 @@ import type {
ApiNotificationJSON,
} from 'mastodon/api_types/notifications';
import type { ApiStatusJSON } from 'mastodon/api_types/statuses';
import type { AppDispatch, RootState } from 'mastodon/store';
import type { AppDispatch } from 'mastodon/store';
import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
import { importFetchedAccounts, importFetchedStatuses } from './importer';
import { decreasePendingNotificationsCount } from './notification_policies';
import { decreasePendingRequestsCount } from './notification_policies';
// TODO: refactor with notification_groups
function dispatchAssociatedRecords(
@ -169,19 +169,11 @@ export const expandNotificationsForRequest = createDataLoadingThunk(
},
);
const selectNotificationCountForRequest = (state: RootState, id: string) => {
const requests = state.notificationRequests.items;
const thisRequest = requests.find((request) => request.id === id);
return thisRequest ? thisRequest.notifications_count : 0;
};
export const acceptNotificationRequest = createDataLoadingThunk(
'notificationRequest/accept',
({ id }: { id: string }) => apiAcceptNotificationRequest(id),
(_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(decreasePendingNotificationsCount(count));
(_data, { dispatch, discardLoadData }) => {
dispatch(decreasePendingRequestsCount(1));
// The payload is not used in any functions
return discardLoadData;
@ -191,10 +183,8 @@ export const acceptNotificationRequest = createDataLoadingThunk(
export const dismissNotificationRequest = createDataLoadingThunk(
'notificationRequest/dismiss',
({ id }: { id: string }) => apiDismissNotificationRequest(id),
(_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => {
const count = selectNotificationCountForRequest(getState(), id);
dispatch(decreasePendingNotificationsCount(count));
(_data, { dispatch, discardLoadData }) => {
dispatch(decreasePendingRequestsCount(1));
// The payload is not used in any functions
return discardLoadData;
@ -204,13 +194,8 @@ export const dismissNotificationRequest = createDataLoadingThunk(
export const acceptNotificationRequests = createDataLoadingThunk(
'notificationRequests/acceptBulk',
({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids),
(_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => {
const count = ids.reduce(
(count, id) => count + selectNotificationCountForRequest(getState(), id),
0,
);
dispatch(decreasePendingNotificationsCount(count));
(_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
dispatch(decreasePendingRequestsCount(ids.length));
// The payload is not used in any functions
return discardLoadData;
@ -220,13 +205,8 @@ export const acceptNotificationRequests = createDataLoadingThunk(
export const dismissNotificationRequests = createDataLoadingThunk(
'notificationRequests/dismissBulk',
({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids),
(_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => {
const count = ids.reduce(
(count, id) => count + selectNotificationCountForRequest(getState(), id),
0,
);
dispatch(decreasePendingNotificationsCount(count));
(_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
dispatch(decreasePendingRequestsCount(ids.length));
// The payload is not used in any functions
return discardLoadData;

View file

@ -10,7 +10,7 @@ import api, { getLinks } from '../api';
import { unescapeHTML } from '../utils/html';
import { requestNotificationPermission } from '../utils/notifications';
import { fetchFollowRequests, fetchRelationships } from './accounts';
import { fetchFollowRequests } from './accounts';
import {
importFetchedAccount,
importFetchedAccounts,
@ -56,14 +56,6 @@ defineMessages({
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
});
const fetchRelatedRelationships = (dispatch, notifications) => {
const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
if (accountIds.length > 0) {
dispatch(fetchRelationships(accountIds));
}
};
export const loadPending = () => ({
type: NOTIFICATIONS_LOAD_PENDING,
});
@ -106,8 +98,6 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered}));
fetchRelatedRelationships(dispatch, [notification]);
} else if (playSound && !filtered) {
dispatch({
type: NOTIFICATIONS_UPDATE_NOOP,
@ -199,7 +189,6 @@ export function expandNotifications({ maxId = undefined, forceLoad = false }) {
dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
fetchRelatedRelationships(dispatch, response.data);
dispatch(submitMarkers());
} catch(error) {
dispatch(expandNotificationsFail(error, isLoadingMore));

View file

@ -91,5 +91,5 @@ export const apiAcceptNotificationRequests = async (id: string[]) => {
};
export const apiDismissNotificationRequests = async (id: string[]) => {
return apiRequestPost('v1/notifications/dismiss/dismiss', { id });
return apiRequestPost('v1/notifications/requests/dismiss', { id });
};

View file

@ -31,7 +31,7 @@ export const FilteredNotificationsIconButton: React.FC<{
history.push('/notifications/requests');
}, [history]);
if (policy === null || policy.summary.pending_notifications_count === 0) {
if (policy === null || policy.summary.pending_requests_count <= 0) {
return null;
}
@ -70,7 +70,7 @@ export const FilteredNotificationsBanner: React.FC = () => {
};
}, [dispatch]);
if (policy === null || policy.summary.pending_notifications_count === 0) {
if (policy === null || policy.summary.pending_requests_count <= 0) {
return null;
}

View file

@ -97,6 +97,8 @@
"block_modal.title": "Αποκλεισμός χρήστη;",
"block_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
"boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά",
"boost_modal.reblog": "Ενίσχυση ανάρτησης;",
"boost_modal.undo_reblog": "Αναίρεση ενίσχυσης;",
"bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος",
"bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.",
"bundle_column_error.error.title": "Ωχ όχι!",
@ -192,6 +194,8 @@
"confirmations.unfollow.confirm": "Άρση ακολούθησης",
"confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
"confirmations.unfollow.title": "Άρση ακολούθησης;",
"content_warning.hide": "Απόκρυψη ανάρτησης",
"content_warning.show": "Εμφάνιση ούτως ή άλλως",
"conversation.delete": "Διαγραφή συζήτησης",
"conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
"conversation.open": "Προβολή συνομιλίας",
@ -299,6 +303,7 @@
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
"filter_warning.matches_filter": "Ταιριάζει με το φίλτρο “{title}”",
"filtered_notifications_banner.pending_requests": "Από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις",
"filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις",
"firehose.all": "Όλα",
@ -429,6 +434,8 @@
"lightbox.close": "Κλείσιμο",
"lightbox.next": "Επόμενο",
"lightbox.previous": "Προηγούμενο",
"lightbox.zoom_in": "Εστίαση στο πραγματικό μέγεθος",
"lightbox.zoom_out": "Εστίαση για προσαρμογή",
"limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως",
"limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή {domain}.",
"link_preview.author": "Από {name}",
@ -450,6 +457,7 @@
"lists.subheading": "Οι λίστες σου",
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
"loading_indicator.label": "Φόρτωση…",
"media_gallery.hide": "Απόκρυψη",
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
"mute_modal.hide_from_notifications": "Απόκρυψη από ειδοποιήσεις",
"mute_modal.hide_options": "Απόκρυψη επιλογών",
@ -461,6 +469,7 @@
"mute_modal.you_wont_see_mentions": "Δε θα βλέπεις τις αναρτήσεις που τον αναφέρουν.",
"mute_modal.you_wont_see_posts": "Μπορεί ακόμα να δει τις αναρτήσεις σου, αλλά δε θα βλέπεις τις δικές του.",
"navigation_bar.about": "Σχετικά με",
"navigation_bar.administration": "Διαχείριση",
"navigation_bar.advanced_interface": "Άνοιγμα σε προηγμένη διεπαφή ιστού",
"navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
"navigation_bar.bookmarks": "Σελιδοδείκτες",
@ -477,6 +486,7 @@
"navigation_bar.follows_and_followers": "Ακολουθείς και σε ακολουθούν",
"navigation_bar.lists": "Λίστες",
"navigation_bar.logout": "Αποσύνδεση",
"navigation_bar.moderation": "Συντονισμός",
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
"navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
"navigation_bar.personal": "Προσωπικά",
@ -768,6 +778,7 @@
"status.bookmark": "Σελιδοδείκτης",
"status.cancel_reblog_private": "Ακύρωση ενίσχυσης",
"status.cannot_reblog": "Αυτή η ανάρτηση δεν μπορεί να ενισχυθεί",
"status.continued_thread": "Συνεχιζόμενο νήματος",
"status.copy": "Αντιγραφή συνδέσμου ανάρτησης",
"status.delete": "Διαγραφή",
"status.detailed_status": "Προβολή λεπτομερούς συζήτησης",
@ -776,6 +787,7 @@
"status.edit": "Επεξεργασία",
"status.edited": "Τελευταία επεξεργασία {date}",
"status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}",
"status.embed": "Απόκτηση κώδικα ενσωμάτωσης",
"status.favourite": "Αγαπημένα",
"status.favourites": "{count, plural, one {# αγαπημένο} other {# αγαπημένα}}",
"status.filter": "Φιλτράρισμα αυτής της ανάρτησης",
@ -800,6 +812,7 @@
"status.reblogs.empty": "Κανείς δεν ενίσχυσε αυτή την ανάρτηση ακόμα. Μόλις το κάνει κάποιος, θα εμφανιστεί εδώ.",
"status.redraft": "Σβήσε & ξαναγράψε",
"status.remove_bookmark": "Αφαίρεση σελιδοδείκτη",
"status.replied_in_thread": "Απαντήθηκε σε νήμα",
"status.replied_to": "Απάντησε στον {name}",
"status.reply": "Απάντησε",
"status.replyAll": "Απάντησε στο νήμα συζήτησης",

View file

@ -231,6 +231,8 @@
"domain_pill.their_username": "Ilia unika identigilo sur ilia servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
"domain_pill.username": "Uzantnomo",
"domain_pill.whats_in_a_handle": "Kio estas en identigo?",
"domain_pill.who_they_are": "Ĉar identigoj diras, kiu iu estas kaj kie ili estas, vi povas interagi kun homoj tra la socia reto de <button>ActivityPub-funkciigitaj platformoj</button>.",
"domain_pill.who_you_are": "Ĉar via identigo diras kiu vi estas kaj kie vi estas, homoj povas interagi kun vi tra la socia reto de <button>ActivityPub-funkciigitaj platformoj</button>.",
"domain_pill.your_handle": "Via identigo:",
"domain_pill.your_server": "Via cifereca hejmo, kie loĝas ĉiuj viaj afiŝoj. Ĉu vi ne ŝatas ĉi tiun? Transloku servilojn iam ajn kaj alportu ankaŭ viajn sekvantojn.",
"domain_pill.your_username": "Via unika identigilo sur ĉi tiu servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
@ -301,6 +303,7 @@
"filter_modal.select_filter.subtitle": "Uzu ekzistantan kategorion aŭ kreu novan",
"filter_modal.select_filter.title": "Filtri ĉi tiun afiŝon",
"filter_modal.title.status": "Filtri mesaĝon",
"filter_warning.matches_filter": "Filtrilo de kongruoj “{title}”",
"filtered_notifications_banner.pending_requests": "El {count, plural, =0 {neniu} one {unu persono} other {# homoj}} vi eble konas",
"filtered_notifications_banner.title": "Filtritaj sciigoj",
"firehose.all": "Ĉiuj",
@ -309,11 +312,16 @@
"follow_request.authorize": "Rajtigi",
"follow_request.reject": "Rifuzi",
"follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opinias, ke vi eble volas revizii petojn pri sekvado de ĉi tiuj kontoj permane.",
"follow_suggestions.curated_suggestion": "Elekto de stabo",
"follow_suggestions.dismiss": "Ne montri denove",
"follow_suggestions.featured_longer": "Mane elektita de la teamo de {domain}",
"follow_suggestions.friends_of_friends_longer": "Populara inter homoj, kiujn vi sekvas",
"follow_suggestions.hints.featured": "Ĉi tiu profilo estis mane elektita de la teamo de {domain}.",
"follow_suggestions.hints.friends_of_friends": "Ĉi tiu profilo estas populara inter la homoj, kiujn vi sekvas.",
"follow_suggestions.hints.most_followed": "Ĉi tiu profilo estas unu el la plej sekvataj en {domain}.",
"follow_suggestions.hints.most_interactions": "Ĉi tiu profilo lastatempe ricevis multe da atento sur {domain}.",
"follow_suggestions.hints.similar_to_recently_followed": "Ĉi tiu profilo similas al la profiloj kiujn vi plej lastatempe sekvis.",
"follow_suggestions.personalized_suggestion": "Agordita propono",
"follow_suggestions.popular_suggestion": "Popularaj proponoj",
"follow_suggestions.popular_suggestion_longer": "Populara en {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Simile al profiloj, kiujn vi lastatempe sekvis",
@ -346,9 +354,12 @@
"hashtag.unfollow": "Ne plu sekvi la kradvorton",
"hashtags.and_other": "…kaj {count, plural,other {# pli}}",
"hints.profiles.followers_may_be_missing": "Sekvantoj por ĉi tiu profilo eble mankas.",
"hints.profiles.follows_may_be_missing": "Sekvatoj de ĉi tiu profilo eble mankas.",
"hints.profiles.posts_may_be_missing": "Iuj afiŝoj de ĉi tiu profilo eble mankas.",
"hints.profiles.see_more_followers": "Vidi pli da sekvantoj sur {domain}",
"hints.profiles.see_more_follows": "Vidi pli da sekvatoj sur {domain}",
"hints.profiles.see_more_posts": "Vidi pli da afiŝoj sur {domain}",
"hints.threads.replies_may_be_missing": "Respondoj de aliaj serviloj eble mankas.",
"hints.threads.see_more": "Vidi pli da respondoj sur {domain}",
"home.column_settings.show_reblogs": "Montri diskonigojn",
"home.column_settings.show_replies": "Montri respondojn",
@ -358,6 +369,10 @@
"home.pending_critical_update.title": "Kritika sekurĝisdatigo estas disponebla!",
"home.show_announcements": "Montri anoncojn",
"ignore_notifications_modal.disclaimer": "Mastodon ne povas informi uzantojn, ke vi ignoris iliajn sciigojn. Ignori sciigojn ne malhelpos la mesaĝojn mem esti senditaj.",
"ignore_notifications_modal.filter_instead": "Filtri anstataŭe",
"ignore_notifications_modal.filter_to_act_users": "Vi ankoraŭ povos akcepti, malakcepti aŭ raporti uzantojn",
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrado helpas eviti eblan konfuzon",
"ignore_notifications_modal.filter_to_review_separately": "Vi povas revizii filtritajn sciigojn aparte",
"ignore_notifications_modal.ignore": "Ignori sciigojn",
"ignore_notifications_modal.limited_accounts_title": "Ĉu ignori sciigojn de moderigitaj kontoj?",
"ignore_notifications_modal.new_accounts_title": "Ĉu ignori sciigojn de novaj kontoj?",
@ -471,6 +486,7 @@
"navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj",
"navigation_bar.lists": "Listoj",
"navigation_bar.logout": "Adiaŭi",
"navigation_bar.moderation": "Modereco",
"navigation_bar.mutes": "Silentigitaj uzantoj",
"navigation_bar.opened_in_classic_interface": "Afiŝoj, kontoj, kaj aliaj specifaj paĝoj kiuj estas malfermititaj defaulta en la klasika reta interfaco.",
"navigation_bar.personal": "Persone",
@ -486,7 +502,9 @@
"notification.admin.report_statuses": "{name} raportis {target} por {category}",
"notification.admin.report_statuses_other": "{name} raportis {target}",
"notification.admin.sign_up": "{name} kreis konton",
"notification.admin.sign_up.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} kreis konton",
"notification.favourite": "{name} stelumis vian afiŝon",
"notification.favourite.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> ŝatis vian afiŝon",
"notification.follow": "{name} eksekvis vin",
"notification.follow.name_and_others": "{name} kaj {count, plural, one {# alia} other {# aliaj}} sekvis vin",
"notification.follow_request": "{name} petis sekvi vin",
@ -506,22 +524,32 @@
"notification.moderation_warning.action_silence": "Via konto estis limigita.",
"notification.moderation_warning.action_suspend": "Via konto estas malakceptita.",
"notification.own_poll": "Via enketo finiĝis",
"notification.poll": "Balotenketo, en kiu vi voĉdonis, finiĝis",
"notification.reblog": "{name} diskonigis vian afiŝon",
"notification.reblog.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> diskonigis vian afiŝon",
"notification.relationships_severance_event": "Perditaj konektoj kun {name}",
"notification.relationships_severance_event.account_suspension": "Administranto de {from} malakceptis {target}, kio signifas, ke vi ne plu povas ricevi ĝisdatigojn de ili aŭ interagi kun ili.",
"notification.relationships_severance_event.domain_block": "Administranto de {from} blokis {target}, inkluzive de {followersCount} de viaj sekvantoj kaj {followingCount, plural, one {# konto} other {# kontoj}} kiujn vi sekvas.",
"notification.relationships_severance_event.learn_more": "Lerni pli",
"notification.relationships_severance_event.user_domain_block": "Vi blokis {target}, forigante {followersCount} de viaj sekvantoj kaj {followingCount, plural, one {# konto} other {# kontoj}} kiujn vi sekvas.",
"notification.status": "{name} ĵus afiŝis",
"notification.update": "{name} redaktis afiŝon",
"notification_requests.accept": "Akcepti",
"notification_requests.accept_multiple": "{count, plural, one {Akcepti # peton…} other {Akcepti # petojn…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Akcepti peton} other {Akcepti petojn}}",
"notification_requests.confirm_accept_multiple.message": "Vi estas akceptonta {count, plural, one {unu sciigan peton} other {# sciigajn petojn}}. Ĉu vi certas, ke vi volas daŭrigi?",
"notification_requests.confirm_accept_multiple.title": "Ĉu akcepti sciigajn petojn?",
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Malakcepti peton} other {Malakcepti petojn}}",
"notification_requests.confirm_dismiss_multiple.message": "Vi estas malakceptonta {count, plural, one {unu sciigan peton} other {# sciigajn petojn}}. Vi ne povos facile aliri {count, plural, one {ĝin} other {ilin}} denove. Ĉu vi certas, ke vi volas daŭrigi?",
"notification_requests.confirm_dismiss_multiple.title": "Ĉu malakcepti sciigajn petojn?",
"notification_requests.dismiss": "Forĵeti",
"notification_requests.dismiss_multiple": "{count, plural, one {Malakcepti # peton…} other {# Malakcepti # petojn…}}",
"notification_requests.edit_selection": "Redakti",
"notification_requests.exit_selection": "Farita",
"notification_requests.explainer_for_limited_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto estis limigita de moderanto.",
"notification_requests.explainer_for_limited_remote_account": "Sciigoj de ĉi tiu konto estis filtritaj ĉar la konto aŭ ĝia servilo estis limigitaj de moderanto.",
"notification_requests.maximize": "Maksimumigi",
"notification_requests.minimize_banner": "Minimumigi filtritajn sciigojn-rubandon",
"notification_requests.notifications_from": "Sciigoj de {name}",
"notification_requests.title": "Filtritaj sciigoj",
"notification_requests.view": "Vidi sciigojn",
@ -533,6 +561,7 @@
"notifications.column_settings.alert": "Sciigoj de la retumilo",
"notifications.column_settings.favourite": "Stelumoj:",
"notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
"notifications.column_settings.filter_bar.category": "Rapida filtrila breto",
"notifications.column_settings.follow": "Novaj sekvantoj:",
"notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
"notifications.column_settings.mention": "Mencioj:",
@ -548,7 +577,7 @@
"notifications.filter.all": "Ĉiuj",
"notifications.filter.boosts": "Diskonigoj",
"notifications.filter.favourites": "Stelumoj",
"notifications.filter.follows": "Sekvoj",
"notifications.filter.follows": "Sekvatoj",
"notifications.filter.mentions": "Mencioj",
"notifications.filter.polls": "Balotenketaj rezultoj",
"notifications.filter.statuses": "Ĝisdatigoj de homoj, kiujn vi sekvas",
@ -563,12 +592,16 @@
"notifications.policy.drop": "Ignori",
"notifications.policy.drop_hint": "Sendi al la malpleno, por neniam esti vidita denove",
"notifications.policy.filter": "Filtri",
"notifications.policy.filter_hint": "Sendi al filtritaj sciigoj-enirkesto",
"notifications.policy.filter_limited_accounts_hint": "Limigita de servilaj moderigantoj",
"notifications.policy.filter_limited_accounts_title": "Moderigitaj kontoj",
"notifications.policy.filter_new_accounts.hint": "Kreite en la {days, plural, one {lasta tago} other {# lastaj tagoj}}",
"notifications.policy.filter_new_accounts_title": "Novaj kontoj",
"notifications.policy.filter_not_followers_hint": "Inkluzive de homoj, kiuj sekvis vin malpli ol {days, plural, one {unu tago} other {# tagoj}}",
"notifications.policy.filter_not_followers_title": "Homoj, kiuj ne sekvas vin",
"notifications.policy.filter_not_following_hint": "Ĝis vi permane aprobas ilin",
"notifications.policy.filter_not_following_title": "Homoj, kiujn vi ne sekvas",
"notifications.policy.filter_private_mentions_hint": "Filtrite krom se ĝi respondas al via propra mencio aŭ se vi sekvas la sendinton",
"notifications.policy.filter_private_mentions_title": "Nepetitaj privataj mencioj",
"notifications.policy.title": "Administri sciigojn de…",
"notifications_permission_banner.enable": "Ŝalti retumilajn sciigojn",
@ -580,8 +613,8 @@
"onboarding.actions.go_to_home": "Go to your home feed",
"onboarding.compose.template": "Saluton #Mastodon!",
"onboarding.follows.empty": "Bedaŭrinde, neniu rezulto estas montrebla nuntempe. Vi povas provi serĉi aŭ foliumi la esploran paĝon por trovi kontojn por sekvi, aŭ retrovi baldaŭ.",
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
"onboarding.follows.title": "Popular on Mastodon",
"onboarding.follows.lead": "Via hejma fluo estas la ĉefa maniero sperti Mastodon. Ju pli da homoj vi sekvas, des pli aktiva kaj interesa ĝi estos. Por komenci, jen kelkaj sugestoj:",
"onboarding.follows.title": "Agordi vian hejman fluon",
"onboarding.profile.discoverable": "Trovebligi mian profilon",
"onboarding.profile.discoverable_hint": "Kiam vi aliĝi al trovebleco ĉe Mastodon, viaj afiŝoj eble aperos en serĉaj rezultoj kaj populariĝoj, kaj via profilo eble estas sugestota al personoj kun similaj intereseoj al vi.",
"onboarding.profile.display_name": "Publika nomo",
@ -602,7 +635,7 @@
"onboarding.start.title": "Vi atingas ĝin!",
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
"onboarding.steps.publish_status.body": "Say hello to the world.",
"onboarding.steps.publish_status.body": "Salutu la mondon per teksto, fotoj, filmetoj aŭ balotenketoj {emoji}",
"onboarding.steps.publish_status.title": "Fari vian unuan afiŝon",
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
"onboarding.steps.setup_profile.title": "Customize your profile",
@ -632,6 +665,7 @@
"privacy.private.short": "Sekvantoj",
"privacy.public.long": "Ĉiujn ajn ĉe kaj ekster Mastodon",
"privacy.public.short": "Publika",
"privacy.unlisted.additional": "Ĉi tio kondutas ekzakte kiel publika, krom ke la afiŝo ne aperos en vivaj fluoj aŭ kradvortoj, esploro aŭ Mastodon-serĉo, eĉ se vi estas enskribita en la tuta konto.",
"privacy.unlisted.long": "Malpli algoritmaj fanfaroj",
"privacy.unlisted.short": "Diskrete publika",
"privacy_policy.last_updated": "Laste ĝisdatigita en {date}",
@ -651,7 +685,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hodiaŭ",
"reply_indicator.attachments": "{count, plural, one {# aldonaĵo} other {# aldonaĵoj}}",
"reply_indicator.cancel": "Nuligi",
"reply_indicator.poll": "Balotenketo",
"report.block": "Bloki",
"report.block_explanation": "Vi ne vidos iliajn afiŝojn. Ili ne povos vidi viajn afiŝojn, nek sekvi vin. Ili ne scios, ke vi blokas ilin.",
"report.categories.legal": "Laŭleĝa",
@ -732,6 +768,7 @@
"server_banner.server_stats": "Statistikoj de la servilo:",
"sign_in_banner.create_account": "Krei konton",
"sign_in_banner.follow_anyone": "Sekvi iun ajn tra la fediverso kaj vidi ĉion en kronologia ordo. Neniuj algoritmoj, reklamoj aŭ klakbetoj videblas.",
"sign_in_banner.mastodon_is": "Mastodonto estas la plej bona maniero por resti flank-al-flanke kun kio okazas.",
"sign_in_banner.sign_in": "Saluti",
"sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi",
"status.admin_account": "Malfermi fasadon de moderigado por @{name}",
@ -741,6 +778,7 @@
"status.bookmark": "Aldoni al la legosignoj",
"status.cancel_reblog_private": "Ne plu diskonigi",
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
"status.continued_thread": "Daŭrigis fadenon",
"status.copy": "Kopii la ligilon al la mesaĝo",
"status.delete": "Forigi",
"status.detailed_status": "Detala konversacia vido",
@ -749,6 +787,7 @@
"status.edit": "Redakti",
"status.edited": "Laste redaktita {date}",
"status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
"status.embed": "Akiri enkorpigan kodon",
"status.favourite": "Ŝatata",
"status.favourites": "{count, plural, one {plej ŝatata} other {plej ŝatataj}}",
"status.filter": "Filtri ĉi tiun afiŝon",
@ -773,6 +812,7 @@
"status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun afiŝon. Kiam iu faras tion, ri aperos ĉi tie.",
"status.redraft": "Forigi kaj reskribi",
"status.remove_bookmark": "Forigi legosignon",
"status.replied_in_thread": "Respondis en fadeno",
"status.replied_to": "Respondis al {name}",
"status.reply": "Respondi",
"status.replyAll": "Respondi al la fadeno",

View file

@ -435,7 +435,7 @@
"lightbox.next": "Siguiente",
"lightbox.previous": "Anterior",
"lightbox.zoom_in": "Ampliar al tamaño real",
"lightbox.zoom_out": "Ampliar para ajustar",
"lightbox.zoom_out": "Ampliar hasta ajustar",
"limited_account_hint.action": "Mostrar perfil de todos modos",
"limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.",
"link_preview.author": "Por {name}",

View file

@ -267,7 +267,7 @@
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.",
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
"empty_column.followed_tags": "No has seguido ninguna etiqueta todavía. Cuando lo hagas, se mostrarán aquí.",
"empty_column.hashtag": "No hay nada en este hashtag aún.",
"empty_column.hashtag": "No hay nada en esta etiqueta todavía.",
"empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla.",
"empty_column.list": "Aún no hay nada en esta lista. Cuando los miembros de esta lista publiquen nuevos estados, estos aparecerán aquí.",
"empty_column.lists": "No tienes ninguna lista. Cuando crees una, se mostrará aquí.",
@ -342,7 +342,7 @@
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sin {additional}",
"hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
"hashtag.column_settings.select.placeholder": "Introduzca hashtags…",
"hashtag.column_settings.select.placeholder": "Introduce etiquetas…",
"hashtag.column_settings.tag_mode.all": "Todos estos",
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
@ -637,7 +637,7 @@
"onboarding.steps.follow_people.title": "Personaliza tu línea de inicio",
"onboarding.steps.publish_status.body": "Di hola al mundo con texto, fotos, vídeos o encuestas {emoji}",
"onboarding.steps.publish_status.title": "Escribe tu primera publicación",
"onboarding.steps.setup_profile.body": "Aumenta tus interacciones tcompletando tu perfil.",
"onboarding.steps.setup_profile.body": "Aumenta tus interacciones con un perfil completo.",
"onboarding.steps.setup_profile.title": "Personaliza tu perfil",
"onboarding.steps.share_profile.body": "¡Dile a tus amigos cómo encontrarte en Mastodon!",
"onboarding.steps.share_profile.title": "Comparte tu perfil de Mastodon",

View file

@ -434,6 +434,8 @@
"lightbox.close": "Dùin",
"lightbox.next": "Air adhart",
"lightbox.previous": "Air ais",
"lightbox.zoom_in": "Sùm dhan fhìor-mheud",
"lightbox.zoom_out": "Sùm fèin-obrachail",
"limited_account_hint.action": "Seall a phròifil co-dhiù",
"limited_account_hint.title": "Chaidh a phròifil seo fhalach le maoir {domain}.",
"link_preview.author": "Le {name}",

View file

@ -368,13 +368,13 @@
"home.pending_critical_update.link": "Mira as actualizacións",
"home.pending_critical_update.title": "Hai una actualización crítica de seguridade!",
"home.show_announcements": "Amosar anuncios",
"ignore_notifications_modal.disclaimer": "Mastodon non pode informar ás usuarias se ignoraches as súas notificacións. Ao ignorar as notificacións non evitarás que as mensaxes sexan enviadas igualmente.",
"ignore_notifications_modal.disclaimer": "Mastodon non pode informar ás usuarias de que ignoraches as súas notificacións. Ao ignorar as notificacións non evitarás que as mensaxes sexan enviadas igualmente.",
"ignore_notifications_modal.filter_instead": "Filtrar igualmente",
"ignore_notifications_modal.filter_to_act_users": "Poderás seguir aceptando, rexeitando e denunciando usuarias",
"ignore_notifications_modal.filter_to_avoid_confusion": "Ao filtrar axudas a evitar posibles confusións",
"ignore_notifications_modal.filter_to_review_separately": "Podes revisar as notificacións filtradas por separado",
"ignore_notifications_modal.filter_to_review_separately": "Podes revisar por separado as notificacións filtradas",
"ignore_notifications_modal.ignore": "Ignorar notificacións",
"ignore_notifications_modal.limited_accounts_title": "Ignorar notificacións desde contas moderadas?",
"ignore_notifications_modal.limited_accounts_title": "Ignorar notificacións desde contas limitadas?",
"ignore_notifications_modal.new_accounts_title": "Ignorar notificacións desde novas contas?",
"ignore_notifications_modal.not_followers_title": "Ignorar notificacións de persoas que non te seguen?",
"ignore_notifications_modal.not_following_title": "Ignorar notificacións de persoas que non segues?",
@ -463,7 +463,7 @@
"mute_modal.hide_options": "Opcións ao ocultar",
"mute_modal.indefinite": "Ata que as reactive",
"mute_modal.show_options": "Mostrar opcións",
"mute_modal.they_can_mention_and_follow": "Pódete mencionar e seguirte, pero non o verás.",
"mute_modal.they_can_mention_and_follow": "Pódete mencionar e seguirte, pero non a verás.",
"mute_modal.they_wont_know": "Non saberá que a acalaches.",
"mute_modal.title": "Acalar usuaria?",
"mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.",

View file

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

View file

@ -0,0 +1,23 @@
import { debounce } from 'lodash';
import type { AppDispatch } from 'mastodon/store';
export const debounceWithDispatchAndArguments = <T>(
fn: (dispatch: AppDispatch, ...args: T[]) => void,
{ delay = 100 },
) => {
let argumentBuffer: T[] = [];
let dispatchBuffer: AppDispatch;
const wrapped = debounce(() => {
const tmpBuffer = argumentBuffer;
argumentBuffer = [];
fn(dispatchBuffer, ...tmpBuffer);
}, delay);
return (dispatch: AppDispatch, ...args: T[]) => {
dispatchBuffer = dispatch;
argumentBuffer.push(...args);
wrapped();
};
};

View file

@ -6889,7 +6889,7 @@ a.status-card {
.media-gallery__actions {
position: absolute;
bottom: 6px;
top: 6px;
inset-inline-end: 6px;
display: flex;
gap: 2px;
@ -6912,7 +6912,7 @@ a.status-card {
.media-gallery__item__badges {
position: absolute;
bottom: 8px;
inset-inline-start: 8px;
inset-inline-end: 8px;
display: flex;
gap: 2px;
}

View file

@ -86,9 +86,7 @@
color: $primary-text-color;
transition: all 100ms ease-in;
font-size: 14px;
padding: 0 16px;
line-height: 36px;
height: 36px;
padding: 8px 16px;
text-decoration: none;
margin-bottom: 4px;

View file

@ -342,7 +342,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def converted_text
linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
[formatted_title, @status_parser.spoiler_text.presence, formatted_url].compact.join("\n\n")
end
def formatted_title
"<h2>#{@status_parser.title}</h2>" if @status_parser.title.present?
end
def formatted_url
linkify(@status_parser.url || @status_parser.uri)
end
def unsupported_media_type?(mime_type)

View file

@ -9,6 +9,8 @@ class AdminMailer < ApplicationMailer
before_action :process_params
before_action :set_instance
after_action :set_important_headers!, only: :new_critical_software_updates
default to: -> { @me.user_email }
def new_report(report)
@ -56,12 +58,6 @@ class AdminMailer < ApplicationMailer
def new_critical_software_updates
@software_updates = SoftwareUpdate.where(urgent: true).to_a.sort_by(&:gem_version)
headers(
'Importance' => 'high',
'Priority' => 'urgent',
'X-Priority' => '1'
)
locale_for_account(@me) do
mail subject: default_i18n_subject(instance: @instance)
end
@ -82,4 +78,12 @@ class AdminMailer < ApplicationMailer
def set_instance
@instance = Rails.configuration.x.local_domain
end
def set_important_headers!
headers(
'Importance' => 'high',
'Priority' => 'urgent',
'X-Priority' => '1'
)
end
end

View file

@ -53,7 +53,7 @@ class ApproveAppealService < BaseService
def undo_mark_statuses_as_sensitive!
representative_account = Account.representative
@strike.statuses.includes(:media_attachments).find_each do |status|
@strike.statuses.kept.includes(:media_attachments).reorder(nil).find_each do |status|
UpdateStatusService.new.call(status, representative_account.id, sensitive: false) if status.with_media?
end
end

View file

@ -1,4 +1,4 @@
# frozen_string_literal: true
# 0.5s is a fairly high timeout, but that should account for slow servers under load
Regexp.timeout = 0.5 if Regexp.respond_to?(:timeout=)
# 2s is a fairly high default, but that should account for slow servers under load
Regexp.timeout = ENV.fetch('REGEXP_TIMEOUT', 2).to_f if Regexp.respond_to?(:timeout=)

View file

@ -15,6 +15,8 @@ be:
user/invite_request:
text: Прычына
errors:
messages:
too_many_lines: перавышана абмежаванне ў %{limit} радкоў
models:
account:
attributes:

View file

@ -15,6 +15,12 @@ el:
user/invite_request:
text: Αιτιολογία
errors:
attributes:
domain:
invalid: δεν είναι έγκυρο όνομα τομέα
messages:
invalid_domain_on_line: το %{value} δεν είναι έγκυρο όνομα τομέα
too_many_lines: υπερβαίνει το όριο των %{limit} γραμμών
models:
account:
attributes:

View file

@ -60,7 +60,6 @@ af:
error:
title: "n Fout het ingesluip"
new:
prompt_html: "%{client_name} wil toegang hê tot jou rekening. Dit is n derdepartytoepassing. <strong>Moet dit nie toelaat as jy dit nie vertrou nie.</strong>"
review_permissions: Hersien toestemmings
title: Benodig magtiging
show:

View file

@ -60,7 +60,6 @@ an:
error:
title: Ha ocurriu una error
new:
prompt_html: "%{client_name} deseya permiso pa acceder ta la tuya cuenta. Ye una aplicación de tercers. <strong>Si no confías en ella, no habrías d'autorizar-la.</strong>"
review_permissions: Revisar permisos
title: Se requiere autorización
show:

View file

@ -60,7 +60,6 @@ ar:
error:
title: حدث هناك خطأ
new:
prompt_html: يريد %{client_name} الإذن للوصول إلى حسابك. إنه تطبيق طرف ثالث. <strong>إذا كنت لا تثق فيه، فلا ينبغي أن تأذن له بذلك.</strong>
review_permissions: مراجعة الصلاحيات
title: إذن بالتصريح
show:

View file

@ -41,7 +41,6 @@ ast:
error:
title: Prodúxose un error
new:
prompt_html: "%{client_name}, que ye una aplicación de terceros, quier tener accesu a la cuenta. <strong>Si nun t'enfotes nella, nun habríes autorizala.</strong>"
review_permissions: Revisión de los permisos
show:
title: Copia esti códigu d'autorización y apiégalu na aplicación.

View file

@ -60,7 +60,6 @@ be:
error:
title: Узнікла памылка
new:
prompt_html: "%{client_name} хацеў бы атрымаць дазвол для доступу да вашага акаунта. Гэта вонкавае прыкладанне. <strong> Не давайце дазволу на гэта, калі вы не давяраеце гэтаму прыкладанню. </strong>"
review_permissions: Прагледзець дазволы
title: Патрабуецца аўтарызацыя
show:

View file

@ -60,7 +60,6 @@ bg:
error:
title: Възникна грешка
new:
prompt_html: "%{client_name} иска разрешение да има достъп до акаунта ви. Приложение от трета страна е.<strong>Ако не му се доверявате, то може да не го упълномощявате.</strong>"
review_permissions: Преглед на разрешенията
title: Изисква се упълномощаване
show:

View file

@ -60,7 +60,7 @@ ca:
error:
title: S'ha produït un error
new:
prompt_html: "%{client_name} vol permís per accedir el teu compte. És una aplicació de tercers. <strong>Si no hi confies, no hauries d'autoritzar-la.</strong>"
prompt_html: "%{client_name} demana accés al vostre compte. <strong>Només aproveu aquesta petició si reconeixeu i confieu en aquest origen.</strong>"
review_permissions: Revisa els permisos
title: Cal autorizació
show:

View file

@ -60,7 +60,6 @@ ckb:
error:
title: هەڵەیەک ڕوویدا
new:
prompt_html: "%{client_name} حەز دەکات مۆڵەت بدرێت بۆ چوونە ناو ئەکاونتەکەت. ئەپڵیکەیشنێکی لایەنی سێیەمە. <strong>ئەگەر متمانەت پێی نییە، ئەوا نابێت ڕێگەی پێبدەیت.</strong>"
review_permissions: پێداچوونەوە بە مۆڵەتەکاندا بکە
title: ڕێپێدان پێویستە
show:

View file

@ -60,7 +60,6 @@ cs:
error:
title: Vyskytla se chyba
new:
prompt_html: "%{client_name} si přeje oprávnění pro přístup k vašemu účtu. Je to aplikace třetí strany. <strong>Pokud jí nedůvěřujete, pak byste ji neměli autorizovat.</strong>"
review_permissions: Zkontrolujte oprávnění
title: Je vyžadována autorizace
show:

View file

@ -60,7 +60,6 @@ cy:
error:
title: Mae rhywbeth wedi mynd o'i le
new:
prompt_html: Hoffai %{client_name} gael caniatâd i gael mynediad i'ch cyfrif. Mae'n gais trydydd parti. <strong>Os nad ydych yn ymddiried ynddo, yna peidiwch a'i awdurdodi.</strong>
review_permissions: Adolygu caniatâd
title: Angen awdurdodi
show:

View file

@ -60,7 +60,7 @@ da:
error:
title: En fejl opstod
new:
prompt_html: "%{client_name} ønsker tilladelse til at tilgå din konto. Den er en tredjepartsapplikation. <strong>Har du ikke tillid til den, bør den ikke godkendes.</strong>"
prompt_html: "%{client_name} vil ønsker tilladelse til at tilgå din konto. <strong>Godkend kun denne anmodning, hvis kilden genkendes, og man stoler på den.</strong>"
review_permissions: Gennemgå tilladelser
title: Godkendelse kræves
show:

View file

@ -60,7 +60,7 @@ de:
error:
title: Ein Fehler ist aufgetreten
new:
prompt_html: "%{client_name} möchte auf dein Konto zugreifen. Es handelt sich um eine Software von Dritten. <strong>Wenn du der Anwendung nicht vertraust, solltest du ihr keinen Zugriff auf dein Konto geben.</strong>"
prompt_html: "%{client_name} möchte auf dein Konto zugreifen. <strong>Du solltest diese Anfrage nur genehmigen, wenn du diese Quelle kennst und ihr vertraust.</strong>"
review_permissions: Berechtigungen überprüfen
title: Autorisierung erforderlich
show:

View file

@ -60,7 +60,6 @@ el:
error:
title: Εμφανίστηκε σφάλμα
new:
prompt_html: Το %{client_name} θα ήθελε άδεια πρόσβασης στο λογαριασμό σου. Είναι μια εφαρμογή τρίτων. <strong>Αν δεν το εμπιστεύεσαι, τότε δεν πρέπει να το εγκρίνεις.</strong>
review_permissions: Ανασκόπηση δικαιωμάτων
title: Απαιτείται έγκριση
show:

View file

@ -60,7 +60,7 @@ en-GB:
error:
title: An error has occurred
new:
prompt_html: "%{client_name} would like permission to access your account. It is a third-party application. <strong>If you do not trust it, then you should not authorise it.</strong>"
prompt_html: "%{client_name} would like permission to access your account. <strong>Only approve this request if you recognise and trust this source.</strong>"
review_permissions: Review permissions
title: Authorisation required
show:

View file

@ -60,7 +60,6 @@ eo:
error:
title: Eraro okazis
new:
prompt_html: "%{client_name} petas permeson por aliri vian konton. <strong>Se vi ne fidas ĝin, ne rajtigu ĝin.</strong>"
review_permissions: Revizu permesojn
title: Rajtigo bezonata
show:

View file

@ -60,7 +60,7 @@ es-AR:
error:
title: Ocurrió un error
new:
prompt_html: "%{client_name} solicita permiso para acceder a tu cuenta. Es una aplicación de terceros. <strong>Si no confiás en ella, no deberías autorizarla.</strong>"
prompt_html: "%{client_name} le gustaría obtener permiso para acceder a tu cuenta. <strong>Solo aprueba esta solicitud si reconoces y confías en esta fuente.</strong>"
review_permissions: Revisar permisos
title: Autorización requerida
show:

View file

@ -60,7 +60,7 @@ es-MX:
error:
title: Ha ocurrido un error
new:
prompt_html: "%{client_name} requiere permiso para acceder a tu cuenta. Es una aplicación de terceros. <strong>Si no confías en esta, no deberías autorizarla.</strong>"
prompt_html: "%{client_name} le gustaría obtener permiso para acceder a tu cuenta. <strong>Solo aprueba esta solicitud si reconoces y confías en esta fuente.</strong>"
review_permissions: Revisar permisos
title: Se requiere autorización
show:

View file

@ -60,7 +60,7 @@ es:
error:
title: Ha ocurrido un error
new:
prompt_html: "%{client_name} desea permiso para acceder a tu cuenta. Es una aplicación de terceros. <strong>Si no confías en ella, no deberías autorizarla.</strong>"
prompt_html: "%{client_name} le gustaría obtener permiso para acceder a tu cuenta. <strong>Solo aprueba esta solicitud si reconoces y confías en esta fuente.</strong>"
review_permissions: Revisar permisos
title: Se requiere autorización
show:

View file

@ -60,7 +60,6 @@ et:
error:
title: Ilmnes viga
new:
prompt_html: "%{client_name} soovib luba kontole juurdepääsuks. See on kolmanda osapoole rakendus. <strong>Kui see pole usaldusväärne, siis ei tohiks seda lubada.</strong>"
review_permissions: Lubade ülevaade
title: Autoriseerimine vajalik
show:

View file

@ -60,7 +60,6 @@ eu:
error:
title: Errore bat gertatu da
new:
prompt_html: "%{client_name} bezeroak zure kontura sartzeko baimena nahi du. Hirugarrengoen aplikazio bat da. <strong>Ez bazara fidatzen, ez zenuke baimendu behar.</strong>"
review_permissions: Berrikusi baimenak
title: Baimena behar da
show:

View file

@ -60,7 +60,6 @@ fa:
error:
title: خطایی رخ داد
new:
prompt_html: "%{client_name} خواهان اجازه دسترسی به حساب کاربری شماست. <strong>اگر به آن اعتماد ندارید، نباید تاییدش کنید.</strong>"
review_permissions: بازبینی اجازه‌ها
title: نیاز به اجازه دادن
show:

View file

@ -60,7 +60,7 @@ fi:
error:
title: Tapahtui virhe
new:
prompt_html: "%{client_name} pyytää oikeutta käyttää tiliäsi. Se on kolmannen osapuolen sovellus. <strong>Jos et luota siihen, älä valtuuta sitä.</strong>"
prompt_html: "%{client_name} haluaisi käyttöoikeuden tiliisi. <strong>Hyväksy tämä pyyntö vain, jos tunnistat lähteen ja luotat siihen.</strong>"
review_permissions: Tarkista käyttöoikeudet
title: Valtuutus vaaditaan
show:

View file

@ -60,7 +60,7 @@ fo:
error:
title: Ein feilur er íkomin
new:
prompt_html: "%{client_name} kundi hugsa sær atgongd til tína kontu. Tað er ein triðjaparts-nýtsluskipan. <strong>Tú skal ikki geva henni hesa heimld, um tú ikki hevur álit á henni.</strong>"
prompt_html: "%{client_name} kundi hugsað sær atgongd til tína kontu. <strong>Góðtak einans hesa umbøn, um tú kennir hesa keldu aftur og hevur álit á henni.</strong>"
review_permissions: Eftirkanna rættindi
title: Váttan kravd
show:

View file

@ -60,7 +60,6 @@ fr-CA:
error:
title: Une erreur est survenue
new:
prompt_html: "%{client_name} souhaite accéder à votre compte. Il s'agit d'une application tierce. <strong>Si vous ne lui faites pas confiance, vous ne devriez pas l'y autoriser.</strong>"
review_permissions: Examiner les autorisations
title: Autorisation requise
show:

View file

@ -60,7 +60,6 @@ fr:
error:
title: Une erreur est survenue
new:
prompt_html: "%{client_name} souhaite accéder à votre compte. Il s'agit d'une application tierce. <strong>Vous ne devriez pas l'y autoriser si vous ne lui faites pas confiance.</strong>"
review_permissions: Examiner les autorisations
title: Autorisation requise
show:

View file

@ -60,7 +60,6 @@ fy:
error:
title: Der is in flater bard
new:
prompt_html: "%{client_name} hat tastimming nedich om tagong te krijen ta jo account. It giet om in tapassing fan in tredde partij.<strong>As jo dit net fertrouwe, moatte jo gjin tastimming jaan.</strong>"
review_permissions: Tastimmingen beoardiele
title: Autorisaasje fereaske
show:

View file

@ -60,7 +60,6 @@ ga:
error:
title: Tharla earráid
new:
prompt_html: Ba mhaith le %{client_name} cead rochtain a fháil ar do chuntas. Is iarratas tríú páirtí é. <strong>Mura bhfuil muinín agat as, níor cheart duit é a údarú.</strong>
review_permissions: Ceadanna a athbhreithniú
title: Tá údarú ag teastáil
show:

View file

@ -60,7 +60,7 @@ gd:
error:
title: Thachair mearachd
new:
prompt_html: Bu mhiann le %{client_name} cead gus an cunntas agad inntrigeadh. Seo aplacaid threas-phàrtaidh. <strong>Mur eil earbsa agad ann, na ùghdarraich e.</strong>
prompt_html: Bu toigh le %{client_name} cead fhaighinn airson an cunntas agad inntrigeadh. <strong>Na gabh ris an iarrtas seo ach mas aithne dhut an tùs seo agus earbsa agad ann.</strong>
review_permissions: Thoir sùil air na ceadan
title: Tha feum air ùghdarrachadh
show:

View file

@ -60,7 +60,7 @@ gl:
error:
title: Algo fallou
new:
prompt_html: "%{client_name} solicita permiso para acceder á túa conta. É unha aplicación de terceiros. <strong>Se non confías nela, non deberías autorizala.</strong>"
prompt_html: "%{client_name} solicita permiso para acceder á túa conta. <strong>Aproba esta solicitude só se recoñeces e confías da súa orixe.</strong>"
review_permissions: Revisar permisos
title: Autorización necesaria
show:

View file

@ -60,7 +60,7 @@ he:
error:
title: התרחשה שגיאה
new:
prompt_html: "%{client_name} מעוניין בהרשאה לגשת לחשבונך. זוהי אפליקציית צד-שלישי. <strong>אם יש סיבה לא לבטוח בה, נא לא לאשר.</strong>"
prompt_html: היישום %{client_name} מבקש גישה לחשבונך. <strong>אשרו רק אם אתם מזהים את הבקשה וסומכים על מקור הבקשה.</strong>
review_permissions: עיון בהרשאות
title: נדרשת הרשאה
show:

View file

@ -60,7 +60,6 @@ hu:
error:
title: Hiba történt
new:
prompt_html: "%{client_name} szeretné elérni a fiókodat. Ez egy harmadik féltől származó alkalmazás. <strong>Ha nem bízol meg benne, ne addj felhatalmazást neki.</strong>"
review_permissions: Jogosultságok áttekintése
title: Engedélyezés szükséges
show:

View file

@ -60,7 +60,6 @@ ia:
error:
title: Un error ha occurrite
new:
prompt_html: "%{client_name} vole haber le permission de acceder a tu conto. Illo es un application tertie. <strong>Si tu non confide in illo, alora tu non deberea autorisar lo.</strong>"
review_permissions: Revider permissiones
title: Autorisation necessari
show:

View file

@ -60,7 +60,6 @@ id:
error:
title: Ada yang error
new:
prompt_html: "%{client_name} meminta izin untuk mengakses akun Anda. Ini adalah aplikasi pihak ketiga. <strong>Jika Anda tidak mempercayainya, Anda boleh tidak mengizinkannya.</strong>"
review_permissions: Tinjau izin
title: Izin diperlukan
show:

View file

@ -60,7 +60,6 @@ ie:
error:
title: Alquo ha errat
new:
prompt_html: "%{client_name}, un aplication de triesim partise, vole permission por accesser tui conto. <strong>Si tu ne fide it, ne autorisa it.</strong>"
review_permissions: Inspecter permissiones
title: Autorisation besonat
show:

View file

@ -60,7 +60,6 @@ io:
error:
title: Eroro eventis
new:
prompt_html: "%{client_name} volas permiso por acesar vua konti. Ol esas externa softwaro. <strong>Se vu ne fidas, lore vu debas ne yurizar.</strong>"
review_permissions: Kontrolez permisi
title: Yurizo bezonesas
show:

View file

@ -60,7 +60,6 @@ is:
error:
title: Villa kom upp
new:
prompt_html: "%{client_name} biður um heimild til að fara inn á notandaaðganginn þinn. Þetta er utanaðkomandi hugbúnaður. <strong>Ef þú treystir ekki viðkomandi, þá ættir þú ekki að heimila þetta.</strong>"
review_permissions: Yfirfara heimildir
title: Auðkenning er nauðsynleg
show:

View file

@ -60,7 +60,7 @@ it:
error:
title: Si è verificato un errore
new:
prompt_html: "%{client_name} vorrebbe l'autorizzazione ad accedere al tuo profilo. È un'applicazione di terze parti. <strong>Se non ti fidi, non dovresti autorizzarla.</strong>"
prompt_html: "%{client_name} vorrebbe il permesso di accedere al tuo account. <strong>Approva questa richiesta solo se riconosci e ti fidi di questa fonte.</strong>"
review_permissions: Revisiona le autorizzazioni
title: Autorizzazione necessaria
show:

View file

@ -60,7 +60,6 @@ ja:
error:
title: エラーが発生しました
new:
prompt_html: "%{client_name}があなたのアカウントにアクセスする許可を求めています。<strong>心当たりが無い場合はアクセス許可しないでください。</strong>"
review_permissions: アクセス許可を確認
title: 認証が必要です
show:

View file

@ -60,7 +60,6 @@ ko:
error:
title: 오류가 발생하였습니다
new:
prompt_html: "%{client_name} 제3자 애플리케이션이 귀하의 계정에 접근하기 위한 권한을 요청하고 있습니다. <strong>이 애플리케이션을 신뢰할 수 없다면 이 요청을 승인하지 마십시오.</strong>"
review_permissions: 권한 검토
title: 승인 필요
show:

View file

@ -60,7 +60,6 @@ ku:
error:
title: Xeletîyek çêbû
new:
prompt_html: "%{client_name} mafê dixwaze ku bigihîje ajimêrê te. Ew sepanek aliyê sêyemîn e. <strong>Ku tu pê bawer nakî, wê demê divê tu mafê gihiştinê nedî. </strong>"
review_permissions: Gihiştinan binirxînin
title: Destûr kirin pêwîst e
show:

View file

@ -60,7 +60,6 @@ lad:
error:
title: Un yerro tiene afitado
new:
prompt_html: "%{client_name} kere permiso para akseder tu kuento. Es una aplikasyon de terseros. <strong>Si no konfias en eya, no deverias autorizarla.</strong>"
review_permissions: Reviza permisos
title: Autorizasyon rekerida
show:

View file

@ -60,7 +60,7 @@ lt:
error:
title: Įvyko klaida.
new:
prompt_html: "%{client_name} norėtų gauti leidimą pasiekti tavo paskyrą. Tai trečiosios šalies programa. <strong>Jei ja nepasitiki, tada neturėtum leisti.</strong>"
prompt_html: "%{client_name} norėtų gauti leidimą pasiekti tavo paskyrą. <strong>Patvirtink šį prašymą tik tada, jei atpažįsti šį šaltinį ir juo pasitiki.</strong>"
review_permissions: Peržiūrėti leidimus
title: Privalomas leidimas
show:

View file

@ -60,7 +60,6 @@ lv:
error:
title: Radās kļūda
new:
prompt_html: "%{client_name} vēlas saņemt atļauju piekļūt tavam kontam. Tā ir trešās puses lietojumprogramma. <strong>Ja tu tam neuzticies, tad nevajadzētu to autorizēt.</strong>"
review_permissions: Pārskatīt atļaujas
title: Nepieciešama autorizācija
show:

View file

@ -60,7 +60,6 @@ ms:
error:
title: Ralat telah berlaku
new:
prompt_html: "%{client_name} ingin mendapatkan kebenaran untuk mengakses akaun anda. Ia adalah aplikasi pihak ketiga. <strong>Jika anda tidak mempercayainya, maka anda tidak seharusnya membenarkannya.</strong>"
review_permissions: Semak kebenaran
title: Kebenaran diperlukan
show:

View file

@ -60,7 +60,6 @@ my:
error:
title: အမှားအယွင်းတစ်ခု ဖြစ်ပေါ်ခဲ့သည်
new:
prompt_html: "%{client_name} က သင့်အကောင့်သို့ ဝင်ရောက်ရန် ခွင့်ပြုချက်ရယူလိုပါသည်။ ၎င်းမှာ ပြင်ပကြားခံအက်ပလီကေးရှင်းတစ်ခုဖြစ်သည်။ <strong>သင် မယုံကြည်ပါက ၎င်းကိုခွင့်မပြုသင့်ပါ။</strong>"
review_permissions: ခွင့်ပြုချက်များကို ပြန်လည်သုံးသပ်ပါ
title: ခွင့်ပြုချက် လိုအပ်သည်
show:

View file

@ -60,7 +60,7 @@ nl:
error:
title: Er is een fout opgetreden
new:
prompt_html: "%{client_name} heeft toestemming nodig om toegang te krijgen tot jouw account. Het betreft een third-party-toepassing.<strong>Als je dit niet vertrouwt, moet je geen toestemming verlenen.</strong>"
prompt_html: "%{client_name} vraagt om toegang tot je account. <strong>Keur dit verzoek alleen goed als je deze bron herkent en vertrouwt.</strong>"
review_permissions: Toestemmingen beoordelen
title: Autorisatie vereist
show:

View file

@ -60,7 +60,7 @@ nn:
error:
title: Ein feil har oppstått
new:
prompt_html: "%{client_name} ønsker tilgang til kontoen din. Det er ein tredjepartsapplikasjon. <strong>Dersom du ikkje stolar på den, bør du ikkje autorisere det.</strong>"
prompt_html: "%{client_name} ynskjer tilgang til kontoen din. <strong>Godkjenn dette berre dersom du kjenner att og stolar på %{client_name}.</strong>"
review_permissions: Sjå gjennom løyve
title: Autorisasjon nødvendig
show:

View file

@ -60,7 +60,6 @@
error:
title: En feil oppstod
new:
prompt_html: "%{client_name} ønsker tilgang til kontoen din. Det er en tredjeparts applikasjon. <strong>Hvis du ikke stoler på den, bør du ikke autorisere den.</strong>"
review_permissions: Gå gjennom tillatelser
title: Autorisasjon påkrevd
show:

View file

@ -60,7 +60,6 @@ oc:
error:
title: I a agut un error
new:
prompt_html: "%{client_name} volria lautorizacion daccedir a vòstre compte. Es una aplicacion tèrça.<strong>Se vos fisatz pas a ela, alara deuriatz pas lautorizacion.</strong>"
review_permissions: Repassar las autorizacions
title: Cal lautorizacion
show:

View file

@ -60,7 +60,7 @@ pl:
error:
title: Wystapił błąd
new:
prompt_html: "%{client_name} chciałby uzyskać pozwolenie na dostęp do Twojego konta. Jest to aplikacja zewnętrzna. <strong>Jeśli jej nie ufasz, nie powinno się jej autoryzować.</strong>"
prompt_html: "%{client_name} prosi o dostęp do twojego konta. <strong>Tylko zatwierdź tę prośbę, jeżeli ją rozpoznajesz i ufasz.</strong>"
review_permissions: Sprawdź uprawnienia
title: Wymagana jest autoryzacja
show:

View file

@ -60,7 +60,6 @@ pt-BR:
error:
title: Ocorreu um erro
new:
prompt_html: O %{client_name} gostaria de ter permissão para acessar sua conta. Trata-se de uma aplicação de terceiros. <strong>Se você não confia nesta aplicação, então você não deve autorizá-la.</strong>
review_permissions: Rever permissões
title: Autorização necessária
show:

View file

@ -60,7 +60,6 @@ pt-PT:
error:
title: Ocorreu um erro
new:
prompt_html: "%{client_name} pretende ter permissão para aceder à sua conta. É uma aplicação de terceiros. <strong>Se não confia nesta aplicação, então não deve autorizá-la.</strong>"
review_permissions: Rever permissões
title: Autorização necessária
show:

View file

@ -60,7 +60,6 @@ ro:
error:
title: A apărut o eroare
new:
prompt_html: "%{client_name} dorește să îți acceseze contul. Este o aplicație terță. <strong>Dacă nu aveți încredere în ea, atunci nu ar trebui să o autorizați.</strong>"
review_permissions: Revizuiți permisiunile
title: Autorizare necesară
show:

View file

@ -60,7 +60,6 @@ ru:
error:
title: Произошла ошибка
new:
prompt_html: "%{client_name} хочет получить доступ к вашему аккаунту. Это стороннее приложение. <strong>Если вы ему не доверяете, не разрешайте доступ.</strong>"
review_permissions: Просмотр разрешений
title: Требуется авторизация
show:

View file

@ -60,7 +60,6 @@ sco:
error:
title: A error haes occurrt
new:
prompt_html: "%{client_name} wad like permission fir tae access yer accoont. It is a third-party application. <strong>Gin ye dinnae trust it, then ye shuidnae authorize it.</strong>"
review_permissions: Luik ower permissions
title: Authorization requirt
show:

View file

@ -60,7 +60,6 @@ si:
error:
title: දෝෂයක් සිදු වී ඇත
new:
prompt_html: "%{client_name} ඔබගේ ගිණුමට ප්‍රවේශ වීමට අවසර ලබා ගැනීමට කැමති වේ. එය තෙවන පාර්ශවීය යෙදුමකි. <strong>ඔබ එය විශ්වාස නොකරන්නේ නම්, ඔබ එයට අවසර නොදිය යුතුය.</strong>"
review_permissions: අවසර සමාලෝචනය
title: බලය පැවරීමේ අවශ්ය
show:

View file

@ -60,7 +60,6 @@ sk:
error:
title: Nastala chyba
new:
prompt_html: "%{client_name} žiada o povolenie na prístup k vášmu účtu. Ide o aplikáciu tretej strany. <strong>Ak jej nedôverujete, nemali by ste ju povoliť.</strong>"
review_permissions: Preskúmať povolenia
title: Je potrebné schválenie
show:

View file

@ -60,7 +60,6 @@ sl:
error:
title: Prišlo je do napake
new:
prompt_html: "%{client_name} želi dovoljenje za dostop do vašega računa. Gre za zunanji program. <strong>Če mu ne zaupate, mu ne dodelite teh pravic.</strong>"
review_permissions: Preglej dovoljenja
title: Potrebna je odobritev
show:

View file

@ -60,7 +60,6 @@ sq:
error:
title: Ndodhi një gabim
new:
prompt_html: "%{client_name} do të donte leje të hyjë në llogarinë tuaj. Është një aplikacion palësh të treta. <strong>Nëse si zini besë, atëherë sduhet ta autorizoni.</strong>"
review_permissions: Shqyrtoni leje
title: Lypset autorizim
show:

View file

@ -60,7 +60,6 @@ sr-Latn:
error:
title: Dogodila se greška
new:
prompt_html: "%{client_name} želi dozvolu za pristup tvom nalogu. U pitanju je aplikacija treće strane. <strong>Ako smatraš da nije pouzdana, ne bi trebalo da je ovlastiš.</strong>"
review_permissions: Pregledaj dozvole
title: Potrebna autorizacija
show:

View file

@ -60,7 +60,6 @@ sr:
error:
title: Догодила се грешка
new:
prompt_html: "%{client_name} жели дозволу за приступ твом налогу. У питању је апликација треће стране. <strong>Ако сматраш да није поуздана, не би требало да је овластиш.</strong>"
review_permissions: Прегледај дозволе
title: Потребна ауторизација
show:

View file

@ -60,7 +60,6 @@ sv:
error:
title: Ett fel har uppstått
new:
prompt_html: "%{client_name} vill ha behörighet att komma åt ditt konto. Det är en applikation från tredje part. <strong>Du bör endast godkänna den om du litar på den.</strong>"
review_permissions: Granska behörigheter
title: Godkännande krävs
show:

View file

@ -60,7 +60,6 @@ th:
error:
title: เกิดข้อผิดพลาด
new:
prompt_html: "%{client_name} ต้องการสิทธิอนุญาตเพื่อเข้าถึงบัญชีของคุณ แอปพลิเคชันเป็นแอปพลิเคชันจากบุคคลที่สาม <strong>หากคุณไม่เชื่อถือแอปพลิเคชัน คุณไม่ควรอนุญาตแอปพลิเคชัน</strong>"
review_permissions: ตรวจทานสิทธิอนุญาต
title: ต้องการการอนุญาต
show:

View file

@ -60,7 +60,7 @@ tr:
error:
title: Bir hata oluştu
new:
prompt_html: "%{client_name} hesabınıza erişme izni istiyor. Bu üçüncü taraf bir uygulamadır. <strong>Eğer güvenmiyorsanız, izin vermemelisiniz.</strong>"
prompt_html: "%{client_name} hesabınıze erişmek için izin istiyor. <strong>Bu isteği sadece bu kaynağı tanıyor ve güveniyorsanız onaylayın.</strong>"
review_permissions: İzinleri incele
title: İzin gerekli
show:

View file

@ -60,7 +60,7 @@ uk:
error:
title: Сталася помилка
new:
prompt_html: "%{client_name} хоче отримати доступ до вашого облікового запису. Це сторонній застосунок. <strong>Якщо ви йому не довіряєте, не варто авторизувати його.</strong>"
prompt_html: "%{client_name} хоче отримати дозвіл на доступ до вашого облікового запису. <strong>Схвалюйте цей запит, якщо ви впізнаєте це джерело і довіряєте йому.</strong>"
review_permissions: Переглянути дозволи
title: Необхідна авторизація
show:

View file

@ -60,7 +60,7 @@ vi:
error:
title: Một lỗi đã xảy ra
new:
prompt_html: "%{client_name} yêu cầu truy cập tài khoản của bạn. Đây là ứng dụng của bên thứ ba. <strong>Nếu không tin tưởng, đừng cho phép nó.</strong>"
prompt_html: "%{client_name} cần được bạn cho phép truy cập vào tài khoản. <strong>Cho phép nếu bạn tin tưởng ứng dụng này.</strong>"
review_permissions: Quyền truy cập
title: Yêu cầu truy cập
show:

View file

@ -60,7 +60,7 @@ zh-CN:
error:
title: 发生错误
new:
prompt_html: "%{client_name} 希望得到访问你账号的许可。这是一个第三方应用。<strong>如果你不信任它,那么你不应该授权它。</strong>"
prompt_html: "%{client_name} 请求获得访问您账户的权限。 <strong>请在确保自己了解并信任此来源后再批准该请求。</strong>"
review_permissions: 检查权限
title: 需要授权
show:

View file

@ -60,7 +60,6 @@ zh-HK:
error:
title: 發生錯誤
new:
prompt_html: "%{client_name} 想得到存取你帳號的權限。這是一個第三方應用程式。<strong>如果你不信任它,請勿授權。</strong>"
review_permissions: 檢視權限
title: 需要用戶授權
show:

View file

@ -60,7 +60,7 @@ zh-TW:
error:
title: 發生錯誤
new:
prompt_html: "%{client_name} 欲請求存取您帳號之權限。這是一個第三方應用程式。<strong>若您不信任該應用程式,請不要授權。</strong>"
prompt_html: "%{client_name} 想要請求存取您帳號之權限。<strong>請僅於您所識別且信任此來源時允許請求。</strong>"
review_permissions: 檢視權限
title: 需要授權
show:

View file

@ -24,6 +24,8 @@ el:
admin:
account_actions:
action: Εκτέλεση ενέργειας
already_silenced: Αυτός ο λογαριασμός έχει ήδη περιοριστεί.
already_suspended: Αυτός ο λογαριασμός έχει ήδη ανασταλεί.
title: Εκτέλεση ενέργειας συντονισμού στον %{acct}
account_moderation_notes:
create: Άφησε σημείωση
@ -45,6 +47,7 @@ el:
title: Αλλαγή email για %{username}
change_role:
changed_msg: Ο ρόλος άλλαξε επιτυχώς!
edit_roles: Διαχείριση ρόλων χρήστη
label: Αλλαγή ρόλου
no_role: Κανένας ρόλος
title: Αλλαγή ρόλου για %{username}

View file

@ -24,12 +24,15 @@ eo:
admin:
account_actions:
action: Plenumi agon
already_silenced: Ĉi tiu konto jam estis limigita.
already_suspended: Ĉi tiu konto jam estis suspendita.
title: Plenumi kontrolan agon al %{acct}
account_moderation_notes:
create: Lasi noton
created_msg: Noto de moderigado sukcese kreita!
destroyed_msg: Noto de moderigado sukcese detruita!
accounts:
add_email_domain_block: Bloki retpoŝtan domajnon
approve: Aprobi
approved_msg: Sukcese aprobis aliĝ-peton de %{username}
are_you_sure: Ĉu vi certas?
@ -44,6 +47,7 @@ eo:
title: Ŝanĝi retadreson por %{username}
change_role:
changed_msg: Rolo sukcese ŝanĝita!
edit_roles: Administri uzantrolojn
label: Ŝanĝi rolon
no_role: Neniu rolo
title: Ŝanĝi rolon por %{username}
@ -817,16 +821,27 @@ eo:
action: Klaku ĉi tie por pliaj informoj
message_html: "<strong>Via objektostokado estas misagordita. La privateco de viaj uzantoj estas en risko.</strong>"
tags:
moderation:
title: Stato
name: Nomo
newest: Plej novaj
oldest: Plej malnovaj
review: La statuso de la recenzo
search: Serĉi
title: Kradvortoj
updated_msg: Kradvorto agordoj ĝisdatigis sukcese
title: Administrado
trends:
allow: Permesi
approved: Aprobita
confirm_allow: Ĉu vi certas, ke vi volas permesi elektitajn etikedojn?
confirm_disallow: Ĉu vi certas, ke vi volas malpermesi elektitajn etikedojn?
disallow: Malpermesi
links:
allow: Permesi ligilon
allow_provider: Permesi publikiganto
confirm_allow: Ĉu vi certas, ke vi volas permesi elektitajn ligilojn?
confirm_disallow: Ĉu vi certas, ke vi volas malpermesi elektitajn ligilojn?
description_html: Ĉioj estas ligiloj kiuj nun diskonitajs multe de kontoj kiujn via servilo vidas. Ligiloj ne montritas publike se vi ne aprobis la publikiganton.
disallow: Malpermesi ligilon
disallow_provider: Malpermesi publikiganton
@ -850,6 +865,8 @@ eo:
statuses:
allow: Permesi afiŝon
allow_account: Permesi aŭtoron
confirm_allow_account: Ĉu vi certas, ke vi volas permesi elektitajn kontojn?
confirm_disallow_account: Ĉu vi certas, ke vi volas malpermesi elektitajn kontojn?
description_html: Oni multe diskonigas kaj stelumas ĉi tiujn mesaĝojn nuntempe laŭ via servilo. Tio povas helpi novajn kaj revenantajn uzantojn trovi pli da homoj por sekvi. Mesaĝo estas montrita publike nur se vi aprobis la aŭtoron kaj se la aŭtoro aprobis ke ties konto estu proponita al aliaj. Vi ankaŭ povas permesi aŭ malakcepti specifajn mesaĝojn.
disallow: Malpermesi afiŝon
disallow_account: Malpermesi aŭtoron
@ -928,6 +945,8 @@ eo:
body: "%{reporter} signalis %{target}"
body_remote: Iu de %{domain} signalis %{target}
subject: Nova signalo por %{instance} (#%{id})
new_software_updates:
body: Novaj versioj de Mastodon estis publikigitaj, vi eble volas ĝisdatigi!
new_trends:
body: 'La eroj bezonas kontrolon antau ol ili povas montritas publike:'
new_trending_links:
@ -1033,6 +1052,9 @@ eo:
view_strikes: Vidi antauaj admonoj kontra via konto
too_fast: Formularo sendita tro rapide, klopodu denove.
use_security_key: Uzi sekurecan ŝlosilon
author_attribution:
more_from_html: Pli de %{name}
s_blog: Blogo de %{name}
challenge:
confirm: Daŭrigi
hint_html: "<strong>Konsileto:</strong> Ni ne demandos pri via pasvorto ĝis 1 horo."
@ -1231,6 +1253,7 @@ eo:
states:
finished: Finita
unconfirmed: Nekonfirmita
status: Stato
success: Viaj datumoj estis sukcese alŝutitaj kaj estos traktitaj kiel planite
titles:
following: Importado de sekvaj kontoj
@ -1689,7 +1712,13 @@ eo:
silence: Konto limigita
suspend: Konto suspendita
welcome:
apps_step: Elŝutu niajn oficialajn aplikaĵojn.
apps_title: Aplikaĵoj de Mastodon
edit_profile_action: Agordi
edit_profile_title: Agordi vian profilon
explanation: Jen kelkaj konsiloj por helpi vin komenci
feature_action: Lerni pli
follow_action: Sekvi
subject: Bonvenon en Mastodon
title: Bonvenon, %{name}!
users:

View file

@ -2,6 +2,15 @@
el:
simple_form:
hints:
account:
attribution_domains_as_text: Προστατεύει από ψευδείς ιδιότητες.
discoverable: Οι δημόσιες δημοσιεύσεις και το προφίλ σου μπορεί να εμφανίζονται ή να συνιστώνται σε διάφορους τομείς του Mastodon και το προφίλ σου μπορεί να προτείνεται σε άλλους χρήστες.
display_name: Το πλήρες ή το αστείο σου όνομα.
fields: Η αρχική σου σελίδα, αντωνυμίες, ηλικία, ό,τι θες.
indexable: Οι δημόσιες δημοσιεύσεις σου μπορεί να εμφανιστούν στα αποτελέσματα αναζήτησης στο Mastodon. Άτομα που έχουν αλληλεπιδράσει με τις δημοσιεύσεις σου μπορεί να είναι σε θέση να τις αναζητήσουν όπως και να 'χει.
note: 'Μπορείς να @επισημάνεις άλλα άτομα ή #ετικέτες.'
show_collections: Οι χρήστες θα είναι σε θέση να περιηγηθούν στα άτομα που ακολουθείς και στους ακόλουθούς σου. Άτομα που ακολουθείς θα βλέπουν ότι τους ακολουθείς όπως και να 'χει.
unlocked: Οι χρήστες θα είναι σε θέση να σε ακολουθήσουν χωρίς να ζητούν έγκριση. Κατάργησε την επιλογή αν θες να αξιολογείς τα αιτήματα ακολούθησης και να επιλέξεις αν θα αποδεχθείς ή απορρίψεις νέους ακόλουθους.
account_alias:
acct: Όρισε το username@domain του λογαριασμού από τον οποίο θέλεις να μετακινηθείς
account_migration:
@ -31,12 +40,14 @@ el:
text: Μπορείς να κάνετε έφεση σε ένα παράπτωμα μόνο μία φορά
defaults:
autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα
avatar: WEBP, PNG, GIF ή JPG. Το πολύ %{size}. Θα υποβαθμιστεί σε %{dimensions}px
bot: Ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται
context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο
current_password: Για λόγους ασφαλείας παρακαλώ γράψε τον κωδικό του τρέχοντος λογαριασμού
current_username: Για επιβεβαίωση, παρακαλώ γράψε το όνομα χρήστη του τρέχοντος λογαριασμού
digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου
email: Θα σου σταλεί email επιβεβαίωσης
header: WEBP, PNG, GIF ή JPG. Το πολύ %{size}. Θα υποβαθμιστεί σε %{dimensions}px
inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή που θέλεις να χρησιμοποιήσεις
irreversible: Οι φιλτραρισμένες αναρτήσεις θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί
locale: Η γλώσσα χρήσης, των email και των ειδοποιήσεων push
@ -67,10 +78,15 @@ el:
warn: Απόκρυψη φιλτραρισμένου περιεχομένου πίσω από μια προειδοποίηση που αναφέρει τον τίτλο του φίλτρου
form_admin_settings:
activity_api_enabled: Καταμέτρηση τοπικά δημοσιευμένων δημοσιεύσεων, ενεργών χρηστών και νέων εγγραφών σε εβδομαδιαία πακέτα
app_icon: WEBP, PNG, GIF ή JPG. Παρακάμπτει το προεπιλεγμένο εικονίδιο εφαρμογής σε κινητές συσκευές με προσαρμοσμένο εικονίδιο.
backups_retention_period: Οι χρήστες έχουν τη δυνατότητα να δημιουργήσουν αρχεία των αναρτήσεων τους για να κατεβάσουν αργότερα. Όταν οριστεί μια θετική τιμή, αυτά τα αρχεία θα διαγράφονται αυτόματα από τον αποθηκευτικό σου χώρο μετά τον καθορισμένο αριθμό ημερών.
bootstrap_timeline_accounts: Αυτοί οι λογαριασμοί θα καρφιτσωθούν στην κορυφή των νέων χρηστών που ακολουθούν τις συστάσεις.
closed_registrations_message: Εμφανίζεται όταν κλείνουν οι εγγραφές
content_cache_retention_period: Όλες οι αναρτήσεις από άλλους διακομιστές (συμπεριλαμβανομένων των ενισχύσεων και απαντήσεων) θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών, χωρίς να λαμβάνεται υπόψη οποιαδήποτε αλληλεπίδραση τοπικού χρήστη με αυτές τις αναρτήσεις. Αυτό περιλαμβάνει αναρτήσεις όπου ένας τοπικός χρήστης την έχει χαρακτηρίσει ως σελιδοδείκτη ή αγαπημένη. Θα χαθούν επίσης ιδιωτικές αναφορές μεταξύ χρηστών από διαφορετικές οντότητες και θα είναι αδύνατο να αποκατασταθούν. Η χρήση αυτής της ρύθμισης προορίζεται για οντότητες ειδικού σκοπού και χαλάει πολλές προσδοκίες του χρήστη όταν εφαρμόζεται για χρήση γενική σκοπού.
custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστοσελίδας του Mastodon.
favicon: WEBP, PNG, GIF ή JPG. Παρακάμπτει το προεπιλεγμένο favicon του Mastodon με ένα προσαρμοσμένο εικονίδιο.
mascot: Παρακάμπτει την εικονογραφία στην προηγμένη διεπαφή ιστού.
media_cache_retention_period: Τα αρχεία πολυμέσων από αναρτήσεις που γίνονται από απομακρυσμένους χρήστες αποθηκεύονται προσωρινά στο διακομιστή σου. Όταν οριστεί μια θετική τιμή, τα μέσα θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών. Αν τα δεδομένα πολυμέσων ζητηθούν μετά τη διαγραφή τους, θα γίνει ε, αν το πηγαίο περιεχόμενο είναι ακόμα διαθέσιμο. Λόγω περιορισμών σχετικά με το πόσο συχνά οι κάρτες προεπισκόπησης συνδέσμων συνδέονται σε ιστοσελίδες τρίτων, συνιστάται να ορίσεις αυτή την τιμή σε τουλάχιστον 14 ημέρες ή οι κάρτες προεπισκόπησης συνδέσμων δεν θα ενημερώνονται κατ' απάιτηση πριν από εκείνη την ώρα.
peers_api_enabled: Μια λίστα με ονόματα τομέα που συνάντησε αυτός ο διακομιστής στο fediverse. Δεν περιλαμβάνονται δεδομένα εδώ για το αν συναλλάσσετε με ένα συγκεκριμένο διακομιστή, μόνο ότι ο διακομιστής σας το ξέρει. Χρησιμοποιείται από υπηρεσίες που συλλέγουν στατιστικά στοιχεία για την συναλλαγή με γενική έννοια.
profile_directory: Ο κατάλογος προφίλ παραθέτει όλους τους χρήστες που έχουν επιλέξει να είναι ανακαλύψιμοι.
require_invite_text: 'Όταν η εγγραφή απαιτεί χειροκίνητη έγκριση, κάνε το πεδίο κειμένου: «Γιατί θέλετε να συμμετάσχετε;» υποχρεωτικό αντί για προαιρετικό'
@ -103,14 +119,19 @@ el:
sign_up_requires_approval: Νέες εγγραφές θα απαιτούν την έγκριση σας
severity: Επιλέξτε τι θα γίνεται με αιτήσεις από αυτήν την διεύθυνση IP
rule:
hint: Προαιρετικό. Δώσε περισσότερες λεπτομέρειες σχετικά με τον κανόνα
text: Περιγράψτε έναν κανόνα ή μια απαίτηση για τους χρήστες σε αυτόν τον διακομιστή. Προσπαθήστε να τον κρατήσετε σύντομο και απλό
sessions:
otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:'
webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά.
settings:
indexable: Η σελίδα του προφίλ σου μπορεί να εμφανιστεί στα αποτελέσματα αναζήτησης στο Google, Bing και άλλες.
show_application: Θα είσαι πάντα σε θέση να δεις ποια εφαρμογή δημοσίευσε την ανάρτησή σου όπως και να 'χει.
tag:
name: Μπορείς να αλλάξεις μόνο το πλαίσιο των χαρακτήρων, για παράδειγμα για να γίνει περισσότερο ευανάγνωστο
user:
chosen_languages: Όταν ενεργοποιηθεί, στη δημόσια ροή θα εμφανίζονται τουτ μόνο από τις επιλεγμένες γλώσσες
role: Ο ρόλος ελέγχει ποια δικαιώματα έχει ο χρήστης.
user_role:
color: Το χρώμα που θα χρησιμοποιηθεί για το ρόλο σε ολόκληρη τη διεπαφή, ως RGB σε δεκαεξαδική μορφή
highlighted: Αυτό καθιστά το ρόλο δημόσια ορατό
@ -119,12 +140,18 @@ el:
position: Ανώτεροι ρόλοι αποφασίζει την επίλυση συγκρούσεων σε ορισμένες περιπτώσεις. Ορισμένες ενέργειες μπορούν να εκτελεστούν μόνο σε ρόλους με χαμηλότερη προτεραιότητα
webhook:
events: Επιλέξτε συμβάντα για αποστολή
template: Σύνθεσε το δικό σου JSON payload χρησιμοποιώντας μεταβλητή παρεμβολή. Άφησε κενό για προεπιλογή JSON.
url: Πού θα σταλούν τα γεγονότα
labels:
account:
attribution_domains_as_text: Να επιτρέπονται μόνο συγκεκριμένες ιστοσελίδες
discoverable: Παροχή προφίλ και αναρτήσεων σε αλγορίθμους ανακάλυψης
fields:
name: Περιγραφή
value: Περιεχόμενο
indexable: Συμπερίληψη δημόσιων αναρτήσεων στα αποτελέσματα αναζήτησης
show_collections: Εμφάνιση ακολούθων και ακολουθουμένων στο προφίλ
unlocked: Αυτόματη αποδοχή νέων ακολούθων
account_alias:
acct: Διακριτικό του παλιού λογαριασμού
account_migration:
@ -186,6 +213,7 @@ el:
setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων
setting_default_sensitive: Σημείωση όλων των πολυμέσων ως ευαίσθητου περιεχομένου
setting_delete_modal: Επιβεβαίωση πριν τη διαγραφή ενός τουτ
setting_disable_hover_cards: Απενεργοποίηση προεπισκόπησης προφίλ κατά την αιώρηση
setting_disable_swiping: Απενεργοποίηση κινήσεων συρσίματος
setting_display_media: Εμφάνιση πολυμέσων
setting_display_media_default: Προκαθορισμένο
@ -217,10 +245,13 @@ el:
warn: Απόκρυψη με προειδοποίηση
form_admin_settings:
activity_api_enabled: Δημοσίευση συγκεντρωτικών στατιστικών σχετικά με τη δραστηριότητα του χρήστη στο API
app_icon: Εικονίδιο εφαρμογής
backups_retention_period: Περίοδος αρχειοθέτησης του χρήστη
bootstrap_timeline_accounts: Πρότεινε πάντα αυτούς τους λογαριασμούς σε νέους χρήστες
closed_registrations_message: Προσαρμοσμένο μήνυμα όταν οι εγγραφές δεν είναι διαθέσιμες
content_cache_retention_period: Περίοδος διατήρησης απομακρυσμένου περιεχομένου
custom_css: Προσαρμοσμένο CSS
favicon: Favicon
mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο)
media_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης πολυμέσων
peers_api_enabled: Δημοσίευση λίστας των εντοπισμένων διακομιστών στο API
@ -268,15 +299,27 @@ el:
pending_account: Αποστολή email όταν υπάρχει νέος λογαριασμός για επιθεώρηση
reblog: Αποστολή email όταν κάποιος προωθεί τη δημοσίευση σου
report: Υποβλήθηκε νέα αναφορά
software_updates:
all: Ειδοποίηση για όλες τις ενημερώσεις
critical: Ειδοποίηση μόνο για κρίσιμες ενημερώσεις
label: Μια νέα έκδοση του Mastodon είναι διαθέσιμη
none: Να μην ειδοποιούμαι ποτέ για ενημερώσεις (δεν συνιστάται)
patch: Ειδοποίηση για ενημερώσεις σφαλμάτων
trending_tag: Νέο περιεχόμενο προς τάση απαιτεί αξιολόγηση
rule:
hint: Επιπρόσθετες πληροφορίες
text: Κανόνας
settings:
indexable: Συμπερίληψη σελίδας προφίλ στις μηχανές αναζήτησης
show_application: Εμφάνιση από ποια εφαρμογή έστειλες μία ανάρτηση
tag:
listable: Εμφάνιση αυτής της ετικέτας στο δημόσιο κατάλογο
name: Ετικέτα
trendable: Εμφάνιση της ετικέτας στις τάσεις
usable: Να επιτρέπεται η τοπική χρήση αυτής της ετικέτας από αναρτήσεις
user:
role: Ρόλος
time_zone: Ζώνη ώρας
user_role:
color: Χρώμα εμβλήματος
highlighted: Εμφάνιση ρόλου ως σήμα στα προφίλ χρηστών
@ -285,9 +328,11 @@ el:
position: Προτεραιότητα
webhook:
events: Ενεργοποιημένα συμβάντα
template: Πρότυπο payload
url: Endpoint URL
'no': Όχι
not_recommended: Δεν προτείνεται
overridden: Αντικαταστάθηκε
recommended: Προτείνεται
required:
mark: "*"

View file

@ -8,38 +8,12 @@ RSpec.describe NotificationMailer do
let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') }
let(:own_status) { Fabricate(:status, account: receiver.account, text: 'The body of the own status') }
shared_examples 'standard headers' do |type|
it 'renders the email' do
expect(mail)
.to be_present
.and(have_header('To', "#{receiver.account.username} <#{receiver.email}>"))
.and(have_header('List-ID', "<#{type}.alice.cb6e6126.ngrok.io>"))
.and(have_header('List-Unsubscribe', %r{<https://cb6e6126.ngrok.io/unsubscribe\?token=.+>}))
.and(have_header('List-Unsubscribe', /&type=#{type}/))
.and(have_header('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click'))
.and(deliver_to("#{receiver.account.username} <#{receiver.email}>"))
.and(deliver_from('notifications@localhost'))
end
end
shared_examples 'thread headers' do
it 'renders the email with conversation thread headers' do
conversation_header_regex = /<conversation-\d+.\d\d\d\d-\d\d-\d\d@cb6e6126.ngrok.io>/
expect(mail)
.to be_present
.and(have_header('In-Reply-To', conversation_header_regex))
.and(have_header('References', conversation_header_regex))
end
end
describe 'mention' do
let(:mention) { Mention.create!(account: receiver.account, status: foreign_status) }
let(:notification) { Notification.create!(account: receiver.account, activity: mention) }
let(:mail) { prepared_mailer_for(receiver.account).mention }
include_examples 'localized subject', 'notification_mailer.mention.subject', name: 'bob'
include_examples 'standard headers', 'mention'
include_examples 'thread headers'
it 'renders the email' do
expect(mail)
@ -47,6 +21,8 @@ RSpec.describe NotificationMailer do
.and(have_subject('You were mentioned by bob'))
.and(have_body_text('You were mentioned by bob'))
.and(have_body_text('The body of the foreign status'))
.and have_thread_headers
.and have_standard_headers('mention').for(receiver)
end
end
@ -56,13 +32,13 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(receiver.account).follow }
include_examples 'localized subject', 'notification_mailer.follow.subject', name: 'bob'
include_examples 'standard headers', 'follow'
it 'renders the email' do
expect(mail)
.to be_present
.and(have_subject('bob is now following you'))
.and(have_body_text('bob is now following you'))
.and have_standard_headers('follow').for(receiver)
end
end
@ -72,8 +48,6 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(own_status.account).favourite }
include_examples 'localized subject', 'notification_mailer.favourite.subject', name: 'bob'
include_examples 'standard headers', 'favourite'
include_examples 'thread headers'
it 'renders the email' do
expect(mail)
@ -81,6 +55,8 @@ RSpec.describe NotificationMailer do
.and(have_subject('bob favorited your post'))
.and(have_body_text('Your post was favorited by bob'))
.and(have_body_text('The body of the own status'))
.and have_thread_headers
.and have_standard_headers('favourite').for(receiver)
end
end
@ -90,8 +66,6 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(own_status.account).reblog }
include_examples 'localized subject', 'notification_mailer.reblog.subject', name: 'bob'
include_examples 'standard headers', 'reblog'
include_examples 'thread headers'
it 'renders the email' do
expect(mail)
@ -99,6 +73,8 @@ RSpec.describe NotificationMailer do
.and(have_subject('bob boosted your post'))
.and(have_body_text('Your post was boosted by bob'))
.and(have_body_text('The body of the own status'))
.and have_thread_headers
.and have_standard_headers('reblog').for(receiver)
end
end
@ -108,13 +84,13 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(receiver.account).follow_request }
include_examples 'localized subject', 'notification_mailer.follow_request.subject', name: 'bob'
include_examples 'standard headers', 'follow_request'
it 'renders the email' do
expect(mail)
.to be_present
.and(have_subject('Pending follower: bob'))
.and(have_body_text('bob has requested to follow you'))
.and have_standard_headers('follow_request').for(receiver)
end
end

View file

@ -72,7 +72,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do
expect(status).to_not be_nil
expect(status.url).to eq 'https://foo.bar/watch?v=12345'
expect(strip_tags(status.text)).to eq 'Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345'
expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix\n\nhttps://foo.bar/watch?v=12345"
end
end
@ -105,7 +105,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do
expect(status).to_not be_nil
expect(status.url).to eq 'https://foo.bar/watch?v=12345'
expect(strip_tags(status.text)).to eq 'Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345'
expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix\n\nhttps://foo.bar/watch?v=12345"
end
end
@ -125,7 +125,58 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do
expect(status).to_not be_nil
expect(status.url).to eq 'https://foo.bar/@foo/1234'
expect(strip_tags(status.text)).to eq "Let's change the worldhttps://foo.bar/@foo/1234"
expect(strip_tags(status.text)).to eq "Let's change the world\n\nhttps://foo.bar/@foo/1234"
end
end
context 'with Event object that contains a HTML summary' do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'https://foo.bar/@foo/1234',
type: 'Event',
name: 'Fediverse Birthday Party',
startTime: '2024-01-31T20:00:00.000+01:00',
location: {
type: 'Place',
name: 'FooBar The not converted location',
},
content: 'The not converted detailed description of the event object.',
summary: '<p>See you at the <strong>FooBar</strong>!</p><ul><li><strong>Doors:</strong> 8pm</li><li><strong>Music:</strong> 10pm</li></ul>',
attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
}
end
it 'creates status' do
status = sender.statuses.first
expect(status).to_not be_nil
expect(status.url).to eq 'https://foo.bar/@foo/1234'
expect(status.text).to start_with "<h2>#{object[:name]}</h2>\n\n#{object[:summary]}\n\n"
expect(status.text).to include "href=\"#{object[:id]}\""
end
end
context 'with Article object that contains a HTML summary' do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'https://foo.bar/blog/future-of-the-fediverse',
type: 'Article',
name: 'Future of the Fediverse',
content: 'Lorem Ipsum',
summary: '<p>Guest article by <a href="https://john.mastodon">John Mastodon</a></p><p>The fediverse is great reading this you will find out why!</p>',
attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
}
end
it 'creates status' do
status = sender.statuses.first
expect(status).to_not be_nil
expect(status.url).to eq object[:id]
expect(status.text).to start_with "<h2>#{object[:name]}</h2>\n\n#{object[:summary]}\n\n"
expect(status.text).to include "href=\"#{object[:id]}\""
end
end

View file

@ -4,27 +4,55 @@ require 'rails_helper'
RSpec.describe ApproveAppealService do
describe '#call' do
context 'with an existing appeal' do
let(:appeal) { Fabricate(:appeal) }
let(:account) { Fabricate(:account) }
let(:appeal) { Fabricate(:appeal) }
let(:account) { Fabricate(:account) }
it 'processes the appeal approval' do
expect { subject.call(appeal, account) }
.to mark_overruled
.and record_approver
it 'processes the appeal approval' do
expect { subject.call(appeal, account) }
.to mark_overruled
.and record_approver
end
context 'with an appeal about then-deleted posts marked as sensitive by moderators' do
let(:target_account) { Fabricate(:account) }
let(:appeal) { Fabricate(:appeal, strike: strike, account: target_account) }
let(:deleted_media) { Fabricate(:media_attachment, type: :video, status: Fabricate(:status, account: target_account), account: target_account) }
let(:kept_media) { Fabricate(:media_attachment, type: :video, status: Fabricate(:status, account: target_account), account: target_account) }
let(:strike) { Fabricate(:account_warning, target_account: target_account, action: :mark_statuses_as_sensitive, status_ids: [deleted_media.status.id, kept_media.status.id]) }
before do
target_account.unsuspend!
deleted_media.status.discard!
end
def mark_overruled
change(appeal.strike, :overruled_at)
.from(nil)
.to(be > 1.minute.ago)
end
it 'approves the appeal, marks the statuses as not sensitive and notifies target account about the approval', :inline_jobs do
emails = capture_emails { subject.call(appeal, account) }
def record_approver
change(appeal, :approved_by_account)
.from(nil)
.to(account)
expect(appeal.reload).to be_approved
expect(strike.reload).to be_overruled
expect(kept_media.status.reload).to_not be_sensitive
expect(emails.size)
.to eq(1)
expect(emails.first)
.to have_attributes(
to: contain_exactly(target_account.user.email),
subject: eq(I18n.t('user_mailer.appeal_approved.subject', date: I18n.l(appeal.created_at)))
)
end
end
def mark_overruled
change(appeal.strike, :overruled_at)
.from(nil)
.to(be > 1.minute.ago)
end
def record_approver
change(appeal, :approved_by_account)
.from(nil)
.to(account)
end
end
end

View file

@ -12,3 +12,32 @@ RSpec.shared_examples 'localized subject' do |*args, **kwrest|
expect(mail.subject).to eq I18n.t(*args, **kwrest.merge(locale: I18n.default_locale))
end
end
RSpec::Matchers.define :have_thread_headers do
match(notify_expectation_failures: true) do |mail|
expect(mail)
.to be_present
.and(have_header('In-Reply-To', conversation_header_regex))
.and(have_header('References', conversation_header_regex))
end
def conversation_header_regex = /<conversation-\d+.\d\d\d\d-\d\d-\d\d@cb6e6126.ngrok.io>/
end
RSpec::Matchers.define :have_standard_headers do |type|
chain :for do |user|
@user = user
end
match(notify_expectation_failures: true) do |mail|
expect(mail)
.to be_present
.and(have_header('To', "#{@user.account.username} <#{@user.email}>"))
.and(have_header('List-ID', "<#{type}.#{@user.account.username}.#{Rails.configuration.x.local_domain}>"))
.and(have_header('List-Unsubscribe', %r{<https://#{Rails.configuration.x.local_domain}/unsubscribe\?token=.+>}))
.and(have_header('List-Unsubscribe', /&type=#{type}/))
.and(have_header('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click'))
.and(deliver_to("#{@user.account.username} <#{@user.email}>"))
.and(deliver_from(Rails.configuration.action_mailer.default_options[:from]))
end
end