Merge pull request #813 from kmycode/upstream-20240821

Upstream 20240821
This commit is contained in:
KMY(雪あすか) 2024-08-21 18:54:43 +09:00 committed by GitHub
commit 36142dfa05
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
165 changed files with 1034 additions and 866 deletions

View file

@ -196,11 +196,14 @@ ARG VIPS_VERSION=8.15.3
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
WORKDIR /usr/local/libvips/src 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 \ 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; \ meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \
cd build; \ cd build; \
ninja; \ ninja; \
@ -216,11 +219,14 @@ ARG FFMPEG_VERSION=7.0.2
ARG FFMPEG_URL=https://ffmpeg.org/releases ARG FFMPEG_URL=https://ffmpeg.org/releases
WORKDIR /usr/local/ffmpeg/src 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 \ 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 \ ./configure \
--prefix=/usr/local/ffmpeg \ --prefix=/usr/local/ffmpeg \
--toolchain=hardened \ --toolchain=hardened \

View file

@ -281,8 +281,8 @@ GEM
fog-core (~> 2.1) fog-core (~> 2.1)
fog-json (>= 1.0) fog-json (>= 1.0)
formatador (1.1.0) formatador (1.1.0)
fugit (1.10.1) fugit (1.11.1)
et-orbi (~> 1, >= 1.2.7) et-orbi (~> 1, >= 1.2.11)
raabro (~> 1.4) raabro (~> 1.4)
fuubar (2.5.1) fuubar (2.5.1)
rspec-core (~> 3.0) rspec-core (~> 3.0)
@ -514,17 +514,17 @@ GEM
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.22.1)
opentelemetry-instrumentation-rack (~> 0.21) opentelemetry-instrumentation-rack (~> 0.21)
opentelemetry-instrumentation-action_view (0.7.1) opentelemetry-instrumentation-action_view (0.7.2)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-active_support (~> 0.1)
opentelemetry-instrumentation-base (~> 0.22.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-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.22.1)
opentelemetry-instrumentation-active_model_serializers (0.20.2) opentelemetry-instrumentation-active_model_serializers (0.20.2)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) 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-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.22.1)
opentelemetry-instrumentation-active_support (0.6.0) opentelemetry-instrumentation-active_support (0.6.0)
@ -558,7 +558,7 @@ GEM
opentelemetry-instrumentation-rack (0.24.6) opentelemetry-instrumentation-rack (0.24.6)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-base (~> 0.22.1)
opentelemetry-instrumentation-rails (0.31.1) opentelemetry-instrumentation-rails (0.31.2)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-action_mailer (~> 0.1.0) opentelemetry-instrumentation-action_mailer (~> 0.1.0)
opentelemetry-instrumentation-action_pack (~> 0.9.0) opentelemetry-instrumentation-action_pack (~> 0.9.0)

View file

@ -1,8 +1,10 @@
# frozen_string_literal: true # frozen_string_literal: true
class Api::V1::Notifications::RequestsController < Api::BaseController class Api::V1::Notifications::RequestsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :index include Redisable
before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index
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 :require_user!
before_action :set_request, only: [:show, :accept, :dismiss] before_action :set_request, only: [:show, :accept, :dismiss]
@ -19,6 +21,10 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships
end end
def merged?
render json: { merged: redis.get("notification_unfilter_jobs:#{current_account.id}").to_i <= 0 }
end
def show def show
render json: @request, serializer: REST::NotificationRequestSerializer render json: @request, serializer: REST::NotificationRequestSerializer
end end

View file

@ -25,7 +25,7 @@ module Admin::FilterHelper
end end
def table_link_to(icon, text, path, **options) 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 end
def selected?(more_params) def selected?(more_params)

View file

@ -107,19 +107,12 @@ module ApplicationHelper
policy(record).public_send(:"#{action}?") policy(record).public_send(:"#{action}?")
end end
def fa_icon(icon, attributes = {})
class_names = attributes[:class]&.split || []
class_names << 'fa'
class_names += icon.split.map { |cl| "fa-#{cl}" }
content_tag(:i, nil, attributes.merge(class: class_names.join(' ')))
end
def material_symbol(icon, attributes = {}) def material_symbol(icon, attributes = {})
inline_svg_tag( inline_svg_tag(
"400-24px/#{icon}.svg", "400-24px/#{icon}.svg",
class: ['icon', "material-#{icon}"].concat(attributes[:class].to_s.split), class: ['icon', "material-#{icon}"].concat(attributes[:class].to_s.split),
role: :img role: :img,
data: attributes[:data]
) )
end end

View file

@ -26,11 +26,11 @@ module SettingsHelper
device = session.detection.device device = session.detection.device
if device.mobile? if device.mobile?
'mobile' 'smartphone'
elsif device.tablet? elsif device.tablet?
'tablet' 'tablet'
else else
'desktop' 'desktop_mac'
end end
end end

View file

@ -138,8 +138,18 @@ export const processNewNotificationForGroups = createAppAsyncThunk(
export const loadPending = createAction('notificationGroups/loadPending'); export const loadPending = createAction('notificationGroups/loadPending');
export const updateScrollPosition = createAction<{ top: boolean }>( export const updateScrollPosition = createAppAsyncThunk(
'notificationGroups/updateScrollPosition', 'notificationGroups/updateScrollPosition',
({ top }: { top: boolean }, { dispatch, getState }) => {
if (
top &&
getState().notificationGroups.mergedNotifications === 'needs-reload'
) {
void dispatch(fetchNotifications());
}
return { top };
},
); );
export const setNotificationsFilter = createAppAsyncThunk( export const setNotificationsFilter = createAppAsyncThunk(
@ -165,5 +175,34 @@ export const markNotificationsAsRead = createAction(
'notificationGroups/markAsRead', '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 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 };
});

View file

@ -200,8 +200,8 @@ const noOp = () => {};
let expandNotificationsController = new AbortController(); let expandNotificationsController = new AbortController();
export function expandNotifications({ maxId, forceLoad = false } = {}, done = noOp) { export function expandNotifications({ maxId = undefined, forceLoad = false }) {
return (dispatch, getState) => { return async (dispatch, getState) => {
const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
const notifications = getState().get('notifications'); const notifications = getState().get('notifications');
const isLoadingMore = !!maxId; const isLoadingMore = !!maxId;
@ -211,7 +211,6 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no
expandNotificationsController.abort(); expandNotificationsController.abort();
expandNotificationsController = new AbortController(); expandNotificationsController = new AbortController();
} else { } else {
done();
return; return;
} }
} }
@ -243,7 +242,8 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no
dispatch(expandNotificationsRequest(isLoadingMore)); 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'); const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedAccounts(response.data.map(item => item.account)));
@ -253,11 +253,9 @@ export function expandNotifications({ maxId, forceLoad = false } = {}, done = no
dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
fetchRelatedRelationships(dispatch, response.data); fetchRelatedRelationships(dispatch, response.data);
dispatch(submitMarkers()); dispatch(submitMarkers());
}).catch(error => { } catch(error) {
dispatch(expandNotificationsFail(error, isLoadingMore)); dispatch(expandNotificationsFail(error, isLoadingMore));
}).finally(() => { }
done();
});
}; };
} }

View file

@ -13,6 +13,6 @@ export const initializeNotifications = createAppAsyncThunk(
) as boolean; ) as boolean;
if (enableBeta) void dispatch(fetchNotifications()); if (enableBeta) void dispatch(fetchNotifications());
else dispatch(expandNotifications()); else void dispatch(expandNotifications({}));
}, },
); );

View file

