From 31d374e5f57c797e4d4e5bd40ed4c4bb12bfd5fc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:42:33 +0200 Subject: [PATCH 01/26] Update opentelemetry-ruby (non-major) (#31451) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 61bdb1d39c4eda..dada7c86c71710 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -514,17 +514,17 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.7.1) + opentelemetry-instrumentation-action_view (0.7.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_job (0.7.4) + opentelemetry-instrumentation-active_job (0.7.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_model_serializers (0.20.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_record (0.7.2) + opentelemetry-instrumentation-active_record (0.7.3) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_support (0.6.0) @@ -558,7 +558,7 @@ GEM opentelemetry-instrumentation-rack (0.24.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rails (0.31.1) + opentelemetry-instrumentation-rails (0.31.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.1.0) opentelemetry-instrumentation-action_pack (~> 0.9.0) From 71f257d5291a091cfb005d28221d4ab38698ef42 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Mon, 19 Aug 2024 14:28:06 +0200 Subject: [PATCH 02/26] Disable rule selector in ReportReasonSelector if instance has no rules (#31458) --- .../mastodon/components/admin/ReportReasonSelector.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx index cc05e5c163c320..351f1c949edc6d 100644 --- a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx @@ -153,7 +153,7 @@ class ReportReasonSelector extends PureComponent { - + {rules.map(rule => )} From 99051479c137b04367266992514914c8b4e016db Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Mon, 19 Aug 2024 15:25:40 +0200 Subject: [PATCH 03/26] Fix Trending Tags pending review having an unstable sort order (#31473) Co-authored-by: Claire --- app/models/trends/tag_filter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/trends/tag_filter.rb b/app/models/trends/tag_filter.rb index 46b747819e150b..d6f88a9486e710 100644 --- a/app/models/trends/tag_filter.rb +++ b/app/models/trends/tag_filter.rb @@ -14,7 +14,7 @@ def initialize(params) def results scope = if params[:status] == 'pending_review' - Tag.unscoped + Tag.unscoped.order(id: :desc) else trending_scope end From 40f6631ac9474e2c78c15b9d6d360c8c45e26dd9 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 19 Aug 2024 15:55:18 +0200 Subject: [PATCH 04/26] Fix Husky git hooks not being installed anymore (#31435) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 371b7cbf3d1ef6..321a78598df773 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "lint:css": "stylelint \"**/*.{css,scss}\"", "lint": "yarn lint:js && yarn lint:css", "postversion": "git push --tags", - "prepare": "husky", + "postinstall": "test -d node_modules/husky && husky || echo \"husky is not installed\"", "start": "node ./streaming/index.js", "test": "yarn lint && yarn run typecheck && yarn jest", "typecheck": "tsc --noEmit" From 1e612c5a09097ef62f26bb9882125dc2d53c92df Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 19 Aug 2024 16:41:32 +0200 Subject: [PATCH 05/26] Refactor some actions to be proper async actions instead of passing a continuation (#31453) --- .../mastodon/actions/notifications.js | 14 +++--- .../actions/notifications_migration.tsx | 2 +- app/javascript/mastodon/actions/streaming.js | 27 ++++------ app/javascript/mastodon/actions/timelines.js | 50 ++++++++----------- .../mastodon/features/link_timeline/index.tsx | 4 +- 5 files changed, 42 insertions(+), 55 deletions(-) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 7d6a9d5a3296fe..f5105d460f7642 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -188,8 +188,8 @@ const noOp = () => {}; let expandNotificationsController = new AbortController(); -export function expandNotifications({ maxId, forceLoad = false } = {}, done = noOp) { - return (dispatch, getState) => { +export function expandNotifications({ maxId = undefined, forceLoad = false }) { + return async (dispatch, getState) => { const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); const notifications = getState().get('notifications'); const isLoadingMore = !!maxId; @@ -199,7 +199,6 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no expandNotificationsController.abort(); expandNotificationsController = new AbortController(); } else { - done(); return; } } @@ -226,7 +225,8 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no dispatch(expandNotificationsRequest(isLoadingMore)); - api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => { + try { + const response = await api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }); const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(item => item.account))); @@ -236,11 +236,9 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); fetchRelatedRelationships(dispatch, response.data); dispatch(submitMarkers()); - }).catch(error => { + } catch(error) { dispatch(expandNotificationsFail(error, isLoadingMore)); - }).finally(() => { - done(); - }); + } }; } diff --git a/app/javascript/mastodon/actions/notifications_migration.tsx b/app/javascript/mastodon/actions/notifications_migration.tsx index f856e56828f11f..b453aed6ef72a9 100644 --- a/app/javascript/mastodon/actions/notifications_migration.tsx +++ b/app/javascript/mastodon/actions/notifications_migration.tsx @@ -13,6 +13,6 @@ export const initializeNotifications = createAppAsyncThunk( ) as boolean; if (enableBeta) void dispatch(fetchNotifications()); - else dispatch(expandNotifications()); + else void dispatch(expandNotifications()); }, ); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index 44025bd59638f8..630da3ef6e6132 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -37,7 +37,7 @@ const randomUpTo = max => * @param {string} channelName * @param {Object.} params * @param {Object} options - * @param {function(Function, Function): void} [options.fallback] + * @param {function(Function): Promise} [options.fallback] * @param {function(): void} [options.fillGaps] * @param {function(object): boolean} [options.accept] * @returns {function(): void} @@ -52,14 +52,13 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti let pollingId; /** - * @param {function(Function, Function): void} fallback + * @param {function(Function): Promise} fallback */ - const useFallback = fallback => { - fallback(dispatch, () => { - // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook - pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); - }); + const useFallback = async fallback => { + await fallback(dispatch); + // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook + pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); }; return { @@ -132,21 +131,17 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti /** * @param {Function} dispatch - * @param {function(): void} done */ -const refreshHomeTimelineAndNotification = (dispatch, done) => { - // @ts-expect-error - dispatch(expandHomeTimeline({}, () => - // @ts-expect-error - dispatch(expandNotifications({}, () => - dispatch(fetchAnnouncements(done)))))); -}; +async function refreshHomeTimelineAndNotification(dispatch) { + await dispatch(expandHomeTimeline({ maxId: undefined })); + await dispatch(expandNotifications({})); + await dispatch(fetchAnnouncements()); +} /** * @returns {function(): void} */ export const connectUserStream = () => - // @ts-expect-error connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); /** diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index f0ea46118e01a6..65b6d8045112d4 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -76,21 +76,18 @@ export function clearTimeline(timeline) { }; } -const noOp = () => {}; - const parseTags = (tags = {}, mode) => { return (tags[mode] || []).map((tag) => { return tag.value; }); }; -export function expandTimeline(timelineId, path, params = {}, done = noOp) { - return (dispatch, getState) => { +export function expandTimeline(timelineId, path, params = {}) { + return async (dispatch, getState) => { const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const isLoadingMore = !!params.max_id; if (timeline.get('isLoading')) { - done(); return; } @@ -109,7 +106,8 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { dispatch(expandTimelineRequest(timelineId, isLoadingMore)); - api().get(path, { params }).then(response => { + try { + const response = await api().get(path, { params }); const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); @@ -127,52 +125,48 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { if (timelineId === 'home') { dispatch(submitMarkers()); } - }).catch(error => { + } catch(error) { dispatch(expandTimelineFail(timelineId, error, isLoadingMore)); - }).finally(() => { - done(); - }); + } }; } -export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { - return (dispatch, getState) => { +export function fillTimelineGaps(timelineId, path, params = {}) { + return async (dispatch, getState) => { const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const items = timeline.get('items'); const nullIndexes = items.map((statusId, index) => statusId === null ? index : null); const gaps = nullIndexes.map(index => index > 0 ? items.get(index - 1) : null); // Only expand at most two gaps to avoid doing too many requests - done = gaps.take(2).reduce((done, maxId) => { - return (() => dispatch(expandTimeline(timelineId, path, { ...params, maxId }, done))); - }, done); - - done(); + for (const maxId of gaps.take(2)) { + await dispatch(expandTimeline(timelineId, path, { ...params, maxId })); + } }; } -export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }, done); -export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, max_id: maxId, only_media: !!onlyMedia }, done); -export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done); +export const expandHomeTimeline = ({ maxId } = {}) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }); +export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote } = {}) => expandTimeline(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, max_id: maxId, only_media: !!onlyMedia }); +export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }); export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId }); export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); -export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); -export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }, done); -export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { +export const expandListTimeline = (id, { maxId } = {}) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }); +export const expandLinkTimeline = (url, { maxId } = {}) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }); +export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}) => { return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { max_id: maxId, any: parseTags(tags, 'any'), all: parseTags(tags, 'all'), none: parseTags(tags, 'none'), local: local, - }, done); + }); }; -export const fillHomeTimelineGaps = (done = noOp) => fillTimelineGaps('home', '/api/v1/timelines/home', {}, done); -export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote } = {}, done = noOp) => fillTimelineGaps(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia }, done); -export const fillCommunityTimelineGaps = ({ onlyMedia } = {}, done = noOp) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }, done); -export const fillListTimelineGaps = (id, done = noOp) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}, done); +export const fillHomeTimelineGaps = () => fillTimelineGaps('home', '/api/v1/timelines/home', {}); +export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote } = {}) => fillTimelineGaps(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia }); +export const fillCommunityTimelineGaps = ({ onlyMedia } = {}) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }); +export const fillListTimelineGaps = (id) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}); export function expandTimelineRequest(timeline, isLoadingMore) { return { diff --git a/app/javascript/mastodon/features/link_timeline/index.tsx b/app/javascript/mastodon/features/link_timeline/index.tsx index dd726dac1ace2c..262a21afccfa79 100644 --- a/app/javascript/mastodon/features/link_timeline/index.tsx +++ b/app/javascript/mastodon/features/link_timeline/index.tsx @@ -36,13 +36,13 @@ export const LinkTimeline: React.FC<{ const handleLoadMore = useCallback( (maxId: string) => { - dispatch(expandLinkTimeline(decodedUrl, { maxId })); + void dispatch(expandLinkTimeline(decodedUrl, { maxId })); }, [dispatch, decodedUrl], ); useEffect(() => { - dispatch(expandLinkTimeline(decodedUrl)); + void dispatch(expandLinkTimeline(decodedUrl)); }, [dispatch, decodedUrl]); return ( From d2e4be045655816fb0c512c3a953cfe9b062240d Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 19 Aug 2024 16:53:54 +0200 Subject: [PATCH 06/26] Hopefully fix notifications pagination flaky test (#31494) --- spec/requests/api/v1/notifications_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/requests/api/v1/notifications_spec.rb b/spec/requests/api/v1/notifications_spec.rb index 3d1e8a4787bb6a..84e6db1e5163ce 100644 --- a/spec/requests/api/v1/notifications_spec.rb +++ b/spec/requests/api/v1/notifications_spec.rb @@ -185,7 +185,7 @@ def body_json_account_ids it 'returns the requested number of notifications paginated', :aggregate_failures do subject - notifications = user.account.notifications.browserable + notifications = user.account.notifications.browserable.order(id: :asc) expect(body_as_json.size) .to eq(params[:limit]) From d4f135bc6d280f834a7b3365fe0ef644cfe606b6 Mon Sep 17 00:00:00 2001 From: Edward Moulsdale <161692702+wheatear-dev@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:55:42 +0100 Subject: [PATCH 07/26] Fix in memoriam accounts appearing in follow recommendations (#31474) Co-authored-by: Utkarsh Wankar <46633523+kernal053@users.noreply.github.com> --- app/models/account.rb | 1 + .../account_suggestions/friends_of_friends_source.rb | 1 + app/models/account_suggestions/source.rb | 1 + .../account_suggestions/friends_of_friends_source_spec.rb | 8 ++++++-- spec/models/account_suggestions/source_spec.rb | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 23ff07c76967eb..482eaa4aba9826 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -144,6 +144,7 @@ class Account < ApplicationRecord scope :dormant, -> { joins(:account_stat).merge(AccountStat.without_recent_activity) } scope :with_username, ->(value) { where arel_table[:username].lower.eq(value.to_s.downcase) } scope :with_domain, ->(value) { where arel_table[:domain].lower.eq(value&.to_s&.downcase) } + scope :without_memorial, -> { where(memorial: false) } after_update_commit :trigger_update_webhooks diff --git a/app/models/account_suggestions/friends_of_friends_source.rb b/app/models/account_suggestions/friends_of_friends_source.rb index 825b24f41981ed..707c6ccaec283d 100644 --- a/app/models/account_suggestions/friends_of_friends_source.rb +++ b/app/models/account_suggestions/friends_of_friends_source.rb @@ -31,6 +31,7 @@ def source_query(account, limit: DEFAULT_LIMIT) AND accounts.suspended_at IS NULL AND accounts.silenced_at IS NULL AND accounts.moved_to_account_id IS NULL + AND accounts.memorial = FALSE AND follow_recommendation_mutes.target_account_id IS NULL GROUP BY accounts.id, account_stats.id ORDER BY frequency DESC, account_stats.followers_count ASC diff --git a/app/models/account_suggestions/source.rb b/app/models/account_suggestions/source.rb index 7afc4c80edd3ba..9ae6bbbcc9587b 100644 --- a/app/models/account_suggestions/source.rb +++ b/app/models/account_suggestions/source.rb @@ -14,6 +14,7 @@ def base_account_scope(account) .searchable .where(discoverable: true) .without_silenced + .without_memorial .where.not(follows_sql, id: account.id) .where.not(follow_requests_sql, id: account.id) .not_excluded_by_account(account) diff --git a/spec/models/account_suggestions/friends_of_friends_source_spec.rb b/spec/models/account_suggestions/friends_of_friends_source_spec.rb index c2f8d0f86c3326..9daaa233bfd0c4 100644 --- a/spec/models/account_suggestions/friends_of_friends_source_spec.rb +++ b/spec/models/account_suggestions/friends_of_friends_source_spec.rb @@ -15,6 +15,7 @@ let!(:john) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:jerk) { Fabricate(:account, discoverable: true, hide_collections: false) } let!(:larry) { Fabricate(:account, discoverable: true, hide_collections: false) } + let!(:morty) { Fabricate(:account, discoverable: true, hide_collections: false, memorial: true) } context 'with follows and blocks' do before do @@ -27,8 +28,8 @@ # alice follows eve and mallory [john, mallory].each { |account| alice.follow!(account) } - # eugen follows eve, john, jerk, larry and neil - [eve, mallory, jerk, larry, neil].each { |account| eugen.follow!(account) } + # eugen follows eve, john, jerk, larry, neil and morty + [eve, mallory, jerk, larry, neil, morty].each { |account| eugen.follow!(account) } end it 'returns eligible accounts', :aggregate_failures do @@ -51,6 +52,9 @@ # the suggestion for neil has already been rejected expect(results).to_not include([neil.id, :friends_of_friends]) + + # morty is not included because his account is in memoriam + expect(results).to_not include([morty.id, :friends_of_friends]) end end diff --git a/spec/models/account_suggestions/source_spec.rb b/spec/models/account_suggestions/source_spec.rb index 16660940825a2e..ae0747413e6ecf 100644 --- a/spec/models/account_suggestions/source_spec.rb +++ b/spec/models/account_suggestions/source_spec.rb @@ -21,6 +21,7 @@ let!(:moved_account) { Fabricate(:account, moved_to_account: Fabricate(:account), discoverable: true) } let!(:silenced_account) { Fabricate(:account, silenced: true, discoverable: true) } let!(:undiscoverable_account) { Fabricate(:account, discoverable: false) } + let!(:memorial_account) { Fabricate(:account, memorial: true, discoverable: true) } before do Fabricate :account_domain_block, account: account, domain: account_domain_blocked_account.domain @@ -44,6 +45,7 @@ .and not_include(moved_account) .and not_include(silenced_account) .and not_include(undiscoverable_account) + .and not_include(memorial_account) end end end From 53c183f899b5382f1eebd72e34a090c30f8eba6a Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 19 Aug 2024 17:59:06 +0200 Subject: [PATCH 08/26] Reload notifications when accepted notifications are merged (streaming only) (#31419) --- .../v1/notifications/requests_controller.rb | 10 +++- .../mastodon/actions/notification_groups.ts | 43 +++++++++++++++- app/javascript/mastodon/actions/streaming.js | 10 +++- .../features/notifications_v2/index.tsx | 14 +++-- .../mastodon/reducers/notification_groups.ts | 13 ++++- .../accept_notification_request_service.rb | 12 +++++ app/workers/unfilter_notifications_worker.rb | 29 ++++++++--- config/routes/api.rb | 1 + .../api/v1/notifications/requests_spec.rb | 30 +++++++++++ ...ccept_notification_request_service_spec.rb | 3 +- .../unfilter_notifications_worker_spec.rb | 51 +++++++++++++++++-- 11 files changed, 192 insertions(+), 24 deletions(-) diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 0710166d05b89c..b820a2ed2e98cf 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -1,8 +1,10 @@ # frozen_string_literal: true class Api::V1::Notifications::RequestsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :index - before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index + include Redisable + + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: [:index, :show, :merged?] + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: [:index, :show, :merged?] before_action :require_user! before_action :set_request, only: [:show, :accept, :dismiss] @@ -19,6 +21,10 @@ def index render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships end + def merged? + render json: { merged: redis.get("notification_unfilter_jobs:#{current_account.id}").to_i <= 0 } + end + def show render json: @request, serializer: REST::NotificationRequestSerializer end diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index fd6a48e9f37727..6b699706e2536a 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -138,8 +138,18 @@ export const processNewNotificationForGroups = createAppAsyncThunk( export const loadPending = createAction('notificationGroups/loadPending'); -export const updateScrollPosition = createAction<{ top: boolean }>( +export const updateScrollPosition = createAppAsyncThunk( 'notificationGroups/updateScrollPosition', + ({ top }: { top: boolean }, { dispatch, getState }) => { + if ( + top && + getState().notificationGroups.mergedNotifications === 'needs-reload' + ) { + void dispatch(fetchNotifications()); + } + + return { top }; + }, ); export const setNotificationsFilter = createAppAsyncThunk( @@ -165,5 +175,34 @@ export const markNotificationsAsRead = createAction( 'notificationGroups/markAsRead', ); -export const mountNotifications = createAction('notificationGroups/mount'); +export const mountNotifications = createAppAsyncThunk( + 'notificationGroups/mount', + (_, { dispatch, getState }) => { + const state = getState(); + + if ( + state.notificationGroups.mounted === 0 && + state.notificationGroups.mergedNotifications === 'needs-reload' + ) { + void dispatch(fetchNotifications()); + } + }, +); + export const unmountNotifications = createAction('notificationGroups/unmount'); + +export const refreshStaleNotificationGroups = createAppAsyncThunk<{ + deferredRefresh: boolean; +}>('notificationGroups/refreshStale', (_, { dispatch, getState }) => { + const state = getState(); + + if ( + state.notificationGroups.scrolledToTop || + !state.notificationGroups.mounted + ) { + void dispatch(fetchNotifications()); + return { deferredRefresh: false }; + } + + return { deferredRefresh: true }; +}); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index 630da3ef6e6132..e082aea43d9116 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -10,7 +10,7 @@ import { deleteAnnouncement, } from './announcements'; import { updateConversations } from './conversations'; -import { processNewNotificationForGroups } from './notification_groups'; +import { processNewNotificationForGroups, refreshStaleNotificationGroups } from './notification_groups'; import { updateNotifications, expandNotifications } from './notifications'; import { updateStatus } from './statuses'; import { @@ -108,6 +108,14 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti } break; } + case 'notifications_merged': + const state = getState(); + if (state.notifications.top || !state.notifications.mounted) + dispatch(expandNotifications({ forceLoad: true, maxId: undefined })); + if(state.settings.getIn(['notifications', 'groupingBeta'], false)) { + dispatch(refreshStaleNotificationGroups()); + } + break; case 'conversation': // @ts-expect-error dispatch(updateConversations(JSON.parse(data.payload))); diff --git a/app/javascript/mastodon/features/notifications_v2/index.tsx b/app/javascript/mastodon/features/notifications_v2/index.tsx index 63e602bdcc133d..29c49e05c814a2 100644 --- a/app/javascript/mastodon/features/notifications_v2/index.tsx +++ b/app/javascript/mastodon/features/notifications_v2/index.tsx @@ -81,7 +81,11 @@ export const Notifications: React.FC<{ const anyPendingNotification = useAppSelector(selectAnyPendingNotification); - const isUnread = unreadNotificationsCount > 0; + const needsReload = useAppSelector( + (state) => state.notificationGroups.mergedNotifications === 'needs-reload', + ); + + const isUnread = unreadNotificationsCount > 0 || needsReload; const canMarkAsRead = useAppSelector(selectSettingsNotificationsShowUnread) && @@ -118,11 +122,11 @@ export const Notifications: React.FC<{ // Keep track of mounted components for unread notification handling useEffect(() => { - dispatch(mountNotifications()); + void dispatch(mountNotifications()); return () => { dispatch(unmountNotifications()); - dispatch(updateScrollPosition({ top: false })); + void dispatch(updateScrollPosition({ top: false })); }; }, [dispatch]); @@ -147,11 +151,11 @@ export const Notifications: React.FC<{ }, [dispatch]); const handleScrollToTop = useDebouncedCallback(() => { - dispatch(updateScrollPosition({ top: true })); + void dispatch(updateScrollPosition({ top: true })); }, 100); const handleScroll = useDebouncedCallback(() => { - dispatch(updateScrollPosition({ top: false })); + void dispatch(updateScrollPosition({ top: false })); }, 100); useEffect(() => { diff --git a/app/javascript/mastodon/reducers/notification_groups.ts b/app/javascript/mastodon/reducers/notification_groups.ts index 0d3f34d2fbe159..0348f080ff2e76 100644 --- a/app/javascript/mastodon/reducers/notification_groups.ts +++ b/app/javascript/mastodon/reducers/notification_groups.ts @@ -19,6 +19,7 @@ import { markNotificationsAsRead, mountNotifications, unmountNotifications, + refreshStaleNotificationGroups, } from 'mastodon/actions/notification_groups'; import { disconnectTimeline, @@ -51,6 +52,7 @@ interface NotificationGroupsState { readMarkerId: string; mounted: number; isTabVisible: boolean; + mergedNotifications: 'ok' | 'pending' | 'needs-reload'; } const initialState: NotificationGroupsState = { @@ -58,6 +60,8 @@ const initialState: NotificationGroupsState = { pendingGroups: [], // holds pending groups in slow mode scrolledToTop: false, isLoading: false, + // this is used to track whether we need to refresh notifications after accepting requests + mergedNotifications: 'ok', // The following properties are used to track unread notifications lastReadId: '0', // used internally for unread notifications readMarkerId: '0', // user-facing and updated when focus changes @@ -301,6 +305,7 @@ export const notificationGroupsReducer = createReducer( json.type === 'gap' ? json : createNotificationGroupFromJSON(json), ); state.isLoading = false; + state.mergedNotifications = 'ok'; updateLastReadId(state); }) .addCase(fetchNotificationsGap.fulfilled, (state, action) => { @@ -455,7 +460,7 @@ export const notificationGroupsReducer = createReducer( state.groups = state.pendingGroups.concat(state.groups); state.pendingGroups = []; }) - .addCase(updateScrollPosition, (state, action) => { + .addCase(updateScrollPosition.fulfilled, (state, action) => { state.scrolledToTop = action.payload.top; updateLastReadId(state); trimNotifications(state); @@ -482,7 +487,7 @@ export const notificationGroupsReducer = createReducer( action.payload.markers.notifications.last_read_id; } }) - .addCase(mountNotifications, (state) => { + .addCase(mountNotifications.fulfilled, (state) => { state.mounted += 1; commitLastReadId(state); updateLastReadId(state); @@ -498,6 +503,10 @@ export const notificationGroupsReducer = createReducer( .addCase(unfocusApp, (state) => { state.isTabVisible = false; }) + .addCase(refreshStaleNotificationGroups.fulfilled, (state, action) => { + if (action.payload.deferredRefresh) + state.mergedNotifications = 'needs-reload'; + }) .addMatcher( isAnyOf(authorizeFollowRequestSuccess, rejectFollowRequestSuccess), (state, action) => { diff --git a/app/services/accept_notification_request_service.rb b/app/services/accept_notification_request_service.rb index ad27ae330074f6..60ec6bb3b6334a 100644 --- a/app/services/accept_notification_request_service.rb +++ b/app/services/accept_notification_request_service.rb @@ -1,9 +1,21 @@ # frozen_string_literal: true class AcceptNotificationRequestService < BaseService + include Redisable + def call(request) NotificationPermission.create!(account: request.account, from_account: request.from_account) + increment_worker_count!(request) UnfilterNotificationsWorker.perform_async(request.account_id, request.from_account_id) request.destroy! end + + private + + def increment_worker_count!(request) + with_redis do |redis| + redis.incr("notification_unfilter_jobs:#{request.account_id}") + redis.expire("notification_unfilter_jobs:#{request.account_id}", 30.minutes.to_i) + end + end end diff --git a/app/workers/unfilter_notifications_worker.rb b/app/workers/unfilter_notifications_worker.rb index 4351758907637f..53a35ce12ccabb 100644 --- a/app/workers/unfilter_notifications_worker.rb +++ b/app/workers/unfilter_notifications_worker.rb @@ -2,6 +2,7 @@ class UnfilterNotificationsWorker include Sidekiq::Worker + include Redisable # Earlier versions of the feature passed a `notification_request` ID # If `to_account_id` is passed, the first argument is an account ID @@ -9,19 +10,20 @@ class UnfilterNotificationsWorker def perform(notification_request_or_account_id, from_account_id = nil) if from_account_id.present? @notification_request = nil - @from_account = Account.find(from_account_id) - @recipient = Account.find(notification_request_or_account_id) + @from_account = Account.find_by(id: from_account_id) + @recipient = Account.find_by(id: notification_request_or_account_id) else - @notification_request = NotificationRequest.find(notification_request_or_account_id) - @from_account = @notification_request.from_account - @recipient = @notification_request.account + @notification_request = NotificationRequest.find_by(id: notification_request_or_account_id) + @from_account = @notification_request&.from_account + @recipient = @notification_request&.account end + return if @from_account.nil? || @recipient.nil? + push_to_conversations! unfilter_notifications! remove_request! - rescue ActiveRecord::RecordNotFound - true + decrement_worker_count! end private @@ -45,4 +47,17 @@ def filtered_notifications def notifications_with_private_mentions filtered_notifications.where(type: :mention).joins(mention: :status).merge(Status.where(visibility: :direct)).includes(mention: :status) end + + def decrement_worker_count! + value = redis.decr("notification_unfilter_jobs:#{@recipient.id}") + push_streaming_event! if value <= 0 && subscribed_to_streaming_api? + end + + def push_streaming_event! + redis.publish("timeline:#{@recipient.id}:notifications", Oj.dump(event: :notifications_merged, payload: '1')) + end + + def subscribed_to_streaming_api? + redis.exists?("subscribed:timeline:#{@recipient.id}") || redis.exists?("subscribed:timeline:#{@recipient.id}:notifications") + end end diff --git a/config/routes/api.rb b/config/routes/api.rb index 488bdb7453eb8e..c5addd33854992 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -158,6 +158,7 @@ collection do post :accept, to: 'requests#accept_bulk' post :dismiss, to: 'requests#dismiss_bulk' + get :merged, to: 'requests#merged?' end member do diff --git a/spec/requests/api/v1/notifications/requests_spec.rb b/spec/requests/api/v1/notifications/requests_spec.rb index e1fe17426a28a5..c385fb34995f38 100644 --- a/spec/requests/api/v1/notifications/requests_spec.rb +++ b/spec/requests/api/v1/notifications/requests_spec.rb @@ -120,4 +120,34 @@ expect(response).to have_http_status(200) end end + + describe 'GET /api/v1/notifications/requests/merged' do + subject do + get '/api/v1/notifications/requests/merged', headers: headers + end + + it_behaves_like 'forbidden for wrong scope', 'write write:notifications' + + context 'when the user has no accepted request pending merge' do + it 'returns http success and returns merged: true' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json).to eq({ merged: true }) + end + end + + context 'when the user has an accepted request pending merge' do + before do + redis.set("notification_unfilter_jobs:#{user.account_id}", 1) + end + + it 'returns http success and returns merged: false' do + subject + + expect(response).to have_http_status(200) + expect(body_as_json).to eq({ merged: false }) + end + end + end end diff --git a/spec/services/accept_notification_request_service_spec.rb b/spec/services/accept_notification_request_service_spec.rb index bf67a52225f1d8..3c12c285a44c33 100644 --- a/spec/services/accept_notification_request_service_spec.rb +++ b/spec/services/accept_notification_request_service_spec.rb @@ -8,10 +8,11 @@ let(:notification_request) { Fabricate(:notification_request) } describe '#call' do - it 'destroys the notification request, creates a permission, and queues a worker' do + it 'destroys the notification request, creates a permission, increases the jobs count and queues a worker' do expect { subject.call(notification_request) } .to change { NotificationRequest.exists?(notification_request.id) }.to(false) .and change { NotificationPermission.exists?(account_id: notification_request.account_id, from_account_id: notification_request.from_account_id) }.to(true) + .and change { redis.get("notification_unfilter_jobs:#{notification_request.account_id}").to_i }.by(1) expect(UnfilterNotificationsWorker).to have_enqueued_sidekiq_job(notification_request.account_id, notification_request.from_account_id) end diff --git a/spec/workers/unfilter_notifications_worker_spec.rb b/spec/workers/unfilter_notifications_worker_spec.rb index 3f43b298a50049..629eb644e4f2bb 100644 --- a/spec/workers/unfilter_notifications_worker_spec.rb +++ b/spec/workers/unfilter_notifications_worker_spec.rb @@ -13,13 +13,56 @@ Fabricate(:notification, filtered: true, from_account: sender, account: recipient, type: :mention, activity: mention) follow_request = sender.request_follow!(recipient) Fabricate(:notification, filtered: true, from_account: sender, account: recipient, type: :follow_request, activity: follow_request) + allow(redis).to receive(:publish) + allow(redis).to receive(:exists?).and_return(false) end shared_examples 'shared behavior' do - it 'unfilters notifications and adds private messages to conversations' do - expect { subject } - .to change { recipient.notifications.where(from_account_id: sender.id).pluck(:filtered) }.from([true, true]).to([false, false]) - .and change { recipient.conversations.exists?(last_status_id: sender.statuses.first.id) }.to(true) + context 'when this is the last pending merge job and the user is subscribed to streaming' do + before do + redis.set("notification_unfilter_jobs:#{recipient.id}", 1) + allow(redis).to receive(:exists?).with("subscribed:timeline:#{recipient.id}").and_return(true) + end + + it 'unfilters notifications, adds private messages to conversations, and pushes to redis' do + expect { subject } + .to change { recipient.notifications.where(from_account_id: sender.id).pluck(:filtered) }.from([true, true]).to([false, false]) + .and change { recipient.conversations.exists?(last_status_id: sender.statuses.first.id) }.to(true) + .and change { redis.get("notification_unfilter_jobs:#{recipient.id}").to_i }.by(-1) + + expect(redis).to have_received(:publish).with("timeline:#{recipient.id}:notifications", '{"event":"notifications_merged","payload":"1"}') + end + end + + context 'when this is not last pending merge job and the user is subscribed to streaming' do + before do + redis.set("notification_unfilter_jobs:#{recipient.id}", 2) + allow(redis).to receive(:exists?).with("subscribed:timeline:#{recipient.id}").and_return(true) + end + + it 'unfilters notifications, adds private messages to conversations, and does not push to redis' do + expect { subject } + .to change { recipient.notifications.where(from_account_id: sender.id).pluck(:filtered) }.from([true, true]).to([false, false]) + .and change { recipient.conversations.exists?(last_status_id: sender.statuses.first.id) }.to(true) + .and change { redis.get("notification_unfilter_jobs:#{recipient.id}").to_i }.by(-1) + + expect(redis).to_not have_received(:publish).with("timeline:#{recipient.id}:notifications", '{"event":"notifications_merged","payload":"1"}') + end + end + + context 'when this is the last pending merge job and the user is not subscribed to streaming' do + before do + redis.set("notification_unfilter_jobs:#{recipient.id}", 1) + end + + it 'unfilters notifications, adds private messages to conversations, and does not push to redis' do + expect { subject } + .to change { recipient.notifications.where(from_account_id: sender.id).pluck(:filtered) }.from([true, true]).to([false, false]) + .and change { recipient.conversations.exists?(last_status_id: sender.statuses.first.id) }.to(true) + .and change { redis.get("notification_unfilter_jobs:#{recipient.id}").to_i }.by(-1) + + expect(redis).to_not have_received(:publish).with("timeline:#{recipient.id}:notifications", '{"event":"notifications_merged","payload":"1"}') + end end end From a7a2ff6c1d61223220590ccb3af4bfa0480587c1 Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Mon, 19 Aug 2024 14:44:28 -0500 Subject: [PATCH 09/26] Use Dockerfile ADD to obtain ffmpeg and libvips source (#31498) --- Dockerfile | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 65440bb28117ac..cd555f7027d018 100644 --- a/Dockerfile +++ b/Dockerfile @@ -196,11 +196,14 @@ ARG VIPS_VERSION=8.15.3 ARG VIPS_URL=https://github.com/libvips/libvips/releases/download WORKDIR /usr/local/libvips/src +# Download and extract libvips source code +ADD ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz /usr/local/libvips/src/ +RUN tar xf vips-${VIPS_VERSION}.tar.xz; +WORKDIR /usr/local/libvips/src/vips-${VIPS_VERSION} + +# Configure and compile libvips RUN \ - curl -sSL -o vips-${VIPS_VERSION}.tar.xz ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz; \ - tar xf vips-${VIPS_VERSION}.tar.xz; \ - cd vips-${VIPS_VERSION}; \ meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \ cd build; \ ninja; \ @@ -216,11 +219,14 @@ ARG FFMPEG_VERSION=7.0.2 ARG FFMPEG_URL=https://ffmpeg.org/releases WORKDIR /usr/local/ffmpeg/src +# Download and extract ffmpeg source code +ADD ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz /usr/local/ffmpeg/src/ +RUN tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz; + +WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION} +# Configure and compile ffmpeg RUN \ - curl -sSL -o ffmpeg-${FFMPEG_VERSION}.tar.xz ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz; \ - tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz; \ - cd ffmpeg-${FFMPEG_VERSION}; \ ./configure \ --prefix=/usr/local/ffmpeg \ --toolchain=hardened \ From 98bf2fc27c6204527d8da5bc3847bd8406f1bfe8 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 20 Aug 2024 00:11:58 +0200 Subject: [PATCH 10/26] Improve the list selection UI for notification requests (#31457) --- .../features/notifications/requests.jsx | 121 +++++++----------- app/javascript/mastodon/locales/en.json | 22 ++-- .../styles/mastodon-light/variables.scss | 1 + .../styles/mastodon/components.scss | 26 ++-- app/javascript/styles/mastodon/variables.scss | 1 + 5 files changed, 70 insertions(+), 101 deletions(-) diff --git a/app/javascript/mastodon/features/notifications/requests.jsx b/app/javascript/mastodon/features/notifications/requests.jsx index f323bda4fbc1d7..f35c042ba6c7e4 100644 --- a/app/javascript/mastodon/features/notifications/requests.jsx +++ b/app/javascript/mastodon/features/notifications/requests.jsx @@ -7,6 +7,7 @@ import { Helmet } from 'react-helmet'; import { useSelector, useDispatch } from 'react-redux'; +import ArrowDropDownIcon from '@/material-icons/400-24px/arrow_drop_down.svg?react'; import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { openModal } from 'mastodon/actions/modal'; @@ -15,6 +16,7 @@ import { changeSetting } from 'mastodon/actions/settings'; import { CheckBox } from 'mastodon/components/check_box'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; +import { Icon } from 'mastodon/components/icon'; import ScrollableList from 'mastodon/components/scrollable_list'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; @@ -26,16 +28,14 @@ const messages = defineMessages({ title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' }, more: { id: 'status.more', defaultMessage: 'More' }, - acceptAll: { id: 'notification_requests.accept_all', defaultMessage: 'Accept all' }, - dismissAll: { id: 'notification_requests.dismiss_all', defaultMessage: 'Dismiss all' }, - acceptMultiple: { id: 'notification_requests.accept_multiple', defaultMessage: '{count, plural, one {Accept # request} other {Accept # requests}}' }, - dismissMultiple: { id: 'notification_requests.dismiss_multiple', defaultMessage: '{count, plural, one {Dismiss # request} other {Dismiss # requests}}' }, - confirmAcceptAllTitle: { id: 'notification_requests.confirm_accept_all.title', defaultMessage: 'Accept notification requests?' }, - confirmAcceptAllMessage: { id: 'notification_requests.confirm_accept_all.message', defaultMessage: 'You are about to accept {count, plural, one {one notification request} other {# notification requests}}. Are you sure you want to proceed?' }, - confirmAcceptAllButton: { id: 'notification_requests.confirm_accept_all.button', defaultMessage: 'Accept all' }, - confirmDismissAllTitle: { id: 'notification_requests.confirm_dismiss_all.title', defaultMessage: 'Dismiss notification requests?' }, - confirmDismissAllMessage: { id: 'notification_requests.confirm_dismiss_all.message', defaultMessage: "You are about to dismiss {count, plural, one {one notification request} other {# notification requests}}. You won't be able to easily access {count, plural, one {it} other {them}} again. Are you sure you want to proceed?" }, - confirmDismissAllButton: { id: 'notification_requests.confirm_dismiss_all.button', defaultMessage: 'Dismiss all' }, + acceptMultiple: { id: 'notification_requests.accept_multiple', defaultMessage: '{count, plural, one {Accept # request…} other {Accept # requests…}}' }, + dismissMultiple: { id: 'notification_requests.dismiss_multiple', defaultMessage: '{count, plural, one {Dismiss # request…} other {Dismiss # requests…}}' }, + confirmAcceptMultipleTitle: { id: 'notification_requests.confirm_accept_multiple.title', defaultMessage: 'Accept notification requests?' }, + confirmAcceptMultipleMessage: { id: 'notification_requests.confirm_accept_multiple.message', defaultMessage: 'You are about to accept {count, plural, one {one notification request} other {# notification requests}}. Are you sure you want to proceed?' }, + confirmAcceptMultipleButton: { id: 'notification_requests.confirm_accept_multiple.button', defaultMessage: '{count, plural, one {Accept request} other {Accept requests}}' }, + confirmDismissMultipleTitle: { id: 'notification_requests.confirm_dismiss_multiple.title', defaultMessage: 'Dismiss notification requests?' }, + confirmDismissMultipleMessage: { id: 'notification_requests.confirm_dismiss_multiple.message', defaultMessage: "You are about to dismiss {count, plural, one {one notification request} other {# notification requests}}. You won't be able to easily access {count, plural, one {it} other {them}} again. Are you sure you want to proceed?" }, + confirmDismissMultipleButton: { id: 'notification_requests.confirm_dismiss_multiple.button', defaultMessage: '{count, plural, one {Dismiss request} other {Dismiss requests}}' }, }); const ColumnSettings = () => { @@ -74,45 +74,15 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM const intl = useIntl(); const dispatch = useDispatch(); - const notificationRequests = useSelector(state => state.getIn(['notificationRequests', 'items'])); - const selectedCount = selectedItems.length; - const handleAcceptAll = useCallback(() => { - const items = notificationRequests.map(request => request.get('id')).toArray(); - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - title: intl.formatMessage(messages.confirmAcceptAllTitle), - message: intl.formatMessage(messages.confirmAcceptAllMessage, { count: items.length }), - confirm: intl.formatMessage(messages.confirmAcceptAllButton), - onConfirm: () => - dispatch(acceptNotificationRequests(items)), - }, - })); - }, [dispatch, intl, notificationRequests]); - - const handleDismissAll = useCallback(() => { - const items = notificationRequests.map(request => request.get('id')).toArray(); - dispatch(openModal({ - modalType: 'CONFIRM', - modalProps: { - title: intl.formatMessage(messages.confirmDismissAllTitle), - message: intl.formatMessage(messages.confirmDismissAllMessage, { count: items.length }), - confirm: intl.formatMessage(messages.confirmDismissAllButton), - onConfirm: () => - dispatch(dismissNotificationRequests(items)), - }, - })); - }, [dispatch, intl, notificationRequests]); - const handleAcceptMultiple = useCallback(() => { dispatch(openModal({ modalType: 'CONFIRM', modalProps: { - title: intl.formatMessage(messages.confirmAcceptAllTitle), - message: intl.formatMessage(messages.confirmAcceptAllMessage, { count: selectedItems.length }), - confirm: intl.formatMessage(messages.confirmAcceptAllButton), + title: intl.formatMessage(messages.confirmAcceptMultipleTitle), + message: intl.formatMessage(messages.confirmAcceptMultipleMessage, { count: selectedItems.length }), + confirm: intl.formatMessage(messages.confirmAcceptMultipleButton, { count: selectedItems.length}), onConfirm: () => dispatch(acceptNotificationRequests(selectedItems)), }, @@ -123,9 +93,9 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM dispatch(openModal({ modalType: 'CONFIRM', modalProps: { - title: intl.formatMessage(messages.confirmDismissAllTitle), - message: intl.formatMessage(messages.confirmDismissAllMessage, { count: selectedItems.length }), - confirm: intl.formatMessage(messages.confirmDismissAllButton), + title: intl.formatMessage(messages.confirmDismissMultipleTitle), + message: intl.formatMessage(messages.confirmDismissMultipleMessage, { count: selectedItems.length }), + confirm: intl.formatMessage(messages.confirmDismissMultipleButton, { count: selectedItems.length}), onConfirm: () => dispatch(dismissNotificationRequests(selectedItems)), }, @@ -136,46 +106,45 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM setSelectionMode((mode) => !mode); }, [setSelectionMode]); - const menu = selectedCount === 0 ? - [ - { text: intl.formatMessage(messages.acceptAll), action: handleAcceptAll }, - { text: intl.formatMessage(messages.dismissAll), action: handleDismissAll }, - ] : [ - { text: intl.formatMessage(messages.acceptMultiple, { count: selectedCount }), action: handleAcceptMultiple }, - { text: intl.formatMessage(messages.dismissMultiple, { count: selectedCount }), action: handleDismissMultiple }, - ]; + const menu = [ + { text: intl.formatMessage(messages.acceptMultiple, { count: selectedCount }), action: handleAcceptMultiple }, + { text: intl.formatMessage(messages.dismissMultiple, { count: selectedCount }), action: handleDismissMultiple }, + ]; + + const handleSelectAll = useCallback(() => { + setSelectionMode(true); + toggleSelectAll(); + }, [setSelectionMode, toggleSelectAll]); return (
- {selectionMode && ( -
- 0 && !selectAllChecked} onChange={toggleSelectAll} /> -
- )} -
+
+ 0 && !selectAllChecked} onChange={handleSelectAll} /> +
+ + + +
- {selectedCount > 0 && -
- {selectedCount} selected -
- } -
- -
); }; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index aeeaf8209c7d0c..6d2b93be5797e8 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -518,19 +518,17 @@ "notification.status": "{name} just posted", "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", - "notification_requests.accept_all": "Accept all", - "notification_requests.accept_multiple": "{count, plural, one {Accept # request} other {Accept # requests}}", - "notification_requests.confirm_accept_all.button": "Accept all", - "notification_requests.confirm_accept_all.message": "You are about to accept {count, plural, one {one notification request} other {# notification requests}}. Are you sure you want to proceed?", - "notification_requests.confirm_accept_all.title": "Accept notification requests?", - "notification_requests.confirm_dismiss_all.button": "Dismiss all", - "notification_requests.confirm_dismiss_all.message": "You are about to dismiss {count, plural, one {one notification request} other {# notification requests}}. You won't be able to easily access {count, plural, one {it} other {them}} again. Are you sure you want to proceed?", - "notification_requests.confirm_dismiss_all.title": "Dismiss notification requests?", + "notification_requests.accept_multiple": "{count, plural, one {Accept # request…} other {Accept # requests…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Accept request} other {Accept requests}}", + "notification_requests.confirm_accept_multiple.message": "You are about to accept {count, plural, one {one notification request} other {# notification requests}}. Are you sure you want to proceed?", + "notification_requests.confirm_accept_multiple.title": "Accept notification requests?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Dismiss request} other {Dismiss requests}}", + "notification_requests.confirm_dismiss_multiple.message": "You are about to dismiss {count, plural, one {one notification request} other {# notification requests}}. You won't be able to easily access {count, plural, one {it} other {them}} again. Are you sure you want to proceed?", + "notification_requests.confirm_dismiss_multiple.title": "Dismiss notification requests?", "notification_requests.dismiss": "Dismiss", - "notification_requests.dismiss_all": "Dismiss all", - "notification_requests.dismiss_multiple": "{count, plural, one {Dismiss # request} other {Dismiss # requests}}", - "notification_requests.enter_selection_mode": "Select", - "notification_requests.exit_selection_mode": "Cancel", + "notification_requests.dismiss_multiple": "{count, plural, one {Dismiss # request…} other {Dismiss # requests…}}", + "notification_requests.edit_selection": "Edit", + "notification_requests.exit_selection": "Done", "notification_requests.explainer_for_limited_account": "Notifications from this account have been filtered because the account has been limited by a moderator.", "notification_requests.explainer_for_limited_remote_account": "Notifications from this account have been filtered because the account or its server has been limited by a moderator.", "notification_requests.maximize": "Maximize", diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index 9d4fd60945a7d5..39809b437f4cd7 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -65,4 +65,5 @@ body { --background-color: #fff; --background-color-tint: rgba(255, 255, 255, 80%); --background-filter: blur(10px); + --on-surface-color: #{transparentize($ui-base-color, 0.65)}; } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 895762b8036a35..c1ee4ea10de232 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4217,7 +4217,7 @@ a.status-card { text-decoration: none; &:hover { - background: lighten($ui-base-color, 2%); + background: var(--on-surface-color); } } @@ -4346,19 +4346,18 @@ a.status-card { display: flex; } - &__selection-mode { - flex-grow: 1; - - .text-btn:hover { - text-decoration: underline; - } + &__select-menu:disabled { + visibility: hidden; } - &__actions { - .icon-button { - border-radius: 4px; - border: 1px solid var(--background-border-color); - padding: 5px; + &__mode-button { + margin-left: auto; + color: $highlight-text-color; + font-weight: bold; + font-size: 14px; + + &:hover { + color: lighten($highlight-text-color, 6%); } } } @@ -4566,6 +4565,7 @@ a.status-card { padding: 0; font-family: inherit; font-size: inherit; + font-weight: inherit; color: inherit; border: 0; background: transparent; @@ -10366,7 +10366,7 @@ noscript { cursor: pointer; &:hover { - background: lighten($ui-base-color, 1%); + background: var(--on-surface-color); } .notification-request__checkbox { diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 92b4770fe3804d..c8271e0dcd95d4 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -109,5 +109,6 @@ $font-monospace: 'mastodon-font-monospace' !default; --surface-background-color: #{darken($ui-base-color, 4%)}; --surface-variant-background-color: #{$ui-base-color}; --surface-variant-active-background-color: #{lighten($ui-base-color, 4%)}; + --on-surface-color: #{transparentize($ui-base-color, 0.5)}; --avatar-border-radius: 8px; } From 2f01f5f4ea886c4a1bec2148d0ca82da5ae67f0c Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Tue, 20 Aug 2024 02:48:51 -0500 Subject: [PATCH 11/26] Harmonize persistent scrollbar styles (#31445) --- .../styles/mastodon-light/diff.scss | 15 +++++++++++---- .../styles/mastodon/components.scss | 4 ---- app/javascript/styles/mastodon/reset.scss | 19 +++++++++++++------ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 55eb88dae1e851..8d801e4cd5b854 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -1,10 +1,6 @@ // Notes! // Sass color functions, "darken" and "lighten" are automatically replaced. -html { - scrollbar-color: $ui-base-color rgba($ui-base-color, 0.25); -} - .simple_form .button.button-tertiary { color: $highlight-text-color; } @@ -561,3 +557,14 @@ a.sparkline { color: $dark-text-color; } } + +@supports not selector(::-webkit-scrollbar) { + html { + scrollbar-color: rgba($action-button-color, 0.25) + var(--background-border-color); + } +} + +::-webkit-scrollbar-thumb { + opacity: 0.25; +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index c1ee4ea10de232..97abf77d10e9f3 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -7560,10 +7560,6 @@ a.status-card { } } -::-webkit-scrollbar-thumb { - border-radius: 0; -} - noscript { text-align: center; diff --git a/app/javascript/styles/mastodon/reset.scss b/app/javascript/styles/mastodon/reset.scss index f8a4a08ced6d3a..5a4152826d9e4b 100644 --- a/app/javascript/styles/mastodon/reset.scss +++ b/app/javascript/styles/mastodon/reset.scss @@ -53,22 +53,29 @@ table { border-spacing: 0; } -html { - scrollbar-color: var(--background-border-color); +@supports not selector(::-webkit-scrollbar) { + html { + scrollbar-color: $action-button-color var(--background-border-color); + scrollbar-width: thin; + } } ::-webkit-scrollbar { - width: 4px; - height: 4px; + width: 8px; + height: 8px; } ::-webkit-scrollbar-thumb { - background-color: $ui-highlight-color; - opacity: .25; + background-color: $action-button-color; + border: 2px var(--background-border-color); + border-radius: 12px; + width: 6px; + box-shadow: inset 0 0 0 2px var(--background-border-color); } ::-webkit-scrollbar-track { background-color: var(--background-border-color); + border-radius: 0px; } ::-webkit-scrollbar-corner { From c75f7262ed32b7eb12aea154b0a41f876b7b58e9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 07:59:21 +0000 Subject: [PATCH 12/26] New Crowdin Translations (automated) (#31504) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ar.json | 7 --- app/javascript/mastodon/locales/be.json | 13 +++++ app/javascript/mastodon/locales/bg.json | 2 - app/javascript/mastodon/locales/ca.json | 20 ++++---- app/javascript/mastodon/locales/cy.json | 12 ----- app/javascript/mastodon/locales/da.json | 22 ++++----- app/javascript/mastodon/locales/de.json | 12 ----- app/javascript/mastodon/locales/el.json | 12 ----- app/javascript/mastodon/locales/en-GB.json | 12 ----- app/javascript/mastodon/locales/es-AR.json | 12 ----- app/javascript/mastodon/locales/es-MX.json | 12 ----- app/javascript/mastodon/locales/es.json | 12 ----- app/javascript/mastodon/locales/eu.json | 8 ---- app/javascript/mastodon/locales/fi.json | 24 +++++----- app/javascript/mastodon/locales/fo.json | 12 ----- app/javascript/mastodon/locales/fr-CA.json | 3 -- app/javascript/mastodon/locales/fr.json | 3 -- app/javascript/mastodon/locales/ga.json | 12 ----- app/javascript/mastodon/locales/gd.json | 12 ----- app/javascript/mastodon/locales/gl.json | 12 ----- app/javascript/mastodon/locales/he.json | 12 ----- app/javascript/mastodon/locales/hu.json | 12 ----- app/javascript/mastodon/locales/ig.json | 1 - app/javascript/mastodon/locales/is.json | 12 ----- app/javascript/mastodon/locales/it.json | 12 ----- app/javascript/mastodon/locales/kab.json | 1 - app/javascript/mastodon/locales/ko.json | 12 ----- app/javascript/mastodon/locales/lad.json | 4 -- app/javascript/mastodon/locales/lt.json | 12 ----- app/javascript/mastodon/locales/nl.json | 12 ----- app/javascript/mastodon/locales/nn.json | 12 ----- app/javascript/mastodon/locales/pl.json | 22 ++++----- app/javascript/mastodon/locales/pt-BR.json | 3 -- app/javascript/mastodon/locales/sk.json | 6 +++ app/javascript/mastodon/locales/sl.json | 6 --- app/javascript/mastodon/locales/sq.json | 12 ----- app/javascript/mastodon/locales/sv.json | 9 +--- app/javascript/mastodon/locales/th.json | 10 ---- app/javascript/mastodon/locales/tr.json | 12 ----- app/javascript/mastodon/locales/uk.json | 12 ----- app/javascript/mastodon/locales/vi.json | 10 ++++ app/javascript/mastodon/locales/zh-CN.json | 12 ----- app/javascript/mastodon/locales/zh-TW.json | 22 ++++----- config/locales/be.yml | 55 ++++++++++++++++++++++ 44 files changed, 137 insertions(+), 390 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 02692743970290..a022f3a0e52da8 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -500,14 +500,7 @@ "notification.status": "{name} نشر للتو", "notification.update": "عدّلَ {name} منشورًا", "notification_requests.accept": "موافقة", - "notification_requests.accept_all": "قبول الكل", - "notification_requests.confirm_accept_all.button": "قبول الكل", - "notification_requests.confirm_accept_all.title": "أتريد قبول طلبات الإشعار؟", - "notification_requests.confirm_dismiss_all.button": "تجاهل الكل", "notification_requests.dismiss": "تخطي", - "notification_requests.dismiss_all": "تجاهل الكل", - "notification_requests.enter_selection_mode": "اختر", - "notification_requests.exit_selection_mode": "إلغاء", "notification_requests.explainer_for_limited_account": "تم تصفية الإشعارات من هذا الحساب لأن الحساب تم تقييده من قبل مشرف.", "notification_requests.notifications_from": "إشعارات من {name}", "notification_requests.title": "الإشعارات المصفاة", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 1ba69f27f3ae40..546a1457a99b90 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -11,6 +11,7 @@ "about.not_available": "Дадзеная інфармацыя не дасяжная на гэтым серверы.", "about.powered_by": "Дэцэнтралізаваная сацыяльная сетка, створаная {mastodon}", "about.rules": "Правілы сервера", + "account.account_note_header": "Асабістая нататка", "account.add_or_remove_from_list": "Дадаць або выдаліць са спісаў", "account.badges.bot": "Бот", "account.badges.group": "Група", @@ -481,6 +482,11 @@ "notification.favourite": "Ваш допіс упадабаны {name}", "notification.follow": "{name} падпісаўся на вас", "notification.follow_request": "{name} адправіў запыт на падпіску", + "notification.label.mention": "Згадванне", + "notification.label.private_mention": "Асабістае згадванне", + "notification.label.private_reply": "Асабісты адказ", + "notification.label.reply": "Адказ", + "notification.mention": "Згадванне", "notification.moderation-warning.learn_more": "Даведацца больш", "notification.moderation_warning": "Вы атрымалі папярэджанне аб мадэрацыі", "notification.moderation_warning.action_delete_statuses": "Некаторыя вашыя допісы былі выдаленыя.", @@ -506,6 +512,7 @@ "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.notifications_from": "Апавяшчэнні ад {name}", "notification_requests.title": "Адфільтраваныя апавяшчэнні", + "notification_requests.view": "Прагляд апавяшчэнняў", "notifications.clear": "Ачысціць апавяшчэнні", "notifications.clear_confirmation": "Вы ўпэўнены, што жадаеце назаўсёды сцерці ўсё паведамленні?", "notifications.clear_title": "Ачысціць апавяшчэнні?", @@ -542,6 +549,10 @@ "notifications.permission_denied": "Апавяшчэнні на працоўным стале недаступныя з-за папярэдне адхіленага запыта праў браўзера", "notifications.permission_denied_alert": "Апавяшчэнні на працоўным стале не могуць быць уключаныя, з-за таго што запыт браўзера быў адхілены", "notifications.permission_required": "Апавяшчэнні на працоўным стале недаступныя, з-за таго што неабходны дазвол не быў дадзены.", + "notifications.policy.accept": "Прыняць", + "notifications.policy.accept_hint": "Паказваць у апавяшчэннях", + "notifications.policy.drop": "Iгнараваць", + "notifications.policy.filter": "Фільтраваць", "notifications.policy.filter_new_accounts.hint": "Створаныя на працягу {days, plural, one {апошняга # дня} few {апошніх # дзён} many {апошніх # дзён} other {апошняй # дня}}", "notifications.policy.filter_new_accounts_title": "Новыя ўліковыя запісы", "notifications.policy.filter_not_followers_hint": "Уключаючы людзей, якія падпісаны на вас менш, чым {days, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}}", @@ -550,6 +561,7 @@ "notifications.policy.filter_not_following_title": "Людзі, на якіх вы не падпісаны", "notifications.policy.filter_private_mentions_hint": "Фільтруецца за выключэннем адказу на вашае згадванне ці калі вы падпісаны на адпраўніка", "notifications.policy.filter_private_mentions_title": "Непажаданыя асаблівыя згадванні", + "notifications.policy.title": "Наладзіць апавяшчэнні ад…", "notifications_permission_banner.enable": "Уключыць апавяшчэнні на працоўным стале", "notifications_permission_banner.how_to_control": "Каб атрымліваць апавяшчэнні, калі Mastodon не адкрыты, уключыце апавяшчэнні працоўнага стала. Вы зможаце дакладна кантраляваць, якія падзеі будуць ствараць апавяшчэнні з дапамогай {icon} кнопкі, як толькі яны будуць уключаны.", "notifications_permission_banner.title": "Не прапусціце нічога", @@ -790,6 +802,7 @@ "timeline_hint.remote_resource_not_displayed": "{resource} з іншых сервераў не адлюстроўваецца.", "timeline_hint.resources.followers": "Падпісчыкі", "timeline_hint.resources.follows": "Падпіскі", + "timeline_hint.resources.replies": "Некаторыя адказы", "timeline_hint.resources.statuses": "Старыя допісы", "trends.counter_by_accounts": "{count, plural, one {{counter} чалавек} few {{counter} чалавекі} many {{counter} людзей} other {{counter} чалавек}} за {days, plural, one {{days} апошні дзень} few {{days} апошнія дні} many {{days} апошніх дзён} other {{days} апошніх дзён}}", "trends.trending_now": "Актуальнае", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 6687c64a6d1482..69166eafb88d13 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -505,8 +505,6 @@ "notification.update": "{name} промени публикация", "notification_requests.accept": "Приемам", "notification_requests.dismiss": "Отхвърлям", - "notification_requests.enter_selection_mode": "Изберете", - "notification_requests.exit_selection_mode": "Отказ", "notification_requests.explainer_for_limited_account": "Известията от този акаунт са прецедени, защото акаунтът е ограничен от модератор.", "notification_requests.explainer_for_limited_remote_account": "Известията от този акаунт са прецедени, защото акаунтът или сървърът му е ограничен от модератор.", "notification_requests.maximize": "Максимизиране", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index a41e7ba4dd6972..777e8863271298 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -517,17 +517,17 @@ "notification.status": "{name} acaba de publicar", "notification.update": "{name} ha editat un tut", "notification_requests.accept": "Accepta", - "notification_requests.accept_all": "Accepta-ho tot", - "notification_requests.accept_multiple": "{count, plural, one {Accepta # petició} other {Accepta # peticions}}", - "notification_requests.confirm_accept_all.button": "Accepta-ho tot", - "notification_requests.confirm_accept_all.message": "Esteu a punt d'acceptar {count, plural, one {una petició de notificació} other {# peticions de notificació}}. N'esteu segurs de continuar?", - "notification_requests.confirm_accept_all.title": "Accepteu peticions de notificació?", - "notification_requests.confirm_dismiss_all.button": "Descarta-les totes", - "notification_requests.confirm_dismiss_all.title": "Descarta la sol·licitud de notificació?", + "notification_requests.accept_multiple": "{count, plural, one {Accepta # petició…} other {Accepta # peticions…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Accepta petició} other {Accepta peticions}}", + "notification_requests.confirm_accept_multiple.message": "Esteu a punt d'acceptar {count, plural, one {una petició de notificació} other {# peticions de notificació}}. N'esteu segurs de continuar?", + "notification_requests.confirm_accept_multiple.title": "Acceptar peticions de notificació?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Descarta petició} other {Descarta peticions}}", + "notification_requests.confirm_dismiss_multiple.message": "Esteu a punt de descartar {count, plural, one {una petició de notificació} other {# peticions de notificació}}. No hi {count, plural, one {} other {}} podreu tornar a accedir fàcilment. N'esteu segurs de continuar?", + "notification_requests.confirm_dismiss_multiple.title": "Descartar les peticions de notificació?", "notification_requests.dismiss": "Ignora", - "notification_requests.dismiss_all": "Descarta-ho tot", - "notification_requests.enter_selection_mode": "Selecciona", - "notification_requests.exit_selection_mode": "Cancel·la", + "notification_requests.dismiss_multiple": "{count, plural, one {Descarta # petició…} other {Descarta # peticions…}}", + "notification_requests.edit_selection": "Edita", + "notification_requests.exit_selection": "Fet", "notification_requests.explainer_for_limited_account": "S'han filtrat les notificacions d'aquest compte perquè un moderador l'ha limitat.", "notification_requests.explainer_for_limited_remote_account": "S'han filtrat les notificacions d'aquest compte perquè un moderador ha limitat el compte o el seu servidor.", "notification_requests.maximize": "Maximitza", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 8b86b49e06f5ee..4fb02ba7f12787 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -518,19 +518,7 @@ "notification.status": "{name} newydd ei bostio", "notification.update": "Golygodd {name} bostiad", "notification_requests.accept": "Derbyn", - "notification_requests.accept_all": "Derbyn y cyfan", - "notification_requests.accept_multiple": "{count, plural, one {Derbyn # cais} other {Derbyn # cais}}", - "notification_requests.confirm_accept_all.button": "Derbyn y cyfan", - "notification_requests.confirm_accept_all.message": "Rydych ar fin derbyn {count, plural, one {un cais hysbysu} other {# cais hysbysiad}}. A ydych yn siŵr eich bod am fwrw ymlaen?", - "notification_requests.confirm_accept_all.title": "Derbyn ceisiadau hysbysu?", - "notification_requests.confirm_dismiss_all.button": "Diystyru pob un", - "notification_requests.confirm_dismiss_all.message": "Rydych ar fin diystyru {count, plural, one {un cais hysbysu} other {# cais hysbysiad}}. Ni fyddwch yn gallu cyrchu {count, plural, one {it} other {them}} yn hawdd eto. A ydych yn siŵr eich bod am fwrw ymlaen?", - "notification_requests.confirm_dismiss_all.title": "Diystyru ceisiadau hysbysu?", "notification_requests.dismiss": "Cau", - "notification_requests.dismiss_all": "Diystyru pob un", - "notification_requests.dismiss_multiple": "{count, plural, one {Diystyru # cais} other {Diystyru # cais}}", - "notification_requests.enter_selection_mode": "Dewis", - "notification_requests.exit_selection_mode": "Canslo", "notification_requests.explainer_for_limited_account": "Mae hysbysiadau o'r cyfrif hwn wedi'u hidlo oherwydd bod y cyfrif wedi'i gyfyngu gan gymedrolwr.", "notification_requests.explainer_for_limited_remote_account": "Mae hysbysiadau o'r cyfrif hwn wedi'u hidlo oherwydd bod y cyfrif neu ei weinydd wedi'i gyfyngu gan gymedrolwr.", "notification_requests.maximize": "Mwyhau", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index a9e549470c8cf9..9ae27e134ea510 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -518,19 +518,17 @@ "notification.status": "{name} har netop postet", "notification.update": "{name} redigerede et indlæg", "notification_requests.accept": "Acceptér", - "notification_requests.accept_all": "Acceptér alle", - "notification_requests.accept_multiple": "{count, plural, one {Acceptér # anmodning} other {Acceptér # anmodninger}}", - "notification_requests.confirm_accept_all.button": "Acceptér alle", - "notification_requests.confirm_accept_all.message": "Man er ved at acceptere {count, plural, one {en notifikationsanmodning} other {# notifikationsanmodninger}}. Fortsæt, sikker?", - "notification_requests.confirm_accept_all.title": "Acceptér notifikationsanmodninger?", - "notification_requests.confirm_dismiss_all.button": "Afvis alle", - "notification_requests.confirm_dismiss_all.message": "Man er ved at afvise {count, plural, one {en notifikationsanmodning} other {# notifikationsanmodninger}}. Man vil derfor ikke nemt kunne tilgå {count, plural, one {den} other {dem}} igen. Fortsæt, sikker?", - "notification_requests.confirm_dismiss_all.title": "Afvis notifikationsanmodninger?", + "notification_requests.accept_multiple": "{count, plural, one {Acceptér # anmodning…} other {Acceptér # anmodninger…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Acceptér anmodning} other {Acceptér anmodninger}}", + "notification_requests.confirm_accept_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive accepteret. Fortsæt, sikker?", + "notification_requests.confirm_accept_multiple.title": "Acceptér notifikationsanmodninger?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Afvis anmodning} other {Afvis anmodninger}}", + "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {En notifikationsanmodning} other {# notifikationsanmodninger}} er ved at blive afvist, hvorfor man ikke nemt vil kunne tilgå {count, plural, one {den} other {dem}} igen. Fortsæt, sikker?", + "notification_requests.confirm_dismiss_multiple.title": "Afvis notifikationsanmodninger?", "notification_requests.dismiss": "Afvis", - "notification_requests.dismiss_all": "Afvis alle", - "notification_requests.dismiss_multiple": "{count, plural, one {Afvis # anmodning} other {Afvis # anmodninger}}", - "notification_requests.enter_selection_mode": "Vælg", - "notification_requests.exit_selection_mode": "Afbryd", + "notification_requests.dismiss_multiple": "{count, plural, one {Afvis # anmodning…} other {Afvis # anmodninger…}}", + "notification_requests.edit_selection": "Redigér", + "notification_requests.exit_selection": "Udført", "notification_requests.explainer_for_limited_account": "Notifikationer fra denne konto er blevet filtreret, da kontoen er pålagt restriktioner af en moderator.", "notification_requests.explainer_for_limited_remote_account": "Notifikationer fra denne konto er blevet filtreret, da kontoen eller dens server er pålagt restriktioner af en moderator.", "notification_requests.maximize": "Maksimér", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 2d49f172e6bb4b..2d72740b4ae81c 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -518,19 +518,7 @@ "notification.status": "{name} hat gerade etwas gepostet", "notification.update": "{name} bearbeitete einen Beitrag", "notification_requests.accept": "Genehmigen", - "notification_requests.accept_all": "Alle genehmigen", - "notification_requests.accept_multiple": "{count, plural, one {# Anfrage genehmigen} other {# Anfragen genehmigen}}", - "notification_requests.confirm_accept_all.button": "Alle genehmigen", - "notification_requests.confirm_accept_all.message": "Du bist dabei, {{count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} zu genehmigen. Möchtest du wirklich fortfahren?", - "notification_requests.confirm_accept_all.title": "Benachrichtigungsanfragen genehmigen?", - "notification_requests.confirm_dismiss_all.button": "Alle ablehnen", - "notification_requests.confirm_dismiss_all.message": "Du bist dabei, {count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} abzulehnen. Du wirst nicht mehr ohne Weiteres auf {count, plural, one {sie} other {sie}} zugreifen können. Möchtest du wirklich fortfahren?", - "notification_requests.confirm_dismiss_all.title": "Benachrichtigungsanfragen ablehnen?", "notification_requests.dismiss": "Ablehnen", - "notification_requests.dismiss_all": "Alle ablehnen", - "notification_requests.dismiss_multiple": "{count, plural, one {# Anfrage ablehnen} other {# Anfragen ablehnen}}", - "notification_requests.enter_selection_mode": "Auswählen", - "notification_requests.exit_selection_mode": "Abbrechen", "notification_requests.explainer_for_limited_account": "Benachrichtigungen von diesem Konto wurden gefiltert, weil es durch Moderator*innen eingeschränkt wurde.", "notification_requests.explainer_for_limited_remote_account": "Benachrichtigungen von diesem Konto wurden gefiltert, weil deren Konto oder Server durch Moderator*innen eingeschränkt wurde.", "notification_requests.maximize": "Maximieren", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index c220f3a4e0c581..9603da4ffa95a1 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -518,19 +518,7 @@ "notification.status": "Ο/Η {name} μόλις ανέρτησε κάτι", "notification.update": "ο/η {name} επεξεργάστηκε μια ανάρτηση", "notification_requests.accept": "Αποδοχή", - "notification_requests.accept_all": "Αποδοχή όλων", - "notification_requests.accept_multiple": "{count, plural, one {Αποδοχή # αιτήματος} other {Αποδοχή # αιτημάτων}}", - "notification_requests.confirm_accept_all.button": "Αποδοχή όλων", - "notification_requests.confirm_accept_all.message": "Πρόκειται να αποδεχτείς {count, plural, one {ένα αίτημα ειδοποίησης} other {# αιτήματα ειδοποίησης}}. Σίγουρα θες να συνεχίσεις;", - "notification_requests.confirm_accept_all.title": "Αποδοχή αιτήσεων ειδοποίησης;", - "notification_requests.confirm_dismiss_all.button": "Παράβλεψη όλων", - "notification_requests.confirm_dismiss_all.message": "Πρόκειται να απορρίψεις {count, plural, one {ένα αίτημα ειδοποίησης} other {# αιτήματα ειδοποίησης}}. Δεν θα μπορείς να έχεις πρόσβαση εύκολα {count, plural, one {σε αυτή} other {σε αυτές}} ξανά. Σίγουρα θες να συνεχίσεις;", - "notification_requests.confirm_dismiss_all.title": "Απόρριψη αιτημάτων ειδοποίησης;", "notification_requests.dismiss": "Απόρριψη", - "notification_requests.dismiss_all": "Παράβλεψη όλων", - "notification_requests.dismiss_multiple": "{count, plural, one {Παράβλεψη # αιτήματος} other {Παράβλεψη # αιτημάτων}}", - "notification_requests.enter_selection_mode": "Επιλογή", - "notification_requests.exit_selection_mode": "Άκυρο", "notification_requests.explainer_for_limited_account": "Οι ειδοποιήσεις από αυτόν τον λογαριασμό έχουν φιλτραριστεί επειδή ο λογαριασμός έχει περιοριστεί από έναν συντονιστή.", "notification_requests.explainer_for_limited_remote_account": "Οι ειδοποιήσεις από αυτόν τον λογαριασμό έχουν φιλτραριστεί επειδή ο λογαριασμός ή ο διακομιστής του έχει περιοριστεί από έναν συντονιστή.", "notification_requests.maximize": "Μεγιστοποίηση", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 8315333994194a..d6e3429c3bd190 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -517,19 +517,7 @@ "notification.status": "{name} just posted", "notification.update": "{name} edited a post", "notification_requests.accept": "Accept", - "notification_requests.accept_all": "Accept all", - "notification_requests.accept_multiple": "{count, plural, one {Accept 1 request} other {Accept # requests}}", - "notification_requests.confirm_accept_all.button": "Accept all", - "notification_requests.confirm_accept_all.message": "You are about to accept {count, plural, one {one notification request} other {# notification requests}}. Are you sure you want to proceed?", - "notification_requests.confirm_accept_all.title": "Accept notification requests?", - "notification_requests.confirm_dismiss_all.button": "Dismiss all", - "notification_requests.confirm_dismiss_all.message": "You are about to dismiss {count, plural, one {one notification request} other {# notification requests}}. You won't be able to easily access {count, plural, one {it} other {them}} again. Are you sure you want to proceed?", - "notification_requests.confirm_dismiss_all.title": "Dismiss notification requests?", "notification_requests.dismiss": "Dismiss", - "notification_requests.dismiss_all": "Dismiss all", - "notification_requests.dismiss_multiple": "{count, plural, one {Dismiss one request} other {Dismiss # requests}}", - "notification_requests.enter_selection_mode": "Select", - "notification_requests.exit_selection_mode": "Cancel", "notification_requests.explainer_for_limited_account": "Notifications from this account have been filtered because the account has been limited by a moderator.", "notification_requests.explainer_for_limited_remote_account": "Notifications from this account have been filtered because the account or its server has been limited by a moderator.", "notification_requests.minimize_banner": "Minimize filtered notifications banner", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 0722a08ea63975..ba0a1a45b92313 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -518,19 +518,7 @@ "notification.status": "{name} acaba de enviar un mensaje", "notification.update": "{name} editó un mensaje", "notification_requests.accept": "Aceptar", - "notification_requests.accept_all": "Aceptar todas", - "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", - "notification_requests.confirm_accept_all.button": "Aceptar todas", - "notification_requests.confirm_accept_all.message": "Estás a punto de aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿Estás seguro de que querés continuar?", - "notification_requests.confirm_accept_all.title": "¿Aceptar solicitudes de notificación?", - "notification_requests.confirm_dismiss_all.button": "Descartar todas", - "notification_requests.confirm_dismiss_all.message": "Estás a punto de descartar {count, plural, one {una solicitud} other {# solicitudes}}. No vas a poder acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Estás seguro de que querés continuar?", - "notification_requests.confirm_dismiss_all.title": "¿Descartar solicitudes de notificación?", "notification_requests.dismiss": "Descartar", - "notification_requests.dismiss_all": "Descartar todas", - "notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud} other {Descartar # solicitudes}}", - "notification_requests.enter_selection_mode": "Seleccionar", - "notification_requests.exit_selection_mode": "Cancelar", "notification_requests.explainer_for_limited_account": "Las notificaciones de esta cuenta fueron filtradas porque la misma fue limitada por un moderador.", "notification_requests.explainer_for_limited_remote_account": "Las notificaciones de esta cuenta fueron filtradas porque la cuenta o su servidor fueron limitados por un moderador.", "notification_requests.maximize": "Maximizar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 0ff6c25328fda1..3267b28d613aca 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -518,19 +518,7 @@ "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", "notification_requests.accept": "Aceptar", - "notification_requests.accept_all": "Aceptar todas", - "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", - "notification_requests.confirm_accept_all.button": "Aceptar todas", - "notification_requests.confirm_accept_all.message": "Vas a aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿Estás seguro de que quieres continuar?", - "notification_requests.confirm_accept_all.title": "¿Aceptar todas las solicitudes?", - "notification_requests.confirm_dismiss_all.button": "Descartar todas", - "notification_requests.confirm_dismiss_all.message": "Vas a descartar {count, plural, one {una solicitud} other {# solicitudes}}. No vas a poder acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Estás seguro de que quieres continuar?", - "notification_requests.confirm_dismiss_all.title": "¿Descartar todas las solicitudes?", "notification_requests.dismiss": "Descartar", - "notification_requests.dismiss_all": "Descartar todas", - "notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud} other {Descartar # solicitudes}}", - "notification_requests.enter_selection_mode": "Seleccionar", - "notification_requests.exit_selection_mode": "Cancelar", "notification_requests.explainer_for_limited_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta ha sido limitada por un moderador.", "notification_requests.explainer_for_limited_remote_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta o su servidor ha sido limitada por un moderador.", "notification_requests.maximize": "Maximizar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index b8f5de997a24c4..04b46e166ade44 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -518,19 +518,7 @@ "notification.status": "{name} acaba de publicar", "notification.update": "{name} editó una publicación", "notification_requests.accept": "Aceptar", - "notification_requests.accept_all": "Aceptar todas", - "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", - "notification_requests.confirm_accept_all.button": "Aceptar todas", - "notification_requests.confirm_accept_all.message": "Vas a aceptar {count, plural, one {una solicitud} other {# solicitudes}}. ¿Estás seguro de que quieres continuar?", - "notification_requests.confirm_accept_all.title": "¿Aceptar todas las solicitudes?", - "notification_requests.confirm_dismiss_all.button": "Descartar todas", - "notification_requests.confirm_dismiss_all.message": "Vas a descartar {count, plural, one {una solicitud} other {# solicitudes}}. No vas a poder acceder fácilmente a {count, plural, one {ella} other {ellas}} de nuevo. ¿Estás seguro de que quieres continuar?", - "notification_requests.confirm_dismiss_all.title": "¿Descartar todas las solicitudes?", "notification_requests.dismiss": "Descartar", - "notification_requests.dismiss_all": "Descartar todas", - "notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud} other {Descartar # solicitudes}}", - "notification_requests.enter_selection_mode": "Seleccionar", - "notification_requests.exit_selection_mode": "Cancelar", "notification_requests.explainer_for_limited_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta ha sido limitada por un moderador.", "notification_requests.explainer_for_limited_remote_account": "Las notificaciones de esta cuenta han sido filtradas porque la cuenta o su servidor ha sido limitada por un moderador.", "notification_requests.maximize": "Maximizar", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index b2a8fe0da3e5f1..85855d91656bd3 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -502,15 +502,7 @@ "notification.status": "{name} erabiltzaileak bidalketa egin berri du", "notification.update": "{name} erabiltzaileak bidalketa bat editatu du", "notification_requests.accept": "Onartu", - "notification_requests.accept_all": "Onartu dena", - "notification_requests.confirm_accept_all.button": "Onartu dena", - "notification_requests.confirm_accept_all.title": "Onartu jakinarazpen-eskaerak?", - "notification_requests.confirm_dismiss_all.button": "Baztertu guztiak", - "notification_requests.confirm_dismiss_all.title": "Baztertu jakinarazpen-eskaerak?", "notification_requests.dismiss": "Baztertu", - "notification_requests.dismiss_all": "Baztertu guztiak", - "notification_requests.enter_selection_mode": "Hautatu", - "notification_requests.exit_selection_mode": "Utzi", "notification_requests.maximize": "Maximizatu", "notification_requests.notifications_from": "{name} erabiltzailearen jakinarazpenak", "notification_requests.title": "Iragazitako jakinarazpenak", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 9b48f1bf37d630..1dc3872b09ad39 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -518,19 +518,17 @@ "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", "notification_requests.accept": "Hyväksy", - "notification_requests.accept_all": "Hyväksy kaikki", - "notification_requests.accept_multiple": "{count, plural, one {Hyväksy # pyyntö} other {Hyväksy # pyyntöä}}", - "notification_requests.confirm_accept_all.button": "Hyväksy kaikki", - "notification_requests.confirm_accept_all.message": "Olet aikeissa hyväksyä {count, plural, one {ilmoituspyynnön} other {# ilmoituspyyntöä}}. Haluatko varmasti jatkaa?", - "notification_requests.confirm_accept_all.title": "Hyväksytäänkö ilmoituspyynnöt?", - "notification_requests.confirm_dismiss_all.button": "Hylkää kaikki", - "notification_requests.confirm_dismiss_all.message": "Olet aikeissa hylätä {count, plural, one {ilmoituspyynnön} other {# ilmoituspyyntöä}}. Et saa {count, plural, one {sitä} other {niitä}} enää helposti takaisin. Haluatko varmasti jatkaa?", - "notification_requests.confirm_dismiss_all.title": "Hylätäänkö ilmoituspyynnöt?", + "notification_requests.accept_multiple": "{count, plural, one {Hyväksy # pyyntö…} other {Hyväksy # pyyntöä…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Hyväksy pyyntö} other {Hyväksy pyynnöt}}", + "notification_requests.confirm_accept_multiple.message": "Olet aikeissa hyväksyä {count, plural, one {ilmoituspyynnön} other {# ilmoituspyyntöä}}. Haluatko varmasti jatkaa?", + "notification_requests.confirm_accept_multiple.title": "Hyväksytäänkö ilmoituspyynnöt?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Hylkää pyyntö} other {Hylkää pyynnöt}}", + "notification_requests.confirm_dismiss_multiple.message": "Olet aikeissa hylätä {count, plural, one {ilmoituspyynnön} other {# ilmoituspyyntöä}}. Et saa {count, plural, one {sitä} other {niitä}} enää helposti takaisin. Haluatko varmasti jatkaa?", + "notification_requests.confirm_dismiss_multiple.title": "Hylätäänkö ilmoituspyynnöt?", "notification_requests.dismiss": "Hylkää", - "notification_requests.dismiss_all": "Hylkää kaikki", - "notification_requests.dismiss_multiple": "{count, plural, one {Hylkää # pyyntö} other {Hylkää # pyyntöä}}", - "notification_requests.enter_selection_mode": "Valitse", - "notification_requests.exit_selection_mode": "Peruuta", + "notification_requests.dismiss_multiple": "{count, plural, one {Hylkää # pyyntö…} other {Hylkää # pyyntöä…}}", + "notification_requests.edit_selection": "Muokkaa", + "notification_requests.exit_selection": "Valmis", "notification_requests.explainer_for_limited_account": "Tähän tiliin liittyvät ilmoitukset on suodatettu, koska moderaattori on rajoittanut tiliä.", "notification_requests.explainer_for_limited_remote_account": "Tähän tiliin liittyvät ilmoitukset on suodatettu, koska moderaattori on rajoittanut tiliä tai sen palvelinta.", "notification_requests.maximize": "Suurenna", @@ -589,7 +587,7 @@ "notifications.policy.filter_not_following_hint": "Kunnes hyväksyt heidät manuaalisesti", "notifications.policy.filter_not_following_title": "Käyttäjät, joita et seuraa", "notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se ole vastaus omaan mainintaasi tai ellet seuraa lähettäjää", - "notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat", + "notifications.policy.filter_private_mentions_title": "Pyytämättömät yksityismaininnat", "notifications.policy.title": "Hallitse ilmoituksia kohteesta…", "notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", "notifications_permission_banner.how_to_control": "Saadaksesi ilmoituksia, kun Mastodon ei ole auki, ota työpöytäilmoitukset käyttöön. Voit hallita tarkasti, mistä saat työpöytäilmoituksia kun ilmoitukset on otettu käyttöön yllä olevan {icon}-painikkeen kautta.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 36198e9e591f25..beabf7fa3b464b 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -518,19 +518,7 @@ "notification.status": "{name} hevur júst postað", "notification.update": "{name} rættaði ein post", "notification_requests.accept": "Góðtak", - "notification_requests.accept_all": "Góðtak alt", - "notification_requests.accept_multiple": "{count, plural, one {Góðtak # umbøn} other {Góðtak # umbønir}}", - "notification_requests.confirm_accept_all.button": "Góðtak alt", - "notification_requests.confirm_accept_all.message": "Tú er í ferð við at góðtaka {count, plural, one {eina fráboðanarumbøn} other {# fráboðanarumbønir}}. Er tú vís/ur í at tú vilt halda fram?", - "notification_requests.confirm_accept_all.title": "Góðtekur tú umbøn um fráboðan?", - "notification_requests.confirm_dismiss_all.button": "Vraka alt", - "notification_requests.confirm_dismiss_all.message": "Tú ert í ferð við at kveistra burtur {count, plural, one {eina fráboðanarumbøn} other {# fráboðanarumbønir}}. Tað verður ikki lætt hjá tær at fáa atgongd til {count, plural, one {hana} other {tær}} aftur. Er tú vís/ur í, at tú vil halda fram?", - "notification_requests.confirm_dismiss_all.title": "Kveistra burtur fráboðanarumbønir?", "notification_requests.dismiss": "Avvís", - "notification_requests.dismiss_all": "Vraka alt", - "notification_requests.dismiss_multiple": "{count, plural, one {Kveistra burtur # umbøn} other {Kveistra burtur # umbønir}}", - "notification_requests.enter_selection_mode": "Vel", - "notification_requests.exit_selection_mode": "Strika", "notification_requests.explainer_for_limited_account": "Fráboðanir frá hesi kontuni eru filtreraðar burtur, tí kontan er avmarkað av einum umsjónarfólki.", "notification_requests.explainer_for_limited_remote_account": "Fráboðanir frá hesi kontuni eru filtreraðar burtur, tí kontan ella ambætarin hjá kontuni eru avmarkaði av einum umsjónarfólki.", "notification_requests.maximize": "Mesta", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 9cf1d8a69ba2b7..e57bc694afff1c 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -490,9 +490,6 @@ "notification.status": "{name} vient de publier", "notification.update": "{name} a modifié une publication", "notification_requests.accept": "Accepter", - "notification_requests.accept_all": "Tout accepter", - "notification_requests.confirm_accept_all.button": "Tout accepter", - "notification_requests.confirm_dismiss_all.button": "Tout rejeter", "notification_requests.dismiss": "Rejeter", "notification_requests.notifications_from": "Notifications de {name}", "notification_requests.title": "Notifications filtrées", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 6546cbb1e9f369..dd713e50ea156b 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -490,9 +490,6 @@ "notification.status": "{name} vient de publier", "notification.update": "{name} a modifié un message", "notification_requests.accept": "Accepter", - "notification_requests.accept_all": "Tout accepter", - "notification_requests.confirm_accept_all.button": "Tout accepter", - "notification_requests.confirm_dismiss_all.button": "Tout rejeter", "notification_requests.dismiss": "Rejeter", "notification_requests.notifications_from": "Notifications de {name}", "notification_requests.title": "Notifications filtrées", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index db36db17aa0e0c..945b2582aca957 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -518,19 +518,7 @@ "notification.status": "Phostáil {name} díreach", "notification.update": "Chuir {name} postáil in eagar", "notification_requests.accept": "Glac", - "notification_requests.accept_all": "Glac le gach", - "notification_requests.accept_multiple": "{count, plural, one {Glac le # iarratas} two {Glac le # iarratas} few {Glac le # iarratas} many {Glac le # iarratas} other {Glac le # iarratais}}", - "notification_requests.confirm_accept_all.button": "Glac le gach", - "notification_requests.confirm_accept_all.message": "Tá tú ar tí glacadh le {count, plural, one {iarratas fógra amháin} two {# iarratas fógra} few {# iarratas fógra} many {# iarratas fógra} other {# iarratais fógra}}. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", - "notification_requests.confirm_accept_all.title": "Glac le hiarratais ar fhógra?", - "notification_requests.confirm_dismiss_all.button": "Ruaig gach", - "notification_requests.confirm_dismiss_all.message": "Tá tú ar tí neamhaird a dhéanamh ar {count, plural, one {iarratas fógra amháin} two {# iarratas fógra} few {# iarratas fógra} many {# iarratas fógra} other {# iarratais fógra}}. Ní bheidh tú in ann {count, plural, one {é} two {iad} few {iad} many {iad} other {iad}} a rochtain go héasca arís. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", - "notification_requests.confirm_dismiss_all.title": "An bhfuil fonn ort iarratais ar fhógra a dhíbhe?", "notification_requests.dismiss": "Díbhe", - "notification_requests.dismiss_all": "Ruaig gach", - "notification_requests.dismiss_multiple": "{count, plural, one {Neamhaird a dhéanamh ar # iarratas} two {Neamhaird a dhéanamh ar # iarratas} few {Neamhaird a dhéanamh ar # iarratas} many {Neamhaird a dhéanamh ar # iarratas} other {Neamhaird a dhéanamh ar # iarratais}}", - "notification_requests.enter_selection_mode": "Roghnaigh", - "notification_requests.exit_selection_mode": "Cealaigh", "notification_requests.explainer_for_limited_account": "Scagadh fógraí ón gcuntas seo toisc go bhfuil an cuntas teoranta ag modhnóir.", "notification_requests.explainer_for_limited_remote_account": "Scagadh fógraí ón gcuntas seo toisc go bhfuil an cuntas nó a fhreastalaí teoranta ag modhnóir.", "notification_requests.maximize": "Uasmhéadaigh", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 6cbf1e7a03d1b9..8ab4cafd1420a8 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -518,19 +518,7 @@ "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", "notification_requests.accept": "Gabh ris", - "notification_requests.accept_all": "Gabh ris na h-uile", - "notification_requests.accept_multiple": "{count, plural, one {Gabh ri # iarrtas} two {Gabh ri # iarrtas} few {Gabh ri # iarrtasan} other {Gabh ri # iarrtas}}", - "notification_requests.confirm_accept_all.button": "Gabh ris na h-uile", - "notification_requests.confirm_accept_all.message": "Tha thu gu bhith gabhail ri {count, plural, one {# iarrtas bratha} two {# iarrtas bratha} few {# iarrtasan bratha} other {# iarrtas bratha}} a leigeil seachad. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", - "notification_requests.confirm_accept_all.title": "A bheil thu airson gabhail ri iarrtasan bratha?", - "notification_requests.confirm_dismiss_all.button": "Leig seachad na h-uile", - "notification_requests.confirm_dismiss_all.message": "Tha thu gu bhith {count, plural, one {# iarrtas bratha} two {# iarrtas bratha} few {# iarrtasan bratha} other {# iarrtas bratha}} a leigeil seachad. Chan fhaigh thu grèim {count, plural, one {air} two {orra} few {orra} other {orra}} a-rithist gun duilgheadas. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", - "notification_requests.confirm_dismiss_all.title": "A bheil thu airson iarrtasan bratha a leigeil seachad?", "notification_requests.dismiss": "Leig seachad", - "notification_requests.dismiss_all": "Leig seachad na h-uile", - "notification_requests.dismiss_multiple": "{count, plural, one {Leig seachad # iarrtas} two {Leig seachad # iarrtas} few {Leig seachad # iarrtasan} other {Leig seachad # iarrtas}}", - "notification_requests.enter_selection_mode": "Tagh", - "notification_requests.exit_selection_mode": "Sguir dheth", "notification_requests.explainer_for_limited_account": "Chaidh na brathan on chunntas seo a chriathradh on a chaidh an cunntas a chuingeachadh le maor.", "notification_requests.explainer_for_limited_remote_account": "Chaidh na brathan on chunntas seo a chriathradh on a chaidh an cunntas no am frithealaiche aige a chuingeachadh le maor.", "notification_requests.maximize": "Làn-mheudaich", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c344c19b7e98cd..1c694bf13d2907 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -518,19 +518,7 @@ "notification.status": "{name} publicou", "notification.update": "{name} editou unha publicación", "notification_requests.accept": "Aceptar", - "notification_requests.accept_all": "Aceptar todo", - "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitude} other {Acceptar # solicitudes}}", - "notification_requests.confirm_accept_all.button": "Aceptar todo", - "notification_requests.confirm_accept_all.message": "Vas aceptar {count, plural, one {unha solicitude de notificación} other {# solicitudes de notificación}}. Tes certeza de querer aceptalas?", - "notification_requests.confirm_accept_all.title": "Aceptar solicitudes de notificación?", - "notification_requests.confirm_dismiss_all.button": "Rexeitar todo", - "notification_requests.confirm_dismiss_all.message": "Vas rexeitar {count, plural, one {unha solicitude de notificación} other {# solicitudes de notificacións}}. Será complicado volver a {count, plural, one {vela} other {velas}}. Tes certeza de rexeitar?", - "notification_requests.confirm_dismiss_all.title": "Rexeitar solicitudes de notificacións?", "notification_requests.dismiss": "Desbotar", - "notification_requests.dismiss_all": "Rexeitar todo", - "notification_requests.dismiss_multiple": "{count, plural, one {Rexeitar # solicitude} other {Rexeitar # solicitudes}}", - "notification_requests.enter_selection_mode": "Escoller", - "notification_requests.exit_selection_mode": "Desbotar", "notification_requests.explainer_for_limited_account": "Filtráronse as notificacións desta conta porque a conta ten limitacións impostas pola moderación.", "notification_requests.explainer_for_limited_remote_account": "Filtráronse as notificacións desta conta porque a conta ou o seu servidor teñen limitacións impostas pola moderación.", "notification_requests.maximize": "Maximizar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e9cbfcbcc3367b..72f0612bc79d78 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -518,19 +518,7 @@ "notification.status": "{name} הרגע פרסמו", "notification.update": "{name} ערכו הודעה", "notification_requests.accept": "לקבל", - "notification_requests.accept_all": "לקבל את כל הבקשות", - "notification_requests.accept_multiple": "{count, plural,one {לאשר קבלת בקשה}other {לאשר קבלת # בקשות}}", - "notification_requests.confirm_accept_all.button": "לקבל את כל הבקשות", - "notification_requests.confirm_accept_all.message": "אתם עומדים לאשר {count, plural,one {בקשת התראה אחת}other {# בקשות התראה}}. להמשיך?", - "notification_requests.confirm_accept_all.title": "לקבל בקשות התראה?", - "notification_requests.confirm_dismiss_all.button": "דחיית כל הבקשות", - "notification_requests.confirm_dismiss_all.message": "אתם עומדים לדחות {count, plural,one {בקשת התראה}other {# בקשות התראה}}. לא תוכלו למצוא {count, plural,one {אותה}other {אותן}} בקלות אחר כך. להמשיך?", - "notification_requests.confirm_dismiss_all.title": "לדחות בקשות התראה?", "notification_requests.dismiss": "לבטל", - "notification_requests.dismiss_all": "דחיית כל הבקשות", - "notification_requests.dismiss_multiple": "{count, plural,one {לדחות בקשה}other {לדחות # בקשות}} לקבלת התראה", - "notification_requests.enter_selection_mode": "בחירה", - "notification_requests.exit_selection_mode": "ביטול", "notification_requests.explainer_for_limited_account": "התראות על פעולות חשבון זה סוננו כי חשבון זה הוגבל על ידי מנהלי הדיונים.", "notification_requests.explainer_for_limited_remote_account": "התראות על פעולות חשבון זה סוננו כי חשבון זה או השרת שלו הוגבלו על ידי מנהלי הדיונים.", "notification_requests.maximize": "הגדלה למקסימום", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index eb618c4666dfa4..c3e568c780671b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -518,19 +518,7 @@ "notification.status": "{name} bejegyzést tett közzé", "notification.update": "{name} szerkesztett egy bejegyzést", "notification_requests.accept": "Elfogadás", - "notification_requests.accept_all": "Összes elfogadása", - "notification_requests.accept_multiple": "{count, plural, one {# kérés elfogadása} other {# kérés elfogadása}}", - "notification_requests.confirm_accept_all.button": "Összes elfogadása", - "notification_requests.confirm_accept_all.message": "Elfogadni készülsz {count, plural, one {egy értesítési kérést} other {# értesítési kérést}}. Biztosan folytatod?", - "notification_requests.confirm_accept_all.title": "Értesítési kérés elfogadása?", - "notification_requests.confirm_dismiss_all.button": "Összes elutasítása", - "notification_requests.confirm_dismiss_all.message": "{count, plural, one {Egy értesítési kérés} other {# értesítési kérés}} elvetésére készülsz. Többé nem fogsz {count, plural, one {hozzáférni} other {hozzájuk férni}}. Biztosan folytatod?", - "notification_requests.confirm_dismiss_all.title": "Értesítési kérések elvetése?", "notification_requests.dismiss": "Elvetés", - "notification_requests.dismiss_all": "Összes elutasítása", - "notification_requests.dismiss_multiple": "{count, plural, one {# kérés elvetése} other {# kérés elvetése}}", - "notification_requests.enter_selection_mode": "Kiválasztás", - "notification_requests.exit_selection_mode": "Mégse", "notification_requests.explainer_for_limited_account": "Az ettől a fióktól származó értesítéseket kiszűrték, mert a fiókot egy moderátor korlátozta.", "notification_requests.explainer_for_limited_remote_account": "Az ettől a fióktól származó értesítéseket kiszűrték, mert a fiókot vagy annak kiszolgálóját egy moderátor korlátozta.", "notification_requests.maximize": "Maximalizálás", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index 0f4731ebaac444..1dd380164df431 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -113,7 +113,6 @@ "navigation_bar.lists": "Ndepụta", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.reblog": "{name} boosted your status", - "notification_requests.enter_selection_mode": "Họrọ", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", "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!", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index d5c791e1c5b2f0..2cfe8a7c640db7 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -518,19 +518,7 @@ "notification.status": "{name} sendi inn rétt í þessu", "notification.update": "{name} breytti færslu", "notification_requests.accept": "Samþykkja", - "notification_requests.accept_all": "Samþykkja alla", - "notification_requests.accept_multiple": "{count, plural, one {Samþykkja # beiðni} other {Samþykkja # beiðnir}}", - "notification_requests.confirm_accept_all.button": "Samþykkja alla", - "notification_requests.confirm_accept_all.message": "Þú ert að fara að samþykkja {count, plural, one {eina beiðni um tilkynningar} other {# beiðnir um tilkynningar}}. Ertu viss um að þú viljir halda áfram?", - "notification_requests.confirm_accept_all.title": "Samþykkja beiðnir um tilkynningar?", - "notification_requests.confirm_dismiss_all.button": "Hunsa allt", - "notification_requests.confirm_dismiss_all.message": "Þú ert að fara að hunsa {count, plural, one {eina beiðni um tilkynningar} other {# beiðnir um tilkynningar}}. Þú munt ekki eiga auðvelt með að skoða {count, plural, one {hana} other {þær}} aftur síðar. Ertu viss um að þú viljir halda áfram?", - "notification_requests.confirm_dismiss_all.title": "Hunsa beiðnir um tilkynningar?", "notification_requests.dismiss": "Afgreiða", - "notification_requests.dismiss_all": "Hunsa allt", - "notification_requests.dismiss_multiple": "{count, plural, one {Afgreiða # beiðni} other {Afgreiða # beiðnir}}", - "notification_requests.enter_selection_mode": "Velja", - "notification_requests.exit_selection_mode": "Hætta við", "notification_requests.explainer_for_limited_account": "Tilkynningar frá þessum notanda hafa verið síaðar þar sem aðgangur hans hefur verið takmarkaður af umsjónarmanni.", "notification_requests.explainer_for_limited_remote_account": "Tilkynningar frá þessum notanda hafa verið síaðar þar sem aðgangurinn eða netþjónn hans hefur verið takmarkaður af umsjónarmanni.", "notification_requests.maximize": "Hámarka", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 20f5f0aa0816cd..99fc7058befb14 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -518,19 +518,7 @@ "notification.status": "{name} ha appena pubblicato un post", "notification.update": "{name} ha modificato un post", "notification_requests.accept": "Accetta", - "notification_requests.accept_all": "Accetta tutte", - "notification_requests.accept_multiple": "{count, plural,one {Accetta # richiesta} other {Accetta # richieste}}", - "notification_requests.confirm_accept_all.button": "Accetta tutte", - "notification_requests.confirm_accept_all.message": "Stai per accettare {count, plural, one {una richiesta di notifica} other {# richieste di notifica}}. Si è sicuri di voler procedere?", - "notification_requests.confirm_accept_all.title": "Accettare le richieste di notifica?", - "notification_requests.confirm_dismiss_all.button": "Ignora tutte", - "notification_requests.confirm_dismiss_all.message": "Stai per ignorare {count, plural, one {una richiesta di notifica} other {# richieste di notifica}}. Non sarai più in grado di accedere facilmente {count, plural, one {ad essa} other {ad esse}} nuovamente. Si è sicuri di voler procedere?", - "notification_requests.confirm_dismiss_all.title": "Ignorare le richieste di notifica?", "notification_requests.dismiss": "Ignora", - "notification_requests.dismiss_all": "Ignora tutte", - "notification_requests.dismiss_multiple": "{count, plural, one {Ignora # richiesta} other {Ignora # richieste}}", - "notification_requests.enter_selection_mode": "Seleziona", - "notification_requests.exit_selection_mode": "Annulla", "notification_requests.explainer_for_limited_account": "Le notifiche provenienti da questo account sono state filtrate perché l'account è stato limitato da un moderatore.", "notification_requests.explainer_for_limited_remote_account": "Le notifiche provenienti da questo account sono state filtrate perché l'account o il suo server sono stati limitati da un moderatore.", "notification_requests.maximize": "Ingrandisci", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 420ba495f05268..f5adc8c56c482c 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -403,7 +403,6 @@ "notification.status": "{name} akken i d-yessufeɣ", "notification_requests.accept": "Qbel", "notification_requests.dismiss": "Agi", - "notification_requests.exit_selection_mode": "Sefsex", "notification_requests.notifications_from": "Alɣuten sɣur {name}", "notifications.clear": "Sfeḍ alɣuten", "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk alɣuten-inek·em i lebda?", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index a309a502636514..2e929040f445b9 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -516,19 +516,7 @@ "notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.update": "{name} 님이 게시물을 수정했습니다", "notification_requests.accept": "수락", - "notification_requests.accept_all": "모두 수락", - "notification_requests.accept_multiple": "{count, plural, other {#개의 요청 수락하기}}", - "notification_requests.confirm_accept_all.button": "모두 수락", - "notification_requests.confirm_accept_all.message": "{count, plural, other {#개의 요청}}을 수락하려 합니다. 계속 진행할까요?", - "notification_requests.confirm_accept_all.title": "알림 요청을 수락할까요?", - "notification_requests.confirm_dismiss_all.button": "모두 지우기", - "notification_requests.confirm_dismiss_all.message": "{count, plural, other {#개의 요청}}을 지우려고 합니다. {count, plural, other {}}다시 접근하기 어렵습니다. 계속할까요?", - "notification_requests.confirm_dismiss_all.title": "알림 요청을 지울까요?", "notification_requests.dismiss": "지우기", - "notification_requests.dismiss_all": "모두 지우기", - "notification_requests.dismiss_multiple": "{count, plural, other {#개의 요청 지우기}}", - "notification_requests.enter_selection_mode": "선택", - "notification_requests.exit_selection_mode": "취소", "notification_requests.explainer_for_limited_account": "이 계정은 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.", "notification_requests.explainer_for_limited_remote_account": "이 계정 혹은 그가 속한 서버는 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.", "notification_requests.maximize": "최대화", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 0b0449c96aa134..9711bc684d400b 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -475,11 +475,7 @@ "notification.status": "{name} publiko algo", "notification.update": "{name} edito una publikasyon", "notification_requests.accept": "Acheta", - "notification_requests.accept_all": "Acheta todos", - "notification_requests.confirm_accept_all.button": "Acheta todos", "notification_requests.dismiss": "Kita", - "notification_requests.enter_selection_mode": "Eskoje", - "notification_requests.exit_selection_mode": "Anula", "notification_requests.notifications_from": "Avizos de {name}", "notification_requests.title": "Avizos filtrados", "notification_requests.view": "Amostra avizos", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 038ec8a7b30e2a..174d3033c799f9 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -516,19 +516,7 @@ "notification.status": "{name} ką tik paskelbė", "notification.update": "{name} redagavo įrašą", "notification_requests.accept": "Priimti", - "notification_requests.accept_all": "Priimti visus", - "notification_requests.accept_multiple": "{count, plural, one {Priimti # prašymą} few {Priimti # prašymus} many {Priimti # prašymo} other {Priimti # prašymų}}", - "notification_requests.confirm_accept_all.button": "Priimti visus", - "notification_requests.confirm_accept_all.message": "Ketini priimti {count, plural, one {# pranešimo prašymą} few {# pranešimų prašymus} many {# pranešimo prašymo} other {# pranešimų prašymų}}. Ar tikrai nori tęsti?", - "notification_requests.confirm_accept_all.title": "Priimti pranešimų prašymus?", - "notification_requests.confirm_dismiss_all.button": "Atmesti visus", - "notification_requests.confirm_dismiss_all.message": "Ketini atmesti {count, plural, one {# pranešimo prašymą} few {# pranešimų prašymus} many {# pranešimo prašymo} other {# pranešimų prašymų}}. Daugiau negalėsi lengvai pasiekti {count, plural, one {jo} few {jų} many {juos} other {jų}}. Ar tikrai nori tęsti?", - "notification_requests.confirm_dismiss_all.title": "Atmesti pranešimų prašymus?", "notification_requests.dismiss": "Atmesti", - "notification_requests.dismiss_all": "Atmesti visus", - "notification_requests.dismiss_multiple": "{count, plural, one {Atmesti # prašymą} few {Atmesti # prašymus} many {Atmesti # prašymo} other {Atmesti # prašymų}}", - "notification_requests.enter_selection_mode": "Pasirinkti", - "notification_requests.exit_selection_mode": "Atšaukti", "notification_requests.explainer_for_limited_account": "Pranešimai iš šios paskyros buvo filtruojami, nes prižiūrėtojas (-a) apribojo paskyrą.", "notification_requests.explainer_for_limited_remote_account": "Pranešimai iš šios paskyros buvo filtruojami, nes prižiūrėtojas (-a) apribojo paskyrą arba serverį.", "notification_requests.maximize": "Padidinti", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 9293cfb09214a4..a8a6b23f86fb54 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -518,19 +518,7 @@ "notification.status": "{name} heeft zojuist een bericht geplaatst", "notification.update": "{name} heeft een bericht bewerkt", "notification_requests.accept": "Accepteren", - "notification_requests.accept_all": "Alles accepteren", - "notification_requests.accept_multiple": "{count, plural, one {# verzoek accepteren} other {# verzoeken accepteren}}", - "notification_requests.confirm_accept_all.button": "Alles accepteren", - "notification_requests.confirm_accept_all.message": "Je staat op het punt om {count, plural, one {een meldingsverzoek} other {# meldingsverzoeken}} te accepteren. Wil je doorgaan?", - "notification_requests.confirm_accept_all.title": "Meldingsverzoeken accepteren?", - "notification_requests.confirm_dismiss_all.button": "Alles afwijzen", - "notification_requests.confirm_dismiss_all.message": "Je staat op het punt om {count, plural, one {een meldingsverzoek} other {# meldingsverzoeken}} af te wijzen. Je zult niet in staat zijn om {count, plural, one {hier} other {hier}} weer gemakkelijk toegang toe te krijgen. Wil je doorgaan?", - "notification_requests.confirm_dismiss_all.title": "Meldingsverzoeken afwijzen?", "notification_requests.dismiss": "Afwijzen", - "notification_requests.dismiss_all": "Alles afwijzen", - "notification_requests.dismiss_multiple": "{count, plural, one {# verzoek afwijzen} other {# verzoeken afwijzen}}", - "notification_requests.enter_selection_mode": "Selecteren", - "notification_requests.exit_selection_mode": "Annuleren", "notification_requests.explainer_for_limited_account": "Meldingen van dit account zijn gefilterd omdat dit account door een moderator is beperkt.", "notification_requests.explainer_for_limited_remote_account": "Meldingen van dit account zijn gefilterd omdat dit account of diens server door een moderator is beperkt.", "notification_requests.maximize": "Maximaliseren", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 1b0e490e60edfa..7ecabd10c52ce7 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -518,19 +518,7 @@ "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte eit innlegg", "notification_requests.accept": "Godkjenn", - "notification_requests.accept_all": "Godta alle", - "notification_requests.accept_multiple": "{count, plural, one {Godta # førespurnad} other {Godta # førespurnader}}", - "notification_requests.confirm_accept_all.button": "Godta alle", - "notification_requests.confirm_accept_all.message": "Du er i ferd med å godta {count, plural, one {ein førespurnad om å fylgja deg} other {# førespurnader om å fylgja deg}}. Er du sikker på at du vil halda fram?", - "notification_requests.confirm_accept_all.title": "Godta førespurnad om varsel?", - "notification_requests.confirm_dismiss_all.button": "Avvis alle", - "notification_requests.confirm_dismiss_all.message": "Du er i ferd med å avvisa {count, plural, one {ein førespurnad om varsel} other {# førespurnader om varsel}}. Det blir ikkje lett å få tilgang til {count, plural, one {han} other {dei}} att. Er du sikker på at du vil halda fram?", - "notification_requests.confirm_dismiss_all.title": "Avvis førespurnader om varsel?", "notification_requests.dismiss": "Avvis", - "notification_requests.dismiss_all": "Avvis alle", - "notification_requests.dismiss_multiple": "{count, plural, one {Avvis # førespurnad} other {Avvis # førespurnader}}", - "notification_requests.enter_selection_mode": "Vel", - "notification_requests.exit_selection_mode": "Avbryt", "notification_requests.explainer_for_limited_account": "Varsla frå denne kontoen er filtrerte ut fordi ein moderator har avgrensa kontoen.", "notification_requests.explainer_for_limited_remote_account": "Varla frå denne kontoen er filtrerte ut fordi ein moderator har avgrensa kontoen eller tenaren.", "notification_requests.maximize": "Maksimer", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index c46c891d1bb49a..adbdedb78007e4 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -517,19 +517,17 @@ "notification.status": "{name} opublikował(a) nowy wpis", "notification.update": "{name} edytował(a) post", "notification_requests.accept": "Akceptuj", - "notification_requests.accept_all": "Przyjmij wszystkie", - "notification_requests.accept_multiple": "Przyjmij {count, plural, one {# wniosek} few {# wnioski} other {# wniosków}} o powiadomienia", - "notification_requests.confirm_accept_all.button": "Przyjmij wszystkie", - "notification_requests.confirm_accept_all.message": "Na pewno przyjąć {count, plural, one {# wniosek o powiadomienie} few {# wnioski o powiadomienia} other {# wniosków o powiadomienia}}?", - "notification_requests.confirm_accept_all.title": "Przyjąć wnioski o powiadomienia?", - "notification_requests.confirm_dismiss_all.button": "Odrzuć wszystkie", - "notification_requests.confirm_dismiss_all.message": "Na pewno odrzucić {count, plural, one {# wniosek o powiadomienie} few {# wnioski o powiadomienia} other {# wniosków o powiadomienia}}? Stracisz do {count, plural, one {niego} other {nich}} łatwy dostęp.", - "notification_requests.confirm_dismiss_all.title": "Odrzuć żądania powiadomień?", + "notification_requests.accept_multiple": "Przyjmij {count, plural, one {# wniosek} few {# wnioski} other {# wniosków}} o powiadomienia…", + "notification_requests.confirm_accept_multiple.button": "Przyjmij {count, plural, one {wniosek} other {wnioski}} o powiadomienia", + "notification_requests.confirm_accept_multiple.message": "Na pewno przyjąć {count, plural, one {# wniosek o powiadomienie} few {# wnioski o powiadomienia} other {# wniosków o powiadomienia}}?", + "notification_requests.confirm_accept_multiple.title": "Przyjąć wnioski o powiadomienia?", + "notification_requests.confirm_dismiss_multiple.button": "Odrzuć {count, plural, one {wniosek} other {wnioski}} o powiadomienia", + "notification_requests.confirm_dismiss_multiple.message": "Na pewno odrzucić {count, plural, one {# wniosek o powiadomienie} few {# wnioski o powiadomienia} other {# wniosków o powiadomienia}}? Stracisz do {count, plural, one {niego} other {nich}} łatwy dostęp.", + "notification_requests.confirm_dismiss_multiple.title": "Odrzuć żądania powiadomień?", "notification_requests.dismiss": "Odrzuć", - "notification_requests.dismiss_all": "Odrzuć wszystkie", - "notification_requests.dismiss_multiple": "Odrzuć {count, plural, one {# wniosek} few {# wnioski} other {# wniosków}} o powiadomienia", - "notification_requests.enter_selection_mode": "Wybierz", - "notification_requests.exit_selection_mode": "Anuluj", + "notification_requests.dismiss_multiple": "Odrzuć {count, plural, one {# wniosek} few {# wnioski} other {# wniosków}} o powiadomienia…", + "notification_requests.edit_selection": "Edytuj", + "notification_requests.exit_selection": "Gotowe", "notification_requests.explainer_for_limited_account": "Powiadomienia od tego konta zostały odfiltrowane bo to konto zostało ograniczone przez moderatora.", "notification_requests.explainer_for_limited_remote_account": "Powiadomienia od tego konta zostały odfiltrowane bo to konto, albo serwer na którym się znajduje, zostało ograniczone przez moderatora.", "notification_requests.maximize": "Zmaksymalizuj", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 613b1d454430e9..9f38f0b51a2aa1 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -498,10 +498,7 @@ "notification.status": "{name} acabou de tootar", "notification.update": "{name} editou uma publicação", "notification_requests.accept": "Aceitar", - "notification_requests.accept_all": "Aceitar tudo", - "notification_requests.confirm_accept_all.button": "Aceitar tudo", "notification_requests.dismiss": "Rejeitar", - "notification_requests.exit_selection_mode": "Cancelar", "notification_requests.maximize": "Maximizar", "notification_requests.notifications_from": "Notificações de {name}", "notification_requests.title": "Notificações filtradas", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 108b83f0b0e816..7ac05ea980d927 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -339,6 +339,7 @@ "home.pending_critical_update.link": "Zobraziť aktualizácie", "home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.", "home.show_announcements": "Zobraziť oznámenia", + "ignore_notifications_modal.ignore": "Ignoruj upozornenia", "interaction_modal.description.favourite": "S účtom na Mastodone môžete tento príspevok ohviezdičkovať, tak dať autorovi vedieť, že sa vám páči, a uložiť si ho na neskôr.", "interaction_modal.description.follow": "S účtom na Mastodone môžete {name} sledovať a vidieť ich príspevky vo svojom domovskom kanáli.", "interaction_modal.description.reblog": "S účtom na Mastodone môžete tento príspevok zdeľať so svojimi sledovateľmi.", @@ -455,6 +456,11 @@ "notification.favourite": "{name} hviezdičkuje váš príspevok", "notification.follow": "{name} vás sleduje", "notification.follow_request": "{name} vás žiada sledovať", + "notification.label.mention": "Zmienka", + "notification.label.private_mention": "Súkromná zmienka", + "notification.label.private_reply": "Súkromná odpoveď", + "notification.label.reply": "Odpoveď", + "notification.mention": "Zmienka", "notification.moderation-warning.learn_more": "Zisti viac", "notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.", "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 353b521a1c9fa4..1f2d9c4cdfd610 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -507,13 +507,7 @@ "notification.status": "{name} je pravkar objavil/a", "notification.update": "{name} je uredil(a) objavo", "notification_requests.accept": "Sprejmi", - "notification_requests.accept_all": "Sprejmi vse", - "notification_requests.confirm_accept_all.button": "Sprejmi vse", - "notification_requests.confirm_dismiss_all.button": "Opusti vse", "notification_requests.dismiss": "Zavrni", - "notification_requests.dismiss_all": "Opusti vse", - "notification_requests.enter_selection_mode": "Izberi", - "notification_requests.exit_selection_mode": "Prekliči", "notification_requests.maximize": "Maksimiraj", "notification_requests.notifications_from": "Obvestila od {name}", "notification_requests.title": "Filtrirana obvestila", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 78b90e2788af29..3fe22e4df5e22f 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -518,19 +518,7 @@ "notification.status": "{name} sapo postoi", "notification.update": "{name} përpunoi një postim", "notification_requests.accept": "Pranoje", - "notification_requests.accept_all": "Pranoji krejt", - "notification_requests.accept_multiple": "{count, plural, one {Prano # kërkesë} other {Prano # kërkesa}}", - "notification_requests.confirm_accept_all.button": "Pranoji krejt", - "notification_requests.confirm_accept_all.message": "Ju ndan një hap nga pranimi i {count, plural, one {një kërkese njoftimi} other {# kërkesash njoftimi}}. Jeni i sigurt se doni të vazhdohet?", - "notification_requests.confirm_accept_all.title": "Të pranohen kërkesa njoftimesh?", - "notification_requests.confirm_dismiss_all.button": "Hidhi tej krejt", - "notification_requests.confirm_dismiss_all.message": "Ju ndan një hap nga hedhja tej e {count, plural, one {një kërkese njoftimesh} other {# kërkesash njoftimesh}}. S’do të jeni në gjendje të shihni sërish {count, plural, one {atë} other {ato}}. Jeni i sigurt se doni të bëhet kjo?", - "notification_requests.confirm_dismiss_all.title": "Të hidhen tej kërkesa njoftimesh?", "notification_requests.dismiss": "Hidhe tej", - "notification_requests.dismiss_all": "Hidhi tej krejt", - "notification_requests.dismiss_multiple": "{count, plural, one {Hidhni tej # kërkesë} other {Hidhni tej # kërkesa}}", - "notification_requests.enter_selection_mode": "Përzgjidhni", - "notification_requests.exit_selection_mode": "Anuloje", "notification_requests.explainer_for_limited_account": "Njoftimet prej kësaj llogarie janë filtruar, ngaqë llogaria është kufizuar nga një moderator.", "notification_requests.explainer_for_limited_remote_account": "Njoftimet prej kësaj llogarie janë filtruar, ngaqë llogaria, ose shërbyesi është kufizuar nga një moderator.", "notification_requests.maximize": "Maksimizoje", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index b27b3633eefe32..7c57569b806ff4 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -502,14 +502,9 @@ "notification.status": "{name} publicerade just ett inlägg", "notification.update": "{name} redigerade ett inlägg", "notification_requests.accept": "Godkänn", - "notification_requests.accept_all": "Acceptera alla", - "notification_requests.accept_multiple": "{count, plural, one {Acceptera # förfrågan} other {Acceptera # förfrågningar}}", - "notification_requests.confirm_accept_all.button": "Acceptera alla", - "notification_requests.confirm_dismiss_all.button": "Avvisa alla", "notification_requests.dismiss": "Avfärda", - "notification_requests.dismiss_all": "Avvisa alla", - "notification_requests.dismiss_multiple": "{count, plural, one {Avvisa # förfrågan} other {Avvisa # förfrågningar}}", - "notification_requests.exit_selection_mode": "Avbryt", + "notification_requests.edit_selection": "Redigera", + "notification_requests.exit_selection": "Klar", "notification_requests.notifications_from": "Aviseringar från {name}", "notification_requests.title": "Filtrerade meddelanden", "notifications.clear": "Rensa aviseringar", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 9d378a67a2b8d9..dc155ac4333664 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -515,17 +515,7 @@ "notification.status": "{name} เพิ่งโพสต์", "notification.update": "{name} ได้แก้ไขโพสต์", "notification_requests.accept": "ยอมรับ", - "notification_requests.accept_all": "ยอมรับทั้งหมด", - "notification_requests.accept_multiple": "{count, plural, other {ยอมรับ # คำขอ}}", - "notification_requests.confirm_accept_all.button": "ยอมรับทั้งหมด", - "notification_requests.confirm_accept_all.title": "ยอมรับคำขอการแจ้งเตือน?", - "notification_requests.confirm_dismiss_all.button": "ปิดทั้งหมด", - "notification_requests.confirm_dismiss_all.title": "ปิดคำขอการแจ้งเตือน?", "notification_requests.dismiss": "ปิด", - "notification_requests.dismiss_all": "ปิดทั้งหมด", - "notification_requests.dismiss_multiple": "{count, plural, other {ปิด # คำขอ}}", - "notification_requests.enter_selection_mode": "เลือก", - "notification_requests.exit_selection_mode": "ยกเลิก", "notification_requests.notifications_from": "การแจ้งเตือนจาก {name}", "notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notification_requests.view": "ดูการแจ้งเตือน", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index ba84b722128100..adada095b130b1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -518,19 +518,7 @@ "notification.status": "{name} az önce gönderdi", "notification.update": "{name} bir gönderiyi düzenledi", "notification_requests.accept": "Onayla", - "notification_requests.accept_all": "Tümünü kabul et", - "notification_requests.accept_multiple": "{count, plural, one {# isteği kabul et} other {# isteği kabul et}}", - "notification_requests.confirm_accept_all.button": "Tümünü kabul et", - "notification_requests.confirm_accept_all.message": "{count, plural, one {Bir bildirim isteğini} other {# bildirim isteğini}} kabul etmek üzeresiniz. Devam etmek istediğinizden emin misiniz?", - "notification_requests.confirm_accept_all.title": "Bildirim taleplerini kabul et?", - "notification_requests.confirm_dismiss_all.button": "Tümünü reddet", - "notification_requests.confirm_dismiss_all.message": "{count, plural, one {Bir bildirim isteğini} other {# bildirim isteğini}} reddetmek üzeresiniz. {count, plural, one {Ona} other {Onlara}} tekrar kolayca ulaşamayacaksınz. Devam etmek istediğinizden emin misiniz?", - "notification_requests.confirm_dismiss_all.title": "Bildirim taleplerini reddet?", "notification_requests.dismiss": "Yoksay", - "notification_requests.dismiss_all": "Tümünü reddet", - "notification_requests.dismiss_multiple": "{count, plural, one {# isteği reddet} other {# isteği reddet}}", - "notification_requests.enter_selection_mode": "Seç", - "notification_requests.exit_selection_mode": "İptal", "notification_requests.explainer_for_limited_account": "Hesap bir moderatör tarafından sınırlandığı için, bu hesaptan gönderilen bildirimler filtrelendi.", "notification_requests.explainer_for_limited_remote_account": "Hesap veya sunucusu bir moderatör tarafından sınırlandığı için, bu hesaptan gönderilen bildirimler filtrelendi.", "notification_requests.maximize": "Büyüt", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 83b3be003ec63a..462b9fb171e938 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -518,19 +518,7 @@ "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", "notification_requests.accept": "Прийняти", - "notification_requests.accept_all": "Прийняти все", - "notification_requests.accept_multiple": "{count, plural, one {Прийняти # запит} few {Прийняти # запити} many {Прийняти # запитів} other {Прийняти # запит}}", - "notification_requests.confirm_accept_all.button": "Прийняти все", - "notification_requests.confirm_accept_all.message": "Ви збираєтеся прийняти {count, plural, one {запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви впевнені, що хочете продовжити?", - "notification_requests.confirm_accept_all.title": "Прийняти запит на сповіщення?", - "notification_requests.confirm_dismiss_all.button": "Відхили все", - "notification_requests.confirm_dismiss_all.message": "Ви збираєтеся відхилити {count, plural, one {запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви не зможете легко отримати доступ до {count, plural, one {нього} other {них}} again. Ви впевнені, що хочете продовжити?", - "notification_requests.confirm_dismiss_all.title": "Відхилити запити на сповіщення?", "notification_requests.dismiss": "Відхилити", - "notification_requests.dismiss_all": "Відхили все", - "notification_requests.dismiss_multiple": "{count, plural, one {Відхилити # запит} other {Відхилити # запити}}", - "notification_requests.enter_selection_mode": "Вибрати", - "notification_requests.exit_selection_mode": "Скасувати", "notification_requests.explainer_for_limited_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис обмежений модератором.", "notification_requests.explainer_for_limited_remote_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис або його сервер обмежений модератором.", "notification_requests.maximize": "Розгорнути", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 688adc213716f4..8dceeccdbd428f 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -509,7 +509,17 @@ "notification.status": "{name} đăng tút mới", "notification.update": "{name} đã sửa tút", "notification_requests.accept": "Chấp nhận", + "notification_requests.accept_multiple": "{count, plural, other {Duyệt # yêu cầu…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, other {Yêu cầu cần duyệt}}", + "notification_requests.confirm_accept_multiple.message": "Bạn sẽ duyệt {count, plural, other {# yêu cầu thông báo}}. Vẫn tiếp tục?", + "notification_requests.confirm_accept_multiple.title": "Duyệt yêu cầu thông báo?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {Bỏ qua yêu cầu}}", + "notification_requests.confirm_dismiss_multiple.message": "Bạn sẽ bỏ qua {count, plural, other {# yêu cầu thông báo}}. Bạn sẽ không thể truy cập dễ dàng {count, plural, other {chúng}} nữa. Vẫn tiếp tục?", + "notification_requests.confirm_dismiss_multiple.title": "Bỏ qua yêu cầu thông báo?", "notification_requests.dismiss": "Bỏ qua", + "notification_requests.dismiss_multiple": "{count, plural, other {Bỏ qua # yêu cầu…}}", + "notification_requests.edit_selection": "Sửa", + "notification_requests.exit_selection": "Xong", "notification_requests.explainer_for_limited_account": "Thông báo từ tài khoản này đã được lọc vì tài khoản đã bị giới hạn bởi kiểm duyệt viên.", "notification_requests.explainer_for_limited_remote_account": "Thông báo từ tài khoản này đã được lọc vì tài khoản hoặc máy chủ của tài khoản đã bị giới hạn bởi kiểm duyệt viên.", "notification_requests.maximize": "Tối đa", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 517390f823c575..fd3ce2ae6c0f10 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -518,19 +518,7 @@ "notification.status": "{name} 刚刚发布嘟文", "notification.update": "{name} 编辑了嘟文", "notification_requests.accept": "接受", - "notification_requests.accept_all": "全部接受", - "notification_requests.accept_multiple": "{count, plural, other {接受 # 个请求}}", - "notification_requests.confirm_accept_all.button": "全部接受", - "notification_requests.confirm_accept_all.message": "你将要接受 {count, plural, other {# 个通知请求}}。是否继续?", - "notification_requests.confirm_accept_all.title": "是否接受通知请求?", - "notification_requests.confirm_dismiss_all.button": "全部拒绝", - "notification_requests.confirm_dismiss_all.message": "你将要拒绝 {count, plural, other {# 个通知请求}}。你将无法再轻易访问{count, plural, other {它们}}。是否继续?", - "notification_requests.confirm_dismiss_all.title": "是否拒绝通知请求?", "notification_requests.dismiss": "拒绝", - "notification_requests.dismiss_all": "全部拒绝", - "notification_requests.dismiss_multiple": "{count, plural, other {拒绝 # 个请求}}", - "notification_requests.enter_selection_mode": "选择", - "notification_requests.exit_selection_mode": "取消", "notification_requests.explainer_for_limited_account": "来自该账户的通知已被过滤,因为该账户已被管理员限制。", "notification_requests.explainer_for_limited_remote_account": "来自该账户的通知已被过滤,因为该账户或其所在的实例已被管理员限制。", "notification_requests.maximize": "最大化", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 16e506a181beb8..cc130cfafcc113 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -518,19 +518,17 @@ "notification.status": "{name} 剛剛嘟文", "notification.update": "{name} 已編輯嘟文", "notification_requests.accept": "接受", - "notification_requests.accept_all": "全部接受", - "notification_requests.accept_multiple": "{count, plural, other {接受 # 則請求}}", - "notification_requests.confirm_accept_all.button": "全部接受", - "notification_requests.confirm_accept_all.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續?", - "notification_requests.confirm_accept_all.title": "接受推播通知請求?", - "notification_requests.confirm_dismiss_all.button": "全部忽略", - "notification_requests.confirm_dismiss_all.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續?", - "notification_requests.confirm_dismiss_all.title": "忽略推播通知請求?", + "notification_requests.accept_multiple": "{count, plural, other {接受 # 則請求...}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, other {接受請求}}", + "notification_requests.confirm_accept_multiple.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續?", + "notification_requests.confirm_accept_multiple.title": "接受推播通知請求?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {忽略請求}}", + "notification_requests.confirm_dismiss_multiple.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續?", + "notification_requests.confirm_dismiss_multiple.title": "忽略推播通知請求?", "notification_requests.dismiss": "關閉", - "notification_requests.dismiss_all": "全部忽略", - "notification_requests.dismiss_multiple": "{count, plural, other {忽略 # 則請求}}", - "notification_requests.enter_selection_mode": "選擇", - "notification_requests.exit_selection_mode": "取消", + "notification_requests.dismiss_multiple": "{count, plural, other {忽略 # 則請求...}}", + "notification_requests.edit_selection": "編輯", + "notification_requests.exit_selection": "完成", "notification_requests.explainer_for_limited_account": "由於此帳號已被管理員限制,來自此帳號之通知已被過濾。", "notification_requests.explainer_for_limited_remote_account": "由於此帳號或其伺服器已被管理員限制,來自此帳號之通知已被過濾。", "notification_requests.maximize": "最大化", diff --git a/config/locales/be.yml b/config/locales/be.yml index 81804ffc32d42a..3d4c10cbb87543 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -35,6 +35,7 @@ be: created_msg: Нататка мадэратара паспяхова створана! destroyed_msg: Нататка мадэратара паспяхова выдалена! accounts: + add_email_domain_block: Заблакіраваць дамен эл. пошты approve: Пацвердзіць approved_msg: Заяўка на рэгістрацыю %{username} ухваленая are_you_sure: Вы ўпэўнены? @@ -135,6 +136,7 @@ be: resubscribe: Аднавіць падпіску role: Роля search: Пошук + search_same_email_domain: Іншыя карыстальнікі з такім жа даменам эл. пошты search_same_ip: Іншыя карыстальнікі з гэтым IP security: Бяспека security_measures: @@ -175,21 +177,26 @@ be: approve_appeal: Ухваліць абскарджанне approve_user: Зацвердзіць карыстальніка assigned_to_self_report: Прызначыць скаргу + change_email_user: Змяніць эл. пошту карыстальніка change_role_user: Змяніць ролю карыстальніка confirm_user: Пацвердзіць карыстальніка create_account_warning: Стварыць папярэджанне create_announcement: Стварыць аб'яву + create_canonical_email_block: Стварыць блакіроўку электроннай пошты create_custom_emoji: Стварыць адвольны эмодзі create_domain_allow: Стварыць даменны дазвол create_domain_block: Стварыць даменны блок + create_email_domain_block: Стварыць даменны блок электроннай пошты create_ip_block: Стварыць IP правіла create_unavailable_domain: Стварыць недаступны Дамен create_user_role: Стварыць ролю demote_user: Панізіць карыстальніка destroy_announcement: Выдаліць аб'яву + destroy_canonical_email_block: Выдаліць блакіроўку электроннай пошты destroy_custom_emoji: Выдаліць адвольны эмодзі destroy_domain_allow: Выдаліць дамены дазвол destroy_domain_block: Выдаліць даменны блок + destroy_email_domain_block: Выдаліць даменны блок электроннай пошты destroy_instance: Вычысціць дамен destroy_ip_block: Выдаліць IP правіла destroy_status: Выдаліць допіс @@ -197,8 +204,10 @@ be: destroy_user_role: Выдаліць ролю disable_2fa_user: Адключыць двухэтапнае спраўджанне disable_custom_emoji: Адключыць адвольныя эмодзі + disable_sign_in_token_auth_user: Адключыць аўтарызацыю праз электронную пошту для карыстальніка disable_user: Адключыць карыстальніка enable_custom_emoji: Уключыць адвольныя эмодзі + enable_sign_in_token_auth_user: Уключыць аўтарызацыю праз электронную пошту для карыстальніка enable_user: Уключыць карыстальніка memorialize_account: Запомніць уліковы запіс promote_user: Павысіць правы Карыстальніка @@ -228,20 +237,26 @@ be: approve_appeal_html: Карыстальнік %{name} ухваліў запыт на мадэрацыю %{target} approve_user_html: "%{name} пацвердзіў рэгістрацыю ад %{target}" assigned_to_self_report_html: "%{name} прызначыў справаздачу %{target} на сябе\n" + change_email_user_html: "%{name} змяніў паштовы адрас карыстальніка %{target}" change_role_user_html: "%{name} змяніў ролю %{target}" + confirm_user_html: "%{name} пацвердзіў паштовы адрас %{target}" create_account_warning_html: "%{name} накіраваў папярэджанне %{target}" create_announcement_html: "%{name} зрабіў новую аб'яву %{target}" + create_canonical_email_block_html: "%{name} заблакіраваў эл. пошту з хэшам %{target}" create_custom_emoji_html: "%{name} загрузіў новы смайлік %{target}\n\n" create_domain_allow_html: "%{name} дазволіў федэрацыю з даменам %{target}" create_domain_block_html: "%{name} заблакіраваў дамен %{target}" + create_email_domain_block_html: "%{name} заблакіраваў дамен эл. пошты %{target}" create_ip_block_html: "%{name} стварыў правіла для IP %{target}" create_unavailable_domain_html: "%{name} прыпыніў дастаўку да дамена %{target}" create_user_role_html: "%{name} зрабіў ролю %{target}" demote_user_html: "%{name} прыбраў карыстальніка %{target}" destroy_announcement_html: "%{name} выдаліў аб'яву %{target}" + destroy_canonical_email_block_html: "%{name} разблакіраваў эл. пошту з хэшам %{target}" destroy_custom_emoji_html: "%{name} выдаліў(а) эмоджі %{target}" destroy_domain_allow_html: "%{name} зняў дазвол на аб'яднанне з даменам %{target}\n" destroy_domain_block_html: "%{name} разблакаваў дамен %{target}" + destroy_email_domain_block_html: "%{name} разблакіраваў дамен эл. пошты %{target}" destroy_instance_html: "%{name} цалкам прыбраў дамен %{target}" destroy_ip_block_html: "%{name} выдаліў правіла для IP %{target}" destroy_status_html: "%{name} выдаліў допіс %{target}" @@ -249,8 +264,10 @@ be: destroy_user_role_html: "%{name} выдаліў ролю %{target}" disable_2fa_user_html: "%{name} амяніў абавязковую двухфактарную верыфікацыю для карыстальніка %{target}" disable_custom_emoji_html: "%{name} заблакіраваў эмодзі %{target}" + disable_sign_in_token_auth_user_html: "%{name} адключыў уваход праз эл. пошту для %{target}" disable_user_html: "%{name} адключыў уваход для карыстальніка %{target}" enable_custom_emoji_html: "%{name} уключыў эмодзі %{target}" + enable_sign_in_token_auth_user_html: "%{name} уключыў уваход праз эл. пошту для %{target}" enable_user_html: "%{name} уключыў уваход для карыстальніка %{target}" memorialize_account_html: Карыстальнік %{name} пераключыў уліковы запіс %{target} у старонку памяці promote_user_html: "%{name} павысіў карыстальніка %{target}" @@ -258,6 +275,7 @@ be: reject_user_html: "%{name} адхіліў рэгістрацыю з %{target}" remove_avatar_user_html: "%{name} выдаліў аватар %{target}" reopen_report_html: "%{name} зноў адкрыў скаргу %{target}" + resend_user_html: "%{name} зноў адправіў ліст з пацвярджэннем для %{target}" reset_password_user_html: "%{name} скінул(а) пароль для %{target}" resolve_report_html: "%{name} вырашыў скаргу %{target}" sensitive_account_html: "%{name} адзначыў медыя %{target} як далікатнае" @@ -428,6 +446,7 @@ be: many: "%{count} спроб рэгіістрацыі за апошні тыдзень" one: "%{count} спроба рэгістрацыі за апошні тыдзень" other: "%{count} спроб рэгіістрацыі за апошні тыдзень" + created_msg: Дамен эл. пошты паспяхова заблакіраваны delete: Выдаліць dns: types: @@ -436,8 +455,11 @@ be: new: create: Дадаць дамен resolve: Вызначыць дамен + title: Заблакіраваць новы дамен эл. пошты not_permitted: Забаронена + resolved_dns_records_hint_html: Даменнае імя ператвараецца ў наступныя дамены MX, якія ў канчатковым выніку адказваюць за прыём электроннай пошты. Блакаванне дамена MX заблакуе рэгістрацыю з любога адраса электроннай пошты, які выкарыстоўвае той жа дамен MX, нават калі бачнае імя дамена адрозніваецца. Будзьце асцярожныя, каб не заблакіраваць асноўных пастаўшчыкоў электроннай пошты. resolved_through_html: Вызначына каля %{domain} + title: Заблакіраваныя паштовыя дамены export_domain_allows: new: title: Імпарт дазволаў дамена @@ -599,6 +621,7 @@ be: resolve_description_html: Ніякіх дзеянняў супраць уліковага запісу, пра які паведамляецца, не будзе, папярэджэнне не зафіксавана, і скарга будзе закрыта. silence_description_html: Уліковы запіс будзе бачны толькі тым, хто ўжо сочыць за ім або шукае яго ўручную, што значна абмяжоўвае яго ахоп. Заўсёды можна вярнуць. Закрывае ўсе скаргі на гэты ўліковы запіс. suspend_description_html: Уліковы запіс і ўсё яго змесціва будзе недаступна і ў далейшым выдалены, узаемадзеянне з ім будзе немагчыма. Магчыма адмяніць на працягу 30 дзён. Закрывае ўсе скаргі на гэты ўліковы запіс. + actions_description_html: Вырашыце, якія дзеянні распачаць, каб вырашыць гэтую скаргу. Калі вы прымеце меры пакарання ў дачыненні да ўліковага запісу, пра які паведамляецца, ім будзе адпраўлена апавяшчэнне па электроннай пошце, за выключэннем выпадкаў, калі выбрана катэгорыя Спам. actions_description_remote_html: Вырашыце як паступіць з гэтай скаргай. Гэта паўплывае толькі на тое як ваш сервер звязваецца з аддалёным уліковым запісам і апрацоўвае яго кантэнт. add_to_report: Дадаць яшчэ дэталяў да скаргі already_suspended_badges: @@ -663,6 +686,7 @@ be: delete_data_html: Выдаліць профіль @%{acct} і змесціва праз 30 дзён, калі тым часам гэтае дзеянне не будзе адменена preview_preamble_html: "@%{acct} атрымае папярэджанне наступнага зместу:" record_strike_html: Зарэгістраваць папярэджанне @%{acct}, каб дапамагчы вам эскаліраваць наступныя парушэнні з боку таго ж уліковага запісу + send_email_html: Адправіць @%{acct} папярэджанне па электроннай пошце warning_placeholder: Неабавязковае дадатковае абгрунтаванне мадэрацыі. target_origin: Крыніца уліковага запісу на які пададзена скарга title: Скаргі @@ -706,6 +730,7 @@ be: manage_appeals: Кіраванне апеляцыямі manage_appeals_description: Дазваляе карыстальнікам разглядаць апеляцыі на дзеянні мадэратара manage_blocks: Кіраванне блакіроўкамі + manage_blocks_description: Дазваляе блакаваць пэўныя паштовыя правайдэры і IP адрасы manage_custom_emojis: Кіраванне адвольнымі эмодзі manage_custom_emojis_description: Дазваляе кіраваць адвольнымі эмодзі на серверы manage_federation: Кіраваць федэрацыяй @@ -723,6 +748,7 @@ be: manage_taxonomies: Кіраванне катэгорыямі manage_taxonomies_description: Дазваляе карыстальнікам праглядаць папулярны кантэнт і абнаўляць налады хэштэгаў manage_user_access: Кіраванне наладамі доступу карыстальнікаў + manage_user_access_description: Дазваляе адключаць двухфактарную аўтэнтыфікацыю іншым карыстальнікам, змяняць іх паштовы адрас і скідваць пароль manage_users: Кіраванне карыстальнікамі manage_users_description: Дазваляе праглядаць звесткі іншых карыстальнікаў і іх мадэрацыю manage_webhooks: Кіраванне вэбхукамі @@ -797,6 +823,7 @@ be: destroyed_msg: Загрузка сайту паспяхова выдалена! software_updates: critical_update: Крытычна - зрабіце абнаўленне як мага хутчэй + description: Рэкамендуецца падтрымліваць усталёўку Mastodon у актуальным стане, каб карыстацца апошнімі выпраўленнямі і магчымасцямі. Акрамя таго, часам вельмі важна своечасова абнаўляць Mastodon, каб пазбегнуць праблем з бяспекай. Па гэтых прычынах Mastodon правярае наяўнасць абнаўленняў кожныя 30 хвілін і паведамляе вам пра гэта ў адпаведнасці з вашымі наладамі апавяшчэнняў па электроннай пошце. documentation_link: Даведацца больш release_notes: Журнал змен title: Даступныя абнаўленні @@ -970,6 +997,7 @@ be: many: Выкарысталі %{count} чалавек за апошні тыдзень one: Выкарыстаў адзін чалавек за апошні тыдзень other: Выкарысталі %{count} чалавек за апошні тыдзень + title: Рэкамендацыі і трэнды trending: Папулярныя warning_presets: add_new: Дадаць новы @@ -1056,7 +1084,9 @@ be: guide_link_text: Кожны і кожная можа зрабіць унёсак. sensitive_content: Далікатны змест application_mailer: + notification_preferences: Змяніць налады эл. пошты salutation: "%{name}," + settings: 'Змяніць налады эл. пошты: %{link}' unsubscribe: Адпісацца view: 'Паглядзець:' view_profile: Паглядзець профіль @@ -1076,6 +1106,7 @@ be: hint_html: Засталася яшчэ адна рэч! Каб не дапусціць спаму, нам трэба пацвердзіць, што вы чалавек. Разгадайце CAPTCHA ніжэй і націсніце «Працягнуць». title: Праверка бяспекі confirmations: + awaiting_review: Ваш электронны адрас пацверджаны! Адміністрацыя %{domain} зараз разглядае вашу рэгістрацыю. Вы атрымаеце паведамленне па электроннай пошце, калі ваш уліковы запіс будзе ўхвалены! awaiting_review_title: Ваша рэгістрацыя разглядаецца clicking_this_link: націснуць на гэту спасылку login_link: увайсці @@ -1083,6 +1114,7 @@ be: redirect_to_app_html: Вы павінны былі быць перанакіраваны ў праграму %{app_name}. Калі гэтага не адбылося, паспрабуйце %{clicking_this_link} або вярніцеся да праграмы ўручную. registration_complete: Ваша рэгістрацыя на %{domain} завершана! welcome_title: Вітаем, %{name}! + wrong_email_hint: Калі гэты адрас электроннай пошты памылковы, вы можаце змяніць яго ў наладах уліковага запісу. delete_account: Выдаліць уліковы запіс delete_account_html: Калі вы жадаеце выдаліць ваш уліковы запіс, можаце працягнуць тут. Ад вас будзе запатрабавана пацвярджэнне. description: @@ -1103,6 +1135,7 @@ be: or_log_in_with: Або ўвайсці з дапамогай privacy_policy_agreement_html: Я азнаёміўся і пагаджаюся з палітыкай канфідэнцыйнасці progress: + confirm: Пацвердзіць email details: Вашы дадзеныя review: Наш водгук rules: Прыняць правілы @@ -1124,8 +1157,10 @@ be: security: Бяспека set_new_password: Прызначыць новы пароль setup: + email_below_hint_html: Праверце папку са спамам або зрабіце новы запыт. Вы можаце выправіць свой email, калі ён няправільны. email_settings_hint_html: Націсніце на спасылку, якую мы адправілі, каб спраўдзіць %{email}. Мы вас пачакаем тут. link_not_received: Не атрымалі спасылку? + new_confirmation_instructions_sent: Праз некалькі хвілін вы атрымаеце новы ліст на email са спасылкай для пацверджання! title: Праверце вашу пошту sign_in: preamble_html: Уваход з уліковымі дадзенымі %{domain}. Калі ваш уліковы запіс знаходзіцца на іншым серверы, у вас не атрымаецца ўвайсці тут. @@ -1136,7 +1171,9 @@ be: title: Наладзьма вас на %{domain}. status: account_status: Стан уліковага запісу + confirming: Чакаецца пацвярджэнне з электроннай пошты. functional: Ваш уліковы запіс поўнасцю працуе. + pending: Ваша заяўка разглядаецца нашым супрацоўнікам. Гэта можа заняць некаторы час. Вы атрымаеце электронны ліст, калі заяўка будзе ўхвалена. redirecting_to: Ваш уліковы запіс неактыўны, бо ў цяперашні час ён перанакіроўваецца на %{acct}. self_destruct: Паколькі %{domain} зачыняецца, вы атрымаеце толькі абмежаваны доступ да свайго уліковага запісу. view_strikes: Праглядзець мінулыя папярэджанні для вашага ўліковага запісу @@ -1179,6 +1216,9 @@ be: before: 'Перш чым працягнуць, уважліва прачытайце гэтыя заўвагі:' caches: Змесціва, кэшаванае іншымі серверамі, можа захавацца data_removal: Вашы допісы і іншыя даныя будуць выдалены назаўсёды + email_change_html: Вы можаце змяніць свой адрас электроннай пошты, не выдаляючы ўліковы запіс + email_contact_html: Калі ліст усё яшчэ не дайшоў, вы можаце звярнуцца па дапамогу на эл. пошту %{email} + email_reconfirmation_html: Калі вы не атрымалі пацвярджэнне па электроннай пошце, вы можаце запытаць яго зноў irreversible: Вы не зможаце аднавіць або паўторна актываваць свой уліковы запіс more_details_html: Падрабязнасці глядзіце ў палітыцы прыватнасці. username_available: Ваша імя карыстальніка зноў стане даступным @@ -1427,6 +1467,7 @@ be: authentication_methods: otp: праграма двухфактарнай аўтэнтыфікацыі password: пароль + sign_in_token: код з электроннай пошты webauthn: ключы бяспекі description_html: Калі вы бачыце невядомую вам актыўнасць, падумайце пра змену пароля і ўключэнне двухфактарнай аўтэнтыфікацыі. empty: Няма гісторыі ўваходаў @@ -1437,6 +1478,16 @@ be: unsubscribe: action: Так, адпісацца complete: Адпісаны + confirmation_html: Вы ўпэўнены, што жадаеце адмовіцца ад %{type} з Mastodon на дамене %{domain} на вашу электронную пошту %{email}? Вы заўсёды можаце паўторна падпісацца у наладах апавяшчэнняў па электроннай пошце. + emails: + notification_emails: + favourite: апавяшчэнні на пошту пра упадабанае + follow: апавяшчэнні на пошту пра падпіскі + follow_request: апавяшчэнні на пошту пра запыты на падпіску + mention: апавяшчэнні на пошту пра згадванні + reblog: апавяшчэнні на пошту пра пашырэнні + resubscribe_html: Калі вы адмовіліся ад падпіскі памылкова, вы можаце зноў падпісацца ў наладах апавяшчэнняў па электроннай пошце. + success_html: Вы больш не будзеце атрымліваць %{type} на сваю электронную пошту %{email} ад Mastodon на дамене %{domain}. title: Адпісацца media_attachments: validations: @@ -1517,6 +1568,8 @@ be: update: subject: "%{name} адрэдагаваў допіс" notifications: + administration_emails: Апавяшчэнні эл. пошты для адміністратара + email_events: Падзеі для апавяшчэнняў эл. пошты email_events_hint: 'Выберыце падзеі, аб якіх вы хочаце атрымліваць апавяшчэнні:' number: human: @@ -1675,6 +1728,7 @@ be: import: Імпарт import_and_export: Імпарт і экспарт migrate: Перамяшчэнне ўліковага запісу + notifications: Апавяшчэнні па эл. пошце preferences: Налады profile: Профіль relationships: Падпіскі і падпісчыкі @@ -1935,6 +1989,7 @@ be: invalid_otp_token: Няправільны код двухфактарнай аўтэнтыфікацыі otp_lost_help_html: Калі вы страцілі доступ да абодвух, вы можаце скарыстацца %{email} rate_limited: Занадта шмат спробаў аўтэнтыфікацыі, паспрабуйце пазней. + seamless_external_login: Вы ўвайшлі праз знешні сэрвіс, таму налады пароля і эл. пошты недаступныя. signed_in_as: 'Увайшлі як:' verification: extra_instructions_html: Парада: спасылка на вашым сайце можа быць нябачнай. Важнай часткай з'яўляецца rel="me", якая прадухіляе імперсанацыю на сайтах з карыстальніцкім кантэнтам. Вы нават можаце выкарыстоўваць тэг link у загалоўку старонкі замест a, але HTML павінен быць даступны без выканання JavaScript. From 71405eabfca60776b0351b022e61248861cce971 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 20 Aug 2024 07:48:15 -0400 Subject: [PATCH 13/26] Use material symbols in table link helper (#31359) --- app/helpers/admin/filter_helper.rb | 2 +- app/javascript/material-icons/400-24px/key.svg | 1 + app/javascript/material-icons/400-24px/toggle_off.svg | 5 +++++ app/javascript/material-icons/400-24px/toggle_on.svg | 5 +++++ app/views/admin/accounts/_local_account.html.haml | 10 +++++----- app/views/admin/accounts/_remote_account.html.haml | 2 +- app/views/admin/announcements/_announcement.html.haml | 6 +++--- app/views/admin/invites/_invite.html.haml | 2 +- app/views/admin/relays/_relay.html.haml | 6 +++--- app/views/admin/report_notes/_report_note.html.haml | 4 ++-- app/views/admin/reports/_header_details.html.haml | 4 ++-- app/views/admin/roles/_role.html.haml | 2 +- app/views/admin/rules/_rule.html.haml | 2 +- .../admin/warning_presets/_warning_preset.html.haml | 2 +- app/views/admin/webhooks/_webhook.html.haml | 4 ++-- app/views/admin/webhooks/show.html.haml | 4 ++-- app/views/auth/registrations/_session.html.haml | 2 +- app/views/filters/_filter.html.haml | 4 ++-- app/views/invites/_invite.html.haml | 2 +- .../oauth/authorized_applications/index.html.haml | 2 +- app/views/settings/aliases/index.html.haml | 2 +- app/views/settings/applications/index.html.haml | 2 +- app/views/settings/featured_tags/index.html.haml | 2 +- .../webauthn_credentials/index.html.haml | 2 +- .../two_factor_authentication_methods/index.html.haml | 4 ++-- 25 files changed, 47 insertions(+), 36 deletions(-) create mode 100644 app/javascript/material-icons/400-24px/key.svg create mode 100644 app/javascript/material-icons/400-24px/toggle_off.svg create mode 100644 app/javascript/material-icons/400-24px/toggle_on.svg diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 140fc73ede4124..40806a451586df 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -25,7 +25,7 @@ def filter_link_to(text, link_to_params, link_class_params = link_to_params) end def table_link_to(icon, text, path, **options) - link_to safe_join([fa_icon(icon), text]), path, options.merge(class: 'table-action-link') + link_to safe_join([material_symbol(icon), text]), path, options.merge(class: 'table-action-link') end def selected?(more_params) diff --git a/app/javascript/material-icons/400-24px/key.svg b/app/javascript/material-icons/400-24px/key.svg new file mode 100644 index 00000000000000..bba7f1de9d5ce7 --- /dev/null +++ b/app/javascript/material-icons/400-24px/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/toggle_off.svg b/app/javascript/material-icons/400-24px/toggle_off.svg new file mode 100644 index 00000000000000..dcef49f69c15ef --- /dev/null +++ b/app/javascript/material-icons/400-24px/toggle_off.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/toggle_on.svg b/app/javascript/material-icons/400-24px/toggle_on.svg new file mode 100644 index 00000000000000..943b6e6d332b9f --- /dev/null +++ b/app/javascript/material-icons/400-24px/toggle_on.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/views/admin/accounts/_local_account.html.haml b/app/views/admin/accounts/_local_account.html.haml index 3ed392cd1a53db..3ad47d8dfb8cdf 100644 --- a/app/views/admin/accounts/_local_account.html.haml +++ b/app/views/admin/accounts/_local_account.html.haml @@ -1,12 +1,12 @@ - if account.avatar? %tr %th= t('admin.accounts.avatar') - %td= table_link_to 'trash', t('admin.accounts.remove_avatar'), remove_avatar_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_avatar, account) + %td= table_link_to 'delete', t('admin.accounts.remove_avatar'), remove_avatar_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_avatar, account) %td - if account.header? %tr %th= t('admin.accounts.header') - %td= table_link_to 'trash', t('admin.accounts.remove_header'), remove_header_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_header, account) + %td= table_link_to 'delete', t('admin.accounts.remove_header'), remove_header_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_header, account) %td %tr %th= t('admin.accounts.role') @@ -16,7 +16,7 @@ - else = account.user_role&.name %td - = table_link_to 'vcard', t('admin.accounts.change_role.label'), admin_user_role_path(account.user) if can?(:change_role, account.user) + = table_link_to 'contact_mail', t('admin.accounts.change_role.label'), admin_user_role_path(account.user) if can?(:change_role, account.user) %tr %th{ rowspan: can?(:create, :email_domain_block) ? 3 : 2 }= t('admin.accounts.email') %td{ rowspan: can?(:create, :email_domain_block) ? 3 : 2 }= account.user_email @@ -25,7 +25,7 @@ %td= table_link_to 'search', t('admin.accounts.search_same_email_domain'), admin_accounts_path(email: "%@#{account.user_email.split('@').last}") - if can?(:create, :email_domain_block) %tr - %td= table_link_to 'ban', t('admin.accounts.add_email_domain_block'), new_admin_email_domain_block_path(_domain: account.user_email.split('@').last) + %td= table_link_to 'hide_source', t('admin.accounts.add_email_domain_block'), new_admin_email_domain_block_path(_domain: account.user_email.split('@').last) - if account.user_unconfirmed_email.present? %tr %th= t('admin.accounts.unconfirmed_email') @@ -48,7 +48,7 @@ = t 'admin.accounts.security_measures.only_password' %td - if account.user&.two_factor_enabled? && can?(:disable_2fa, account.user) - = table_link_to 'unlock', t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(account.user.id), method: :delete + = table_link_to 'lock_open', t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(account.user.id), method: :delete - if can?(:reset_password, account.user) %tr %td diff --git a/app/views/admin/accounts/_remote_account.html.haml b/app/views/admin/accounts/_remote_account.html.haml index 6755af2496c10c..a052e877f43f12 100644 --- a/app/views/admin/accounts/_remote_account.html.haml +++ b/app/views/admin/accounts/_remote_account.html.haml @@ -12,4 +12,4 @@ = material_symbol DeliveryFailureTracker.available?(account.shared_inbox_url) ? 'check' : 'close' %td - if domain_block.nil? - = table_link_to 'ban', t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: account.domain) + = table_link_to 'hide_source', t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: account.domain) diff --git a/app/views/admin/announcements/_announcement.html.haml b/app/views/admin/announcements/_announcement.html.haml index 1c7f89ef21a43c..eac78efb2889b6 100644 --- a/app/views/admin/announcements/_announcement.html.haml +++ b/app/views/admin/announcements/_announcement.html.haml @@ -12,8 +12,8 @@ %div - if can?(:update, announcement) - if announcement.published? - = table_link_to 'toggle-off', t('admin.announcements.unpublish'), unpublish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'toggle_off', t('admin.announcements.unpublish'), unpublish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - else - = table_link_to 'toggle-on', t('admin.announcements.publish'), publish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'toggle_on', t('admin.announcements.publish'), publish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - = table_link_to 'trash', t('generic.delete'), admin_announcement_path(announcement), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, announcement) + = table_link_to 'delete', t('generic.delete'), admin_announcement_path(announcement), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, announcement) diff --git a/app/views/admin/invites/_invite.html.haml b/app/views/admin/invites/_invite.html.haml index f9cd6003f3da81..8bd5f10feefdc6 100644 --- a/app/views/admin/invites/_invite.html.haml +++ b/app/views/admin/invites/_invite.html.haml @@ -27,4 +27,4 @@ %td - if invite.valid_for_use? && policy(invite).destroy? - = table_link_to 'times', t('invites.delete'), admin_invite_path(invite), method: :delete + = table_link_to 'close', t('invites.delete'), admin_invite_path(invite), method: :delete diff --git a/app/views/admin/relays/_relay.html.haml b/app/views/admin/relays/_relay.html.haml index 2e76f5430838be..9e9f629eee12d5 100644 --- a/app/views/admin/relays/_relay.html.haml +++ b/app/views/admin/relays/_relay.html.haml @@ -18,8 +18,8 @@ = t 'admin.relays.disabled' %td - if relay.accepted? - = table_link_to 'power-off', t('admin.relays.disable'), disable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'power_off', t('admin.relays.disable'), disable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - elsif !relay.pending? - = table_link_to 'power-off', t('admin.relays.enable'), enable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'power_off', t('admin.relays.enable'), enable_admin_relay_path(relay), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - = table_link_to 'times', t('admin.relays.delete'), admin_relay_path(relay), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'close', t('admin.relays.delete'), admin_relay_path(relay), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } diff --git a/app/views/admin/report_notes/_report_note.html.haml b/app/views/admin/report_notes/_report_note.html.haml index 64628989a6a743..dd60f7eabd07e8 100644 --- a/app/views/admin/report_notes/_report_note.html.haml +++ b/app/views/admin/report_notes/_report_note.html.haml @@ -13,6 +13,6 @@ - if can?(:destroy, report_note) .report-notes__item__actions - if report_note.is_a?(AccountModerationNote) - = table_link_to 'trash', t('admin.reports.notes.delete'), admin_account_moderation_note_path(report_note), method: :delete + = table_link_to 'delete', t('admin.reports.notes.delete'), admin_account_moderation_note_path(report_note), method: :delete - else - = table_link_to 'trash', t('admin.reports.notes.delete'), admin_report_note_path(report_note), method: :delete + = table_link_to 'delete', t('admin.reports.notes.delete'), admin_report_note_path(report_note), method: :delete diff --git a/app/views/admin/reports/_header_details.html.haml b/app/views/admin/reports/_header_details.html.haml index 434231f7333626..cf81670845fddb 100644 --- a/app/views/admin/reports/_header_details.html.haml +++ b/app/views/admin/reports/_header_details.html.haml @@ -54,6 +54,6 @@ = admin_account_link_to report.assigned_account — - if report.assigned_account != current_user.account - = table_link_to 'user', t('admin.reports.assign_to_self'), assign_to_self_admin_report_path(report), method: :post + = table_link_to 'person', t('admin.reports.assign_to_self'), assign_to_self_admin_report_path(report), method: :post - elsif !report.assigned_account.nil? - = table_link_to 'trash', t('admin.reports.unassign'), unassign_admin_report_path(report), method: :post + = table_link_to 'delete', t('admin.reports.unassign'), unassign_admin_report_path(report), method: :post diff --git a/app/views/admin/roles/_role.html.haml b/app/views/admin/roles/_role.html.haml index fd37644c835f90..636127354b0da7 100644 --- a/app/views/admin/roles/_role.html.haml +++ b/app/views/admin/roles/_role.html.haml @@ -27,4 +27,4 @@ · %abbr{ title: role.permissions_as_keys.map { |privilege| I18n.t("admin.roles.privileges.#{privilege}") }.join(', ') }= t('admin.roles.permissions_count', count: role.permissions_as_keys.size) %div - = table_link_to 'pencil', t('admin.accounts.edit'), edit_admin_role_path(role) if can?(:update, role) + = table_link_to 'edit', t('admin.accounts.edit'), edit_admin_role_path(role) if can?(:update, role) diff --git a/app/views/admin/rules/_rule.html.haml b/app/views/admin/rules/_rule.html.haml index 5f37f693543702..eb97eefb3c7fe7 100644 --- a/app/views/admin/rules/_rule.html.haml +++ b/app/views/admin/rules/_rule.html.haml @@ -8,4 +8,4 @@ = rule.hint %div - = table_link_to 'trash', t('admin.rules.delete'), admin_rule_path(rule), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, rule) + = table_link_to 'delete', t('admin.rules.delete'), admin_rule_path(rule), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, rule) diff --git a/app/views/admin/warning_presets/_warning_preset.html.haml b/app/views/admin/warning_presets/_warning_preset.html.haml index a58199c80469a6..2cc056420f4aa9 100644 --- a/app/views/admin/warning_presets/_warning_preset.html.haml +++ b/app/views/admin/warning_presets/_warning_preset.html.haml @@ -7,4 +7,4 @@ = truncate(warning_preset.text) %div - = table_link_to 'trash', t('admin.warning_presets.delete'), admin_warning_preset_path(warning_preset), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, warning_preset) + = table_link_to 'delete', t('admin.warning_presets.delete'), admin_warning_preset_path(warning_preset), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, warning_preset) diff --git a/app/views/admin/webhooks/_webhook.html.haml b/app/views/admin/webhooks/_webhook.html.haml index 39abb7dd2c7608..dca5abeb7779af 100644 --- a/app/views/admin/webhooks/_webhook.html.haml +++ b/app/views/admin/webhooks/_webhook.html.haml @@ -15,5 +15,5 @@ %abbr{ title: webhook.events.join(', ') }= t('admin.webhooks.enabled_events', count: webhook.events.size) %div - = table_link_to 'pencil', t('admin.webhooks.edit'), edit_admin_webhook_path(webhook) if can?(:update, webhook) - = table_link_to 'trash', t('admin.webhooks.delete'), admin_webhook_path(webhook), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, webhook) + = table_link_to 'edit', t('admin.webhooks.edit'), edit_admin_webhook_path(webhook) if can?(:update, webhook) + = table_link_to 'delete', t('admin.webhooks.delete'), admin_webhook_path(webhook), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, webhook) diff --git a/app/views/admin/webhooks/show.html.haml b/app/views/admin/webhooks/show.html.haml index c2c4f55788e38a..a389e611029933 100644 --- a/app/views/admin/webhooks/show.html.haml +++ b/app/views/admin/webhooks/show.html.haml @@ -19,10 +19,10 @@ %td - if @webhook.enabled? %span.positive-hint= t('admin.webhooks.enabled') - = table_link_to 'power-off', t('admin.webhooks.disable'), disable_admin_webhook_path(@webhook), method: :post if can?(:disable, @webhook) + = table_link_to 'power_off', t('admin.webhooks.disable'), disable_admin_webhook_path(@webhook), method: :post if can?(:disable, @webhook) - else %span.negative-hint= t('admin.webhooks.disabled') - = table_link_to 'power-off', t('admin.webhooks.enable'), enable_admin_webhook_path(@webhook), method: :post if can?(:enable, @webhook) + = table_link_to 'power_off', t('admin.webhooks.enable'), enable_admin_webhook_path(@webhook), method: :post if can?(:enable, @webhook) %tr %th= t('admin.webhooks.events') %td diff --git a/app/views/auth/registrations/_session.html.haml b/app/views/auth/registrations/_session.html.haml index 2fa7db70c7bbf3..631ae0460161c1 100644 --- a/app/views/auth/registrations/_session.html.haml +++ b/app/views/auth/registrations/_session.html.haml @@ -15,4 +15,4 @@ %time.time-ago{ datetime: session.updated_at.iso8601, title: l(session.updated_at) }= l(session.updated_at) %td - if current_session.session_id != session.session_id && !current_account.suspended? - = table_link_to 'times', t('sessions.revoke'), settings_session_path(session), method: :delete + = table_link_to 'close', t('sessions.revoke'), settings_session_path(session), method: :delete diff --git a/app/views/filters/_filter.html.haml b/app/views/filters/_filter.html.haml index 9993ad2ee8eaa5..9d82a979fefada 100644 --- a/app/views/filters/_filter.html.haml +++ b/app/views/filters/_filter.html.haml @@ -37,5 +37,5 @@ = t('filters.index.contexts', contexts: filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ')) %div - = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter) - = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'edit', t('filters.edit.title'), edit_filter_path(filter) + = table_link_to 'close', t('filters.index.delete'), filter_path(filter), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } diff --git a/app/views/invites/_invite.html.haml b/app/views/invites/_invite.html.haml index 62799ca5be20ef..d332dc5a4d5dd7 100644 --- a/app/views/invites/_invite.html.haml +++ b/app/views/invites/_invite.html.haml @@ -22,4 +22,4 @@ %td - if invite.valid_for_use? && policy(invite).destroy? - = table_link_to 'times', t('invites.delete'), invite_path(invite), method: :delete + = table_link_to 'close', t('invites.delete'), invite_path(invite), method: :delete diff --git a/app/views/oauth/authorized_applications/index.html.haml b/app/views/oauth/authorized_applications/index.html.haml index 92e24d30c8597d..009bbf8d85c994 100644 --- a/app/views/oauth/authorized_applications/index.html.haml +++ b/app/views/oauth/authorized_applications/index.html.haml @@ -29,7 +29,7 @@ - unless application.superapp? || current_account.unavailable? %div - = table_link_to 'times', t('doorkeeper.authorized_applications.buttons.revoke'), oauth_authorized_application_path(application), method: :delete, data: { confirm: t('doorkeeper.authorized_applications.confirmations.revoke') } + = table_link_to 'close', t('doorkeeper.authorized_applications.buttons.revoke'), oauth_authorized_application_path(application), method: :delete, data: { confirm: t('doorkeeper.authorized_applications.confirmations.revoke') } .announcements-list__item__permissions %ul.permissions-list diff --git a/app/views/settings/aliases/index.html.haml b/app/views/settings/aliases/index.html.haml index c618a82f1dd65b..81c49c82031e9b 100644 --- a/app/views/settings/aliases/index.html.haml +++ b/app/views/settings/aliases/index.html.haml @@ -30,4 +30,4 @@ - @aliases.each do |account_alias| %tr %td= account_alias.pretty_acct - %td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete } + %td= table_link_to 'delete', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete } diff --git a/app/views/settings/applications/index.html.haml b/app/views/settings/applications/index.html.haml index 5c31d56bca572c..80eaed5c3994f8 100644 --- a/app/views/settings/applications/index.html.haml +++ b/app/views/settings/applications/index.html.haml @@ -20,6 +20,6 @@ %td= link_to application.name, settings_application_path(application) %th= application.scopes %td - = table_link_to 'times', t('doorkeeper.applications.index.delete'), settings_application_path(application), method: :delete, data: { confirm: t('doorkeeper.applications.confirmations.destroy') } + = table_link_to 'close', t('doorkeeper.applications.index.delete'), settings_application_path(application), method: :delete, data: { confirm: t('doorkeeper.applications.confirmations.destroy') } = paginate @applications diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml index 4b6c019e69b250..088a93bc595a14 100644 --- a/app/views/settings/featured_tags/index.html.haml +++ b/app/views/settings/featured_tags/index.html.haml @@ -31,5 +31,5 @@ = t('accounts.nothing_here') - else %time.formatted{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at - = table_link_to 'trash', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } + = table_link_to 'delete', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } .trends__item__current= friendly_number_to_human featured_tag.statuses_count diff --git a/app/views/settings/two_factor_authentication/webauthn_credentials/index.html.haml b/app/views/settings/two_factor_authentication/webauthn_credentials/index.html.haml index 0dfd94ab9dcf58..3ea5810207fe3d 100644 --- a/app/views/settings/two_factor_authentication/webauthn_credentials/index.html.haml +++ b/app/views/settings/two_factor_authentication/webauthn_credentials/index.html.haml @@ -9,7 +9,7 @@ %td= credential.nickname %td= t('webauthn_credentials.registered_on', date: l(credential.created_at.to_date, format: :with_month_name)) %td - = table_link_to 'trash', t('webauthn_credentials.delete'), settings_webauthn_credential_path(credential.id), method: :delete, data: { confirm: t('webauthn_credentials.delete_confirmation') } + = table_link_to 'delete', t('webauthn_credentials.delete'), settings_webauthn_credential_path(credential.id), method: :delete, data: { confirm: t('webauthn_credentials.delete_confirmation') } %hr.spacer/ diff --git a/app/views/settings/two_factor_authentication_methods/index.html.haml b/app/views/settings/two_factor_authentication_methods/index.html.haml index 2e4ff4091c7b51..8b670283b9e089 100644 --- a/app/views/settings/two_factor_authentication_methods/index.html.haml +++ b/app/views/settings/two_factor_authentication_methods/index.html.haml @@ -20,12 +20,12 @@ %tr %td= t('two_factor_authentication.otp') %td - = table_link_to 'pencil', t('two_factor_authentication.edit'), settings_otp_authentication_path, method: :post + = table_link_to 'edit', t('two_factor_authentication.edit'), settings_otp_authentication_path, method: :post %tr %td= t('two_factor_authentication.webauthn') - if current_user.webauthn_enabled? %td - = table_link_to 'pencil', t('two_factor_authentication.edit'), settings_webauthn_credentials_path, method: :get + = table_link_to 'edit', t('two_factor_authentication.edit'), settings_webauthn_credentials_path, method: :get - else %td = table_link_to 'key', t('two_factor_authentication.add'), new_settings_webauthn_credential_path, method: :get From 3be1b1eaaee1e315e4612012f431619b20861107 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 20 Aug 2024 07:52:27 -0400 Subject: [PATCH 14/26] Use material symbol for filters/statuses views (#31371) --- app/views/disputes/strikes/_card.html.haml | 2 +- app/views/filters/statuses/_status_filter.html.haml | 4 ++-- app/views/filters/statuses/index.html.haml | 4 ++-- app/views/statuses/_attachment_list.html.haml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/disputes/strikes/_card.html.haml b/app/views/disputes/strikes/_card.html.haml index 55551cc7d0482b..58965ad6006ffe 100644 --- a/app/views/disputes/strikes/_card.html.haml +++ b/app/views/disputes/strikes/_card.html.haml @@ -24,7 +24,7 @@ .emojify= one_line_preview(status) - status.ordered_media_attachments.each do |media_attachment| %abbr{ title: media_attachment.description } - = fa_icon 'link' + = material_symbol 'link' = media_attachment.file_file_name .strike-card__statuses-list__item__meta = link_to ActivityPub::TagManager.instance.url_for(status), target: '_blank', rel: 'noopener noreferrer' do diff --git a/app/views/filters/statuses/_status_filter.html.haml b/app/views/filters/statuses/_status_filter.html.haml index 9999dcda81fda5..31aa9ec23772c1 100644 --- a/app/views/filters/statuses/_status_filter.html.haml +++ b/app/views/filters/statuses/_status_filter.html.haml @@ -15,7 +15,7 @@ - status.ordered_media_attachments.each do |media_attachment| %abbr{ title: media_attachment.description } - = fa_icon 'link' + = material_symbol 'link' = media_attachment.file_file_name .detailed-status__meta @@ -33,5 +33,5 @@ = t("statuses.visibilities.#{status.visibility}") - if status.sensitive? · - = fa_icon('eye-slash fw') + = material_symbol 'visibility_off' = t('stream_entries.sensitive_content') diff --git a/app/views/filters/statuses/index.html.haml b/app/views/filters/statuses/index.html.haml index 915ec59cafdef3..f9f94eee90dd3f 100644 --- a/app/views/filters/statuses/index.html.haml +++ b/app/views/filters/statuses/index.html.haml @@ -6,7 +6,7 @@ .filters .back-link = link_to edit_filter_path(@filter) do - = fa_icon 'chevron-left fw' + = material_symbol 'chevron_left' = t('filters.statuses.back_to_filter') %p.hint= t('filters.statuses.index.hint') @@ -25,7 +25,7 @@ = check_box_tag :batch_checkbox_all, nil, false .batch-table__toolbar__actions - unless @status_filters.empty? - = f.button safe_join([fa_icon('times'), t('filters.statuses.batch.remove')]), name: :remove, class: 'table-action-link', type: :submit + = f.button safe_join([material_symbol('close'), t('filters.statuses.batch.remove')]), name: :remove, class: 'table-action-link', type: :submit .batch-table__body - if @status_filters.empty? = nothing_here 'nothing-here--under-tabs' diff --git a/app/views/statuses/_attachment_list.html.haml b/app/views/statuses/_attachment_list.html.haml index d9706f47bd849a..a150a3fae9d005 100644 --- a/app/views/statuses/_attachment_list.html.haml +++ b/app/views/statuses/_attachment_list.html.haml @@ -1,6 +1,6 @@ .attachment-list .attachment-list__icon - = fa_icon 'link' + = material_symbol 'link' %ul.attachment-list__list - attachments.each do |media| %li From fa2e7b1708385c4277a67f04e540cc39fc661390 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 20 Aug 2024 07:52:45 -0400 Subject: [PATCH 15/26] Migrate fontawesome->material in more views (#31360) --- app/helpers/application_helper.rb | 3 ++- app/helpers/settings_helper.rb | 4 ++-- app/javascript/material-icons/400-24px/chat.svg | 5 +++++ .../material-icons/400-24px/desktop_mac.svg | 5 +++++ .../material-icons/400-24px/format_paragraph.svg | 5 +++++ .../material-icons/400-24px/smartphone.svg | 5 +++++ app/javascript/material-icons/400-24px/tablet.svg | 5 +++++ app/javascript/styles/mastodon/accounts.scss | 2 +- app/views/application/_card.html.haml | 2 +- .../auth/registrations/_account_warning.html.haml | 2 +- app/views/auth/registrations/_session.html.haml | 2 +- app/views/disputes/strikes/show.html.haml | 4 ++-- app/views/filters/_filter.html.haml | 4 ++-- app/views/filters/_filter_fields.html.haml | 2 +- app/views/filters/_keyword_fields.html.haml | 2 +- app/views/invites/_invite.html.haml | 2 +- app/views/kaminari/_next_page.html.haml | 2 +- app/views/kaminari/_prev_page.html.haml | 2 +- app/views/oauth/authorizations/new.html.haml | 2 +- .../oauth/authorized_applications/index.html.haml | 2 +- app/views/relationships/show.html.haml | 8 ++++---- app/views/statuses/_detailed_status.html.haml | 10 +++++----- app/views/statuses/_simple_status.html.haml | 14 +++++++------- spec/helpers/application_helper_spec.rb | 9 +++++++++ spec/helpers/settings_helper_spec.rb | 4 ++-- 25 files changed, 71 insertions(+), 36 deletions(-) create mode 100644 app/javascript/material-icons/400-24px/chat.svg create mode 100644 app/javascript/material-icons/400-24px/desktop_mac.svg create mode 100644 app/javascript/material-icons/400-24px/format_paragraph.svg create mode 100644 app/javascript/material-icons/400-24px/smartphone.svg create mode 100644 app/javascript/material-icons/400-24px/tablet.svg diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a6ab4044bcba8c..20da199d437800 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -117,7 +117,8 @@ def material_symbol(icon, attributes = {}) inline_svg_tag( "400-24px/#{icon}.svg", class: ['icon', "material-#{icon}"].concat(attributes[:class].to_s.split), - role: :img + role: :img, + data: attributes[:data] ) end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 10863a316c93b8..64f2ad70a66e16 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -26,11 +26,11 @@ def session_device_icon(session) device = session.detection.device if device.mobile? - 'mobile' + 'smartphone' elsif device.tablet? 'tablet' else - 'desktop' + 'desktop_mac' end end diff --git a/app/javascript/material-icons/400-24px/chat.svg b/app/javascript/material-icons/400-24px/chat.svg new file mode 100644 index 00000000000000..7369e6f847a268 --- /dev/null +++ b/app/javascript/material-icons/400-24px/chat.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/desktop_mac.svg b/app/javascript/material-icons/400-24px/desktop_mac.svg new file mode 100644 index 00000000000000..5d2a07a3698c48 --- /dev/null +++ b/app/javascript/material-icons/400-24px/desktop_mac.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/format_paragraph.svg b/app/javascript/material-icons/400-24px/format_paragraph.svg new file mode 100644 index 00000000000000..657b483c00cd01 --- /dev/null +++ b/app/javascript/material-icons/400-24px/format_paragraph.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/smartphone.svg b/app/javascript/material-icons/400-24px/smartphone.svg new file mode 100644 index 00000000000000..fa56825488f3c9 --- /dev/null +++ b/app/javascript/material-icons/400-24px/smartphone.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/tablet.svg b/app/javascript/material-icons/400-24px/tablet.svg new file mode 100644 index 00000000000000..09a5fe6bb1a91a --- /dev/null +++ b/app/javascript/material-icons/400-24px/tablet.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 894332acb5868d..3f70a7d234327c 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -66,7 +66,7 @@ margin-inline-start: 15px; text-align: start; - i[data-hidden] { + svg[data-hidden] { display: none; } diff --git a/app/views/application/_card.html.haml b/app/views/application/_card.html.haml index 1b3dd889c19b22..ae74f1dc638a17 100644 --- a/app/views/application/_card.html.haml +++ b/app/views/application/_card.html.haml @@ -15,4 +15,4 @@ %strong.emojify.p-name= display_name(account, custom_emojify: true) %span = acct(account) - = fa_icon('lock', { data: ({ hidden: true } unless account.locked?) }) + = material_symbol('lock', { data: ({ hidden: true } unless account.locked?) }) diff --git a/app/views/auth/registrations/_account_warning.html.haml b/app/views/auth/registrations/_account_warning.html.haml index c51179b49dad8e..d558e1d9c96fe3 100644 --- a/app/views/auth/registrations/_account_warning.html.haml +++ b/app/views/auth/registrations/_account_warning.html.haml @@ -2,7 +2,7 @@ .strike-entry__header .strike-entry__avatar .indicator-icon{ class: account_warning.overruled? ? 'success' : 'failure' } - = fa_icon 'warning' + = material_symbol 'warning' .strike-entry__content .strike-entry__title = t 'disputes.strikes.title', diff --git a/app/views/auth/registrations/_session.html.haml b/app/views/auth/registrations/_session.html.haml index 631ae0460161c1..92e5147593f980 100644 --- a/app/views/auth/registrations/_session.html.haml +++ b/app/views/auth/registrations/_session.html.haml @@ -1,7 +1,7 @@ %tr %td %span{ title: session.user_agent }< - = fa_icon "#{session_device_icon(session)} fw", 'aria-label': session_device_icon(session) + = material_symbol session_device_icon(session), 'aria-label': session_device_icon(session)   = t 'sessions.description', browser: t("sessions.browsers.#{session.browser}", default: session.browser.to_s), diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml index 5f721388217ec9..2bfecebbff9af2 100644 --- a/app/views/disputes/strikes/show.html.haml +++ b/app/views/disputes/strikes/show.html.haml @@ -9,13 +9,13 @@ - if @strike.overruled? %p.hint %span.positive-hint - = fa_icon 'check' + = material_symbol 'check'   = t 'disputes.strikes.appeal_approved' - elsif @appeal.persisted? && @appeal.rejected? %p.hint %span.negative-hint - = fa_icon 'times' + = material_symbol 'close'   = t 'disputes.strikes.appeal_rejected' diff --git a/app/views/filters/_filter.html.haml b/app/views/filters/_filter.html.haml index 9d82a979fefada..a544ac3a758166 100644 --- a/app/views/filters/_filter.html.haml +++ b/app/views/filters/_filter.html.haml @@ -14,7 +14,7 @@ - unless filter.keywords.empty? %li.permissions-list__item .permissions-list__item__icon - = fa_icon('paragraph') + = material_symbol('format_paragraph') .permissions-list__item__text .permissions-list__item__text__title = t('filters.index.keywords', count: filter.keywords.size) @@ -25,7 +25,7 @@ - unless filter.statuses.empty? %li.permissions-list__item .permissions-list__item__icon - = fa_icon('comment') + = material_symbol('chat') .permissions-list__item__text .permissions-list__item__text__title = t('filters.index.statuses', count: filter.statuses.size) diff --git a/app/views/filters/_filter_fields.html.haml b/app/views/filters/_filter_fields.html.haml index 0f4049ffb61979..797c969b24d965 100644 --- a/app/views/filters/_filter_fields.html.haml +++ b/app/views/filters/_filter_fields.html.haml @@ -58,4 +58,4 @@ %tr %td{ colspan: 3 } = link_to_add_association f, :keywords, class: 'table-action-link', partial: 'keyword_fields', 'data-association-insertion-node': '.keywords-table tbody', 'data-association-insertion-method': 'append' do - = safe_join([fa_icon('plus'), t('filters.edit.add_keyword')]) + = safe_join([material_symbol('add'), t('filters.edit.add_keyword')]) diff --git a/app/views/filters/_keyword_fields.html.haml b/app/views/filters/_keyword_fields.html.haml index eedd514ef5277b..136ab1653db648 100644 --- a/app/views/filters/_keyword_fields.html.haml +++ b/app/views/filters/_keyword_fields.html.haml @@ -5,4 +5,4 @@ %td = f.hidden_field :id if f.object&.persisted? # Required so Rails doesn't put the field outside of the = link_to_remove_association(f, class: 'table-action-link') do - = safe_join([fa_icon('times'), t('filters.index.delete')]) + = safe_join([material_symbol('close'), t('filters.index.delete')]) diff --git a/app/views/invites/_invite.html.haml b/app/views/invites/_invite.html.haml index d332dc5a4d5dd7..94e1a7112561ea 100644 --- a/app/views/invites/_invite.html.haml +++ b/app/views/invites/_invite.html.haml @@ -7,7 +7,7 @@ - if invite.valid_for_use? %td - = fa_icon 'user fw' + = material_symbol 'person' = invite.uses = " / #{invite.max_uses}" unless invite.max_uses.nil? %td diff --git a/app/views/kaminari/_next_page.html.haml b/app/views/kaminari/_next_page.html.haml index c44aea1f11e15d..5f27f4c8eec265 100644 --- a/app/views/kaminari/_next_page.html.haml +++ b/app/views/kaminari/_next_page.html.haml @@ -8,4 +8,4 @@ remote: data-remote %span.next - = link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote + = link_to_unless current_page.last?, safe_join([t('pagination.next'), material_symbol('chevron_right')], ' '), url, rel: 'next', remote: remote diff --git a/app/views/kaminari/_prev_page.html.haml b/app/views/kaminari/_prev_page.html.haml index 284d6223b874a1..c5584f6a81a62d 100644 --- a/app/views/kaminari/_prev_page.html.haml +++ b/app/views/kaminari/_prev_page.html.haml @@ -7,4 +7,4 @@ per_page: number of items to fetch per page remote: data-remote %span.prev - = link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote + = link_to_unless current_page.first?, safe_join([material_symbol('chevron_left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote diff --git a/app/views/oauth/authorizations/new.html.haml b/app/views/oauth/authorizations/new.html.haml index d4563b2f01d644..ca9d12a67665e9 100644 --- a/app/views/oauth/authorizations/new.html.haml +++ b/app/views/oauth/authorizations/new.html.haml @@ -13,7 +13,7 @@ - grouped_scopes(@pre_auth.scopes).each do |scope| %li.permissions-list__item .permissions-list__item__icon - = fa_icon('check') + = material_symbol('check') .permissions-list__item__text .permissions-list__item__text__title = t(scope.key, scope: [:doorkeeper, :grouped_scopes, :title]) diff --git a/app/views/oauth/authorized_applications/index.html.haml b/app/views/oauth/authorized_applications/index.html.haml index 009bbf8d85c994..b6819bbd72518f 100644 --- a/app/views/oauth/authorized_applications/index.html.haml +++ b/app/views/oauth/authorized_applications/index.html.haml @@ -36,7 +36,7 @@ - grouped_scopes(application.scopes).each do |scope| %li.permissions-list__item .permissions-list__item__icon - = fa_icon('check') + = material_symbol('check') .permissions-list__item__text .permissions-list__item__text__title = t(scope.key, scope: [:doorkeeper, :grouped_scopes, :title]) diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml index 6a866b13f86d74..7478b8c5ce1e90 100644 --- a/app/views/relationships/show.html.haml +++ b/app/views/relationships/show.html.haml @@ -42,13 +42,13 @@ %label.batch-table__toolbar__select.batch-checkbox-all = check_box_tag :batch_checkbox_all, nil, false .batch-table__toolbar__actions - = f.button safe_join([fa_icon('user-plus'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_follow_selected_followers') } if followed_by_relationship? && !mutual_relationship? + = f.button safe_join([material_symbol('person_add'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_follow_selected_followers') } if followed_by_relationship? && !mutual_relationship? - = f.button safe_join([fa_icon('user-times'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_follows') } unless followed_by_relationship? + = f.button safe_join([material_symbol('person_remove'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_follows') } unless followed_by_relationship? - = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_followers') } unless following_relationship? + = f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_followers') } unless following_relationship? - = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_domains')]), name: :remove_domains_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship? + = f.button safe_join([material_symbol('delete'), t('relationships.remove_selected_domains')]), name: :remove_domains_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship? .batch-table__body - if @accounts.empty? = nothing_here 'nothing-here--under-tabs' diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml index c55dff5d9694e5..6cd240bbbcd7d4 100644 --- a/app/views/statuses/_detailed_status.html.haml +++ b/app/views/statuses/_detailed_status.html.haml @@ -11,7 +11,7 @@ %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: prefers_autoplay?) %span.display-name__account = acct(status.account) - = fa_icon('lock') if status.account.locked? + = material_symbol('lock') if status.account.locked? = account_action_button(status.account) @@ -58,20 +58,20 @@ · %span.detailed-status__link - if status.in_reply_to_id.nil? - = fa_icon('reply') + = material_symbol('reply') - else - = fa_icon('reply-all') + = material_symbol('reply_all') %span.detailed-status__reblogs>= friendly_number_to_human status.replies_count   · - if status.public_visibility? || status.unlisted_visibility? %span.detailed-status__link - = fa_icon('retweet') + = material_symbol('repeat') %span.detailed-status__reblogs>= friendly_number_to_human status.reblogs_count   · %span.detailed-status__link - = fa_icon('star') + = material_symbol('star') %span.detailed-status__favorites>= friendly_number_to_human status.favourites_count   diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml index 93effc45242c40..ee7900fbfafaa0 100644 --- a/app/views/statuses/_simple_status.html.haml +++ b/app/views/statuses/_simple_status.html.haml @@ -26,7 +26,7 @@   %span.display-name__account = acct(status.account) - = fa_icon('lock') if status.account.locked? + = material_symbol('lock') if status.account.locked? .status__content.emojify{ data: ({ spoiler: current_account&.user&.setting_expand_spoilers ? 'expanded' : 'folded' } if status.spoiler_text?) }< - if status.spoiler_text? %p< @@ -55,16 +55,16 @@ .status__action-bar %span.status__action-bar-button.icon-button.icon-button--with-counter - if status.in_reply_to_id.nil? - = fa_icon 'reply fw' + = material_symbol 'reply' - else - = fa_icon 'reply-all fw' + = material_symbol 'reply_all' %span.icon-button__counter= obscured_counter status.replies_count %span.status__action-bar-button.icon-button - if status.distributable? - = fa_icon 'retweet fw' + = material_symbol 'repeat' - elsif status.private_visibility? || status.limited_visibility? - = fa_icon 'lock fw' + = material_symbol 'lock' - else - = fa_icon 'at fw' + = material_symbol 'alternate_email' %span.status__action-bar-button.icon-button - = fa_icon 'star fw' + = material_symbol 'star' diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 463a90b6986460..95e6976169e109 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -59,6 +59,15 @@ def current_theme = 'default' end end + describe '#material_symbol' do + it 'returns an svg with the icon and options' do + expect(helper.material_symbol('lock', class: :test, data: { hidden: true })) + .to match('') + .and match('class="icon material-lock test"') + .and match('data-hidden="true"') + end + end + describe 'open_registrations?' do it 'returns true when open for registrations' do allow(Setting).to receive(:[]).with('registrations_mode').and_return('open') diff --git a/spec/helpers/settings_helper_spec.rb b/spec/helpers/settings_helper_spec.rb index cba5c6ee891c74..ca447d8ce12633 100644 --- a/spec/helpers/settings_helper_spec.rb +++ b/spec/helpers/settings_helper_spec.rb @@ -10,7 +10,7 @@ it 'detects the device and returns a descriptive string' do result = helper.session_device_icon(session) - expect(result).to eq('mobile') + expect(result).to eq('smartphone') end end @@ -30,7 +30,7 @@ it 'detects the device and returns a descriptive string' do result = helper.session_device_icon(session) - expect(result).to eq('desktop') + expect(result).to eq('desktop_mac') end end end From 711e1fce0a6f0b883125614aade04d78bb4217ce Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Aug 2024 15:54:08 +0200 Subject: [PATCH 16/26] Fix pagination parameters in `GET /api/v2_alpha/notificatins` (#31509) --- app/models/notification.rb | 8 +++--- .../api/v2_alpha/notifications_spec.rb | 28 +++++++++++++++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/models/notification.rb b/app/models/notification.rb index f1605f0347ad12..ae7c782bedf64a 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -180,8 +180,8 @@ def paginate_groups(limit, pagination_order) # Notifications that have no `group_key` each count as a separate group. def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil) query = reorder(id: :desc) - query = query.where(id: ...max_id) if max_id.present? - query = query.where(id: (since_id + 1)...) if since_id.present? + query = query.where(id: ...(max_id.to_i)) if max_id.present? + query = query.where(id: (since_id.to_i + 1)...) if since_id.present? query.paginate_groups(limit, :desc) end @@ -190,8 +190,8 @@ def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil) # Results will be in ascending order by id. def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil) query = reorder(id: :asc) - query = query.where(id: (min_id + 1)...) if min_id.present? - query = query.where(id: ...max_id) if max_id.present? + query = query.where(id: (min_id.to_i + 1)...) if min_id.present? + query = query.where(id: ...(max_id.to_i)) if max_id.present? query.paginate_groups(limit, :asc) end diff --git a/spec/requests/api/v2_alpha/notifications_spec.rb b/spec/requests/api/v2_alpha/notifications_spec.rb index 94bc7b0ee36722..a613158aa5b404 100644 --- a/spec/requests/api/v2_alpha/notifications_spec.rb +++ b/spec/requests/api/v2_alpha/notifications_spec.rb @@ -97,8 +97,7 @@ before do first_status = PostStatusService.new.call(user.account, text: 'Test') ReblogService.new.call(bob.account, first_status) - mentioning_status = PostStatusService.new.call(bob.account, text: 'Hello @alice') - mentioning_status.mentions.first + PostStatusService.new.call(bob.account, text: 'Hello @alice') FavouriteService.new.call(bob.account, first_status) FavouriteService.new.call(tom.account, first_status) FollowService.new.call(bob.account, user.account) @@ -141,18 +140,37 @@ context 'with limit param' do let(:params) { { limit: 3 } } + let(:notifications) { user.account.notifications.reorder(id: :desc) } it 'returns the requested number of notifications paginated', :aggregate_failures do subject - notifications = user.account.notifications - expect(body_as_json[:notification_groups].size) .to eq(params[:limit]) expect(response) .to include_pagination_headers( - prev: api_v2_alpha_notifications_url(limit: params[:limit], min_id: notifications.last.id), + prev: api_v2_alpha_notifications_url(limit: params[:limit], min_id: notifications.first.id), + # TODO: one downside of the current approach is that we return the first ID matching the group, + # not the last that has been skipped, so pagination is very likely to give overlap + next: api_v2_alpha_notifications_url(limit: params[:limit], max_id: notifications[3].id) + ) + end + end + + context 'with since_id param' do + let(:params) { { since_id: notifications[2].id } } + let(:notifications) { user.account.notifications.reorder(id: :desc) } + + it 'returns the requested number of notifications paginated', :aggregate_failures do + subject + + expect(body_as_json[:notification_groups].size) + .to eq(2) + + expect(response) + .to include_pagination_headers( + prev: api_v2_alpha_notifications_url(limit: params[:limit], min_id: notifications.first.id), # TODO: one downside of the current approach is that we return the first ID matching the group, # not the last that has been skipped, so pagination is very likely to give overlap next: api_v2_alpha_notifications_url(limit: params[:limit], max_id: notifications[1].id) From 05b438005101dff2321bc645a5c7101fccdf342f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 20 Aug 2024 16:03:09 +0200 Subject: [PATCH 17/26] Fix margin in follow notification in web UI (#31508) --- .../styles/mastodon/components.scss | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 97abf77d10e9f3..4c47a8db6c91b7 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -762,16 +762,6 @@ body > [data-popper-placement] { gap: 12px; flex-wrap: wrap; - .button { - display: block; // Otherwise text-ellipsis doesn't work - font-size: 14px; - line-height: normal; - font-weight: 700; - flex: 1 1 auto; - padding: 5px 12px; - border-radius: 4px; - } - .icon-button { box-sizing: content-box; color: $highlight-text-color; @@ -10530,8 +10520,10 @@ noscript { } &__additional-content { - color: $darker-text-color; + color: $dark-text-color; margin-top: -8px; // to offset the parent's `gap` property + font-size: 15px; + line-height: 22px; } } @@ -10585,6 +10577,19 @@ noscript { } } +.notification-group__actions, +.compose-form__actions { + .button { + display: block; // Otherwise text-ellipsis doesn't work + font-size: 14px; + line-height: normal; + font-weight: 700; + flex: 1 1 auto; + padding: 5px 12px; + border-radius: 4px; + } +} + .notification-ungrouped { padding: 16px 24px; border-bottom: 1px solid var(--background-border-color); From 6c26fb0ed63f080627ede26b73ed3f4f8e0e5220 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:36:14 +0200 Subject: [PATCH 18/26] Update dependency core-js to v3.38.1 (#31507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 47cd777f4391c5..5f116021a0d0af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6389,9 +6389,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2": - version: 3.38.0 - resolution: "core-js@npm:3.38.0" - checksum: 10c0/3218ae19bfe0c6560663012cbd3e7f3dc1b36d50fc71e8c365f3b119185e8a35ac4e8bb9698ae510b3c201ef93f40bdc29f9215716ccf31aca28f77969bb4ed0 + version: 3.38.1 + resolution: "core-js@npm:3.38.1" + checksum: 10c0/7df063b6f13a54e46515817ac3e235c6c598a4d3de65cd188a061fc250642be313b895fb9fb2f36e1e31890a1bb4ef61d82666a340413f540b7ce3c65689739b languageName: node linkType: hard From 4016fd512898e9226a40b1973a742cb1e827ae3b Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 20 Aug 2024 17:56:44 +0200 Subject: [PATCH 19/26] Update CSS color variables to match our latest design system (#31510) --- app/javascript/styles/contrast/variables.scss | 8 ++--- .../styles/mastodon-light/variables.scss | 34 +++++++++---------- app/javascript/styles/mastodon/variables.scss | 12 +++---- app/lib/themes.rb | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/javascript/styles/contrast/variables.scss b/app/javascript/styles/contrast/variables.scss index e38d24b271cf8e..766591ba408383 100644 --- a/app/javascript/styles/contrast/variables.scss +++ b/app/javascript/styles/contrast/variables.scss @@ -1,10 +1,10 @@ // Dependent colors $black: #000000; -$classic-base-color: #282c37; -$classic-primary-color: #9baec8; -$classic-secondary-color: #d9e1e8; -$classic-highlight-color: #6364ff; +$classic-base-color: hsl(240deg, 16%, 19%); +$classic-primary-color: hsl(240deg, 29%, 70%); +$classic-secondary-color: hsl(255deg, 25%, 88%); +$classic-highlight-color: hsl(240deg, 100%, 69%); $ui-base-color: $classic-base-color !default; $ui-primary-color: $classic-primary-color !default; diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index 39809b437f4cd7..76ede2623319f8 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -2,25 +2,25 @@ $black: #000000; $white: #ffffff; -$classic-base-color: #282c37; -$classic-primary-color: #9baec8; -$classic-secondary-color: #d9e1e8; -$classic-highlight-color: #6364ff; +$classic-base-color: hsl(240deg, 16%, 19%); +$classic-primary-color: hsl(240deg, 29%, 70%); +$classic-secondary-color: hsl(255deg, 25%, 88%); +$classic-highlight-color: hsl(240deg, 100%, 69%); -$blurple-600: #563acc; // Iris -$blurple-500: #6364ff; // Brand purple -$blurple-300: #858afa; // Faded Blue -$grey-600: #4e4c5a; // Trout -$grey-100: #dadaf3; // Topaz +$blurple-600: hsl(252deg, 59%, 51%); // Iris +$blurple-500: hsl(240deg, 100%, 69%); // Brand purple +$blurple-300: hsl(237deg, 92%, 75%); // Faded Blue +$grey-600: hsl(240deg, 8%, 33%); // Trout +$grey-100: hsl(240deg, 51%, 90%); // Topaz // Differences -$success-green: lighten(#3c754d, 8%); +$success-green: lighten(hsl(138deg, 32%, 35%), 8%); $base-overlay-background: $white !default; $valid-value-color: $success-green !default; $ui-base-color: $classic-secondary-color !default; -$ui-base-lighter-color: #b0c0cf; +$ui-base-lighter-color: hsl(250deg, 24%, 75%); $ui-primary-color: $classic-primary-color !default; $ui-secondary-color: $classic-base-color !default; $ui-highlight-color: $classic-highlight-color !default; @@ -35,12 +35,12 @@ $ui-button-tertiary-border-color: $blurple-500 !default; $primary-text-color: $black !default; $darker-text-color: $classic-base-color !default; $highlight-text-color: $ui-highlight-color !default; -$dark-text-color: #444b5d; -$action-button-color: #606984; +$dark-text-color: hsl(240deg, 16%, 32%); +$action-button-color: hsl(240deg, 16%, 45%); $inverted-text-color: $black !default; $lighter-text-color: $classic-base-color !default; -$light-text-color: #444b5d; +$light-text-color: hsl(240deg, 16%, 32%); // Newly added colors $account-background-color: $white !default; @@ -57,11 +57,11 @@ $account-background-color: $white !default; $emojis-requiring-inversion: 'chains'; body { - --dropdown-border-color: #d9e1e8; + --dropdown-border-color: hsl(240deg, 25%, 88%); --dropdown-background-color: #fff; - --modal-border-color: #d9e1e8; + --modal-border-color: hsl(240deg, 25%, 88%); --modal-background-color: var(--background-color-tint); - --background-border-color: #d9e1e8; + --background-border-color: hsl(240deg, 25%, 88%); --background-color: #fff; --background-color-tint: rgba(255, 255, 255, 80%); --background-filter: blur(10px); diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index c8271e0dcd95d4..c477e7a750cecc 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -7,8 +7,8 @@ $blurple-600: #563acc; // Iris $blurple-500: #6364ff; // Brand purple $blurple-400: #7477fd; // Medium slate blue $blurple-300: #858afa; // Faded Blue -$grey-600: #4e4c5a; // Trout -$grey-100: #dadaf3; // Topaz +$grey-600: hsl(240deg, 8%, 33%); // Trout +$grey-100: hsl(240deg, 51%, 90%); // Topaz $success-green: #79bd9a !default; // Padua $error-red: $red-500 !default; // Cerise @@ -18,10 +18,10 @@ $gold-star: #ca8f04 !default; // Dark Goldenrod $red-bookmark: $warning-red; // Values from the classic Mastodon UI -$classic-base-color: #282c37; // Midnight Express -$classic-primary-color: #9baec8; // Echo Blue -$classic-secondary-color: #d9e1e8; // Pattens Blue -$classic-highlight-color: #6364ff; // Brand purple +$classic-base-color: hsl(240deg, 16%, 19%); +$classic-primary-color: hsl(240deg, 29%, 70%); +$classic-secondary-color: hsl(255deg, 25%, 88%); +$classic-highlight-color: $blurple-500; // Variables for defaults in UI $base-shadow-color: $black !default; diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 183258d62f832e..8b68c92e45082c 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -7,7 +7,7 @@ class Themes include Singleton THEME_COLORS = { - dark: '#191b22', + dark: '#181820', light: '#ffffff', }.freeze From 4c4bcad866f513f69d6ea74e5acfdf3fc5f469ff Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 20 Aug 2024 11:59:47 -0400 Subject: [PATCH 20/26] Remove `font-awesome` npm package (#31512) --- app/javascript/mastodon/common.js | 1 - app/views/layouts/application.html.haml | 1 - app/views/layouts/embedded.html.haml | 1 - app/views/layouts/error.html.haml | 1 - package.json | 1 - yarn.lock | 8 -------- 6 files changed, 13 deletions(-) diff --git a/app/javascript/mastodon/common.js b/app/javascript/mastodon/common.js index 511568aa0f748a..28857de5346c20 100644 --- a/app/javascript/mastodon/common.js +++ b/app/javascript/mastodon/common.js @@ -1,5 +1,4 @@ import Rails from '@rails/ujs'; -import 'font-awesome/css/font-awesome.css'; export function start() { require.context('../images/', true, /\.(jpg|png|svg)$/); diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 0c0512e812f4f3..a6b34c8a36515a 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -25,7 +25,6 @@ %title= html_title - = stylesheet_pack_tag 'common', media: 'all', crossorigin: 'anonymous' = theme_style_tags current_theme -# Needed for the wicg-inert polyfill. It needs to be on it's own