Merge branch 'main' into feature/require-mfa-by-admin

This commit is contained in:
FredysFonseca 2025-08-20 19:43:38 -04:00 committed by GitHub
commit 879fd3406e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
96 changed files with 1717 additions and 449 deletions

View File

@ -1,17 +1,21 @@
---
Metrics/AbcSize:
Exclude:
- lib/mastodon/cli/*.rb
Enabled: false
Metrics/BlockLength:
Enabled: false
Metrics/BlockNesting:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CollectionLiteralLength:
Enabled: false
Metrics/CyclomaticComplexity:
Exclude:
- lib/mastodon/cli/*.rb
Enabled: false
Metrics/MethodLength:
Enabled: false
@ -20,4 +24,7 @@ Metrics/ModuleLength:
Enabled: false
Metrics/ParameterLists:
CountKeywordArgs: false
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false

View File

@ -6,23 +6,6 @@
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
Max: 82
# Configuration parameters: CountBlocks, CountModifierForms, Max.
Metrics/BlockNesting:
Exclude:
- 'lib/tasks/mastodon.rake'
# Configuration parameters: AllowedMethods, AllowedPatterns.
Metrics/CyclomaticComplexity:
Max: 25
# Configuration parameters: AllowedMethods, AllowedPatterns.
Metrics/PerceivedComplexity:
Max: 27
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowedVars, DefaultToNil.
Style/FetchEnvVar:

View File

@ -17,11 +17,11 @@ ARG RUBY_VERSION="3.4.5"
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
# renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="22"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
ARG DEBIAN_VERSION="bookworm"
# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim)
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
ARG DEBIAN_VERSION="trixie"
# Node.js image to use for base image based on combined variables (ex: 20-trixie-slim)
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-trixie)
FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
@ -96,9 +96,6 @@ RUN \
# Set /opt/mastodon as working directory
WORKDIR /opt/mastodon
# Add backport repository for some specific packages where we need the latest version
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
# hadolint ignore=DL3008,DL3005
RUN \
# Mount Apt cache and lib directories from Docker buildx caches
@ -161,11 +158,11 @@ RUN \
libexif-dev \
libexpat1-dev \
libgirepository1.0-dev \
libheif-dev/bookworm-backports \
libheif-dev \
libhwy-dev \
libimagequant-dev \
libjpeg62-turbo-dev \
liblcms2-dev \
liborc-dev \
libspng-dev \
libtiff-dev \
libwebp-dev \
@ -209,7 +206,7 @@ FROM build AS ffmpeg
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg
ARG FFMPEG_VERSION=7.1
ARG FFMPEG_VERSION=7.1.1
# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
ARG FFMPEG_URL=https://ffmpeg.org/releases
@ -327,28 +324,28 @@ RUN \
# Apt update install non-dev versions of necessary components
apt-get install -y --no-install-recommends \
libexpat1 \
libglib2.0-0 \
libicu72 \
libglib2.0-0t64 \
libicu76 \
libidn12 \
libpq5 \
libreadline8 \
libssl3 \
libreadline8t64 \
libssl3t64 \
libyaml-0-2 \
# libvips components
libcgif0 \
libexif12 \
libheif1/bookworm-backports \
libheif1 \
libhwy1t64 \
libimagequant0 \
libjpeg62-turbo \
liblcms2-2 \
liborc-0.4-0 \
libspng0 \
libtiff6 \
libwebp7 \
libwebpdemux2 \
libwebpmux3 \
# ffmpeg components
libdav1d6 \
libdav1d7 \
libmp3lame0 \
libopencore-amrnb0 \
libopencore-amrwb0 \
@ -358,9 +355,9 @@ RUN \
libvorbis0a \
libvorbisenc2 \
libvorbisfile3 \
libvpx7 \
libvpx9 \
libx264-164 \
libx265-199 \
libx265-215 \
;
# Copy Mastodon sources into final layer

View File

@ -102,7 +102,7 @@ gem 'rdf-normalize', '~> 0.5'
gem 'prometheus_exporter', '~> 2.2', require: false
gem 'opentelemetry-api', '~> 1.5.0'
gem 'opentelemetry-api', '~> 1.6.0'
group :opentelemetry do
gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false

View File

@ -497,7 +497,7 @@ GEM
openssl (3.3.0)
openssl-signature_algorithm (1.3.0)
openssl (> 2.0)
opentelemetry-api (1.5.0)
opentelemetry-api (1.6.0)
opentelemetry-common (0.22.0)
opentelemetry-api (~> 1.0)
opentelemetry-exporter-otlp (0.30.0)
@ -589,7 +589,7 @@ GEM
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-registry (0.4.0)
opentelemetry-api (~> 1.1)
opentelemetry-sdk (1.8.0)
opentelemetry-sdk (1.8.1)
opentelemetry-api (~> 1.1)
opentelemetry-common (~> 0.20)
opentelemetry-registry (~> 0.2)
@ -625,7 +625,7 @@ GEM
premailer (~> 1.7, >= 1.7.9)
prettyprint (0.2.0)
prism (1.4.0)
prometheus_exporter (2.2.0)
prometheus_exporter (2.3.0)
webrick
propshaft (1.2.1)
actionpack (>= 7.0.0)
@ -688,7 +688,7 @@ GEM
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
rails-i18n (8.0.1)
rails-i18n (8.0.2)
i18n (>= 0.7, < 2)
railties (>= 8.0.0, < 9)
railties (8.0.2.1)
@ -806,7 +806,7 @@ GEM
ruby-saml (1.18.1)
nokogiri (>= 1.13.10)
rexml
ruby-vips (2.2.4)
ruby-vips (2.2.5)
ffi (~> 1.12)
logger
rubyzip (3.0.1)
@ -1025,7 +1025,7 @@ DEPENDENCIES
omniauth-rails_csrf_protection (~> 1.0)
omniauth-saml (~> 2.0)
omniauth_openid_connect (~> 0.8.0)
opentelemetry-api (~> 1.5.0)
opentelemetry-api (~> 1.6.0)
opentelemetry-exporter-otlp (~> 0.30.0)
opentelemetry-instrumentation-active_job (~> 0.8.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.22.0)

View File

@ -28,6 +28,6 @@ class Api::V1::Statuses::InteractionPoliciesController < Api::V1::Statuses::Base
def broadcast_updates!
DistributionWorker.perform_async(@status.id, { 'update' => true })
ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id)
ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id, { 'updated_at' => Time.now.utc.iso8601 })
end
end

View File

@ -2,6 +2,7 @@ import type { ApiStatusJSON } from './statuses';
export type ApiQuoteState = 'accepted' | 'pending' | 'revoked' | 'unauthorized';
export type ApiQuotePolicy = 'public' | 'followers' | 'nobody' | 'unknown';
export type ApiUserQuotePolicy = 'automatic' | 'manual' | 'denied' | 'unknown';
interface ApiQuoteEmptyJSON {
state: Exclude<ApiQuoteState, 'accepted'>;
@ -25,7 +26,7 @@ export type ApiQuoteJSON = ApiQuoteAcceptedJSON | ApiQuoteEmptyJSON;
export interface ApiQuotePolicyJSON {
automatic: ApiQuotePolicy[];
manual: ApiQuotePolicy[];
current_user: ApiQuotePolicy;
current_user: ApiUserQuotePolicy;
}
export function isQuotePolicy(policy: string): policy is ApiQuotePolicy {

View File

@ -53,6 +53,7 @@ const AutosuggestTextarea = forwardRef(({
onFocus,
autoFocus = true,
lang,
className,
}, textareaRef) => {
const [suggestionsHidden, setSuggestionsHidden] = useState(true);
@ -192,7 +193,7 @@ const AutosuggestTextarea = forwardRef(({
};
return (
<div className='autosuggest-textarea'>
<div className={classNames('autosuggest-textarea', className)}>
<Textarea
ref={textareaRef}
className='autosuggest-textarea__textarea'

View File

@ -41,13 +41,16 @@ import { IconButton } from './icon_button';
let id = 0;
type RenderItemFn<Item = MenuItem> = (
export interface RenderItemFnHandlers {
onClick: React.MouseEventHandler;
onKeyUp: React.KeyboardEventHandler;
}
export type RenderItemFn<Item = MenuItem> = (
item: Item,
index: number,
handlers: {
onClick: (e: React.MouseEvent) => void;
onKeyUp: (e: React.KeyboardEvent) => void;
},
handlers: RenderItemFnHandlers,
focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void,
) => React.ReactNode;
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
@ -173,7 +176,7 @@ export const DropdownMenu = <Item = MenuItem,>({
onItemClick(item, i);
} else if (isActionItem(item)) {
e.preventDefault();
item.action();
item.action(e);
}
},
[onClose, onItemClick, items],
@ -277,10 +280,15 @@ export const DropdownMenu = <Item = MenuItem,>({
})}
>
{items.map((option, i) =>
renderItemMethod(option, i, {
onClick: handleItemClick,
onKeyUp: handleItemKeyUp,
}),
renderItemMethod(
option,
i,
{
onClick: handleItemClick,
onKeyUp: handleItemKeyUp,
},
i === 0 ? handleFocusedItemRef : undefined,
),
)}
</ul>
)}
@ -307,7 +315,9 @@ interface DropdownProps<Item = MenuItem> {
forceDropdown?: boolean;
renderItem?: RenderItemFn<Item>;
renderHeader?: RenderHeaderFn<Item>;
onOpen?: () => void;
onOpen?: // Must use a union type for the full function as a union with void is not allowed.
| ((event: React.MouseEvent | React.KeyboardEvent) => void)
| ((event: React.MouseEvent | React.KeyboardEvent) => boolean);
onItemClick?: ItemClickFn<Item>;
}
@ -376,7 +386,7 @@ export const Dropdown = <Item = MenuItem,>({
onItemClick(item, i);
} else if (isActionItem(item)) {
e.preventDefault();
item.action();
item.action(e);
}
},
[handleClose, onItemClick, items],
@ -389,7 +399,10 @@ export const Dropdown = <Item = MenuItem,>({
if (open) {
handleClose();
} else {
onOpen?.();
const allow = onOpen?.(e);
if (allow === false) {
return;
}
if (prefetchAccountId) {
dispatch(fetchRelationships([prefetchAccountId]));

View File

@ -10,6 +10,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import CancelFillIcon from '@/material-icons/400-24px/cancel-fill.svg?react';
import { Hotkeys } from 'mastodon/components/hotkeys';
import { ContentWarning } from 'mastodon/components/content_warning';
import { FilterWarning } from 'mastodon/components/filter_warning';
@ -34,6 +35,8 @@ import StatusActionBar from './status_action_bar';
import StatusContent from './status_content';
import { StatusThreadLabel } from './status_thread_label';
import { VisibilityIcon } from './visibility_icon';
import { IconButton } from './icon_button';
const domParser = new DOMParser();
export const textForScreenReader = (intl, status, rebloggedByText = false) => {
@ -75,6 +78,7 @@ const messages = defineMessages({
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' },
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' },
edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' },
});
class Status extends ImmutablePureComponent {
@ -126,6 +130,7 @@ class Status extends ImmutablePureComponent {
inUse: PropTypes.bool,
available: PropTypes.bool,
}),
contextType: PropTypes.string,
...WithOptionalRouterPropTypes,
};
@ -359,6 +364,10 @@ class Status extends ImmutablePureComponent {
this.setState(state => ({ ...state, showDespiteFilter: !state.showDespiteFilter }));
};
handleQuoteCancel = () => {
this.props.onQuoteCancel?.();
}
_properStatus () {
const { status } = this.props;
@ -573,6 +582,16 @@ class Status extends ImmutablePureComponent {
<DisplayName account={status.get('account')} />
</Link>
{this.props.contextType === 'compose' && isQuotedPost && (
<IconButton
onClick={this.handleQuoteCancel}
className='status__quote-cancel'
title={intl.formatMessage(messages.quote_cancel)}
icon="cancel-fill"
iconComponent={CancelFillIcon}
/>
)}
</div>
{matchedFilters && <FilterWarning title={matchedFilters.join(', ')} expanded={this.state.showDespiteFilter} onClick={this.handleFilterToggle} />}

View File

@ -0,0 +1,89 @@
import type { Meta, StoryObj } from '@storybook/react-vite';
import type { StatusVisibility } from '@/mastodon/api_types/statuses';
import { statusFactoryState } from '@/testing/factories';
import { LegacyReblogButton, StatusReblogButton } from './reblog_button';
interface StoryProps {
visibility: StatusVisibility;
quoteAllowed: boolean;
alreadyBoosted: boolean;
reblogCount: number;
}
const meta = {
title: 'Components/Status/ReblogButton',
args: {
visibility: 'public',
quoteAllowed: true,
alreadyBoosted: false,
reblogCount: 0,
},
argTypes: {
visibility: {
name: 'Visibility',
control: { type: 'select' },
options: ['public', 'unlisted', 'private', 'direct'],
},
reblogCount: {
name: 'Boost Count',
description: 'More than 0 will show the counter',
},
quoteAllowed: {
name: 'Quotes allowed',
},
alreadyBoosted: {
name: 'Already boosted',
},
},
render: (args) => (
<StatusReblogButton
status={argsToStatus(args)}
counters={args.reblogCount > 0}
/>
),
} satisfies Meta<StoryProps>;
export default meta;
function argsToStatus({
reblogCount,
visibility,
quoteAllowed,
alreadyBoosted,
}: StoryProps) {
return statusFactoryState({
reblogs_count: reblogCount,
visibility,
reblogged: alreadyBoosted,
quote_approval: {
automatic: [],
manual: [],
current_user: quoteAllowed ? 'automatic' : 'denied',
},
});
}
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const Mine: Story = {
parameters: {
state: {
meta: {
me: '1',
},
},
},
};
export const Legacy: Story = {
render: (args) => (
<LegacyReblogButton
status={argsToStatus(args)}
counters={args.reblogCount > 0}
/>
),
};

View File

@ -0,0 +1,373 @@
import { useCallback, useMemo } from 'react';
import type {
FC,
KeyboardEvent,
MouseEvent,
MouseEventHandler,
SVGProps,
} from 'react';
import type { MessageDescriptor } from 'react-intl';
import { defineMessages, useIntl } from 'react-intl';
import classNames from 'classnames';
import { quoteComposeById } from '@/mastodon/actions/compose_typed';
import { toggleReblog } from '@/mastodon/actions/interactions';
import { openModal } from '@/mastodon/actions/modal';
import type { ActionMenuItem } from '@/mastodon/models/dropdown_menu';
import type { Status, StatusVisibility } from '@/mastodon/models/status';
import {
createAppSelector,
useAppDispatch,
useAppSelector,
} from '@/mastodon/store';
import { isFeatureEnabled } from '@/mastodon/utils/environment';
import FormatQuote from '@/material-icons/400-24px/format_quote.svg?react';
import FormatQuoteOff from '@/material-icons/400-24px/format_quote_off.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
import type { RenderItemFn, RenderItemFnHandlers } from '../dropdown_menu';
import { Dropdown } from '../dropdown_menu';
import { Icon } from '../icon';
import { IconButton } from '../icon_button';
const messages = defineMessages({
all_disabled: {
id: 'status.all_disabled',
defaultMessage: 'Boosts and quotes are disabled',
},
quote: { id: 'status.quote', defaultMessage: 'Quote' },
quote_cannot: {
id: 'status.cannot_quote',
defaultMessage: 'Author has disabled quoting on this post',
},
quote_private: {
id: 'status.quote_private',
defaultMessage: 'Private posts cannot be quoted',
},
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
reblog_cancel: {
id: 'status.cancel_reblog_private',
defaultMessage: 'Unboost',
},
reblog_private: {
id: 'status.reblog_private',
defaultMessage: 'Boost with original visibility',
},
reblog_cannot: {
id: 'status.cannot_reblog',
defaultMessage: 'This post cannot be boosted',
},
});
interface ReblogButtonProps {
status: Status;
counters?: boolean;
}
export const StatusReblogButton: FC<ReblogButtonProps> = ({
status,
counters,
}) => {
const intl = useIntl();
const statusState = useAppSelector((state) =>
selectStatusState(state, status),
);
const { isLoggedIn, isReblogged, isReblogAllowed, isQuoteAllowed } =
statusState;
const { iconComponent } = useMemo(
() => reblogIconText(statusState),
[statusState],
);
const disabled = !isQuoteAllowed && !isReblogAllowed;
const dispatch = useAppDispatch();
const statusId = status.get('id') as string;
const items: ActionMenuItem[] = useMemo(
() => [
{
text: 'reblog',
action: (event) => {
if (isLoggedIn) {
dispatch(toggleReblog(statusId, event.shiftKey));
}
},
},
{
text: 'quote',
action: () => {
if (isLoggedIn) {
dispatch(quoteComposeById(statusId));
}
},
},
],
[dispatch, isLoggedIn, statusId],
);
const handleDropdownOpen = useCallback(
(event: MouseEvent | KeyboardEvent) => {
if (!isLoggedIn) {
dispatch(
openModal({
modalType: 'INTERACTION',
modalProps: {
type: 'reblog',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
}),
);
} else if (event.shiftKey) {
dispatch(toggleReblog(status.get('id'), true));
return false;
}
return true;
},
[dispatch, isLoggedIn, status],
);
const renderMenuItem: RenderItemFn<ActionMenuItem> = useCallback(
(item, index, handlers, focusRefCallback) => (
<ReblogMenuItem
status={status}
index={index}
item={item}
handlers={handlers}
key={`${item.text}-${index}`}
focusRefCallback={focusRefCallback}
/>
),
[status],
);
return (
<Dropdown
items={items}
renderItem={renderMenuItem}
onOpen={handleDropdownOpen}
disabled={disabled}
>
<IconButton
title={intl.formatMessage(
!disabled ? messages.reblog : messages.all_disabled,
)}
icon='retweet'
iconComponent={iconComponent}
counter={counters ? (status.get('reblogs_count') as number) : undefined}
active={isReblogged}
/>
</Dropdown>
);
};
interface ReblogMenuItemProps {
status: Status;
item: ActionMenuItem;
index: number;
handlers: RenderItemFnHandlers;
focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void;
}
const ReblogMenuItem: FC<ReblogMenuItemProps> = ({
status,
index,
item: { text },
handlers,
focusRefCallback,
}) => {
const intl = useIntl();
const statusState = useAppSelector((state) =>
selectStatusState(state, status),
);
const { title, meta, iconComponent, disabled } = useMemo(
() =>
text === 'quote'
? quoteIconText(statusState)
: reblogIconText(statusState),
[statusState, text],
);
const active = useMemo(
() => text === 'reblog' && !!status.get('reblogged'),
[status, text],
);
return (
<li
className={classNames('dropdown-menu__item reblog-button__item', {
disabled,
active,
})}
key={`${text}-${index}`}
>
<button
{...handlers}
title={intl.formatMessage(title)}
ref={focusRefCallback}
disabled={disabled}
data-index={index}
>
<Icon
id={text === 'quote' ? 'quote' : 'retweet'}
icon={iconComponent}
/>
<div>
{intl.formatMessage(title)}
{meta && (
<span className='reblog-button__meta'>
{intl.formatMessage(meta)}
</span>
)}
</div>
</button>
</li>
);
};
// Legacy helpers
// Switch between the legacy and new reblog button based on feature flag.
export const ReblogButton: FC<ReblogButtonProps> = (props) => {
if (isFeatureEnabled('outgoing_quotes')) {
return <StatusReblogButton {...props} />;
}
return <LegacyReblogButton {...props} />;
};
export const LegacyReblogButton: FC<ReblogButtonProps> = ({
status,
counters,
}) => {
const intl = useIntl();
const statusState = useAppSelector((state) =>
selectStatusState(state, status),
);
const { title, meta, iconComponent, disabled } = useMemo(
() => reblogIconText(statusState),
[statusState],
);
const dispatch = useAppDispatch();
const handleClick: MouseEventHandler = useCallback(
(event) => {
if (statusState.isLoggedIn) {
dispatch(toggleReblog(status.get('id') as string, event.shiftKey));
} else {
dispatch(
openModal({
modalType: 'INTERACTION',
modalProps: {
type: 'reblog',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
}),
);
}
},
[dispatch, status, statusState.isLoggedIn],
);
return (
<IconButton
disabled={disabled}
active={!!status.get('reblogged')}
title={intl.formatMessage(meta ?? title)}
icon='retweet'
iconComponent={iconComponent}
onClick={!disabled ? handleClick : undefined}
counter={counters ? (status.get('reblogs_count') as number) : undefined}
/>
);
};
// Helpers for copy and state for status.
const selectStatusState = createAppSelector(
[
(state) => state.meta.get('me') as string | undefined,
(_, status: Status) => status,
],
(userId, status) => {
const isPublic = ['public', 'unlisted'].includes(
status.get('visibility') as StatusVisibility,
);
const isMineAndPrivate =
userId === status.getIn(['account', 'id']) &&
status.get('visibility') === 'private';
return {
isLoggedIn: !!userId,
isPublic,
isMine: userId === status.getIn(['account', 'id']),
isPrivateReblog:
userId === status.getIn(['account', 'id']) &&
status.get('visibility') === 'private',
isReblogged: !!status.get('reblogged'),
isReblogAllowed: isPublic || isMineAndPrivate,
isQuoteAllowed:
status.getIn(['quote_approval', 'current_user']) === 'automatic' &&
(isPublic || isMineAndPrivate),
};
},
);
type StatusState = ReturnType<typeof selectStatusState>;
interface IconText {
title: MessageDescriptor;
meta?: MessageDescriptor;
iconComponent: FC<SVGProps<SVGSVGElement>>;
disabled?: boolean;
}
function reblogIconText({
isPublic,
isPrivateReblog,
isReblogged,
}: StatusState): IconText {
if (isReblogged) {
return {
title: messages.reblog_cancel,
iconComponent: isPublic ? RepeatActiveIcon : RepeatPrivateActiveIcon,
};
}
const iconText: IconText = {
title: messages.reblog,
iconComponent: RepeatIcon,
};
if (isPrivateReblog) {
iconText.meta = messages.reblog_private;
iconText.iconComponent = RepeatPrivateIcon;
} else if (!isPublic) {
iconText.meta = messages.reblog_cannot;
iconText.iconComponent = RepeatDisabledIcon;
iconText.disabled = true;
}
return iconText;
}
function quoteIconText({
isMine,
isQuoteAllowed,
isPublic,
}: StatusState): IconText {
const iconText: IconText = {
title: messages.quote,
iconComponent: FormatQuote,
};
if (!isQuoteAllowed || (!isPublic && !isMine)) {
iconText.meta = !isQuoteAllowed
? messages.quote_cannot
: messages.quote_private;
iconText.iconComponent = FormatQuoteOff;
iconText.disabled = true;
}
return iconText;
}

View File

@ -2,7 +2,6 @@ import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import classNames from 'classnames';
import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
@ -12,15 +11,10 @@ import { connect } from 'react-redux';
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
@ -30,6 +24,7 @@ import { me } from '../initial_state';
import { IconButton } from './icon_button';
import { isFeatureEnabled } from '../utils/environment';
import { ReblogButton } from './status/reblog_button';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
@ -43,10 +38,6 @@ const messages = defineMessages({
share: { id: 'status.share', defaultMessage: 'Share' },
more: { id: 'status.more', defaultMessage: 'More' },
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
@ -85,10 +76,9 @@ class StatusActionBar extends ImmutablePureComponent {
identity: identityContextPropShape,
status: ImmutablePropTypes.map.isRequired,
relationship: ImmutablePropTypes.record,
quotedAccountId: ImmutablePropTypes.string,
quotedAccountId: PropTypes.string,
onReply: PropTypes.func,
onFavourite: PropTypes.func,
onReblog: PropTypes.func,
onDelete: PropTypes.func,
onRevokeQuote: PropTypes.func,
onQuotePolicyChange: PropTypes.func,
@ -152,16 +142,6 @@ class StatusActionBar extends ImmutablePureComponent {
}
};
handleReblogClick = e => {
const { signedIn } = this.props.identity;
if (signedIn) {
this.props.onReblog(this.props.status, e);
} else {
this.props.onInteractionModal('reblog', this.props.status);
}
};
handleBookmarkClick = () => {
this.props.onBookmark(this.props.status);
};
@ -377,25 +357,6 @@ class StatusActionBar extends ImmutablePureComponent {
replyTitle = intl.formatMessage(messages.replyAll);
}
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
let reblogTitle, reblogIconComponent;
if (status.get('reblogged')) {
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
} else if (publicStatus) {
reblogTitle = intl.formatMessage(messages.reblog);
reblogIconComponent = RepeatIcon;
} else if (reblogPrivate) {
reblogTitle = intl.formatMessage(messages.reblog_private);
reblogIconComponent = RepeatPrivateIcon;
} else {
reblogTitle = intl.formatMessage(messages.cannot_reblog);
reblogIconComponent = RepeatDisabledIcon;
}
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
@ -406,7 +367,7 @@ class StatusActionBar extends ImmutablePureComponent {
<IconButton className='status__action-bar__button' title={replyTitle} icon={isReply ? 'reply' : replyIcon} iconComponent={isReply ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
</div>
<div className='status__action-bar__button-wrapper'>
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
<ReblogButton status={status} counters={withCounters} />
</div>
<div className='status__action-bar__button-wrapper'>
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />

View File

@ -44,6 +44,7 @@ import {
import Status from '../components/status';
import { deleteModal } from '../initial_state';
import { makeGetStatus, makeGetPictureInPicture } from '../selectors';
import { quoteComposeCancel } from '../actions/compose_typed';
const makeMapStateToProps = () => {
const getStatus = makeGetStatus();
@ -111,6 +112,12 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
}
},
onQuoteCancel() {
if (contextType === 'compose') {
dispatch(quoteComposeCancel());
}
},
onRevokeQuote (status) {
dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }}));
},

View File

@ -31,6 +31,7 @@ import { PollForm } from "./poll_form";
import { ReplyIndicator } from './reply_indicator';
import { UploadForm } from './upload_form';
import { Warning } from './warning';
import { ComposeQuotedStatus } from './quoted_post';
const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d';
@ -258,6 +259,11 @@ class ComposeForm extends ImmutablePureComponent {
<div className={classNames('compose-form__highlightable', { active: highlighted })} ref={this.setRef}>
<EditIndicator />
<div className='compose-form__dropdowns'>
<PrivacyDropdownContainer disabled={this.props.isEditing} />
<LanguageDropdown />
</div>
{this.props.spoiler && (
<div className='spoiler-input'>
<div className='spoiler-input__border' />
@ -284,11 +290,6 @@ class ComposeForm extends ImmutablePureComponent {
</div>
)}
<div className='compose-form__dropdowns'>
<PrivacyDropdownContainer disabled={this.props.isEditing} />
<LanguageDropdown />
</div>
<AutosuggestTextarea
ref={this.textareaRef}
placeholder={intl.formatMessage(messages.placeholder)}
@ -304,10 +305,12 @@ class ComposeForm extends ImmutablePureComponent {
onPaste={onPaste}
autoFocus={autoFocus}
lang={this.props.lang}
className='compose-form__input'
/>
<UploadForm />
<PollForm />
<ComposeQuotedStatus />
<div className='compose-form__footer'>
<div className='compose-form__actions'>

View File

@ -0,0 +1,27 @@
import { useMemo } from 'react';
import type { FC } from 'react';
import { Map } from 'immutable';
import { QuotedStatus } from '@/mastodon/components/status_quoted';
import { useAppSelector } from '@/mastodon/store';
export const ComposeQuotedStatus: FC = () => {
const quotedStatusId = useAppSelector(
(state) => state.compose.get('quoted_status_id') as string | null,
);
const quote = useMemo(
() =>
quotedStatusId
? Map<'state' | 'quoted_status', string>([
['state', 'accepted'],
['quoted_status', quotedStatusId],
])
: null,
[quotedStatusId],
);
if (!quote) {
return null;
}
return <QuotedStatus quote={quote} contextType='compose' />;
};

View File

@ -3,10 +3,16 @@ import { connect } from 'react-redux';
import { addPoll, removePoll } from '../../../actions/compose';
import PollButton from '../components/poll_button';
const mapStateToProps = state => ({
disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0),
active: state.getIn(['compose', 'poll']) !== null,
});
const mapStateToProps = state => {
const readyAttachmentsSize = state.compose.get('media_attachments').size ?? 0;
const hasAttachments = readyAttachmentsSize > 0 || !!state.compose.get('is_uploading');
const hasQuote = !!state.compose.get('quoted_status_id');
return ({
disabled: hasAttachments || hasQuote,
active: state.getIn(['compose', 'poll']) !== null,
});
};
const mapDispatchToProps = dispatch => ({

View File

@ -11,9 +11,10 @@ const mapStateToProps = state => {
const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize;
const isOverLimit = attachmentsSize > state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments'])-1;
const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')));
const hasQuote = !!state.compose.get('quoted_status_id');
return {
disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio,
disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio || hasQuote,
resetFileKey: state.getIn(['compose', 'resetFileKey']),
};
};

View File

@ -3,23 +3,16 @@ import { PureComponent } from 'react';
import { defineMessages, injectIntl } from 'react-intl';
import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
@ -27,6 +20,7 @@ import { IconButton } from '../../../components/icon_button';
import { Dropdown } from 'mastodon/components/dropdown_menu';
import { me } from '../../../initial_state';
import { isFeatureEnabled } from '@/mastodon/utils/environment';
import { ReblogButton } from '@/mastodon/components/status/reblog_button';
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
@ -35,10 +29,6 @@ const messages = defineMessages({
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' },
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
@ -313,31 +303,15 @@ class ActionBar extends PureComponent {
replyIconComponent = ReplyAllIcon;
}
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
let reblogTitle, reblogIconComponent;
if (status.get('reblogged')) {
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
} else if (publicStatus) {
reblogTitle = intl.formatMessage(messages.reblog);
reblogIconComponent = RepeatIcon;
} else if (reblogPrivate) {
reblogTitle = intl.formatMessage(messages.reblog_private);
reblogIconComponent = RepeatPrivateIcon;
} else {
reblogTitle = intl.formatMessage(messages.cannot_reblog);
reblogIconComponent = RepeatDisabledIcon;
}
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
return (
<div className='detailed-status__action-bar'>
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} iconComponent={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} /></div>
<div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} /></div>
<div className='detailed-status__button'>
<ReblogButton status={status} />
</div>
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} /></div>
<div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={bookmarkTitle} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} /></div>

View File

@ -174,7 +174,7 @@
"column.lists": "Siyahılar",
"column.mutes": "Səssizləşdirilmiş istifadəçilər",
"column.notifications": "Bildirişlər",
"column.pins": "Bərkidilmiş paylaşımlar",
"column.pins": "Sancılmış göndərişlər",
"column.public": "Federasiya zaman qrafiki",
"column_back_button.label": "Geriyə",
"column_header.hide_settings": "Ayarları gizlət",
@ -483,6 +483,7 @@
"keyboard_shortcuts.my_profile": "Profilinizi açın",
"keyboard_shortcuts.notifications": "Bildirişlər sütununu aç",
"keyboard_shortcuts.open_media": "Medianı aç",
"keyboard_shortcuts.pinned": "Sancılmış göndərişlərin siyahısını aç",
"keyboard_shortcuts.profile": "Müəllifin profilini aç",
"keyboard_shortcuts.reply": "Göndərişə cavab ver",
"keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç",
@ -863,6 +864,7 @@
"status.mute": "@{name} - səssizə al",
"status.mute_conversation": "Danışığın səsini kəs",
"status.open": "Bu göndərişi genişləndir",
"status.pin": "Profildə sanc",
"status.quote_error.filtered": "Bəzi filtrlərinizə görə gizlidir",
"status.quote_error.not_available": "Göndəriş əlçatmazdır",
"status.quote_error.pending_approval": "Göndəriş gözləmədədir",
@ -892,6 +894,7 @@
"status.translated_from_with": "{provider} ilə {lang} dilindən tərcümə edilib",
"status.uncached_media_warning": "Önizləmə mövcud deyil",
"status.unmute_conversation": "Danışığın səsini aç",
"status.unpin": "Profil sancağı götür",
"subscribed_languages.lead": "Dəyişiklikdən sonra əsas ekran və siyahı zaman xəttinizdə yalnız seçdiyiniz dillərdəki göndərişlər görünəcək. Bütün dillərdə göndəriş almaq üçün heç birini seçməyin.",
"subscribed_languages.save": "Dəyişiklikləri saxla",
"subscribed_languages.target": "{target} üçün abunə olunmuş dilləri dəyişdir",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Ваш ідэнтыфікатар:",
"domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.",
"domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.",
"dropdown.empty": "Выбраць варыянт",
"embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.",
"embed.preview": "Вось як гэта будзе выглядаць:",
"emoji_button.activity": "Актыўнасць",
@ -879,11 +880,13 @@
"status.mute_conversation": "Ігнараваць размову",
"status.open": "Разгарнуць гэты допіс",
"status.pin": "Замацаваць у профілі",
"status.quote.cancel": "Адмяніць цытаванне",
"status.quote_error.filtered": "Схавана адным з Вашых фільтраў",
"status.quote_error.not_available": "Допіс недаступны",
"status.quote_error.pending_approval": "Допіс чакае пацвярджэння",
"status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.",
"status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой",
"status.quote_policy_change": "Змяніць, хто можа цытаваць",
"status.quote_post_author": "Цытаваў допіс @{name}",
"status.read_more": "Чытаць болей",
"status.reblog": "Пашырыць",
@ -959,5 +962,17 @@
"video.skip_forward": "Праматаць уперад",
"video.unmute": "Уключыць гук",
"video.volume_down": "Паменшыць гучнасць",
"video.volume_up": "Павялічыць гучнасць"
"video.volume_up": "Павялічыць гучнасць",
"visibility_modal.button_title": "Вызначыць бачнасць",
"visibility_modal.header": "Бачнасць і ўзаемадзеянне",
"visibility_modal.helper.direct_quoting": "Прыватныя згадванні нельга цытаваць.",
"visibility_modal.helper.privacy_editing": "Апублікаваным допісам нельга змяняць бачнасць.",
"visibility_modal.helper.private_quoting": "Допісы для падпісчыкаў нельга цытаваць.",
"visibility_modal.helper.unlisted_quoting": "Калі людзі працытуюць Вас, іх допіс таксама будзе схаваны ад стужкі трэндаў.",
"visibility_modal.instructions": "Кантралюйце, хто можа ўзаемадзейнічаць з Вашым допісам. Глабальныя налады можна знайсці ў <link>Налады > Іншае</link>.",
"visibility_modal.privacy_label": "Прыватнасць",
"visibility_modal.quote_followers": "Толькі падпісчыкі",
"visibility_modal.quote_label": "Змяніць, хто можа цытаваць",
"visibility_modal.quote_nobody": "Ніхто",
"visibility_modal.quote_public": "Усе"
}

View File

@ -1,6 +1,7 @@
{
"about.blocks": "Модерирани сървъри",
"about.contact": "За контакти:",
"about.default_locale": "По подразбиране",
"about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Няма налична причина",
"about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.",
@ -244,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Премахване на последовател",
"confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?",
"confirmations.remove_from_followers.title": "Премахвате ли последовател?",
"confirmations.revoke_quote.confirm": "Премахване на публикация",
"confirmations.revoke_quote.message": "Действието е неотменимо.",
"confirmations.revoke_quote.title": "Премахвате ли публикацията?",
"confirmations.unfollow.confirm": "Без следване",
"confirmations.unfollow.message": "Наистина ли искате вече да не следвате {name}?",
"confirmations.unfollow.title": "Спирате ли да следвате потребителя?",
@ -288,6 +292,7 @@
"domain_pill.your_handle": "Вашият адрес:",
"domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.",
"domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.",
"dropdown.empty": "Изберете възможност",
"embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.",
"embed.preview": "Ето как ще изглежда:",
"emoji_button.activity": "Дейност",
@ -493,6 +498,8 @@
"keyboard_shortcuts.translate": "за превод на публикация",
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
"keyboard_shortcuts.up": "Преместване нагоре в списъка",
"learn_more_link.got_it": "Разбрах",
"learn_more_link.learn_more": "Научете повече",
"lightbox.close": "Затваряне",
"lightbox.next": "Напред",
"lightbox.previous": "Назад",
@ -587,6 +594,7 @@
"notification.label.mention": "Споменаване",
"notification.label.private_mention": "Частно споменаване",
"notification.label.private_reply": "Личен отговор",
"notification.label.quote": "{name} цитира ваша публикация",
"notification.label.reply": "Отговор",
"notification.mention": "Споменаване",
"notification.mentioned_you": "{name} ви спомена",
@ -644,6 +652,7 @@
"notifications.column_settings.mention": "Споменавания:",
"notifications.column_settings.poll": "Резултати от анкета:",
"notifications.column_settings.push": "Изскачащи известия",
"notifications.column_settings.quote": "Цитати:",
"notifications.column_settings.reblog": "Подсилвания:",
"notifications.column_settings.show": "Показване в колоната",
"notifications.column_settings.sound": "Пускане на звук",
@ -834,6 +843,8 @@
"status.bookmark": "Отмятане",
"status.cancel_reblog_private": "Край на подсилването",
"status.cannot_reblog": "Публикацията не може да се подсилва",
"status.context.load_new_replies": "Има нови отговори",
"status.context.loading": "Проверка за още отговори",
"status.continued_thread": "Продължена нишка",
"status.copy": "Копиране на връзката към публикация",
"status.delete": "Изтриване",
@ -860,6 +871,10 @@
"status.open": "Разширяване на публикацията",
"status.pin": "Закачане в профила",
"status.quote_error.filtered": "Скрито поради един от филтрите ви",
"status.quote_error.not_available": "Неналична публикация",
"status.quote_error.pending_approval": "Публикацията чака одобрение",
"status.quote_policy_change": "Промяна кой може да цитира",
"status.quote_post_author": "Цитирах публикация от @{name}",
"status.read_more": "Още за четене",
"status.reblog": "Подсилване",
"status.reblog_private": "Подсилване с оригиналната видимост",
@ -874,6 +889,7 @@
"status.reply": "Отговор",
"status.replyAll": "Отговор на нишка",
"status.report": "Докладване на @{name}",
"status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}",
"status.sensitive_warning": "Деликатно съдържание",
"status.share": "Споделяне",
"status.show_less_all": "Показване на по-малко за всички",
@ -933,5 +949,15 @@
"video.skip_forward": "Прескок напред",
"video.unmute": "Без заглушаване",
"video.volume_down": "Намаляване на звука",
"video.volume_up": "Увеличаване на звука"
"video.volume_up": "Увеличаване на звука",
"visibility_modal.button_title": "Задаване на видимост",
"visibility_modal.header": "Видимост и взаимодействие",
"visibility_modal.helper.direct_quoting": "Частни споменавания не може да се цитират.",
"visibility_modal.helper.privacy_editing": "Публикуваните публикации не може да променят видимостта си.",
"visibility_modal.instructions": "Управлявайте кой може да взаимодейства с тази публикация. Глобалните настройки може да се намерят под <link>Предпочитания> Друго</link>.",
"visibility_modal.privacy_label": "Поверителност",
"visibility_modal.quote_followers": "Само последователи",
"visibility_modal.quote_label": "Промяна кой може да цитира",
"visibility_modal.quote_nobody": "Никого",
"visibility_modal.quote_public": "Някой"
}

View File

@ -245,7 +245,9 @@
"confirmations.remove_from_followers.confirm": "Elimina el seguidor",
"confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?",
"confirmations.remove_from_followers.title": "Eliminem el seguidor?",
"confirmations.revoke_quote.confirm": "Eliminar la publicació",
"confirmations.revoke_quote.message": "Aquesta acció no es pot desfer.",
"confirmations.revoke_quote.title": "Eliminar la publicació?",
"confirmations.unfollow.confirm": "Deixa de seguir",
"confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
"confirmations.unfollow.title": "Deixar de seguir l'usuari?",
@ -290,6 +292,7 @@
"domain_pill.your_handle": "El vostre identificador:",
"domain_pill.your_server": "La vostra llar digital, on són totes les vostres publicacions. No us agrada aquesta? Canvieu de servidor quan vulgueu i emporteu-vos els vostres seguidors.",
"domain_pill.your_username": "El vostre identificador únic en aquest servidor. Hi pot haver usuaris amb el mateix nom a diferents servidors.",
"dropdown.empty": "Seleccioneu una opció",
"embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
"embed.preview": "Aquest aspecte tindrà:",
"emoji_button.activity": "Activitat",
@ -876,11 +879,13 @@
"status.mute_conversation": "Silencia la conversa",
"status.open": "Amplia el tut",
"status.pin": "Fixa en el perfil",
"status.quote.cancel": "Canceŀlar la citació",
"status.quote_error.filtered": "No es mostra a causa d'un dels vostres filtres",
"status.quote_error.not_available": "Publicació no disponible",
"status.quote_error.pending_approval": "Publicació pendent",
"status.quote_error.pending_approval_popout.body": "Les citacions compartides a través del Fediverse poden trigar en aparèixer, perquè diferents servidors tenen diferents protocols.",
"status.quote_error.pending_approval_popout.title": "Publicació pendent? Mantinguem la calma",
"status.quote_policy_change": "Canvieu qui us pot citar",
"status.quote_post_author": "S'ha citat una publicació de @{name}",
"status.read_more": "Més informació",
"status.reblog": "Impulsa",
@ -956,5 +961,17 @@
"video.skip_forward": "Salta endavant",
"video.unmute": "Deixa de silenciar",
"video.volume_down": "Abaixa el volum",
"video.volume_up": "Apuja el volum"
"video.volume_up": "Apuja el volum",
"visibility_modal.button_title": "Establiu la visibilitat",
"visibility_modal.header": "Visibilitat i interacció",
"visibility_modal.helper.direct_quoting": "No es poden citar les mencions privades.",
"visibility_modal.helper.privacy_editing": "No es pot canviar la visibilitat de les publicacions ja fetes.",
"visibility_modal.helper.private_quoting": "No es poden citar les publicacions només per a seguidors.",
"visibility_modal.helper.unlisted_quoting": "Quan la gent et citi les seves publicacions estaran amagades de les línies de temps de tendències.",
"visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. La configuració global es troba a <link>Preferències>Altres</link>.",
"visibility_modal.privacy_label": "Privacitat",
"visibility_modal.quote_followers": "Només seguidors",
"visibility_modal.quote_label": "Canvieu qui us pot citar",
"visibility_modal.quote_nobody": "Ningú",
"visibility_modal.quote_public": "Qualsevol"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Tvůj handle:",
"domain_pill.your_server": "Tvůj digitální domov, kde žijí všechny tvé příspěvky. Nelíbí se ti? Kdykoliv se přesuň na jiný server a vezmi si sebou i své sledující.",
"domain_pill.your_username": "Tvůj jedinečný identifikátor na tomto serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
"dropdown.empty": "Vyberte možnost",
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
"embed.preview": "Takhle to bude vypadat:",
"emoji_button.activity": "Aktivita",
@ -884,6 +885,7 @@
"status.quote_error.pending_approval": "Příspěvek čeká na schválení",
"status.quote_error.pending_approval_popout.body": "Zobrazení citátů sdílených napříč Fediversem může chvíli trvat, protože různé servery používají různé protokoly.",
"status.quote_error.pending_approval_popout.title": "Příspěvek čeká na schválení? Buďte klidní",
"status.quote_policy_change": "Změňte, kdo může citovat",
"status.quote_post_author": "Citovali příspěvek od @{name}",
"status.read_more": "Číst více",
"status.reblog": "Boostnout",
@ -959,5 +961,17 @@
"video.skip_forward": "Přeskočit vpřed",
"video.unmute": "Zrušit ztlumení",
"video.volume_down": "Snížit hlasitost",
"video.volume_up": "Zvýšit hlasitost"
"video.volume_up": "Zvýšit hlasitost",
"visibility_modal.button_title": "Nastavit viditelnost",
"visibility_modal.header": "Viditelnost a interakce",
"visibility_modal.helper.direct_quoting": "Soukromé zmínky nemohou být citovány.",
"visibility_modal.helper.privacy_editing": "Publikované příspěvky nemohou změnit svou viditelnost.",
"visibility_modal.helper.private_quoting": "Nelze citovat příspěvky, které jsou pouze pro sledující.",
"visibility_modal.helper.unlisted_quoting": "Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt.",
"visibility_modal.instructions": "Kontrolujte, kdo může interagovat s tímto příspěvkem. Globální nastavení můžete najít pod <link>Nastavení > Ostatní</link>.",
"visibility_modal.privacy_label": "Soukromí",
"visibility_modal.quote_followers": "Pouze sledující",
"visibility_modal.quote_label": "Změňte, kdo může citovat",
"visibility_modal.quote_nobody": "Nikdo",
"visibility_modal.quote_public": "Kdokoliv"
}

View File

@ -245,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Dileu dilynwr",
"confirmations.remove_from_followers.message": "Bydd {name} yn rhoi'r gorau i'ch dilyn. A ydych yn siŵr eich bod am fwrw ymlaen?",
"confirmations.remove_from_followers.title": "Tynnu dilynwr?",
"confirmations.revoke_quote.confirm": "Dileu'r postiad",
"confirmations.revoke_quote.message": "Does dim modd dadwneud y weithred hon.",
"confirmations.revoke_quote.title": "Dileu'r postiad?",
"confirmations.unfollow.confirm": "Dad-ddilyn",
"confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?",
"confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?",
@ -289,6 +292,7 @@
"domain_pill.your_handle": "Eich handlen:",
"domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.",
"domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
"dropdown.empty": "Dewis dewis",
"embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch",
@ -498,6 +502,8 @@
"keyboard_shortcuts.translate": "i gyfieithu postiad",
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr",
"learn_more_link.got_it": "Iawn",
"learn_more_link.learn_more": "Dysgu rhagor",
"lightbox.close": "Cau",
"lightbox.next": "Nesaf",
"lightbox.previous": "Blaenorol",
@ -558,7 +564,7 @@
"navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau wedi'u tewi",
"navigation_bar.follow_requests": "Ceisiadau dilyn",
"navigation_bar.followed_tags": "Hashnodau a ddilynir",
"navigation_bar.followed_tags": "Hashnodau sy'n cael eu dilyn",
"navigation_bar.follows_and_followers": "Yn dilyn a dilynwyr",
"navigation_bar.import_export": "Mewnforio ac allforio",
"navigation_bar.lists": "Rhestrau",
@ -598,6 +604,7 @@
"notification.label.mention": "Crybwyll",
"notification.label.private_mention": "Crybwyll preifat",
"notification.label.private_reply": "Ymateb preifat",
"notification.label.quote": "Mae {name} wedi dyfynnu eich postiad",
"notification.label.reply": "Ymateb",
"notification.mention": "Crybwyll",
"notification.mentioned_you": "Rydych wedi'ch crybwyll gan {name}",
@ -655,6 +662,7 @@
"notifications.column_settings.mention": "Crybwylliadau:",
"notifications.column_settings.poll": "Canlyniadau pleidlais:",
"notifications.column_settings.push": "Hysbysiadau gwthio",
"notifications.column_settings.quote": "Dyfyniadau:",
"notifications.column_settings.reblog": "Hybiau:",
"notifications.column_settings.show": "Dangos yn y golofn",
"notifications.column_settings.sound": "Chwarae sain",
@ -845,6 +853,8 @@
"status.bookmark": "Nod tudalen",
"status.cancel_reblog_private": "Dadhybu",
"status.cannot_reblog": "Does dim modd hybu'r postiad hwn",
"status.context.load_new_replies": "Mae atebion newydd ar gael",
"status.context.loading": "Yn chwilio am fwy o atebion",
"status.continued_thread": "Edefyn parhaus",
"status.copy": "Copïo dolen i'r post",
"status.delete": "Dileu",
@ -871,6 +881,12 @@
"status.open": "Ehangu'r post hwn",
"status.pin": "Pinio ar y proffil",
"status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr",
"status.quote_error.not_available": "Postiad ddim ar gael",
"status.quote_error.pending_approval": "Postiad yn yr arfaeth",
"status.quote_error.pending_approval_popout.body": "Gall dyfyniadau sy'n cael eu rhannu ar draws y Ffedysawd gymryd amser i'w dangos, gan fod gan wahanol weinyddion brotocolau gwahanol.",
"status.quote_error.pending_approval_popout.title": "Dyfyniad yn aros? Amynedd :-)",
"status.quote_policy_change": "Newid pwy all ddyfynnu",
"status.quote_post_author": "Wedi dyfynnu postiad gan @{name}",
"status.read_more": "Darllen rhagor",
"status.reblog": "Hybu",
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
@ -885,6 +901,7 @@
"status.reply": "Ymateb",
"status.replyAll": "Ateb edefyn",
"status.report": "Adrodd ar @{name}",
"status.revoke_quote": "Dileu fy mhostiad o bostiad @{name}",
"status.sensitive_warning": "Cynnwys sensitif",
"status.share": "Rhannu",
"status.show_less_all": "Dangos llai i bawb",
@ -944,5 +961,17 @@
"video.skip_forward": "Symud ymlaen",
"video.unmute": "Dad-dewi",
"video.volume_down": "Lefel sain i lawr",
"video.volume_up": "Lefel sain i fyny"
"video.volume_up": "Lefel sain i fyny",
"visibility_modal.button_title": "Gosod gwelededd",
"visibility_modal.header": "Gwelededd a rhyngweithio",
"visibility_modal.helper.direct_quoting": "Does dim modd dyfynnu crybwylliadau preifat.",
"visibility_modal.helper.privacy_editing": "Does dim modd newid gwelededd postiadau wedi'u cyhoeddi.",
"visibility_modal.helper.private_quoting": "Does dim modd dyfynnu postiadau dilynwyr yn unig.",
"visibility_modal.helper.unlisted_quoting": "Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio.",
"visibility_modal.instructions": "Rheolwch bwy all ryngweithio â'r postiad hwn. Mae modd dod o hyd i osodiadau eang o dan <link>Dewisiadau > Arall</link>.",
"visibility_modal.privacy_label": "Preifatrwydd",
"visibility_modal.quote_followers": "Dilynwyr yn unig",
"visibility_modal.quote_label": "Newid pwy all ddyfynnu",
"visibility_modal.quote_nobody": "Neb",
"visibility_modal.quote_public": "Pawb"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Dit handle:",
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
"domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
"dropdown.empty": "Vælg en indstillingsmulighed",
"embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
"embed.preview": "Sådan kommer det til at se ud:",
"emoji_button.activity": "Aktivitet",
@ -884,6 +885,7 @@
"status.quote_error.pending_approval": "Afventende indlæg",
"status.quote_error.pending_approval_popout.body": "Citater delt på tværs af Fediverset kan tage tid at vise, da forskellige servere har forskellige protokoller.",
"status.quote_error.pending_approval_popout.title": "Afventende citat? Tag det roligt",
"status.quote_policy_change": "Ændr hvem der kan citere",
"status.quote_post_author": "Citerede et indlæg fra @{name}",
"status.read_more": "Læs mere",
"status.reblog": "Fremhæv",
@ -959,5 +961,17 @@
"video.skip_forward": "Overspring fremad",
"video.unmute": "Slå lyd tl",
"video.volume_down": "Lydstyrke ned",
"video.volume_up": "Lydstyrke op"
"video.volume_up": "Lydstyrke op",
"visibility_modal.button_title": "Indstil synlighed",
"visibility_modal.header": "Synlighed og interaktion",
"visibility_modal.helper.direct_quoting": "Private omtaler kan ikke citeres.",
"visibility_modal.helper.privacy_editing": "Publicerede indlægs synlighed kan ikke ændres.",
"visibility_modal.helper.private_quoting": "Indlæg kun for følgere kan ikke citeres.",
"visibility_modal.helper.unlisted_quoting": "Når man citeres af andre, skjules deres indlæg også på tendenstidslinjer.",
"visibility_modal.instructions": "Styr, hvem der kan interagere med dette indlæg. Globale indstillinger findes under <link>Præferencer > Andet</link>.",
"visibility_modal.privacy_label": "Fortrolighed",
"visibility_modal.quote_followers": "Kun følgere",
"visibility_modal.quote_label": "Ændr hvem der kan citere",
"visibility_modal.quote_nobody": "Ingen",
"visibility_modal.quote_public": "Alle"
}

View File

@ -63,7 +63,7 @@
"account.mute_short": "Stummschalten",
"account.muted": "Stummgeschaltet",
"account.muting": "Stummgeschaltet",
"account.mutual": "Ihr folgt euch",
"account.mutual": "Ihr folgt einander",
"account.no_bio": "Keine Beschreibung verfügbar.",
"account.open_original_page": "Ursprüngliche Seite öffnen",
"account.posts": "Beiträge",
@ -880,6 +880,7 @@
"status.mute_conversation": "Unterhaltung stummschalten",
"status.open": "Beitrag öffnen",
"status.pin": "Im Profil anheften",
"status.quote.cancel": "Zitat abbrechen",
"status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter",
"status.quote_error.not_available": "Beitrag nicht verfügbar",
"status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Το πλήρες όνομα χρήστη σου:",
"domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου.",
"domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.",
"dropdown.empty": "Διαλέξτε μια επιλογή",
"embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.",
"embed.preview": "Ορίστε πως θα φαίνεται:",
"emoji_button.activity": "Δραστηριότητα",
@ -879,11 +880,13 @@
"status.mute_conversation": "Σίγαση συνομιλίας",
"status.open": "Επέκταση ανάρτησης",
"status.pin": "Καρφίτσωσε στο προφίλ",
"status.quote.cancel": "Ακύρωση παράθεσης",
"status.quote_error.filtered": "Κρυφό λόγω ενός από τα φίλτρα σου",
"status.quote_error.not_available": "Ανάρτηση μη διαθέσιμη",
"status.quote_error.pending_approval": "Ανάρτηση σε αναμονή",
"status.quote_error.pending_approval_popout.body": "Οι παραθέσεις που μοιράζονται στο Fediverse μπορεί να χρειαστούν χρόνο για να εμφανιστούν, καθώς διαφορετικοί διακομιστές έχουν διαφορετικά πρωτόκολλα.",
"status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι",
"status.quote_policy_change": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
"status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}",
"status.read_more": "Διάβασε περισότερα",
"status.reblog": "Ενίσχυση",
@ -959,5 +962,17 @@
"video.skip_forward": "Παράλειψη εμπρός",
"video.unmute": "Άρση σίγασης",
"video.volume_down": "Μείωση έντασης",
"video.volume_up": "Αύξηση έντασης"
"video.volume_up": "Αύξηση έντασης",
"visibility_modal.button_title": "Ορισμός ορατότητας",
"visibility_modal.header": "Ορατότητα και αλληλεπίδραση",
"visibility_modal.helper.direct_quoting": "Ιδιωτικές επισημάνσεις δεν μπορούν να παρατεθούν.",
"visibility_modal.helper.privacy_editing": "Δημοσιευμένες αναρτήσεις δεν μπορούν να αλλάξουν την ορατότητά τους.",
"visibility_modal.helper.private_quoting": "Οι αναρτήσεις μόνο για ακολούθους δεν μπορούν να παρατεθούν.",
"visibility_modal.helper.unlisted_quoting": "Όταν οι άνθρωποι σας παραθέτουν, η ανάρτηση τους θα είναι επίσης κρυμμένη από τα δημοφιλή χρονοδιαγράμματα.",
"visibility_modal.instructions": "Ελέγξτε ποιός μπορεί να αλληλεπιδράσει με αυτή την ανάρτηση. Οι καθολικές ρυθμίσεις μπορούν να βρεθούν κάτω από <link>Προτιμήσεις > Άλλα</link>.",
"visibility_modal.privacy_label": "Απόρρητο",
"visibility_modal.quote_followers": "Μόνο ακόλουθοι",
"visibility_modal.quote_label": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
"visibility_modal.quote_nobody": "Κανένας",
"visibility_modal.quote_public": "Οποιοσδήποτε"
}

View File

@ -849,9 +849,11 @@
"status.admin_account": "Open moderation interface for @{name}",
"status.admin_domain": "Open moderation interface for {domain}",
"status.admin_status": "Open this post in the moderation interface",
"status.all_disabled": "Boosts and quotes are disabled",
"status.block": "Block @{name}",
"status.bookmark": "Bookmark",
"status.cancel_reblog_private": "Unboost",
"status.cannot_quote": "Author has disabled quoting on this post",
"status.cannot_reblog": "This post cannot be boosted",
"status.context.load_new_replies": "New replies available",
"status.context.loading": "Checking for more replies",
@ -880,6 +882,8 @@
"status.mute_conversation": "Mute conversation",
"status.open": "Expand this post",
"status.pin": "Pin on profile",
"status.quote": "Quote",
"status.quote.cancel": "Cancel quote",
"status.quote_error.filtered": "Hidden due to one of your filters",
"status.quote_error.not_available": "Post unavailable",
"status.quote_error.pending_approval": "Post pending",
@ -887,6 +891,7 @@
"status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm",
"status.quote_policy_change": "Change who can quote",
"status.quote_post_author": "Quoted a post by @{name}",
"status.quote_private": "Private posts cannot be quoted",
"status.read_more": "Read more",
"status.reblog": "Boost",
"status.reblog_private": "Boost with original visibility",

View File

@ -287,6 +287,7 @@
"domain_pill.your_handle": "Via identigo:",
"domain_pill.your_server": "Via cifereca hejmo, kie loĝas ĉiuj viaj afiŝoj. Ĉu vi ne ŝatas ĉi tiun? Transloku servilojn iam ajn kaj alportu ankaŭ viajn sekvantojn.",
"domain_pill.your_username": "Via unika identigilo sur ĉi tiu servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
"dropdown.empty": "Elektu opcion",
"embed.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.",
"embed.preview": "Ĝi aperos tiel:",
"emoji_button.activity": "Agadoj",
@ -940,5 +941,16 @@
"video.skip_forward": "Preterpasi antaŭen",
"video.unmute": "Ne plu silentigi",
"video.volume_down": "Laŭteco Malpliigi",
"video.volume_up": "Laŭteco pliigi"
"video.volume_up": "Laŭteco pliigi",
"visibility_modal.button_title": "Agordu videblon",
"visibility_modal.header": "Videblo kaj interago",
"visibility_modal.helper.direct_quoting": "Privataj mencioj ne povas esti cititaj.",
"visibility_modal.helper.privacy_editing": "Publikigitaj afiŝoj ne povas ŝanĝi sian videblon.",
"visibility_modal.helper.private_quoting": "Afiŝoj nur por sekvantoj ne povas esti cititaj.",
"visibility_modal.helper.unlisted_quoting": "Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj.",
"visibility_modal.privacy_label": "Privateco",
"visibility_modal.quote_followers": "Nur sekvantoj",
"visibility_modal.quote_label": "Ŝanĝi kiu povas citi",
"visibility_modal.quote_nobody": "Neniu",
"visibility_modal.quote_public": "Iu ajn"
}

View File

@ -880,6 +880,7 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir este mensaje",
"status.pin": "Fijar en el perfil",
"status.quote.cancel": "Cancelar cita",
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Mensaje no disponible",
"status.quote_error.pending_approval": "Mensaje pendiente",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Tu alias:",
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
"dropdown.empty": "Elige una opción",
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir estado",
"status.pin": "Fijar",
"status.quote.cancel": "Cancelar cita",
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Publicación no disponible",
"status.quote_error.pending_approval": "Publicación pendiente",
"status.quote_error.pending_approval_popout.body": "Las citas compartidas en el Fediverso pueden tardar en mostrarse, ya que cada servidor tiene un protocolo diferente.",
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
"status.quote_policy_change": "Cambia quién puede citarte",
"status.quote_post_author": "Ha citado una publicación de @{name}",
"status.read_more": "Leer más",
"status.reblog": "Impulsar",
@ -959,5 +962,17 @@
"video.skip_forward": "Saltar adelante",
"video.unmute": "Dejar de silenciar",
"video.volume_down": "Bajar el volumen",
"video.volume_up": "Subir el volumen"
"video.volume_up": "Subir el volumen",
"visibility_modal.button_title": "Establece la visibilidad",
"visibility_modal.header": "Visibilidad e interacción",
"visibility_modal.helper.direct_quoting": "Las menciones privadas no pueden citarse.",
"visibility_modal.helper.privacy_editing": "Las publicaciones ya enviadas no pueden cambiar su visibilidad.",
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
"visibility_modal.helper.unlisted_quoting": "Cuando las personas te citen, sus publicaciones también se ocultarán de las cronologías de tendencias.",
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. La configuración global se encuentra en <link>Preferencias > Otros</link>.",
"visibility_modal.privacy_label": "Privacidad",
"visibility_modal.quote_followers": "Solo seguidores",
"visibility_modal.quote_label": "Cambia quién puede citarte",
"visibility_modal.quote_nobody": "Nadie",
"visibility_modal.quote_public": "Cualquiera"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Tu alias:",
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
"dropdown.empty": "Selecciona una opción",
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir publicación",
"status.pin": "Fijar",
"status.quote.cancel": "Cancelar cita",
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Publicación no disponible",
"status.quote_error.pending_approval": "Publicación pendiente",
"status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que los diferentes servidores tienen diferentes protocolos.",
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
"status.quote_policy_change": "Cambia quién puede citarte",
"status.quote_post_author": "Ha citado una publicación de @{name}",
"status.read_more": "Leer más",
"status.reblog": "Impulsar",
@ -959,5 +962,17 @@
"video.skip_forward": "Adelantar",
"video.unmute": "Dejar de silenciar",
"video.volume_down": "Bajar volumen",
"video.volume_up": "Subir volumen"
"video.volume_up": "Subir volumen",
"visibility_modal.button_title": "Configura la visibilidad",
"visibility_modal.header": "Visibilidad e interacciones",
"visibility_modal.helper.direct_quoting": "Las menciones privadas no se pueden citar.",
"visibility_modal.helper.privacy_editing": "Las publicaciones no pueden cambiar su visibilidad.",
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
"visibility_modal.helper.unlisted_quoting": "Cuando la gente te cite, su publicación tampoco se mostrará en las cronologías públicas.",
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. Puedes encontrar los ajustes globales en <link>Preferencias > Otros</link>.",
"visibility_modal.privacy_label": "Privacidad",
"visibility_modal.quote_followers": "Sólo seguidores",
"visibility_modal.quote_label": "Cambia quién puede citarte",
"visibility_modal.quote_nobody": "Nadie",
"visibility_modal.quote_public": "Cualquiera"
}

View File

@ -39,11 +39,11 @@
"account.featured_tags.last_status_at": "آخرین فرسته در {date}",
"account.featured_tags.last_status_never": "بدون فرسته",
"account.follow": "پی‌گرفتن",
"account.follow_back": "دنبال کردن متقابل",
"account.follow_back": "پی‌گیری متقابل",
"account.followers": "پی‌گیرندگان",
"account.followers.empty": "هنوز کسی پی‌گیر این کاربر نیست.",
"account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}",
"account.followers_you_know_counter": "{counter} را می‌شناسید",
"account.followers_you_know_counter": "{counter} نفر را می‌شناسید",
"account.following": "پی می‌گیرید",
"account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}",
"account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.",
@ -292,6 +292,7 @@
"domain_pill.your_handle": "شناسه‌تان:",
"domain_pill.your_server": "خانهٔ رقمیتان. جایی که همهٔ فرسته‌هایتان می‌زیند. دوستش ندارید؟ در هر زمان کارسازتان را جابه‌جا کرده و پی‌گیرندگانتان را نیز بیاورید.",
"domain_pill.your_username": "شناسهٔ یکتایتان روی این کارساز. ممکن است کاربرانی با نام کاربری مشابه روی کارسازهای دیگر باشند.",
"dropdown.empty": "انتخاب یک گزینه",
"embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.",
"embed.preview": "این گونه دیده خواهد شد:",
"emoji_button.activity": "فعالیت",
@ -879,9 +880,13 @@
"status.mute_conversation": "خموشاندن گفت‌وگو",
"status.open": "گسترش این فرسته",
"status.pin": "سنجاق به نمایه",
"status.quote.cancel": "لغو نقل",
"status.quote_error.filtered": "نهفته بنا بر یکی از پالایه‌هایتان",
"status.quote_error.not_available": "فرسته در دسترس نیست",
"status.quote_error.pending_approval": "فرسته منتظر",
"status.quote_error.pending_approval_popout.body": "نقل‌قول‌هایی که در سراسر فدیورس هم‌رسانی می‌شوند ممکن است زمان‌بر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوه‌نامه‌های متفاوتی استفاده می‌کنند.",
"status.quote_error.pending_approval_popout.title": "منتظر نقل؟ خونسرد بمانید",
"status.quote_policy_change": "تغییر کسانی که می‌توانند نقل کنند",
"status.quote_post_author": "فرسته‌ای از @{name} نقل شد",
"status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت",
@ -957,5 +962,17 @@
"video.skip_forward": "پرش به پیش",
"video.unmute": "ناخموشی",
"video.volume_down": "کاهش حجم صدا",
"video.volume_up": "افزایش حجم صدا"
"video.volume_up": "افزایش حجم صدا",
"visibility_modal.button_title": "تنظیم نمایانی",
"visibility_modal.header": "نمایانی و برهم‌کنش",
"visibility_modal.helper.direct_quoting": "نام‌بری‌های خصوصی قابل نقل نیستند.",
"visibility_modal.helper.privacy_editing": "نمی‌توان نمایانی فرسته‌های منتشر شده را تغییر داد.",
"visibility_modal.helper.private_quoting": "فرسته‌های فقط برای پی‌گیرندگان نمی‌توانند نقل شوند.",
"visibility_modal.helper.unlisted_quoting": "هنگامی که افراد نقلتان می‌کنند فرسته‌شان هم از خط‌زمانی‌های داغ پنهان خواهد بود.",
"visibility_modal.instructions": "واپایش کسانی که می‌توانند با این فرسته برهم‌کنش داشته باشند. تنظیمات سراسری می‌تواند در <link>ترجیحات > دیگر</link> پیدا شود.",
"visibility_modal.privacy_label": "محرمانگی",
"visibility_modal.quote_followers": "فقط پی‌گیرندگان",
"visibility_modal.quote_label": "تغییر کسانی که می‌توانند نقل کنند",
"visibility_modal.quote_nobody": "هیچ‌کس",
"visibility_modal.quote_public": "هرکسی"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Käyttäjätunnuksesi:",
"domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.",
"domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.",
"dropdown.empty": "Valitse vaihtoehto",
"embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
"embed.preview": "Tältä se näyttää:",
"emoji_button.activity": "Aktiviteetit",
@ -879,11 +880,13 @@
"status.mute_conversation": "Mykistä keskustelu",
"status.open": "Laajenna julkaisu",
"status.pin": "Kiinnitä profiiliin",
"status.quote.cancel": "Peruuta lainaus",
"status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia",
"status.quote_error.not_available": "Julkaisu ei saatavilla",
"status.quote_error.pending_approval": "Julkaisu odottaa",
"status.quote_error.pending_approval_popout.body": "Saattaa viedä jonkin ainaa ennen kuin fediversumin kautta jaetut julkaisut tulevat näkyviin, sillä eri palvelimet käyttävät eri protokollia.",
"status.quote_error.pending_approval_popout.title": "Odottava lainaus? Pysy rauhallisena",
"status.quote_policy_change": "Vaihda, kuka voi lainata",
"status.quote_post_author": "Lainaa käyttäjän @{name} julkaisua",
"status.read_more": "Näytä enemmän",
"status.reblog": "Tehosta",
@ -959,5 +962,17 @@
"video.skip_forward": "Siirry eteenpäin",
"video.unmute": "Poista mykistys",
"video.volume_down": "Vähennä äänenvoimakkuutta",
"video.volume_up": "Lisää äänenvoimakkuutta"
"video.volume_up": "Lisää äänenvoimakkuutta",
"visibility_modal.button_title": "Aseta näkyvyys",
"visibility_modal.header": "Näkyvyys ja vuorovaikutus",
"visibility_modal.helper.direct_quoting": "Yksityismainintoja ei voi lainata.",
"visibility_modal.helper.privacy_editing": "Lähetettyjen julkaisujen näkyvyyttä ei voi vaihtaa.",
"visibility_modal.helper.private_quoting": "Vain seuraajille tarkoitettuja julkaisuja ei voi lainata.",
"visibility_modal.helper.unlisted_quoting": "Kun ihmiset lainaavat sinua, myös heidän julkaisunsa piilotetaan suosittujen julkaisujen aikajanoilta.",
"visibility_modal.instructions": "Hallitse, kuka voi olla vuorovaikutuksessa tämän julkaisun kanssa. Yleiset asetukset sijaitsevat kohdassa <link>Asetukset > Muut</link>.",
"visibility_modal.privacy_label": "Yksityisyys",
"visibility_modal.quote_followers": "Vain seuraajat",
"visibility_modal.quote_label": "Vaihda, kuka voi lainata",
"visibility_modal.quote_nobody": "Ei kukaan",
"visibility_modal.quote_public": "Kuka tahansa"
}

View File

@ -880,6 +880,7 @@
"status.mute_conversation": "Doyv samrøðu",
"status.open": "Víðka henda postin",
"status.pin": "Ger fastan í vangan",
"status.quote.cancel": "Ógilda sitat",
"status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta",
"status.quote_error.not_available": "Postur ikki tøkur",
"status.quote_error.pending_approval": "Postur bíðar",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Do láimhseáil:",
"domain_pill.your_server": "Do theach digiteach, áit a bhfuil do phoist go léir ina gcónaí. Nach maith leat an ceann seo? Aistrigh freastalaithe am ar bith agus tabhair leat do leantóirí freisin.",
"domain_pill.your_username": "D'aitheantóir uathúil ar an bhfreastalaí seo. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.",
"dropdown.empty": "Roghnaigh rogha",
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Seo an chuma a bheidh air:",
"emoji_button.activity": "Gníomhaíocht",
@ -884,6 +885,7 @@
"status.quote_error.pending_approval": "Post ar feitheamh",
"status.quote_error.pending_approval_popout.body": "Dfhéadfadh sé go dtógfadh sé tamall le Sleachta a roinntear ar fud Fediverse a thaispeáint, toisc go mbíonn prótacail éagsúla ag freastalaithe éagsúla.",
"status.quote_error.pending_approval_popout.title": "Ag fanacht le luachan? Fan socair",
"status.quote_policy_change": "Athraigh cé a fhéadann luachan a thabhairt",
"status.quote_post_author": "Luaigh mé post le @{name}",
"status.read_more": "Léan a thuilleadh",
"status.reblog": "Treisiú",
@ -959,5 +961,17 @@
"video.skip_forward": "Scipeáil ar aghaidh",
"video.unmute": "Díbhalbhú",
"video.volume_down": "Toirt síos",
"video.volume_up": "Toirt suas"
"video.volume_up": "Toirt suas",
"visibility_modal.button_title": "Socraigh infheictheacht",
"visibility_modal.header": "Infheictheacht agus idirghníomhaíocht",
"visibility_modal.helper.direct_quoting": "Ní féidir lua a thabhairt ar luanna príobháideacha.",
"visibility_modal.helper.privacy_editing": "Ní féidir infheictheacht postálacha foilsithe a athrú.",
"visibility_modal.helper.private_quoting": "Ní féidir poist atá dírithe ar leanúna amháin a lua.",
"visibility_modal.helper.unlisted_quoting": "Nuair a luann daoine thú, beidh a bpost i bhfolach ó amlínte treochta freisin.",
"visibility_modal.instructions": "Rialú cé a fhéadfaidh idirghníomhú leis an bpost seo. Is féidir socruithe domhanda a fháil faoi <link>Sainroghanna > Eile</link>.",
"visibility_modal.privacy_label": "Príobháideacht",
"visibility_modal.quote_followers": "Leantóirí amháin",
"visibility_modal.quote_label": "Athraigh cé a fhéadann luachan a thabhairt",
"visibility_modal.quote_nobody": "Níl aon duine",
"visibility_modal.quote_public": "Aon duine"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "O teu alcume:",
"domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.",
"domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.",
"dropdown.empty": "Escolle unha opción",
"embed.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.",
"embed.preview": "Vaise ver así:",
"emoji_button.activity": "Actividade",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversa",
"status.open": "Estender esta publicación",
"status.pin": "Fixar no perfil",
"status.quote.cancel": "Cancelar a cita",
"status.quote_error.filtered": "Oculto debido a un dos teus filtros",
"status.quote_error.not_available": "Publicación non dispoñible",
"status.quote_error.pending_approval": "Publicación pendente",
"status.quote_error.pending_approval_popout.body": "As citas compartidas no Fediverso poderían tardar en mostrarse, xa que os diferentes servidores teñen diferentes protocolos.",
"status.quote_error.pending_approval_popout.title": "Cita pendente? Non te apures",
"status.quote_policy_change": "Cambia quen pode citarte",
"status.quote_post_author": "Citou unha publicación de @{name}",
"status.read_more": "Ler máis",
"status.reblog": "Promover",
@ -959,5 +962,17 @@
"video.skip_forward": "Avanzar",
"video.unmute": "Non silenciar",
"video.volume_down": "Baixar volume",
"video.volume_up": "Subir volume"
"video.volume_up": "Subir volume",
"visibility_modal.button_title": "Establece a visibilidade",
"visibility_modal.header": "Visibilidade e interaccións",
"visibility_modal.helper.direct_quoting": "A mencións privadas non se poden citar.",
"visibility_modal.helper.privacy_editing": "Non se pode cambiar a visibilidade das publicacións xa publicadas.",
"visibility_modal.helper.private_quoting": "As publicacións só para seguidoras non se poden citar.",
"visibility_modal.helper.unlisted_quoting": "Cando alguén te cite, a súa publicación non aparecerá nas cronoloxías de popularidade.",
"visibility_modal.instructions": "Controla quen pode interactuar con esta publicación. Os axustes xerais están en <link>Preferencias > Outros</link>.",
"visibility_modal.privacy_label": "Privacidade",
"visibility_modal.quote_followers": "Só para seguidoras",
"visibility_modal.quote_label": "Cambia quen pode citarte",
"visibility_modal.quote_nobody": "Ninguén",
"visibility_modal.quote_public": "Calquera"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "הכינוי שלך:",
"domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.",
"domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.",
"dropdown.empty": "בחירת אפשרות",
"embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.",
"embed.preview": "דוגמא כיצד זה יראה:",
"emoji_button.activity": "פעילות",
@ -879,11 +880,13 @@
"status.mute_conversation": "השתקת שיחה",
"status.open": "הרחבת הודעה זו",
"status.pin": "הצמדה לפרופיל שלי",
"status.quote.cancel": "ביטול הודעת ציטוט",
"status.quote_error.filtered": "מוסתר בהתאם לסננים שלך",
"status.quote_error.not_available": "ההודעה לא זמינה",
"status.quote_error.pending_approval": "ההודעה בהמתנה לאישור",
"status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.",
"status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע",
"status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך",
"status.quote_post_author": "ההודעה צוטטה על ידי @{name}",
"status.read_more": "לקרוא עוד",
"status.reblog": "הדהוד",
@ -959,5 +962,17 @@
"video.skip_forward": "דילוג קדימה",
"video.unmute": "ביטול השתקה",
"video.volume_down": "הנמכת עוצמת השמע",
"video.volume_up": "הגברת עוצמת שמע"
"video.volume_up": "הגברת עוצמת שמע",
"visibility_modal.button_title": "בחירת רמת חשיפה",
"visibility_modal.header": "חשיפה והידוּד (אינטראקציה)",
"visibility_modal.helper.direct_quoting": "הודעות פרטיות לא ניתנות לציטוט.",
"visibility_modal.helper.privacy_editing": "לא ניתן לשנות את דרגת החשיפה של הודעות שפורסמו.",
"visibility_modal.helper.private_quoting": "לא ניתן לצטט הודעות שחשופות לעוקבים בלבד.",
"visibility_modal.helper.unlisted_quoting": "כאשר אחרים מצטטים אותך, ההודעות שלהם יוסתרו גם מ\"נושאים חמים\".",
"visibility_modal.instructions": "שליטה בהרשאה להידוּד (תגובות וציטוטים) עם הודעה זו. הגדרות ברירת המחדל ניתן למצוא תחת <link>העדפות > אחרים</link>.",
"visibility_modal.privacy_label": "פרטיות",
"visibility_modal.quote_followers": "לעוקבים בלבד",
"visibility_modal.quote_label": "הגדרת הרשאה לציטוט הודעותיך",
"visibility_modal.quote_nobody": "אף אחד",
"visibility_modal.quote_public": "כולם"
}

View File

@ -1,6 +1,7 @@
{
"about.blocks": "Servitores moderate",
"about.contact": "Contacto:",
"about.default_locale": "Default",
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Ration non disponibile",
"about.domain_blocks.preamble": "Mastodon generalmente permitte vider le contento de, e interager con, usatores de qualcunque altere servitor in le fediverso. Istes es le exceptiones que ha essite facite sur iste servitor particular.",
@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitate",
"about.domain_blocks.suspended.explanation": "Nulle datos de iste servitor essera processate, immagazinate o excambiate, rendente omne interaction o communication con usatores de iste servitor impossibile.",
"about.domain_blocks.suspended.title": "Suspendite",
"about.language_label": "Lingua",
"about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.",
"about.powered_by": "Rete social decentralisate, actionate per {mastodon}",
"about.rules": "Regulas del servitor",
@ -41,6 +43,7 @@
"account.followers": "Sequitores",
"account.followers.empty": "Necuno seque ancora iste usator.",
"account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}",
"account.followers_you_know_counter": "{counter} que tu cognosce",
"account.following": "Sequente",
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
"account.follows.empty": "Iste usator non seque ancora alcuno.",
@ -216,6 +219,13 @@
"confirmations.delete_list.confirm": "Deler",
"confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
"confirmations.delete_list.title": "Deler lista?",
"confirmations.discard_draft.confirm": "Discartar e continuar",
"confirmations.discard_draft.edit.cancel": "Reprender le modification",
"confirmations.discard_draft.edit.message": "Si tu continua, tu perdera tote le modificatione que tu ha apportate al message que tu modifica in iste momento.",
"confirmations.discard_draft.edit.title": "Discartar le modificationes de tu message?",
"confirmations.discard_draft.post.cancel": "Retornar al esbosso",
"confirmations.discard_draft.post.message": "Si tu continua, tu perdera le message que tu compone in iste momento.",
"confirmations.discard_draft.post.title": "Discartar tu esbosso de message?",
"confirmations.discard_edit_media.confirm": "Abandonar",
"confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?",
"confirmations.follow_to_list.confirm": "Sequer e adder al lista",
@ -235,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Remover sequitor",
"confirmations.remove_from_followers.message": "{name} non plus te sequera. Es tu secur de voler continuar?",
"confirmations.remove_from_followers.title": "Remover sequitor?",
"confirmations.revoke_quote.confirm": "Remover message",
"confirmations.revoke_quote.message": "Iste action non pote esser disfacite.",
"confirmations.revoke_quote.title": "Remover message?",
"confirmations.unfollow.confirm": "Non plus sequer",
"confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?",
"confirmations.unfollow.title": "Cessar de sequer le usator?",
@ -279,6 +292,7 @@
"domain_pill.your_handle": "Tu pseudonymo:",
"domain_pill.your_server": "Tu casa digital, ubi vive tote tu messages. Non te place? Cambia de servitor a omne momento e porta tu sequitores con te.",
"domain_pill.your_username": "Tu identificator unic sur iste servitor. Es possibile trovar usatores con le mesme nomine de usator sur servitores differente.",
"dropdown.empty": "Selige un option",
"embed.instructions": "Incorpora iste message sur tu sito web con le codice sequente.",
"embed.preview": "Ecce como illlo parera:",
"emoji_button.activity": "Activitate",
@ -296,6 +310,8 @@
"emoji_button.search_results": "Resultatos de recerca",
"emoji_button.symbols": "Symbolos",
"emoji_button.travel": "Viages e locos",
"empty_column.account_featured.me": "Tu non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
"empty_column.account_featured.other": "{acct} non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
"empty_column.account_featured_other.unknown": "Iste conto non ha ancora mittite alcun cosa in evidentia.",
"empty_column.account_hides_collections": "Le usator non ha rendite iste information disponibile",
"empty_column.account_suspended": "Conto suspendite",
@ -325,9 +341,15 @@
"errors.unexpected_crash.copy_stacktrace": "Copiar le traciamento del pila al area de transferentia",
"errors.unexpected_crash.report_issue": "Reportar problema",
"explore.suggested_follows": "Personas",
"explore.title": "In tendentia",
"explore.trending_links": "Novas",
"explore.trending_statuses": "Messages",
"explore.trending_tags": "Hashtags",
"featured_carousel.header": "{count, plural, one {Message fixate} other {Messages fixate}}",
"featured_carousel.next": "Sequente",
"featured_carousel.post": "Message",
"featured_carousel.previous": "Precedente",
"featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Iste categoria de filtros non se applica al contexto in le qual tu ha accedite a iste message. Pro filtrar le message in iste contexto tamben, modifica le filtro.",
"filter_modal.added.context_mismatch_title": "Contexto incoherente!",
"filter_modal.added.expired_explanation": "Iste categoria de filtros ha expirate. Tu debe modificar le data de expiration pro applicar lo.",
@ -380,6 +402,8 @@
"generic.saved": "Salvate",
"getting_started.heading": "Prime passos",
"hashtag.admin_moderation": "Aperir le interfacie de moderation pro #{name}",
"hashtag.browse": "Percurrer messages in #{hashtag}",
"hashtag.browse_from_account": "Percurrer le messages de @{name} in #{hashtag}",
"hashtag.column_header.tag_mode.all": "e {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sin {additional}",
@ -404,6 +428,7 @@
"hints.profiles.see_more_followers": "Vider plus de sequitores sur {domain}",
"hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}",
"hints.profiles.see_more_posts": "Vider plus de messages sur {domain}",
"home.column_settings.show_quotes": "Monstrar citationes",
"home.column_settings.show_reblogs": "Monstrar impulsos",
"home.column_settings.show_replies": "Monstrar responsas",
"home.hide_announcements": "Celar annuncios",
@ -477,6 +502,8 @@
"keyboard_shortcuts.translate": "a traducer un message",
"keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca",
"keyboard_shortcuts.up": "Displaciar in alto in le lista",
"learn_more_link.got_it": "Comprendite",
"learn_more_link.learn_more": "Pro saper plus",
"lightbox.close": "Clauder",
"lightbox.next": "Sequente",
"lightbox.previous": "Precedente",
@ -526,8 +553,10 @@
"mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
"mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.",
"navigation_bar.about": "A proposito",
"navigation_bar.account_settings": "Contrasigno e securitate",
"navigation_bar.administration": "Administration",
"navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate",
"navigation_bar.automated_deletion": "Deletion automatic del message",
"navigation_bar.blocks": "Usatores blocate",
"navigation_bar.bookmarks": "Marcapaginas",
"navigation_bar.direct": "Mentiones private",
@ -537,13 +566,23 @@
"navigation_bar.follow_requests": "Requestas de sequimento",
"navigation_bar.followed_tags": "Hashtags sequite",
"navigation_bar.follows_and_followers": "Sequites e sequitores",
"navigation_bar.import_export": "Importar e exportar",
"navigation_bar.lists": "Listas",
"navigation_bar.live_feed_local": "Canal in directo (local)",
"navigation_bar.live_feed_public": "Canal in directo (public)",
"navigation_bar.logout": "Clauder session",
"navigation_bar.moderation": "Moderation",
"navigation_bar.more": "Plus",
"navigation_bar.mutes": "Usatores silentiate",
"navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.",
"navigation_bar.preferences": "Preferentias",
"navigation_bar.privacy_and_reach": "Confidentialitate e portata",
"navigation_bar.search": "Cercar",
"navigation_bar.search_trends": "Cercar / In tendentia",
"navigation_panel.collapse_followed_tags": "Contraher le menu de hashtags sequite",
"navigation_panel.collapse_lists": "Contraher le menu de listas",
"navigation_panel.expand_followed_tags": "Expander le menu de hashtags sequite",
"navigation_panel.expand_lists": "Expander le menu de listas",
"not_signed_in_indicator.not_signed_in": "Es necessari aperir session pro acceder a iste ressource.",
"notification.admin.report": "{name} ha reportate {target}",
"notification.admin.report_account": "{name} ha reportate {count, plural, one {un message} other {# messages}} de {target} per {category}",
@ -565,6 +604,7 @@
"notification.label.mention": "Mention",
"notification.label.private_mention": "Mention private",
"notification.label.private_reply": "Responsa private",
"notification.label.quote": "{name} ha citate tu message",
"notification.label.reply": "Responder",
"notification.mention": "Mention",
"notification.mentioned_you": "{name} te ha mentionate",
@ -622,6 +662,7 @@
"notifications.column_settings.mention": "Mentiones:",
"notifications.column_settings.poll": "Resultatos del sondage:",
"notifications.column_settings.push": "Notificationes push",
"notifications.column_settings.quote": "Citationes:",
"notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Monstrar in columna",
"notifications.column_settings.sound": "Reproducer sono",
@ -770,6 +811,7 @@
"report_notification.categories.violation": "Violation del regulas",
"report_notification.categories.violation_sentence": "violation del regulas",
"report_notification.open": "Aperir reporto",
"search.clear": "Rader le recerca",
"search.no_recent_searches": "Nulle recercas recente",
"search.placeholder": "Cercar",
"search.quick_action.account_search": "Profilos correspondente a {x}",
@ -811,6 +853,8 @@
"status.bookmark": "Adder al marcapaginas",
"status.cancel_reblog_private": "Disfacer impulso",
"status.cannot_reblog": "Iste message non pote esser impulsate",
"status.context.load_new_replies": "Nove responsas disponibile",
"status.context.loading": "Cercante plus responsas",
"status.continued_thread": "Continuation del discussion",
"status.copy": "Copiar ligamine a message",
"status.delete": "Deler",
@ -836,6 +880,14 @@
"status.mute_conversation": "Silentiar conversation",
"status.open": "Expander iste message",
"status.pin": "Fixar sur profilo",
"status.quote.cancel": "Cancellar le citation",
"status.quote_error.filtered": "Celate a causa de un de tu filtros",
"status.quote_error.not_available": "Message indisponibile",
"status.quote_error.pending_approval": "Message pendente",
"status.quote_error.pending_approval_popout.body": "Le citationes distribuite a transverso le Fediverso pote tardar in apparer, perque differente servitores ha differente protocollos.",
"status.quote_error.pending_approval_popout.title": "Citation pendente? Resta calme",
"status.quote_policy_change": "Cambiar qui pote citar",
"status.quote_post_author": "Ha citate un message de @{name}",
"status.read_more": "Leger plus",
"status.reblog": "Impulsar",
"status.reblog_private": "Impulsar con visibilitate original",
@ -850,6 +902,7 @@
"status.reply": "Responder",
"status.replyAll": "Responder al discussion",
"status.report": "Reportar @{name}",
"status.revoke_quote": "Remover mi message del message de @{name}",
"status.sensitive_warning": "Contento sensibile",
"status.share": "Compartir",
"status.show_less_all": "Monstrar minus pro totes",
@ -865,9 +918,13 @@
"subscribed_languages.save": "Salvar le cambiamentos",
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
"tabs_bar.home": "Initio",
"tabs_bar.menu": "Menu",
"tabs_bar.notifications": "Notificationes",
"tabs_bar.publish": "Nove message",
"tabs_bar.search": "Cercar",
"terms_of_service.effective_as_of": "In vigor a partir de {date}",
"terms_of_service.title": "Conditiones de servicio",
"terms_of_service.upcoming_changes_on": "Cambiamentos a venir le {date}",
"time_remaining.days": "{number, plural, one {# die} other {# dies}} restante",
"time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante",
"time_remaining.minutes": "{number, plural, one {# minuta} other {# minutas}} restante",
@ -875,7 +932,7 @@
"time_remaining.seconds": "{number, plural, one {# secunda} other {# secundas}} restante",
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} in le passate {days, plural, one {die} other {{days} dies}}",
"trends.trending_now": "Ora in tendentias",
"ui.beforeunload": "Tu esbosso essera predite si tu exi de Mastodon.",
"ui.beforeunload": "Tu esbosso essera perdite si tu exi de Mastodon.",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
@ -902,7 +959,20 @@
"video.pause": "Pausa",
"video.play": "Reproducer",
"video.skip_backward": "Saltar a retro",
"video.skip_forward": "Avantiar",
"video.unmute": "Non plus silentiar",
"video.volume_down": "Abassar le volumine",
"video.volume_up": "Augmentar le volumine"
"video.volume_up": "Augmentar le volumine",
"visibility_modal.button_title": "Definir visibilitate",
"visibility_modal.header": "Visibilitate e interaction",
"visibility_modal.helper.direct_quoting": "Le mentiones private non pote esser citate.",
"visibility_modal.helper.privacy_editing": "Le messages ja publicate non pote cambiar de visibilitate.",
"visibility_modal.helper.private_quoting": "Le messages reservate al sequitores non pote esser citate.",
"visibility_modal.helper.unlisted_quoting": "Quando un persona te cita, su message essera tamben celate del chronologia \"In tendentia\".",
"visibility_modal.instructions": "Controla qui pote interager con iste message. Le parametros global se trova sub <link>Preferentias > Alteres</link>.",
"visibility_modal.privacy_label": "Confidentialitate",
"visibility_modal.quote_followers": "Solmente sequitores",
"visibility_modal.quote_label": "Cambiar qui pote citar",
"visibility_modal.quote_nobody": "Necuno",
"visibility_modal.quote_public": "Omnes"
}

View File

@ -880,6 +880,7 @@
"status.mute_conversation": "Þagga niður í samtali",
"status.open": "Opna þessa færslu",
"status.pin": "Festa á notandasnið",
"status.quote.cancel": "Hætta við tilvitnun",
"status.quote_error.filtered": "Falið vegna einnar síu sem er virk",
"status.quote_error.not_available": "Færsla ekki tiltæk",
"status.quote_error.pending_approval": "Færsla í bið",
@ -964,6 +965,11 @@
"video.volume_up": "Hækka hljóðstyrk",
"visibility_modal.button_title": "Stilla sýnileika",
"visibility_modal.header": "Sýnileiki og gagnvirkni",
"visibility_modal.helper.direct_quoting": "Ekki er hægt að vitna í einkaspjall.",
"visibility_modal.helper.privacy_editing": "Ekki er hægt að breyta sýnileika birtra færslna.",
"visibility_modal.helper.private_quoting": "Ekki er hægt að vitna í færslur sem eingöngu eru til fylgjenda.",
"visibility_modal.helper.unlisted_quoting": "Þegar fólk vitnar í þig verða færslurnar þeirr einnig faldar á vinsældatímalínum.",
"visibility_modal.instructions": "Stýrðu hverjir geta átt við þessa færslu. Víðværar stillingar finnast undir <link>Kjörstillingar > Annað</link>.",
"visibility_modal.privacy_label": "Persónuvernd",
"visibility_modal.quote_followers": "Einungis fylgjendur",
"visibility_modal.quote_label": "Breyttu því hver getur tilvitnað",

View File

@ -245,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Rimuovi il seguace",
"confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?",
"confirmations.remove_from_followers.title": "Rimuovi il seguace?",
"confirmations.revoke_quote.confirm": "Elimina il post",
"confirmations.revoke_quote.message": "Questa azione non può essere annullata.",
"confirmations.revoke_quote.title": "Rimuovere il post?",
"confirmations.unfollow.confirm": "Smetti di seguire",
"confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?",
"confirmations.unfollow.title": "Smettere di seguire l'utente?",
@ -289,6 +292,7 @@
"domain_pill.your_handle": "Il tuo nome univoco:",
"domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi seguaci.",
"domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.",
"dropdown.empty": "Seleziona un'opzione",
"embed.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.",
"embed.preview": "Ecco come apparirà:",
"emoji_button.activity": "Attività",
@ -876,11 +880,13 @@
"status.mute_conversation": "Silenzia conversazione",
"status.open": "Espandi questo post",
"status.pin": "Fissa in cima sul profilo",
"status.quote.cancel": "Annulla la citazione",
"status.quote_error.filtered": "Nascosto a causa di uno dei tuoi filtri",
"status.quote_error.not_available": "Post non disponibile",
"status.quote_error.pending_approval": "Post in attesa",
"status.quote_error.pending_approval_popout.body": "Le citazioni condivise in tutto il Fediverso possono richiedere del tempo per la visualizzazione, poiché server diversi hanno protocolli diversi.",
"status.quote_error.pending_approval_popout.title": "Citazione in attesa? Resta calmo",
"status.quote_policy_change": "Cambia chi può citare",
"status.quote_post_author": "Citato un post di @{name}",
"status.read_more": "Leggi di più",
"status.reblog": "Reblog",
@ -955,5 +961,17 @@
"video.skip_forward": "Vai avanti",
"video.unmute": "Muta",
"video.volume_down": "Abbassa volume",
"video.volume_up": "Alza volume"
"video.volume_up": "Alza volume",
"visibility_modal.button_title": "Imposta la visibilità",
"visibility_modal.header": "Visibilità e interazione",
"visibility_modal.helper.direct_quoting": "Le menzioni private non possono essere citate.",
"visibility_modal.helper.privacy_editing": "La visibilità dei post pubblicati non può essere modificata.",
"visibility_modal.helper.private_quoting": "I post riservati ai seguaci non possono essere citati.",
"visibility_modal.helper.unlisted_quoting": "Quando le persone ti citano, il loro post verrà nascosto anche dalle timeline di tendenza.",
"visibility_modal.instructions": "Controlla chi può interagire con questo post. Le impostazioni globali si trovano in <link>Preferenze > Altro</link>.",
"visibility_modal.privacy_label": "Privacy",
"visibility_modal.quote_followers": "Solo i seguaci",
"visibility_modal.quote_label": "Cambia chi può citare",
"visibility_modal.quote_nobody": "Nessuno",
"visibility_modal.quote_public": "Chiunque"
}

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Lí ê口座:",
"domain_pill.your_server": "Lí數位ê厝內底有lí所有ê PO文。無kah意Ē當轉kàu別ê服侍器koh保有跟tuè lí êl âng。.",
"domain_pill.your_username": "Lí 佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。",
"dropdown.empty": "揀選項",
"embed.instructions": "Khóo-pih 下kha ê程式碼來kā tsit篇PO文tàu佇lí ê網站。",
"embed.preview": "伊e án-ne顯示\n",
"emoji_button.activity": "活動",
@ -570,7 +571,7 @@
"navigation_bar.live_feed_local": "即時ê內容(本地)",
"navigation_bar.live_feed_public": "即時ê內容(公開)",
"navigation_bar.logout": "登出",
"navigation_bar.moderation": "審核",
"navigation_bar.moderation": "管理",
"navigation_bar.more": "其他",
"navigation_bar.mutes": "消音ê用者",
"navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面預設ē佇經典ê網頁界面內phah開。",
@ -608,11 +609,11 @@
"notification.mention": "提起",
"notification.mentioned_you": "{name}kā lí提起",
"notification.moderation-warning.learn_more": "看詳細",
"notification.moderation_warning": "Lí有收著審核ê警告",
"notification.moderation_warning": "Lí有收著管理ê警告",
"notification.moderation_warning.action_delete_statuses": "Lí ê一寡PO文hōo lâng thâi掉ah。",
"notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文hōo lâng標做敏感ê內容。",
"notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。",
"notification.moderation_warning.action_none": "Lí ê口座有收著管理ê警告。",
"notification.moderation_warning.action_sensitive": "Tuì tsit-má開始lí êPO文ē標做敏感ê內容。",
"notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。",
"notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。",
@ -883,6 +884,7 @@
"status.quote_error.pending_approval": "鋪文當咧送",
"status.quote_error.pending_approval_popout.body": "因為無kâng ê服侍器有無kâng ê協定,佇聯邦宇宙分享ê引文可能愛開時間來顯示。",
"status.quote_error.pending_approval_popout.title": "Leh送引文請sió等leh",
"status.quote_policy_change": "改通引用ê lâng",
"status.quote_post_author": "引用 @{name} ê PO文ah",
"status.read_more": "讀詳細",
"status.reblog": "轉送",
@ -957,5 +959,17 @@
"video.skip_forward": "跳kah頭前",
"video.unmute": "取消消音",
"video.volume_down": "變khah細聲",
"video.volume_up": "變khah大聲"
"video.volume_up": "變khah大聲",
"visibility_modal.button_title": "設定通看ê程度",
"visibility_modal.header": "通看ê程度kap互動",
"visibility_modal.helper.direct_quoting": "私人ê提起bē當引用。",
"visibility_modal.helper.privacy_editing": "公開ê PO文bē當改in通看ê程度。",
"visibility_modal.helper.private_quoting": "Bē當引用kan-ta跟tuè ê通看ê PO文。",
"visibility_modal.helper.unlisted_quoting": "若別lâng引用líin ê PO文mā ē tuì趨勢時間線隱藏。",
"visibility_modal.instructions": "控制ē當kap tsit篇PO文互動ê lângĒ當佇 <link>偏愛ê設定>其他</link>tshuē tio̍h全地ê設定。",
"visibility_modal.privacy_label": "隱私權",
"visibility_modal.quote_followers": "Kan-ta hōo跟tuè ê lâng",
"visibility_modal.quote_label": "改通引用ê lâng",
"visibility_modal.quote_nobody": "無半位",
"visibility_modal.quote_public": "Ta̍k ê lâng"
}

View File

@ -603,6 +603,7 @@
"notification.label.mention": "Упоминание",
"notification.label.private_mention": "Личное упоминание",
"notification.label.private_reply": "Приватный ответ",
"notification.label.quote": "{name} процитировал(а) ваш пост",
"notification.label.reply": "Ответ",
"notification.mention": "Упоминание",
"notification.mentioned_you": "{name} упомянул(а) вас",
@ -660,6 +661,7 @@
"notifications.column_settings.mention": "Вас упомянули в посте:",
"notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
"notifications.column_settings.push": "Push-уведомления",
"notifications.column_settings.quote": "Ваш пост процитировали:",
"notifications.column_settings.reblog": "Ваш пост продвинули:",
"notifications.column_settings.show": "Отображать в списке",
"notifications.column_settings.sound": "Проигрывать звук",
@ -851,7 +853,7 @@
"status.cancel_reblog_private": "Отменить продвижение",
"status.cannot_reblog": "Этот пост не может быть продвинут",
"status.context.load_new_replies": "Доступны новые ответы",
"status.context.loading": "Проверяем, есть ли еще ответы",
"status.context.loading": "Проверяем, есть ли ещё ответы",
"status.continued_thread": "Продолжение предыдущего поста",
"status.copy": "Скопировать ссылку на пост",
"status.delete": "Удалить",
@ -879,6 +881,8 @@
"status.pin": "Закрепить в профиле",
"status.quote_error.filtered": "Скрыто одним из ваших фильтров",
"status.quote_error.not_available": "Пост недоступен",
"status.quote_error.pending_approval": "Пост ожидает подтверждения",
"status.quote_error.pending_approval_popout.title": "Цитирование ещё не подтверждено? Не беспокойтесь",
"status.read_more": "Читать далее",
"status.reblog": "Продвинуть",
"status.reblog_private": "Продвинуть для своей аудитории",

View File

@ -246,6 +246,7 @@
"confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?",
"confirmations.remove_from_followers.title": "Ta bort följare?",
"confirmations.revoke_quote.confirm": "Ta bort inlägg",
"confirmations.revoke_quote.message": "Denna åtgärd kan inte ångras.",
"confirmations.revoke_quote.title": "Ta bort inlägg?",
"confirmations.unfollow.confirm": "Avfölj",
"confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?",
@ -603,6 +604,7 @@
"notification.label.mention": "Nämn",
"notification.label.private_mention": "Privat omnämnande",
"notification.label.private_reply": "Privata svar",
"notification.label.quote": "{name} citerade ditt inlägg",
"notification.label.reply": "Svar",
"notification.mention": "Nämn",
"notification.mentioned_you": "{name} nämnde dig",
@ -660,6 +662,7 @@
"notifications.column_settings.mention": "Omnämningar:",
"notifications.column_settings.poll": "Omröstningsresultat:",
"notifications.column_settings.push": "Push-aviseringar",
"notifications.column_settings.quote": "Citerat:",
"notifications.column_settings.reblog": "Boostar:",
"notifications.column_settings.show": "Visa i kolumnen",
"notifications.column_settings.sound": "Spela upp ljud",
@ -877,8 +880,14 @@
"status.mute_conversation": "Tysta konversation",
"status.open": "Utvidga detta inlägg",
"status.pin": "Fäst i profil",
"status.quote.cancel": "Återkalla citering",
"status.quote_error.filtered": "Dolt på grund av ett av dina filter",
"status.quote_error.not_available": "Inlägg ej tillgängligt",
"status.quote_error.pending_approval": "Väntande inlägg",
"status.quote_error.pending_approval_popout.body": "Citat som delas över Fediverse kan ta tid att visa, eftersom olika servrar har olika protokoll.",
"status.quote_error.pending_approval_popout.title": "Väntande citat? Förbli lugn",
"status.quote_policy_change": "Ändra vem som kan citera",
"status.quote_post_author": "Citerade ett inlägg av @{name}",
"status.read_more": "Läs mer",
"status.reblog": "Boosta",
"status.reblog_private": "Boosta med ursprunglig synlighet",
@ -893,6 +902,7 @@
"status.reply": "Svara",
"status.replyAll": "Svara på tråden",
"status.report": "Rapportera @{name}",
"status.revoke_quote": "Ta bort mitt inlägg från @{name}s inlägg",
"status.sensitive_warning": "Känsligt innehåll",
"status.share": "Dela",
"status.show_less_all": "Visa mindre för alla",
@ -953,7 +963,10 @@
"video.unmute": "Avtysta",
"video.volume_down": "Volym ned",
"video.volume_up": "Volym upp",
"visibility_modal.button_title": "Ange synlighet",
"visibility_modal.header": "Synlighet och interaktion",
"visibility_modal.helper.direct_quoting": "Privata omnämnanden kan inte bli citerade.",
"visibility_modal.helper.private_quoting": "Inlägg som endast är synliga för följare kan inte citeras.",
"visibility_modal.privacy_label": "Integritet",
"visibility_modal.quote_followers": "Endast följare",
"visibility_modal.quote_nobody": "Ingen",

View File

@ -880,6 +880,7 @@
"status.mute_conversation": "Tắt thông báo",
"status.open": "Mở tút",
"status.pin": "Ghim lên hồ sơ",
"status.quote.cancel": "Bỏ trích dẫn",
"status.quote_error.filtered": "Bị ẩn vì một bộ lọc của bạn",
"status.quote_error.not_available": "Tút không khả dụng",
"status.quote_error.pending_approval": "Tút đang chờ duyệt",

View File

@ -240,6 +240,8 @@
"confirmations.remove_from_followers.confirm": "移除关注者",
"confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?",
"confirmations.remove_from_followers.title": "移除关注者?",
"confirmations.revoke_quote.confirm": "移除嘟文",
"confirmations.revoke_quote.title": "移除嘟文?",
"confirmations.unfollow.confirm": "取消关注",
"confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
"confirmations.unfollow.title": "确定要取消关注用户?",
@ -491,6 +493,7 @@
"keyboard_shortcuts.translate": "翻译嘟文",
"keyboard_shortcuts.unfocus": "取消输入/搜索",
"keyboard_shortcuts.up": "在列表中让光标上移",
"learn_more_link.got_it": "明白了",
"lightbox.close": "关闭",
"lightbox.next": "下一个",
"lightbox.previous": "上一个",
@ -861,6 +864,7 @@
"status.mute_conversation": "关闭此对话的通知",
"status.open": "展开嘟文",
"status.pin": "在个人资料页面置顶",
"status.quote.cancel": "取消引用",
"status.quote_error.filtered": "已根据你的筛选器过滤",
"status.read_more": "查看更多",
"status.reblog": "转嘟",

View File

@ -292,7 +292,7 @@
"domain_pill.your_handle": "您的帳號:",
"domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。",
"domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。",
"dropdown.empty": "選取選項",
"dropdown.empty": "選項",
"embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。",
"embed.preview": "它將顯示成這樣:",
"emoji_button.activity": "活動",
@ -880,6 +880,7 @@
"status.mute_conversation": "靜音對話",
"status.open": "展開此嘟文",
"status.pin": "釘選至個人檔案頁面",
"status.quote.cancel": "取消引用嘟文",
"status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏",
"status.quote_error.not_available": "無法取得該嘟文",
"status.quote_error.pending_approval": "嘟文正在發送中",
@ -965,9 +966,9 @@
"visibility_modal.button_title": "設定可見性",
"visibility_modal.header": "可見性與互動",
"visibility_modal.helper.direct_quoting": "無法引用私人提及。",
"visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文可見性。",
"visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文可見性。",
"visibility_modal.helper.private_quoting": "無法引用僅追蹤者的嘟文。",
"visibility_modal.helper.unlisted_quoting": "當他人引用您時,他們的嘟文也會自熱門時間軸隱藏。",
"visibility_modal.helper.unlisted_quoting": "當他人引用您時,他們的嘟文也會自熱門時間軸隱藏。",
"visibility_modal.instructions": "控制誰能與此嘟文互動。可在<link>偏好設定 > 其他</link>下找到全域設定。",
"visibility_modal.privacy_label": "隱私權",
"visibility_modal.quote_followers": "僅限跟隨者",

View File

@ -1,10 +1,12 @@
import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react';
interface BaseMenuItem {
text: string;
dangerous?: boolean;
}
export interface ActionMenuItem extends BaseMenuItem {
action: () => void;
action: (event: MouseEvent | KeyboardEvent | TouchEvent) => void;
}
export interface LinkMenuItem extends BaseMenuItem {

View File

@ -331,8 +331,16 @@ export const composeReducer = (state = initialState, action) => {
return state.set('is_changing_upload', false);
} else if (quoteComposeByStatus.match(action)) {
const status = action.payload;
if (status.getIn(['quote_approval', 'current_user']) === 'automatic') {
return state.set('quoted_status_id', status.get('id'));
if (
status.getIn(['quote_approval', 'current_user']) === 'automatic' &&
state.get('media_attachments').size === 0 &&
!state.get('is_uploading') &&
!state.get('poll')
) {
return state
.set('quoted_status_id', status.get('id'))
.set('spoiler', status.get('sensitive'))
.set('spoiler_text', status.get('spoiler_text'));
}
} else if (quoteComposeCancel.match(action)) {
return state.set('quoted_status_id', null);
@ -512,6 +520,8 @@ export const composeReducer = (state = initialState, action) => {
map.set('sensitive', action.status.get('sensitive'));
map.set('language', action.status.get('language'));
map.set('id', null);
// Mastodon-authored posts can be expected to have at most one automatic approval policy
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
if (action.status.get('spoiler_text').length > 0) {
map.set('spoiler', true);
@ -541,6 +551,8 @@ export const composeReducer = (state = initialState, action) => {
map.set('idempotencyKey', uuid());
map.set('sensitive', action.status.get('sensitive'));
map.set('language', action.status.get('language'));
// Mastodon-authored posts can be expected to have at most one automatic approval policy
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
if (action.spoiler_text.length > 0) {
map.set('spoiler', true);

View File

@ -15,7 +15,7 @@ export const getFilters = createSelector(
(_, { contextType }: { contextType: string }) => contextType,
],
(filters, contextType) => {
if (!contextType) {
if (!contextType || contextType === 'compose') {
return null;
}

View File

@ -129,7 +129,7 @@ export function createAppThunk<Arg = void, Returned = void, ExtraArg = unknown>(
},
}));
return Object.assign({}, action, actionCreator);
return Object.assign(actionCreator, action);
}
const createBaseAsyncThunk = rtkCreateAsyncThunk.withTypes<AppThunkConfig>();

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px"><path d="M791-56 425-422 320-240h-92l92-160q-66 0-113-47t-47-113q0-27 8.5-51t23.5-44L56-791l56-57 736 736-57 56Zm-55-281L520-553v-7q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480l-82 143ZM320-500q6 0 12-1t11-3l-79-79q-2 5-3 11t-1 12q0 25 17.5 42.5T320-500Zm360 0q25 0 42.5-17.5T740-560q0-25-17.5-42.5T680-620q-25 0-42.5 17.5T620-560q0 25 17.5 42.5T680-500Zm-374-41Zm374-19Z"/></svg>

After

Width:  |  Height:  |  Size: 488 B

View File

@ -16,7 +16,7 @@
.status-card__actions button,
.status-card__actions a {
color: rgba($white, 0.8);
color: color.change($white, $alpha: 0.8);
&:hover,
&:active,
@ -298,14 +298,14 @@
.simple_form {
.warning {
box-shadow: none;
background: rgba($error-red, 0.5);
background: color.change($error-red, $alpha: 0.5);
text-shadow: none;
}
.recommended {
border-color: $ui-highlight-color;
color: $ui-highlight-color;
background-color: rgba($ui-highlight-color, 0.1);
background-color: color.change($ui-highlight-color, $alpha: 0.1);
}
input[type='text'],
@ -327,7 +327,7 @@
.compose-form .compose-form__warning {
border-color: $ui-highlight-color;
background-color: rgba($ui-highlight-color, 0.1);
background-color: color.change($ui-highlight-color, $alpha: 0.1);
&,
a {
@ -375,10 +375,10 @@
}
.status__wrapper-direct {
background-color: rgba($ui-highlight-color, 0.1);
background-color: color.change($ui-highlight-color, $alpha: 0.1);
&:focus {
background-color: rgba($ui-highlight-color, 0.15);
background-color: color.change($ui-highlight-color, $alpha: 0.15);
}
}
@ -433,8 +433,8 @@
}
.inline-follow-suggestions {
background-color: rgba($ui-highlight-color, 0.1);
border-bottom-color: rgba($ui-highlight-color, 0.3);
background-color: color.change($ui-highlight-color, $alpha: 0.1);
border-bottom-color: color.change($ui-highlight-color, $alpha: 0.3);
}
.inline-follow-suggestions__body__scrollable__card {
@ -508,7 +508,7 @@ a.sparkline {
@supports not selector(::-webkit-scrollbar) {
html {
scrollbar-color: rgba($action-button-color, 0.25)
scrollbar-color: color.change($action-button-color, $alpha: 0.25)
var(--background-border-color);
}
}

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *;
@mixin search-input {
@ -22,7 +23,7 @@
padding-bottom: 14px;
margin-top: 10px;
color: $light-text-color;
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
box-shadow: 2px 4px 15px color.change($base-shadow-color, $alpha: 0.4);
h4 {
text-transform: uppercase;

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *;
@use 'functions' as *;
@ -161,7 +162,7 @@
.nothing-here {
background: $ui-base-color;
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
color: $darker-text-color;
font-size: 14px;
font-weight: 500;
@ -205,8 +206,8 @@
.simple_form .overridden,
.simple_form .recommended,
.simple_form .not_recommended {
background-color: rgba($ui-secondary-color, 0.1);
border: 1px solid rgba($ui-secondary-color, 0.5);
background-color: color.change($ui-secondary-color, $alpha: 0.1);
border: 1px solid color.change($ui-secondary-color, $alpha: 0.5);
}
.account-role {
@ -240,8 +241,8 @@
.information-badge {
&.superapp {
color: $success-green;
background-color: rgba($success-green, 0.1);
border-color: rgba($success-green, 0.5);
background-color: color.change($success-green, $alpha: 0.1);
border-color: color.change($success-green, $alpha: 0.5);
}
}
@ -302,8 +303,8 @@
}
.verified {
border: 1px solid rgba($valid-value-color, 0.5);
background: rgba($valid-value-color, 0.25);
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
background: color.change($valid-value-color, $alpha: 0.25);
a {
color: $valid-value-color;

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'sass:math';
@use 'functions' as *;
@use 'variables' as *;
@ -1255,7 +1256,7 @@ a.name-tag,
}
path:first-child {
fill: rgba($highlight-text-color, 0.25) !important;
fill: color.change($highlight-text-color, $alpha: 0.25) !important;
fill-opacity: 1 !important;
}

View File

@ -311,7 +311,7 @@
&:active,
&:focus-visible {
color: lighten($action-button-color, 7%);
background-color: rgba($action-button-color, 0.15);
background-color: color.change($action-button-color, $alpha: 0.15);
}
&:focus-visible {
@ -331,7 +331,7 @@
&:active,
&:focus-visible {
color: darken($lighter-text-color, 7%);
background-color: rgba($lighter-text-color, 0.15);
background-color: color.change($lighter-text-color, $alpha: 0.15);
}
&:focus-visible {
@ -361,14 +361,14 @@
&.overlayed {
box-sizing: content-box;
background: rgba($black, 0.65);
background: color.change($black, $alpha: 0.65);
backdrop-filter: $backdrop-blur-filter;
color: rgba($white, 0.7);
color: color.change($white, $alpha: 0.7);
border-radius: 4px;
padding: 2px;
&:hover {
background: rgba($black, 0.9);
background: color.change($black, $alpha: 0.9);
}
}
@ -391,7 +391,7 @@
border-color: $valid-value-color;
color: $valid-value-color;
transition: none;
background-color: rgba($valid-value-color, 0.15);
background-color: color.change($valid-value-color, $alpha: 0.15);
}
}
@ -411,7 +411,7 @@
&:active,
&:focus {
color: darken($lighter-text-color, 7%);
background-color: rgba($lighter-text-color, 0.15);
background-color: color.change($lighter-text-color, $alpha: 0.15);
}
&:focus-visible {
@ -618,7 +618,7 @@ body > [data-popper-placement] {
&__warning {
color: $inverted-text-color;
background: $ui-primary-color;
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);
box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.3);
padding: 8px 10px;
border-radius: 4px;
font-size: 13px;
@ -656,19 +656,12 @@ body > [data-popper-placement] {
background: url('@/images/warning-stripes.svg') repeat-y;
width: 5px;
flex: 0 0 auto;
&:first-child {
border-start-start-radius: 4px;
}
&:last-child {
border-start-end-radius: 4px;
}
}
.autosuggest-input {
flex: 1 1 auto;
border-bottom: 1px solid var(--background-border-color);
border: 1px solid var(--background-border-color);
border-width: 1px 0;
}
}
@ -694,7 +687,7 @@ body > [data-popper-placement] {
.spoiler-input__input {
padding: 12px 12px - 5px;
background: rgba($ui-highlight-color, 0.05);
background: color.change($ui-highlight-color, $alpha: 0.05);
color: $highlight-text-color;
}
@ -946,6 +939,24 @@ body > [data-popper-placement] {
}
}
}
.status__quote {
margin: 0 8px;
max-height: 220px;
overflow: hidden;
// Override .status__content .status__content__text.status__content__text--visible
.status__content__text.status__content__text {
display: -webkit-box;
}
.status__content__text {
-webkit-line-clamp: 4;
line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
}
}
}
.dropdown-button {
@ -1428,7 +1439,7 @@ body > [data-popper-placement] {
.focusable {
&:focus-visible {
outline: 0;
background: rgba($ui-highlight-color, 0.05);
background: color.change($ui-highlight-color, $alpha: 0.05);
box-shadow: inset 0 0 0 2px $ui-button-focus-outline-color;
}
}
@ -1471,18 +1482,19 @@ body > [data-popper-placement] {
border-bottom: 0;
.status__content,
.status__action-bar,
.media-gallery,
.video-player,
.audio-player,
.attachment-list,
.picture-in-picture-placeholder,
.more-from-author,
.status-card,
.hashtag-bar,
.content-warning,
.filter-warning {
& > .status__content,
& > .status__action-bar,
& > .media-gallery,
& > .video-player,
& > .audio-player,
& > .attachment-list,
& > .picture-in-picture-placeholder,
& > .more-from-author,
& > .status-card,
& > .hashtag-bar,
& > .content-warning,
& > .filter-warning,
& > .status__quote {
margin-inline-start: var(--thread-margin);
width: calc(100% - var(--thread-margin));
}
@ -1583,6 +1595,7 @@ body > [data-popper-placement] {
align-items: center;
gap: 10px;
overflow: hidden;
flex-grow: 1;
.display-name {
bdi {
@ -1599,6 +1612,11 @@ body > [data-popper-placement] {
}
}
.status__quote-cancel {
align-self: self-start;
order: 5;
}
.status__info {
font-size: 15px;
padding-bottom: 10px;
@ -1683,10 +1701,10 @@ body > [data-popper-placement] {
.notification-ungrouped--direct,
.notification-group--direct,
.notification-group--annual-report {
background: rgba($ui-highlight-color, 0.05);
background: color.change($ui-highlight-color, $alpha: 0.05);
&:focus {
background: rgba($ui-highlight-color, 0.1);
background: color.change($ui-highlight-color, $alpha: 0.1);
}
}
@ -2016,7 +2034,7 @@ body > [data-popper-placement] {
&__domain-pill {
display: inline-flex;
background: rgba($highlight-text-color, 0.2);
background: color.change($highlight-text-color, $alpha: 0.2);
border-radius: 4px;
border: 0;
color: $highlight-text-color;
@ -2077,7 +2095,7 @@ body > [data-popper-placement] {
&__handle {
border: 2px dashed $highlight-text-color;
background: rgba($highlight-text-color, 0.1);
background: color.change($highlight-text-color, $alpha: 0.1);
padding: 12px 8px;
color: $highlight-text-color;
border-radius: 4px;
@ -2839,10 +2857,43 @@ a.account__display-name {
&:focus,
&:hover,
&:active {
background: var(--dropdown-border-color);
outline: 0;
&:not(:disabled) {
background: var(--dropdown-border-color);
outline: 0;
}
}
}
button:disabled {
color: $dark-text-color;
cursor: default;
}
}
.reblog-button {
&__item {
width: 280px;
button {
display: flex;
align-items: center;
gap: 8px;
white-space: inherit;
}
div {
display: flex;
flex-direction: column;
}
&.active:not(.disabled) {
color: $highlight-text-color;
}
}
&__meta {
font-weight: 400;
}
}
.inline-account {
@ -3283,7 +3334,7 @@ a.account__display-name {
.columns-area__panels__pane--overlay {
pointer-events: auto;
background: rgba($base-overlay-background, 0.5);
background: color.change($base-overlay-background, $alpha: 0.5);
z-index: 3;
.columns-area__panels__pane__inner {
@ -3820,7 +3871,10 @@ a.account__display-name {
border-radius: 10px;
padding: 0;
user-select: none;
-webkit-tap-highlight-color: rgba($base-overlay-background, 0);
-webkit-tap-highlight-color: color.change(
$base-overlay-background,
$alpha: 0
);
-webkit-tap-highlight-color: transparent;
}
@ -4069,7 +4123,7 @@ a.account__display-name {
cursor: pointer;
& > div {
background: rgba($base-shadow-color, 0.6);
background: color.change($base-shadow-color, $alpha: 0.6);
border-radius: 8px;
padding: 12px 9px;
backdrop-filter: $backdrop-blur-filter;
@ -4399,7 +4453,7 @@ a.status-card {
z-index: 1;
&.active {
box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);
box-shadow: 0 1px 0 color.change($highlight-text-color, $alpha: 0.3);
&::before {
display: block;
@ -4415,8 +4469,8 @@ a.status-card {
z-index: 1;
background: radial-gradient(
ellipse,
rgba($ui-highlight-color, 0.23) 0%,
rgba($ui-highlight-color, 0) 60%
color.change($ui-highlight-color, $alpha: 0.23) 0%,
color.change($ui-highlight-color, $alpha: 0) 60%
);
}
}
@ -4510,7 +4564,7 @@ a.status-card {
&.active {
.column-header__icon {
color: $highlight-text-color;
text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);
text-shadow: 0 0 10px color.change($highlight-text-color, $alpha: 0.4);
}
}
@ -4855,7 +4909,7 @@ a.status-card {
font-size: 14px;
&__label {
background-color: rgba($black, 0.45);
background-color: color.change($black, $alpha: 0.45);
backdrop-filter: $backdrop-blur-filter;
border-radius: 8px;
padding: 12px 16px;
@ -4875,7 +4929,7 @@ a.status-card {
&:hover,
&:focus {
.spoiler-button__overlay__label {
background-color: rgba($black, 0.9);
background-color: color.change($black, $alpha: 0.9);
}
}
}
@ -5266,7 +5320,7 @@ a.status-card {
.upload-area {
align-items: center;
background: rgba($base-overlay-background, 0.8);
background: color.change($base-overlay-background, $alpha: 0.8);
display: flex;
height: 100vh;
justify-content: center;
@ -5301,7 +5355,7 @@ a.status-card {
z-index: -1;
border-radius: 4px;
background: $ui-base-color;
box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
box-shadow: 0 0 5px color.change($base-shadow-color, $alpha: 0.2);
}
.upload-area__content {
@ -5939,7 +5993,7 @@ a.status-card {
align-items: center;
.icon-button {
color: rgba($white, 0.7);
color: color.change($white, $alpha: 0.7);
padding: 8px;
.icon {
@ -5952,11 +6006,11 @@ a.status-card {
&:focus,
&:active {
color: $white;
background-color: rgba($white, 0.15);
background-color: color.change($white, $alpha: 0.15);
}
&:focus {
background-color: rgba($white, 0.3);
background-color: color.change($white, $alpha: 0.3);
}
}
}
@ -5997,7 +6051,7 @@ a.status-card {
background: transparent;
box-sizing: border-box;
border: 0;
color: rgba($white, 0.7);
color: color.change($white, $alpha: 0.7);
cursor: pointer;
display: flex;
align-items: center;
@ -6051,11 +6105,11 @@ a.status-card {
&:focus,
&:active {
color: $white;
background-color: rgba($white, 0.15);
background-color: color.change($white, $alpha: 0.15);
}
&:focus {
background-color: rgba($white, 0.3);
background-color: color.change($white, $alpha: 0.3);
}
&.active {
@ -6064,11 +6118,11 @@ a.status-card {
&:hover,
&:focus,
&:active {
background: rgba($highlight-text-color, 0.15);
background: color.change($highlight-text-color, $alpha: 0.15);
}
&:focus {
background: rgba($highlight-text-color, 0.3);
background: color.change($highlight-text-color, $alpha: 0.3);
}
}
@ -6078,11 +6132,11 @@ a.status-card {
&:hover,
&:focus,
&:active {
background: rgba($gold-star, 0.15);
background: color.change($gold-star, $alpha: 0.15);
}
&:focus {
background: rgba($gold-star, 0.3);
background: color.change($gold-star, $alpha: 0.3);
}
}
@ -6954,7 +7008,7 @@ a.status-card {
display: block;
color: $white;
border: 0;
background: rgba($black, 0.65);
background: color.change($black, $alpha: 0.65);
backdrop-filter: $backdrop-blur-filter;
padding: 3px 12px;
border-radius: 99px;
@ -6979,7 +7033,7 @@ a.status-card {
text-align: center;
color: $white;
border: 0;
background: rgba($black, 0.65);
background: color.change($black, $alpha: 0.65);
backdrop-filter: $backdrop-blur-filter;
padding: 3px 8px;
border-radius: 4px;
@ -7001,7 +7055,7 @@ a.status-card {
}
.media-gallery__alt__popover {
background: rgba($black, 0.65);
background: color.change($black, $alpha: 0.65);
backdrop-filter: $backdrop-blur-filter;
border-radius: 4px;
box-shadow: var(--dropdown-shadow);
@ -7023,7 +7077,7 @@ a.status-card {
p {
font-size: 15px;
line-height: 20px;
color: rgba($white, 0.85);
color: color.change($white, $alpha: 0.85);
white-space: pre-line;
}
}
@ -7467,8 +7521,8 @@ a.status-card {
box-sizing: border-box;
background: linear-gradient(
0deg,
rgba($base-shadow-color, 0.85) 0,
rgba($base-shadow-color, 0.45) 60%,
color.change($base-shadow-color, $alpha: 0.85) 0,
color.change($base-shadow-color, $alpha: 0.45) 60%,
transparent
);
padding: 0 15px;
@ -7564,7 +7618,7 @@ a.status-card {
flex: 0 0 auto;
background: transparent;
border: 0;
color: rgba($white, 0.75);
color: color.change($white, $alpha: 0.75);
font-weight: 500;
&:active,
@ -7628,7 +7682,7 @@ a.status-card {
&::before {
content: '';
width: 50px;
background: rgba($white, 0.35);
background: color.change($white, $alpha: 0.35);
border-radius: 4px;
display: block;
position: absolute;
@ -7660,7 +7714,7 @@ a.status-card {
margin-inline-start: -6px;
transform: translate(0, -50%);
background: $white;
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2);
opacity: 0;
.no-reduce-motion & {
@ -7698,7 +7752,7 @@ a.status-card {
&::before {
content: '';
width: 100%;
background: rgba($white, 0.35);
background: color.change($white, $alpha: 0.35);
border-radius: 4px;
display: block;
position: absolute;
@ -7717,7 +7771,7 @@ a.status-card {
}
&__buffer {
background: rgba($white, 0.2);
background: color.change($white, $alpha: 0.2);
}
&__handle {
@ -7730,7 +7784,7 @@ a.status-card {
top: 10px;
margin-inline-start: -6px;
background: $white;
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2);
.no-reduce-motion & {
transition: opacity 0.1s ease;
@ -7754,7 +7808,7 @@ a.status-card {
top: 50%;
inset-inline-start: 50%;
transform: translate(-50%, -50%);
background: rgba($base-shadow-color, 0.45);
background: color.change($base-shadow-color, $alpha: 0.45);
backdrop-filter: $backdrop-blur-filter;
color: $white;
border-radius: 8px;
@ -8089,7 +8143,7 @@ noscript {
inset-inline-start: 0;
width: 100%;
height: 100%;
background: rgba($base-overlay-background, 0.5);
background: color.change($base-overlay-background, $alpha: 0.5);
}
.focal-point {
@ -8111,7 +8165,7 @@ noscript {
transform: translate(-50%, -50%);
border: 2px solid #fff;
border-radius: 50%;
box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);
box-shadow: 0 0 0 9999em color.change($base-shadow-color, $alpha: 0.35);
pointer-events: none;
}
}
@ -8353,7 +8407,7 @@ noscript {
}
.verified {
border: 1px solid rgba($valid-value-color, 0.5);
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
margin-top: -1px;
margin-inline: -1px;
@ -8573,7 +8627,7 @@ noscript {
width: 50px;
path:first-child {
fill: rgba($highlight-text-color, 0.25) !important;
fill: color.change($highlight-text-color, $alpha: 0.25) !important;
fill-opacity: 1 !important;
}
@ -8598,7 +8652,7 @@ noscript {
.trends__item__sparkline {
path:first-child {
fill: rgba($gold-star, 0.25) !important;
fill: color.change($gold-star, $alpha: 0.25) !important;
}
path:last-child {
@ -9763,7 +9817,7 @@ noscript {
margin-bottom: 5px;
border-radius: 8px;
border: 1px solid $highlight-text-color;
background: rgba($highlight-text-color, 0.15);
background: color.change($highlight-text-color, $alpha: 0.15);
overflow: hidden;
flex-shrink: 0;
@ -9818,7 +9872,7 @@ noscript {
}
.button-tertiary {
background: rgba($ui-base-color, 0.15);
background: color.change($ui-base-color, $alpha: 0.15);
backdrop-filter: blur(8px);
}
}
@ -9835,7 +9889,7 @@ noscript {
.warning-banner {
border: 1px solid $warning-red;
background: rgba($warning-red, 0.15);
background: color.change($warning-red, $alpha: 0.15);
&__message {
h1 {
@ -10170,13 +10224,13 @@ noscript {
padding: 15px;
margin: 0;
color: $white;
background: rgba($black, 0.85);
background: color.change($black, $alpha: 0.85);
backdrop-filter: blur(8px);
border: 1px solid rgba(lighten($classic-base-color, 4%), 0.85);
border-radius: 8px;
box-shadow:
0 10px 15px -3px rgba($base-shadow-color, 0.25),
0 4px 6px -4px rgba($base-shadow-color, 0.25);
0 10px 15px -3px color.change($base-shadow-color, $alpha: 0.25),
0 4px 6px -4px color.change($base-shadow-color, $alpha: 0.25);
cursor: default;
font-size: 15px;
line-height: 21px;
@ -10214,7 +10268,7 @@ noscript {
&:hover,
&:focus,
&:active {
background: rgba($ui-base-color, 0.85);
background: color.change($ui-base-color, $alpha: 0.85);
}
}
@ -10312,7 +10366,7 @@ noscript {
padding: 16px 0;
padding-bottom: 0;
border-bottom: 1px solid var(--background-border-color);
background: rgba($ui-highlight-color, 0.05);
background: color.change($ui-highlight-color, $alpha: 0.05);
&__header {
display: flex;

View File

@ -6,10 +6,10 @@
--dropdown-border-color: #{lighten($ui-base-color, 4%)};
--dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)};
--dropdown-shadow:
0 20px 25px -5px #{rgba($base-shadow-color, 0.25)},
0 8px 10px -6px #{rgba($base-shadow-color, 0.25)};
0 20px 25px -5px #{color.change($base-shadow-color, $alpha: 0.25)},
0 8px 10px -6px #{color.change($base-shadow-color, $alpha: 0.25)};
--modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)};
--modal-background-variant-color: #{rgba($ui-base-color, 0.7)};
--modal-background-variant-color: #{color.change($ui-base-color, $alpha: 0.7)};
--modal-border-color: #{lighten($ui-base-color, 4%)};
--background-border-color: #{lighten($ui-base-color, 4%)};
--background-color: #{darken($ui-base-color, 8%)};
@ -21,7 +21,9 @@
--on-surface-color: #{color.adjust($ui-base-color, $alpha: -0.5)};
--avatar-border-radius: 8px;
--media-outline-color: #{rgba(#fcf8ff, 0.15)};
--overlay-icon-shadow: drop-shadow(0 0 8px #{rgba($base-shadow-color, 0.35)});
--overlay-icon-shadow: drop-shadow(
0 0 8px #{color.change($base-shadow-color, $alpha: 0.35)}
);
--error-background-color: #{darken($error-red, 16%)};
--error-active-background-color: #{darken($error-red, 12%)};
--on-error-color: #fff;

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *;
@use 'functions' as *;
@ -733,20 +734,20 @@ code {
text-align: center;
&.notice {
border: 1px solid rgba($valid-value-color, 0.5);
background: rgba($valid-value-color, 0.25);
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
background: color.change($valid-value-color, $alpha: 0.25);
color: $valid-value-color;
}
&.warning {
border: 1px solid rgba($gold-star, 0.5);
background: rgba($gold-star, 0.25);
border: 1px solid color.change($gold-star, $alpha: 0.5);
background: color.change($gold-star, $alpha: 0.25);
color: $gold-star;
}
&.alert {
border: 1px solid rgba($error-value-color, 0.5);
background: rgba($error-value-color, 0.1);
border: 1px solid color.change($error-value-color, $alpha: 0.5);
background: color.change($error-value-color, $alpha: 0.1);
color: $error-value-color;
}
@ -965,7 +966,7 @@ code {
background: $simple-background-color;
padding: 4px;
margin: 0 10px 20px 0;
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
display: inline-block;
svg {
@ -988,10 +989,10 @@ code {
.simple_form {
.warning {
box-sizing: border-box;
background: rgba($error-value-color, 0.5);
background: color.change($error-value-color, $alpha: 0.5);
color: $primary-text-color;
text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);
text-shadow: 1px 1px 0 color.change($base-shadow-color, $alpha: 0.3);
box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.4);
border-radius: 4px;
padding: 10px;
margin-bottom: 15px;
@ -1350,7 +1351,7 @@ code {
width: 100%;
height: 100%;
position: absolute;
background: rgba($error-value-color, 0.25);
background: color.change($error-value-color, $alpha: 0.25);
z-index: 2;
border-radius: 8px;
}

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *;
@use 'functions' as *;
@ -206,7 +207,7 @@
&:active,
&:focus {
background-color: rgba($dark-text-color, 0.1);
background-color: color.change($dark-text-color, $alpha: 0.1);
}
}
@ -225,7 +226,7 @@
background: rgba(darken($ui-primary-color, 14%), 0.7);
&.leading {
background: rgba($ui-highlight-color, 0.5);
background: color.change($ui-highlight-color, $alpha: 0.5);
}
}
}

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *;
@use 'functions' as *;
@ -16,7 +17,7 @@
padding: 15px;
text-decoration: none;
color: inherit;
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
}
& > a {

View File

@ -1,9 +1,13 @@
import { Map as ImmutableMap } from 'immutable';
import type { ApiRelationshipJSON } from '@/mastodon/api_types/relationships';
import type { ApiStatusJSON } from '@/mastodon/api_types/statuses';
import type {
CustomEmojiData,
UnicodeEmojiData,
} from '@/mastodon/features/emoji/types';
import { createAccountFromServerJSON } from '@/mastodon/models/account';
import type { Status } from '@/mastodon/models/status';
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
type FactoryOptions<T> = {
@ -51,6 +55,36 @@ export const accountFactoryState = (
options: FactoryOptions<ApiAccountJSON> = {},
) => createAccountFromServerJSON(accountFactory(options));
export const statusFactory: FactoryFunction<ApiStatusJSON> = ({
id,
...data
} = {}) => ({
id: id ?? '1',
created_at: '2023-01-01T00:00:00.000Z',
sensitive: false,
visibility: 'public',
language: 'en',
uri: 'https://example.com/status/1',
url: 'https://example.com/status/1',
replies_count: 0,
reblogs_count: 0,
favorites_count: 0,
account: accountFactory(),
media_attachments: [],
mentions: [],
tags: [],
emojis: [],
content: '<p>This is a test status.</p>',
...data,
});
export const statusFactoryState = (
options: FactoryOptions<ApiStatusJSON> = {},
) =>
ImmutableMap<string, unknown>(
statusFactory(options) as unknown as Record<string, unknown>,
) as unknown as Status;
export const relationshipsFactory: FactoryFunction<ApiRelationshipJSON> = ({
id,
...data

View File

@ -412,7 +412,7 @@ class User < ApplicationRecord
def set_approved
self.approved = begin
if sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval?
if requires_approval?
false
else
open_registrations? || valid_invitation? || external?
@ -426,7 +426,11 @@ class User < ApplicationRecord
def grant_approval_on_confirmation?
# Re-check approval on confirmation if the server has switched to open registrations
open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval?
open_registrations? && !requires_approval?
end
def requires_approval?
sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval?
end
def wrap_email_confirmation

View File

@ -12,7 +12,7 @@ class InitialStateSerializer < ActiveModel::Serializer
has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
has_one :role, serializer: REST::RoleSerializer
def meta # rubocop:disable Metrics/AbcSize
def meta
store = default_meta_store
if object.current_account

View File

@ -6,4 +6,5 @@ class REST::ShallowStatusSerializer < REST::StatusSerializer
# It looks like redefining one `has_one` requires redefining all inherited ones
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
has_one :quote_approval, if: -> { Mastodon::Feature.outgoing_quotes_enabled? }
end

View File

@ -29,6 +29,8 @@ class REST::StatusSerializer < ActiveModel::Serializer
has_many :tags
has_many :emojis, serializer: REST::CustomEmojiSerializer
# Due to a ActiveModel::Serializer quirk, if you change any of the following, have a look at
# updating `app/serializers/rest/shallow_status_serializer.rb` as well
has_one :quote, key: :quote, serializer: REST::QuoteSerializer
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer

View File

@ -21,8 +21,9 @@ class Scheduler::SelfDestructScheduler
def sidekiq_overwhelmed?
redis_mem_info = Sidekiq.default_configuration.redis_info
maxmemory = [redis_mem_info['maxmemory'].to_f, redis_mem_info['total_system_memory'].to_f].filter(&:positive?).min
Sidekiq::Stats.new.enqueued > MAX_ENQUEUED || redis_mem_info['used_memory'].to_f > redis_mem_info['total_system_memory'].to_f * MAX_REDIS_MEM_USAGE
Sidekiq::Stats.new.enqueued > MAX_ENQUEUED || redis_mem_info['used_memory'].to_f > maxmemory * MAX_REDIS_MEM_USAGE
end
def delete_accounts!

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
# Disable httplog in production unless log_level is `debug`
if !Rails.env.production? || Rails.configuration.log_level == :debug
# Disable in production unless log level is `debug`
if Rails.env.local? || Rails.logger.debug?
require 'httplog'
HttpLog.configure do |config|

View File

@ -49,6 +49,10 @@ ia:
attributes:
reblog:
taken: del message jam existe
terms_of_service:
attributes:
effective_date:
too_soon: es troppo tosto, debe esser plus tarde que %{date}
user:
attributes:
date_of_birth:

View File

@ -190,6 +190,7 @@ bg:
create_relay: Създаване на пренасочване
create_unavailable_domain: Създаване на недостъпен домейн
create_user_role: Създаване на роля
create_username_block: Създаване на правило за потебителско име
demote_user: Понижаване на потребител
destroy_announcement: Изтриване на оповестяване
destroy_canonical_email_block: Изтриване на блокиране за е-поща
@ -202,6 +203,7 @@ bg:
destroy_status: Изтриване на публикация
destroy_unavailable_domain: Изтриване на недостъпен домейн
destroy_user_role: Унищожаване на роля
destroy_username_block: Изтриване на правило за потебителско име
disable_2fa_user: Изкл. на 2факт.удостов.
disable_custom_emoji: Деактивиране на персонализирано емоджи
disable_sign_in_token_auth_user: Изключване на удостоверяването с код по имейл за потребител
@ -234,6 +236,7 @@ bg:
update_report: Обновяване на доклада
update_status: Обновяване на публикация
update_user_role: Обновяване на ролята
update_username_block: Обновяване на правило за потеб. име
actions:
approve_appeal_html: "%{name} одобри обжалването на решение за модериране от %{target}"
approve_user_html: "%{name} одобри регистрирането от %{target}"
@ -251,6 +254,7 @@ bg:
create_ip_block_html: "%{name} създаде правило за IP %{target}"
create_unavailable_domain_html: "%{name} спря доставянето до домейн %{target}"
create_user_role_html: "%{name} създаде роля %{target}"
create_username_block_html: "%{name} добави правило за потребителско име, съдържащо %{target}"
demote_user_html: "%{name} понижи потребителя %{target}"
destroy_announcement_html: "%{name} изтри оповестяване %{target}"
destroy_canonical_email_block_html: "%{name} отблокира имейла с хеш %{target}"
@ -263,6 +267,7 @@ bg:
destroy_status_html: "%{name} премахна публикация от %{target}"
destroy_unavailable_domain_html: "%{name} възобнови доставката до домейн %{target}"
destroy_user_role_html: "%{name} изтри роля %{target}"
destroy_username_block_html: "%{name} премахна правило за потребителско име, съдържащо %{target}"
disable_2fa_user_html: "%{name} изключи двуфакторното изискване за потребител %{target}"
disable_custom_emoji_html: "%{name} изключи емоджито %{target}"
disable_sign_in_token_auth_user_html: "%{name} изключва удостоверението с код по е-поща за %{target}"
@ -295,6 +300,7 @@ bg:
update_report_html: "%{name} осъвремени доклад %{target}"
update_status_html: "%{name} обнови публикация от %{target}"
update_user_role_html: "%{name} промени ролята %{target}"
update_username_block_html: "%{name} обнови правило за потребителско име, съдържащо %{target}"
deleted_account: изтрит акаунт
empty: Няма намерени дневници.
filter_by_action: Филтриране по действие
@ -791,12 +797,16 @@ bg:
title: Сървърни правила
translation: Превод
translations: Преводи
translations_explanation: Може по избор да добавите преводи за правилата. Стандартната стойност ще се показва, ако няма налична преведена версия. Винаги се уверявайте, че всеки предоставен превод е синхронизиран със стандартната стойност.
settings:
about:
manage_rules: Управление на правилата на сървъра
preamble: Предложете задълбочена информация за това как вашият сървър се управлява, модерира и финансира.
rules_hint: Съществува специална част за правилата, които се очаква вашите потребители да спазват.
title: Относно
allow_referrer_origin:
desc: Когато потребителите ви щракнат върху връзки към външни сайтове, то браузърите им може да изпращат адреса на сървъра ви в Mastodon както референтът. Изключете това, ако то неповторимо би установило самоличността на потребителя ви, например ако това е личен сървър в Mastodon.
title: Позволяване на външни сайтове да виждат сървъра ви в Mastodon като източник на трафик
appearance:
preamble: Настройване на мрежовия интерфейс на Mastodon.
title: Външен вид
@ -1067,6 +1077,23 @@ bg:
other: Използвано от %{count} души през последната седмица
title: Препоръки и насоки на развитие
trending: Изгряващи
username_blocks:
add_new: Добавяне на ново
block_registrations: Блокиране на регистрациите
comparison:
contains: Съдържа
contains_html: Съдържа %{string}
created_msg: Успешно създадено правило за потребителско име
delete: Изтриване
edit:
title: Промяна на правило за потреб. име
new:
create: Създаване на правило
title: Създаване на ново правило за потреб. име
no_username_block_selected: Няма променени правила за потребителско име, тъй като нищо не бе избрано
not_permitted: Няма позволение
title: Правила за потребителско име
updated_msg: Успешно обновено правило за потребителско име
warning_presets:
add_new: Добавяне на ново
delete: Изтриване
@ -1331,6 +1358,10 @@ bg:
basic_information: Основна информация
hint_html: "<strong>Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви.</strong> Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила."
other: Друго
emoji_styles:
auto: Автоматично
native: Естествено системно
twemoji: Twemoji
errors:
'400': Подадохте невалидна или деформирана заявка.
'403': Нямате позволение да разгледате тази страница.
@ -1640,6 +1671,10 @@ bg:
title: Ново споменаване
poll:
subject: Анкетата от %{name} приключи
quote:
body: 'Ваша публикация беше цитирана от %{name}:'
subject: "%{name} цитира ваша публикация"
title: Нов цитат
reblog:
body: 'Ваша публикация беше раздута от %{name}:'
subject: "%{name} разду ваша публикация"
@ -1850,6 +1885,7 @@ bg:
edited_at_html: Редактирано на %{date}
errors:
in_reply_not_found: Изглежда, че публикацията, на която се опитвате да отговорите, не съществува.
quoted_status_not_found: Публикацията, която се опитвате да цитирате, не съществува.
over_character_limit: прехвърлен лимит от %{max} символа
pin_errors:
direct: Публикациите, които са видими само за потребители споменати в тях, не могат да бъдат закачани
@ -1857,6 +1893,8 @@ bg:
ownership: Публикация на някого другиго не може да бъде закачена
reblog: Раздуване не може да бъде закачано
quote_policies:
followers: Само последователите ви
nobody: Никого
public: Всеки
title: "%{name}: „%{quote}“"
visibilities:

View File

@ -1713,7 +1713,7 @@ ca:
too_few_options: ha de tenir més d'una opció
too_many_options: no pot contenir més de %{max} opcions
preferences:
other: Altre
other: Altres
posting_defaults: Valors per defecte de publicació
public_timelines: Línies de temps públiques
privacy:

View File

@ -202,6 +202,7 @@ cy:
create_relay: Creu Cyfnewidiad
create_unavailable_domain: Creu Parth Ddim ar Gael
create_user_role: Creu Rôl
create_username_block: Creu Rheol Enw Defnyddiwr
demote_user: Diraddio Defnyddiwr
destroy_announcement: Dileu Cyhoeddiad
destroy_canonical_email_block: Dileu Rhwystr E-bost
@ -215,6 +216,7 @@ cy:
destroy_status: Dileu Postiad
destroy_unavailable_domain: Dileu Parth Ddim ar Gael
destroy_user_role: Dileu Rôl
destroy_username_block: Dileu Rheol Enw Defnyddiwr
disable_2fa_user: Diffodd 2FA
disable_custom_emoji: Analluogi Emoji Addasedig
disable_relay: Analluogi Cyfnewidiad
@ -249,6 +251,7 @@ cy:
update_report: Diweddaru Adroddiad
update_status: Diweddaru Postiad
update_user_role: Diweddaru Rôl
update_username_block: Diweddaru Rheol Enw Defnyddiwr
actions:
approve_appeal_html: Mae %{name} wedi cymeradwyo penderfyniad cymedroli gan %{target}
approve_user_html: Mae %{name} wedi cymeradwyo cofrestru gan %{target}
@ -267,6 +270,7 @@ cy:
create_relay_html: Creodd %{name} gyfnewidiad %{target}
create_unavailable_domain_html: Mae %{name} wedi stopio danfon i barth %{target}
create_user_role_html: Mae %{name} wedi creu rôl %{target}
create_username_block_html: Mae %{name} wedi ychwanegu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
demote_user_html: Mae %{name} wedi israddio defnyddiwr %{target}
destroy_announcement_html: Mae %{name} wedi dileu cyhoeddiad %{target}
destroy_canonical_email_block_html: Mae %{name} wedi dad-rwystro parth e-bost %{target}
@ -280,6 +284,7 @@ cy:
destroy_status_html: Mae %{name} wedi tynnu postiad gan %{target}
destroy_unavailable_domain_html: Mae %{name} wedi ailddechrau anfon i barth %{target}
destroy_user_role_html: Mae %{name} wedi dileu rôl %{target}
destroy_username_block_html: Mae %{name} wedi dileu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
disable_2fa_user_html: Mae %{name} wedi analluogi gofyniad dau ffactor ar gyfer defnyddiwr %{target}
disable_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target}
disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target}
@ -314,6 +319,7 @@ cy:
update_report_html: Mae %{name} wedi diweddaru adroddiad %{target}
update_status_html: Mae %{name} wedi diweddaru postiad gan %{target}
update_user_role_html: Mae %{name} wedi newid rôl %{target}
update_username_block_html: Mae %{name} wedi diweddaru rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
deleted_account: cyfrif wedi'i ddileu
empty: Dim logiau ar gael.
filter_by_action: Hidlo yn ôl gweithred
@ -1157,6 +1163,25 @@ cy:
zero: Wedi'i ddefnyddio gan %{count} o bobl dros yr wythnos ddiwethaf
title: Argymhellion a Threndiau
trending: Trendio
username_blocks:
add_new: Ychwanegu newydd
block_registrations: Rhwystro cofrestriadau
comparison:
contains: Yn cynnwys
equals: Yn hafal i
contains_html: Yn cynnwys %{string}
created_msg: Rheol enw defnyddiwr wedi'i chreu'n llwyddiannus
delete: Dileu
edit:
title: Golygu rheol enw defnyddiwr
matches_exactly_html: Yn hafal i %{string}
new:
create: Creu rheol
title: Creu rheol enw defnyddiwr newydd
no_username_block_selected: Heb newid unrhyw reolau enw defnyddiwr gan nad oes un ohonyn nhw wedi'u dewis
not_permitted: Dim caniatâd
title: Rheolau enw defnyddiwr
updated_msg: Rheol enw defnyddiwr wedi'i diweddaru'n llwyddiannus
warning_presets:
add_new: Ychwanegu newydd
delete: Dileu
@ -1817,6 +1842,10 @@ cy:
title: Crywbylliad newydd
poll:
subject: Mae arolwg gan %{name} wedi dod i ben
quote:
body: 'Mae %{name} wedi dyfynnu eich postiad :'
subject: Mae %{name} wedi dyfynnu eich postiad
title: Dyfyniad newydd
reblog:
body: 'Cafodd eich postiad ei hybu gan %{name}:'
subject: Rhoddodd %{name} hwb i'ch postiad
@ -1901,7 +1930,7 @@ cy:
last_active: Yn weithgar ddiwethaf
most_recent: Y diweddaraf
moved: Wedi symud
mutual: Cydfudd
mutual: Yn Gyffredin
primary: Cynradd
relationship: Perthynas
remove_selected_domains: Tynnu'r holl ddilynwyr o'r parthau a ddewiswyd
@ -2051,6 +2080,8 @@ cy:
ownership: Nid oes modd pinio postiad rhywun arall
reblog: Nid oes modd pinio hwb
quote_policies:
followers: Dim ond eich dilynwyr
nobody: Neb
public: Pawb
title: '%{name}: "%{quote}"'
visibilities:

View File

@ -58,7 +58,7 @@ be:
subtitle: Для вашага ўліковага запісу была ўключаная двухфактарная аўтэнтыфікацыя.
title: двухэтапнае спраўджанне уключана
two_factor_recovery_codes_changed:
explanation: Папярэднія коды аднаўлення былі ануляваны і былі створаныя новыя.
explanation: Папярэднія коды аднаўлення былі ануляваны і створаны новыя.
subject: 'Mastodon: створаныя новыя коды аднаўлення'
subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх былі створаныя новыя.
title: 2FA коды аднаўлення былі зменены

View File

@ -72,7 +72,7 @@ fa:
revoke: آیا مطمئن هستید؟
index:
authorized_at: تایید شده در %{date}
description_html: اینها نرم‌افزار هایی هستند که می‌توانند به حساب کاربری شما با استفاده از رابط نرم‌افزاری دسترسی پیدا کنند. اگر نرم‌افزار های در اینجا هستند که نمی‌شناسید، یا نرم‌افزاری که رفتار مشکوک دارد، می‌توانید دسترسی اش را باطل کنید.
description_html: اینها برنامه‌هاییند که می‌توانند با استفاده از میانای برنامه‌نویسی به حسابتان دسترسی پیدا کنند. اگر برنامه‌ای هست که نمی‌شناسیدش یا رفتار بدی دارد می‌توانید دسترسیش را باطل کنید.
last_used_at: آخرین استفاده در %{date}
never_used: هرگز استفاده نشده
scopes: اجازه‌ها

View File

@ -2090,4 +2090,4 @@ eo:
not_enabled: Vi ankoraŭ ne ŝaltis WebAuth
not_supported: Ĉi tiu legilo ne povas uzi sekurecŝlosilojn
otp_required: Por uzi sekurecŝlosilojn, ebligu 2-faktoran autentigon unue.
registered_on: Registrigita je %{date}
registered_on: Registrita je %{date}

View File

@ -258,6 +258,7 @@ fa:
create_relay_html: "%{name} یک رله %{target} ایجاد کرد"
create_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را متوقف کرد"
create_user_role_html: "%{name} نقش %{target} را ایجاد کرد"
create_username_block_html: "%{name} قانونی برای نام‌های کاربری دارای %{target} افزود"
demote_user_html: "%{name} کاربر %{target} را تنزل داد"
destroy_announcement_html: "%{name} اعلامیهٔ %{target} را حذف کرد"
destroy_canonical_email_block_html: "%{name} رایانامه با درهم‌ریزی %{target} را نامسدود کرد"
@ -271,6 +272,7 @@ fa:
destroy_status_html: "%{name} وضعیت %{target} را برداشت"
destroy_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را از سر گرفت"
destroy_user_role_html: "%{name} نقش %{target} را حذف کرد"
destroy_username_block_html: "%{name} قانون نام‌های کاربری دارای %{target} را برداشت"
disable_2fa_user_html: "%{name} ضرورت ورود دو مرحله‌ای را برای کاربر %{target} غیر فعال کرد"
disable_custom_emoji_html: "%{name} شکلک %{target} را غیرفعال کرد"
disable_relay_html: "%{name} رله %{target} را غیرفعال کرد"
@ -305,6 +307,7 @@ fa:
update_report_html: "%{name} گزارش %{target} را به‌روز کرد"
update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد"
update_user_role_html: "%{name} نقش %{target} را تغییر داد"
update_username_block_html: "%{name} قانونی برای نام‌های کاربری دارای %{target} را به‌روز کرد"
deleted_account: حساب حذف شد
empty: هیچ گزارشی پیدا نشد.
filter_by_action: پالایش بر اساس کنش
@ -1089,7 +1092,24 @@ fa:
title: توصیه ها و روندها
trending: پرطرفدار
username_blocks:
add_new: افزودن جدید
block_registrations: انسداد ثبت‌نام‌ها
comparison:
contains: دارای
equals: برابر
contains_html: دارای %{string}
created_msg: قانون نام کاربری با موفّقیت ایجاد شد
delete: حذف
edit:
title: ویرایش قانون نام‌کاربری
matches_exactly_html: برابر %{string}
new:
create: ایجاد قانون
title: ایجاد قانون نام‌کاربری جدید
no_username_block_selected: هیچ قاعدهٔ نام کاربری‌ای تغییری نکرد زیرا هیچ‌کدام گزیده نشده بودند
not_permitted: مجاز نیست
title: قانون نام کاربری
updated_msg: قانون نام کاربری با موفّقیت به‌روز شد
warning_presets:
add_new: افزودن تازه
delete: زدودن

View File

@ -18,8 +18,8 @@ fi:
pin_errors:
following: Sinun täytyy seurata käyttäjää, jota haluat tukea
posts:
one: Julkaisu
other: Julkaisua
one: julkaisu
other: julkaisua
posts_tab_heading: Julkaisut
self_follow_error: Oman tilisi seuraaminen ei ole sallittua
admin:
@ -507,14 +507,14 @@ fi:
registration_requested: Rekisteröintiä pyydetty
registrations:
confirm: Vahvista
description: Sait rekisteröinnin FASP:lta. Hylkää se, jos et aloittanut sitä. Jos aloitat tämän, vertaile huolellisesti nimeä ja sormenjälkeä ennen rekisteröinnin vahvistamista.
description: Vastaanotit rekisteröintymisen FASP-palvelusta. Hylkää rekisteröintyminen, jos et aloittanut sitä. Jos aloitit sen, vertaile huolellisesti nimeä ja avaimen sormenjälkeä ennen kuin hyväksyt rekisteröintymisen.
reject: Hylkää
title: Vahvista FASP-rekisteröinti
save: Tallenna
select_capabilities: Valitse kyvykkyydet
sign_in: Kirjaudu sisään
status: Tila
title: Fediversumin Tukitoimintojen Tarjoajat
title: Fediversumin tukitoimintojen tarjoajat
title: FASP
follow_recommendations:
description_html: "<strong>Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä</strong>. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä."

View File

@ -190,6 +190,7 @@ ia:
create_relay: Crear repetitor
create_unavailable_domain: Crear dominio indisponibile
create_user_role: Crear un rolo
create_username_block: Crear regula de nomine de usator
demote_user: Degradar usator
destroy_announcement: Deler annuncio
destroy_canonical_email_block: Deler blocada de e-mail
@ -203,6 +204,7 @@ ia:
destroy_status: Deler message
destroy_unavailable_domain: Deler dominio indisponibile
destroy_user_role: Destruer rolo
destroy_username_block: Deler regula de nomine de usator
disable_2fa_user: Disactivar A2F
disable_custom_emoji: Disactivar emoji personalisate
disable_relay: Disactivar repetitor
@ -237,6 +239,7 @@ ia:
update_report: Actualisar le reporto
update_status: Actualisar le message
update_user_role: Actualisar rolo
update_username_block: Actualisar regula de nomine de usator
actions:
approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}"
approve_user_html: "%{name} approbava inscription de %{target}"
@ -255,6 +258,7 @@ ia:
create_relay_html: "%{name} ha create un repetitor %{target}"
create_unavailable_domain_html: "%{name} stoppava livration al dominio %{target}"
create_user_role_html: "%{name} creava rolo de %{target}"
create_username_block_html: "%{name} ha addite un regula pro nomines de usator que contine %{target}"
demote_user_html: "%{name} degradava usator %{target}"
destroy_announcement_html: "%{name} deleva annuncio %{target}"
destroy_canonical_email_block_html: "%{name} disblocava le e-mail con le hash %{target}"
@ -268,6 +272,7 @@ ia:
destroy_status_html: "%{name} removeva un message de %{target}"
destroy_unavailable_domain_html: "%{name} reprendeva le livration al dominio %{target}"
destroy_user_role_html: "%{name} deleva le rolo %{target}"
destroy_username_block_html: "%{name} ha removite un regula pro nomines de usator que contine %{target}"
disable_2fa_user_html: "%{name} disactivava le authentication a duo factores pro le usator %{target}"
disable_custom_emoji_html: "%{name} disactivava le emoji %{target}"
disable_relay_html: "%{name} ha disactivate le repetitor %{target}"
@ -302,6 +307,7 @@ ia:
update_report_html: "%{name} actualisava reporto %{target}"
update_status_html: "%{name} actualisava message de %{target}"
update_user_role_html: "%{name} cambiava rolo de %{target}"
update_username_block_html: "%{name} ha actualisate un regula pro nomines de usator que contine %{target}"
deleted_account: conto delite
empty: Nulle registros trovate.
filter_by_action: Filtrar per action
@ -321,7 +327,7 @@ ia:
preview:
disclaimer: Proque le usatores non pote optar pro non reciper los, le notificationes per e-mail debe limitar se a annuncios importante tal como le notificationes de violation de datos personal o de clausura de servitores.
explanation_html: 'Le e-mail essera inviate a <strong>%{display_count} usatores</strong>. Le sequente texto essera includite in le e-mail:'
title: Previder le notification de annuncio
title: Previsualisar le notification de annuncio
publish: Publicar
published_msg: Annuncio publicate con successo!
scheduled_for: Programmate pro %{time}
@ -480,6 +486,36 @@ ia:
new:
title: Importar blocadas de dominio
no_file: Necun file seligite
fasp:
debug:
callbacks:
created_at: Data de creation
delete: Deler
ip: Adresse IP
request_body: Corpore del requesta
title: Depurar le appellos de retorno
providers:
active: Active
base_url: URL de base
callback: Appello de retorno
delete: Deler
edit: Modificar fornitor
finish_registration: Terminar registration
name: Nomine
providers: Fornitores
public_key_fingerprint: Dactylogramma del clave public
registration_requested: Registration requestate
registrations:
confirm: Confirmar
description: Tu ha recipite un registration de un FSAF. Rejecta lo si tu non lo ha initiate. Si tu lo ha initiate, compara attentemente le nomine e le dactylogramma del clave ante de confirmar le registration.
reject: Rejectar
title: Confirmar registration FSAF
save: Salvar
select_capabilities: Selige capacitates
sign_in: Aperir session
status: Stato
title: Fornitores de Servicios Auxiliar del Fediverso
title: FSAF
follow_recommendations:
description_html: "<strong>Le recommendationes de sequimento adjuta le nove usatores a trovar rapidemente contento interessante.</strong> Quando un usator non ha un historia sufficiente de interactiones con alteres pro formar recommendationes personalisate de sequimento, iste contos es recommendate. Illos se recalcula cata die a partir de un mixtura de contos con le plus grande numero de ingagiamentos recente e le numero de sequitores local le plus alte pro un lingua date."
language: Pro le lingua
@ -548,6 +584,13 @@ ia:
all: Toto
limited: Limitate
title: Moderation
moderation_notes:
create: Adder nota de moderation
created_msg: Le nota de moderation del servitor ha essite create.
description_html: Vider e lassar notas pro altere moderatores e pro referentia futur
destroyed_msg: Le nota de moderation del servitor ha essite delite.
placeholder: Informationes sur iste servitor, actiones prendite o altere cosas que pote adjutar te a moderar iste servitor in le futuro.
title: Notas de moderation
private_comment: Commento private
public_comment: Commento public
purge: Purgar
@ -756,11 +799,17 @@ ia:
title: Rolos
rules:
add_new: Adder regula
add_translation: Adder traduction
delete: Deler
description_html: Ben que multes affirma de haber legite e acceptate le conditiones de servicio, generalmente le gente non los lege completemente usque un problema surge. <strong>Facilita le visibilitate del regulas de tu servitor in un colpo de oculo forniente los in un lista a punctos.</strong> Tenta mantener le regulas individual curte e simple, ma sin divider los in multe punctos separate.
edit: Modificar regula
empty: Necun regula del servitor ha essite definite ancora.
move_down: Displaciar a basso
move_up: Displaciar in alto
title: Regulas del servitor
translation: Traduction
translations: Traductiones
translations_explanation: Tu ha le option de adder traductiones al regulas. Le valor predefinite apparera si necun version traducite es disponibile. Per favor sempre assecura te que omne traduction fornite es ben synchronisate con le valor predefinite.
settings:
about:
manage_rules: Gerer le regulas del servitor
@ -877,7 +926,7 @@ ia:
database_schema_check:
message_html: Il ha migrationes de base de datos pendente. Per favor exeque los pro assecurar que le application se comporta como expectate
elasticsearch_analysis_index_mismatch:
message_html: Le parametros del analisator del indice de Elasticsearch es obsolete. Executa <code>tootctl search deploy --only-mapping --only=%{value}</code>
message_html: Le parametros del analysator del indice de Elasticsearch es obsolete. Executa <code>tootctl search deploy --only-mapping --only=%{value}</code>
elasticsearch_health_red:
message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile
elasticsearch_health_yellow:
@ -942,7 +991,7 @@ ia:
changelog: Lo que ha cambiate
create: Usar tu proprie
current: Actual
draft: Provisori
draft: Esbosso
generate: Usar modello
generates:
action: Generar
@ -965,7 +1014,7 @@ ia:
title: Previsualisar le notification sur le conditiones de servicio
publish: Publicar
published_on_html: Publicate le %{date}
save_draft: Salvar version provisori
save_draft: Salvar esbosso
title: Conditiones de servicio
title: Administration
trends:
@ -1043,8 +1092,17 @@ ia:
title: Recommendationes e tendentias
trending: In tendentia
username_blocks:
add_new: Adder nove
block_registrations: Blocar registrationes
comparison:
contains: Contine
equals: Es equal a
contains_html: Contine %{string}
created_msg: Regula de nomine de usator create con successo
delete: Deler
edit:
title: Modificar regula de nomine de usator
matches_exactly_html: Es equal a %{string}
new:
create: Crear regula
title: Crear nove regula de nomine de usator
@ -1316,6 +1374,10 @@ ia:
basic_information: Information basic
hint_html: "<strong>Personalisa lo que le personas vide sur tu profilo public e presso tu messages.</strong> Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo complete e un photo."
other: Alteres
emoji_styles:
auto: Automatic
native: Native
twemoji: Twemoji
errors:
'400': Le requesta que tu ha inviate non es valide o es mal formate.
'403': Tu non ha le permission de acceder a iste pagina.
@ -1625,6 +1687,10 @@ ia:
title: Nove mention
poll:
subject: Un sondage de %{name} ha finite
quote:
body: 'Tu message ha essite citate per %{name}:'
subject: "%{name} ha citate tu message"
title: Nove citation
reblog:
body: "%{name} ha impulsate tu message:"
subject: "%{name} ha impulsate tu message"
@ -1835,6 +1901,7 @@ ia:
edited_at_html: Modificate le %{date}
errors:
in_reply_not_found: Le message a que tu tenta responder non pare exister.
quoted_status_not_found: Le message que tu tenta citar non pare exister.
over_character_limit: limite de characteres de %{max} excedite
pin_errors:
direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate
@ -1842,6 +1909,8 @@ ia:
ownership: Le message de alcuno altere non pote esser appunctate
reblog: Un impulso non pote esser affixate
quote_policies:
followers: Solmente tu sequitores
nobody: Necuno
public: Omnes
title: "%{name}: “%{quote}”"
visibilities:
@ -1897,7 +1966,7 @@ ia:
terms_of_service:
title: Conditiones de servicio
terms_of_service_interstitial:
future_preamble_html: Nos face alcun cambios a nostre conditiones de servicio, que entrara in vigor in <strong>%{date}</strong>. Nos te invita a revider le conditiones actualisate.
future_preamble_html: Nos apporta alcun modificationes a nostre conditiones de servicio, le quales entrara in vigor le <strong>%{date}</strong>. Nos te invita a revider le conditiones actualisate.
past_preamble_html: Nos ha cambiate nostre conditiones de servicio desde tu ultime visita. Nos te invita a revider le conditiones actualisate.
review_link: Revider le conditiones de servicio
title: Le conditiones de servicio de %{domain} cambia
@ -1969,7 +2038,7 @@ ia:
agreement: Si tu continua a usar %{domain}, tu accepta iste conditiones. Si tu non es de accordo con le conditiones actualisate, tu pote sempre eliminar tu conto pro terminar tu accordo con %{domain}.
changelog: 'In summario, ecce lo que iste actualisation significa pro te:'
description: 'Tu recipe iste e-mail proque nos face alcun cambios al nostre conditiones de servicio a %{domain}. Iste actualisationes entrara in vigor in %{date}. Nos te invita a revider integralmente le conditiones actualisate hic:'
description_html: Tu recipe iste e-mail proque nos face alcun cambios al nostre conditiones de servicio a %{domain}. Iste actualisationes entrara in vigor in <strong>%{date}</strong>. Nos te invita a revider <a href="%{path}" target="_blank">integralmente le conditiones actualisate hic</a>.
description_html: Tu recipe iste message perque nos apporta alcun modificationes a nostre conditiones de servicio sur %{domain}. Iste actualisationes entrara in vigor le <strong>%{date}</strong>. Nos te invita a <a href="%{path}" target="_blank">leger integralmente le conditiones actualisate</a>.
sign_off: Le equipa de %{domain}
subject: Actualisationes de nostre conditiones de servicio
subtitle: Le conditiones de servicio de %{domain} ha cambiate

View File

@ -25,7 +25,7 @@ nan:
action: 執行動作
already_silenced: Tsit ê口座有受著限制。
already_suspended: Tsit ê口座ê權限已經hōo lâng停止。
title: Kā %{acct} 做審核ê動作
title: Kā %{acct} 做管理ê動作
account_moderation_notes:
create: 留記錄
created_msg: 管理記錄成功建立!
@ -238,7 +238,7 @@ nan:
update_user_role: 更新角色
update_username_block: 更新使用者號名規則
actions:
approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì審核決定ê投訴"
approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì管理決定ê投訴"
approve_user_html: "%{name} 允准 %{target} ê 註冊"
assigned_to_self_report_html: "%{name} kā報告 %{target} 分配hōo家tī"
change_email_user_html: "%{name} 改變 %{target} ê電子phue地址"
@ -282,7 +282,7 @@ nan:
memorialize_account_html: "%{name} kā %{target} 設做故人口座"
promote_user_html: "%{name} kā 用者 %{target} 升級"
publish_terms_of_service_html: "%{name} 公佈服務規則ê更新"
reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì審核決定ê投訴"
reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì管理決定ê投訴"
reject_user_html: "%{name} 拒絕 %{target} ê 註冊"
remove_avatar_user_html: "%{name} thâi掉 %{target} ê標頭"
reopen_report_html: "%{name} 重開 %{target} ê檢舉"
@ -667,7 +667,7 @@ nan:
none:
comment_description_html: 為著提供其他資訊,%{name} 寫:
confirm: 確認
confirm_action: 確認kā %{acct} 審核ê動作
confirm_action: 確認kā %{acct} 管理ê動作
created_at: 檢舉tī
delete_and_resolve: Thâi掉PO文
forwarded: 轉送ah
@ -720,9 +720,48 @@ nan:
target_origin: 受檢舉ê口座ê來源
title: 檢舉
unassign: 取消分配
unknown_action_msg: M̄知影ê動作%{action}
unresolved: 無解決
updated_at: 更新
view_profile: 看個人資料
roles:
add_new: 加添角色
assigned_users:
other: "%{count} ê用者"
categories:
administration: 管理員
devops: DevOps
invites: 邀請
moderation: 管理
special: 特別
delete: Thâi掉
description_html: 用<strong>用者角色</strong>lí通自訂lí ê用者ē當接近使用Mastodon ê siánn物功能kap區域。
edit: 編「%{name}」ê角色
everyone: 預設ê權限
everyone_full_description_html: Tse是ē影響<strong>所有用者</strong>ê<strong>基本角色</strong>就算是無分配tio̍h角色ê mā kâng款。所有其他ê角色繼承伊ê權限。
permissions_count:
other: "%{count} ê權限"
privileges:
administrator: 管理員
administrator_description: 有tsit ê權限ê用者ē忽略所有ê權限。
delete_user_data: Thâi掉用者ê資料
delete_user_data_description: 允准用者liâm-mi thâi掉其他用者ê資料
invite_users: 邀請用者
invite_users_description: 允准用者邀請新lâng來tsit ê服侍器
manage_announcements: 管理公告
manage_announcements_description: 允准用者管理佇tsit ê服侍器ê公告
manage_appeals: 管理投訴
manage_appeals_description: 允准用者審查tuì管理動作ê投訴
manage_blocks: 管理封鎖
manage_blocks_description: 允准用者封鎖電子phue ê 提供者kap IP地址
manage_custom_emojis: 管理自訂ê Emoji
manage_custom_emojis_description: 允准用者管理佇tsit ê服侍器ê自訂Emoji
manage_federation: 管理聯邦
manage_federation_description: 允准用者封鎖á是允准kap其他域名相連mā控制寄送ê能力
manage_invites: 管理邀請
manage_invites_description: 允准用者瀏覽kap停止使用邀請連結
manage_reports: 管理檢舉
manage_reports_description: 允准用者審查檢舉kap執行對in ê管理ê動作。
statuses:
language: 語言
trends:

View File

@ -1996,7 +1996,7 @@ ru:
ignore_favs: Не учитывать добавление в избранное
ignore_reblogs: Не учитывать продвижения
interaction_exceptions: Исключения на основе взаимодействий
interaction_exceptions_explanation: 'Обратите внимание: нет никаких гарантий, что посты будут удалены, после того, как они единожды перешли порог по отметкам «избранного» или продвижений.'
interaction_exceptions_explanation: 'Обратите внимание: даже если количество взаимодействий опустится ниже установленного значения после того, как оно однажды превысило его, то всё равно может случиться так, что пост не будет удалён.'
keep_direct: Не удалять личные сообщения
keep_direct_hint: Те ваши посты, которые видны только упомянутым в них людям, не будут удалены
keep_media: Не удалять посты с вложениями
@ -2040,31 +2040,31 @@ ru:
contrast: Mastodon (высококонтрастная)
default: Mastodon (тёмная)
mastodon-light: Mastodon (светлая)
system: Автоматически (используйте системную тему)
system: Автоматически (как в системе)
time:
formats:
default: "%d %b %Y, %H:%M"
month: "%m.%Y"
time: "%H:%M"
with_time_zone: "%b %d, %Y, %H:%M %Z"
with_time_zone: "%d %b %Y, %H:%M %Z"
translation:
errors:
quota_exceeded: Превышена квота использования службы перевода в масштабах всего сервера.
too_many_requests: В последнее время в службу переводов поступает слишком много запросов.
two_factor_authentication:
add: Добавить
disable: Отключить
disabled_success: Двухфакторная аутентификация успешно отключена
disable: Отключить 2FA
disabled_success: Двухфакторная аутентификация отключена
edit: Изменить
enabled: Двухфакторная аутентификация настроена
enabled_success: Двухфакторная авторизация успешно настроена
generate_recovery_codes: Сгенерировать коды восстановления
lost_recovery_codes: Коды восстановления позволяются войти в учётную запись в случае утери смартфона. Если вы потеряли свои коды восстановления, вы можете создать новые здесь. Прошлые коды работать перестанут.
methods: Методы двухфакторной аутентификации
otp: Приложение для проверки подлинности
recovery_codes: Коды восстановления
recovery_codes_regenerated: Коды восстановления успешно сгенерированы
recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен только один раз</strong>.'
enabled: Двухфакторная аутентификация включена
enabled_success: Двухфакторная аутентификация настроена
generate_recovery_codes: Сгенерировать резервные коды
lost_recovery_codes: Резервные коды позволят вам восстановить доступ к своей учётной записи в случае потери смартфона. Если вы потеряли свои резервные коды, просто создайте новые. Ваши старые коды будут аннулированы.
methods: Способы подтверждения входа
otp: Приложение-аутентификатор
recovery_codes: Резервные коды
recovery_codes_regenerated: Новые резервные коды сгенерированы
recovery_instructions_html: Если случится так, что у вас не будет доступа к смартфону, резервные коды позволят вам восстановить доступ к своей учётной записи. <strong>Храните резервные коды в надёжном месте.</strong> К примеру, вы можете распечатать их и убрать туда, где лежат другие важные документы.
webauthn: Электронные ключи
user_mailer:
announcement_published:
@ -2083,16 +2083,16 @@ ru:
subtitle: Ваша апелляция отклонена.
title: Обжалование отклонено
backup_ready:
explanation: Вы запросили полное резервное копирование вашей учетной записи Mastodon.
extra: Теперь он готов к загрузке!
explanation: Вы запросили экспорт данных своей учётной записи Mastodon.
extra: Теперь ваш архив готов и доступен для скачивания!
subject: Ваш архив готов к загрузке
title: Архив ваших данных готов
title: Экспорт данных
failed_2fa:
details: 'Вот подробности попытки регистрации:'
explanation: Кто-то пытался войти в вашу учетную запись, но указал неверный второй фактор аутентификации.
further_actions_html: Если это не вы, мы рекомендуем %{action} немедленно принять меры, так как он может быть скомпрометирован.
subject: Сбой двухфакторной аутентификации
title: Сбой двухфакторной аутентификации
details: 'Вот подробности попытки входа:'
explanation: Кто-то пытался войти в вашу учётную запись, но не смог подтвердить вход при помощи второго фактора.
further_actions_html: Если это были не вы, рекомендуем немедленно %{action}, так как он мог быть скомпрометирован.
subject: Неудачная попытка подтверждения входа
title: Неудачная попытка подтверждения входа
suspicious_sign_in:
change_password: сменить пароль
details: 'Подробности о новом входе:'
@ -2146,58 +2146,45 @@ ru:
apps_step: Загрузите наши официальные приложения.
apps_title: Приложения Mastodon
checklist_subtitle: 'Давайте начнем знакомство с этим новым социальным рубежом:'
checklist_title: Приветственный контрольный список
edit_profile_action: Персонализация
edit_profile_step: Усильте взаимодействие, заполнив полный профиль.
edit_profile_title: Персонализируйте свой профиль
explanation: Вот несколько советов для новичков
feature_action: Подробнее
feature_audience: Mastodon предоставляет вам уникальную возможность управлять своей аудиторией без посредников. Mastodon, развернутый на вашей собственной инфраструктуре, позволяет вам следить и быть преследуемым с любого другого сервера Mastodon в Интернете и не контролируется никем, кроме вас.
feature_audience_title: Создайте уверенную аудиторию
feature_control: Вы сами знаете, что хотите видеть в своей ленте. Никаких алгоритмов или рекламы, чтобы тратить ваше время. Следите за любым человеком на любом сервере Mastodon с одного аккаунта и получайте его сообщения в хронологическом порядке, а также сделайте свой уголок интернета немного больше похожим на себя.
feature_control_title: Контролируйте свой график
feature_creativity: Mastodon поддерживает аудио-, видео- и фотопосты, описания доступности, опросы, предупреждения о содержании, анимированные аватары, пользовательские emojis, управление обрезкой миниатюр и многое другое, чтобы помочь вам выразить себя в Интернете. Публикуете ли вы свои работы, музыку или подкаст, Mastodon всегда готов помочь вам.
feature_creativity_title: Непревзойденная креативность
feature_moderation: Mastodon возвращает принятие решений в ваши руки. Каждый сервер создает свои собственные правила и нормы, которые соблюдаются локально, а не сверху вниз, как в корпоративных социальных сетях, что позволяет наиболее гибко реагировать на потребности различных групп людей. Присоединяйтесь к серверу с правилами, с которыми вы согласны, или создайте свой собственный.
feature_moderation_title: Модерирование, каким оно должно быть
follow_action: Следуйте за
follow_step: Следить за интересными людьми - вот что такое Mastodon.
follow_title: Персонализируйте свою домашнюю ленту
follows_subtitle: Следите за известными аккаунтами
follows_title: За кем следить
follows_view_more: Посмотреть больше людей, за которыми стоит следить
hashtags_recent_count:
few: "%{people} человека за последние 2 дня"
many: "%{people} человек за последние 2 дня"
one: "%{people} человек за последние 2 дня"
other: "%{people} человек за последние 2 дня"
hashtags_subtitle: Изучите, что было в тренде за последние 2 дня
hashtags_title: Модные хэштеги
hashtags_view_more: Посмотреть другие трендовые хэштеги
post_action: Составить
post_step: Поприветствуйте мир с помощью текста, фотографий, видео или опросов.
post_title: Сделайте свой первый пост
share_step: Пусть ваши друзья знают, как найти вас на Mastodon.
share_title: Поделитесь информацией о компании Mastodon
sign_in_action: Зарегистрироваться
subject: Добро пожаловать в Mastodon
title: Добро пожаловать на борт, %{name}!
users:
follow_limit_reached: Вы не можете подписаться больше, чем на %{limit} человек
follow_limit_reached: Вы можете подписаться не больше чем на %{limit} человек
go_to_sso_account_settings: Перейти к настройкам сторонних аккаунтов учетной записи
invalid_otp_token: Введен неверный код двухфакторной аутентификации
otp_lost_help_html: Если Вы потеряли доступ к обоим, свяжитесь с %{email}
rate_limited: Слишком много попыток аутентификации, повторите попытку позже.
invalid_otp_token: Введён неверный код двухфакторной аутентификации
otp_lost_help_html: Если вы утратили доступ и к приложению-аутентификатору, и к резервным кодам, свяжитесь с %{email}
rate_limited: Слишком много попыток аутентификации, попробуйте позже.
seamless_external_login: Вы вошли в систему через внешнюю службу, поэтому настройки пароля и электронной почты недоступны.
signed_in_as: 'Выполнен вход под именем:'
signed_in_as: Выполнен вход в учётную запись
verification:
extra_instructions_html: <strong>Подсказка:</strong> Ссылка на вашем сайте может быть невидимой. Важной частью является <code>rel="me"</code>, который предотвращает выдачу себя за другое лицо на сайтах с пользовательским контентом. Вы даже можете использовать тег <code>link</code> в заголовке страницы вместо <code>a</code>, но HTML должен быть доступен без выполнения JavaScript.
here_is_how: Вот как
hint_html: "<strong>Подтверждение личности на Mastodon доступно каждому.</strong> Основано на открытых веб-стандартах, отныне и навсегда бесплатно. Всё, что вам нужно, - это персональный сайт, по которому вас узнают. Когда вы ссылаетесь на этот сайт из своего профиля, мы проверим, что сайт ссылается на ваш профиль, и отобразим на нём визуальный индикатор."
instructions_html: Скопируйте и вставьте код ниже в HTML вашего сайта. Затем, добавьте адрес вашего веб сайта в одно из дополнительных полей на вкладке "Редактировать профиль" и сохраните изменения.
verification: Верификация ссылок
verified_links: Ваши ссылки подтверждения
website_verification: Проверка веб-сайта
extra_instructions_html: <strong>Подсказка:</strong> Ссылка на вашем сайте может быть невидимой. Ключевое значение имеет атрибут <code>rel="me"</code>, который не даёт выдать себя за другое лицо на сайтах, где контент создают сами пользователи. Вместо тега <code>a</code> можно использовать тег <code>link</code> в <code>head</code>-секции страницы, но необходимо, чтобы HTML-код был доступен без выполнения JavaScript.
here_is_how: Как это делается?
hint_html: "<strong>Подтверждение личности в Mastodon доступно каждому.</strong> Оно предоставляется на основе открытых веб-стандартов, бесплатно навсегда. Всё, что вам нужно, — это личный веб-сайт, по которому другие люди смогут вас узнать. После того как вы разместите ссылку на этот сайт в своём профиле, мы убедимся, что сайт в свою очередь ссылается на ваш профиль, и затем напротив ссылки появится визуальный индикатор."
instructions_html: Скопируйте и вставьте следующий код в HTML-разметку вашего сайта. Затем добавьте адрес вашего веб-сайта в одно из дополнительных полей на вкладке «Данные профиля» и сохраните изменения.
verification: Верификация
verified_links: Верифицированные ссылки
website_verification: Верификация по веб-сайту
webauthn_credentials:
add: Добавить новый электронный ключ
create:

View File

@ -56,10 +56,12 @@ bg:
scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални.
setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания)
setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon
setting_default_quote_policy: Тази настройка ще се отрази само за публикациите, създадени със следващата версия на Mastodon, но може да изберете предпочитанията си в подготовката.
setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване
setting_display_media_default: Скриване на мултимедия отбелязана като деликатна
setting_display_media_hide_all: Винаги скриване на мултимедията
setting_display_media_show_all: Винаги показване на мултимедията
setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри.
setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome
setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите
setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала
@ -147,6 +149,9 @@ bg:
min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви.
user:
chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси
date_of_birth:
one: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
other: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
role: Ролята управлява какви позволения има потребителят.
user_role:
color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат
@ -154,6 +159,10 @@ bg:
name: Публично име на ролята, ако ролята е зададена да се показва като значка
permissions_as_keys: Потребители с тази роля ще имат достъп до...
position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет
username_block:
allow_with_approval: Вместо напълно да се предотвратява регистрирането, съвпадащите регистрирания ще изискват одобрението ви
comparison: Имайте предвид проблема със Scunthorpe, блокирайки частично съвпаденията
username: Ще се намира съвпадение независимо от главните и малките букви и често срещаните приличащи си знаци като "4" за "a" или "3" за "e"
webhook:
events: Изберете събития за изпращане
template: Съставете свой полезен товар на JSON посредством променлива интерполация. Оставете празно за подразбиращ се JSON.
@ -236,6 +245,7 @@ bg:
setting_display_media_default: Стандартно
setting_display_media_hide_all: Скриване на всичко
setting_display_media_show_all: Показване на всичко
setting_emoji_style: Стил на емоджито
setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание
setting_hide_network: Скриване на социалния ви свързан граф
setting_missing_alt_text_modal: Показване на диалогов прозорец потвърждение преди публикуване на мултимедия без алт. текст
@ -318,6 +328,7 @@ bg:
follow_request: Някой пожела да ви последва
mention: Някой ви спомена
pending_account: Новите акаунти се нуждаят от преглед
quote: Някой ви цитира
reblog: Някой подсили ваша публикация
report: Новият доклад е подаден
software_updates:
@ -364,6 +375,10 @@ bg:
name: Име
permissions_as_keys: Разрешения
position: Приоритет
username_block:
allow_with_approval: Позволяване на регистрации с одобрение
comparison: Начин на сравнение
username: Думи, които трябва да пасват
webhook:
events: Включване на събития
template: Шаблон за полезен товар

View File

@ -56,6 +56,7 @@ cy:
scopes: Pa APIs y bydd y rhaglen yn cael mynediad iddynt. Os dewiswch gwmpas lefel uchaf, nid oes angen i chi ddewis rhai unigol.
setting_aggregate_reblogs: Peidiwch â dangos hybiau newydd ar bostiadau sydd wedi cael eu hybu'n ddiweddar (dim ond yn effeithio ar hybiau newydd ei dderbyn)
setting_always_send_emails: Fel arfer ni fydd hysbysiadau e-bost yn cael eu hanfon pan fyddwch chi wrthi'n defnyddio Mastodon
setting_default_quote_policy: Dim ond ar gyfer fersiynau nesaf Mastodon bydd y gosodiadau hyn yn dod i rym, ond gallwch wneud eich dewis ymlaen llaw.
setting_default_sensitive: Mae cyfryngau sensitif wedi'u cuddio yn rhagosodedig a gellir eu datgelu trwy glicio
setting_display_media_default: Cuddio cyfryngau wedi eu marcio'n sensitif
setting_display_media_hide_all: Cuddio cyfryngau bob tro
@ -163,6 +164,10 @@ cy:
name: Enw cyhoeddus y rôl, os yw'r rôl wedi'i gosod i'w dangos fel bathodyn
permissions_as_keys: Bydd defnyddwyr sydd â'r rôl hon yn cael mynediad at...
position: Mae rôl uwch yn penderfynu ar ddatrys gwrthdrawiadau mewn rhai sefyllfaoedd. Dim ond ar rolau â blaenoriaeth is y gellir cyflawni rhai gweithredoedd
username_block:
allow_with_approval: Yn lle atal cofrestrun llwyr, bydd angen eich cymeradwyaeth rhag cofrestru cyfatebol
comparison: Byddwch yn ymwybodol o Broblem Scunthorpe wrth rwystro cyfatebion rhannol.
username: Bydd yn cael ei gyfatebu waeth beth fo'r nodau bach a mawr a homoglyffau cyffredin fel "4" ar gyfer "a" neu "3" ar gyfer "e"
webhook:
events: Dewiswch ddigwyddiadau i'w hanfon
template: Cyfansoddwch eich llwyth tâl JSON eich hun gan ddefnyddio rhyngosod newidiol. Gadewch yn wag ar gyfer JSON rhagosodedig.
@ -328,6 +333,7 @@ cy:
follow_request: Mae rhywun yn ceisio eich dilyn chi
mention: Mae rhywun yn sôn amdanoch chi
pending_account: Mae cyfrif newydd angen adolygiad
quote: Dyfynnodd rhywun chi
reblog: Mae rhywun wedi hybu eich postiad
report: Cyflwynwyd adroddiad newydd
software_updates:
@ -374,6 +380,10 @@ cy:
name: Enw
permissions_as_keys: Caniatâd
position: Blaenoriaeth
username_block:
allow_with_approval: Caniatáu cofrestru gyda chymeradwyaeth
comparison: Dull cymharu
username: Gair i gyfatebu
webhook:
events: Digwyddiadau wedi'u galluogi
template: Templed prif lwyth

View File

@ -160,6 +160,10 @@ fa:
name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود
permissions_as_keys: کاربرانی که این نقش را دارند به...
position: نقش بالاتر در موقعیت‌های خاص حل تعارض را تعیین می‌کند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد
username_block:
allow_with_approval: به جای جلوگیری از ثبت‌نام، ثبت‌نام‌های مطابق نیازمند تأییدتان خواهند بود
comparison: لطفاً هنگام مسدود کردن تطابق‌های جزیی به مشکل اسکان‌ثورپ توجّه داشته باشید
username: تطبیق بدون توجه به بزرگی و کوچکی یا استفاده از نویسه‌های مشابه مثل 4 به جای a یا 3 به جای e
webhook:
events: گزینش رویدادها برای فرستادن
template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید.
@ -372,6 +376,10 @@ fa:
name: نام
permissions_as_keys: اجازه‌ها
position: اولویت
username_block:
allow_with_approval: اجازهٔ ثبت‌نام با تأیید
comparison: روش مقایسه
username: واژه برای تطبیق
webhook:
events: رویدادهای به کار افتاده
template: قالب بار

View File

@ -56,10 +56,12 @@ ia:
scopes: Le APIs al quales le application habera accesso. Si tu selige un ambito de nivello superior, non es necessari seliger ambitos individual.
setting_aggregate_reblogs: Non monstrar nove impulsos pro messages que ha essite recentemente impulsate (affecta solmente le impulsos novemente recipite)
setting_always_send_emails: Normalmente, le notificationes de e-mail non es inviate quando tu activemente usa Mastodon
setting_default_quote_policy: Iste parametro solo habera effecto pro messages create con le proxime version de Mastodon, ma tu pote seliger tu preferentia anticipatemente.
setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic
setting_display_media_default: Celar le medios marcate como sensibile
setting_display_media_hide_all: Sempre celar contento multimedial
setting_display_media_show_all: Sempre monstrar contento multimedial
setting_emoji_style: Como monstrar emojis. “Automatic” tentara usar emojis native, ma recurre al Twemojis pro navigatores ancian.
setting_system_scrollbars_ui: Se applica solmente al navigatores de scriptorio basate sur Safari e Chrome
setting_use_blurhash: Le imagines degradate se basa sur le colores del visuales celate, ma illos offusca tote le detalios
setting_use_pending_items: Requirer un clic pro monstrar nove messages in vice de rolar automaticamente le fluxo
@ -134,16 +136,23 @@ ia:
name: Tu pote solmente cambiar le litteras inter majusculas e minusculas, per exemplo, pro render lo plus legibile
terms_of_service:
changelog: Pote esser structurate con le syntaxe Markdown.
effective_date: Un periodo rationabile pote variar inter 10 e 30 dies post le data al qual tu notifica tu usatores.
text: Pote esser structurate con le syntaxe Markdown.
terms_of_service_generator:
admin_email: Le avisos juridic include le contra-avisos, ordinantias judiciari, demandas de retiro e demandas de application del lege.
arbitration_address: Pote esser le mesme que le adresse physic supra, o “N/A” si se usa e-mail.
arbitration_website: Pote esser un formulario web, o “N/A” si se usa e-mail.
choice_of_law: Citate, region, territorio o stato cuje leges substantive interne governa omne disputa juridic.
dmca_address: Pro operatores in le SUA, usa le adresse registrate in le Directorio de Agentes Designate pro le DMCA (DMCA Designated Agent Directory). Un adresse de cassa postal es disponibile per requesta directe; usa le Requesta de Exemption de Cassa Postal pro Agentes Designate del DMCA (DMCA Designated Agent Post Office Box Waiver Request) pro inviar un message electronic al Officio del Derecto de Autor (Copyright Office) e describer que tu es un moderator de contento que travalia de casa e qui time vengiantias o represalias pro tu actiones, necessitante le uso un cassa postal pro remover tu adresse personal del vista public.
dmca_email: Pote esser le mesme adresse de e-mail usate pro “Adresse de e-mail pro avisos juridic” supra.
domain: Identification unic del servicio in linea que tu forni.
jurisdiction: Indica le pais ubi vive le persona qui paga le facturas. Si se tracta de un interprisa o altere organisation, indica le pais ubi illo es incorporate, e le citate, region, territorio o stato del maniera appropriate pro le pais.
min_age: Non deberea esser infra le etate minime requirite per le leges de tu jurisdiction.
user:
chosen_languages: Si marcate, solmente le messages in le linguas seligite apparera in chronologias public
date_of_birth:
one: Nos debe assecurar que tu ha al minus %{count} anno pro usar %{domain}. Nos non va immagazinar isto.
other: Nos debe assecurar que tu ha al minus %{count} annos pro usar %{domain}. Nos non va immagazinar isto.
role: Le rolo controla qual permissos le usator ha.
user_role:
color: Color a esser usate pro le rolo in omne parte del UI, como RGB in formato hexadecimal
@ -151,6 +160,10 @@ ia:
name: Nomine public del rolo, si rolo es definite a esser monstrate como insignia
permissions_as_keys: Usatores con iste rolo habera accesso a...
position: Rolo superior decide resolution de conflicto in certe situationes. Certe actiones pote solo esser exequite sur rolos con un prioritate inferior
username_block:
allow_with_approval: In loco de impedir totalmente le inscription, le inscriptiones correspondente requirera tu approbation
comparison: Tene in conto le “problema Scunthorpe” si tu bloca correspondentias partial
username: Correspondera independentemente de majusculas e minusculas e de homoglyphos commun como "4" pro "a" or "3" pro "e"
webhook:
events: Selige le eventos a inviar
template: Compone tu proprie carga utile JSON per interpolation de variabile. Lassar blanc pro JSON predefinite.
@ -233,6 +246,7 @@ ia:
setting_display_media_default: Predefinite
setting_display_media_hide_all: Celar toto
setting_display_media_show_all: Monstrar toto
setting_emoji_style: Stilo de emojis
setting_expand_spoilers: Sempre expander messages marcate con avisos de contento
setting_hide_network: Cela tu rete social
setting_missing_alt_text_modal: Monstrar un dialogo de confirmation ante de publicar multimedia sin texto alternative
@ -271,6 +285,7 @@ ia:
favicon: Favicon
mascot: Personalisar le mascotte (hereditage)
media_cache_retention_period: Periodo de retention del cache multimedial
min_age: Etate minime requirite
peers_api_enabled: Publicar le lista de servitores discoperite in le API
profile_directory: Activar directorio de profilos
registrations_mode: Qui pote inscriber se
@ -314,6 +329,7 @@ ia:
follow_request: Alcuno ha demandate de sequer te
mention: Alcuno te ha mentionate
pending_account: Nove conto besonia de revision
quote: Alcuno te ha citate
reblog: Alcuno ha impulsate tu message
report: Un nove reporto es inviate
software_updates:
@ -360,6 +376,10 @@ ia:
name: Nomine
permissions_as_keys: Permissiones
position: Prioritate
username_block:
allow_with_approval: Permitter registrationes con approbation
comparison: Methodo de comparation
username: Parola a comparar
webhook:
events: Eventos activate
template: Modello de carga utile

View File

@ -56,6 +56,7 @@ ru:
scopes: Выберите, какие API приложение сможет использовать. Разрешения верхнего уровня имплицитно включают в себя все разрешения более низких уровней.
setting_aggregate_reblogs: Не показывать новые продвижения постов, которые уже были недавно продвинуты (применяется только к будущим продвижениям)
setting_always_send_emails: По умолчанию уведомления не доставляются по электронной почте, пока вы активно используете Mastodon
setting_default_quote_policy: Эта настройка будет применена только к постам, созданным в следующей версии Mastodon, но вы можете заранее определить свои предпочтения.
setting_default_sensitive: Медиа деликатного характера скрыты по умолчанию и могут быть показаны по нажатию на них
setting_display_media_default: Скрывать медиа деликатного характера
setting_display_media_hide_all: Скрывать все медиа
@ -148,6 +149,11 @@ ru:
min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции.
user:
chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку
date_of_birth:
few: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
many: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
one: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} года. Мы не храним введённые здесь данные.
other: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
role: Роль определяет, какими правами обладает пользователь.
user_role:
color: Цвет, который будет использоваться для роли в интерфейсе (UI), как RGB в формате HEX

View File

@ -369,10 +369,6 @@ namespace :api, format: false do
namespace :web do
resource :settings, only: [:update]
resources :embeds, only: [:show]
resources :push_subscriptions, only: [:create, :destroy] do
member do
put :update
end
end
resources :push_subscriptions, only: [:create, :destroy, :update]
end
end

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
class UpdateQuoteIndex < ActiveRecord::Migration[8.0]
disable_ddl_transaction!
def change
add_index :quotes, [:account_id, :quoted_account_id, :id], algorithm: :concurrently
remove_index :quotes, [:account_id, :quoted_account_id]
add_index :quotes, [:quoted_status_id, :id], algorithm: :concurrently
remove_index :quotes, [:quoted_status_id]
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2025_08_05_075010) do
ActiveRecord::Schema[8.0].define(version: 2025_08_19_100545) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql"
@ -926,11 +926,11 @@ ActiveRecord::Schema[8.0].define(version: 2025_08_05_075010) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "legacy", default: false, null: false
t.index ["account_id", "quoted_account_id"], name: "index_quotes_on_account_id_and_quoted_account_id"
t.index ["account_id", "quoted_account_id", "id"], name: "index_quotes_on_account_id_and_quoted_account_id_and_id"
t.index ["activity_uri"], name: "index_quotes_on_activity_uri", unique: true, where: "(activity_uri IS NOT NULL)"
t.index ["approval_uri"], name: "index_quotes_on_approval_uri", where: "(approval_uri IS NOT NULL)"
t.index ["quoted_account_id"], name: "index_quotes_on_quoted_account_id"
t.index ["quoted_status_id"], name: "index_quotes_on_quoted_status_id"
t.index ["quoted_status_id", "id"], name: "index_quotes_on_quoted_status_id_and_id"
t.index ["status_id"], name: "index_quotes_on_status_id", unique: true
end

View File

@ -91,7 +91,7 @@ development environment configured with the software needed for this project.
## Next steps
- Once you have successfully set up a development environment, it will be available on http://localhost:3000
- Log in as the default admin user with the username `admin@mastodon.local` and the password `mastodonadmin`.
- Log in as the default admin user with the username `admin@mastodon.local` or `admin@localhost` (depending on your setup) and the password `mastodonadmin`.
- Check out the [Mastodon docs] for tips on working with emails in development (you'll need this when creating new user accounts) as well as a list of useful commands for testing and updating your dev instance.
- You can optionally populate your database with sample data by running `bin/rails dev:populate_sample_data`. This will create a `@showcase_account` account with various types of contents.

View File

@ -62,7 +62,7 @@ RSpec.describe 'Interaction policies', feature: :outgoing_quotes do
expect(DistributionWorker)
.to have_enqueued_sidekiq_job(status.id, { 'update' => true })
expect(ActivityPub::StatusUpdateDistributionWorker)
.to have_enqueued_sidekiq_job(status.id)
.to have_enqueued_sidekiq_job(status.id, { 'updated_at' => anything })
end
end

View File

@ -162,7 +162,7 @@ RSpec.describe 'API Web Push Subscriptions' do
end
end
describe 'PUT /api/web/push_subscriptions' do
describe 'PUT /api/web/push_subscriptions/:id' do
before { sign_in Fabricate :user }
let(:subscription) { Fabricate :web_push_subscription }

View File

@ -86,6 +86,42 @@ RSpec.shared_examples 'User::Confirmation' do
end
end
context 'when the user requires explicit approval because of signup IP address' do
let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, sign_up_ip: '192.0.2.5') }
before do
Setting.registrations_mode = 'open'
Fabricate(:ip_block, ip: '192.0.2.5', severity: :sign_up_requires_approval)
end
it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do
expect { subject }
.to change { user.reload.email }.to(new_email)
.and change { user.reload.confirmed_at }.from(nil)
.and not_change { user.reload.approved }.from(false)
expect(TriggerWebhookWorker)
.to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
end
end
context 'when the user requires explicit approval because of username' do
let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, account_attributes: { username: 'VeryStrangeUsername' }) }
before do
Setting.registrations_mode = 'open'
Fabricate(:username_block, username: 'StrangeUser', exact: false, allow_with_approval: true)
end
it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do
expect { subject }
.to change { user.reload.email }.to(new_email)
.and change { user.reload.confirmed_at }.from(nil)
.and not_change { user.reload.approved }.from(false)
expect(TriggerWebhookWorker)
.to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
end
end
context 'when registrations mode is approved' do
before { Setting.registrations_mode = 'approved' }

View File

@ -130,14 +130,19 @@ RSpec.describe 'Settings applications page' do
describe 'Regenerating an app token' do
it 'updates the app token' do
visit settings_application_path(application)
expect { visit settings_application_path(application) }
.to change(user_application_token, :first).from(be_nil).to(be_present)
expect { regenerate_token }
.to(change { user.token_for_app(application) })
.to(change { user_application_token.first.token })
expect(page)
.to have_content(I18n.t('applications.token_regenerated'))
end
def user_application_token
Doorkeeper::AccessToken.where(application:).where(resource_owner_id: user)
end
def regenerate_token
click_on I18n.t('applications.regenerate_token')
end

View File

@ -11,9 +11,9 @@ ARG BASE_REGISTRY="docker.io"
# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
# renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="22"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
ARG DEBIAN_VERSION="bookworm"
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
ARG DEBIAN_VERSION="trixie"
# Node image to use for base image based on combined variables (ex: 20-trixie-slim)
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA

118
yarn.lock
View File

@ -73,39 +73,39 @@ __metadata:
languageName: node
linkType: hard
"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/core@npm:7.28.0"
"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/core@npm:7.28.3"
dependencies:
"@ampproject/remapping": "npm:^2.2.0"
"@babel/code-frame": "npm:^7.27.1"
"@babel/generator": "npm:^7.28.0"
"@babel/generator": "npm:^7.28.3"
"@babel/helper-compilation-targets": "npm:^7.27.2"
"@babel/helper-module-transforms": "npm:^7.27.3"
"@babel/helpers": "npm:^7.27.6"
"@babel/parser": "npm:^7.28.0"
"@babel/helper-module-transforms": "npm:^7.28.3"
"@babel/helpers": "npm:^7.28.3"
"@babel/parser": "npm:^7.28.3"
"@babel/template": "npm:^7.27.2"
"@babel/traverse": "npm:^7.28.0"
"@babel/types": "npm:^7.28.0"
"@babel/traverse": "npm:^7.28.3"
"@babel/types": "npm:^7.28.2"
convert-source-map: "npm:^2.0.0"
debug: "npm:^4.1.0"
gensync: "npm:^1.0.0-beta.2"
json5: "npm:^2.2.3"
semver: "npm:^6.3.1"
checksum: 10c0/423302e7c721e73b1c096217880272e02020dfb697a55ccca60ad01bba90037015f84d0c20c6ce297cf33a19bb704bc5c2b3d3095f5284dfa592bd1de0b9e8c3
checksum: 10c0/e6b3eb830c4b93f5a442b305776df1cd2bb4fafa4612355366f67c764f3e54a69d45b84def77fb2d4fd83439102667b0a92c3ea2838f678733245b748c602a7b
languageName: node
linkType: hard
"@babel/generator@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/generator@npm:7.28.0"
"@babel/generator@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/generator@npm:7.28.3"
dependencies:
"@babel/parser": "npm:^7.28.0"
"@babel/types": "npm:^7.28.0"
"@babel/parser": "npm:^7.28.3"
"@babel/types": "npm:^7.28.2"
"@jridgewell/gen-mapping": "npm:^0.3.12"
"@jridgewell/trace-mapping": "npm:^0.3.28"
jsesc: "npm:^3.0.2"
checksum: 10c0/1b3d122268ea3df50fde707ad864d9a55c72621357d5cebb972db3dd76859c45810c56e16ad23123f18f80cc2692f5a015d2858361300f0f224a05dc43d36a92
checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc
languageName: node
linkType: hard
@ -203,16 +203,16 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3":
version: 7.27.3
resolution: "@babel/helper-module-transforms@npm:7.27.3"
"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/helper-module-transforms@npm:7.28.3"
dependencies:
"@babel/helper-module-imports": "npm:^7.27.1"
"@babel/helper-validator-identifier": "npm:^7.27.1"
"@babel/traverse": "npm:^7.27.3"
"@babel/traverse": "npm:^7.28.3"
peerDependencies:
"@babel/core": ^7.0.0
checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01
checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb
languageName: node
linkType: hard
@ -300,24 +300,24 @@ __metadata:
languageName: node
linkType: hard
"@babel/helpers@npm:^7.27.6":
version: 7.27.6
resolution: "@babel/helpers@npm:7.27.6"
"@babel/helpers@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/helpers@npm:7.28.3"
dependencies:
"@babel/template": "npm:^7.27.2"
"@babel/types": "npm:^7.27.6"
checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3
"@babel/types": "npm:^7.28.2"
checksum: 10c0/03a8f94135415eec62d37be9c62c63908f2d5386c7b00e04545de4961996465775330e3eb57717ea7451e19b0e24615777ebfec408c2adb1df3b10b4df6bf1ce
languageName: node
linkType: hard
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/parser@npm:7.28.0"
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/parser@npm:7.28.3"
dependencies:
"@babel/types": "npm:^7.28.0"
"@babel/types": "npm:^7.28.2"
bin:
parser: ./bin/babel-parser.js
checksum: 10c0/c2ef81d598990fa949d1d388429df327420357cb5200271d0d0a2784f1e6d54afc8301eb8bdf96d8f6c77781e402da93c7dc07980fcc136ac5b9d5f1fce701b5
checksum: 10c0/1f41eb82623b0ca0f94521b57f4790c6c457cd922b8e2597985b36bdec24114a9ccf54640286a760ceb60f11fe9102d192bf60477aee77f5d45f1029b9b72729
languageName: node
linkType: hard
@ -1179,22 +1179,22 @@ __metadata:
languageName: node
linkType: hard
"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/traverse@npm:7.28.0"
"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3":
version: 7.28.3
resolution: "@babel/traverse@npm:7.28.3"
dependencies:
"@babel/code-frame": "npm:^7.27.1"
"@babel/generator": "npm:^7.28.0"
"@babel/generator": "npm:^7.28.3"
"@babel/helper-globals": "npm:^7.28.0"
"@babel/parser": "npm:^7.28.0"
"@babel/parser": "npm:^7.28.3"
"@babel/template": "npm:^7.27.2"
"@babel/types": "npm:^7.28.0"
"@babel/types": "npm:^7.28.2"
debug: "npm:^4.3.1"
checksum: 10c0/32794402457827ac558173bcebdcc0e3a18fa339b7c41ca35621f9f645f044534d91bb923ff385f5f960f2e495f56ce18d6c7b0d064d2f0ccb55b285fa6bc7b9
checksum: 10c0/26e95b29a46925b7b41255e03185b7e65b2c4987e14bbee7bbf95867fb19c69181f301bbe1c7b201d4fe0cce6aa0cbea0282dad74b3a0fef3d9058f6c76fdcb3
languageName: node
linkType: hard
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4":
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.4.4":
version: 7.28.2
resolution: "@babel/types@npm:7.28.2"
dependencies:
@ -3210,10 +3210,10 @@ __metadata:
languageName: node
linkType: hard
"@rolldown/pluginutils@npm:1.0.0-beta.30":
version: 1.0.0-beta.30
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.30"
checksum: 10c0/aff8b532cb9d82d94c9a4101fa12ecb10620ad47d52dbb9135a5c65bde1ad19895b41026b821f4d607083699239a5d0010198401b6a6a54ab6a10d0015302768
"@rolldown/pluginutils@npm:1.0.0-beta.32":
version: 1.0.0-beta.32
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.32"
checksum: 10c0/ba3582fc3c35c8eb57b0df2d22d0733b1be83d37edcc258203364773f094f58fc0cb7a056d604603573a69dd0105a466506cad467f59074e1e53d0dc26191f06
languageName: node
linkType: hard
@ -4712,18 +4712,18 @@ __metadata:
linkType: hard
"@vitejs/plugin-react@npm:^5.0.0":
version: 5.0.0
resolution: "@vitejs/plugin-react@npm:5.0.0"
version: 5.0.1
resolution: "@vitejs/plugin-react@npm:5.0.1"
dependencies:
"@babel/core": "npm:^7.28.0"
"@babel/core": "npm:^7.28.3"
"@babel/plugin-transform-react-jsx-self": "npm:^7.27.1"
"@babel/plugin-transform-react-jsx-source": "npm:^7.27.1"
"@rolldown/pluginutils": "npm:1.0.0-beta.30"
"@rolldown/pluginutils": "npm:1.0.0-beta.32"
"@types/babel__core": "npm:^7.20.5"
react-refresh: "npm:^0.17.0"
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
checksum: 10c0/e5813839d319ab5dc1b90cab40b6c08388f26e456166ba9df10ffc3c3f4ecc594cec06715b5c93390bba56140ca5f68a18f2233f7d275d77e5bbfeb979e4fd9b
checksum: 10c0/2641171beedfc38edc5671abb47706906f9af2a79a6dfff4e946106c9550de4f83ccae41c164f3ee26a3edf07127ecc0e415fe5cddbf7abc71fbb2540016c27d
languageName: node
linkType: hard
@ -7371,15 +7371,15 @@ __metadata:
languageName: node
linkType: hard
"fdir@npm:^6.4.4, fdir@npm:^6.4.6":
version: 6.4.6
resolution: "fdir@npm:6.4.6"
"fdir@npm:^6.4.4, fdir@npm:^6.5.0":
version: 6.5.0
resolution: "fdir@npm:6.5.0"
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9
checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f
languageName: node
linkType: hard
@ -13818,8 +13818,8 @@ __metadata:
linkType: hard
"vite-plugin-pwa@npm:^1.0.2":
version: 1.0.2
resolution: "vite-plugin-pwa@npm:1.0.2"
version: 1.0.3
resolution: "vite-plugin-pwa@npm:1.0.3"
dependencies:
debug: "npm:^4.3.6"
pretty-bytes: "npm:^6.1.1"
@ -13834,7 +13834,7 @@ __metadata:
peerDependenciesMeta:
"@vite-pwa/assets-generator":
optional: true
checksum: 10c0/e4f2f4dfff843ee2585a0d89e74187168ba20da77cd0d127ce7ad7eebcf5a68b2bf09000afb6bb86d43a2034fea9f568cd6db2a2d4b47a72e175d999a5e07eb1
checksum: 10c0/03fc24bd12ae4a4130979da4877e3dabddf13d7d6ff2bd68e5e8497a2643b8874a78e6c2502874277ddf2f28593d0a3b025d78af2335bdcc5d2966295784fd46
languageName: node
linkType: hard
@ -13883,11 +13883,11 @@ __metadata:
linkType: hard
"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1":
version: 7.1.2
resolution: "vite@npm:7.1.2"
version: 7.1.3
resolution: "vite@npm:7.1.3"
dependencies:
esbuild: "npm:^0.25.0"
fdir: "npm:^6.4.6"
fdir: "npm:^6.5.0"
fsevents: "npm:~2.3.3"
picomatch: "npm:^4.0.3"
postcss: "npm:^8.5.6"
@ -13933,7 +13933,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced
checksum: 10c0/a0aa418beab80673dc9a3e9d1fa49472955d6ef9d41a4c9c6bd402953f411346f612864dae267adfb2bb8ceeb894482369316ffae5816c84fd45990e352b727d
languageName: node
linkType: hard