@ -10,7 +10,7 @@ import {
deleteAnnouncement, deleteAnnouncement,
} from './announcements'; } from './announcements';
import { updateConversations } from './conversations'; import { updateConversations } from './conversations';
import { processNewNotificationForGroups } from './notification_groups'; import { processNewNotificationForGroups, refreshStaleNotificationGroups } from './notification_groups';
import { updateNotifications, expandNotifications, updateEmojiReactions } from './notifications'; import { updateNotifications, expandNotifications, updateEmojiReactions } from './notifications';
import { updateStatus } from './statuses'; import { updateStatus } from './statuses';
import { import {
@ -38,7 +38,7 @@ const randomUpTo = max =>
* @param {string} channelName * @param {string} channelName
* @param {Object.<string, string>} params * @param {Object.<string, string>} params
* @param {Object} options * @param {Object} options
* @param {function(Function, Function): void} [options.fallback] * @param {function(Function): Promise<void>} [options.fallback]
* @param {function(): void} [options.fillGaps] * @param {function(): void} [options.fillGaps]
* @param {function(object): boolean} [options.accept] * @param {function(object): boolean} [options.accept]
* @returns {function(): void} * @returns {function(): void}
@ -53,14 +53,13 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
let pollingId; let pollingId;
/** /**
* @param {function(Function, Function): void} fallback * @param {function(Function): Promise<void>} fallback
*/ */
const useFallback = fallback => { const useFallback = async fallback => {
fallback(dispatch, () => { await fallback(dispatch);
// eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook
pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000));
});
}; };
return { return {
@ -114,6 +113,14 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
// @ts-expect-error // @ts-expect-error
dispatch(updateEmojiReactions(JSON.parse(data.payload))); dispatch(updateEmojiReactions(JSON.parse(data.payload)));
break; 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': case 'conversation':
// @ts-expect-error // @ts-expect-error
dispatch(updateConversations(JSON.parse(data.payload))); dispatch(updateConversations(JSON.parse(data.payload)));
@ -137,21 +144,17 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
/** /**
* @param {Function} dispatch * @param {Function} dispatch
* @param {function(): void} done
*/ */
const refreshHomeTimelineAndNotification = (dispatch, done) => { async function refreshHomeTimelineAndNotification(dispatch) {
// @ts-expect-error await dispatch(expandHomeTimeline({ maxId: undefined }));
dispatch(expandHomeTimeline({}, () => await dispatch(expandNotifications({}));
// @ts-expect-error await dispatch(fetchAnnouncements());
dispatch(expandNotifications({}, () => }
dispatch(fetchAnnouncements(done))))));
};
/** /**
* @returns {function(): void} * @returns {function(): void}
*/ */
export const connectUserStream = () => export const connectUserStream = () =>
// @ts-expect-error
connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps });
/** /**

View file

@ -76,21 +76,18 @@ export function clearTimeline(timeline) {
}; };
} }
const noOp = () => {};
const parseTags = (tags = {}, mode) => { const parseTags = (tags = {}, mode) => {
return (tags[mode] || []).map((tag) => { return (tags[mode] || []).map((tag) => {
return tag.value; return tag.value;
}); });
}; };
export function expandTimeline(timelineId, path, params = {}, done = noOp) { export function expandTimeline(timelineId, path, params = {}) {
return (dispatch, getState) => { return async (dispatch, getState) => {
const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const timeline = getState().getIn(['timelines', timelineId], ImmutableMap());
const isLoadingMore = !!params.max_id; const isLoadingMore = !!params.max_id;
if (timeline.get('isLoading')) { if (timeline.get('isLoading')) {
done();
return; return;
} }
@ -109,7 +106,8 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
dispatch(expandTimelineRequest(timelineId, isLoadingMore)); 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'); const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedStatuses(response.data)); dispatch(importFetchedStatuses(response.data));
@ -127,54 +125,50 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
if (timelineId === 'home') { if (timelineId === 'home') {
dispatch(submitMarkers()); dispatch(submitMarkers());
} }
}).catch(error => { } catch(error) {
dispatch(expandTimelineFail(timelineId, error, isLoadingMore)); dispatch(expandTimelineFail(timelineId, error, isLoadingMore));
}).finally(() => { }
done();
});
}; };
} }
export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { export function fillTimelineGaps(timelineId, path, params = {}) {
return (dispatch, getState) => { return async (dispatch, getState) => {
const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const timeline = getState().getIn(['timelines', timelineId], ImmutableMap());
const items = timeline.get('items'); const items = timeline.get('items');
const nullIndexes = items.map((statusId, index) => statusId === null ? index : null); const nullIndexes = items.map((statusId, index) => statusId === null ? index : null);
const gaps = nullIndexes.map(index => index > 0 ? items.get(index - 1) : 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 // Only expand at most two gaps to avoid doing too many requests
done = gaps.take(2).reduce((done, maxId) => { for (const maxId of gaps.take(2)) {
return (() => dispatch(expandTimeline(timelineId, path, { ...params, maxId }, done))); await dispatch(expandTimeline(timelineId, path, { ...params, maxId }));
}, done); }
done();
}; };
} }
export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }, done); export const expandHomeTimeline = ({ maxId } = {}) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId });
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 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 } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done); 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 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 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 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 expandListTimeline = (id, { maxId } = {}) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId });
export const expandAntennaTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`antenna:${id}`, `/api/v1/timelines/antenna/${id}`, { max_id: maxId }, done); export const expandAntennaTimeline = (id, { maxId } = {}) => expandTimeline(`antenna:${id}`, `/api/v1/timelines/antenna/${id}`, { max_id: maxId });
export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }, done); export const expandLinkTimeline = (url, { maxId } = {}) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId });
export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}) => {
return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, {
max_id: maxId, max_id: maxId,
any: parseTags(tags, 'any'), any: parseTags(tags, 'any'),
all: parseTags(tags, 'all'), all: parseTags(tags, 'all'),
none: parseTags(tags, 'none'), none: parseTags(tags, 'none'),
local: local, local: local,
}, done); });
}; };
export const fillHomeTimelineGaps = (done = noOp) => fillTimelineGaps('home', '/api/v1/timelines/home', {}, done); export const fillHomeTimelineGaps = () => fillTimelineGaps('home', '/api/v1/timelines/home', {});
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 fillPublicTimelineGaps = ({ onlyMedia, onlyRemote } = {}) => fillTimelineGaps(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia });
export const fillCommunityTimelineGaps = ({ onlyMedia } = {}, done = noOp) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }, done); export const fillCommunityTimelineGaps = ({ onlyMedia } = {}) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia });
export const fillListTimelineGaps = (id, done = noOp) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}, done); export const fillListTimelineGaps = (id) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {});
export const fillAntennaTimelineGaps = (id, done = noOp) => fillTimelineGaps(`antenna:${id}`, `/api/v1/timelines/antenna/${id}`, {}, done); export const fillAntennaTimelineGaps = (id) => fillTimelineGaps(`antenna:${id}`, `/api/v1/timelines/antenna/${id}`, {});
export function expandTimelineRequest(timeline, isLoadingMore) { export function expandTimelineRequest(timeline, isLoadingMore) {
return { return {

View file

@ -1,5 +1,4 @@
import Rails from '@rails/ujs'; import Rails from '@rails/ujs';
import 'font-awesome/css/font-awesome.css';
export function start() { export function start() {
require.context('../images/', true, /\.(jpg|png|svg)$/); require.context('../images/', true, /\.(jpg|png|svg)$/);

View file

@ -153,7 +153,7 @@ class ReportReasonSelector extends PureComponent {
<Category id='other' text={intl.formatMessage(messages.other)} selected={category === 'other'} onSelect={this.handleSelect} disabled={disabled} /> <Category id='other' text={intl.formatMessage(messages.other)} selected={category === 'other'} onSelect={this.handleSelect} disabled={disabled} />
<Category id='legal' text={intl.formatMessage(messages.legal)} selected={category === 'legal'} onSelect={this.handleSelect} disabled={disabled} /> <Category id='legal' text={intl.formatMessage(messages.legal)} selected={category === 'legal'} onSelect={this.handleSelect} disabled={disabled} />
<Category id='spam' text={intl.formatMessage(messages.spam)} selected={category === 'spam'} onSelect={this.handleSelect} disabled={disabled} /> <Category id='spam' text={intl.formatMessage(messages.spam)} selected={category === 'spam'} onSelect={this.handleSelect} disabled={disabled} />
<Category id='violation' text={intl.formatMessage(messages.violation)} selected={category === 'violation'} onSelect={this.handleSelect} disabled={disabled}> <Category id='violation' text={intl.formatMessage(messages.violation)} selected={category === 'violation'} onSelect={this.handleSelect} disabled={disabled || rules.length === 0}>
{rules.map(rule => <Rule key={rule.id} id={rule.id} text={rule.text} selected={rule_ids.includes(rule.id)} onToggle={this.handleToggle} disabled={disabled} />)} {rules.map(rule => <Rule key={rule.id} id={rule.id} text={rule.text} selected={rule_ids.includes(rule.id)} onToggle={this.handleToggle} disabled={disabled} />)}
</Category> </Category>
</div> </div>

View file

@ -1,28 +1,23 @@
import { FormattedMessage } from 'react-intl';
import classNames from 'classnames'; import classNames from 'classnames';
interface Props { interface Props {
resource: JSX.Element; message: React.ReactNode;
label: React.ReactNode;
url: string; url: string;
className?: string; className?: string;
} }
export const TimelineHint: React.FC<Props> = ({ className, resource, url }) => ( export const TimelineHint: React.FC<Props> = ({
className,
message,
label,
url,
}) => (
<div className={classNames('timeline-hint', className)}> <div className={classNames('timeline-hint', className)}>
<strong> <p>{message}</p>
<FormattedMessage
id='timeline_hint.remote_resource_not_displayed'
defaultMessage='{resource} from other servers are not displayed.'
values={{ resource }}
/>
</strong>
<br />
<a href={url} target='_blank' rel='noopener noreferrer'> <a href={url} target='_blank' rel='noopener noreferrer'>
<FormattedMessage {label}
id='account.browse_more_on_origin_server'
defaultMessage='Browse more on the original profile'
/>
</a> </a>
</div> </div>
); );

View file

@ -12,6 +12,7 @@ import BundleColumnError from 'mastodon/features/ui/components/bundle_column_err
import { me } from 'mastodon/initial_state'; import { me } from 'mastodon/initial_state';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors'; import { getAccountHidden } from 'mastodon/selectors';
import { useAppSelector } from 'mastodon/store';
import { lookupAccount, fetchAccount } from '../../actions/accounts'; import { lookupAccount, fetchAccount } from '../../actions/accounts';
import { fetchFeaturedTags } from '../../actions/featured_tags'; import { fetchFeaturedTags } from '../../actions/featured_tags';
@ -59,12 +60,22 @@ const mapStateToProps = (state, { params: { acct, id, tagged }, withReplies = fa
}; };
}; };
const RemoteHint = ({ url }) => ( const RemoteHint = ({ accountId, url }) => {
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.statuses' defaultMessage='Older posts' />} /> const acct = useAppSelector(state => state.accounts.get(accountId)?.acct);
); const domain = acct ? acct.split('@')[1] : undefined;
return (
<TimelineHint
url={url}
message={<FormattedMessage id='hints.profiles.posts_may_be_missing' defaultMessage='Some posts from this profile may be missing.' />}
label={<FormattedMessage id='hints.profiles.see_more_posts' defaultMessage='See more posts on {domain}' values={{ domain: <strong>{domain}</strong> }} />}
/>
);
};
RemoteHint.propTypes = { RemoteHint.propTypes = {
url: PropTypes.string.isRequired, url: PropTypes.string.isRequired,
accountId: PropTypes.string.isRequired,
}; };
class AccountTimeline extends ImmutablePureComponent { class AccountTimeline extends ImmutablePureComponent {
@ -175,12 +186,12 @@ class AccountTimeline extends ImmutablePureComponent {
} else if (blockedBy) { } else if (blockedBy) {
emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
} else if (remote && statusIds.isEmpty()) { } else if (remote && statusIds.isEmpty()) {
emptyMessage = <RemoteHint url={remoteUrl} />; emptyMessage = <RemoteHint accountId={accountId} url={remoteUrl} />;
} else { } else {
emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No posts found' />; emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No posts found' />;
} }
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null; const remoteMessage = remote ? <RemoteHint accountId={accountId} url={remoteUrl} /> : null;
return ( return (
<Column> <Column>

View file

@ -13,6 +13,7 @@ import BundleColumnError from 'mastodon/features/ui/components/bundle_column_err
import { isHideItem, me } from 'mastodon/initial_state'; import { isHideItem, me } from 'mastodon/initial_state';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors'; import { getAccountHidden } from 'mastodon/selectors';
import { useAppSelector } from 'mastodon/store';
import { import {
lookupAccount, lookupAccount,
@ -52,12 +53,22 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
}; };
}; };
const RemoteHint = ({ url }) => ( const RemoteHint = ({ accountId, url }) => {
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} /> const acct = useAppSelector(state => state.accounts.get(accountId)?.acct);
); const domain = acct ? acct.split('@')[1] : undefined;
return (
<TimelineHint
url={url}
message={<FormattedMessage id='hints.profiles.followers_may_be_missing' defaultMessage='Followers for this profile may be missing.' />}
label={<FormattedMessage id='hints.profiles.see_more_followers' defaultMessage='See more followers on {domain}' values={{ domain: <strong>{domain}</strong> }} />}
/>
);
};
RemoteHint.propTypes = { RemoteHint.propTypes = {
url: PropTypes.string.isRequired, url: PropTypes.string.isRequired,
accountId: PropTypes.string.isRequired,
}; };
class Followers extends ImmutablePureComponent { class Followers extends ImmutablePureComponent {
@ -143,14 +154,14 @@ class Followers extends ImmutablePureComponent {
} else if (hideCollections && accountIds.isEmpty()) { } else if (hideCollections && accountIds.isEmpty()) {
emptyMessage = <FormattedMessage id='empty_column.account_hides_collections' defaultMessage='This user has chosen to not make this information available' />; emptyMessage = <FormattedMessage id='empty_column.account_hides_collections' defaultMessage='This user has chosen to not make this information available' />;
} else if (remote && accountIds.isEmpty()) { } else if (remote && accountIds.isEmpty()) {
emptyMessage = <RemoteHint url={remoteUrl} />; emptyMessage = <RemoteHint accountId={accountId} url={remoteUrl} />;
} else if (isHideRelationships) { } else if (isHideRelationships) {
emptyMessage = <FormattedMessage id='account.followers.hidden_from_me' defaultMessage='This information is hidden by your setting.' />; emptyMessage = <FormattedMessage id='account.followers.hidden_from_me' defaultMessage='This information is hidden by your setting.' />;
} else { } else {
emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />; emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
} }
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null; const remoteMessage = remote ? <RemoteHint accountId={accountId} url={remoteUrl} /> : null;
return ( return (
<Column> <Column>

View file

@ -13,6 +13,7 @@ import BundleColumnError from 'mastodon/features/ui/components/bundle_column_err
import { isHideItem, me } from 'mastodon/initial_state'; import { isHideItem, me } from 'mastodon/initial_state';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors'; import { getAccountHidden } from 'mastodon/selectors';
import { useAppSelector } from 'mastodon/store';
import { import {
lookupAccount, lookupAccount,
@ -52,12 +53,22 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
}; };
}; };
const RemoteHint = ({ url }) => ( const RemoteHint = ({ accountId, url }) => {
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} /> const acct = useAppSelector(state => state.accounts.get(accountId)?.acct);
); const domain = acct ? acct.split('@')[1] : undefined;
return (
<TimelineHint
url={url}
message={<FormattedMessage id='hints.profiles.follows_may_be_missing' defaultMessage='Follows for this profile may be missing.' />}
label={<FormattedMessage id='hints.profiles.see_more_follows' defaultMessage='See more follows on {domain}' values={{ domain: <strong>{domain}</strong> }} />}
/>
);
};
RemoteHint.propTypes = { RemoteHint.propTypes = {
url: PropTypes.string.isRequired, url: PropTypes.string.isRequired,
accountId: PropTypes.string.isRequired,
}; };
class Following extends ImmutablePureComponent { class Following extends ImmutablePureComponent {
@ -132,7 +143,7 @@ class Following extends ImmutablePureComponent {
let emptyMessage; let emptyMessage;
const forceEmptyState = blockedBy || suspended || hidden; const forceEmptyState = blockedBy || suspended || hidden;
const normalizedAccountIds = isHideItem('relationships') ? accountIds.filter((id) => id !== me) : accountIds; const filteredAccountIds = isHideItem('relationships') ? accountIds.filter((id) => id !== me) : accountIds;
if (suspended) { if (suspended) {
emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
@ -140,15 +151,15 @@ class Following extends ImmutablePureComponent {
emptyMessage = <LimitedAccountHint accountId={accountId} />; emptyMessage = <LimitedAccountHint accountId={accountId} />;
} else if (blockedBy) { } else if (blockedBy) {
emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
} else if (hideCollections && normalizedAccountIds.isEmpty()) { } else if (hideCollections && filteredAccountIds.isEmpty()) {
emptyMessage = <FormattedMessage id='empty_column.account_hides_collections' defaultMessage='This user has chosen to not make this information available' />; emptyMessage = <FormattedMessage id='empty_column.account_hides_collections' defaultMessage='This user has chosen to not make this information available' />;
} else if (remote && normalizedAccountIds.isEmpty()) { } else if (remote && filteredAccountIds.isEmpty()) {
emptyMessage = <RemoteHint url={remoteUrl} />; emptyMessage = <RemoteHint accountId={accountId} url={remoteUrl} />;
} else { } else {
emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />; emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
} }
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null; const remoteMessage = remote ? <RemoteHint accountId={accountId} url={remoteUrl} /> : null;
return ( return (
<Column> <Column>
@ -165,7 +176,7 @@ class Following extends ImmutablePureComponent {
emptyMessage={emptyMessage} emptyMessage={emptyMessage}
bindToDocument={!multiColumn} bindToDocument={!multiColumn}
> >
{forceEmptyState ? [] : normalizedAccountIds.map(id => {forceEmptyState ? [] : filteredAccountIds.map(id =>
<AccountContainer key={id} id={id} withNote={false} />, <AccountContainer key={id} id={id} withNote={false} />,
)} )}
</ScrollableList> </ScrollableList>

View file

@ -36,13 +36,13 @@ export const LinkTimeline: React.FC<{
const handleLoadMore = useCallback( const handleLoadMore = useCallback(
(maxId: string) => { (maxId: string) => {
dispatch(expandLinkTimeline(decodedUrl, { maxId })); void dispatch(expandLinkTimeline(decodedUrl, { maxId }));
}, },
[dispatch, decodedUrl], [dispatch, decodedUrl],
); );
useEffect(() => { useEffect(() => {
dispatch(expandLinkTimeline(decodedUrl)); void dispatch(expandLinkTimeline(decodedUrl));
}, [dispatch, decodedUrl]); }, [dispatch, decodedUrl]);
return ( return (

View file

@ -7,6 +7,7 @@ import { Helmet } from 'react-helmet';
import { useSelector, useDispatch } from 'react-redux'; 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 InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
@ -15,6 +16,7 @@ import { changeSetting } from 'mastodon/actions/settings';
import { CheckBox } from 'mastodon/components/check_box'; import { CheckBox } from 'mastodon/components/check_box';
import Column from 'mastodon/components/column'; import Column from 'mastodon/components/column';
import ColumnHeader from 'mastodon/components/column_header'; import ColumnHeader from 'mastodon/components/column_header';
import { Icon } from 'mastodon/components/icon';
import ScrollableList from 'mastodon/components/scrollable_list'; import ScrollableList from 'mastodon/components/scrollable_list';
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
@ -26,16 +28,14 @@ const messages = defineMessages({
title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' }, title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' },
maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' }, maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' },
more: { id: 'status.more', defaultMessage: 'More' }, more: { id: 'status.more', defaultMessage: 'More' },
acceptAll: { id: 'notification_requests.accept_all', defaultMessage: 'Accept all' }, acceptMultiple: { id: 'notification_requests.accept_multiple', defaultMessage: '{count, plural, one {Accept # request…} other {Accept # requests…}}' },
dismissAll: { id: 'notification_requests.dismiss_all', defaultMessage: 'Dismiss all' }, dismissMultiple: { id: 'notification_requests.dismiss_multiple', defaultMessage: '{count, plural, one {Dismiss # request…} other {Dismiss # requests…}}' },
acceptMultiple: { id: 'notification_requests.accept_multiple', defaultMessage: '{count, plural, one {Accept # request} other {Accept # requests}}' }, confirmAcceptMultipleTitle: { id: 'notification_requests.confirm_accept_multiple.title', defaultMessage: 'Accept notification requests?' },
dismissMultiple: { id: 'notification_requests.dismiss_multiple', defaultMessage: '{count, plural, one {Dismiss # request} other {Dismiss # 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?' },
confirmAcceptAllTitle: { id: 'notification_requests.confirm_accept_all.title', defaultMessage: 'Accept notification requests?' }, confirmAcceptMultipleButton: { id: 'notification_requests.confirm_accept_multiple.button', defaultMessage: '{count, plural, one {Accept request} other {Accept 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?' }, confirmDismissMultipleTitle: { id: 'notification_requests.confirm_dismiss_multiple.title', defaultMessage: 'Dismiss notification requests?' },
confirmAcceptAllButton: { id: 'notification_requests.confirm_accept_all.button', defaultMessage: 'Accept all' }, 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?" },
confirmDismissAllTitle: { id: 'notification_requests.confirm_dismiss_all.title', defaultMessage: 'Dismiss notification requests?' }, confirmDismissMultipleButton: { id: 'notification_requests.confirm_dismiss_multiple.button', defaultMessage: '{count, plural, one {Dismiss request} other {Dismiss 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' },
}); });
const ColumnSettings = () => { const ColumnSettings = () => {
@ -74,45 +74,15 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM
const intl = useIntl(); const intl = useIntl();
const dispatch = useDispatch(); const dispatch = useDispatch();
const notificationRequests = useSelector(state => state.getIn(['notificationRequests', 'items']));
const selectedCount = selectedItems.length; 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(() => { const handleAcceptMultiple = useCallback(() => {
dispatch(openModal({ dispatch(openModal({
modalType: 'CONFIRM', modalType: 'CONFIRM',
modalProps: { modalProps: {
title: intl.formatMessage(messages.confirmAcceptAllTitle), title: intl.formatMessage(messages.confirmAcceptMultipleTitle),
message: intl.formatMessage(messages.confirmAcceptAllMessage, { count: selectedItems.length }), message: intl.formatMessage(messages.confirmAcceptMultipleMessage, { count: selectedItems.length }),
confirm: intl.formatMessage(messages.confirmAcceptAllButton), confirm: intl.formatMessage(messages.confirmAcceptMultipleButton, { count: selectedItems.length}),
onConfirm: () => onConfirm: () =>
dispatch(acceptNotificationRequests(selectedItems)), dispatch(acceptNotificationRequests(selectedItems)),
}, },
@ -123,9 +93,9 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM
dispatch(openModal({ dispatch(openModal({
modalType: 'CONFIRM', modalType: 'CONFIRM',
modalProps: { modalProps: {
title: intl.formatMessage(messages.confirmDismissAllTitle), title: intl.formatMessage(messages.confirmDismissMultipleTitle),
message: intl.formatMessage(messages.confirmDismissAllMessage, { count: selectedItems.length }), message: intl.formatMessage(messages.confirmDismissMultipleMessage, { count: selectedItems.length }),
confirm: intl.formatMessage(messages.confirmDismissAllButton), confirm: intl.formatMessage(messages.confirmDismissMultipleButton, { count: selectedItems.length}),
onConfirm: () => onConfirm: () =>
dispatch(dismissNotificationRequests(selectedItems)), dispatch(dismissNotificationRequests(selectedItems)),
}, },
@ -136,46 +106,45 @@ const SelectRow = ({selectAllChecked, toggleSelectAll, selectedItems, selectionM
setSelectionMode((mode) => !mode); setSelectionMode((mode) => !mode);
}, [setSelectionMode]); }, [setSelectionMode]);
const menu = selectedCount === 0 ? const menu = [
[ { text: intl.formatMessage(messages.acceptMultiple, { count: selectedCount }), action: handleAcceptMultiple },
{ text: intl.formatMessage(messages.acceptAll), action: handleAcceptAll }, { text: intl.formatMessage(messages.dismissMultiple, { count: selectedCount }), action: handleDismissMultiple },
{ text: intl.formatMessage(messages.dismissAll), action: handleDismissAll }, ];
] : [
{ text: intl.formatMessage(messages.acceptMultiple, { count: selectedCount }), action: handleAcceptMultiple }, const handleSelectAll = useCallback(() => {
{ text: intl.formatMessage(messages.dismissMultiple, { count: selectedCount }), action: handleDismissMultiple }, setSelectionMode(true);
]; toggleSelectAll();
}, [setSelectionMode, toggleSelectAll]);
return ( return (
<div className='column-header__select-row'> <div className='column-header__select-row'>
{selectionMode && ( <div className='column-header__select-row__checkbox'>
<div className='column-header__select-row__checkbox'> <CheckBox checked={selectAllChecked} indeterminate={selectedCount > 0 && !selectAllChecked} onChange={handleSelectAll} />
<CheckBox checked={selectAllChecked} indeterminate={selectedCount > 0 && !selectAllChecked} onChange={toggleSelectAll} /> </div>
</div> <DropdownMenuContainer
)} items={menu}
<div className='column-header__select-row__selection-mode'> icons='ellipsis-h'
iconComponent={MoreHorizIcon}
direction='right'
title={intl.formatMessage(messages.more)}
>
<button className='dropdown-button column-header__select-row__select-menu' disabled={selectedItems.length === 0}>
<span className='dropdown-button__label'>
{selectedCount} selected
</span>
<Icon id='down' icon={ArrowDropDownIcon} />
</button>
</DropdownMenuContainer>
<div className='column-header__select-row__mode-button'>
<button className='text-btn' tabIndex={0} onClick={handleToggleSelectionMode}> <button className='text-btn' tabIndex={0} onClick={handleToggleSelectionMode}>
{selectionMode ? ( {selectionMode ? (
<FormattedMessage id='notification_requests.exit_selection_mode' defaultMessage='Cancel' /> <FormattedMessage id='notification_requests.exit_selection' defaultMessage='Done' />
) : ) :
( (
<FormattedMessage id='notification_requests.enter_selection_mode' defaultMessage='Select' /> <FormattedMessage id='notification_requests.edit_selection' defaultMessage='Edit' />
)} )}
</button> </button>
</div> </div>
{selectedCount > 0 &&
<div className='column-header__select-row__selected-count'>
{selectedCount} selected
</div>
}
<div className='column-header__select-row__actions'>
<DropdownMenuContainer
items={menu}
icons='ellipsis-h'
iconComponent={MoreHorizIcon}
direction='right'
title={intl.formatMessage(messages.more)}
/>
</div>
</div> </div>
); );
}; };

View file

@ -81,7 +81,11 @@ export const Notifications: React.FC<{
const anyPendingNotification = useAppSelector(selectAnyPendingNotification); const anyPendingNotification = useAppSelector(selectAnyPendingNotification);
const isUnread = unreadNotificationsCount > 0; const needsReload = useAppSelector(
(state) => state.notificationGroups.mergedNotifications === 'needs-reload',
);
const isUnread = unreadNotificationsCount > 0 || needsReload;
const canMarkAsRead = const canMarkAsRead =
useAppSelector(selectSettingsNotificationsShowUnread) && useAppSelector(selectSettingsNotificationsShowUnread) &&
@ -118,11 +122,11 @@ export const Notifications: React.FC<{
// Keep track of mounted components for unread notification handling // Keep track of mounted components for unread notification handling
useEffect(() => { useEffect(() => {
dispatch(mountNotifications()); void dispatch(mountNotifications());
return () => { return () => {
dispatch(unmountNotifications()); dispatch(unmountNotifications());
dispatch(updateScrollPosition({ top: false })); void dispatch(updateScrollPosition({ top: false }));
}; };
}, [dispatch]); }, [dispatch]);
@ -147,11 +151,11 @@ export const Notifications: React.FC<{
}, [dispatch]); }, [dispatch]);
const handleScrollToTop = useDebouncedCallback(() => { const handleScrollToTop = useDebouncedCallback(() => {
dispatch(updateScrollPosition({ top: true })); void dispatch(updateScrollPosition({ top: true }));
}, 100); }, 100);
const handleScroll = useDebouncedCallback(() => { const handleScroll = useDebouncedCallback(() => {
dispatch(updateScrollPosition({ top: false })); void dispatch(updateScrollPosition({ top: false }));
}, 100); }, 100);
useEffect(() => { useEffect(() => {

View file

@ -705,7 +705,14 @@ class Status extends ImmutablePureComponent {
const isIndexable = !status.getIn(['account', 'noindex']); const isIndexable = !status.getIn(['account', 'noindex']);
if (!isLocal) { if (!isLocal) {
remoteHint = <TimelineHint className={classNames(!!descendants && 'timeline-hint--with-descendants')} url={status.get('url')} resource={<FormattedMessage id='timeline_hint.resources.replies' defaultMessage='Some replies' />} />; remoteHint = (
<TimelineHint
className={classNames(!!descendants && 'timeline-hint--with-descendants')}
url={status.get('url')}
message={<FormattedMessage id='hints.threads.replies_may_be_missing' defaultMessage='Replies from other servers may be missing.' />}
label={<FormattedMessage id='hints.threads.see_more' defaultMessage='See more replies on {domain}' values={{ domain: <strong>{status.getIn(['account', 'acct']).split('@')[1]}</strong> }} />}
/>
);
} }
const handlers = { const handlers = {

View file

@ -500,14 +500,7 @@
"notification.status": "{name} نشر للتو", "notification.status": "{name} نشر للتو",
"notification.update": "عدّلَ {name} منشورًا", "notification.update": "عدّلَ {name} منشورًا",
"notification_requests.accept": "موافقة", "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": "تخطي",
"notification_requests.dismiss_all": "تجاهل الكل",
"notification_requests.enter_selection_mode": "اختر",
"notification_requests.exit_selection_mode": "إلغاء",
"notification_requests.explainer_for_limited_account": "تم تصفية الإشعارات من هذا الحساب لأن الحساب تم تقييده من قبل مشرف.", "notification_requests.explainer_for_limited_account": "تم تصفية الإشعارات من هذا الحساب لأن الحساب تم تقييده من قبل مشرف.",
"notification_requests.notifications_from": "إشعارات من {name}", "notification_requests.notifications_from": "إشعارات من {name}",
"notification_requests.title": "الإشعارات المصفاة", "notification_requests.title": "الإشعارات المصفاة",

View file

@ -11,6 +11,7 @@
"about.not_available": "Дадзеная інфармацыя не дасяжная на гэтым серверы.", "about.not_available": "Дадзеная інфармацыя не дасяжная на гэтым серверы.",
"about.powered_by": "Дэцэнтралізаваная сацыяльная сетка, створаная {mastodon}", "about.powered_by": "Дэцэнтралізаваная сацыяльная сетка, створаная {mastodon}",
"about.rules": "Правілы сервера", "about.rules": "Правілы сервера",
"account.account_note_header": "Асабістая нататка",
"account.add_or_remove_from_list": "Дадаць або выдаліць са спісаў", "account.add_or_remove_from_list": "Дадаць або выдаліць са спісаў",
"account.badges.bot": "Бот", "account.badges.bot": "Бот",
"account.badges.group": "Група", "account.badges.group": "Група",
@ -481,6 +482,11 @@
"notification.favourite": "Ваш допіс упадабаны {name}", "notification.favourite": "Ваш допіс упадабаны {name}",
"notification.follow": "{name} падпісаўся на вас", "notification.follow": "{name} падпісаўся на вас",
"notification.follow_request": "{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.learn_more": "Даведацца больш",
"notification.moderation_warning": "Вы атрымалі папярэджанне аб мадэрацыі", "notification.moderation_warning": "Вы атрымалі папярэджанне аб мадэрацыі",
"notification.moderation_warning.action_delete_statuses": "Некаторыя вашыя допісы былі выдаленыя.", "notification.moderation_warning.action_delete_statuses": "Некаторыя вашыя допісы былі выдаленыя.",
@ -506,6 +512,7 @@
"notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў",
"notification_requests.notifications_from": "Апавяшчэнні ад {name}", "notification_requests.notifications_from": "Апавяшчэнні ад {name}",
"notification_requests.title": "Адфільтраваныя апавяшчэнні", "notification_requests.title": "Адфільтраваныя апавяшчэнні",
"notification_requests.view": "Прагляд апавяшчэнняў",
"notifications.clear": "Ачысціць апавяшчэнні", "notifications.clear": "Ачысціць апавяшчэнні",
"notifications.clear_confirmation": "Вы ўпэўнены, што жадаеце назаўсёды сцерці ўсё паведамленні?", "notifications.clear_confirmation": "Вы ўпэўнены, што жадаеце назаўсёды сцерці ўсё паведамленні?",
"notifications.clear_title": "Ачысціць апавяшчэнні?", "notifications.clear_title": "Ачысціць апавяшчэнні?",
@ -542,6 +549,10 @@
"notifications.permission_denied": "Апавяшчэнні на працоўным стале недаступныя з-за папярэдне адхіленага запыта праў браўзера", "notifications.permission_denied": "Апавяшчэнні на працоўным стале недаступныя з-за папярэдне адхіленага запыта праў браўзера",
"notifications.permission_denied_alert": "Апавяшчэнні на працоўным стале не могуць быць уключаныя, з-за таго што запыт браўзера быў адхілены", "notifications.permission_denied_alert": "Апавяшчэнні на працоўным стале не могуць быць уключаныя, з-за таго што запыт браўзера быў адхілены",
"notifications.permission_required": "Апавяшчэнні на працоўным стале недаступныя, з-за таго што неабходны дазвол не быў дадзены.", "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.hint": "Створаныя на працягу {days, plural, one {апошняга # дня} few {апошніх # дзён} many {апошніх # дзён} other {апошняй # дня}}",
"notifications.policy.filter_new_accounts_title": "Новыя ўліковыя запісы", "notifications.policy.filter_new_accounts_title": "Новыя ўліковыя запісы",
"notifications.policy.filter_not_followers_hint": "Уключаючы людзей, якія падпісаны на вас менш, чым {days, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}}", "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_not_following_title": "Людзі, на якіх вы не падпісаны",
"notifications.policy.filter_private_mentions_hint": "Фільтруецца за выключэннем адказу на вашае згадванне ці калі вы падпісаны на адпраўніка", "notifications.policy.filter_private_mentions_hint": "Фільтруецца за выключэннем адказу на вашае згадванне ці калі вы падпісаны на адпраўніка",
"notifications.policy.filter_private_mentions_title": "Непажаданыя асаблівыя згадванні", "notifications.policy.filter_private_mentions_title": "Непажаданыя асаблівыя згадванні",
"notifications.policy.title": "Наладзіць апавяшчэнні ад…",
"notifications_permission_banner.enable": "Уключыць апавяшчэнні на працоўным стале", "notifications_permission_banner.enable": "Уключыць апавяшчэнні на працоўным стале",
"notifications_permission_banner.how_to_control": "Каб атрымліваць апавяшчэнні, калі Mastodon не адкрыты, уключыце апавяшчэнні працоўнага стала. Вы зможаце дакладна кантраляваць, якія падзеі будуць ствараць апавяшчэнні з дапамогай {icon} кнопкі, як толькі яны будуць уключаны.", "notifications_permission_banner.how_to_control": "Каб атрымліваць апавяшчэнні, калі Mastodon не адкрыты, уключыце апавяшчэнні працоўнага стала. Вы зможаце дакладна кантраляваць, якія падзеі будуць ствараць апавяшчэнні з дапамогай {icon} кнопкі, як толькі яны будуць уключаны.",
"notifications_permission_banner.title": "Не прапусціце нічога", "notifications_permission_banner.title": "Не прапусціце нічога",
@ -790,6 +802,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} з іншых сервераў не адлюстроўваецца.", "timeline_hint.remote_resource_not_displayed": "{resource} з іншых сервераў не адлюстроўваецца.",
"timeline_hint.resources.followers": "Падпісчыкі", "timeline_hint.resources.followers": "Падпісчыкі",
"timeline_hint.resources.follows": "Падпіскі", "timeline_hint.resources.follows": "Падпіскі",
"timeline_hint.resources.replies": "Некаторыя адказы",
"timeline_hint.resources.statuses": "Старыя допісы", "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.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": "Актуальнае", "trends.trending_now": "Актуальнае",

View file

@ -505,8 +505,6 @@
"notification.update": "{name} промени публикация", "notification.update": "{name} промени публикация",
"notification_requests.accept": "Приемам", "notification_requests.accept": "Приемам",
"notification_requests.dismiss": "Отхвърлям", "notification_requests.dismiss": "Отхвърлям",
"notification_requests.enter_selection_mode": "Изберете",
"notification_requests.exit_selection_mode": "Отказ",
"notification_requests.explainer_for_limited_account": "Известията от този акаунт са прецедени, защото акаунтът е ограничен от модератор.", "notification_requests.explainer_for_limited_account": "Известията от този акаунт са прецедени, защото акаунтът е ограничен от модератор.",
"notification_requests.explainer_for_limited_remote_account": "Известията от този акаунт са прецедени, защото акаунтът или сървърът му е ограничен от модератор.", "notification_requests.explainer_for_limited_remote_account": "Известията от този акаунт са прецедени, защото акаунтът или сървърът му е ограничен от модератор.",
"notification_requests.maximize": "Максимизиране", "notification_requests.maximize": "Максимизиране",

View file

@ -517,17 +517,17 @@
"notification.status": "{name} acaba de publicar", "notification.status": "{name} acaba de publicar",
"notification.update": "{name} ha editat un tut", "notification.update": "{name} ha editat un tut",
"notification_requests.accept": "Accepta", "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.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_all.button": "Accepta-ho tot", "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_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_multiple.title": "Acceptar peticions de notificació?",
"notification_requests.confirm_accept_all.title": "Accepteu peticions de notificació?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Descarta petició} other {Descarta peticions}}",
"notification_requests.confirm_dismiss_all.button": "Descarta-les totes", "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_all.title": "Descarta la sol·licitud de notificació?", "notification_requests.confirm_dismiss_multiple.title": "Descartar les peticions de notificació?",
"notification_requests.dismiss": "Ignora", "notification_requests.dismiss": "Ignora",
"notification_requests.dismiss_all": "Descarta-ho tot", "notification_requests.dismiss_multiple": "{count, plural, one {Descarta # petició…} other {Descarta # peticions…}}",
"notification_requests.enter_selection_mode": "Selecciona", "notification_requests.edit_selection": "Edita",
"notification_requests.exit_selection_mode": "Cancel·la", "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_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.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", "notification_requests.maximize": "Maximitza",

View file

@ -518,19 +518,7 @@
"notification.status": "{name} newydd ei bostio", "notification.status": "{name} newydd ei bostio",
"notification.update": "Golygodd {name} bostiad", "notification.update": "Golygodd {name} bostiad",
"notification_requests.accept": "Derbyn", "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": "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_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.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", "notification_requests.maximize": "Mwyhau",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} har netop postet", "notification.status": "{name} har netop postet",
"notification.update": "{name} redigerede et indlæg", "notification.update": "{name} redigerede et indlæg",
"notification_requests.accept": "Acceptér", "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.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_all.button": "Acceptér alle", "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_all.message": "Man er ved at acceptere {count, plural, one {en notifikationsanmodning} other {# notifikationsanmodninger}}. Fortsæt, sikker?", "notification_requests.confirm_accept_multiple.title": "Acceptér notifikationsanmodninger?",
"notification_requests.confirm_accept_all.title": "Acceptér notifikationsanmodninger?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Afvis anmodning} other {Afvis anmodninger}}",
"notification_requests.confirm_dismiss_all.button": "Afvis alle", "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_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_multiple.title": "Afvis notifikationsanmodninger?",
"notification_requests.confirm_dismiss_all.title": "Afvis notifikationsanmodninger?",
"notification_requests.dismiss": "Afvis", "notification_requests.dismiss": "Afvis",
"notification_requests.dismiss_all": "Afvis alle", "notification_requests.dismiss_multiple": "{count, plural, one {Afvis # anmodning…} other {Afvis # anmodninger…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Afvis # anmodning} other {Afvis # anmodninger}}", "notification_requests.edit_selection": "Redigér",
"notification_requests.enter_selection_mode": "Vælg", "notification_requests.exit_selection": "Udført",
"notification_requests.exit_selection_mode": "Afbryd",
"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_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.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", "notification_requests.maximize": "Maksimér",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} hat gerade etwas gepostet", "notification.status": "{name} hat gerade etwas gepostet",
"notification.update": "{name} bearbeitete einen Beitrag", "notification.update": "{name} bearbeitete einen Beitrag",
"notification_requests.accept": "Genehmigen", "notification_requests.accept": "Genehmigen",
"notification_requests.accept_all": "Alle genehmigen", "notification_requests.accept_multiple": "{count, plural, one {# Anfrage genehmigen …} other {# Anfragen genehmigen …}}",
"notification_requests.accept_multiple": "{count, plural, one {# Anfrage genehmigen} other {# Anfragen genehmigen}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Anfrage genehmigen} other {Anfragen genehmigen}}",
"notification_requests.confirm_accept_all.button": "Alle genehmigen", "notification_requests.confirm_accept_multiple.message": "Du bist dabei, {{count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} zu genehmigen. Möchtest du wirklich fortfahren?",
"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_multiple.title": "Benachrichtigungsanfragen genehmigen?",
"notification_requests.confirm_accept_all.title": "Benachrichtigungsanfragen genehmigen?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Anfrage ablehnen} other {Anfragen ablehnen}}",
"notification_requests.confirm_dismiss_all.button": "Alle ablehnen", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Benachrichtigungsanfragen ablehnen?",
"notification_requests.confirm_dismiss_all.title": "Benachrichtigungsanfragen ablehnen?",
"notification_requests.dismiss": "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.dismiss_multiple": "{count, plural, one {# Anfrage ablehnen} other {# Anfragen ablehnen}}", "notification_requests.edit_selection": "Bearbeiten",
"notification_requests.enter_selection_mode": "Auswählen", "notification_requests.exit_selection": "Fertig",
"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_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.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", "notification_requests.maximize": "Maximieren",

View file

@ -518,19 +518,7 @@
"notification.status": "Ο/Η {name} μόλις ανέρτησε κάτι", "notification.status": "Ο/Η {name} μόλις ανέρτησε κάτι",
"notification.update": "ο/η {name} επεξεργάστηκε μια ανάρτηση", "notification.update": "ο/η {name} επεξεργάστηκε μια ανάρτηση",
"notification_requests.accept": "Αποδοχή", "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": "Απόρριψη",
"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_account": "Οι ειδοποιήσεις από αυτόν τον λογαριασμό έχουν φιλτραριστεί επειδή ο λογαριασμός έχει περιοριστεί από έναν συντονιστή.",
"notification_requests.explainer_for_limited_remote_account": "Οι ειδοποιήσεις από αυτόν τον λογαριασμό έχουν φιλτραριστεί επειδή ο λογαριασμός ή ο διακομιστής του έχει περιοριστεί από έναν συντονιστή.", "notification_requests.explainer_for_limited_remote_account": "Οι ειδοποιήσεις από αυτόν τον λογαριασμό έχουν φιλτραριστεί επειδή ο λογαριασμός ή ο διακομιστής του έχει περιοριστεί από έναν συντονιστή.",
"notification_requests.maximize": "Μεγιστοποίηση", "notification_requests.maximize": "Μεγιστοποίηση",

View file

@ -517,19 +517,7 @@
"notification.status": "{name} just posted", "notification.status": "{name} just posted",
"notification.update": "{name} edited a post", "notification.update": "{name} edited a post",
"notification_requests.accept": "Accept", "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": "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_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.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", "notification_requests.minimize_banner": "Minimize filtered notifications banner",

View file

@ -30,7 +30,6 @@
"account.block_domain": "Block domain {domain}", "account.block_domain": "Block domain {domain}",
"account.block_short": "Block", "account.block_short": "Block",
"account.blocked": "Blocked", "account.blocked": "Blocked",
"account.browse_more_on_origin_server": "Browse more on the original profile",
"account.cancel_follow_request": "Cancel follow", "account.cancel_follow_request": "Cancel follow",
"account.copy": "Copy link to profile", "account.copy": "Copy link to profile",
"account.direct": "Privately mention @{name}", "account.direct": "Privately mention @{name}",
@ -452,6 +451,14 @@
"hashtag.follow": "Follow hashtag", "hashtag.follow": "Follow hashtag",
"hashtag.unfollow": "Unfollow hashtag", "hashtag.unfollow": "Unfollow hashtag",
"hashtags.and_other": "…and {count, plural, other {# more}}", "hashtags.and_other": "…and {count, plural, other {# more}}",
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
"hints.profiles.follows_may_be_missing": "Follows for this profile may be missing.",
"hints.profiles.posts_may_be_missing": "Some posts from this profile may be missing.",
"hints.profiles.see_more_followers": "See more followers on {domain}",
"hints.profiles.see_more_follows": "See more follows on {domain}",
"hints.profiles.see_more_posts": "See more posts on {domain}",
"hints.threads.replies_may_be_missing": "Replies from other servers may be missing.",
"hints.threads.see_more": "See more replies on {domain}",
"home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_reblogs": "Show boosts",
"home.column_settings.show_replies": "Show replies", "home.column_settings.show_replies": "Show replies",
"home.hide_announcements": "Hide announcements", "home.hide_announcements": "Hide announcements",
@ -637,19 +644,17 @@
"notification.status_reference": "{name} quoted your post", "notification.status_reference": "{name} quoted your post",
"notification.update": "{name} edited a post", "notification.update": "{name} edited a post",
"notification_requests.accept": "Accept", "notification_requests.accept": "Accept",
"notification_requests.accept_all": "Accept all", "notification_requests.accept_multiple": "{count, plural, one {Accept # request…} other {Accept # 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_all.button": "Accept all", "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_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_multiple.title": "Accept notification requests?",
"notification_requests.confirm_accept_all.title": "Accept notification requests?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Dismiss request} other {Dismiss requests}}",
"notification_requests.confirm_dismiss_all.button": "Dismiss all", "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_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_multiple.title": "Dismiss notification requests?",
"notification_requests.confirm_dismiss_all.title": "Dismiss notification requests?",
"notification_requests.dismiss": "Dismiss", "notification_requests.dismiss": "Dismiss",
"notification_requests.dismiss_all": "Dismiss all", "notification_requests.dismiss_multiple": "{count, plural, one {Dismiss # request…} other {Dismiss # requests…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Dismiss # request} other {Dismiss # requests}}", "notification_requests.edit_selection": "Edit",
"notification_requests.enter_selection_mode": "Select", "notification_requests.exit_selection": "Done",
"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_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.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", "notification_requests.maximize": "Maximize",
@ -1001,11 +1006,6 @@
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
"time_remaining.moments": "Moments remaining", "time_remaining.moments": "Moments remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
"timeline_hint.resources.followers": "Followers",
"timeline_hint.resources.follows": "Follows",
"timeline_hint.resources.replies": "Some replies",
"timeline_hint.resources.statuses": "Older posts",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}",
"trends.trending_now": "Trending now", "trends.trending_now": "Trending now",
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} acaba de enviar un mensaje", "notification.status": "{name} acaba de enviar un mensaje",
"notification.update": "{name} editó un mensaje", "notification.update": "{name} editó un mensaje",
"notification_requests.accept": "Aceptar", "notification_requests.accept": "Aceptar",
"notification_requests.accept_all": "Aceptar todas", "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}",
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceptar solicitud} other {Aceptar solicitudes}}",
"notification_requests.confirm_accept_all.button": "Aceptar todas", "notification_requests.confirm_accept_multiple.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.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_multiple.title": "¿Aceptar solicitudes de notificación?",
"notification_requests.confirm_accept_all.title": "¿Aceptar solicitudes de notificación?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Descartar solicitud} other {Descartar solicitudes}}",
"notification_requests.confirm_dismiss_all.button": "Descartar todas", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "¿Descartar solicitudes de notificación?",
"notification_requests.confirm_dismiss_all.title": "¿Descartar solicitudes de notificación?",
"notification_requests.dismiss": "Descartar", "notification_requests.dismiss": "Descartar",
"notification_requests.dismiss_all": "Descartar todas", "notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud…} other {Descartar # solicitudes…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Descartar # solicitud} other {Descartar # solicitudes}}", "notification_requests.edit_selection": "Editar",
"notification_requests.enter_selection_mode": "Seleccionar", "notification_requests.exit_selection": "Listo",
"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_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.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", "notification_requests.maximize": "Maximizar",

View file

@ -518,19 +518,9 @@
"notification.status": "{name} acaba de publicar", "notification.status": "{name} acaba de publicar",
"notification.update": "{name} editó una publicación", "notification.update": "{name} editó una publicación",
"notification_requests.accept": "Aceptar", "notification_requests.accept": "Aceptar",
"notification_requests.accept_all": "Aceptar todas", "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}",
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", "notification_requests.confirm_accept_multiple.button": "{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": "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_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.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", "notification_requests.maximize": "Maximizar",

View file

@ -518,19 +518,9 @@
"notification.status": "{name} acaba de publicar", "notification.status": "{name} acaba de publicar",
"notification.update": "{name} editó una publicación", "notification.update": "{name} editó una publicación",
"notification_requests.accept": "Aceptar", "notification_requests.accept": "Aceptar",
"notification_requests.accept_all": "Aceptar todas", "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud…} other {Aceptar # solicitudes…}}",
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitud} other {Aceptar # solicitudes}}", "notification_requests.confirm_accept_multiple.button": "{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": "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_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.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", "notification_requests.maximize": "Maximizar",

View file

@ -502,15 +502,7 @@
"notification.status": "{name} erabiltzaileak bidalketa egin berri du", "notification.status": "{name} erabiltzaileak bidalketa egin berri du",
"notification.update": "{name} erabiltzaileak bidalketa bat editatu du", "notification.update": "{name} erabiltzaileak bidalketa bat editatu du",
"notification_requests.accept": "Onartu", "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": "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.maximize": "Maximizatu",
"notification_requests.notifications_from": "{name} erabiltzailearen jakinarazpenak", "notification_requests.notifications_from": "{name} erabiltzailearen jakinarazpenak",
"notification_requests.title": "Iragazitako jakinarazpenak", "notification_requests.title": "Iragazitako jakinarazpenak",

View file

@ -477,7 +477,7 @@
"navigation_bar.logout": "Kirjaudu ulos", "navigation_bar.logout": "Kirjaudu ulos",
"navigation_bar.mutes": "Mykistetyt käyttäjät", "navigation_bar.mutes": "Mykistetyt käyttäjät",
"navigation_bar.opened_in_classic_interface": "Julkaisut, profiilit ja tietyt muut sivut avautuvat oletuksena perinteiseen selainkäyttöliittymään.", "navigation_bar.opened_in_classic_interface": "Julkaisut, profiilit ja tietyt muut sivut avautuvat oletuksena perinteiseen selainkäyttöliittymään.",
"navigation_bar.personal": "Henkilökohtainen", "navigation_bar.personal": "Henkilökohtaiset",
"navigation_bar.pins": "Kiinnitetyt julkaisut", "navigation_bar.pins": "Kiinnitetyt julkaisut",
"navigation_bar.preferences": "Asetukset", "navigation_bar.preferences": "Asetukset",
"navigation_bar.public_timeline": "Yleinen aikajana", "navigation_bar.public_timeline": "Yleinen aikajana",
@ -518,19 +518,17 @@
"notification.status": "{name} julkaisi juuri", "notification.status": "{name} julkaisi juuri",
"notification.update": "{name} muokkasi julkaisua", "notification.update": "{name} muokkasi julkaisua",
"notification_requests.accept": "Hyväksy", "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.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_all.button": "Hyväksy kaikki", "notification_requests.confirm_accept_multiple.message": "Olet aikeissa hyväksyä {count, plural, one {ilmoituspyynnön} other {# ilmoituspyyntöä}}. Haluatko varmasti jatkaa?",
"notification_requests.confirm_accept_all.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_accept_all.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_all.button": "Hylkää kaikki", "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_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_multiple.title": "Hylätäänkö ilmoituspyynnöt?",
"notification_requests.confirm_dismiss_all.title": "Hylätäänkö ilmoituspyynnöt?",
"notification_requests.dismiss": "Hylkää", "notification_requests.dismiss": "Hylkää",
"notification_requests.dismiss_all": "Hylkää kaikki", "notification_requests.dismiss_multiple": "{count, plural, one {Hylkää # pyyntö…} other {Hylkää # pyyntöä…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Hylkää # pyyntö} other {Hylkää # pyyntöä}}", "notification_requests.edit_selection": "Muokkaa",
"notification_requests.enter_selection_mode": "Valitse", "notification_requests.exit_selection": "Valmis",
"notification_requests.exit_selection_mode": "Peruuta",
"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_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.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", "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_hint": "Kunnes hyväksyt heidät manuaalisesti",
"notifications.policy.filter_not_following_title": "Käyttäjät, joita et seuraa", "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_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.policy.title": "Hallitse ilmoituksia kohteesta…",
"notifications_permission_banner.enable": "Ota työpöytäilmoitukset käyttöön", "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.", "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.",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} hevur júst postað", "notification.status": "{name} hevur júst postað",
"notification.update": "{name} rættaði ein post", "notification.update": "{name} rættaði ein post",
"notification_requests.accept": "Góðtak", "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.accept_multiple": "{count, plural, one {Góðtak # umbøn} other {Góðtak # umbønir}}", "notification_requests.confirm_accept_multiple.button": "{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_multiple.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ú vil halda fram?",
"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_multiple.title": "Góðtak fráboðanarumbønir?",
"notification_requests.confirm_accept_all.title": "Góðtekur tú umbøn um fráboðan?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Avvís umbøn} other {Avvís umbønir}}",
"notification_requests.confirm_dismiss_all.button": "Vraka alt", "notification_requests.confirm_dismiss_multiple.message": "Tú er í ferð við at avvísa {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 fatur á {count, plural, one {henni} other {teimum}} aftur. Er tú vís/ur í at tú vil halda fram?",
"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_multiple.title": "Avvís fráboðanarumbønir?",
"notification_requests.confirm_dismiss_all.title": "Kveistra burtur fráboðanarumbønir?",
"notification_requests.dismiss": "Avvís", "notification_requests.dismiss": "Avvís",
"notification_requests.dismiss_all": "Vraka alt", "notification_requests.dismiss_multiple": "{count, plural, one {Avvís # umbøn…} other {Avvís # umbønir…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Kveistra burtur # umbøn} other {Kveistra burtur # umbønir}}", "notification_requests.edit_selection": "Rætta",
"notification_requests.enter_selection_mode": "Vel", "notification_requests.exit_selection": "Liðugt",
"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_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.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", "notification_requests.maximize": "Mesta",

View file

@ -490,9 +490,6 @@
"notification.status": "{name} vient de publier", "notification.status": "{name} vient de publier",
"notification.update": "{name} a modifié une publication", "notification.update": "{name} a modifié une publication",
"notification_requests.accept": "Accepter", "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.dismiss": "Rejeter",
"notification_requests.notifications_from": "Notifications de {name}", "notification_requests.notifications_from": "Notifications de {name}",
"notification_requests.title": "Notifications filtrées", "notification_requests.title": "Notifications filtrées",

View file

@ -490,9 +490,6 @@
"notification.status": "{name} vient de publier", "notification.status": "{name} vient de publier",
"notification.update": "{name} a modifié un message", "notification.update": "{name} a modifié un message",
"notification_requests.accept": "Accepter", "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.dismiss": "Rejeter",
"notification_requests.notifications_from": "Notifications de {name}", "notification_requests.notifications_from": "Notifications de {name}",
"notification_requests.title": "Notifications filtrées", "notification_requests.title": "Notifications filtrées",

View file

@ -518,19 +518,7 @@
"notification.status": "Phostáil {name} díreach", "notification.status": "Phostáil {name} díreach",
"notification.update": "Chuir {name} postáil in eagar", "notification.update": "Chuir {name} postáil in eagar",
"notification_requests.accept": "Glac", "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": "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_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.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", "notification_requests.maximize": "Uasmhéadaigh",

View file

@ -518,19 +518,7 @@
"notification.status": "Phostaich {name} rud", "notification.status": "Phostaich {name} rud",
"notification.update": "Dheasaich {name} post", "notification.update": "Dheasaich {name} post",
"notification_requests.accept": "Gabh ris", "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": "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_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.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", "notification_requests.maximize": "Làn-mheudaich",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} publicou", "notification.status": "{name} publicou",
"notification.update": "{name} editou unha publicación", "notification.update": "{name} editou unha publicación",
"notification_requests.accept": "Aceptar", "notification_requests.accept": "Aceptar",
"notification_requests.accept_all": "Aceptar todo", "notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitude…} other {Aceptar # solicitudes…}}",
"notification_requests.accept_multiple": "{count, plural, one {Aceptar # solicitude} other {Acceptar # solicitudes}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceptar solicitude} other {Aceptar solicitudes}}",
"notification_requests.confirm_accept_all.button": "Aceptar todo", "notification_requests.confirm_accept_multiple.message": "Vas aceptar {count, plural, one {unha solicitude de notificación} other {# solicitudes de notificación}}. Tes certeza de querer aceptar?",
"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_multiple.title": "Aceptar solicitudes de notificación?",
"notification_requests.confirm_accept_all.title": "Aceptar solicitudes de notificación?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Rexeitar solicitude} other {Rexeitar solicitudes}}",
"notification_requests.confirm_dismiss_all.button": "Rexeitar todo", "notification_requests.confirm_dismiss_multiple.message": "Vas rexeitar {count, plural, one {unha solicitude de notificación} other {# solicitudes de notificación}}. Non poderás volver acceder fácilmente a {count, plural, one {ela} other {elas}}. Tes certeza de querer rexeitar?",
"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_multiple.title": "Rexeitar solicitudes de notificación?",
"notification_requests.confirm_dismiss_all.title": "Rexeitar solicitudes de notificacións?",
"notification_requests.dismiss": "Desbotar", "notification_requests.dismiss": "Desbotar",
"notification_requests.dismiss_all": "Rexeitar todo", "notification_requests.dismiss_multiple": "{count, plural, one {Rexeitar # solicitude…} other {Rexeitar # solicitudes…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Rexeitar # solicitude} other {Rexeitar # solicitudes}}", "notification_requests.edit_selection": "Editar",
"notification_requests.enter_selection_mode": "Escoller", "notification_requests.exit_selection": "Feito",
"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_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.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", "notification_requests.maximize": "Maximizar",

View file

@ -518,19 +518,7 @@
"notification.status": "{name} הרגע פרסמו", "notification.status": "{name} הרגע פרסמו",
"notification.update": "{name} ערכו הודעה", "notification.update": "{name} ערכו הודעה",
"notification_requests.accept": "לקבל", "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": "לבטל",
"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_account": "התראות על פעולות חשבון זה סוננו כי חשבון זה הוגבל על ידי מנהלי הדיונים.",
"notification_requests.explainer_for_limited_remote_account": "התראות על פעולות חשבון זה סוננו כי חשבון זה או השרת שלו הוגבלו על ידי מנהלי הדיונים.", "notification_requests.explainer_for_limited_remote_account": "התראות על פעולות חשבון זה סוננו כי חשבון זה או השרת שלו הוגבלו על ידי מנהלי הדיונים.",
"notification_requests.maximize": "הגדלה למקסימום", "notification_requests.maximize": "הגדלה למקסימום",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} bejegyzést tett közzé", "notification.status": "{name} bejegyzést tett közzé",
"notification.update": "{name} szerkesztett egy bejegyzést", "notification.update": "{name} szerkesztett egy bejegyzést",
"notification_requests.accept": "Elfogadás", "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.accept_multiple": "{count, plural, one {# kérés elfogadása} other {# kérés elfogadása}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Kérés elfogadása} other {Kérések elfogadása}}",
"notification_requests.confirm_accept_all.button": "Összes elfogadása", "notification_requests.confirm_accept_multiple.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.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_multiple.title": "Értesítési kérések elfogadása?",
"notification_requests.confirm_accept_all.title": "Értesítési kérés elfogadása?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Kérés elvetése} other {Kérések elvetése}}",
"notification_requests.confirm_dismiss_all.button": "Összes elutasítása", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Értesítési kérések elvetése?",
"notification_requests.confirm_dismiss_all.title": "Értesítési kérések elvetése?",
"notification_requests.dismiss": "Elvetés", "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.dismiss_multiple": "{count, plural, one {# kérés elvetése} other {# kérés elvetése}}", "notification_requests.edit_selection": "Szerkesztés",
"notification_requests.enter_selection_mode": "Kiválasztás", "notification_requests.exit_selection": "Kész",
"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_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.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", "notification_requests.maximize": "Maximalizálás",

View file

@ -113,7 +113,6 @@
"navigation_bar.lists": "Ndepụta", "navigation_bar.lists": "Ndepụta",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
"notification.reblog": "{name} boosted your status", "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_explore": "See what's trending",
"onboarding.actions.go_to_home": "Go to your home feed", "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!", "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!",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} sendi inn rétt í þessu", "notification.status": "{name} sendi inn rétt í þessu",
"notification.update": "{name} breytti færslu", "notification.update": "{name} breytti færslu",
"notification_requests.accept": "Samþykkja", "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.accept_multiple": "{count, plural, one {Samþykkja # beiðni} other {Samþykkja # beiðnir}}", "notification_requests.confirm_accept_multiple.button": "{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_multiple.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.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_multiple.title": "Samþykkja beiðnir um tilkynningar?",
"notification_requests.confirm_accept_all.title": "Samþykkja beiðnir um tilkynningar?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Afgreiða beiðni} other {Afgreiða beiðnir}}",
"notification_requests.confirm_dismiss_all.button": "Hunsa allt", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Hunsa beiðnir um tilkynningar?",
"notification_requests.confirm_dismiss_all.title": "Hunsa beiðnir um tilkynningar?",
"notification_requests.dismiss": "Afgreiða", "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.dismiss_multiple": "{count, plural, one {Afgreiða # beiðni} other {Afgreiða # beiðnir}}", "notification_requests.edit_selection": "Breyta",
"notification_requests.enter_selection_mode": "Velja", "notification_requests.exit_selection": "Lokið",
"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_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.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", "notification_requests.maximize": "Hámarka",

View file

@ -518,19 +518,7 @@
"notification.status": "{name} ha appena pubblicato un post", "notification.status": "{name} ha appena pubblicato un post",
"notification.update": "{name} ha modificato un post", "notification.update": "{name} ha modificato un post",
"notification_requests.accept": "Accetta", "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": "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_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.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", "notification_requests.maximize": "Ingrandisci",

View file

@ -19,6 +19,7 @@
"about.powered_by": "{mastodon}による分散型ソーシャルメディア", "about.powered_by": "{mastodon}による分散型ソーシャルメディア",
"about.public_visibility": "公開投稿を許可", "about.public_visibility": "公開投稿を許可",
"about.rules": "サーバーのルール", "about.rules": "サーバーのルール",
"account.account_note_header": "自分用メモ",
"account.add_or_remove_from_antenna": "アンテナから追加または外す", "account.add_or_remove_from_antenna": "アンテナから追加または外す",
"account.add_or_remove_from_exclude_antenna": "アンテナ除外条件から追加または外す", "account.add_or_remove_from_exclude_antenna": "アンテナ除外条件から追加または外す",
"account.add_or_remove_from_circle": "サークルから追加または外す", "account.add_or_remove_from_circle": "サークルから追加または外す",
@ -644,14 +645,23 @@
"notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません", "notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません",
"notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません", "notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません",
"notifications.permission_required": "必要な権限が付与されていないため、デスクトップ通知は利用できません。", "notifications.permission_required": "必要な権限が付与されていないため、デスクトップ通知は利用できません。",
"notifications.policy.filter_new_accounts.hint": "作成から{days, plural, other {#日}}以内のアカウントからの通知がブロックされます", "notifications.policy.accept": "受入れ",
"notifications.policy.filter_new_accounts_title": "新しいアカウントからの通知をブロックする", "notifications.policy.accept_hint": "通知を表示します",
"notifications.policy.filter_not_followers_hint": "フォローされていても、フォローから{days, plural, other {#日}}経っていない場合はブロックされます", "notifications.policy.drop": "無視",
"notifications.policy.filter_not_followers_title": "フォローされていないアカウントからの通知をブロックする", "notifications.policy.drop_hint": "通知を破棄します。再表示はできません。",
"notifications.policy.filter_not_following_hint": "手動で通知を受け入れたアカウントはブロックされません", "notifications.policy.filter": "保留",
"notifications.policy.filter_not_following_title": "フォローしていないアカウントからの通知をブロックする", "notifications.policy.filter_hint": "「保留中の通知」に止め置きます",
"notifications.policy.filter_private_mentions_hint": "あなたがメンションした相手からの返信、およびフォローしているアカウントからの返信以外がブロックされます", "notifications.policy.filter_limited_accounts_hint": "モデレーターにより制限されたアカウントから送られる通知が対象です",
"notifications.policy.filter_private_mentions_title": "外部からの非公開の返信をブロックする", "notifications.policy.filter_limited_accounts_title": "モデレーションされたアカウントからの通知",
"notifications.policy.filter_new_accounts.hint": "作成から{days, plural, other {#日}}以内のアカウントが対象です",
"notifications.policy.filter_new_accounts_title": "新しいアカウントからの通知",
"notifications.policy.filter_not_followers_hint": "フォローされていても、フォローから{days, plural, other {#日}}経っていない場合は対象になります",
"notifications.policy.filter_not_followers_title": "フォローされていないアカウントからの通知",
"notifications.policy.filter_not_following_hint": "手動で通知を受け入れたアカウントは対象外です",
"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.enable": "デスクトップ通知を有効にする",
"notifications_permission_banner.how_to_control": "Mastodonを閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。", "notifications_permission_banner.how_to_control": "Mastodonを閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。",
"notifications_permission_banner.title": "お見逃しなく", "notifications_permission_banner.title": "お見逃しなく",
@ -940,6 +950,7 @@
"timeline_hint.remote_resource_not_displayed": "他のサーバーの{resource}は表示されません。", "timeline_hint.remote_resource_not_displayed": "他のサーバーの{resource}は表示されません。",
"timeline_hint.resources.followers": "フォロワー", "timeline_hint.resources.followers": "フォロワー",
"timeline_hint.resources.follows": "フォロー", "timeline_hint.resources.follows": "フォロー",
"timeline_hint.resources.replies": "返信の一部",
"timeline_hint.resources.statuses": "以前の投稿", "timeline_hint.resources.statuses": "以前の投稿",
"trends.counter_by_accounts": "過去{days, plural, one {{days}日} other {{days}日}}に{count, plural, one {{counter}人} other {{counter} 人}}", "trends.counter_by_accounts": "過去{days, plural, one {{days}日} other {{days}日}}に{count, plural, one {{counter}人} other {{counter} 人}}",
"trends.trending_now": "トレンドタグ", "trends.trending_now": "トレンドタグ",

View file

@ -403,7 +403,6 @@
"notification.status": "{name} akken i d-yessufeɣ", "notification.status": "{name} akken i d-yessufeɣ",
"notification_requests.accept": "Qbel", "notification_requests.accept": "Qbel",
"notification_requests.dismiss": "Agi", "notification_requests.dismiss": "Agi",
"notification_requests.exit_selection_mode": "Sefsex",
"notification_requests.notifications_from": "Alɣuten sɣur {name}", "notification_requests.notifications_from": "Alɣuten sɣur {name}",
"notifications.clear": "Sfeḍ alɣuten", "notifications.clear": "Sfeḍ alɣuten",
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk alɣuten-inek·em i lebda?", "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk alɣuten-inek·em i lebda?",

View file

@ -348,7 +348,7 @@
"hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}", "hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}",
"hashtag.follow": "팔로우", "hashtag.follow": "팔로우",
"hashtag.unfollow": "팔로우 해제", "hashtag.unfollow": "팔로우 해제",
"hashtags.and_other": "…그리고 {count, plural,other {#개 더}}", "hashtags.and_other": "…그리고 {count, plural,other {# 개 더}}",
"home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_reblogs": "부스트 표시",
"home.column_settings.show_replies": "답글 표시", "home.column_settings.show_replies": "답글 표시",
"home.hide_announcements": "공지사항 숨기기", "home.hide_announcements": "공지사항 숨기기",
@ -359,6 +359,8 @@
"ignore_notifications_modal.disclaimer": "마스토돈은 당신이 그들의 알림을 무시했다는 걸 알려줄 수 없습니다. 알림을 무시한다고 해서 메시지가 오지 않는 것은 아닙니다.", "ignore_notifications_modal.disclaimer": "마스토돈은 당신이 그들의 알림을 무시했다는 걸 알려줄 수 없습니다. 알림을 무시한다고 해서 메시지가 오지 않는 것은 아닙니다.",
"ignore_notifications_modal.filter_instead": "대신 필터로 거르기", "ignore_notifications_modal.filter_instead": "대신 필터로 거르기",
"ignore_notifications_modal.filter_to_act_users": "여전히 사용자를 수락, 거절, 신고할 수 있습니다", "ignore_notifications_modal.filter_to_act_users": "여전히 사용자를 수락, 거절, 신고할 수 있습니다",
"ignore_notifications_modal.filter_to_avoid_confusion": "필터링은 혼란을 예방하는데 도움이 될 수 있습니다",
"ignore_notifications_modal.filter_to_review_separately": "걸러진 알림들을 개별적으로 검토할 수 있습니다",
"ignore_notifications_modal.ignore": "알림 무시", "ignore_notifications_modal.ignore": "알림 무시",
"ignore_notifications_modal.limited_accounts_title": "중재된 계정의 알림을 무시할까요?", "ignore_notifications_modal.limited_accounts_title": "중재된 계정의 알림을 무시할까요?",
"ignore_notifications_modal.new_accounts_title": "새 계정의 알림을 무시할까요?", "ignore_notifications_modal.new_accounts_title": "새 계정의 알림을 무시할까요?",
@ -441,7 +443,7 @@
"lists.replies_policy.title": "답글 표시:", "lists.replies_policy.title": "답글 표시:",
"lists.search": "팔로우 중인 사람들 중에서 찾기", "lists.search": "팔로우 중인 사람들 중에서 찾기",
"lists.subheading": "리스트", "lists.subheading": "리스트",
"load_pending": "{count}개의 새 항목", "load_pending": "{count, plural, other {#}} 개의 새 항목",
"loading_indicator.label": "불러오는 중...", "loading_indicator.label": "불러오는 중...",
"media_gallery.toggle_visible": "이미지 숨기기", "media_gallery.toggle_visible": "이미지 숨기기",
"moved_to_account_banner.text": "당신의 계정 {disabledAccount}는 {movedToAccount}로 이동하였기 때문에 현재 비활성화 상태입니다.", "moved_to_account_banner.text": "당신의 계정 {disabledAccount}는 {movedToAccount}로 이동하였기 때문에 현재 비활성화 상태입니다.",
@ -516,19 +518,17 @@
"notification.status": "{name} 님이 방금 게시물을 올렸습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다",
"notification.update": "{name} 님이 게시물을 수정했습니다", "notification.update": "{name} 님이 게시물을 수정했습니다",
"notification_requests.accept": "수락", "notification_requests.accept": "수락",
"notification_requests.accept_all": "모두 수락", "notification_requests.accept_multiple": "{count, plural, other {#}} 개의 요청 수락하기",
"notification_requests.accept_multiple": "{count, plural, other {#개의 요청 수락하기}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, other {}}요청 수락하기",
"notification_requests.confirm_accept_all.button": "모두 수락", "notification_requests.confirm_accept_multiple.message": "{count, plural, other {#}} 개의 요청을 수락하려고 합니다. 계속 진행할까요?",
"notification_requests.confirm_accept_all.message": "{count, plural, other {#개의 요청}}을 수락하려 합니다. 계속 진행할까요?", "notification_requests.confirm_accept_multiple.title": "알림 요청을 수락할까요?",
"notification_requests.confirm_accept_all.title": "알림 요청을 수락할까요?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {요청 지우기}}",
"notification_requests.confirm_dismiss_all.button": "모두 지우기", "notification_requests.confirm_dismiss_multiple.message": "{count, plural, other {# 개의 요청}}을 지우려고 합니다. {count, plural, other {}}다시 접근하기 어렵습니다. 계속할까요?",
"notification_requests.confirm_dismiss_all.message": "{count, plural, other {#개의 요청}}을 지우려고 합니다. {count, plural, other {}}다시 접근하기 어렵습니다. 계속할까요?", "notification_requests.confirm_dismiss_multiple.title": "알림 요청을 지울까요?",
"notification_requests.confirm_dismiss_all.title": "알림 요청을 지울까요?",
"notification_requests.dismiss": "지우기", "notification_requests.dismiss": "지우기",
"notification_requests.dismiss_all": "모두 지우기", "notification_requests.dismiss_multiple": "{count, plural, other {# 개의 요청 지우기}}",
"notification_requests.dismiss_multiple": "{count, plural, other {#개의 요청 지우기}}", "notification_requests.edit_selection": "편집",
"notification_requests.enter_selection_mode": "선택", "notification_requests.exit_selection": "완료",
"notification_requests.exit_selection_mode": "취소",
"notification_requests.explainer_for_limited_account": "이 계정은 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.", "notification_requests.explainer_for_limited_account": "이 계정은 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.",
"notification_requests.explainer_for_limited_remote_account": "이 계정 혹은 그가 속한 서버는 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.", "notification_requests.explainer_for_limited_remote_account": "이 계정 혹은 그가 속한 서버는 중재자에 의해 제한되었기 때문에 이 계정의 알림은 걸러졌습니다.",
"notification_requests.maximize": "최대화", "notification_requests.maximize": "최대화",
@ -636,8 +636,8 @@
"poll.closed": "마감", "poll.closed": "마감",
"poll.refresh": "새로고침", "poll.refresh": "새로고침",
"poll.reveal": "결과 보기", "poll.reveal": "결과 보기",
"poll.total_people": "{count}명", "poll.total_people": "{count, plural, other {#}} 명",
"poll.total_votes": "{count} 표", "poll.total_votes": "{count, plural, other {#}} 표",
"poll.vote": "투표", "poll.vote": "투표",
"poll.voted": "이 답변에 투표함", "poll.voted": "이 답변에 투표함",
"poll.votes": "{votes} 표", "poll.votes": "{votes} 표",
@ -670,7 +670,7 @@
"relative_time.minutes": "{number}분 전", "relative_time.minutes": "{number}분 전",
"relative_time.seconds": "{number}초 전", "relative_time.seconds": "{number}초 전",
"relative_time.today": "오늘", "relative_time.today": "오늘",
"reply_indicator.attachments": "{count, plural, one {#} other {#}}개의 첨부파일", "reply_indicator.attachments": "{count, plural, other {#}} 개의 첨부파일",
"reply_indicator.cancel": "취소", "reply_indicator.cancel": "취소",
"reply_indicator.poll": "투표", "reply_indicator.poll": "투표",
"report.block": "차단", "report.block": "차단",
@ -770,7 +770,7 @@
"status.direct_indicator": "개인적인 멘션", "status.direct_indicator": "개인적인 멘션",
"status.edit": "수정", "status.edit": "수정",
"status.edited": "{date}에 마지막으로 편집됨", "status.edited": "{date}에 마지막으로 편집됨",
"status.edited_x_times": "{count}번 수정됨", "status.edited_x_times": "{count, plural, other {{count}}} 번 수정됨",
"status.embed": "임베드", "status.embed": "임베드",
"status.favourite": "좋아요", "status.favourite": "좋아요",
"status.favourites": "{count, plural, other {좋아요}}", "status.favourites": "{count, plural, other {좋아요}}",

View file

@ -475,11 +475,7 @@
"notification.status": "{name} publiko algo", "notification.status": "{name} publiko algo",
"notification.update": "{name} edito una publikasyon", "notification.update": "{name} edito una publikasyon",
"notification_requests.accept": "Acheta", "notification_requests.accept": "Acheta",
"notification_requests.accept_all": "Acheta todos",
"notification_requests.confirm_accept_all.button": "Acheta todos",
"notification_requests.dismiss": "Kita", "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.notifications_from": "Avizos de {name}",
"notification_requests.title": "Avizos filtrados", "notification_requests.title": "Avizos filtrados",
"notification_requests.view": "Amostra avizos", "notification_requests.view": "Amostra avizos",

View file

@ -516,19 +516,17 @@
"notification.status": "{name} ką tik paskelbė", "notification.status": "{name} ką tik paskelbė",
"notification.update": "{name} redagavo įrašą", "notification.update": "{name} redagavo įrašą",
"notification_requests.accept": "Priimti", "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.accept_multiple": "{count, plural, one {Priimti # prašymą} few {Priimti # prašymus} many {Priimti # prašymo} other {Priimti # prašymų}}", "notification_requests.confirm_accept_multiple.button": "{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_multiple.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.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_multiple.title": "Priimti pranešimų prašymus?",
"notification_requests.confirm_accept_all.title": "Priimti pranešimų prašymus?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Atmesti prašymą} few {Atmesti prašymus} many {Atmesti prašymo} other {Atmesti prašymų}}",
"notification_requests.confirm_dismiss_all.button": "Atmesti visus", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Atmesti pranešimų prašymus?",
"notification_requests.confirm_dismiss_all.title": "Atmesti pranešimų prašymus?",
"notification_requests.dismiss": "Atmesti", "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.dismiss_multiple": "{count, plural, one {Atmesti # prašymą} few {Atmesti # prašymus} many {Atmesti # prašymo} other {Atmesti # prašymų}}", "notification_requests.edit_selection": "Redaguoti",
"notification_requests.enter_selection_mode": "Pasirinkti", "notification_requests.exit_selection": "Atlikta",
"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_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.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", "notification_requests.maximize": "Padidinti",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} heeft zojuist een bericht geplaatst", "notification.status": "{name} heeft zojuist een bericht geplaatst",
"notification.update": "{name} heeft een bericht bewerkt", "notification.update": "{name} heeft een bericht bewerkt",
"notification_requests.accept": "Accepteren", "notification_requests.accept": "Accepteren",
"notification_requests.accept_all": "Alles accepteren", "notification_requests.accept_multiple": "{count, plural, one {# verzoek accepteren…} other {# verzoeken accepteren…}}",
"notification_requests.accept_multiple": "{count, plural, one {# verzoek accepteren} other {# verzoeken accepteren}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Verzoek accepteren} other {Verzoeken accepteren}}",
"notification_requests.confirm_accept_all.button": "Alles accepteren", "notification_requests.confirm_accept_multiple.message": "Je staat op het punt om {count, plural, one {een meldingsverzoek} other {# meldingsverzoeken}} te accepteren. Weet je zeker dat je door wilt gaan?",
"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_multiple.title": "Meldingsverzoeken accepteren?",
"notification_requests.confirm_accept_all.title": "Meldingsverzoeken accepteren?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Verzoek afwijzen} other {Verzoeken afwijzen}}",
"notification_requests.confirm_dismiss_all.button": "Alles afwijzen", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Meldingsverzoeken afwijzen?",
"notification_requests.confirm_dismiss_all.title": "Meldingsverzoeken afwijzen?",
"notification_requests.dismiss": "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.dismiss_multiple": "{count, plural, one {# verzoek afwijzen} other {# verzoeken afwijzen}}", "notification_requests.edit_selection": "Bewerken",
"notification_requests.enter_selection_mode": "Selecteren", "notification_requests.exit_selection": "Klaar",
"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_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.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", "notification_requests.maximize": "Maximaliseren",

View file

@ -518,19 +518,7 @@
"notification.status": "{name} la nettopp ut", "notification.status": "{name} la nettopp ut",
"notification.update": "{name} redigerte eit innlegg", "notification.update": "{name} redigerte eit innlegg",
"notification_requests.accept": "Godkjenn", "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": "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_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.explainer_for_limited_remote_account": "Varla frå denne kontoen er filtrerte ut fordi ein moderator har avgrensa kontoen eller tenaren.",
"notification_requests.maximize": "Maksimer", "notification_requests.maximize": "Maksimer",

View file

@ -517,19 +517,17 @@
"notification.status": "{name} opublikował(a) nowy wpis", "notification.status": "{name} opublikował(a) nowy wpis",
"notification.update": "{name} edytował(a) post", "notification.update": "{name} edytował(a) post",
"notification_requests.accept": "Akceptuj", "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.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_all.button": "Przyjmij wszystkie", "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_all.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_accept_all.title": "Przyjąć wnioski o powiadomienia?", "notification_requests.confirm_dismiss_multiple.button": "Odrzuć {count, plural, one {wniosek} other {wnioski}} o powiadomienia",
"notification_requests.confirm_dismiss_all.button": "Odrzuć wszystkie", "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_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_multiple.title": "Odrzuć żądania powiadomień?",
"notification_requests.confirm_dismiss_all.title": "Odrzuć żądania powiadomień?",
"notification_requests.dismiss": "Odrzuć", "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.dismiss_multiple": "Odrzuć {count, plural, one {# wniosek} few {# wnioski} other {# wniosków}} o powiadomienia", "notification_requests.edit_selection": "Edytuj",
"notification_requests.enter_selection_mode": "Wybierz", "notification_requests.exit_selection": "Gotowe",
"notification_requests.exit_selection_mode": "Anuluj",
"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_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.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", "notification_requests.maximize": "Zmaksymalizuj",

View file

@ -498,10 +498,7 @@
"notification.status": "{name} acabou de tootar", "notification.status": "{name} acabou de tootar",
"notification.update": "{name} editou uma publicação", "notification.update": "{name} editou uma publicação",
"notification_requests.accept": "Aceitar", "notification_requests.accept": "Aceitar",
"notification_requests.accept_all": "Aceitar tudo",
"notification_requests.confirm_accept_all.button": "Aceitar tudo",
"notification_requests.dismiss": "Rejeitar", "notification_requests.dismiss": "Rejeitar",
"notification_requests.exit_selection_mode": "Cancelar",
"notification_requests.maximize": "Maximizar", "notification_requests.maximize": "Maximizar",
"notification_requests.notifications_from": "Notificações de {name}", "notification_requests.notifications_from": "Notificações de {name}",
"notification_requests.title": "Notificações filtradas", "notification_requests.title": "Notificações filtradas",

View file

@ -189,6 +189,7 @@
"confirmations.reply.title": "Перепишем пост?", "confirmations.reply.title": "Перепишем пост?",
"confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.confirm": "Отписаться",
"confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
"confirmations.unfollow.title": "Отписаться?",
"conversation.delete": "Удалить беседу", "conversation.delete": "Удалить беседу",
"conversation.mark_as_read": "Отметить как прочитанное", "conversation.mark_as_read": "Отметить как прочитанное",
"conversation.open": "Просмотр беседы", "conversation.open": "Просмотр беседы",
@ -351,6 +352,7 @@
"home.pending_critical_update.link": "Посмотреть обновления", "home.pending_critical_update.link": "Посмотреть обновления",
"home.pending_critical_update.title": "Доступно критическое обновление безопасности!", "home.pending_critical_update.title": "Доступно критическое обновление безопасности!",
"home.show_announcements": "Показать объявления", "home.show_announcements": "Показать объявления",
"ignore_notifications_modal.filter_to_act_users": "Вы и далее сможете принять, отвергнуть и жаловаться на пользователей",
"interaction_modal.description.favourite": "С учётной записью Mastodon, вы можете добавить этот пост в избранное, чтобы сохранить его на будущее и дать автору знать, что пост вам понравился.", "interaction_modal.description.favourite": "С учётной записью Mastodon, вы можете добавить этот пост в избранное, чтобы сохранить его на будущее и дать автору знать, что пост вам понравился.",
"interaction_modal.description.follow": "С учётной записью Mastodon вы можете подписаться на {name}, чтобы получать их посты в своей домашней ленте.", "interaction_modal.description.follow": "С учётной записью Mastodon вы можете подписаться на {name}, чтобы получать их посты в своей домашней ленте.",
"interaction_modal.description.reblog": "С учётной записью Mastodon, вы можете продвинуть этот пост, чтобы поделиться им со своими подписчиками.", "interaction_modal.description.reblog": "С учётной записью Mastodon, вы можете продвинуть этот пост, чтобы поделиться им со своими подписчиками.",

View file

@ -339,6 +339,7 @@
"home.pending_critical_update.link": "Zobraziť aktualizácie", "home.pending_critical_update.link": "Zobraziť aktualizácie",
"home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.", "home.pending_critical_update.title": "Je dostupná kritická bezpečnostná aktualizácia.",
"home.show_announcements": "Zobraziť oznámenia", "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.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.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.", "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.favourite": "{name} hviezdičkuje váš príspevok",
"notification.follow": "{name} vás sleduje", "notification.follow": "{name} vás sleduje",
"notification.follow_request": "{name} vás žiada sledovať", "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.learn_more": "Zisti viac",
"notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.", "notification.moderation_warning.action_delete_statuses": "Niektoré z tvojich príspevkov boli odstránené.",
"notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.", "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.",

View file

@ -487,6 +487,7 @@
"notification.label.private_mention": "Zasebna omemba", "notification.label.private_mention": "Zasebna omemba",
"notification.label.private_reply": "Zasebni odgovor", "notification.label.private_reply": "Zasebni odgovor",
"notification.label.reply": "Odgovori", "notification.label.reply": "Odgovori",
"notification.mention": "Omemba",
"notification.moderation-warning.learn_more": "Več o tem", "notification.moderation-warning.learn_more": "Več o tem",
"notification.moderation_warning": "Prejeli ste opozorilo moderatorjev", "notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
"notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.", "notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
@ -507,13 +508,9 @@
"notification.status": "{name} je pravkar objavil/a", "notification.status": "{name} je pravkar objavil/a",
"notification.update": "{name} je uredil(a) objavo", "notification.update": "{name} je uredil(a) objavo",
"notification_requests.accept": "Sprejmi", "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": "Zavrni",
"notification_requests.dismiss_all": "Opusti vse", "notification_requests.edit_selection": "Uredi",
"notification_requests.enter_selection_mode": "Izberi", "notification_requests.exit_selection": "Opravljeno",
"notification_requests.exit_selection_mode": "Prekliči",
"notification_requests.maximize": "Maksimiraj", "notification_requests.maximize": "Maksimiraj",
"notification_requests.notifications_from": "Obvestila od {name}", "notification_requests.notifications_from": "Obvestila od {name}",
"notification_requests.title": "Filtrirana obvestila", "notification_requests.title": "Filtrirana obvestila",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} sapo postoi", "notification.status": "{name} sapo postoi",
"notification.update": "{name} përpunoi një postim", "notification.update": "{name} përpunoi një postim",
"notification_requests.accept": "Pranoje", "notification_requests.accept": "Pranoje",
"notification_requests.accept_all": "Pranoji krejt", "notification_requests.accept_multiple": "{count, plural, one {Pranoni # kërkesë…} other {Pranoni # kërkesa…}}",
"notification_requests.accept_multiple": "{count, plural, one {Prano # kërkesë} other {Prano # kërkesa}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Pranojeni kërkesën} other {Pranoje kërkesën}}",
"notification_requests.confirm_accept_all.button": "Pranoji krejt", "notification_requests.confirm_accept_multiple.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.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_multiple.title": "Të pranohen kërkesa njoftimesh?",
"notification_requests.confirm_accept_all.title": "Të pranohen kërkesa njoftimesh?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Hidheni tej kërkesën} other {Hidhini tej kërkesat}}",
"notification_requests.confirm_dismiss_all.button": "Hidhi tej krejt", "notification_requests.confirm_dismiss_multiple.message": "Ju ndan një hap nga hedhja tej e {count, plural, one {një kërkese njoftimesh} other {# kërkesash njoftimesh}}. Sdo 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.message": "Ju ndan një hap nga hedhja tej e {count, plural, one {një kërkese njoftimesh} other {# kërkesash njoftimesh}}. Sdo 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_multiple.title": "Të hidhen tej kërkesa njoftimesh?",
"notification_requests.confirm_dismiss_all.title": "Të hidhen tej kërkesa njoftimesh?",
"notification_requests.dismiss": "Hidhe tej", "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.dismiss_multiple": "{count, plural, one {Hidhni tej # kërkesë} other {Hidhni tej # kërkesa}}", "notification_requests.edit_selection": "Përpunoni",
"notification_requests.enter_selection_mode": "Përzgjidhni", "notification_requests.exit_selection": "U bë",
"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_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.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", "notification_requests.maximize": "Maksimizoje",

View file

@ -502,14 +502,9 @@
"notification.status": "{name} publicerade just ett inlägg", "notification.status": "{name} publicerade just ett inlägg",
"notification.update": "{name} redigerade ett inlägg", "notification.update": "{name} redigerade ett inlägg",
"notification_requests.accept": "Godkänn", "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": "Avfärda",
"notification_requests.dismiss_all": "Avvisa alla", "notification_requests.edit_selection": "Redigera",
"notification_requests.dismiss_multiple": "{count, plural, one {Avvisa # förfrågan} other {Avvisa # förfrågningar}}", "notification_requests.exit_selection": "Klar",
"notification_requests.exit_selection_mode": "Avbryt",
"notification_requests.notifications_from": "Aviseringar från {name}", "notification_requests.notifications_from": "Aviseringar från {name}",
"notification_requests.title": "Filtrerade meddelanden", "notification_requests.title": "Filtrerade meddelanden",
"notifications.clear": "Rensa aviseringar", "notifications.clear": "Rensa aviseringar",

View file

@ -515,17 +515,7 @@
"notification.status": "{name} เพิ่งโพสต์", "notification.status": "{name} เพิ่งโพสต์",
"notification.update": "{name} ได้แก้ไขโพสต์", "notification.update": "{name} ได้แก้ไขโพสต์",
"notification_requests.accept": "ยอมรับ", "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": "ปิด",
"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.notifications_from": "การแจ้งเตือนจาก {name}",
"notification_requests.title": "การแจ้งเตือนที่กรองอยู่", "notification_requests.title": "การแจ้งเตือนที่กรองอยู่",
"notification_requests.view": "ดูการแจ้งเตือน", "notification_requests.view": "ดูการแจ้งเตือน",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} az önce gönderdi", "notification.status": "{name} az önce gönderdi",
"notification.update": "{name} bir gönderiyi düzenledi", "notification.update": "{name} bir gönderiyi düzenledi",
"notification_requests.accept": "Onayla", "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.accept_multiple": "{count, plural, one {# isteği kabul et} other {# isteği kabul et}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {İsteği kabul et} other {İstekleri kabul et}}",
"notification_requests.confirm_accept_all.button": "Tümünü kabul et", "notification_requests.confirm_accept_multiple.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.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_multiple.title": "Bildirim isteklerini kabul et?",
"notification_requests.confirm_accept_all.title": "Bildirim taleplerini kabul et?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {İsteği reddet} other {İstekleri reddet}}",
"notification_requests.confirm_dismiss_all.button": "Tümünü reddet", "notification_requests.confirm_dismiss_multiple.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.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_multiple.title": "Bildirim isteklerini reddet?",
"notification_requests.confirm_dismiss_all.title": "Bildirim taleplerini reddet?",
"notification_requests.dismiss": "Yoksay", "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.dismiss_multiple": "{count, plural, one {# isteği reddet} other {# isteği reddet}}", "notification_requests.edit_selection": "Düzenle",
"notification_requests.enter_selection_mode": "Seç", "notification_requests.exit_selection": "Tamamlandı",
"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_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.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", "notification_requests.maximize": "Büyüt",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} щойно дописує", "notification.status": "{name} щойно дописує",
"notification.update": "{name} змінює допис", "notification.update": "{name} змінює допис",
"notification_requests.accept": "Прийняти", "notification_requests.accept": "Прийняти",
"notification_requests.accept_all": "Прийняти все", "notification_requests.accept_multiple": "{count, plural, one {Прийняти # запит…} few {Прийняти # запити…} many {Прийняти # запитів…} other {Прийняти # запит…}}",
"notification_requests.accept_multiple": "{count, plural, one {Прийняти # запит} few {Прийняти # запити} many {Прийняти # запитів} other {Прийняти # запит}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Прийняти запит} other {Прийняти запити}}",
"notification_requests.confirm_accept_all.button": "Прийняти все", "notification_requests.confirm_accept_multiple.message": "Ви збираєтеся прийняти {count, plural, one {запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви впевнені, що хочете продовжити?",
"notification_requests.confirm_accept_all.message": "Ви збираєтеся прийняти {count, plural, one {запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви впевнені, що хочете продовжити?", "notification_requests.confirm_accept_multiple.title": "Прийняти запит на сповіщення?",
"notification_requests.confirm_accept_all.title": "Прийняти запит на сповіщення?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Відхилити запит} other {Відхилити запити}}",
"notification_requests.confirm_dismiss_all.button": "Відхили все", "notification_requests.confirm_dismiss_multiple.message": "Ви збираєтеся відхилити {count, plural, one {один запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви не зможете легко отримати доступ до {count, plural, one {нього} other {них}} пізніше. Ви впевнені, що хочете продовжити?",
"notification_requests.confirm_dismiss_all.message": "Ви збираєтеся відхилити {count, plural, one {запит на сповіщення} few {# запити на сповіщення} many {# запитів на сповіщення} other {# запит на сповіщення}}. Ви не зможете легко отримати доступ до {count, plural, one {нього} other {них}} again. Ви впевнені, що хочете продовжити?", "notification_requests.confirm_dismiss_multiple.title": "Відхилити запити на сповіщення?",
"notification_requests.confirm_dismiss_all.title": "Відхилити запити на сповіщення?",
"notification_requests.dismiss": "Відхилити", "notification_requests.dismiss": "Відхилити",
"notification_requests.dismiss_all": "Відхили все", "notification_requests.dismiss_multiple": "{count, plural, one {Відхилити # запит…} few {Відхилити # запити…} many {Відхилити # запитів…} other {Відхилити # запит…}}",
"notification_requests.dismiss_multiple": "{count, plural, one {Відхилити # запит} other {Відхилити # запити}}", "notification_requests.edit_selection": "Змінити",
"notification_requests.enter_selection_mode": "Вибрати", "notification_requests.exit_selection": "Готово",
"notification_requests.exit_selection_mode": "Скасувати",
"notification_requests.explainer_for_limited_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис обмежений модератором.", "notification_requests.explainer_for_limited_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис обмежений модератором.",
"notification_requests.explainer_for_limited_remote_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис або його сервер обмежений модератором.", "notification_requests.explainer_for_limited_remote_account": "Сповіщення від цього облікового запису фільтровані, оскільки обліковий запис або його сервер обмежений модератором.",
"notification_requests.maximize": "Розгорнути", "notification_requests.maximize": "Розгорнути",

View file

@ -509,7 +509,17 @@
"notification.status": "{name} đăng tút mới", "notification.status": "{name} đăng tút mới",
"notification.update": "{name} đã sửa tút", "notification.update": "{name} đã sửa tút",
"notification_requests.accept": "Chấp nhận", "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": "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_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.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", "notification_requests.maximize": "Tối đa",

View file

@ -518,19 +518,7 @@
"notification.status": "{name} 刚刚发布嘟文", "notification.status": "{name} 刚刚发布嘟文",
"notification.update": "{name} 编辑了嘟文", "notification.update": "{name} 编辑了嘟文",
"notification_requests.accept": "接受", "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": "拒绝",
"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_account": "来自该账户的通知已被过滤,因为该账户已被管理员限制。",
"notification_requests.explainer_for_limited_remote_account": "来自该账户的通知已被过滤,因为该账户或其所在的实例已被管理员限制。", "notification_requests.explainer_for_limited_remote_account": "来自该账户的通知已被过滤,因为该账户或其所在的实例已被管理员限制。",
"notification_requests.maximize": "最大化", "notification_requests.maximize": "最大化",

View file

@ -518,19 +518,17 @@
"notification.status": "{name} 剛剛嘟文", "notification.status": "{name} 剛剛嘟文",
"notification.update": "{name} 已編輯嘟文", "notification.update": "{name} 已編輯嘟文",
"notification_requests.accept": "接受", "notification_requests.accept": "接受",
"notification_requests.accept_all": "全部接受", "notification_requests.accept_multiple": "{count, plural, other {接受 # 則請求...}}",
"notification_requests.accept_multiple": "{count, plural, other {接受 # 則請求}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, other {接受請求}}",
"notification_requests.confirm_accept_all.button": "全部接受", "notification_requests.confirm_accept_multiple.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續?",
"notification_requests.confirm_accept_all.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續?", "notification_requests.confirm_accept_multiple.title": "接受推播通知請求?",
"notification_requests.confirm_accept_all.title": "接受推播通知請求?", "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {忽略請求}}",
"notification_requests.confirm_dismiss_all.button": "全部忽略", "notification_requests.confirm_dismiss_multiple.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續?",
"notification_requests.confirm_dismiss_all.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續?", "notification_requests.confirm_dismiss_multiple.title": "忽略推播通知請求?",
"notification_requests.confirm_dismiss_all.title": "忽略推播通知請求?",
"notification_requests.dismiss": "關閉", "notification_requests.dismiss": "關閉",
"notification_requests.dismiss_all": "全部忽略", "notification_requests.dismiss_multiple": "{count, plural, other {忽略 # 則請求...}}",
"notification_requests.dismiss_multiple": "{count, plural, other {忽略 # 則請求}}", "notification_requests.edit_selection": "編輯",
"notification_requests.enter_selection_mode": "選擇", "notification_requests.exit_selection": "完成",
"notification_requests.exit_selection_mode": "取消",
"notification_requests.explainer_for_limited_account": "由於此帳號已被管理員限制,來自此帳號之通知已被過濾。", "notification_requests.explainer_for_limited_account": "由於此帳號已被管理員限制,來自此帳號之通知已被過濾。",
"notification_requests.explainer_for_limited_remote_account": "由於此帳號或其伺服器已被管理員限制,來自此帳號之通知已被過濾。", "notification_requests.explainer_for_limited_remote_account": "由於此帳號或其伺服器已被管理員限制,來自此帳號之通知已被過濾。",
"notification_requests.maximize": "最大化", "notification_requests.maximize": "最大化",

View file

@ -19,6 +19,7 @@ import {
markNotificationsAsRead, markNotificationsAsRead,
mountNotifications, mountNotifications,
unmountNotifications, unmountNotifications,
refreshStaleNotificationGroups,
} from 'mastodon/actions/notification_groups'; } from 'mastodon/actions/notification_groups';
import { import {
disconnectTimeline, disconnectTimeline,
@ -51,6 +52,7 @@ interface NotificationGroupsState {
readMarkerId: string; readMarkerId: string;
mounted: number; mounted: number;
isTabVisible: boolean; isTabVisible: boolean;
mergedNotifications: 'ok' | 'pending' | 'needs-reload';
} }
const initialState: NotificationGroupsState = { const initialState: NotificationGroupsState = {
@ -58,6 +60,8 @@ const initialState: NotificationGroupsState = {
pendingGroups: [], // holds pending groups in slow mode pendingGroups: [], // holds pending groups in slow mode
scrolledToTop: false, scrolledToTop: false,
isLoading: 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 // The following properties are used to track unread notifications
lastReadId: '0', // used internally for unread notifications lastReadId: '0', // used internally for unread notifications
readMarkerId: '0', // user-facing and updated when focus changes readMarkerId: '0', // user-facing and updated when focus changes
@ -336,6 +340,7 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
json.type === 'gap' ? json : createNotificationGroupFromJSON(json), json.type === 'gap' ? json : createNotificationGroupFromJSON(json),
); );
state.isLoading = false; state.isLoading = false;
state.mergedNotifications = 'ok';
updateLastReadId(state); updateLastReadId(state);
}) })
.addCase(fetchNotificationsGap.fulfilled, (state, action) => { .addCase(fetchNotificationsGap.fulfilled, (state, action) => {
@ -490,7 +495,7 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
state.groups = state.pendingGroups.concat(state.groups); state.groups = state.pendingGroups.concat(state.groups);
state.pendingGroups = []; state.pendingGroups = [];
}) })
.addCase(updateScrollPosition, (state, action) => { .addCase(updateScrollPosition.fulfilled, (state, action) => {
state.scrolledToTop = action.payload.top; state.scrolledToTop = action.payload.top;
updateLastReadId(state); updateLastReadId(state);
trimNotifications(state); trimNotifications(state);
@ -517,7 +522,7 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
action.payload.markers.notifications.last_read_id; action.payload.markers.notifications.last_read_id;
} }
}) })
.addCase(mountNotifications, (state) => { .addCase(mountNotifications.fulfilled, (state) => {
state.mounted += 1; state.mounted += 1;
commitLastReadId(state); commitLastReadId(state);
updateLastReadId(state); updateLastReadId(state);
@ -533,6 +538,10 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
.addCase(unfocusApp, (state) => { .addCase(unfocusApp, (state) => {
state.isTabVisible = false; state.isTabVisible = false;
}) })
.addCase(refreshStaleNotificationGroups.fulfilled, (state, action) => {
if (action.payload.deferredRefresh)
state.mergedNotifications = 'needs-reload';
})
.addMatcher( .addMatcher(
isAnyOf(authorizeFollowRequestSuccess, rejectFollowRequestSuccess), isAnyOf(authorizeFollowRequestSuccess, rejectFollowRequestSuccess),
(state, action) => { (state, action) => {

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M240-400h320v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z" />
</svg>

After

Width:  |  Height:  |  Size: 359 B

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M320-120v-40l80-80H160q-33 0-56.5-23.5T80-320v-440q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v440q0 33-23.5 56.5T800-240H560l80 80v40H320ZM160-440h640v-320H160v320Zm0 0v-320 320Z" />
</svg>

After

Width:  |  Height:  |  Size: 329 B

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M360-160v-240q-83 0-141.5-58.5T160-600q0-83 58.5-141.5T360-800h360v80h-80v560h-80v-560H440v560h-80Z" />
</svg>

After

Width:  |  Height:  |  Size: 243 B

View file

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-400q-33 0-56.5-23.5T200-480q0-33 23.5-56.5T280-560q33 0 56.5 23.5T360-480q0 33-23.5 56.5T280-400Zm0 160q-100 0-170-70T40-480q0-100 70-170t170-70q67 0 121.5 33t86.5 87h352l120 120-180 180-80-60-80 60-85-60h-47q-32 54-86.5 87T280-240Zm0-80q56 0 98.5-34t56.5-86h125l58 41 82-61 71 55 75-75-40-40H435q-14-52-56.5-86T280-640q-66 0-113 47t-47 113q0 66 47 113t113 47Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5f6368"><path d="M280-400q-33 0-56.5-23.5T200-480q0-33 23.5-56.5T280-560q33 0 56.5 23.5T360-480q0 33-23.5 56.5T280-400Zm0 160q-100 0-170-70T40-480q0-100 70-170t170-70q67 0 121.5 33t86.5 87h352l120 120-180 180-80-60-80 60-85-60h-47q-32 54-86.5 87T280-240Zm0-80q56 0 98.5-34t56.5-86h125l58 41 82-61 71 55 75-75-40-40H435q-14-52-56.5-86T280-640q-66 0-113 47t-47 113q0 66 47 113t113 47Z"/></svg>

Before

Width:  |  Height:  |  Size: 471 B

After

Width:  |  Height:  |  Size: 491 B

Before After
Before After

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M280-40q-33 0-56.5-23.5T200-120v-720q0-33 23.5-56.5T280-920h400q33 0 56.5 23.5T760-840v720q0 33-23.5 56.5T680-40H280Zm0-120v40h400v-40H280Zm0-80h400v-480H280v480Zm0-560h400v-40H280v40Zm0 0v-40 40Zm0 640v40-40Z" />
</svg>

After

Width:  |  Height:  |  Size: 353 B

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M120-160q-33 0-56.5-23.5T40-240v-480q0-33 23.5-56.5T120-800h720q33 0 56.5 23.5T920-720v480q0 33-23.5 56.5T840-160H120Zm40-560h-40v480h40v-480Zm80 480h480v-480H240v480Zm560-480v480h40v-480h-40Zm0 0h40-40Zm-640 0h-40 40Z" />
</svg>

After

Width:  |  Height:  |  Size: 362 B

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M280-240q-100 0-170-70T40-480q0-100 70-170t170-70h400q100 0 170 70t70 170q0 100-70 170t-170 70H280Zm0-80h400q66 0 113-47t47-113q0-66-47-113t-113-47H280q-66 0-113 47t-47 113q0 66 47 113t113 47Zm0-40q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm200-120Z" />
</svg>

After

Width:  |  Height:  |  Size: 422 B

View file

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"
fill="#5f6368">
<path
d="M280-240q-100 0-170-70T40-480q0-100 70-170t170-70h400q100 0 170 70t70 170q0 100-70 170t-170 70H280Zm0-80h400q66 0 113-47t47-113q0-66-47-113t-113-47H280q-66 0-113 47t-47 113q0 66 47 113t113 47Zm400-40q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35ZM480-480Z" />
</svg>

After

Width:  |  Height:  |  Size: 424 B

View file

@ -1,10 +1,10 @@
// Dependent colors // Dependent colors
$black: #000000; $black: #000000;
$classic-base-color: #282c37; $classic-base-color: hsl(240deg, 16%, 19%);
$classic-primary-color: #9baec8; $classic-primary-color: hsl(240deg, 29%, 70%);
$classic-secondary-color: #d9e1e8; $classic-secondary-color: hsl(255deg, 25%, 88%);
$classic-highlight-color: #6364ff; $classic-highlight-color: hsl(240deg, 100%, 69%);
$emoji-reaction-color: #42485a !default; $emoji-reaction-color: #42485a !default;
$emoji-reaction-selected-color: #617ed5 !default; $emoji-reaction-selected-color: #617ed5 !default;

View file

@ -1,10 +1,6 @@
// Notes! // Notes!
// Sass color functions, "darken" and "lighten" are automatically replaced. // 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 { .simple_form .button.button-tertiary {
color: $highlight-text-color; color: $highlight-text-color;
} }
@ -561,3 +557,14 @@ a.sparkline {
color: $dark-text-color; 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;
}

View file

@ -2,28 +2,28 @@
$black: #000000; $black: #000000;
$white: #ffffff; $white: #ffffff;
$classic-base-color: #282c37; $classic-base-color: hsl(240deg, 16%, 19%);
$classic-primary-color: #9baec8; $classic-primary-color: hsl(240deg, 29%, 70%);
$classic-secondary-color: #d9e1e8; $classic-secondary-color: hsl(255deg, 25%, 88%);
$classic-highlight-color: #6364ff; $classic-highlight-color: hsl(240deg, 100%, 69%);
$blurple-600: #563acc; // Iris $blurple-600: hsl(252deg, 59%, 51%); // Iris
$blurple-500: #6364ff; // Brand purple $blurple-500: hsl(240deg, 100%, 69%); // Brand purple
$blurple-300: #858afa; // Faded Blue $blurple-300: hsl(237deg, 92%, 75%); // Faded Blue
$grey-600: #4e4c5a; // Trout $grey-600: hsl(240deg, 8%, 33%); // Trout
$grey-100: #dadaf3; // Topaz $grey-100: hsl(240deg, 51%, 90%); // Topaz
$emoji-reaction-color: #dfe5f5 !default; $emoji-reaction-color: #dfe5f5 !default;
$emoji-reaction-selected-color: #9ac1f2 !default; $emoji-reaction-selected-color: #9ac1f2 !default;
// Differences // Differences
$success-green: lighten(#3c754d, 8%); $success-green: lighten(hsl(138deg, 32%, 35%), 8%);
$base-overlay-background: $white !default; $base-overlay-background: $white !default;
$valid-value-color: $success-green !default; $valid-value-color: $success-green !default;
$ui-base-color: $classic-secondary-color !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-primary-color: $classic-primary-color !default;
$ui-secondary-color: $classic-base-color !default; $ui-secondary-color: $classic-base-color !default;
$ui-highlight-color: $classic-highlight-color !default; $ui-highlight-color: $classic-highlight-color !default;
@ -38,12 +38,12 @@ $ui-button-tertiary-border-color: $blurple-500 !default;
$primary-text-color: $black !default; $primary-text-color: $black !default;
$darker-text-color: $classic-base-color !default; $darker-text-color: $classic-base-color !default;
$highlight-text-color: $ui-highlight-color !default; $highlight-text-color: $ui-highlight-color !default;
$dark-text-color: #444b5d; $dark-text-color: hsl(240deg, 16%, 32%);
$action-button-color: #606984; $action-button-color: hsl(240deg, 16%, 45%);
$inverted-text-color: $black !default; $inverted-text-color: $black !default;
$lighter-text-color: $classic-base-color !default; $lighter-text-color: $classic-base-color !default;
$light-text-color: #444b5d; $light-text-color: hsl(240deg, 16%, 32%);
// Newly added colors // Newly added colors
$account-background-color: $white !default; $account-background-color: $white !default;
@ -60,12 +60,13 @@ $account-background-color: $white !default;
$emojis-requiring-inversion: 'chains'; $emojis-requiring-inversion: 'chains';
body { body {
--dropdown-border-color: #d9e1e8; --dropdown-border-color: hsl(240deg, 25%, 88%);
--dropdown-background-color: #fff; --dropdown-background-color: #fff;
--modal-border-color: #d9e1e8; --modal-border-color: hsl(240deg, 25%, 88%);
--modal-background-color: var(--background-color-tint); --modal-background-color: var(--background-color-tint);
--background-border-color: #d9e1e8; --background-border-color: hsl(240deg, 25%, 88%);
--background-color: #fff; --background-color: #fff;
--background-color-tint: rgba(255, 255, 255, 80%); --background-color-tint: rgba(255, 255, 255, 80%);
--background-filter: blur(10px); --background-filter: blur(10px);
--on-surface-color: #{transparentize($ui-base-color, 0.65)};
} }

View file

@ -66,7 +66,7 @@
margin-inline-start: 15px; margin-inline-start: 15px;
text-align: start; text-align: start;
i[data-hidden] { svg[data-hidden] {
display: none; display: none;
} }

View file

@ -774,16 +774,6 @@ body > [data-popper-placement] {
gap: 12px; gap: 12px;
flex-wrap: wrap; 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 { .icon-button {
box-sizing: content-box; box-sizing: content-box;
color: $highlight-text-color; color: $highlight-text-color;
@ -4362,7 +4352,7 @@ a.status-card {
text-decoration: none; text-decoration: none;
&:hover { &:hover {
background: lighten($ui-base-color, 2%); background: var(--on-surface-color);
} }
} }
@ -4372,11 +4362,12 @@ a.status-card {
.timeline-hint { .timeline-hint {
text-align: center; text-align: center;
color: $darker-text-color; color: $dark-text-color;
padding: 15px; padding: 16px;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
cursor: default; font-size: 14px;
line-height: 21px;
strong { strong {
font-weight: 500; font-weight: 500;
@ -4393,10 +4384,10 @@ a.status-card {
color: lighten($highlight-text-color, 4%); color: lighten($highlight-text-color, 4%);
} }
} }
}
.timeline-hint--with-descendants { &--with-descendants {
border-top: 1px solid var(--background-border-color); border-top: 1px solid var(--background-border-color);
}
} }
.regeneration-indicator { .regeneration-indicator {
@ -4495,19 +4486,18 @@ a.status-card {
display: flex; display: flex;
} }
&__selection-mode { &__select-menu:disabled {
flex-grow: 1; visibility: hidden;
.text-btn:hover {
text-decoration: underline;
}
} }
&__actions { &__mode-button {
.icon-button { margin-left: auto;
border-radius: 4px; color: $highlight-text-color;
border: 1px solid var(--background-border-color); font-weight: bold;
padding: 5px; font-size: 14px;
&:hover {
color: lighten($highlight-text-color, 6%);
} }
} }
} }
@ -4715,6 +4705,7 @@ a.status-card {
padding: 0; padding: 0;
font-family: inherit; font-family: inherit;
font-size: inherit; font-size: inherit;
font-weight: inherit;
color: inherit; color: inherit;
border: 0; border: 0;
background: transparent; background: transparent;
@ -7864,10 +7855,6 @@ a.status-card {
} }
} }
::-webkit-scrollbar-thumb {
border-radius: 0;
}
noscript { noscript {
text-align: center; text-align: center;
@ -10799,7 +10786,7 @@ noscript {
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background: lighten($ui-base-color, 1%); background: var(--on-surface-color);
} }
.notification-request__checkbox { .notification-request__checkbox {
@ -10986,8 +10973,10 @@ noscript {
} }
&__additional-content { &__additional-content {
color: $darker-text-color; color: $dark-text-color;
margin-top: -8px; // to offset the parent's `gap` property margin-top: -8px; // to offset the parent's `gap` property
font-size: 15px;
line-height: 22px;
} }
} }
@ -11041,6 +11030,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 { .notification-ungrouped {
padding: 16px 24px; padding: 16px 24px;
border-bottom: 1px solid var(--background-border-color); border-bottom: 1px solid var(--background-border-color);

View file

@ -53,22 +53,29 @@ table {
border-spacing: 0; border-spacing: 0;
} }
html { @supports not selector(::-webkit-scrollbar) {
scrollbar-color: var(--background-border-color); html {
scrollbar-color: $action-button-color var(--background-border-color);
scrollbar-width: thin;
}
} }
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 4px; width: 8px;
height: 4px; height: 8px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background-color: $ui-highlight-color; background-color: $action-button-color;
opacity: .25; 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 { ::-webkit-scrollbar-track {
background-color: var(--background-border-color); background-color: var(--background-border-color);
border-radius: 0px;
} }
::-webkit-scrollbar-corner { ::-webkit-scrollbar-corner {

View file

@ -7,8 +7,8 @@ $blurple-600: #563acc; // Iris
$blurple-500: #6364ff; // Brand purple $blurple-500: #6364ff; // Brand purple
$blurple-400: #7477fd; // Medium slate blue $blurple-400: #7477fd; // Medium slate blue
$blurple-300: #858afa; // Faded Blue $blurple-300: #858afa; // Faded Blue
$grey-600: #4e4c5a; // Trout $grey-600: hsl(240deg, 8%, 33%); // Trout
$grey-100: #dadaf3; // Topaz $grey-100: hsl(240deg, 51%, 90%); // Topaz
$success-green: #79bd9a !default; // Padua $success-green: #79bd9a !default; // Padua
$error-red: $red-500 !default; // Cerise $error-red: $red-500 !default; // Cerise
@ -19,10 +19,10 @@ $kmyblue: #29a5f7 !default;
$red-bookmark: $warning-red; $red-bookmark: $warning-red;
// Values from the classic Mastodon UI // Values from the classic Mastodon UI
$classic-base-color: #282c37; // Midnight Express $classic-base-color: hsl(240deg, 16%, 19%);
$classic-primary-color: #9baec8; // Echo Blue $classic-primary-color: hsl(240deg, 29%, 70%);
$classic-secondary-color: #d9e1e8; // Pattens Blue $classic-secondary-color: hsl(255deg, 25%, 88%);
$classic-highlight-color: #6364ff; // Brand purple $classic-highlight-color: $blurple-500;
// Values for kmyblue original functions // Values for kmyblue original functions
$emoji-reaction-color: #42485a !default; $emoji-reaction-color: #42485a !default;
@ -114,6 +114,7 @@ $font-monospace: 'mastodon-font-monospace' !default;
--surface-background-color: #{darken($ui-base-color, 4%)}; --surface-background-color: #{darken($ui-base-color, 4%)};
--surface-variant-background-color: #{$ui-base-color}; --surface-variant-background-color: #{$ui-base-color};
--surface-variant-active-background-color: #{lighten($ui-base-color, 4%)}; --surface-variant-active-background-color: #{lighten($ui-base-color, 4%)};
--on-surface-color: #{transparentize($ui-base-color, 0.5)};
--avatar-border-radius: 8px; --avatar-border-radius: 8px;
--content-font-size: 15px; --content-font-size: 15px;
--content-line-height: 22px; --content-line-height: 22px;

View file

@ -7,7 +7,7 @@ class Themes
include Singleton include Singleton
THEME_COLORS = { THEME_COLORS = {
dark: '#191b22', dark: '#181820',
light: '#ffffff', light: '#ffffff',
}.freeze }.freeze

View file

@ -152,6 +152,7 @@ class Account < ApplicationRecord
scope :dormant, -> { joins(:account_stat).merge(AccountStat.without_recent_activity) } 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_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 :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 after_update_commit :trigger_update_webhooks

View file

@ -31,6 +31,7 @@ class AccountSuggestions::FriendsOfFriendsSource < AccountSuggestions::Source
AND accounts.suspended_at IS NULL AND accounts.suspended_at IS NULL
AND accounts.silenced_at IS NULL AND accounts.silenced_at IS NULL
AND accounts.moved_to_account_id IS NULL AND accounts.moved_to_account_id IS NULL
AND accounts.memorial = FALSE
AND follow_recommendation_mutes.target_account_id IS NULL AND follow_recommendation_mutes.target_account_id IS NULL
GROUP BY accounts.id, account_stats.id GROUP BY accounts.id, account_stats.id
ORDER BY frequency DESC, account_stats.followers_count ASC ORDER BY frequency DESC, account_stats.followers_count ASC

View file

@ -14,6 +14,7 @@ class AccountSuggestions::Source
.searchable .searchable
.where(discoverable: true) .where(discoverable: true)
.without_silenced .without_silenced
.without_memorial
.where.not(follows_sql, id: account.id) .where.not(follows_sql, id: account.id)
.where.not(follow_requests_sql, id: account.id) .where.not(follow_requests_sql, id: account.id)
.not_excluded_by_account(account) .not_excluded_by_account(account)

View file

@ -209,8 +209,8 @@ class Notification < ApplicationRecord
# Notifications that have no `group_key` each count as a separate group. # 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) def paginate_groups_by_max_id(limit, max_id: nil, since_id: nil)
query = reorder(id: :desc) query = reorder(id: :desc)
query = query.where(id: ...max_id) if max_id.present? query = query.where(id: ...(max_id.to_i)) if max_id.present?
query = query.where(id: (since_id + 1)...) if since_id.present? query = query.where(id: (since_id.to_i + 1)...) if since_id.present?
query.paginate_groups(limit, :desc) query.paginate_groups(limit, :desc)
end end
@ -219,8 +219,8 @@ class Notification < ApplicationRecord
# Results will be in ascending order by id. # Results will be in ascending order by id.
def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil) def paginate_groups_by_min_id(limit, max_id: nil, min_id: nil)
query = reorder(id: :asc) query = reorder(id: :asc)
query = query.where(id: (min_id + 1)...) if min_id.present? query = query.where(id: (min_id.to_i + 1)...) if min_id.present?
query = query.where(id: ...max_id) if max_id.present? query = query.where(id: ...(max_id.to_i)) if max_id.present?
query.paginate_groups(limit, :asc) query.paginate_groups(limit, :asc)
end end

View file

@ -14,7 +14,7 @@ class Trends::TagFilter
def results def results
scope = if params[:status] == 'pending_review' scope = if params[:status] == 'pending_review'
Tag.unscoped Tag.unscoped.order(id: :desc)
else else
trending_scope trending_scope
end end

View file

@ -1,9 +1,21 @@
# frozen_string_literal: true # frozen_string_literal: true
class AcceptNotificationRequestService < BaseService class AcceptNotificationRequestService < BaseService
include Redisable
def call(request) def call(request)
NotificationPermission.create!(account: request.account, from_account: request.from_account) NotificationPermission.create!(account: request.account, from_account: request.from_account)
increment_worker_count!(request)
UnfilterNotificationsWorker.perform_async(request.account_id, request.from_account_id) UnfilterNotificationsWorker.perform_async(request.account_id, request.from_account_id)
request.destroy! request.destroy!
end 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 end

View file

@ -1,12 +1,12 @@
- if account.avatar? - if account.avatar?
%tr %tr
%th= t('admin.accounts.avatar') %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 %td
- if account.header? - if account.header?
%tr %tr
%th= t('admin.accounts.header') %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 %td
%tr %tr
%th= t('admin.accounts.role') %th= t('admin.accounts.role')
@ -16,7 +16,7 @@
- else - else
= account.user_role&.name = account.user_role&.name
%td %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 %tr
%th{ rowspan: can?(:create, :email_domain_block) ? 3 : 2 }= t('admin.accounts.email') %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 %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}") %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) - if can?(:create, :email_domain_block)
%tr %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? - if account.user_unconfirmed_email.present?
%tr %tr
%th= t('admin.accounts.unconfirmed_email') %th= t('admin.accounts.unconfirmed_email')
@ -48,7 +48,7 @@
= t 'admin.accounts.security_measures.only_password' = t 'admin.accounts.security_measures.only_password'
%td %td
- if account.user&.two_factor_enabled? && can?(:disable_2fa, account.user) - 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) - if can?(:reset_password, account.user)
%tr %tr
%td %td

View file

@ -12,4 +12,4 @@
= material_symbol DeliveryFailureTracker.available?(account.shared_inbox_url) ? 'check' : 'close' = material_symbol DeliveryFailureTracker.available?(account.shared_inbox_url) ? 'check' : 'close'
%td %td
- if domain_block.nil? - 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)

View file

@ -107,5 +107,5 @@
= render partial: 'account', collection: @accounts, locals: { f: f } = render partial: 'account', collection: @accounts, locals: { f: f }
%nav.pagination %nav.pagination
= link_to_previous_page @accounts, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), rel: 'prev' = link_to_previous_page @accounts, safe_join([material_symbol('chevron_left'), t('pagination.prev')], ' '), rel: 'prev'
= link_to_next_page @accounts, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), rel: 'next' = link_to_next_page @accounts, safe_join([t('pagination.next'), material_symbol('chevron_right')], ' '), rel: 'next'

View file

@ -12,8 +12,8 @@
%div %div
- if can?(:update, announcement) - if can?(:update, announcement)
- if announcement.published? - 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 - 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)

View file

@ -7,7 +7,7 @@
.batch-table__row__content__text .batch-table__row__content__text
%samp :#{custom_emoji.shortcode}: %samp :#{custom_emoji.shortcode}:
= link_to safe_join([fa_icon('pencil'), t('admin.custom_emojis.edit.label')]), edit_admin_custom_emoji_path(custom_emoji, local: params[:local], remote: params[:remote], shortcode: params[:shortcode], by_domain: params[:by_domain]), method: :get, class: 'table-action-link' = link_to safe_join([material_symbol('edit'), t('admin.custom_emojis.edit.label')]), edit_admin_custom_emoji_path(custom_emoji, local: params[:local], remote: params[:remote], shortcode: params[:shortcode], by_domain: params[:by_domain]), method: :get, class: 'table-action-link'
- if custom_emoji.local? - if custom_emoji.local?
%span.information-badge= custom_emoji.category&.name || t('admin.custom_emojis.uncategorized') %span.information-badge= custom_emoji.category&.name || t('admin.custom_emojis.uncategorized')

View file

@ -92,5 +92,5 @@
= render partial: 'custom_emoji', collection: @custom_emojis, locals: { f: f } = render partial: 'custom_emoji', collection: @custom_emojis, locals: { f: f }
%nav.pagination %nav.pagination
= link_to_previous_page @custom_emojis, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), rel: 'prev' = link_to_previous_page @custom_emojis, safe_join([material_symbol('chevron_left'), t('pagination.prev')], ' '), rel: 'prev'
= link_to_next_page @custom_emojis, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), rel: 'next' = link_to_next_page @custom_emojis, safe_join([t('pagination.next'), material_symbol('chevron_right')], ' '), rel: 'next'

View file

@ -2,30 +2,30 @@
%td %td
- unless friend.available - unless friend.available
%span.negative-hint %span.negative-hint
= fa_icon('times') = material_symbol('close')
&nbsp; &nbsp;
= t 'admin.friend_servers.disabled' = t 'admin.friend_servers.disabled'
%samp= friend.domain %samp= friend.domain
%td %td
- if friend.accepted? - if friend.accepted?
%span.positive-hint %span.positive-hint
= fa_icon('check') = material_symbol('check')
&nbsp; &nbsp;
= t 'admin.friend_servers.enabled' = t 'admin.friend_servers.enabled'
- elsif friend.i_am_pending? - elsif friend.i_am_pending?
= fa_icon('hourglass') = material_symbol('hourglass')
&nbsp; &nbsp;
= t 'admin.friend_servers.pending' = t 'admin.friend_servers.pending'
- elsif friend.they_are_pending? - elsif friend.they_are_pending?
%span.warning-hint %span.warning-hint
= fa_icon('hourglass') = material_symbol('hourglass')
&nbsp; &nbsp;
= t 'admin.friend_servers.pending_you' = t 'admin.friend_servers.pending_you'
- else - else
%span.negative-hint %span.negative-hint
= fa_icon('times') = material_symbol('close')
&nbsp; &nbsp;
= t 'admin.friend_servers.disabled' = t 'admin.friend_servers.disabled'
%td %td
= table_link_to 'pencil', t('admin.friend_servers.edit_friend'), edit_admin_friend_server_path(friend) = table_link_to 'edit', t('admin.friend_servers.edit_friend'), edit_admin_friend_server_path(friend)
= table_link_to 'times', t('admin.friend_servers.delete'), admin_friend_server_path(friend), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } = table_link_to 'close', t('admin.friend_servers.delete'), admin_friend_server_path(friend), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }

View file

@ -10,16 +10,16 @@
.fields-group .fields-group
- if @friend.accepted? - if @friend.accepted?
%span.positive-hint %span.positive-hint
= fa_icon('check') = material_symbol('check')
&nbsp; &nbsp;
= t 'admin.friend_servers.enabled' = t 'admin.friend_servers.enabled'
- elsif @friend.pending? - elsif @friend.pending?
= fa_icon('hourglass') = material_symbol('hourglass')
&nbsp; &nbsp;
= t 'admin.friend_servers.pending' = t 'admin.friend_servers.pending'
- else - else
%span.negative-hint %span.negative-hint
= fa_icon('times') = material_symbol('close')
&nbsp; &nbsp;
= t 'admin.friend_servers.disabled' = t 'admin.friend_servers.disabled'
.action-buttons .action-buttons

View file

@ -27,4 +27,4 @@
%td %td
- if invite.valid_for_use? && policy(invite).destroy? - 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

View file

@ -4,10 +4,10 @@
.filters .filters
.back-link .back-link
= link_to edit_admin_ng_rule_path(id: @ng_rule.id) do = link_to edit_admin_ng_rule_path(id: @ng_rule.id) do
= fa_icon 'chevron-left fw' = material_symbol 'chevron_left fw'
= t('admin.ng_rule_histories.back_to_ng_rule') = t('admin.ng_rule_histories.back_to_ng_rule')
= link_to admin_ng_rules_path do = link_to admin_ng_rules_path do
= fa_icon 'chevron-left fw' = material_symbol 'chevron_left fw'
= t('admin.ng_rule_histories.back_to_ng_rules') = t('admin.ng_rule_histories.back_to_ng_rules')
%hr.spacer/ %hr.spacer/

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