Merge pull request #2811 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to b42661ba95
shrike
commit
115fb0a513
|
@ -15,6 +15,7 @@ import type { NotificationGap } from 'flavours/glitch/reducers/notification_grou
|
||||||
import {
|
import {
|
||||||
selectSettingsNotificationsExcludedTypes,
|
selectSettingsNotificationsExcludedTypes,
|
||||||
selectSettingsNotificationsQuickFilterActive,
|
selectSettingsNotificationsQuickFilterActive,
|
||||||
|
selectSettingsNotificationsShows,
|
||||||
} from 'flavours/glitch/selectors/settings';
|
} from 'flavours/glitch/selectors/settings';
|
||||||
import type { AppDispatch } from 'flavours/glitch/store';
|
import type { AppDispatch } from 'flavours/glitch/store';
|
||||||
import {
|
import {
|
||||||
|
@ -104,7 +105,31 @@ export const fetchNotificationsGap = createDataLoadingThunk(
|
||||||
|
|
||||||
export const processNewNotificationForGroups = createAppAsyncThunk(
|
export const processNewNotificationForGroups = createAppAsyncThunk(
|
||||||
'notificationGroups/processNew',
|
'notificationGroups/processNew',
|
||||||
(notification: ApiNotificationJSON, { dispatch }) => {
|
(notification: ApiNotificationJSON, { dispatch, getState }) => {
|
||||||
|
const state = getState();
|
||||||
|
const activeFilter = selectSettingsNotificationsQuickFilterActive(state);
|
||||||
|
const notificationShows = selectSettingsNotificationsShows(state);
|
||||||
|
|
||||||
|
const showInColumn =
|
||||||
|
activeFilter === 'all'
|
||||||
|
? notificationShows[notification.type]
|
||||||
|
: activeFilter === notification.type;
|
||||||
|
|
||||||
|
if (!showInColumn) return;
|
||||||
|
|
||||||
|
if (
|
||||||
|
(notification.type === 'mention' || notification.type === 'update') &&
|
||||||
|
notification.status.filtered
|
||||||
|
) {
|
||||||
|
const filters = notification.status.filtered.filter((result) =>
|
||||||
|
result.filter.context.includes('notifications'),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (filters.some((result) => result.filter.filter_action === 'hide')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dispatchAssociatedRecords(dispatch, [notification]);
|
dispatchAssociatedRecords(dispatch, [notification]);
|
||||||
|
|
||||||
return notification;
|
return notification;
|
||||||
|
|
|
@ -104,7 +104,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
||||||
const notificationJSON = JSON.parse(data.payload);
|
const notificationJSON = JSON.parse(data.payload);
|
||||||
dispatch(updateNotifications(notificationJSON, messages, locale));
|
dispatch(updateNotifications(notificationJSON, messages, locale));
|
||||||
// TODO: remove this once the groups feature replaces the previous one
|
// TODO: remove this once the groups feature replaces the previous one
|
||||||
if(getState().notificationGroups.groups.length > 0) {
|
if(getState().settings.getIn(['notifications', 'groupingBeta'], false)) {
|
||||||
dispatch(processNewNotificationForGroups(notificationJSON));
|
dispatch(processNewNotificationForGroups(notificationJSON));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import { apiRequestGet, apiRequestPut } from 'flavours/glitch/api';
|
||||||
import type { NotificationPolicyJSON } from 'flavours/glitch/api_types/notification_policies';
|
import type { NotificationPolicyJSON } from 'flavours/glitch/api_types/notification_policies';
|
||||||
|
|
||||||
export const apiGetNotificationPolicy = () =>
|
export const apiGetNotificationPolicy = () =>
|
||||||
apiRequestGet<NotificationPolicyJSON>('/v2/notifications/policy');
|
apiRequestGet<NotificationPolicyJSON>('v2/notifications/policy');
|
||||||
|
|
||||||
export const apiUpdateNotificationsPolicy = (
|
export const apiUpdateNotificationsPolicy = (
|
||||||
policy: Partial<NotificationPolicyJSON>,
|
policy: Partial<NotificationPolicyJSON>,
|
||||||
) => apiRequestPut<NotificationPolicyJSON>('/v2/notifications/policy', policy);
|
) => apiRequestPut<NotificationPolicyJSON>('v2/notifications/policy', policy);
|
||||||
|
|
|
@ -58,6 +58,29 @@ export interface ApiPreviewCardJSON {
|
||||||
authors: ApiPreviewCardAuthorJSON[];
|
authors: ApiPreviewCardAuthorJSON[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type FilterContext =
|
||||||
|
| 'home'
|
||||||
|
| 'notifications'
|
||||||
|
| 'public'
|
||||||
|
| 'thread'
|
||||||
|
| 'account';
|
||||||
|
|
||||||
|
export interface ApiFilterJSON {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
context: FilterContext;
|
||||||
|
expires_at: string;
|
||||||
|
filter_action: 'warn' | 'hide';
|
||||||
|
keywords?: unknown[]; // TODO: FilterKeywordSerializer
|
||||||
|
statuses?: unknown[]; // TODO: FilterStatusSerializer
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApiFilterResultJSON {
|
||||||
|
filter: ApiFilterJSON;
|
||||||
|
keyword_matches: string[];
|
||||||
|
status_matches: string[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface ApiStatusJSON {
|
export interface ApiStatusJSON {
|
||||||
id: string;
|
id: string;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
|
@ -80,8 +103,7 @@ export interface ApiStatusJSON {
|
||||||
bookmarked?: boolean;
|
bookmarked?: boolean;
|
||||||
pinned?: boolean;
|
pinned?: boolean;
|
||||||
|
|
||||||
// filtered: FilterResult[]
|
filtered?: ApiFilterResultJSON[];
|
||||||
filtered: unknown; // TODO
|
|
||||||
content?: string;
|
content?: string;
|
||||||
text?: string;
|
text?: string;
|
||||||
|
|
||||||
|
|
|
@ -387,12 +387,14 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
|
||||||
})
|
})
|
||||||
.addCase(processNewNotificationForGroups.fulfilled, (state, action) => {
|
.addCase(processNewNotificationForGroups.fulfilled, (state, action) => {
|
||||||
const notification = action.payload;
|
const notification = action.payload;
|
||||||
processNewNotification(
|
if (notification) {
|
||||||
usePendingItems ? state.pendingGroups : state.groups,
|
processNewNotification(
|
||||||
notification,
|
usePendingItems ? state.pendingGroups : state.groups,
|
||||||
);
|
notification,
|
||||||
updateLastReadId(state);
|
);
|
||||||
trimNotifications(state);
|
updateLastReadId(state);
|
||||||
|
trimNotifications(state);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.addCase(disconnectTimeline, (state, action) => {
|
.addCase(disconnectTimeline, (state, action) => {
|
||||||
if (action.payload.timeline === 'home') {
|
if (action.payload.timeline === 'home') {
|
||||||
|
|
|
@ -8521,7 +8521,8 @@ noscript {
|
||||||
|
|
||||||
.account__avatar {
|
.account__avatar {
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
border: 2px solid var(--background-border-color);
|
border: 1px solid var(--background-border-color);
|
||||||
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,10 +52,6 @@ html {
|
||||||
color: darken($action-button-color, 25%);
|
color: darken($action-button-color, 25%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.account__header__bar .avatar .account__avatar {
|
|
||||||
border-color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.getting-started__footer a {
|
.getting-started__footer a {
|
||||||
color: $ui-secondary-color;
|
color: $ui-secondary-color;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
|
|
|
@ -56,3 +56,40 @@ table {
|
||||||
html {
|
html {
|
||||||
scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);
|
scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: lighten($ui-base-color, 4%);
|
||||||
|
border: 0px none $base-border-color;
|
||||||
|
border-radius: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: lighten($ui-base-color, 6%);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:active {
|
||||||
|
background: lighten($ui-base-color, 4%);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
border: 0px none $base-border-color;
|
||||||
|
border-radius: 0;
|
||||||
|
background: rgba($base-overlay-background, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:hover {
|
||||||
|
background: $ui-base-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:active {
|
||||||
|
background: $ui-base-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-corner {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import type { NotificationGap } from 'mastodon/reducers/notification_groups';
|
||||||
import {
|
import {
|
||||||
selectSettingsNotificationsExcludedTypes,
|
selectSettingsNotificationsExcludedTypes,
|
||||||
selectSettingsNotificationsQuickFilterActive,
|
selectSettingsNotificationsQuickFilterActive,
|
||||||
|
selectSettingsNotificationsShows,
|
||||||
} from 'mastodon/selectors/settings';
|
} from 'mastodon/selectors/settings';
|
||||||
import type { AppDispatch } from 'mastodon/store';
|
import type { AppDispatch } from 'mastodon/store';
|
||||||
import {
|
import {
|
||||||
|
@ -104,7 +105,31 @@ export const fetchNotificationsGap = createDataLoadingThunk(
|
||||||
|
|
||||||
export const processNewNotificationForGroups = createAppAsyncThunk(
|
export const processNewNotificationForGroups = createAppAsyncThunk(
|
||||||
'notificationGroups/processNew',
|
'notificationGroups/processNew',
|
||||||
(notification: ApiNotificationJSON, { dispatch }) => {
|
(notification: ApiNotificationJSON, { dispatch, getState }) => {
|
||||||
|
const state = getState();
|
||||||
|
const activeFilter = selectSettingsNotificationsQuickFilterActive(state);
|
||||||
|
const notificationShows = selectSettingsNotificationsShows(state);
|
||||||
|
|
||||||
|
const showInColumn =
|
||||||
|
activeFilter === 'all'
|
||||||
|
? notificationShows[notification.type]
|
||||||
|
: activeFilter === notification.type;
|
||||||
|
|
||||||
|
if (!showInColumn) return;
|
||||||
|
|
||||||
|
if (
|
||||||
|
(notification.type === 'mention' || notification.type === 'update') &&
|
||||||
|
notification.status.filtered
|
||||||
|
) {
|
||||||
|
const filters = notification.status.filtered.filter((result) =>
|
||||||
|
result.filter.context.includes('notifications'),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (filters.some((result) => result.filter.filter_action === 'hide')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dispatchAssociatedRecords(dispatch, [notification]);
|
dispatchAssociatedRecords(dispatch, [notification]);
|
||||||
|
|
||||||
return notification;
|
return notification;
|
||||||
|
|
|
@ -104,7 +104,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
||||||
const notificationJSON = JSON.parse(data.payload);
|
const notificationJSON = JSON.parse(data.payload);
|
||||||
dispatch(updateNotifications(notificationJSON, messages, locale));
|
dispatch(updateNotifications(notificationJSON, messages, locale));
|
||||||
// TODO: remove this once the groups feature replaces the previous one
|
// TODO: remove this once the groups feature replaces the previous one
|
||||||
if(getState().notificationGroups.groups.length > 0) {
|
if(getState().settings.getIn(['notifications', 'groupingBeta'], false)) {
|
||||||
dispatch(processNewNotificationForGroups(notificationJSON));
|
dispatch(processNewNotificationForGroups(notificationJSON));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import { apiRequestGet, apiRequestPut } from 'mastodon/api';
|
||||||
import type { NotificationPolicyJSON } from 'mastodon/api_types/notification_policies';
|
import type { NotificationPolicyJSON } from 'mastodon/api_types/notification_policies';
|
||||||
|
|
||||||
export const apiGetNotificationPolicy = () =>
|
export const apiGetNotificationPolicy = () =>
|
||||||
apiRequestGet<NotificationPolicyJSON>('/v2/notifications/policy');
|
apiRequestGet<NotificationPolicyJSON>('v2/notifications/policy');
|
||||||
|
|
||||||
export const apiUpdateNotificationsPolicy = (
|
export const apiUpdateNotificationsPolicy = (
|
||||||
policy: Partial<NotificationPolicyJSON>,
|
policy: Partial<NotificationPolicyJSON>,
|
||||||
) => apiRequestPut<NotificationPolicyJSON>('/v2/notifications/policy', policy);
|
) => apiRequestPut<NotificationPolicyJSON>('v2/notifications/policy', policy);
|
||||||
|
|
|
@ -58,6 +58,29 @@ export interface ApiPreviewCardJSON {
|
||||||
authors: ApiPreviewCardAuthorJSON[];
|
authors: ApiPreviewCardAuthorJSON[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type FilterContext =
|
||||||
|
| 'home'
|
||||||
|
| 'notifications'
|
||||||
|
| 'public'
|
||||||
|
| 'thread'
|
||||||
|
| 'account';
|
||||||
|
|
||||||
|
export interface ApiFilterJSON {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
context: FilterContext;
|
||||||
|
expires_at: string;
|
||||||
|
filter_action: 'warn' | 'hide';
|
||||||
|
keywords?: unknown[]; // TODO: FilterKeywordSerializer
|
||||||
|
statuses?: unknown[]; // TODO: FilterStatusSerializer
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApiFilterResultJSON {
|
||||||
|
filter: ApiFilterJSON;
|
||||||
|
keyword_matches: string[];
|
||||||
|
status_matches: string[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface ApiStatusJSON {
|
export interface ApiStatusJSON {
|
||||||
id: string;
|
id: string;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
|
@ -80,8 +103,7 @@ export interface ApiStatusJSON {
|
||||||
bookmarked?: boolean;
|
bookmarked?: boolean;
|
||||||
pinned?: boolean;
|
pinned?: boolean;
|
||||||
|
|
||||||
// filtered: FilterResult[]
|
filtered?: ApiFilterResultJSON[];
|
||||||
filtered: unknown; // TODO
|
|
||||||
content?: string;
|
content?: string;
|
||||||
text?: string;
|
text?: string;
|
||||||
|
|
||||||
|
|
|
@ -356,8 +356,16 @@
|
||||||
"home.pending_critical_update.link": "Veure actualitzacions",
|
"home.pending_critical_update.link": "Veure actualitzacions",
|
||||||
"home.pending_critical_update.title": "Actualització de seguretat crítica disponible!",
|
"home.pending_critical_update.title": "Actualització de seguretat crítica disponible!",
|
||||||
"home.show_announcements": "Mostra els anuncis",
|
"home.show_announcements": "Mostra els anuncis",
|
||||||
|
"ignore_notifications_modal.disclaimer": "Mastodon no pot informar als usuaris de que heu ignorat notificacions seves.\nIgnorar notificacions no evitarà que se segueixin enviant els missatges.",
|
||||||
"ignore_notifications_modal.filter_to_act_users": "Encara podreu acceptar, rebutjar o reportar usuaris",
|
"ignore_notifications_modal.filter_to_act_users": "Encara podreu acceptar, rebutjar o reportar usuaris",
|
||||||
|
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrar ajuda a evitar potencials confusions",
|
||||||
"ignore_notifications_modal.filter_to_review_separately": "Podeu revisar separadament notificacions filtrades",
|
"ignore_notifications_modal.filter_to_review_separately": "Podeu revisar separadament notificacions filtrades",
|
||||||
|
"ignore_notifications_modal.ignore": "Ignora les notificacions",
|
||||||
|
"ignore_notifications_modal.limited_accounts_title": "Voleu ignorar les notificacions dels comptes moderats?",
|
||||||
|
"ignore_notifications_modal.new_accounts_title": "Voleu ignorar les notificacions dels comptes nous?",
|
||||||
|
"ignore_notifications_modal.not_followers_title": "Voleu ignorar les notificacions de qui no us segueix?",
|
||||||
|
"ignore_notifications_modal.not_following_title": "Voleu ignorar les notificacions de qui no seguiu?",
|
||||||
|
"ignore_notifications_modal.private_mentions_title": "Voleu ignorar les notificacions de mencions privades no sol·licitades?",
|
||||||
"interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquest tut perquè l'autor sàpiga que t'ha agradat i desar-lo per a més endavant.",
|
"interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquest tut perquè l'autor sàpiga que t'ha agradat i desar-lo per a més endavant.",
|
||||||
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.",
|
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.",
|
||||||
"interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquest tut per a compartir-lo amb els teus seguidors.",
|
"interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquest tut per a compartir-lo amb els teus seguidors.",
|
||||||
|
@ -514,6 +522,7 @@
|
||||||
"notification_requests.confirm_accept_all.button": "Accepta-ho tot",
|
"notification_requests.confirm_accept_all.button": "Accepta-ho tot",
|
||||||
"notification_requests.confirm_accept_all.message": "Esteu a punt d'acceptar {count, plural, one {una petició de notificació} other {# peticions de notificació}}. N'esteu segurs de continuar?",
|
"notification_requests.confirm_accept_all.message": "Esteu a punt d'acceptar {count, plural, one {una petició de notificació} other {# peticions de notificació}}. N'esteu segurs de continuar?",
|
||||||
"notification_requests.confirm_accept_all.title": "Accepteu peticions de notificació?",
|
"notification_requests.confirm_accept_all.title": "Accepteu peticions de notificació?",
|
||||||
|
"notification_requests.confirm_dismiss_all.button": "Descarta-les totes",
|
||||||
"notification_requests.dismiss": "Ignora",
|
"notification_requests.dismiss": "Ignora",
|
||||||
"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.",
|
||||||
|
|
|
@ -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": "Группа",
|
||||||
|
@ -167,19 +168,25 @@
|
||||||
"confirmations.block.confirm": "Заблокировать",
|
"confirmations.block.confirm": "Заблокировать",
|
||||||
"confirmations.delete.confirm": "Удалить",
|
"confirmations.delete.confirm": "Удалить",
|
||||||
"confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?",
|
"confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?",
|
||||||
|
"confirmations.delete.title": "Удалить пост?",
|
||||||
"confirmations.delete_list.confirm": "Удалить",
|
"confirmations.delete_list.confirm": "Удалить",
|
||||||
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
|
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
|
||||||
|
"confirmations.delete_list.title": "Удалить список?",
|
||||||
"confirmations.discard_edit_media.confirm": "Отменить",
|
"confirmations.discard_edit_media.confirm": "Отменить",
|
||||||
"confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?",
|
"confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?",
|
||||||
"confirmations.edit.confirm": "Редактировать",
|
"confirmations.edit.confirm": "Редактировать",
|
||||||
"confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?",
|
"confirmations.edit.message": "В данный момент, редактирование перезапишет составляемое вами сообщение. Вы уверены, что хотите продолжить?",
|
||||||
|
"confirmations.edit.title": "Переписать сообщение?",
|
||||||
"confirmations.logout.confirm": "Выйти",
|
"confirmations.logout.confirm": "Выйти",
|
||||||
"confirmations.logout.message": "Вы уверены, что хотите выйти?",
|
"confirmations.logout.message": "Вы уверены, что хотите выйти?",
|
||||||
|
"confirmations.logout.title": "Выйти?",
|
||||||
"confirmations.mute.confirm": "Игнорировать",
|
"confirmations.mute.confirm": "Игнорировать",
|
||||||
"confirmations.redraft.confirm": "Удалить и исправить",
|
"confirmations.redraft.confirm": "Удалить и исправить",
|
||||||
"confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут удалены.",
|
"confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут удалены.",
|
||||||
|
"confirmations.redraft.title": "Удалим и исправим пост?",
|
||||||
"confirmations.reply.confirm": "Ответить",
|
"confirmations.reply.confirm": "Ответить",
|
||||||
"confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
|
"confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
|
||||||
|
"confirmations.reply.title": "Перепишем пост?",
|
||||||
"confirmations.unfollow.confirm": "Отписаться",
|
"confirmations.unfollow.confirm": "Отписаться",
|
||||||
"confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
|
"confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
|
||||||
"conversation.delete": "Удалить беседу",
|
"conversation.delete": "Удалить беседу",
|
||||||
|
@ -484,13 +491,16 @@
|
||||||
"notification.update": "{name} изменил(а) пост",
|
"notification.update": "{name} изменил(а) пост",
|
||||||
"notification_requests.accept": "Принять",
|
"notification_requests.accept": "Принять",
|
||||||
"notification_requests.dismiss": "Отклонить",
|
"notification_requests.dismiss": "Отклонить",
|
||||||
|
"notification_requests.maximize": "Развернуть",
|
||||||
"notification_requests.notifications_from": "Уведомления от {name}",
|
"notification_requests.notifications_from": "Уведомления от {name}",
|
||||||
"notification_requests.title": "Отфильтрованные уведомления",
|
"notification_requests.title": "Отфильтрованные уведомления",
|
||||||
"notifications.clear": "Очистить уведомления",
|
"notifications.clear": "Очистить уведомления",
|
||||||
"notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
|
"notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
|
||||||
|
"notifications.clear_title": "Сбросить уведомления?",
|
||||||
"notifications.column_settings.admin.report": "Новые жалобы:",
|
"notifications.column_settings.admin.report": "Новые жалобы:",
|
||||||
"notifications.column_settings.admin.sign_up": "Новые регистрации:",
|
"notifications.column_settings.admin.sign_up": "Новые регистрации:",
|
||||||
"notifications.column_settings.alert": "Уведомления на рабочем столе",
|
"notifications.column_settings.alert": "Уведомления на рабочем столе",
|
||||||
|
"notifications.column_settings.beta.category": "Экспериментальные функции",
|
||||||
"notifications.column_settings.favourite": "Избранные:",
|
"notifications.column_settings.favourite": "Избранные:",
|
||||||
"notifications.column_settings.filter_bar.advanced": "Отображать все категории",
|
"notifications.column_settings.filter_bar.advanced": "Отображать все категории",
|
||||||
"notifications.column_settings.filter_bar.category": "Панель сортировки",
|
"notifications.column_settings.filter_bar.category": "Панель сортировки",
|
||||||
|
@ -519,6 +529,7 @@
|
||||||
"notifications.permission_denied": "Уведомления на рабочем столе недоступны, так как вы запретили их отправку в браузере. Проверьте настройки для сайта, чтобы включить их обратно.",
|
"notifications.permission_denied": "Уведомления на рабочем столе недоступны, так как вы запретили их отправку в браузере. Проверьте настройки для сайта, чтобы включить их обратно.",
|
||||||
"notifications.permission_denied_alert": "Уведомления на рабочем столе недоступны, так как вы ранее отклонили запрос на их отправку.",
|
"notifications.permission_denied_alert": "Уведомления на рабочем столе недоступны, так как вы ранее отклонили запрос на их отправку.",
|
||||||
"notifications.permission_required": "Чтобы включить уведомления на рабочем столе, необходимо разрешить их в браузере.",
|
"notifications.permission_required": "Чтобы включить уведомления на рабочем столе, необходимо разрешить их в браузере.",
|
||||||
|
"notifications.policy.drop": "Игнорируем",
|
||||||
"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_title": "Люди, не подписанные на вас",
|
"notifications.policy.filter_not_followers_title": "Люди, не подписанные на вас",
|
||||||
|
@ -652,8 +663,10 @@
|
||||||
"report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
|
"report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
|
||||||
"report_notification.attached_statuses": "{count, plural, one {{count} сообщение} few {{count} сообщения} many {{count} сообщений} other {{count} сообщений}} вложено",
|
"report_notification.attached_statuses": "{count, plural, one {{count} сообщение} few {{count} сообщения} many {{count} сообщений} other {{count} сообщений}} вложено",
|
||||||
"report_notification.categories.legal": "Правовая информация",
|
"report_notification.categories.legal": "Правовая информация",
|
||||||
|
"report_notification.categories.legal_sentence": "срамной контент",
|
||||||
"report_notification.categories.other": "Прочее",
|
"report_notification.categories.other": "Прочее",
|
||||||
"report_notification.categories.spam": "Спам",
|
"report_notification.categories.spam": "Спам",
|
||||||
|
"report_notification.categories.spam_sentence": "спам",
|
||||||
"report_notification.categories.violation": "Нарушение правил",
|
"report_notification.categories.violation": "Нарушение правил",
|
||||||
"report_notification.open": "Открыть жалобу",
|
"report_notification.open": "Открыть жалобу",
|
||||||
"search.no_recent_searches": "Недавние запросы отсутствуют",
|
"search.no_recent_searches": "Недавние запросы отсутствуют",
|
||||||
|
|
|
@ -387,12 +387,14 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
|
||||||
})
|
})
|
||||||
.addCase(processNewNotificationForGroups.fulfilled, (state, action) => {
|
.addCase(processNewNotificationForGroups.fulfilled, (state, action) => {
|
||||||
const notification = action.payload;
|
const notification = action.payload;
|
||||||
processNewNotification(
|
if (notification) {
|
||||||
usePendingItems ? state.pendingGroups : state.groups,
|
processNewNotification(
|
||||||
notification,
|
usePendingItems ? state.pendingGroups : state.groups,
|
||||||
);
|
notification,
|
||||||
updateLastReadId(state);
|
);
|
||||||
trimNotifications(state);
|
updateLastReadId(state);
|
||||||
|
trimNotifications(state);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.addCase(disconnectTimeline, (state, action) => {
|
.addCase(disconnectTimeline, (state, action) => {
|
||||||
if (action.payload.timeline === 'home') {
|
if (action.payload.timeline === 'home') {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm400-280q17 0 28.5-11.5T520-400q0-17-11.5-28.5T480-440q-17 0-28.5 11.5T440-400q0 17 11.5 28.5T480-360Zm-40-160h80v-240h-80v240Z"/></svg>
|
After Width: | Height: | Size: 332 B |
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-360q17 0 28.5-11.5T520-400q0-17-11.5-28.5T480-440q-17 0-28.5 11.5T440-400q0 17 11.5 28.5T480-360Zm-40-160h80v-240h-80v240ZM80-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: 380 B |
|
@ -52,10 +52,6 @@ html {
|
||||||
color: darken($action-button-color, 25%);
|
color: darken($action-button-color, 25%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.account__header__bar .avatar .account__avatar {
|
|
||||||
border-color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.getting-started__footer a {
|
.getting-started__footer a {
|
||||||
color: $ui-secondary-color;
|
color: $ui-secondary-color;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
|
|
|
@ -7970,7 +7970,8 @@ noscript {
|
||||||
|
|
||||||
.account__avatar {
|
.account__avatar {
|
||||||
background: var(--background-color);
|
background: var(--background-color);
|
||||||
border: 2px solid var(--background-border-color);
|
border: 1px solid var(--background-border-color);
|
||||||
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,3 +56,40 @@ table {
|
||||||
html {
|
html {
|
||||||
scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);
|
scrollbar-color: lighten($ui-base-color, 4%) rgba($base-overlay-background, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: lighten($ui-base-color, 4%);
|
||||||
|
border: 0px none $base-border-color;
|
||||||
|
border-radius: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: lighten($ui-base-color, 6%);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:active {
|
||||||
|
background: lighten($ui-base-color, 4%);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
border: 0px none $base-border-color;
|
||||||
|
border-radius: 0;
|
||||||
|
background: rgba($base-overlay-background, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:hover {
|
||||||
|
background: $ui-base-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:active {
|
||||||
|
background: $ui-base-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-corner {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
|
@ -84,6 +84,7 @@ Devise.setup do |config|
|
||||||
oidc_options[:response_mode] = ENV['OIDC_RESPONSE_MODE'] if ENV['OIDC_RESPONSE_MODE'] # OPTIONAL (default: query)
|
oidc_options[:response_mode] = ENV['OIDC_RESPONSE_MODE'] if ENV['OIDC_RESPONSE_MODE'] # OPTIONAL (default: query)
|
||||||
oidc_options[:display] = ENV['OIDC_DISPLAY'] if ENV['OIDC_DISPLAY'] # OPTIONAL (default: page)
|
oidc_options[:display] = ENV['OIDC_DISPLAY'] if ENV['OIDC_DISPLAY'] # OPTIONAL (default: page)
|
||||||
oidc_options[:prompt] = ENV['OIDC_PROMPT'] if ENV['OIDC_PROMPT'] # OPTIONAL
|
oidc_options[:prompt] = ENV['OIDC_PROMPT'] if ENV['OIDC_PROMPT'] # OPTIONAL
|
||||||
|
oidc_options[:pkce] = ENV['OIDC_USE_PKCE'] == 'true' if ENV['OIDC_USE_PKCE'] # OPTIONAL (default: false)
|
||||||
oidc_options[:send_nonce] = ENV['OIDC_SEND_NONCE'] == 'true' if ENV['OIDC_SEND_NONCE'] # OPTIONAL (default: true)
|
oidc_options[:send_nonce] = ENV['OIDC_SEND_NONCE'] == 'true' if ENV['OIDC_SEND_NONCE'] # OPTIONAL (default: true)
|
||||||
oidc_options[:send_scope_to_token_endpoint] = ENV['OIDC_SEND_SCOPE_TO_TOKEN_ENDPOINT'] == 'true' if ENV['OIDC_SEND_SCOPE_TO_TOKEN_ENDPOINT'] # OPTIONAL (default: true)
|
oidc_options[:send_scope_to_token_endpoint] = ENV['OIDC_SEND_SCOPE_TO_TOKEN_ENDPOINT'] == 'true' if ENV['OIDC_SEND_SCOPE_TO_TOKEN_ENDPOINT'] # OPTIONAL (default: true)
|
||||||
oidc_options[:post_logout_redirect_uri] = ENV['OIDC_IDP_LOGOUT_REDIRECT_URI'] if ENV['OIDC_IDP_LOGOUT_REDIRECT_URI'] # OPTIONAL
|
oidc_options[:post_logout_redirect_uri] = ENV['OIDC_IDP_LOGOUT_REDIRECT_URI'] if ENV['OIDC_IDP_LOGOUT_REDIRECT_URI'] # OPTIONAL
|
||||||
|
|
|
@ -6,12 +6,13 @@ ru:
|
||||||
send_instructions: Вы получите e-mail с инструкцией по подтверждению вашего адреса e-mail в течение нескольких минут.
|
send_instructions: Вы получите e-mail с инструкцией по подтверждению вашего адреса e-mail в течение нескольких минут.
|
||||||
send_paranoid_instructions: Если Ваш адрес e-mail есть в нашей базе данных, вы получите e-mail с инструкцией по подтверждению вашего адреса в течение нескольких минут.
|
send_paranoid_instructions: Если Ваш адрес e-mail есть в нашей базе данных, вы получите e-mail с инструкцией по подтверждению вашего адреса в течение нескольких минут.
|
||||||
failure:
|
failure:
|
||||||
already_authenticated: Вы уже авторизованы.
|
already_authenticated: Вы уже вошли.
|
||||||
inactive: Ваша учётная запись ещё не активирована.
|
inactive: Ваша учётная запись ещё не активирована.
|
||||||
invalid: Неверно введены %{authentication_keys} или пароль.
|
invalid: Неверно введены %{authentication_keys} или пароль.
|
||||||
last_attempt: У Вас есть последняя попытка, после чего вход будет заблокирован.
|
last_attempt: У Вас есть последняя попытка, после чего вход будет заблокирован.
|
||||||
locked: Ваша учётная запись заблокирована.
|
locked: Ваша учётная запись заблокирована.
|
||||||
not_found_in_database: Неверно введены %{authentication_keys} или пароль.
|
not_found_in_database: Неверно введены %{authentication_keys} или пароль.
|
||||||
|
omniauth_user_creation_failure: Ошибка создания учетной записи с этим идентификатором.
|
||||||
pending: Ваша заявка на вступление всё ещё рассматривается.
|
pending: Ваша заявка на вступление всё ещё рассматривается.
|
||||||
timeout: Ваша сессия истекла. Пожалуйста, войдите снова, чтобы продолжить.
|
timeout: Ваша сессия истекла. Пожалуйста, войдите снова, чтобы продолжить.
|
||||||
unauthenticated: Вам необходимо войти или зарегистрироваться.
|
unauthenticated: Вам необходимо войти или зарегистрироваться.
|
||||||
|
|
|
@ -15,7 +15,7 @@ ru:
|
||||||
fragment_present: не может содержать фрагмент.
|
fragment_present: не может содержать фрагмент.
|
||||||
invalid_uri: должен быть правильным URI.
|
invalid_uri: должен быть правильным URI.
|
||||||
relative_uri: должен быть абсолютным URI.
|
relative_uri: должен быть абсолютным URI.
|
||||||
secured_uri: должен быть HTTPS/SSL URI.
|
secured_uri: нужен HTTPS/SSL URI.
|
||||||
doorkeeper:
|
doorkeeper:
|
||||||
applications:
|
applications:
|
||||||
buttons:
|
buttons:
|
||||||
|
@ -83,6 +83,7 @@ ru:
|
||||||
access_denied: Владелец ресурса или сервер авторизации ответил отказом на Ваш запрос.
|
access_denied: Владелец ресурса или сервер авторизации ответил отказом на Ваш запрос.
|
||||||
credential_flow_not_configured: Поток с предоставлением клиенту пароля завершился неудачей, поскольку параметр Doorkeeper.configure.resource_owner_from_credentials не был сконфигурирован.
|
credential_flow_not_configured: Поток с предоставлением клиенту пароля завершился неудачей, поскольку параметр Doorkeeper.configure.resource_owner_from_credentials не был сконфигурирован.
|
||||||
invalid_client: Клиентская аутентификация завершилась неудачей (неизвестный клиент, не включена клиентская аутентификация, или метод аутентификации не поддерживается.
|
invalid_client: Клиентская аутентификация завершилась неудачей (неизвестный клиент, не включена клиентская аутентификация, или метод аутентификации не поддерживается.
|
||||||
|
invalid_code_challenge_method: Метод проверки кода должен быть S256, простой не годится.
|
||||||
invalid_grant: Предоставленный доступ некорректен, истек, отозван, не совпадает с URI перенаправления, использованным в запросе авторизации, или был выпущен для другого клиента.
|
invalid_grant: Предоставленный доступ некорректен, истек, отозван, не совпадает с URI перенаправления, использованным в запросе авторизации, или был выпущен для другого клиента.
|
||||||
invalid_redirect_uri: Включенный URI перенаправления некорректен.
|
invalid_redirect_uri: Включенный URI перенаправления некорректен.
|
||||||
invalid_request:
|
invalid_request:
|
||||||
|
@ -135,6 +136,7 @@ ru:
|
||||||
media: Медиафайлы
|
media: Медиафайлы
|
||||||
mutes: Игнорирует
|
mutes: Игнорирует
|
||||||
notifications: Уведомления
|
notifications: Уведомления
|
||||||
|
profile: Ваш профиль Mastodon
|
||||||
push: Push-уведомления
|
push: Push-уведомления
|
||||||
reports: Обращения
|
reports: Обращения
|
||||||
search: Поиск
|
search: Поиск
|
||||||
|
@ -165,6 +167,7 @@ ru:
|
||||||
admin:write:reports: производить модерацию жалоб
|
admin:write:reports: производить модерацию жалоб
|
||||||
crypto: использ. сквозное шифрование
|
crypto: использ. сквозное шифрование
|
||||||
follow: управлять подписками и списком блокировок
|
follow: управлять подписками и списком блокировок
|
||||||
|
profile: данные вашего профиля только для чтения
|
||||||
push: получать push-уведомления
|
push: получать push-уведомления
|
||||||
read: просматривать данные вашей учётной записи
|
read: просматривать данные вашей учётной записи
|
||||||
read:accounts: видеть информацию об учётных записях
|
read:accounts: видеть информацию об учётных записях
|
||||||
|
|
|
@ -58,6 +58,7 @@ el:
|
||||||
demote: Υποβιβασμός
|
demote: Υποβιβασμός
|
||||||
destroyed_msg: Τα δεδομένα του/της %{username} εκκρεμούν για άμεση διαγραφή
|
destroyed_msg: Τα δεδομένα του/της %{username} εκκρεμούν για άμεση διαγραφή
|
||||||
disable: Πάγωμα
|
disable: Πάγωμα
|
||||||
|
disable_sign_in_token_auth: Απενεργοποίηση επαλήθευσης διακριτικού email
|
||||||
disable_two_factor_authentication: Απενεργοποίηση 2FA
|
disable_two_factor_authentication: Απενεργοποίηση 2FA
|
||||||
disabled: Παγωμένος
|
disabled: Παγωμένος
|
||||||
display_name: Εμφανιζόμενο όνομα
|
display_name: Εμφανιζόμενο όνομα
|
||||||
|
@ -66,6 +67,7 @@ el:
|
||||||
email: Email
|
email: Email
|
||||||
email_status: Κατάσταση email
|
email_status: Κατάσταση email
|
||||||
enable: Ξεπάγωμα
|
enable: Ξεπάγωμα
|
||||||
|
enable_sign_in_token_auth: Ενεργοποίηση ελέγχου ταυτότητας διακριτικού e-mail
|
||||||
enabled: Ενεργοποιημένο
|
enabled: Ενεργοποιημένο
|
||||||
enabled_msg: Επιτυχές ξεπάγωμα λογαριασμού του/της %{username}
|
enabled_msg: Επιτυχές ξεπάγωμα λογαριασμού του/της %{username}
|
||||||
followers: Ακόλουθοι
|
followers: Ακόλουθοι
|
||||||
|
@ -130,6 +132,7 @@ el:
|
||||||
resubscribe: Επανεγγραφή
|
resubscribe: Επανεγγραφή
|
||||||
role: Ρόλος
|
role: Ρόλος
|
||||||
search: Αναζήτηση
|
search: Αναζήτηση
|
||||||
|
search_same_email_domain: Άλλοι χρήστες με τον ίδιο τομέα email
|
||||||
search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP
|
search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP
|
||||||
security: Ασφάλεια
|
security: Ασφάλεια
|
||||||
security_measures:
|
security_measures:
|
||||||
|
@ -170,21 +173,26 @@ el:
|
||||||
approve_appeal: Έγκριση Έφεσης
|
approve_appeal: Έγκριση Έφεσης
|
||||||
approve_user: Έγκριση Χρήστη
|
approve_user: Έγκριση Χρήστη
|
||||||
assigned_to_self_report: Ανάθεση Αναφοράς
|
assigned_to_self_report: Ανάθεση Αναφοράς
|
||||||
|
change_email_user: Αλλαγή email για Χρήστη
|
||||||
change_role_user: Αλλαγή του ρόλου του χρήστη
|
change_role_user: Αλλαγή του ρόλου του χρήστη
|
||||||
confirm_user: Επιβεβαίωση Χρήστη
|
confirm_user: Επιβεβαίωση Χρήστη
|
||||||
create_account_warning: Δημιουργία Προειδοποίησης
|
create_account_warning: Δημιουργία Προειδοποίησης
|
||||||
create_announcement: Δημιουργία Ανακοίνωσης
|
create_announcement: Δημιουργία Ανακοίνωσης
|
||||||
|
create_canonical_email_block: Δημιουργία Αποκλεισμού Email
|
||||||
create_custom_emoji: Δημιουργία Προσαρμοσμένου Emoji
|
create_custom_emoji: Δημιουργία Προσαρμοσμένου Emoji
|
||||||
create_domain_allow: Δημιουργία Αποδεκτού Τομέα
|
create_domain_allow: Δημιουργία Αποδεκτού Τομέα
|
||||||
create_domain_block: Δημιουργία Αποκλεισμού Τομέα
|
create_domain_block: Δημιουργία Αποκλεισμού Τομέα
|
||||||
|
create_email_domain_block: Δημιουργία Αποκλεισμού Τομέα Email
|
||||||
create_ip_block: Δημιουργία κανόνα IP
|
create_ip_block: Δημιουργία κανόνα IP
|
||||||
create_unavailable_domain: Δημιουργία Μη Διαθέσιμου Τομέα
|
create_unavailable_domain: Δημιουργία Μη Διαθέσιμου Τομέα
|
||||||
create_user_role: Δημιουργία Ρόλου
|
create_user_role: Δημιουργία Ρόλου
|
||||||
demote_user: Υποβιβασμός Χρήστη
|
demote_user: Υποβιβασμός Χρήστη
|
||||||
destroy_announcement: Διαγραφή Ανακοίνωσης
|
destroy_announcement: Διαγραφή Ανακοίνωσης
|
||||||
|
destroy_canonical_email_block: Διαγραφή Αποκλεισμού Email
|
||||||
destroy_custom_emoji: Διαγραφή Προσαρμοσμένου Emoji
|
destroy_custom_emoji: Διαγραφή Προσαρμοσμένου Emoji
|
||||||
destroy_domain_allow: Διαγραφή Αποδεκτού Τομέα
|
destroy_domain_allow: Διαγραφή Αποδεκτού Τομέα
|
||||||
destroy_domain_block: Διαγραφή Αποκλεισμού Τομέα
|
destroy_domain_block: Διαγραφή Αποκλεισμού Τομέα
|
||||||
|
destroy_email_domain_block: Διαγραφή Αποκλεισμού Τομέα Email
|
||||||
destroy_instance: Εκκαθάριση Τομέα
|
destroy_instance: Εκκαθάριση Τομέα
|
||||||
destroy_ip_block: Διαγραφή κανόνα IP
|
destroy_ip_block: Διαγραφή κανόνα IP
|
||||||
destroy_status: Διαγραφή Ανάρτησης
|
destroy_status: Διαγραφή Ανάρτησης
|
||||||
|
@ -192,8 +200,10 @@ el:
|
||||||
destroy_user_role: Καταστροφή Ρόλου
|
destroy_user_role: Καταστροφή Ρόλου
|
||||||
disable_2fa_user: Απενεργοποίηση 2FA
|
disable_2fa_user: Απενεργοποίηση 2FA
|
||||||
disable_custom_emoji: Απενεργοποίηση Προσαρμοσμένων Emoji
|
disable_custom_emoji: Απενεργοποίηση Προσαρμοσμένων Emoji
|
||||||
|
disable_sign_in_token_auth_user: Απενεργοποίηση Ελέγχου Ταυτότητας Διακριτικού Email για Χρήστη
|
||||||
disable_user: Απενεργοποίηση Χρήστη
|
disable_user: Απενεργοποίηση Χρήστη
|
||||||
enable_custom_emoji: Ενεργοποίηση Προσαρμοσμένων Emoji
|
enable_custom_emoji: Ενεργοποίηση Προσαρμοσμένων Emoji
|
||||||
|
enable_sign_in_token_auth_user: Ενεργοποίηση Ελέγχου Ταυτότητας Διακριτικού Email για Χρήστη
|
||||||
enable_user: Ενεργοποίηση Χρήστη
|
enable_user: Ενεργοποίηση Χρήστη
|
||||||
memorialize_account: Μετατροπή Λογαριασμού σε Εις Μνήμην
|
memorialize_account: Μετατροπή Λογαριασμού σε Εις Μνήμην
|
||||||
promote_user: Προαγωγή Χρήστη
|
promote_user: Προαγωγή Χρήστη
|
||||||
|
@ -223,12 +233,16 @@ el:
|
||||||
approve_appeal_html: Ο/Η %{name} ενέκρινε την ένσταση της απόφασης των συντονιστών από %{target}
|
approve_appeal_html: Ο/Η %{name} ενέκρινε την ένσταση της απόφασης των συντονιστών από %{target}
|
||||||
approve_user_html: ο/η %{name} ενέκρινε την εγγραφή του %{target}
|
approve_user_html: ο/η %{name} ενέκρινε την εγγραφή του %{target}
|
||||||
assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την αναφορά %{target} στον εαυτό του/της
|
assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την αναφορά %{target} στον εαυτό του/της
|
||||||
|
change_email_user_html: Ο χρήστης %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
|
||||||
change_role_user_html: Ο/Η %{name} άλλαξε ρόλο του/της %{target}
|
change_role_user_html: Ο/Η %{name} άλλαξε ρόλο του/της %{target}
|
||||||
|
confirm_user_html: Ο χρήστης %{name} επιβεβαίωσε τη διεύθυνση email του χρήστη %{target}
|
||||||
create_account_warning_html: Ο/Η %{name} έστειλε προειδοποίηση προς %{target}
|
create_account_warning_html: Ο/Η %{name} έστειλε προειδοποίηση προς %{target}
|
||||||
create_announcement_html: Ο/Η %{name} δημιούργησε νέα ανακοίνωση %{target}
|
create_announcement_html: Ο/Η %{name} δημιούργησε νέα ανακοίνωση %{target}
|
||||||
|
create_canonical_email_block_html: Ο χρήστης %{name} απέκλεισε email με το hash %{target}
|
||||||
create_custom_emoji_html: Ο/Η %{name} ανέβασε νέο emoji %{target}
|
create_custom_emoji_html: Ο/Η %{name} ανέβασε νέο emoji %{target}
|
||||||
create_domain_allow_html: Ο/Η %{name} επέτρεψε την συναλλαγή με τον τομέα %{target}
|
create_domain_allow_html: Ο/Η %{name} επέτρεψε την συναλλαγή με τον τομέα %{target}
|
||||||
create_domain_block_html: Ο/Η %{name} απέκλεισε τον τομέα %{target}
|
create_domain_block_html: Ο/Η %{name} απέκλεισε τον τομέα %{target}
|
||||||
|
create_email_domain_block_html: Ο χρήστης %{name} απέκλεισε τον τομέα email %{target}
|
||||||
create_ip_block_html: Ο/Η %{name} δημιούργησε κανόνα για την IP %{target}
|
create_ip_block_html: Ο/Η %{name} δημιούργησε κανόνα για την IP %{target}
|
||||||
create_unavailable_domain_html: Ο/Η %{name} σταμάτησε να τροφοδοτεί τον τομέα %{target}
|
create_unavailable_domain_html: Ο/Η %{name} σταμάτησε να τροφοδοτεί τον τομέα %{target}
|
||||||
create_user_role_html: Ο/Η %{name} δημιούργησε ρόλο %{target}
|
create_user_role_html: Ο/Η %{name} δημιούργησε ρόλο %{target}
|
||||||
|
|
|
@ -175,6 +175,7 @@ ru:
|
||||||
approve_appeal: Одобрить обжалование
|
approve_appeal: Одобрить обжалование
|
||||||
approve_user: Утвердить
|
approve_user: Утвердить
|
||||||
assigned_to_self_report: Присвоение жалоб
|
assigned_to_self_report: Присвоение жалоб
|
||||||
|
change_email_user: Сменить e-mail для пользователя
|
||||||
change_role_user: Изменить роль пользователя
|
change_role_user: Изменить роль пользователя
|
||||||
confirm_user: Подтверждение пользователей
|
confirm_user: Подтверждение пользователей
|
||||||
create_account_warning: Выдача предупреждения
|
create_account_warning: Выдача предупреждения
|
||||||
|
@ -221,6 +222,7 @@ ru:
|
||||||
update_custom_emoji: Обновление эмодзи
|
update_custom_emoji: Обновление эмодзи
|
||||||
update_domain_block: Изменение блокировки домена
|
update_domain_block: Изменение блокировки домена
|
||||||
update_ip_block: Обновить правило для IP-адреса
|
update_ip_block: Обновить правило для IP-адреса
|
||||||
|
update_report: Обновить рапорт
|
||||||
update_status: Изменение постов
|
update_status: Изменение постов
|
||||||
update_user_role: Обновить роль
|
update_user_role: Обновить роль
|
||||||
actions:
|
actions:
|
||||||
|
@ -436,6 +438,7 @@ ru:
|
||||||
resolve: Проверить домен
|
resolve: Проверить домен
|
||||||
not_permitted: Не разрешено
|
not_permitted: Не разрешено
|
||||||
resolved_through_html: Разрешено через %{domain}
|
resolved_through_html: Разрешено через %{domain}
|
||||||
|
title: Заблокированные e-mail домены
|
||||||
export_domain_allows:
|
export_domain_allows:
|
||||||
new:
|
new:
|
||||||
title: Импорт домена разрешён
|
title: Импорт домена разрешён
|
||||||
|
@ -714,6 +717,7 @@ ru:
|
||||||
manage_taxonomies: Управление трендами
|
manage_taxonomies: Управление трендами
|
||||||
manage_taxonomies_description: Позволяет пользователям модерировать список популярного контента и менять настройки хэштегов
|
manage_taxonomies_description: Позволяет пользователям модерировать список популярного контента и менять настройки хэштегов
|
||||||
manage_user_access: Управление правами пользователей
|
manage_user_access: Управление правами пользователей
|
||||||
|
manage_user_access_description: Разрешает пользователям отключать двухэтапную аутентификацию другим пользователям, менять их e-mail и сбрасывать их пароль
|
||||||
manage_users: Управление пользователями
|
manage_users: Управление пользователями
|
||||||
manage_users_description: Разрешает пользователям просматривать информацию о других пользователях и применять против них модерацию
|
manage_users_description: Разрешает пользователям просматривать информацию о других пользователях и применять против них модерацию
|
||||||
manage_webhooks: Управление веб-хуками
|
manage_webhooks: Управление веб-хуками
|
||||||
|
@ -871,6 +875,8 @@ ru:
|
||||||
action: Нажмите сюда, чтобы узнать подробности
|
action: Нажмите сюда, чтобы узнать подробности
|
||||||
message_html: "<strong>Ваше хранилище объектов неправильно настроено. Безопасность ваших пользователей находится под угрозой</strong>"
|
message_html: "<strong>Ваше хранилище объектов неправильно настроено. Безопасность ваших пользователей находится под угрозой</strong>"
|
||||||
tags:
|
tags:
|
||||||
|
moderation:
|
||||||
|
title: Статус
|
||||||
review: Состояние проверки
|
review: Состояние проверки
|
||||||
updated_msg: Настройки хэштега обновлены
|
updated_msg: Настройки хэштега обновлены
|
||||||
title: Администрирование
|
title: Администрирование
|
||||||
|
|
|
@ -39,12 +39,14 @@ ru:
|
||||||
text: Вы можете обжаловать замечание только один раз
|
text: Вы можете обжаловать замечание только один раз
|
||||||
defaults:
|
defaults:
|
||||||
autofollow: Люди, пришедшие по этому приглашению, автоматически будут подписаны на вас.
|
autofollow: Люди, пришедшие по этому приглашению, автоматически будут подписаны на вас.
|
||||||
|
avatar: WEBP PNG, GIF и JPG. Не более %{size}. Будет уменьшен до %{dimensions}px
|
||||||
bot: Отметьте, если с этой учётной записи выполняются автоматизированные действия и она может не просматриваться владельцем.
|
bot: Отметьте, если с этой учётной записи выполняются автоматизированные действия и она может не просматриваться владельцем.
|
||||||
context: Один или несколько контекстов, к которым должны быть применены фильтры
|
context: Один или несколько контекстов, к которым должны быть применены фильтры
|
||||||
current_password: В целях безопасности введите пароль текущей учётной записи
|
current_password: В целях безопасности введите пароль текущей учётной записи
|
||||||
current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учётной записи
|
current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учётной записи
|
||||||
digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия.
|
digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия.
|
||||||
email: Вам будет отправлено электронное письмо с подтверждением.
|
email: Вам будет отправлено электронное письмо с подтверждением.
|
||||||
|
header: WEBP PNG, GIF и JPG. Не более %{size}. Будет уменьшен до %{dimensions}px
|
||||||
inbox_url: Копировать URL с главной страницы ретранслятора, который вы хотите использовать
|
inbox_url: Копировать URL с главной страницы ретранслятора, который вы хотите использовать
|
||||||
irreversible: Отфильтрованные посты будут утеряны навсегда, даже если в будущем фильтр будет убран
|
irreversible: Отфильтрованные посты будут утеряны навсегда, даже если в будущем фильтр будет убран
|
||||||
locale: Язык интерфейса, e-mail писем и push-уведомлений
|
locale: Язык интерфейса, e-mail писем и push-уведомлений
|
||||||
|
@ -75,6 +77,7 @@ ru:
|
||||||
warn: Скрыть отфильтрованный контент за предупреждением с указанием названия фильтра
|
warn: Скрыть отфильтрованный контент за предупреждением с указанием названия фильтра
|
||||||
form_admin_settings:
|
form_admin_settings:
|
||||||
activity_api_enabled: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе
|
activity_api_enabled: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе
|
||||||
|
backups_retention_period: Пользователи могут создавать архивы своих постов, чтобы потом их забрать. Если задать положительное значение, эти архивы автоматически удалятся с вашего хранилища через указанное число дней.
|
||||||
bootstrap_timeline_accounts: Эти аккаунты будут рекомендованы для подписки новым пользователям.
|
bootstrap_timeline_accounts: Эти аккаунты будут рекомендованы для подписки новым пользователям.
|
||||||
closed_registrations_message: Отображается, когда регистрация закрыта
|
closed_registrations_message: Отображается, когда регистрация закрыта
|
||||||
custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon.
|
custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon.
|
||||||
|
@ -239,6 +242,7 @@ ru:
|
||||||
bootstrap_timeline_accounts: Всегда рекомендовать эти учетные записи новым пользователям
|
bootstrap_timeline_accounts: Всегда рекомендовать эти учетные записи новым пользователям
|
||||||
closed_registrations_message: Сообщение, когда регистрация недоступна
|
closed_registrations_message: Сообщение, когда регистрация недоступна
|
||||||
custom_css: Пользовательский CSS
|
custom_css: Пользовательский CSS
|
||||||
|
favicon: Favicon
|
||||||
mascot: Пользовательский маскот (устаревшее)
|
mascot: Пользовательский маскот (устаревшее)
|
||||||
media_cache_retention_period: Период хранения кэша медиафайлов
|
media_cache_retention_period: Период хранения кэша медиафайлов
|
||||||
peers_api_enabled: Публикация списка обнаруженных узлов в API
|
peers_api_enabled: Публикация списка обнаруженных узлов в API
|
||||||
|
@ -294,6 +298,7 @@ ru:
|
||||||
patch: Уведомлять об обновлении исправлений
|
patch: Уведомлять об обновлении исправлений
|
||||||
trending_tag: Новый тренд требует рассмотрения
|
trending_tag: Новый тренд требует рассмотрения
|
||||||
rule:
|
rule:
|
||||||
|
hint: Больше информации
|
||||||
text: Правило
|
text: Правило
|
||||||
settings:
|
settings:
|
||||||
indexable: Включить страницу профиля в поисковые системы
|
indexable: Включить страницу профиля в поисковые системы
|
||||||
|
|
|
@ -53,7 +53,8 @@ SimpleNavigation::Configuration.run do |navigation|
|
||||||
|
|
||||||
n.item :moderation, safe_join([material_symbol('gavel'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s|
|
n.item :moderation, safe_join([material_symbol('gavel'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s|
|
||||||
s.item :reports, safe_join([material_symbol('flag'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) }
|
s.item :reports, safe_join([material_symbol('flag'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) }
|
||||||
s.item :accounts, safe_join([material_symbol('groups'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) }
|
s.item :appeals, safe_join([material_symbol('feedback'), t('admin.disputes.appeals.title')]), admin_disputes_appeals_path, highlights_on: %r{/admin/disputes/appeals}, if: -> { current_user.can?(:manage_appeals) }
|
||||||
|
s.item :accounts, safe_join([material_symbol('groups'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/users}, if: -> { current_user.can?(:manage_users) }
|
||||||
s.item :tags, safe_join([material_symbol('tag'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags}, if: -> { current_user.can?(:manage_taxonomies) }
|
s.item :tags, safe_join([material_symbol('tag'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags}, if: -> { current_user.can?(:manage_taxonomies) }
|
||||||
s.item :invites, safe_join([material_symbol('person_add'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) }
|
s.item :invites, safe_join([material_symbol('person_add'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) }
|
||||||
s.item :instances, safe_join([material_symbol('cloud'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) }
|
s.item :instances, safe_join([material_symbol('cloud'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) }
|
||||||
|
|
|
@ -75,7 +75,7 @@ class Sanitize
|
||||||
end
|
end
|
||||||
|
|
||||||
MASTODON_STRICT = freeze_config(
|
MASTODON_STRICT = freeze_config(
|
||||||
elements: %w(p br span a abbr del pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li ruby rt rp),
|
elements: %w(p br span a abbr del s pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li ruby rt rp),
|
||||||
|
|
||||||
attributes: {
|
attributes: {
|
||||||
'a' => %w(href rel class title translate),
|
'a' => %w(href rel class title translate),
|
||||||
|
|
Loading…
Reference in New Issue