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: Metrics/AbcSize:
Exclude: Enabled: false
- lib/mastodon/cli/*.rb
Metrics/BlockLength: Metrics/BlockLength:
Enabled: false Enabled: false
Metrics/BlockNesting:
Enabled: false
Metrics/ClassLength: Metrics/ClassLength:
Enabled: false Enabled: false
Metrics/CollectionLiteralLength:
Enabled: false
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Exclude: Enabled: false
- lib/mastodon/cli/*.rb
Metrics/MethodLength: Metrics/MethodLength:
Enabled: false Enabled: false
@ -20,4 +24,7 @@ Metrics/ModuleLength:
Enabled: false Enabled: false
Metrics/ParameterLists: 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 # Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again. # 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). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowedVars, DefaultToNil. # Configuration parameters: AllowedVars, DefaultToNil.
Style/FetchEnvVar: 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"] # # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
# renovate: datasource=node-version depName=node # renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="22" ARG NODE_MAJOR_VERSION="22"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"] # Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
ARG DEBIAN_VERSION="bookworm" ARG DEBIAN_VERSION="trixie"
# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim) # 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 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 FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
@ -96,9 +96,6 @@ RUN \
# Set /opt/mastodon as working directory # Set /opt/mastodon as working directory
WORKDIR /opt/mastodon 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 # hadolint ignore=DL3008,DL3005
RUN \ RUN \
# Mount Apt cache and lib directories from Docker buildx caches # Mount Apt cache and lib directories from Docker buildx caches
@ -161,11 +158,11 @@ RUN \
libexif-dev \ libexif-dev \
libexpat1-dev \ libexpat1-dev \
libgirepository1.0-dev \ libgirepository1.0-dev \
libheif-dev/bookworm-backports \ libheif-dev \
libhwy-dev \
libimagequant-dev \ libimagequant-dev \
libjpeg62-turbo-dev \ libjpeg62-turbo-dev \
liblcms2-dev \ liblcms2-dev \
liborc-dev \
libspng-dev \ libspng-dev \
libtiff-dev \ libtiff-dev \
libwebp-dev \ libwebp-dev \
@ -209,7 +206,7 @@ FROM build AS ffmpeg
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"] # ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg # 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"] # ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
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 update install non-dev versions of necessary components
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
libexpat1 \ libexpat1 \
libglib2.0-0 \ libglib2.0-0t64 \
libicu72 \ libicu76 \
libidn12 \ libidn12 \
libpq5 \ libpq5 \
libreadline8 \ libreadline8t64 \
libssl3 \ libssl3t64 \
libyaml-0-2 \ libyaml-0-2 \
# libvips components # libvips components
libcgif0 \ libcgif0 \
libexif12 \ libexif12 \
libheif1/bookworm-backports \ libheif1 \
libhwy1t64 \
libimagequant0 \ libimagequant0 \
libjpeg62-turbo \ libjpeg62-turbo \
liblcms2-2 \ liblcms2-2 \
liborc-0.4-0 \
libspng0 \ libspng0 \
libtiff6 \ libtiff6 \
libwebp7 \ libwebp7 \
libwebpdemux2 \ libwebpdemux2 \
libwebpmux3 \ libwebpmux3 \
# ffmpeg components # ffmpeg components
libdav1d6 \ libdav1d7 \
libmp3lame0 \ libmp3lame0 \
libopencore-amrnb0 \ libopencore-amrnb0 \
libopencore-amrwb0 \ libopencore-amrwb0 \
@ -358,9 +355,9 @@ RUN \
libvorbis0a \ libvorbis0a \
libvorbisenc2 \ libvorbisenc2 \
libvorbisfile3 \ libvorbisfile3 \
libvpx7 \ libvpx9 \
libx264-164 \ libx264-164 \
libx265-199 \ libx265-215 \
; ;
# Copy Mastodon sources into final layer # 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 'prometheus_exporter', '~> 2.2', require: false
gem 'opentelemetry-api', '~> 1.5.0' gem 'opentelemetry-api', '~> 1.6.0'
group :opentelemetry do group :opentelemetry do
gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false

View File

@ -497,7 +497,7 @@ GEM
openssl (3.3.0) openssl (3.3.0)
openssl-signature_algorithm (1.3.0) openssl-signature_algorithm (1.3.0)
openssl (> 2.0) openssl (> 2.0)
opentelemetry-api (1.5.0) opentelemetry-api (1.6.0)
opentelemetry-common (0.22.0) opentelemetry-common (0.22.0)
opentelemetry-api (~> 1.0) opentelemetry-api (~> 1.0)
opentelemetry-exporter-otlp (0.30.0) opentelemetry-exporter-otlp (0.30.0)
@ -589,7 +589,7 @@ GEM
opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-registry (0.4.0) opentelemetry-registry (0.4.0)
opentelemetry-api (~> 1.1) opentelemetry-api (~> 1.1)
opentelemetry-sdk (1.8.0) opentelemetry-sdk (1.8.1)
opentelemetry-api (~> 1.1) opentelemetry-api (~> 1.1)
opentelemetry-common (~> 0.20) opentelemetry-common (~> 0.20)
opentelemetry-registry (~> 0.2) opentelemetry-registry (~> 0.2)
@ -625,7 +625,7 @@ GEM
premailer (~> 1.7, >= 1.7.9) premailer (~> 1.7, >= 1.7.9)
prettyprint (0.2.0) prettyprint (0.2.0)
prism (1.4.0) prism (1.4.0)
prometheus_exporter (2.2.0) prometheus_exporter (2.3.0)
webrick webrick
propshaft (1.2.1) propshaft (1.2.1)
actionpack (>= 7.0.0) actionpack (>= 7.0.0)
@ -688,7 +688,7 @@ GEM
rails-html-sanitizer (1.6.2) rails-html-sanitizer (1.6.2)
loofah (~> 2.21) 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) 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) i18n (>= 0.7, < 2)
railties (>= 8.0.0, < 9) railties (>= 8.0.0, < 9)
railties (8.0.2.1) railties (8.0.2.1)
@ -806,7 +806,7 @@ GEM
ruby-saml (1.18.1) ruby-saml (1.18.1)
nokogiri (>= 1.13.10) nokogiri (>= 1.13.10)
rexml rexml
ruby-vips (2.2.4) ruby-vips (2.2.5)
ffi (~> 1.12) ffi (~> 1.12)
logger logger
rubyzip (3.0.1) rubyzip (3.0.1)
@ -1025,7 +1025,7 @@ DEPENDENCIES
omniauth-rails_csrf_protection (~> 1.0) omniauth-rails_csrf_protection (~> 1.0)
omniauth-saml (~> 2.0) omniauth-saml (~> 2.0)
omniauth_openid_connect (~> 0.8.0) omniauth_openid_connect (~> 0.8.0)
opentelemetry-api (~> 1.5.0) opentelemetry-api (~> 1.6.0)
opentelemetry-exporter-otlp (~> 0.30.0) opentelemetry-exporter-otlp (~> 0.30.0)
opentelemetry-instrumentation-active_job (~> 0.8.0) opentelemetry-instrumentation-active_job (~> 0.8.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.22.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! def broadcast_updates!
DistributionWorker.perform_async(@status.id, { 'update' => true }) 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
end end

View File

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

View File

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

View File

@ -41,13 +41,16 @@ import { IconButton } from './icon_button';
let id = 0; let id = 0;
type RenderItemFn<Item = MenuItem> = ( export interface RenderItemFnHandlers {
onClick: React.MouseEventHandler;
onKeyUp: React.KeyboardEventHandler;
}
export type RenderItemFn<Item = MenuItem> = (
item: Item, item: Item,
index: number, index: number,
handlers: { handlers: RenderItemFnHandlers,
onClick: (e: React.MouseEvent) => void; focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void,
onKeyUp: (e: React.KeyboardEvent) => void;
},
) => React.ReactNode; ) => React.ReactNode;
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void; type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
@ -173,7 +176,7 @@ export const DropdownMenu = <Item = MenuItem,>({
onItemClick(item, i); onItemClick(item, i);
} else if (isActionItem(item)) { } else if (isActionItem(item)) {
e.preventDefault(); e.preventDefault();
item.action(); item.action(e);
} }
}, },
[onClose, onItemClick, items], [onClose, onItemClick, items],
@ -277,10 +280,15 @@ export const DropdownMenu = <Item = MenuItem,>({
})} })}
> >
{items.map((option, i) => {items.map((option, i) =>
renderItemMethod(option, i, { renderItemMethod(
onClick: handleItemClick, option,
onKeyUp: handleItemKeyUp, i,
}), {
onClick: handleItemClick,
onKeyUp: handleItemKeyUp,
},
i === 0 ? handleFocusedItemRef : undefined,
),
)} )}
</ul> </ul>
)} )}
@ -307,7 +315,9 @@ interface DropdownProps<Item = MenuItem> {
forceDropdown?: boolean; forceDropdown?: boolean;
renderItem?: RenderItemFn<Item>; renderItem?: RenderItemFn<Item>;
renderHeader?: RenderHeaderFn<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>; onItemClick?: ItemClickFn<Item>;
} }
@ -376,7 +386,7 @@ export const Dropdown = <Item = MenuItem,>({
onItemClick(item, i); onItemClick(item, i);
} else if (isActionItem(item)) { } else if (isActionItem(item)) {
e.preventDefault(); e.preventDefault();
item.action(); item.action(e);
} }
}, },
[handleClose, onItemClick, items], [handleClose, onItemClick, items],
@ -389,7 +399,10 @@ export const Dropdown = <Item = MenuItem,>({
if (open) { if (open) {
handleClose(); handleClose();
} else { } else {
onOpen?.(); const allow = onOpen?.(e);
if (allow === false) {
return;
}
if (prefetchAccountId) { if (prefetchAccountId) {
dispatch(fetchRelationships([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 AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.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 { Hotkeys } from 'mastodon/components/hotkeys';
import { ContentWarning } from 'mastodon/components/content_warning'; import { ContentWarning } from 'mastodon/components/content_warning';
import { FilterWarning } from 'mastodon/components/filter_warning'; import { FilterWarning } from 'mastodon/components/filter_warning';
@ -34,6 +35,8 @@ import StatusActionBar from './status_action_bar';
import StatusContent from './status_content'; import StatusContent from './status_content';
import { StatusThreadLabel } from './status_thread_label'; import { StatusThreadLabel } from './status_thread_label';
import { VisibilityIcon } from './visibility_icon'; import { VisibilityIcon } from './visibility_icon';
import { IconButton } from './icon_button';
const domParser = new DOMParser(); const domParser = new DOMParser();
export const textForScreenReader = (intl, status, rebloggedByText = false) => { export const textForScreenReader = (intl, status, rebloggedByText = false) => {
@ -75,6 +78,7 @@ const messages = defineMessages({
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' }, private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' },
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' }, direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' },
edited: { id: 'status.edited', defaultMessage: 'Edited {date}' }, edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' },
}); });
class Status extends ImmutablePureComponent { class Status extends ImmutablePureComponent {
@ -126,6 +130,7 @@ class Status extends ImmutablePureComponent {
inUse: PropTypes.bool, inUse: PropTypes.bool,
available: PropTypes.bool, available: PropTypes.bool,
}), }),
contextType: PropTypes.string,
...WithOptionalRouterPropTypes, ...WithOptionalRouterPropTypes,
}; };
@ -359,6 +364,10 @@ class Status extends ImmutablePureComponent {
this.setState(state => ({ ...state, showDespiteFilter: !state.showDespiteFilter })); this.setState(state => ({ ...state, showDespiteFilter: !state.showDespiteFilter }));
}; };
handleQuoteCancel = () => {
this.props.onQuoteCancel?.();
}
_properStatus () { _properStatus () {
const { status } = this.props; const { status } = this.props;
@ -573,6 +582,16 @@ class Status extends ImmutablePureComponent {
<DisplayName account={status.get('account')} /> <DisplayName account={status.get('account')} />
</Link> </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> </div>
{matchedFilters && <FilterWarning title={matchedFilters.join(', ')} expanded={this.state.showDespiteFilter} onClick={this.handleFilterToggle} />} {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 { defineMessages, injectIntl } from 'react-intl';
import classNames from 'classnames';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes'; 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 BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react'; import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.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 StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
import StarBorderIcon from '@/material-icons/400-24px/star.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 { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { WithRouterPropTypes } from 'mastodon/utils/react_router';
@ -30,6 +24,7 @@ import { me } from '../initial_state';
import { IconButton } from './icon_button'; import { IconButton } from './icon_button';
import { isFeatureEnabled } from '../utils/environment'; import { isFeatureEnabled } from '../utils/environment';
import { ReblogButton } from './status/reblog_button';
const messages = defineMessages({ const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' }, delete: { id: 'status.delete', defaultMessage: 'Delete' },
@ -43,10 +38,6 @@ const messages = defineMessages({
share: { id: 'status.share', defaultMessage: 'Share' }, share: { id: 'status.share', defaultMessage: 'Share' },
more: { id: 'status.more', defaultMessage: 'More' }, more: { id: 'status.more', defaultMessage: 'More' },
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' }, 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' }, favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' }, removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
@ -85,10 +76,9 @@ class StatusActionBar extends ImmutablePureComponent {
identity: identityContextPropShape, identity: identityContextPropShape,
status: ImmutablePropTypes.map.isRequired, status: ImmutablePropTypes.map.isRequired,
relationship: ImmutablePropTypes.record, relationship: ImmutablePropTypes.record,
quotedAccountId: ImmutablePropTypes.string, quotedAccountId: PropTypes.string,
onReply: PropTypes.func, onReply: PropTypes.func,
onFavourite: PropTypes.func, onFavourite: PropTypes.func,
onReblog: PropTypes.func,
onDelete: PropTypes.func, onDelete: PropTypes.func,
onRevokeQuote: PropTypes.func, onRevokeQuote: PropTypes.func,
onQuotePolicyChange: 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 = () => { handleBookmarkClick = () => {
this.props.onBookmark(this.props.status); this.props.onBookmark(this.props.status);
}; };
@ -377,25 +357,6 @@ class StatusActionBar extends ImmutablePureComponent {
replyTitle = intl.formatMessage(messages.replyAll); 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 bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite); const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']); 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')} /> <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>
<div className='status__action-bar__button-wrapper'> <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>
<div className='status__action-bar__button-wrapper'> <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} /> <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 Status from '../components/status';
import { deleteModal } from '../initial_state'; import { deleteModal } from '../initial_state';
import { makeGetStatus, makeGetPictureInPicture } from '../selectors'; import { makeGetStatus, makeGetPictureInPicture } from '../selectors';
import { quoteComposeCancel } from '../actions/compose_typed';
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getStatus = makeGetStatus(); const getStatus = makeGetStatus();
@ -111,6 +112,12 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
} }
}, },
onQuoteCancel() {
if (contextType === 'compose') {
dispatch(quoteComposeCancel());
}
},
onRevokeQuote (status) { onRevokeQuote (status) {
dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_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 { ReplyIndicator } from './reply_indicator';
import { UploadForm } from './upload_form'; import { UploadForm } from './upload_form';
import { Warning } from './warning'; 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'; 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}> <div className={classNames('compose-form__highlightable', { active: highlighted })} ref={this.setRef}>
<EditIndicator /> <EditIndicator />
<div className='compose-form__dropdowns'>
<PrivacyDropdownContainer disabled={this.props.isEditing} />
<LanguageDropdown />
</div>
{this.props.spoiler && ( {this.props.spoiler && (
<div className='spoiler-input'> <div className='spoiler-input'>
<div className='spoiler-input__border' /> <div className='spoiler-input__border' />
@ -284,11 +290,6 @@ class ComposeForm extends ImmutablePureComponent {
</div> </div>
)} )}
<div className='compose-form__dropdowns'>
<PrivacyDropdownContainer disabled={this.props.isEditing} />
<LanguageDropdown />
</div>
<AutosuggestTextarea <AutosuggestTextarea
ref={this.textareaRef} ref={this.textareaRef}
placeholder={intl.formatMessage(messages.placeholder)} placeholder={intl.formatMessage(messages.placeholder)}
@ -304,10 +305,12 @@ class ComposeForm extends ImmutablePureComponent {
onPaste={onPaste} onPaste={onPaste}
autoFocus={autoFocus} autoFocus={autoFocus}
lang={this.props.lang} lang={this.props.lang}
className='compose-form__input'
/> />
<UploadForm /> <UploadForm />
<PollForm /> <PollForm />
<ComposeQuotedStatus />
<div className='compose-form__footer'> <div className='compose-form__footer'>
<div className='compose-form__actions'> <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 { addPoll, removePoll } from '../../../actions/compose';
import PollButton from '../components/poll_button'; import PollButton from '../components/poll_button';
const mapStateToProps = state => ({ const mapStateToProps = state => {
disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0), const readyAttachmentsSize = state.compose.get('media_attachments').size ?? 0;
active: state.getIn(['compose', 'poll']) !== null, 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 => ({ const mapDispatchToProps = dispatch => ({

View File

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

View File

@ -3,23 +3,16 @@ import { PureComponent } from 'react';
import { defineMessages, injectIntl } from 'react-intl'; import { defineMessages, injectIntl } from 'react-intl';
import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react'; import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react'; import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.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 StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
import StarBorderIcon from '@/material-icons/400-24px/star.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 { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; 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 { Dropdown } from 'mastodon/components/dropdown_menu';
import { me } from '../../../initial_state'; import { me } from '../../../initial_state';
import { isFeatureEnabled } from '@/mastodon/utils/environment'; import { isFeatureEnabled } from '@/mastodon/utils/environment';
import { ReblogButton } from '@/mastodon/components/status/reblog_button';
const messages = defineMessages({ const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' }, delete: { id: 'status.delete', defaultMessage: 'Delete' },
@ -35,10 +29,6 @@ const messages = defineMessages({
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' }, direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' }, 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' }, favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' }, removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
@ -313,31 +303,15 @@ class ActionBar extends PureComponent {
replyIconComponent = ReplyAllIcon; 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 bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite); const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
return ( return (
<div className='detailed-status__action-bar'> <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 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='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> <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.lists": "Siyahılar",
"column.mutes": "Səssizləşdirilmiş istifadəçilər", "column.mutes": "Səssizləşdirilmiş istifadəçilər",
"column.notifications": "Bildirişlə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.public": "Federasiya zaman qrafiki",
"column_back_button.label": "Geriyə", "column_back_button.label": "Geriyə",
"column_header.hide_settings": "Ayarları gizlət", "column_header.hide_settings": "Ayarları gizlət",
@ -483,6 +483,7 @@
"keyboard_shortcuts.my_profile": "Profilinizi açın", "keyboard_shortcuts.my_profile": "Profilinizi açın",
"keyboard_shortcuts.notifications": "Bildirişlər sütununu aç", "keyboard_shortcuts.notifications": "Bildirişlər sütununu aç",
"keyboard_shortcuts.open_media": "Medianı 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.profile": "Müəllifin profilini aç",
"keyboard_shortcuts.reply": "Göndərişə cavab ver", "keyboard_shortcuts.reply": "Göndərişə cavab ver",
"keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç", "keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç",
@ -863,6 +864,7 @@
"status.mute": "@{name} - səssizə al", "status.mute": "@{name} - səssizə al",
"status.mute_conversation": "Danışığın səsini kəs", "status.mute_conversation": "Danışığın səsini kəs",
"status.open": "Bu göndərişi genişləndir", "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.filtered": "Bəzi filtrlərinizə görə gizlidir",
"status.quote_error.not_available": "Göndəriş əlçatmazdır", "status.quote_error.not_available": "Göndəriş əlçatmazdır",
"status.quote_error.pending_approval": "Göndəriş gözləmədədir", "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.translated_from_with": "{provider} ilə {lang} dilindən tərcümə edilib",
"status.uncached_media_warning": "Önizləmə mövcud deyil", "status.uncached_media_warning": "Önizləmə mövcud deyil",
"status.unmute_conversation": "Danışığın səsini aç", "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.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.save": "Dəyişiklikləri saxla",
"subscribed_languages.target": "{target} üçün abunə olunmuş dilləri dəyişdir", "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_handle": "Ваш ідэнтыфікатар:",
"domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.", "domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.",
"domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", "domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.",
"dropdown.empty": "Выбраць варыянт",
"embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.", "embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.",
"embed.preview": "Вось як гэта будзе выглядаць:", "embed.preview": "Вось як гэта будзе выглядаць:",
"emoji_button.activity": "Актыўнасць", "emoji_button.activity": "Актыўнасць",
@ -879,11 +880,13 @@
"status.mute_conversation": "Ігнараваць размову", "status.mute_conversation": "Ігнараваць размову",
"status.open": "Разгарнуць гэты допіс", "status.open": "Разгарнуць гэты допіс",
"status.pin": "Замацаваць у профілі", "status.pin": "Замацаваць у профілі",
"status.quote.cancel": "Адмяніць цытаванне",
"status.quote_error.filtered": "Схавана адным з Вашых фільтраў", "status.quote_error.filtered": "Схавана адным з Вашых фільтраў",
"status.quote_error.not_available": "Допіс недаступны", "status.quote_error.not_available": "Допіс недаступны",
"status.quote_error.pending_approval": "Допіс чакае пацвярджэння", "status.quote_error.pending_approval": "Допіс чакае пацвярджэння",
"status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.", "status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.",
"status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой", "status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой",
"status.quote_policy_change": "Змяніць, хто можа цытаваць",
"status.quote_post_author": "Цытаваў допіс @{name}", "status.quote_post_author": "Цытаваў допіс @{name}",
"status.read_more": "Чытаць болей", "status.read_more": "Чытаць болей",
"status.reblog": "Пашырыць", "status.reblog": "Пашырыць",
@ -959,5 +962,17 @@
"video.skip_forward": "Праматаць уперад", "video.skip_forward": "Праматаць уперад",
"video.unmute": "Уключыць гук", "video.unmute": "Уключыць гук",
"video.volume_down": "Паменшыць гучнасць", "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.blocks": "Модерирани сървъри",
"about.contact": "За контакти:", "about.contact": "За контакти:",
"about.default_locale": "По подразбиране",
"about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.", "about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Няма налична причина", "about.domain_blocks.no_reason_available": "Няма налична причина",
"about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.", "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.",
@ -244,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Премахване на последовател", "confirmations.remove_from_followers.confirm": "Премахване на последовател",
"confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?", "confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?",
"confirmations.remove_from_followers.title": "Премахвате ли последовател?", "confirmations.remove_from_followers.title": "Премахвате ли последовател?",
"confirmations.revoke_quote.confirm": "Премахване на публикация",
"confirmations.revoke_quote.message": "Действието е неотменимо.",
"confirmations.revoke_quote.title": "Премахвате ли публикацията?",
"confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.confirm": "Без следване",
"confirmations.unfollow.message": "Наистина ли искате вече да не следвате {name}?", "confirmations.unfollow.message": "Наистина ли искате вече да не следвате {name}?",
"confirmations.unfollow.title": "Спирате ли да следвате потребителя?", "confirmations.unfollow.title": "Спирате ли да следвате потребителя?",
@ -288,6 +292,7 @@
"domain_pill.your_handle": "Вашият адрес:", "domain_pill.your_handle": "Вашият адрес:",
"domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.", "domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.",
"domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.", "domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.",
"dropdown.empty": "Изберете възможност",
"embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.", "embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.",
"embed.preview": "Ето как ще изглежда:", "embed.preview": "Ето как ще изглежда:",
"emoji_button.activity": "Дейност", "emoji_button.activity": "Дейност",
@ -493,6 +498,8 @@
"keyboard_shortcuts.translate": "за превод на публикация", "keyboard_shortcuts.translate": "за превод на публикация",
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене", "keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
"keyboard_shortcuts.up": "Преместване нагоре в списъка", "keyboard_shortcuts.up": "Преместване нагоре в списъка",
"learn_more_link.got_it": "Разбрах",
"learn_more_link.learn_more": "Научете повече",
"lightbox.close": "Затваряне", "lightbox.close": "Затваряне",
"lightbox.next": "Напред", "lightbox.next": "Напред",
"lightbox.previous": "Назад", "lightbox.previous": "Назад",
@ -587,6 +594,7 @@
"notification.label.mention": "Споменаване", "notification.label.mention": "Споменаване",
"notification.label.private_mention": "Частно споменаване", "notification.label.private_mention": "Частно споменаване",
"notification.label.private_reply": "Личен отговор", "notification.label.private_reply": "Личен отговор",
"notification.label.quote": "{name} цитира ваша публикация",
"notification.label.reply": "Отговор", "notification.label.reply": "Отговор",
"notification.mention": "Споменаване", "notification.mention": "Споменаване",
"notification.mentioned_you": "{name} ви спомена", "notification.mentioned_you": "{name} ви спомена",
@ -644,6 +652,7 @@
"notifications.column_settings.mention": "Споменавания:", "notifications.column_settings.mention": "Споменавания:",
"notifications.column_settings.poll": "Резултати от анкета:", "notifications.column_settings.poll": "Резултати от анкета:",
"notifications.column_settings.push": "Изскачащи известия", "notifications.column_settings.push": "Изскачащи известия",
"notifications.column_settings.quote": "Цитати:",
"notifications.column_settings.reblog": "Подсилвания:", "notifications.column_settings.reblog": "Подсилвания:",
"notifications.column_settings.show": "Показване в колоната", "notifications.column_settings.show": "Показване в колоната",
"notifications.column_settings.sound": "Пускане на звук", "notifications.column_settings.sound": "Пускане на звук",
@ -834,6 +843,8 @@
"status.bookmark": "Отмятане", "status.bookmark": "Отмятане",
"status.cancel_reblog_private": "Край на подсилването", "status.cancel_reblog_private": "Край на подсилването",
"status.cannot_reblog": "Публикацията не може да се подсилва", "status.cannot_reblog": "Публикацията не може да се подсилва",
"status.context.load_new_replies": "Има нови отговори",
"status.context.loading": "Проверка за още отговори",
"status.continued_thread": "Продължена нишка", "status.continued_thread": "Продължена нишка",
"status.copy": "Копиране на връзката към публикация", "status.copy": "Копиране на връзката към публикация",
"status.delete": "Изтриване", "status.delete": "Изтриване",
@ -860,6 +871,10 @@
"status.open": "Разширяване на публикацията", "status.open": "Разширяване на публикацията",
"status.pin": "Закачане в профила", "status.pin": "Закачане в профила",
"status.quote_error.filtered": "Скрито поради един от филтрите ви", "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.read_more": "Още за четене",
"status.reblog": "Подсилване", "status.reblog": "Подсилване",
"status.reblog_private": "Подсилване с оригиналната видимост", "status.reblog_private": "Подсилване с оригиналната видимост",
@ -874,6 +889,7 @@
"status.reply": "Отговор", "status.reply": "Отговор",
"status.replyAll": "Отговор на нишка", "status.replyAll": "Отговор на нишка",
"status.report": "Докладване на @{name}", "status.report": "Докладване на @{name}",
"status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}",
"status.sensitive_warning": "Деликатно съдържание", "status.sensitive_warning": "Деликатно съдържание",
"status.share": "Споделяне", "status.share": "Споделяне",
"status.show_less_all": "Показване на по-малко за всички", "status.show_less_all": "Показване на по-малко за всички",
@ -933,5 +949,15 @@
"video.skip_forward": "Прескок напред", "video.skip_forward": "Прескок напред",
"video.unmute": "Без заглушаване", "video.unmute": "Без заглушаване",
"video.volume_down": "Намаляване на звука", "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.confirm": "Elimina el seguidor",
"confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?", "confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?",
"confirmations.remove_from_followers.title": "Eliminem el seguidor?", "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.message": "Aquesta acció no es pot desfer.",
"confirmations.revoke_quote.title": "Eliminar la publicació?",
"confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.confirm": "Deixa de seguir",
"confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
"confirmations.unfollow.title": "Deixar de seguir l'usuari?", "confirmations.unfollow.title": "Deixar de seguir l'usuari?",
@ -290,6 +292,7 @@
"domain_pill.your_handle": "El vostre identificador:", "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_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.", "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.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
"embed.preview": "Aquest aspecte tindrà:", "embed.preview": "Aquest aspecte tindrà:",
"emoji_button.activity": "Activitat", "emoji_button.activity": "Activitat",
@ -876,11 +879,13 @@
"status.mute_conversation": "Silencia la conversa", "status.mute_conversation": "Silencia la conversa",
"status.open": "Amplia el tut", "status.open": "Amplia el tut",
"status.pin": "Fixa en el perfil", "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.filtered": "No es mostra a causa d'un dels vostres filtres",
"status.quote_error.not_available": "Publicació no disponible", "status.quote_error.not_available": "Publicació no disponible",
"status.quote_error.pending_approval": "Publicació pendent", "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.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_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.quote_post_author": "S'ha citat una publicació de @{name}",
"status.read_more": "Més informació", "status.read_more": "Més informació",
"status.reblog": "Impulsa", "status.reblog": "Impulsa",
@ -956,5 +961,17 @@
"video.skip_forward": "Salta endavant", "video.skip_forward": "Salta endavant",
"video.unmute": "Deixa de silenciar", "video.unmute": "Deixa de silenciar",
"video.volume_down": "Abaixa el volum", "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_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_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.", "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.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:", "embed.preview": "Takhle to bude vypadat:",
"emoji_button.activity": "Aktivita", "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": "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.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_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.quote_post_author": "Citovali příspěvek od @{name}",
"status.read_more": "Číst více", "status.read_more": "Číst více",
"status.reblog": "Boostnout", "status.reblog": "Boostnout",
@ -959,5 +961,17 @@
"video.skip_forward": "Přeskočit vpřed", "video.skip_forward": "Přeskočit vpřed",
"video.unmute": "Zrušit ztlumení", "video.unmute": "Zrušit ztlumení",
"video.volume_down": "Snížit hlasitost", "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.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.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.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.confirm": "Dad-ddilyn",
"confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?", "confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?",
"confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?", "confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?",
@ -289,6 +292,7 @@
"domain_pill.your_handle": "Eich handlen:", "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_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.", "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.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:", "embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch", "emoji_button.activity": "Gweithgarwch",
@ -498,6 +502,8 @@
"keyboard_shortcuts.translate": "i gyfieithu postiad", "keyboard_shortcuts.translate": "i gyfieithu postiad",
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio", "keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr", "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.close": "Cau",
"lightbox.next": "Nesaf", "lightbox.next": "Nesaf",
"lightbox.previous": "Blaenorol", "lightbox.previous": "Blaenorol",
@ -558,7 +564,7 @@
"navigation_bar.favourites": "Ffefrynnau", "navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau wedi'u tewi", "navigation_bar.filters": "Geiriau wedi'u tewi",
"navigation_bar.follow_requests": "Ceisiadau dilyn", "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.follows_and_followers": "Yn dilyn a dilynwyr",
"navigation_bar.import_export": "Mewnforio ac allforio", "navigation_bar.import_export": "Mewnforio ac allforio",
"navigation_bar.lists": "Rhestrau", "navigation_bar.lists": "Rhestrau",
@ -598,6 +604,7 @@
"notification.label.mention": "Crybwyll", "notification.label.mention": "Crybwyll",
"notification.label.private_mention": "Crybwyll preifat", "notification.label.private_mention": "Crybwyll preifat",
"notification.label.private_reply": "Ymateb preifat", "notification.label.private_reply": "Ymateb preifat",
"notification.label.quote": "Mae {name} wedi dyfynnu eich postiad",
"notification.label.reply": "Ymateb", "notification.label.reply": "Ymateb",
"notification.mention": "Crybwyll", "notification.mention": "Crybwyll",
"notification.mentioned_you": "Rydych wedi'ch crybwyll gan {name}", "notification.mentioned_you": "Rydych wedi'ch crybwyll gan {name}",
@ -655,6 +662,7 @@
"notifications.column_settings.mention": "Crybwylliadau:", "notifications.column_settings.mention": "Crybwylliadau:",
"notifications.column_settings.poll": "Canlyniadau pleidlais:", "notifications.column_settings.poll": "Canlyniadau pleidlais:",
"notifications.column_settings.push": "Hysbysiadau gwthio", "notifications.column_settings.push": "Hysbysiadau gwthio",
"notifications.column_settings.quote": "Dyfyniadau:",
"notifications.column_settings.reblog": "Hybiau:", "notifications.column_settings.reblog": "Hybiau:",
"notifications.column_settings.show": "Dangos yn y golofn", "notifications.column_settings.show": "Dangos yn y golofn",
"notifications.column_settings.sound": "Chwarae sain", "notifications.column_settings.sound": "Chwarae sain",
@ -845,6 +853,8 @@
"status.bookmark": "Nod tudalen", "status.bookmark": "Nod tudalen",
"status.cancel_reblog_private": "Dadhybu", "status.cancel_reblog_private": "Dadhybu",
"status.cannot_reblog": "Does dim modd hybu'r postiad hwn", "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.continued_thread": "Edefyn parhaus",
"status.copy": "Copïo dolen i'r post", "status.copy": "Copïo dolen i'r post",
"status.delete": "Dileu", "status.delete": "Dileu",
@ -871,6 +881,12 @@
"status.open": "Ehangu'r post hwn", "status.open": "Ehangu'r post hwn",
"status.pin": "Pinio ar y proffil", "status.pin": "Pinio ar y proffil",
"status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr", "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.read_more": "Darllen rhagor",
"status.reblog": "Hybu", "status.reblog": "Hybu",
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
@ -885,6 +901,7 @@
"status.reply": "Ymateb", "status.reply": "Ymateb",
"status.replyAll": "Ateb edefyn", "status.replyAll": "Ateb edefyn",
"status.report": "Adrodd ar @{name}", "status.report": "Adrodd ar @{name}",
"status.revoke_quote": "Dileu fy mhostiad o bostiad @{name}",
"status.sensitive_warning": "Cynnwys sensitif", "status.sensitive_warning": "Cynnwys sensitif",
"status.share": "Rhannu", "status.share": "Rhannu",
"status.show_less_all": "Dangos llai i bawb", "status.show_less_all": "Dangos llai i bawb",
@ -944,5 +961,17 @@
"video.skip_forward": "Symud ymlaen", "video.skip_forward": "Symud ymlaen",
"video.unmute": "Dad-dewi", "video.unmute": "Dad-dewi",
"video.volume_down": "Lefel sain i lawr", "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_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_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.", "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.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
"embed.preview": "Sådan kommer det til at se ud:", "embed.preview": "Sådan kommer det til at se ud:",
"emoji_button.activity": "Aktivitet", "emoji_button.activity": "Aktivitet",
@ -884,6 +885,7 @@
"status.quote_error.pending_approval": "Afventende indlæg", "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.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_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.quote_post_author": "Citerede et indlæg fra @{name}",
"status.read_more": "Læs mere", "status.read_more": "Læs mere",
"status.reblog": "Fremhæv", "status.reblog": "Fremhæv",
@ -959,5 +961,17 @@
"video.skip_forward": "Overspring fremad", "video.skip_forward": "Overspring fremad",
"video.unmute": "Slå lyd tl", "video.unmute": "Slå lyd tl",
"video.volume_down": "Lydstyrke ned", "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.mute_short": "Stummschalten",
"account.muted": "Stummgeschaltet", "account.muted": "Stummgeschaltet",
"account.muting": "Stummgeschaltet", "account.muting": "Stummgeschaltet",
"account.mutual": "Ihr folgt euch", "account.mutual": "Ihr folgt einander",
"account.no_bio": "Keine Beschreibung verfügbar.", "account.no_bio": "Keine Beschreibung verfügbar.",
"account.open_original_page": "Ursprüngliche Seite öffnen", "account.open_original_page": "Ursprüngliche Seite öffnen",
"account.posts": "Beiträge", "account.posts": "Beiträge",
@ -880,6 +880,7 @@
"status.mute_conversation": "Unterhaltung stummschalten", "status.mute_conversation": "Unterhaltung stummschalten",
"status.open": "Beitrag öffnen", "status.open": "Beitrag öffnen",
"status.pin": "Im Profil anheften", "status.pin": "Im Profil anheften",
"status.quote.cancel": "Zitat abbrechen",
"status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter", "status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter",
"status.quote_error.not_available": "Beitrag nicht verfügbar", "status.quote_error.not_available": "Beitrag nicht verfügbar",
"status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend", "status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Το πλήρες όνομα χρήστη σου:", "domain_pill.your_handle": "Το πλήρες όνομα χρήστη σου:",
"domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου.", "domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου.",
"domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.", "domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.",
"dropdown.empty": "Διαλέξτε μια επιλογή",
"embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.", "embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.",
"embed.preview": "Ορίστε πως θα φαίνεται:", "embed.preview": "Ορίστε πως θα φαίνεται:",
"emoji_button.activity": "Δραστηριότητα", "emoji_button.activity": "Δραστηριότητα",
@ -879,11 +880,13 @@
"status.mute_conversation": "Σίγαση συνομιλίας", "status.mute_conversation": "Σίγαση συνομιλίας",
"status.open": "Επέκταση ανάρτησης", "status.open": "Επέκταση ανάρτησης",
"status.pin": "Καρφίτσωσε στο προφίλ", "status.pin": "Καρφίτσωσε στο προφίλ",
"status.quote.cancel": "Ακύρωση παράθεσης",
"status.quote_error.filtered": "Κρυφό λόγω ενός από τα φίλτρα σου", "status.quote_error.filtered": "Κρυφό λόγω ενός από τα φίλτρα σου",
"status.quote_error.not_available": "Ανάρτηση μη διαθέσιμη", "status.quote_error.not_available": "Ανάρτηση μη διαθέσιμη",
"status.quote_error.pending_approval": "Ανάρτηση σε αναμονή", "status.quote_error.pending_approval": "Ανάρτηση σε αναμονή",
"status.quote_error.pending_approval_popout.body": "Οι παραθέσεις που μοιράζονται στο Fediverse μπορεί να χρειαστούν χρόνο για να εμφανιστούν, καθώς διαφορετικοί διακομιστές έχουν διαφορετικά πρωτόκολλα.", "status.quote_error.pending_approval_popout.body": "Οι παραθέσεις που μοιράζονται στο Fediverse μπορεί να χρειαστούν χρόνο για να εμφανιστούν, καθώς διαφορετικοί διακομιστές έχουν διαφορετικά πρωτόκολλα.",
"status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι", "status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι",
"status.quote_policy_change": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
"status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}", "status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}",
"status.read_more": "Διάβασε περισότερα", "status.read_more": "Διάβασε περισότερα",
"status.reblog": "Ενίσχυση", "status.reblog": "Ενίσχυση",
@ -959,5 +962,17 @@
"video.skip_forward": "Παράλειψη εμπρός", "video.skip_forward": "Παράλειψη εμπρός",
"video.unmute": "Άρση σίγασης", "video.unmute": "Άρση σίγασης",
"video.volume_down": "Μείωση έντασης", "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_account": "Open moderation interface for @{name}",
"status.admin_domain": "Open moderation interface for {domain}", "status.admin_domain": "Open moderation interface for {domain}",
"status.admin_status": "Open this post in the moderation interface", "status.admin_status": "Open this post in the moderation interface",
"status.all_disabled": "Boosts and quotes are disabled",
"status.block": "Block @{name}", "status.block": "Block @{name}",
"status.bookmark": "Bookmark", "status.bookmark": "Bookmark",
"status.cancel_reblog_private": "Unboost", "status.cancel_reblog_private": "Unboost",
"status.cannot_quote": "Author has disabled quoting on this post",
"status.cannot_reblog": "This post cannot be boosted", "status.cannot_reblog": "This post cannot be boosted",
"status.context.load_new_replies": "New replies available", "status.context.load_new_replies": "New replies available",
"status.context.loading": "Checking for more replies", "status.context.loading": "Checking for more replies",
@ -880,6 +882,8 @@
"status.mute_conversation": "Mute conversation", "status.mute_conversation": "Mute conversation",
"status.open": "Expand this post", "status.open": "Expand this post",
"status.pin": "Pin on profile", "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.filtered": "Hidden due to one of your filters",
"status.quote_error.not_available": "Post unavailable", "status.quote_error.not_available": "Post unavailable",
"status.quote_error.pending_approval": "Post pending", "status.quote_error.pending_approval": "Post pending",
@ -887,6 +891,7 @@
"status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm", "status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm",
"status.quote_policy_change": "Change who can quote", "status.quote_policy_change": "Change who can quote",
"status.quote_post_author": "Quoted a post by @{name}", "status.quote_post_author": "Quoted a post by @{name}",
"status.quote_private": "Private posts cannot be quoted",
"status.read_more": "Read more", "status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost with original visibility", "status.reblog_private": "Boost with original visibility",

View File

@ -287,6 +287,7 @@
"domain_pill.your_handle": "Via identigo:", "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_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.", "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.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.",
"embed.preview": "Ĝi aperos tiel:", "embed.preview": "Ĝi aperos tiel:",
"emoji_button.activity": "Agadoj", "emoji_button.activity": "Agadoj",
@ -940,5 +941,16 @@
"video.skip_forward": "Preterpasi antaŭen", "video.skip_forward": "Preterpasi antaŭen",
"video.unmute": "Ne plu silentigi", "video.unmute": "Ne plu silentigi",
"video.volume_down": "Laŭteco Malpliigi", "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.mute_conversation": "Silenciar conversación",
"status.open": "Expandir este mensaje", "status.open": "Expandir este mensaje",
"status.pin": "Fijar en el perfil", "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.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Mensaje no disponible", "status.quote_error.not_available": "Mensaje no disponible",
"status.quote_error.pending_approval": "Mensaje pendiente", "status.quote_error.pending_approval": "Mensaje pendiente",

View File

@ -292,6 +292,7 @@
"domain_pill.your_handle": "Tu alias:", "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_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.", "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.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:", "embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad", "emoji_button.activity": "Actividad",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversación", "status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir estado", "status.open": "Expandir estado",
"status.pin": "Fijar", "status.pin": "Fijar",
"status.quote.cancel": "Cancelar cita",
"status.quote_error.filtered": "Oculto debido a uno de tus filtros", "status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Publicación no disponible", "status.quote_error.not_available": "Publicación no disponible",
"status.quote_error.pending_approval": "Publicación pendiente", "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.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_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.quote_post_author": "Ha citado una publicación de @{name}",
"status.read_more": "Leer más", "status.read_more": "Leer más",
"status.reblog": "Impulsar", "status.reblog": "Impulsar",
@ -959,5 +962,17 @@
"video.skip_forward": "Saltar adelante", "video.skip_forward": "Saltar adelante",
"video.unmute": "Dejar de silenciar", "video.unmute": "Dejar de silenciar",
"video.volume_down": "Bajar el volumen", "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_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_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.", "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.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:", "embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad", "emoji_button.activity": "Actividad",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversación", "status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir publicación", "status.open": "Expandir publicación",
"status.pin": "Fijar", "status.pin": "Fijar",
"status.quote.cancel": "Cancelar cita",
"status.quote_error.filtered": "Oculto debido a uno de tus filtros", "status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Publicación no disponible", "status.quote_error.not_available": "Publicación no disponible",
"status.quote_error.pending_approval": "Publicación pendiente", "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.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_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.quote_post_author": "Ha citado una publicación de @{name}",
"status.read_more": "Leer más", "status.read_more": "Leer más",
"status.reblog": "Impulsar", "status.reblog": "Impulsar",
@ -959,5 +962,17 @@
"video.skip_forward": "Adelantar", "video.skip_forward": "Adelantar",
"video.unmute": "Dejar de silenciar", "video.unmute": "Dejar de silenciar",
"video.volume_down": "Bajar volumen", "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_at": "آخرین فرسته در {date}",
"account.featured_tags.last_status_never": "بدون فرسته", "account.featured_tags.last_status_never": "بدون فرسته",
"account.follow": "پی‌گرفتن", "account.follow": "پی‌گرفتن",
"account.follow_back": "دنبال کردن متقابل", "account.follow_back": "پی‌گیری متقابل",
"account.followers": "پی‌گیرندگان", "account.followers": "پی‌گیرندگان",
"account.followers.empty": "هنوز کسی پی‌گیر این کاربر نیست.", "account.followers.empty": "هنوز کسی پی‌گیر این کاربر نیست.",
"account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}", "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": "پی می‌گیرید",
"account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}", "account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}",
"account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.", "account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.",
@ -292,6 +292,7 @@
"domain_pill.your_handle": "شناسه‌تان:", "domain_pill.your_handle": "شناسه‌تان:",
"domain_pill.your_server": "خانهٔ رقمیتان. جایی که همهٔ فرسته‌هایتان می‌زیند. دوستش ندارید؟ در هر زمان کارسازتان را جابه‌جا کرده و پی‌گیرندگانتان را نیز بیاورید.", "domain_pill.your_server": "خانهٔ رقمیتان. جایی که همهٔ فرسته‌هایتان می‌زیند. دوستش ندارید؟ در هر زمان کارسازتان را جابه‌جا کرده و پی‌گیرندگانتان را نیز بیاورید.",
"domain_pill.your_username": "شناسهٔ یکتایتان روی این کارساز. ممکن است کاربرانی با نام کاربری مشابه روی کارسازهای دیگر باشند.", "domain_pill.your_username": "شناسهٔ یکتایتان روی این کارساز. ممکن است کاربرانی با نام کاربری مشابه روی کارسازهای دیگر باشند.",
"dropdown.empty": "انتخاب یک گزینه",
"embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.", "embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.",
"embed.preview": "این گونه دیده خواهد شد:", "embed.preview": "این گونه دیده خواهد شد:",
"emoji_button.activity": "فعالیت", "emoji_button.activity": "فعالیت",
@ -879,9 +880,13 @@
"status.mute_conversation": "خموشاندن گفت‌وگو", "status.mute_conversation": "خموشاندن گفت‌وگو",
"status.open": "گسترش این فرسته", "status.open": "گسترش این فرسته",
"status.pin": "سنجاق به نمایه", "status.pin": "سنجاق به نمایه",
"status.quote.cancel": "لغو نقل",
"status.quote_error.filtered": "نهفته بنا بر یکی از پالایه‌هایتان", "status.quote_error.filtered": "نهفته بنا بر یکی از پالایه‌هایتان",
"status.quote_error.not_available": "فرسته در دسترس نیست", "status.quote_error.not_available": "فرسته در دسترس نیست",
"status.quote_error.pending_approval": "فرسته منتظر",
"status.quote_error.pending_approval_popout.body": "نقل‌قول‌هایی که در سراسر فدیورس هم‌رسانی می‌شوند ممکن است زمان‌بر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوه‌نامه‌های متفاوتی استفاده می‌کنند.", "status.quote_error.pending_approval_popout.body": "نقل‌قول‌هایی که در سراسر فدیورس هم‌رسانی می‌شوند ممکن است زمان‌بر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوه‌نامه‌های متفاوتی استفاده می‌کنند.",
"status.quote_error.pending_approval_popout.title": "منتظر نقل؟ خونسرد بمانید",
"status.quote_policy_change": "تغییر کسانی که می‌توانند نقل کنند",
"status.quote_post_author": "فرسته‌ای از @{name} نقل شد", "status.quote_post_author": "فرسته‌ای از @{name} نقل شد",
"status.read_more": "بیشتر بخوانید", "status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت", "status.reblog": "تقویت",
@ -957,5 +962,17 @@
"video.skip_forward": "پرش به پیش", "video.skip_forward": "پرش به پیش",
"video.unmute": "ناخموشی", "video.unmute": "ناخموشی",
"video.volume_down": "کاهش حجم صدا", "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_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_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.", "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.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
"embed.preview": "Tältä se näyttää:", "embed.preview": "Tältä se näyttää:",
"emoji_button.activity": "Aktiviteetit", "emoji_button.activity": "Aktiviteetit",
@ -879,11 +880,13 @@
"status.mute_conversation": "Mykistä keskustelu", "status.mute_conversation": "Mykistä keskustelu",
"status.open": "Laajenna julkaisu", "status.open": "Laajenna julkaisu",
"status.pin": "Kiinnitä profiiliin", "status.pin": "Kiinnitä profiiliin",
"status.quote.cancel": "Peruuta lainaus",
"status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia", "status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia",
"status.quote_error.not_available": "Julkaisu ei saatavilla", "status.quote_error.not_available": "Julkaisu ei saatavilla",
"status.quote_error.pending_approval": "Julkaisu odottaa", "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.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_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.quote_post_author": "Lainaa käyttäjän @{name} julkaisua",
"status.read_more": "Näytä enemmän", "status.read_more": "Näytä enemmän",
"status.reblog": "Tehosta", "status.reblog": "Tehosta",
@ -959,5 +962,17 @@
"video.skip_forward": "Siirry eteenpäin", "video.skip_forward": "Siirry eteenpäin",
"video.unmute": "Poista mykistys", "video.unmute": "Poista mykistys",
"video.volume_down": "Vähennä äänenvoimakkuutta", "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.mute_conversation": "Doyv samrøðu",
"status.open": "Víðka henda postin", "status.open": "Víðka henda postin",
"status.pin": "Ger fastan í vangan", "status.pin": "Ger fastan í vangan",
"status.quote.cancel": "Ógilda sitat",
"status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta", "status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta",
"status.quote_error.not_available": "Postur ikki tøkur", "status.quote_error.not_available": "Postur ikki tøkur",
"status.quote_error.pending_approval": "Postur bíðar", "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_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_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.", "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.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Seo an chuma a bheidh air:", "embed.preview": "Seo an chuma a bheidh air:",
"emoji_button.activity": "Gníomhaíocht", "emoji_button.activity": "Gníomhaíocht",
@ -884,6 +885,7 @@
"status.quote_error.pending_approval": "Post ar feitheamh", "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.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_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.quote_post_author": "Luaigh mé post le @{name}",
"status.read_more": "Léan a thuilleadh", "status.read_more": "Léan a thuilleadh",
"status.reblog": "Treisiú", "status.reblog": "Treisiú",
@ -959,5 +961,17 @@
"video.skip_forward": "Scipeáil ar aghaidh", "video.skip_forward": "Scipeáil ar aghaidh",
"video.unmute": "Díbhalbhú", "video.unmute": "Díbhalbhú",
"video.volume_down": "Toirt síos", "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_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_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.", "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.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.",
"embed.preview": "Vaise ver así:", "embed.preview": "Vaise ver así:",
"emoji_button.activity": "Actividade", "emoji_button.activity": "Actividade",
@ -879,11 +880,13 @@
"status.mute_conversation": "Silenciar conversa", "status.mute_conversation": "Silenciar conversa",
"status.open": "Estender esta publicación", "status.open": "Estender esta publicación",
"status.pin": "Fixar no perfil", "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.filtered": "Oculto debido a un dos teus filtros",
"status.quote_error.not_available": "Publicación non dispoñible", "status.quote_error.not_available": "Publicación non dispoñible",
"status.quote_error.pending_approval": "Publicación pendente", "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.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_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.quote_post_author": "Citou unha publicación de @{name}",
"status.read_more": "Ler máis", "status.read_more": "Ler máis",
"status.reblog": "Promover", "status.reblog": "Promover",
@ -959,5 +962,17 @@
"video.skip_forward": "Avanzar", "video.skip_forward": "Avanzar",
"video.unmute": "Non silenciar", "video.unmute": "Non silenciar",
"video.volume_down": "Baixar volume", "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_handle": "הכינוי שלך:",
"domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.", "domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.",
"domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.", "domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.",
"dropdown.empty": "בחירת אפשרות",
"embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.", "embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.",
"embed.preview": "דוגמא כיצד זה יראה:", "embed.preview": "דוגמא כיצד זה יראה:",
"emoji_button.activity": "פעילות", "emoji_button.activity": "פעילות",
@ -879,11 +880,13 @@
"status.mute_conversation": "השתקת שיחה", "status.mute_conversation": "השתקת שיחה",
"status.open": "הרחבת הודעה זו", "status.open": "הרחבת הודעה זו",
"status.pin": "הצמדה לפרופיל שלי", "status.pin": "הצמדה לפרופיל שלי",
"status.quote.cancel": "ביטול הודעת ציטוט",
"status.quote_error.filtered": "מוסתר בהתאם לסננים שלך", "status.quote_error.filtered": "מוסתר בהתאם לסננים שלך",
"status.quote_error.not_available": "ההודעה לא זמינה", "status.quote_error.not_available": "ההודעה לא זמינה",
"status.quote_error.pending_approval": "ההודעה בהמתנה לאישור", "status.quote_error.pending_approval": "ההודעה בהמתנה לאישור",
"status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.", "status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.",
"status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע", "status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע",
"status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך",
"status.quote_post_author": "ההודעה צוטטה על ידי @{name}", "status.quote_post_author": "ההודעה צוטטה על ידי @{name}",
"status.read_more": "לקרוא עוד", "status.read_more": "לקרוא עוד",
"status.reblog": "הדהוד", "status.reblog": "הדהוד",
@ -959,5 +962,17 @@
"video.skip_forward": "דילוג קדימה", "video.skip_forward": "דילוג קדימה",
"video.unmute": "ביטול השתקה", "video.unmute": "ביטול השתקה",
"video.volume_down": "הנמכת עוצמת השמע", "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.blocks": "Servitores moderate",
"about.contact": "Contacto:", "about.contact": "Contacto:",
"about.default_locale": "Default",
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", "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.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.", "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.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.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.domain_blocks.suspended.title": "Suspendite",
"about.language_label": "Lingua",
"about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.", "about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.",
"about.powered_by": "Rete social decentralisate, actionate per {mastodon}", "about.powered_by": "Rete social decentralisate, actionate per {mastodon}",
"about.rules": "Regulas del servitor", "about.rules": "Regulas del servitor",
@ -41,6 +43,7 @@
"account.followers": "Sequitores", "account.followers": "Sequitores",
"account.followers.empty": "Necuno seque ancora iste usator.", "account.followers.empty": "Necuno seque ancora iste usator.",
"account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}", "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": "Sequente",
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}", "account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
"account.follows.empty": "Iste usator non seque ancora alcuno.", "account.follows.empty": "Iste usator non seque ancora alcuno.",
@ -216,6 +219,13 @@
"confirmations.delete_list.confirm": "Deler", "confirmations.delete_list.confirm": "Deler",
"confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?", "confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
"confirmations.delete_list.title": "Deler 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.confirm": "Abandonar",
"confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?", "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", "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.confirm": "Remover sequitor",
"confirmations.remove_from_followers.message": "{name} non plus te sequera. Es tu secur de voler continuar?", "confirmations.remove_from_followers.message": "{name} non plus te sequera. Es tu secur de voler continuar?",
"confirmations.remove_from_followers.title": "Remover sequitor?", "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.confirm": "Non plus sequer",
"confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?", "confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?",
"confirmations.unfollow.title": "Cessar de sequer le usator?", "confirmations.unfollow.title": "Cessar de sequer le usator?",
@ -279,6 +292,7 @@
"domain_pill.your_handle": "Tu pseudonymo:", "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_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.", "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.instructions": "Incorpora iste message sur tu sito web con le codice sequente.",
"embed.preview": "Ecce como illlo parera:", "embed.preview": "Ecce como illlo parera:",
"emoji_button.activity": "Activitate", "emoji_button.activity": "Activitate",
@ -296,6 +310,8 @@
"emoji_button.search_results": "Resultatos de recerca", "emoji_button.search_results": "Resultatos de recerca",
"emoji_button.symbols": "Symbolos", "emoji_button.symbols": "Symbolos",
"emoji_button.travel": "Viages e locos", "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_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_hides_collections": "Le usator non ha rendite iste information disponibile",
"empty_column.account_suspended": "Conto suspendite", "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.copy_stacktrace": "Copiar le traciamento del pila al area de transferentia",
"errors.unexpected_crash.report_issue": "Reportar problema", "errors.unexpected_crash.report_issue": "Reportar problema",
"explore.suggested_follows": "Personas", "explore.suggested_follows": "Personas",
"explore.title": "In tendentia",
"explore.trending_links": "Novas", "explore.trending_links": "Novas",
"explore.trending_statuses": "Messages", "explore.trending_statuses": "Messages",
"explore.trending_tags": "Hashtags", "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_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.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.", "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", "generic.saved": "Salvate",
"getting_started.heading": "Prime passos", "getting_started.heading": "Prime passos",
"hashtag.admin_moderation": "Aperir le interfacie de moderation pro #{name}", "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.all": "e {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sin {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_followers": "Vider plus de sequitores sur {domain}",
"hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}", "hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}",
"hints.profiles.see_more_posts": "Vider plus de messages 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_reblogs": "Monstrar impulsos",
"home.column_settings.show_replies": "Monstrar responsas", "home.column_settings.show_replies": "Monstrar responsas",
"home.hide_announcements": "Celar annuncios", "home.hide_announcements": "Celar annuncios",
@ -477,6 +502,8 @@
"keyboard_shortcuts.translate": "a traducer un message", "keyboard_shortcuts.translate": "a traducer un message",
"keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca", "keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca",
"keyboard_shortcuts.up": "Displaciar in alto in le lista", "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.close": "Clauder",
"lightbox.next": "Sequente", "lightbox.next": "Sequente",
"lightbox.previous": "Precedente", "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_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.", "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.about": "A proposito",
"navigation_bar.account_settings": "Contrasigno e securitate",
"navigation_bar.administration": "Administration", "navigation_bar.administration": "Administration",
"navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate", "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.blocks": "Usatores blocate",
"navigation_bar.bookmarks": "Marcapaginas", "navigation_bar.bookmarks": "Marcapaginas",
"navigation_bar.direct": "Mentiones private", "navigation_bar.direct": "Mentiones private",
@ -537,13 +566,23 @@
"navigation_bar.follow_requests": "Requestas de sequimento", "navigation_bar.follow_requests": "Requestas de sequimento",
"navigation_bar.followed_tags": "Hashtags sequite", "navigation_bar.followed_tags": "Hashtags sequite",
"navigation_bar.follows_and_followers": "Sequites e sequitores", "navigation_bar.follows_and_followers": "Sequites e sequitores",
"navigation_bar.import_export": "Importar e exportar",
"navigation_bar.lists": "Listas", "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.logout": "Clauder session",
"navigation_bar.moderation": "Moderation", "navigation_bar.moderation": "Moderation",
"navigation_bar.more": "Plus",
"navigation_bar.mutes": "Usatores silentiate", "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.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.preferences": "Preferentias",
"navigation_bar.privacy_and_reach": "Confidentialitate e portata",
"navigation_bar.search": "Cercar", "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.", "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": "{name} ha reportate {target}",
"notification.admin.report_account": "{name} ha reportate {count, plural, one {un message} other {# messages}} de {target} per {category}", "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.mention": "Mention",
"notification.label.private_mention": "Mention private", "notification.label.private_mention": "Mention private",
"notification.label.private_reply": "Responsa private", "notification.label.private_reply": "Responsa private",
"notification.label.quote": "{name} ha citate tu message",
"notification.label.reply": "Responder", "notification.label.reply": "Responder",
"notification.mention": "Mention", "notification.mention": "Mention",
"notification.mentioned_you": "{name} te ha mentionate", "notification.mentioned_you": "{name} te ha mentionate",
@ -622,6 +662,7 @@
"notifications.column_settings.mention": "Mentiones:", "notifications.column_settings.mention": "Mentiones:",
"notifications.column_settings.poll": "Resultatos del sondage:", "notifications.column_settings.poll": "Resultatos del sondage:",
"notifications.column_settings.push": "Notificationes push", "notifications.column_settings.push": "Notificationes push",
"notifications.column_settings.quote": "Citationes:",
"notifications.column_settings.reblog": "Impulsos:", "notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Monstrar in columna", "notifications.column_settings.show": "Monstrar in columna",
"notifications.column_settings.sound": "Reproducer sono", "notifications.column_settings.sound": "Reproducer sono",
@ -770,6 +811,7 @@
"report_notification.categories.violation": "Violation del regulas", "report_notification.categories.violation": "Violation del regulas",
"report_notification.categories.violation_sentence": "violation del regulas", "report_notification.categories.violation_sentence": "violation del regulas",
"report_notification.open": "Aperir reporto", "report_notification.open": "Aperir reporto",
"search.clear": "Rader le recerca",
"search.no_recent_searches": "Nulle recercas recente", "search.no_recent_searches": "Nulle recercas recente",
"search.placeholder": "Cercar", "search.placeholder": "Cercar",
"search.quick_action.account_search": "Profilos correspondente a {x}", "search.quick_action.account_search": "Profilos correspondente a {x}",
@ -811,6 +853,8 @@
"status.bookmark": "Adder al marcapaginas", "status.bookmark": "Adder al marcapaginas",
"status.cancel_reblog_private": "Disfacer impulso", "status.cancel_reblog_private": "Disfacer impulso",
"status.cannot_reblog": "Iste message non pote esser impulsate", "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.continued_thread": "Continuation del discussion",
"status.copy": "Copiar ligamine a message", "status.copy": "Copiar ligamine a message",
"status.delete": "Deler", "status.delete": "Deler",
@ -836,6 +880,14 @@
"status.mute_conversation": "Silentiar conversation", "status.mute_conversation": "Silentiar conversation",
"status.open": "Expander iste message", "status.open": "Expander iste message",
"status.pin": "Fixar sur profilo", "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.read_more": "Leger plus",
"status.reblog": "Impulsar", "status.reblog": "Impulsar",
"status.reblog_private": "Impulsar con visibilitate original", "status.reblog_private": "Impulsar con visibilitate original",
@ -850,6 +902,7 @@
"status.reply": "Responder", "status.reply": "Responder",
"status.replyAll": "Responder al discussion", "status.replyAll": "Responder al discussion",
"status.report": "Reportar @{name}", "status.report": "Reportar @{name}",
"status.revoke_quote": "Remover mi message del message de @{name}",
"status.sensitive_warning": "Contento sensibile", "status.sensitive_warning": "Contento sensibile",
"status.share": "Compartir", "status.share": "Compartir",
"status.show_less_all": "Monstrar minus pro totes", "status.show_less_all": "Monstrar minus pro totes",
@ -865,9 +918,13 @@
"subscribed_languages.save": "Salvar le cambiamentos", "subscribed_languages.save": "Salvar le cambiamentos",
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}", "subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
"tabs_bar.home": "Initio", "tabs_bar.home": "Initio",
"tabs_bar.menu": "Menu",
"tabs_bar.notifications": "Notificationes", "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.effective_as_of": "In vigor a partir de {date}",
"terms_of_service.title": "Conditiones de servicio", "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.days": "{number, plural, one {# die} other {# dies}} restante",
"time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante", "time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante",
"time_remaining.minutes": "{number, plural, one {# minuta} other {# minutas}} 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", "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.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", "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.billion": "{count}B",
"units.short.million": "{count}M", "units.short.million": "{count}M",
"units.short.thousand": "{count}K", "units.short.thousand": "{count}K",
@ -902,7 +959,20 @@
"video.pause": "Pausa", "video.pause": "Pausa",
"video.play": "Reproducer", "video.play": "Reproducer",
"video.skip_backward": "Saltar a retro", "video.skip_backward": "Saltar a retro",
"video.skip_forward": "Avantiar",
"video.unmute": "Non plus silentiar", "video.unmute": "Non plus silentiar",
"video.volume_down": "Abassar le volumine", "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.mute_conversation": "Þagga niður í samtali",
"status.open": "Opna þessa færslu", "status.open": "Opna þessa færslu",
"status.pin": "Festa á notandasnið", "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.filtered": "Falið vegna einnar síu sem er virk",
"status.quote_error.not_available": "Færsla ekki tiltæk", "status.quote_error.not_available": "Færsla ekki tiltæk",
"status.quote_error.pending_approval": "Færsla í bið", "status.quote_error.pending_approval": "Færsla í bið",
@ -964,6 +965,11 @@
"video.volume_up": "Hækka hljóðstyrk", "video.volume_up": "Hækka hljóðstyrk",
"visibility_modal.button_title": "Stilla sýnileika", "visibility_modal.button_title": "Stilla sýnileika",
"visibility_modal.header": "Sýnileiki og gagnvirkni", "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.privacy_label": "Persónuvernd",
"visibility_modal.quote_followers": "Einungis fylgjendur", "visibility_modal.quote_followers": "Einungis fylgjendur",
"visibility_modal.quote_label": "Breyttu því hver getur tilvitnað", "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.confirm": "Rimuovi il seguace",
"confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?", "confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?",
"confirmations.remove_from_followers.title": "Rimuovi il seguace?", "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.confirm": "Smetti di seguire",
"confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?", "confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?",
"confirmations.unfollow.title": "Smettere di seguire l'utente?", "confirmations.unfollow.title": "Smettere di seguire l'utente?",
@ -289,6 +292,7 @@
"domain_pill.your_handle": "Il tuo nome univoco:", "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_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.", "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.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.",
"embed.preview": "Ecco come apparirà:", "embed.preview": "Ecco come apparirà:",
"emoji_button.activity": "Attività", "emoji_button.activity": "Attività",
@ -876,11 +880,13 @@
"status.mute_conversation": "Silenzia conversazione", "status.mute_conversation": "Silenzia conversazione",
"status.open": "Espandi questo post", "status.open": "Espandi questo post",
"status.pin": "Fissa in cima sul profilo", "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.filtered": "Nascosto a causa di uno dei tuoi filtri",
"status.quote_error.not_available": "Post non disponibile", "status.quote_error.not_available": "Post non disponibile",
"status.quote_error.pending_approval": "Post in attesa", "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.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_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.quote_post_author": "Citato un post di @{name}",
"status.read_more": "Leggi di più", "status.read_more": "Leggi di più",
"status.reblog": "Reblog", "status.reblog": "Reblog",
@ -955,5 +961,17 @@
"video.skip_forward": "Vai avanti", "video.skip_forward": "Vai avanti",
"video.unmute": "Muta", "video.unmute": "Muta",
"video.volume_down": "Abbassa volume", "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_handle": "Lí ê口座:",
"domain_pill.your_server": "Lí數位ê厝內底有lí所有ê PO文。無kah意Ē當轉kàu別ê服侍器koh保有跟tuè lí êl âng。.", "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名ê用者。", "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.instructions": "Khóo-pih 下kha ê程式碼來kā tsit篇PO文tàu佇lí ê網站。",
"embed.preview": "伊e án-ne顯示\n", "embed.preview": "伊e án-ne顯示\n",
"emoji_button.activity": "活動", "emoji_button.activity": "活動",
@ -570,7 +571,7 @@
"navigation_bar.live_feed_local": "即時ê內容(本地)", "navigation_bar.live_feed_local": "即時ê內容(本地)",
"navigation_bar.live_feed_public": "即時ê內容(公開)", "navigation_bar.live_feed_public": "即時ê內容(公開)",
"navigation_bar.logout": "登出", "navigation_bar.logout": "登出",
"navigation_bar.moderation": "審核", "navigation_bar.moderation": "管理",
"navigation_bar.more": "其他", "navigation_bar.more": "其他",
"navigation_bar.mutes": "消音ê用者", "navigation_bar.mutes": "消音ê用者",
"navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面預設ē佇經典ê網頁界面內phah開。", "navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面預設ē佇經典ê網頁界面內phah開。",
@ -608,11 +609,11 @@
"notification.mention": "提起", "notification.mention": "提起",
"notification.mentioned_you": "{name}kā lí提起", "notification.mentioned_you": "{name}kā lí提起",
"notification.moderation-warning.learn_more": "看詳細", "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_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_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_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_sensitive": "Tuì tsit-má開始lí êPO文ē標做敏感ê內容。",
"notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。", "notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。",
"notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。", "notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。",
@ -883,6 +884,7 @@
"status.quote_error.pending_approval": "鋪文當咧送", "status.quote_error.pending_approval": "鋪文當咧送",
"status.quote_error.pending_approval_popout.body": "因為無kâng ê服侍器有無kâng ê協定,佇聯邦宇宙分享ê引文可能愛開時間來顯示。", "status.quote_error.pending_approval_popout.body": "因為無kâng ê服侍器有無kâng ê協定,佇聯邦宇宙分享ê引文可能愛開時間來顯示。",
"status.quote_error.pending_approval_popout.title": "Leh送引文請sió等leh", "status.quote_error.pending_approval_popout.title": "Leh送引文請sió等leh",
"status.quote_policy_change": "改通引用ê lâng",
"status.quote_post_author": "引用 @{name} ê PO文ah", "status.quote_post_author": "引用 @{name} ê PO文ah",
"status.read_more": "讀詳細", "status.read_more": "讀詳細",
"status.reblog": "轉送", "status.reblog": "轉送",
@ -957,5 +959,17 @@
"video.skip_forward": "跳kah頭前", "video.skip_forward": "跳kah頭前",
"video.unmute": "取消消音", "video.unmute": "取消消音",
"video.volume_down": "變khah細聲", "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.mention": "Упоминание",
"notification.label.private_mention": "Личное упоминание", "notification.label.private_mention": "Личное упоминание",
"notification.label.private_reply": "Приватный ответ", "notification.label.private_reply": "Приватный ответ",
"notification.label.quote": "{name} процитировал(а) ваш пост",
"notification.label.reply": "Ответ", "notification.label.reply": "Ответ",
"notification.mention": "Упоминание", "notification.mention": "Упоминание",
"notification.mentioned_you": "{name} упомянул(а) вас", "notification.mentioned_you": "{name} упомянул(а) вас",
@ -660,6 +661,7 @@
"notifications.column_settings.mention": "Вас упомянули в посте:", "notifications.column_settings.mention": "Вас упомянули в посте:",
"notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:", "notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
"notifications.column_settings.push": "Push-уведомления", "notifications.column_settings.push": "Push-уведомления",
"notifications.column_settings.quote": "Ваш пост процитировали:",
"notifications.column_settings.reblog": "Ваш пост продвинули:", "notifications.column_settings.reblog": "Ваш пост продвинули:",
"notifications.column_settings.show": "Отображать в списке", "notifications.column_settings.show": "Отображать в списке",
"notifications.column_settings.sound": "Проигрывать звук", "notifications.column_settings.sound": "Проигрывать звук",
@ -851,7 +853,7 @@
"status.cancel_reblog_private": "Отменить продвижение", "status.cancel_reblog_private": "Отменить продвижение",
"status.cannot_reblog": "Этот пост не может быть продвинут", "status.cannot_reblog": "Этот пост не может быть продвинут",
"status.context.load_new_replies": "Доступны новые ответы", "status.context.load_new_replies": "Доступны новые ответы",
"status.context.loading": "Проверяем, есть ли еще ответы", "status.context.loading": "Проверяем, есть ли ещё ответы",
"status.continued_thread": "Продолжение предыдущего поста", "status.continued_thread": "Продолжение предыдущего поста",
"status.copy": "Скопировать ссылку на пост", "status.copy": "Скопировать ссылку на пост",
"status.delete": "Удалить", "status.delete": "Удалить",
@ -879,6 +881,8 @@
"status.pin": "Закрепить в профиле", "status.pin": "Закрепить в профиле",
"status.quote_error.filtered": "Скрыто одним из ваших фильтров", "status.quote_error.filtered": "Скрыто одним из ваших фильтров",
"status.quote_error.not_available": "Пост недоступен", "status.quote_error.not_available": "Пост недоступен",
"status.quote_error.pending_approval": "Пост ожидает подтверждения",
"status.quote_error.pending_approval_popout.title": "Цитирование ещё не подтверждено? Не беспокойтесь",
"status.read_more": "Читать далее", "status.read_more": "Читать далее",
"status.reblog": "Продвинуть", "status.reblog": "Продвинуть",
"status.reblog_private": "Продвинуть для своей аудитории", "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.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.remove_from_followers.title": "Ta bort följare?",
"confirmations.revoke_quote.confirm": "Ta bort inlägg", "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.revoke_quote.title": "Ta bort inlägg?",
"confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.confirm": "Avfölj",
"confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", "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.mention": "Nämn",
"notification.label.private_mention": "Privat omnämnande", "notification.label.private_mention": "Privat omnämnande",
"notification.label.private_reply": "Privata svar", "notification.label.private_reply": "Privata svar",
"notification.label.quote": "{name} citerade ditt inlägg",
"notification.label.reply": "Svar", "notification.label.reply": "Svar",
"notification.mention": "Nämn", "notification.mention": "Nämn",
"notification.mentioned_you": "{name} nämnde dig", "notification.mentioned_you": "{name} nämnde dig",
@ -660,6 +662,7 @@
"notifications.column_settings.mention": "Omnämningar:", "notifications.column_settings.mention": "Omnämningar:",
"notifications.column_settings.poll": "Omröstningsresultat:", "notifications.column_settings.poll": "Omröstningsresultat:",
"notifications.column_settings.push": "Push-aviseringar", "notifications.column_settings.push": "Push-aviseringar",
"notifications.column_settings.quote": "Citerat:",
"notifications.column_settings.reblog": "Boostar:", "notifications.column_settings.reblog": "Boostar:",
"notifications.column_settings.show": "Visa i kolumnen", "notifications.column_settings.show": "Visa i kolumnen",
"notifications.column_settings.sound": "Spela upp ljud", "notifications.column_settings.sound": "Spela upp ljud",
@ -877,8 +880,14 @@
"status.mute_conversation": "Tysta konversation", "status.mute_conversation": "Tysta konversation",
"status.open": "Utvidga detta inlägg", "status.open": "Utvidga detta inlägg",
"status.pin": "Fäst i profil", "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.filtered": "Dolt på grund av ett av dina filter",
"status.quote_error.not_available": "Inlägg ej tillgängligt", "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.read_more": "Läs mer",
"status.reblog": "Boosta", "status.reblog": "Boosta",
"status.reblog_private": "Boosta med ursprunglig synlighet", "status.reblog_private": "Boosta med ursprunglig synlighet",
@ -893,6 +902,7 @@
"status.reply": "Svara", "status.reply": "Svara",
"status.replyAll": "Svara på tråden", "status.replyAll": "Svara på tråden",
"status.report": "Rapportera @{name}", "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.sensitive_warning": "Känsligt innehåll",
"status.share": "Dela", "status.share": "Dela",
"status.show_less_all": "Visa mindre för alla", "status.show_less_all": "Visa mindre för alla",
@ -953,7 +963,10 @@
"video.unmute": "Avtysta", "video.unmute": "Avtysta",
"video.volume_down": "Volym ned", "video.volume_down": "Volym ned",
"video.volume_up": "Volym upp", "video.volume_up": "Volym upp",
"visibility_modal.button_title": "Ange synlighet",
"visibility_modal.header": "Synlighet och interaktion", "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.privacy_label": "Integritet",
"visibility_modal.quote_followers": "Endast följare", "visibility_modal.quote_followers": "Endast följare",
"visibility_modal.quote_nobody": "Ingen", "visibility_modal.quote_nobody": "Ingen",

View File

@ -880,6 +880,7 @@
"status.mute_conversation": "Tắt thông báo", "status.mute_conversation": "Tắt thông báo",
"status.open": "Mở tút", "status.open": "Mở tút",
"status.pin": "Ghim lên hồ sơ", "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.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.not_available": "Tút không khả dụng",
"status.quote_error.pending_approval": "Tút đang chờ duyệt", "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.confirm": "移除关注者",
"confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?", "confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?",
"confirmations.remove_from_followers.title": "移除关注者?", "confirmations.remove_from_followers.title": "移除关注者?",
"confirmations.revoke_quote.confirm": "移除嘟文",
"confirmations.revoke_quote.title": "移除嘟文?",
"confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.confirm": "取消关注",
"confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
"confirmations.unfollow.title": "确定要取消关注用户?", "confirmations.unfollow.title": "确定要取消关注用户?",
@ -491,6 +493,7 @@
"keyboard_shortcuts.translate": "翻译嘟文", "keyboard_shortcuts.translate": "翻译嘟文",
"keyboard_shortcuts.unfocus": "取消输入/搜索", "keyboard_shortcuts.unfocus": "取消输入/搜索",
"keyboard_shortcuts.up": "在列表中让光标上移", "keyboard_shortcuts.up": "在列表中让光标上移",
"learn_more_link.got_it": "明白了",
"lightbox.close": "关闭", "lightbox.close": "关闭",
"lightbox.next": "下一个", "lightbox.next": "下一个",
"lightbox.previous": "上一个", "lightbox.previous": "上一个",
@ -861,6 +864,7 @@
"status.mute_conversation": "关闭此对话的通知", "status.mute_conversation": "关闭此对话的通知",
"status.open": "展开嘟文", "status.open": "展开嘟文",
"status.pin": "在个人资料页面置顶", "status.pin": "在个人资料页面置顶",
"status.quote.cancel": "取消引用",
"status.quote_error.filtered": "已根据你的筛选器过滤", "status.quote_error.filtered": "已根据你的筛选器过滤",
"status.read_more": "查看更多", "status.read_more": "查看更多",
"status.reblog": "转嘟", "status.reblog": "转嘟",

View File

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

View File

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

View File

@ -331,8 +331,16 @@ export const composeReducer = (state = initialState, action) => {
return state.set('is_changing_upload', false); return state.set('is_changing_upload', false);
} else if (quoteComposeByStatus.match(action)) { } else if (quoteComposeByStatus.match(action)) {
const status = action.payload; const status = action.payload;
if (status.getIn(['quote_approval', 'current_user']) === 'automatic') { if (
return state.set('quoted_status_id', status.get('id')); 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)) { } else if (quoteComposeCancel.match(action)) {
return state.set('quoted_status_id', null); 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('sensitive', action.status.get('sensitive'));
map.set('language', action.status.get('language')); map.set('language', action.status.get('language'));
map.set('id', null); 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) { if (action.status.get('spoiler_text').length > 0) {
map.set('spoiler', true); map.set('spoiler', true);
@ -541,6 +551,8 @@ export const composeReducer = (state = initialState, action) => {
map.set('idempotencyKey', uuid()); map.set('idempotencyKey', uuid());
map.set('sensitive', action.status.get('sensitive')); map.set('sensitive', action.status.get('sensitive'));
map.set('language', action.status.get('language')); 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) { if (action.spoiler_text.length > 0) {
map.set('spoiler', true); map.set('spoiler', true);

View File

@ -15,7 +15,7 @@ export const getFilters = createSelector(
(_, { contextType }: { contextType: string }) => contextType, (_, { contextType }: { contextType: string }) => contextType,
], ],
(filters, contextType) => { (filters, contextType) => {
if (!contextType) { if (!contextType || contextType === 'compose') {
return null; 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>(); 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 button,
.status-card__actions a { .status-card__actions a {
color: rgba($white, 0.8); color: color.change($white, $alpha: 0.8);
&:hover, &:hover,
&:active, &:active,
@ -298,14 +298,14 @@
.simple_form { .simple_form {
.warning { .warning {
box-shadow: none; box-shadow: none;
background: rgba($error-red, 0.5); background: color.change($error-red, $alpha: 0.5);
text-shadow: none; text-shadow: none;
} }
.recommended { .recommended {
border-color: $ui-highlight-color; border-color: $ui-highlight-color;
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'], input[type='text'],
@ -327,7 +327,7 @@
.compose-form .compose-form__warning { .compose-form .compose-form__warning {
border-color: $ui-highlight-color; border-color: $ui-highlight-color;
background-color: rgba($ui-highlight-color, 0.1); background-color: color.change($ui-highlight-color, $alpha: 0.1);
&, &,
a { a {
@ -375,10 +375,10 @@
} }
.status__wrapper-direct { .status__wrapper-direct {
background-color: rgba($ui-highlight-color, 0.1); background-color: color.change($ui-highlight-color, $alpha: 0.1);
&:focus { &: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 { .inline-follow-suggestions {
background-color: rgba($ui-highlight-color, 0.1); background-color: color.change($ui-highlight-color, $alpha: 0.1);
border-bottom-color: rgba($ui-highlight-color, 0.3); border-bottom-color: color.change($ui-highlight-color, $alpha: 0.3);
} }
.inline-follow-suggestions__body__scrollable__card { .inline-follow-suggestions__body__scrollable__card {
@ -508,7 +508,7 @@ a.sparkline {
@supports not selector(::-webkit-scrollbar) { @supports not selector(::-webkit-scrollbar) {
html { html {
scrollbar-color: rgba($action-button-color, 0.25) scrollbar-color: color.change($action-button-color, $alpha: 0.25)
var(--background-border-color); var(--background-border-color);
} }
} }

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *; @use 'variables' as *;
@mixin search-input { @mixin search-input {
@ -22,7 +23,7 @@
padding-bottom: 14px; padding-bottom: 14px;
margin-top: 10px; margin-top: 10px;
color: $light-text-color; 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 { h4 {
text-transform: uppercase; text-transform: uppercase;

View File

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

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'sass:math'; @use 'sass:math';
@use 'functions' as *; @use 'functions' as *;
@use 'variables' as *; @use 'variables' as *;
@ -1255,7 +1256,7 @@ a.name-tag,
} }
path:first-child { 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; fill-opacity: 1 !important;
} }

View File

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

View File

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

View File

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

View File

@ -1,3 +1,4 @@
@use 'sass:color';
@use 'variables' as *; @use 'variables' as *;
@use 'functions' as *; @use 'functions' as *;
@ -206,7 +207,7 @@
&:active, &:active,
&:focus { &: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); background: rgba(darken($ui-primary-color, 14%), 0.7);
&.leading { &.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 'variables' as *;
@use 'functions' as *; @use 'functions' as *;
@ -16,7 +17,7 @@
padding: 15px; padding: 15px;
text-decoration: none; text-decoration: none;
color: inherit; 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 { & > a {

View File

@ -1,9 +1,13 @@
import { Map as ImmutableMap } from 'immutable';
import type { ApiRelationshipJSON } from '@/mastodon/api_types/relationships'; import type { ApiRelationshipJSON } from '@/mastodon/api_types/relationships';
import type { ApiStatusJSON } from '@/mastodon/api_types/statuses';
import type { import type {
CustomEmojiData, CustomEmojiData,
UnicodeEmojiData, UnicodeEmojiData,
} from '@/mastodon/features/emoji/types'; } from '@/mastodon/features/emoji/types';
import { createAccountFromServerJSON } from '@/mastodon/models/account'; import { createAccountFromServerJSON } from '@/mastodon/models/account';
import type { Status } from '@/mastodon/models/status';
import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
type FactoryOptions<T> = { type FactoryOptions<T> = {
@ -51,6 +55,36 @@ export const accountFactoryState = (
options: FactoryOptions<ApiAccountJSON> = {}, options: FactoryOptions<ApiAccountJSON> = {},
) => createAccountFromServerJSON(accountFactory(options)); ) => 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> = ({ export const relationshipsFactory: FactoryFunction<ApiRelationshipJSON> = ({
id, id,
...data ...data

View File

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

View File

@ -12,7 +12,7 @@ class InitialStateSerializer < ActiveModel::Serializer
has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
has_one :role, serializer: REST::RoleSerializer has_one :role, serializer: REST::RoleSerializer
def meta # rubocop:disable Metrics/AbcSize def meta
store = default_meta_store store = default_meta_store
if object.current_account 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 # It looks like redefining one `has_one` requires redefining all inherited ones
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
has_one :quote_approval, if: -> { Mastodon::Feature.outgoing_quotes_enabled? }
end end

View File

@ -29,6 +29,8 @@ class REST::StatusSerializer < ActiveModel::Serializer
has_many :tags has_many :tags
has_many :emojis, serializer: REST::CustomEmojiSerializer 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 :quote, key: :quote, serializer: REST::QuoteSerializer
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer

View File

@ -21,8 +21,9 @@ class Scheduler::SelfDestructScheduler
def sidekiq_overwhelmed? def sidekiq_overwhelmed?
redis_mem_info = Sidekiq.default_configuration.redis_info 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 end
def delete_accounts! def delete_accounts!

View File

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

View File

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

View File

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

View File

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

View File

@ -202,6 +202,7 @@ cy:
create_relay: Creu Cyfnewidiad create_relay: Creu Cyfnewidiad
create_unavailable_domain: Creu Parth Ddim ar Gael create_unavailable_domain: Creu Parth Ddim ar Gael
create_user_role: Creu Rôl create_user_role: Creu Rôl
create_username_block: Creu Rheol Enw Defnyddiwr
demote_user: Diraddio Defnyddiwr demote_user: Diraddio Defnyddiwr
destroy_announcement: Dileu Cyhoeddiad destroy_announcement: Dileu Cyhoeddiad
destroy_canonical_email_block: Dileu Rhwystr E-bost destroy_canonical_email_block: Dileu Rhwystr E-bost
@ -215,6 +216,7 @@ cy:
destroy_status: Dileu Postiad destroy_status: Dileu Postiad
destroy_unavailable_domain: Dileu Parth Ddim ar Gael destroy_unavailable_domain: Dileu Parth Ddim ar Gael
destroy_user_role: Dileu Rôl destroy_user_role: Dileu Rôl
destroy_username_block: Dileu Rheol Enw Defnyddiwr
disable_2fa_user: Diffodd 2FA disable_2fa_user: Diffodd 2FA
disable_custom_emoji: Analluogi Emoji Addasedig disable_custom_emoji: Analluogi Emoji Addasedig
disable_relay: Analluogi Cyfnewidiad disable_relay: Analluogi Cyfnewidiad
@ -249,6 +251,7 @@ cy:
update_report: Diweddaru Adroddiad update_report: Diweddaru Adroddiad
update_status: Diweddaru Postiad update_status: Diweddaru Postiad
update_user_role: Diweddaru Rôl update_user_role: Diweddaru Rôl
update_username_block: Diweddaru Rheol Enw Defnyddiwr
actions: actions:
approve_appeal_html: Mae %{name} wedi cymeradwyo penderfyniad cymedroli gan %{target} approve_appeal_html: Mae %{name} wedi cymeradwyo penderfyniad cymedroli gan %{target}
approve_user_html: Mae %{name} wedi cymeradwyo cofrestru 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_relay_html: Creodd %{name} gyfnewidiad %{target}
create_unavailable_domain_html: Mae %{name} wedi stopio danfon i barth %{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_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} demote_user_html: Mae %{name} wedi israddio defnyddiwr %{target}
destroy_announcement_html: Mae %{name} wedi dileu cyhoeddiad %{target} destroy_announcement_html: Mae %{name} wedi dileu cyhoeddiad %{target}
destroy_canonical_email_block_html: Mae %{name} wedi dad-rwystro parth e-bost %{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_status_html: Mae %{name} wedi tynnu postiad gan %{target}
destroy_unavailable_domain_html: Mae %{name} wedi ailddechrau anfon i barth %{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_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_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_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target}
disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target} disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target}
@ -314,6 +319,7 @@ cy:
update_report_html: Mae %{name} wedi diweddaru adroddiad %{target} update_report_html: Mae %{name} wedi diweddaru adroddiad %{target}
update_status_html: Mae %{name} wedi diweddaru postiad gan %{target} update_status_html: Mae %{name} wedi diweddaru postiad gan %{target}
update_user_role_html: Mae %{name} wedi newid rôl %{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 deleted_account: cyfrif wedi'i ddileu
empty: Dim logiau ar gael. empty: Dim logiau ar gael.
filter_by_action: Hidlo yn ôl gweithred filter_by_action: Hidlo yn ôl gweithred
@ -1157,6 +1163,25 @@ cy:
zero: Wedi'i ddefnyddio gan %{count} o bobl dros yr wythnos ddiwethaf zero: Wedi'i ddefnyddio gan %{count} o bobl dros yr wythnos ddiwethaf
title: Argymhellion a Threndiau title: Argymhellion a Threndiau
trending: Trendio 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: warning_presets:
add_new: Ychwanegu newydd add_new: Ychwanegu newydd
delete: Dileu delete: Dileu
@ -1817,6 +1842,10 @@ cy:
title: Crywbylliad newydd title: Crywbylliad newydd
poll: poll:
subject: Mae arolwg gan %{name} wedi dod i ben 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: reblog:
body: 'Cafodd eich postiad ei hybu gan %{name}:' body: 'Cafodd eich postiad ei hybu gan %{name}:'
subject: Rhoddodd %{name} hwb i'ch postiad subject: Rhoddodd %{name} hwb i'ch postiad
@ -1901,7 +1930,7 @@ cy:
last_active: Yn weithgar ddiwethaf last_active: Yn weithgar ddiwethaf
most_recent: Y diweddaraf most_recent: Y diweddaraf
moved: Wedi symud moved: Wedi symud
mutual: Cydfudd mutual: Yn Gyffredin
primary: Cynradd primary: Cynradd
relationship: Perthynas relationship: Perthynas
remove_selected_domains: Tynnu'r holl ddilynwyr o'r parthau a ddewiswyd 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 ownership: Nid oes modd pinio postiad rhywun arall
reblog: Nid oes modd pinio hwb reblog: Nid oes modd pinio hwb
quote_policies: quote_policies:
followers: Dim ond eich dilynwyr
nobody: Neb
public: Pawb public: Pawb
title: '%{name}: "%{quote}"' title: '%{name}: "%{quote}"'
visibilities: visibilities:

View File

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

View File

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

View File

@ -2090,4 +2090,4 @@ eo:
not_enabled: Vi ankoraŭ ne ŝaltis WebAuth not_enabled: Vi ankoraŭ ne ŝaltis WebAuth
not_supported: Ĉi tiu legilo ne povas uzi sekurecŝlosilojn not_supported: Ĉi tiu legilo ne povas uzi sekurecŝlosilojn
otp_required: Por uzi sekurecŝlosilojn, ebligu 2-faktoran autentigon unue. 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_relay_html: "%{name} یک رله %{target} ایجاد کرد"
create_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را متوقف کرد" create_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را متوقف کرد"
create_user_role_html: "%{name} نقش %{target} را ایجاد کرد" create_user_role_html: "%{name} نقش %{target} را ایجاد کرد"
create_username_block_html: "%{name} قانونی برای نام‌های کاربری دارای %{target} افزود"
demote_user_html: "%{name} کاربر %{target} را تنزل داد" demote_user_html: "%{name} کاربر %{target} را تنزل داد"
destroy_announcement_html: "%{name} اعلامیهٔ %{target} را حذف کرد" destroy_announcement_html: "%{name} اعلامیهٔ %{target} را حذف کرد"
destroy_canonical_email_block_html: "%{name} رایانامه با درهم‌ریزی %{target} را نامسدود کرد" destroy_canonical_email_block_html: "%{name} رایانامه با درهم‌ریزی %{target} را نامسدود کرد"
@ -271,6 +272,7 @@ fa:
destroy_status_html: "%{name} وضعیت %{target} را برداشت" destroy_status_html: "%{name} وضعیت %{target} را برداشت"
destroy_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را از سر گرفت" destroy_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را از سر گرفت"
destroy_user_role_html: "%{name} نقش %{target} را حذف کرد" destroy_user_role_html: "%{name} نقش %{target} را حذف کرد"
destroy_username_block_html: "%{name} قانون نام‌های کاربری دارای %{target} را برداشت"
disable_2fa_user_html: "%{name} ضرورت ورود دو مرحله‌ای را برای کاربر %{target} غیر فعال کرد" disable_2fa_user_html: "%{name} ضرورت ورود دو مرحله‌ای را برای کاربر %{target} غیر فعال کرد"
disable_custom_emoji_html: "%{name} شکلک %{target} را غیرفعال کرد" disable_custom_emoji_html: "%{name} شکلک %{target} را غیرفعال کرد"
disable_relay_html: "%{name} رله %{target} را غیرفعال کرد" disable_relay_html: "%{name} رله %{target} را غیرفعال کرد"
@ -305,6 +307,7 @@ fa:
update_report_html: "%{name} گزارش %{target} را به‌روز کرد" update_report_html: "%{name} گزارش %{target} را به‌روز کرد"
update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد" update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد"
update_user_role_html: "%{name} نقش %{target} را تغییر داد" update_user_role_html: "%{name} نقش %{target} را تغییر داد"
update_username_block_html: "%{name} قانونی برای نام‌های کاربری دارای %{target} را به‌روز کرد"
deleted_account: حساب حذف شد deleted_account: حساب حذف شد
empty: هیچ گزارشی پیدا نشد. empty: هیچ گزارشی پیدا نشد.
filter_by_action: پالایش بر اساس کنش filter_by_action: پالایش بر اساس کنش
@ -1089,7 +1092,24 @@ fa:
title: توصیه ها و روندها title: توصیه ها و روندها
trending: پرطرفدار trending: پرطرفدار
username_blocks: username_blocks:
add_new: افزودن جدید
block_registrations: انسداد ثبت‌نام‌ها
comparison:
contains: دارای
equals: برابر
contains_html: دارای %{string}
created_msg: قانون نام کاربری با موفّقیت ایجاد شد
delete: حذف delete: حذف
edit:
title: ویرایش قانون نام‌کاربری
matches_exactly_html: برابر %{string}
new:
create: ایجاد قانون
title: ایجاد قانون نام‌کاربری جدید
no_username_block_selected: هیچ قاعدهٔ نام کاربری‌ای تغییری نکرد زیرا هیچ‌کدام گزیده نشده بودند
not_permitted: مجاز نیست
title: قانون نام کاربری
updated_msg: قانون نام کاربری با موفّقیت به‌روز شد
warning_presets: warning_presets:
add_new: افزودن تازه add_new: افزودن تازه
delete: زدودن delete: زدودن

View File

@ -18,8 +18,8 @@ fi:
pin_errors: pin_errors:
following: Sinun täytyy seurata käyttäjää, jota haluat tukea following: Sinun täytyy seurata käyttäjää, jota haluat tukea
posts: posts:
one: Julkaisu one: julkaisu
other: Julkaisua other: julkaisua
posts_tab_heading: Julkaisut posts_tab_heading: Julkaisut
self_follow_error: Oman tilisi seuraaminen ei ole sallittua self_follow_error: Oman tilisi seuraaminen ei ole sallittua
admin: admin:
@ -507,14 +507,14 @@ fi:
registration_requested: Rekisteröintiä pyydetty registration_requested: Rekisteröintiä pyydetty
registrations: registrations:
confirm: Vahvista 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ää reject: Hylkää
title: Vahvista FASP-rekisteröinti title: Vahvista FASP-rekisteröinti
save: Tallenna save: Tallenna
select_capabilities: Valitse kyvykkyydet select_capabilities: Valitse kyvykkyydet
sign_in: Kirjaudu sisään sign_in: Kirjaudu sisään
status: Tila status: Tila
title: Fediversumin Tukitoimintojen Tarjoajat title: Fediversumin tukitoimintojen tarjoajat
title: FASP title: FASP
follow_recommendations: 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ä." 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_relay: Crear repetitor
create_unavailable_domain: Crear dominio indisponibile create_unavailable_domain: Crear dominio indisponibile
create_user_role: Crear un rolo create_user_role: Crear un rolo
create_username_block: Crear regula de nomine de usator
demote_user: Degradar usator demote_user: Degradar usator
destroy_announcement: Deler annuncio destroy_announcement: Deler annuncio
destroy_canonical_email_block: Deler blocada de e-mail destroy_canonical_email_block: Deler blocada de e-mail
@ -203,6 +204,7 @@ ia:
destroy_status: Deler message destroy_status: Deler message
destroy_unavailable_domain: Deler dominio indisponibile destroy_unavailable_domain: Deler dominio indisponibile
destroy_user_role: Destruer rolo destroy_user_role: Destruer rolo
destroy_username_block: Deler regula de nomine de usator
disable_2fa_user: Disactivar A2F disable_2fa_user: Disactivar A2F
disable_custom_emoji: Disactivar emoji personalisate disable_custom_emoji: Disactivar emoji personalisate
disable_relay: Disactivar repetitor disable_relay: Disactivar repetitor
@ -237,6 +239,7 @@ ia:
update_report: Actualisar le reporto update_report: Actualisar le reporto
update_status: Actualisar le message update_status: Actualisar le message
update_user_role: Actualisar rolo update_user_role: Actualisar rolo
update_username_block: Actualisar regula de nomine de usator
actions: actions:
approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}" approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}"
approve_user_html: "%{name} approbava inscription 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_relay_html: "%{name} ha create un repetitor %{target}"
create_unavailable_domain_html: "%{name} stoppava livration al dominio %{target}" create_unavailable_domain_html: "%{name} stoppava livration al dominio %{target}"
create_user_role_html: "%{name} creava rolo de %{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}" demote_user_html: "%{name} degradava usator %{target}"
destroy_announcement_html: "%{name} deleva annuncio %{target}" destroy_announcement_html: "%{name} deleva annuncio %{target}"
destroy_canonical_email_block_html: "%{name} disblocava le e-mail con le hash %{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_status_html: "%{name} removeva un message de %{target}"
destroy_unavailable_domain_html: "%{name} reprendeva le livration al dominio %{target}" destroy_unavailable_domain_html: "%{name} reprendeva le livration al dominio %{target}"
destroy_user_role_html: "%{name} deleva le rolo %{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_2fa_user_html: "%{name} disactivava le authentication a duo factores pro le usator %{target}"
disable_custom_emoji_html: "%{name} disactivava le emoji %{target}" disable_custom_emoji_html: "%{name} disactivava le emoji %{target}"
disable_relay_html: "%{name} ha disactivate le repetitor %{target}" disable_relay_html: "%{name} ha disactivate le repetitor %{target}"
@ -302,6 +307,7 @@ ia:
update_report_html: "%{name} actualisava reporto %{target}" update_report_html: "%{name} actualisava reporto %{target}"
update_status_html: "%{name} actualisava message de %{target}" update_status_html: "%{name} actualisava message de %{target}"
update_user_role_html: "%{name} cambiava rolo 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 deleted_account: conto delite
empty: Nulle registros trovate. empty: Nulle registros trovate.
filter_by_action: Filtrar per action filter_by_action: Filtrar per action
@ -321,7 +327,7 @@ ia:
preview: 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. 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:' 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 publish: Publicar
published_msg: Annuncio publicate con successo! published_msg: Annuncio publicate con successo!
scheduled_for: Programmate pro %{time} scheduled_for: Programmate pro %{time}
@ -480,6 +486,36 @@ ia:
new: new:
title: Importar blocadas de dominio title: Importar blocadas de dominio
no_file: Necun file seligite 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: 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." 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 language: Pro le lingua
@ -548,6 +584,13 @@ ia:
all: Toto all: Toto
limited: Limitate limited: Limitate
title: Moderation 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 private_comment: Commento private
public_comment: Commento public public_comment: Commento public
purge: Purgar purge: Purgar
@ -756,11 +799,17 @@ ia:
title: Rolos title: Rolos
rules: rules:
add_new: Adder regula add_new: Adder regula
add_translation: Adder traduction
delete: Deler 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. 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 edit: Modificar regula
empty: Necun regula del servitor ha essite definite ancora. empty: Necun regula del servitor ha essite definite ancora.
move_down: Displaciar a basso
move_up: Displaciar in alto
title: Regulas del servitor 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: settings:
about: about:
manage_rules: Gerer le regulas del servitor manage_rules: Gerer le regulas del servitor
@ -877,7 +926,7 @@ ia:
database_schema_check: 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 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: 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: elasticsearch_health_red:
message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile
elasticsearch_health_yellow: elasticsearch_health_yellow:
@ -942,7 +991,7 @@ ia:
changelog: Lo que ha cambiate changelog: Lo que ha cambiate
create: Usar tu proprie create: Usar tu proprie
current: Actual current: Actual
draft: Provisori draft: Esbosso
generate: Usar modello generate: Usar modello
generates: generates:
action: Generar action: Generar
@ -965,7 +1014,7 @@ ia:
title: Previsualisar le notification sur le conditiones de servicio title: Previsualisar le notification sur le conditiones de servicio
publish: Publicar publish: Publicar
published_on_html: Publicate le %{date} published_on_html: Publicate le %{date}
save_draft: Salvar version provisori save_draft: Salvar esbosso
title: Conditiones de servicio title: Conditiones de servicio
title: Administration title: Administration
trends: trends:
@ -1043,8 +1092,17 @@ ia:
title: Recommendationes e tendentias title: Recommendationes e tendentias
trending: In tendentia trending: In tendentia
username_blocks: 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: edit:
title: Modificar regula de nomine de usator title: Modificar regula de nomine de usator
matches_exactly_html: Es equal a %{string}
new: new:
create: Crear regula create: Crear regula
title: Crear nove regula de nomine de usator title: Crear nove regula de nomine de usator
@ -1316,6 +1374,10 @@ ia:
basic_information: Information basic 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." 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 other: Alteres
emoji_styles:
auto: Automatic
native: Native
twemoji: Twemoji
errors: errors:
'400': Le requesta que tu ha inviate non es valide o es mal formate. '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. '403': Tu non ha le permission de acceder a iste pagina.
@ -1625,6 +1687,10 @@ ia:
title: Nove mention title: Nove mention
poll: poll:
subject: Un sondage de %{name} ha finite 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: reblog:
body: "%{name} ha impulsate tu message:" body: "%{name} ha impulsate tu message:"
subject: "%{name} ha impulsate tu message" subject: "%{name} ha impulsate tu message"
@ -1835,6 +1901,7 @@ ia:
edited_at_html: Modificate le %{date} edited_at_html: Modificate le %{date}
errors: errors:
in_reply_not_found: Le message a que tu tenta responder non pare exister. 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 over_character_limit: limite de characteres de %{max} excedite
pin_errors: pin_errors:
direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate 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 ownership: Le message de alcuno altere non pote esser appunctate
reblog: Un impulso non pote esser affixate reblog: Un impulso non pote esser affixate
quote_policies: quote_policies:
followers: Solmente tu sequitores
nobody: Necuno
public: Omnes public: Omnes
title: "%{name}: “%{quote}”" title: "%{name}: “%{quote}”"
visibilities: visibilities:
@ -1897,7 +1966,7 @@ ia:
terms_of_service: terms_of_service:
title: Conditiones de servicio title: Conditiones de servicio
terms_of_service_interstitial: 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. 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 review_link: Revider le conditiones de servicio
title: Le conditiones de servicio de %{domain} cambia 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}. 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:' 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: '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} sign_off: Le equipa de %{domain}
subject: Actualisationes de nostre conditiones de servicio subject: Actualisationes de nostre conditiones de servicio
subtitle: Le conditiones de servicio de %{domain} ha cambiate subtitle: Le conditiones de servicio de %{domain} ha cambiate

View File

@ -25,7 +25,7 @@ nan:
action: 執行動作 action: 執行動作
already_silenced: Tsit ê口座有受著限制。 already_silenced: Tsit ê口座有受著限制。
already_suspended: Tsit ê口座ê權限已經hōo lâng停止。 already_suspended: Tsit ê口座ê權限已經hōo lâng停止。
title: Kā %{acct} 做審核ê動作 title: Kā %{acct} 做管理ê動作
account_moderation_notes: account_moderation_notes:
create: 留記錄 create: 留記錄
created_msg: 管理記錄成功建立! created_msg: 管理記錄成功建立!
@ -238,7 +238,7 @@ nan:
update_user_role: 更新角色 update_user_role: 更新角色
update_username_block: 更新使用者號名規則 update_username_block: 更新使用者號名規則
actions: actions:
approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì審核決定ê投訴" approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì管理決定ê投訴"
approve_user_html: "%{name} 允准 %{target} ê 註冊" approve_user_html: "%{name} 允准 %{target} ê 註冊"
assigned_to_self_report_html: "%{name} kā報告 %{target} 分配hōo家tī" assigned_to_self_report_html: "%{name} kā報告 %{target} 分配hōo家tī"
change_email_user_html: "%{name} 改變 %{target} ê電子phue地址" change_email_user_html: "%{name} 改變 %{target} ê電子phue地址"
@ -282,7 +282,7 @@ nan:
memorialize_account_html: "%{name} kā %{target} 設做故人口座" memorialize_account_html: "%{name} kā %{target} 設做故人口座"
promote_user_html: "%{name} kā 用者 %{target} 升級" promote_user_html: "%{name} kā 用者 %{target} 升級"
publish_terms_of_service_html: "%{name} 公佈服務規則ê更新" publish_terms_of_service_html: "%{name} 公佈服務規則ê更新"
reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì審核決定ê投訴" reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì管理決定ê投訴"
reject_user_html: "%{name} 拒絕 %{target} ê 註冊" reject_user_html: "%{name} 拒絕 %{target} ê 註冊"
remove_avatar_user_html: "%{name} thâi掉 %{target} ê標頭" remove_avatar_user_html: "%{name} thâi掉 %{target} ê標頭"
reopen_report_html: "%{name} 重開 %{target} ê檢舉" reopen_report_html: "%{name} 重開 %{target} ê檢舉"
@ -667,7 +667,7 @@ nan:
none: none:
comment_description_html: 為著提供其他資訊,%{name} 寫: comment_description_html: 為著提供其他資訊,%{name} 寫:
confirm: 確認 confirm: 確認
confirm_action: 確認kā %{acct} 審核ê動作 confirm_action: 確認kā %{acct} 管理ê動作
created_at: 檢舉tī created_at: 檢舉tī
delete_and_resolve: Thâi掉PO文 delete_and_resolve: Thâi掉PO文
forwarded: 轉送ah forwarded: 轉送ah
@ -720,9 +720,48 @@ nan:
target_origin: 受檢舉ê口座ê來源 target_origin: 受檢舉ê口座ê來源
title: 檢舉 title: 檢舉
unassign: 取消分配 unassign: 取消分配
unknown_action_msg: M̄知影ê動作%{action}
unresolved: 無解決
updated_at: 更新
view_profile: 看個人資料
roles: 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: 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: 管理公告
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: statuses:
language: 語言 language: 語言
trends: trends:

View File

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

View File

@ -56,10 +56,12 @@ bg:
scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални. scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални.
setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания) setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания)
setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon
setting_default_quote_policy: Тази настройка ще се отрази само за публикациите, създадени със следващата версия на Mastodon, но може да изберете предпочитанията си в подготовката.
setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване
setting_display_media_default: Скриване на мултимедия отбелязана като деликатна setting_display_media_default: Скриване на мултимедия отбелязана като деликатна
setting_display_media_hide_all: Винаги скриване на мултимедията setting_display_media_hide_all: Винаги скриване на мултимедията
setting_display_media_show_all: Винаги показване на мултимедията setting_display_media_show_all: Винаги показване на мултимедията
setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри.
setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome
setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите
setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала
@ -147,6 +149,9 @@ bg:
min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви. min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви.
user: user:
chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси
date_of_birth:
one: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
other: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
role: Ролята управлява какви позволения има потребителят. role: Ролята управлява какви позволения има потребителят.
user_role: user_role:
color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат
@ -154,6 +159,10 @@ bg:
name: Публично име на ролята, ако ролята е зададена да се показва като значка name: Публично име на ролята, ако ролята е зададена да се показва като значка
permissions_as_keys: Потребители с тази роля ще имат достъп до... permissions_as_keys: Потребители с тази роля ще имат достъп до...
position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет
username_block:
allow_with_approval: Вместо напълно да се предотвратява регистрирането, съвпадащите регистрирания ще изискват одобрението ви
comparison: Имайте предвид проблема със Scunthorpe, блокирайки частично съвпаденията
username: Ще се намира съвпадение независимо от главните и малките букви и често срещаните приличащи си знаци като "4" за "a" или "3" за "e"
webhook: webhook:
events: Изберете събития за изпращане events: Изберете събития за изпращане
template: Съставете свой полезен товар на JSON посредством променлива интерполация. Оставете празно за подразбиращ се JSON. template: Съставете свой полезен товар на JSON посредством променлива интерполация. Оставете празно за подразбиращ се JSON.
@ -236,6 +245,7 @@ bg:
setting_display_media_default: Стандартно setting_display_media_default: Стандартно
setting_display_media_hide_all: Скриване на всичко setting_display_media_hide_all: Скриване на всичко
setting_display_media_show_all: Показване на всичко setting_display_media_show_all: Показване на всичко
setting_emoji_style: Стил на емоджито
setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание
setting_hide_network: Скриване на социалния ви свързан граф setting_hide_network: Скриване на социалния ви свързан граф
setting_missing_alt_text_modal: Показване на диалогов прозорец потвърждение преди публикуване на мултимедия без алт. текст setting_missing_alt_text_modal: Показване на диалогов прозорец потвърждение преди публикуване на мултимедия без алт. текст
@ -318,6 +328,7 @@ bg:
follow_request: Някой пожела да ви последва follow_request: Някой пожела да ви последва
mention: Някой ви спомена mention: Някой ви спомена
pending_account: Новите акаунти се нуждаят от преглед pending_account: Новите акаунти се нуждаят от преглед
quote: Някой ви цитира
reblog: Някой подсили ваша публикация reblog: Някой подсили ваша публикация
report: Новият доклад е подаден report: Новият доклад е подаден
software_updates: software_updates:
@ -364,6 +375,10 @@ bg:
name: Име name: Име
permissions_as_keys: Разрешения permissions_as_keys: Разрешения
position: Приоритет position: Приоритет
username_block:
allow_with_approval: Позволяване на регистрации с одобрение
comparison: Начин на сравнение
username: Думи, които трябва да пасват
webhook: webhook:
events: Включване на събития events: Включване на събития
template: Шаблон за полезен товар 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. 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_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_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_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_default: Cuddio cyfryngau wedi eu marcio'n sensitif
setting_display_media_hide_all: Cuddio cyfryngau bob tro 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 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... 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 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: webhook:
events: Dewiswch ddigwyddiadau i'w hanfon 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. 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 follow_request: Mae rhywun yn ceisio eich dilyn chi
mention: Mae rhywun yn sôn amdanoch chi mention: Mae rhywun yn sôn amdanoch chi
pending_account: Mae cyfrif newydd angen adolygiad pending_account: Mae cyfrif newydd angen adolygiad
quote: Dyfynnodd rhywun chi
reblog: Mae rhywun wedi hybu eich postiad reblog: Mae rhywun wedi hybu eich postiad
report: Cyflwynwyd adroddiad newydd report: Cyflwynwyd adroddiad newydd
software_updates: software_updates:
@ -374,6 +380,10 @@ cy:
name: Enw name: Enw
permissions_as_keys: Caniatâd permissions_as_keys: Caniatâd
position: Blaenoriaeth position: Blaenoriaeth
username_block:
allow_with_approval: Caniatáu cofrestru gyda chymeradwyaeth
comparison: Dull cymharu
username: Gair i gyfatebu
webhook: webhook:
events: Digwyddiadau wedi'u galluogi events: Digwyddiadau wedi'u galluogi
template: Templed prif lwyth template: Templed prif lwyth

View File

@ -160,6 +160,10 @@ fa:
name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود
permissions_as_keys: کاربرانی که این نقش را دارند به... permissions_as_keys: کاربرانی که این نقش را دارند به...
position: نقش بالاتر در موقعیت‌های خاص حل تعارض را تعیین می‌کند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد position: نقش بالاتر در موقعیت‌های خاص حل تعارض را تعیین می‌کند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد
username_block:
allow_with_approval: به جای جلوگیری از ثبت‌نام، ثبت‌نام‌های مطابق نیازمند تأییدتان خواهند بود
comparison: لطفاً هنگام مسدود کردن تطابق‌های جزیی به مشکل اسکان‌ثورپ توجّه داشته باشید
username: تطبیق بدون توجه به بزرگی و کوچکی یا استفاده از نویسه‌های مشابه مثل 4 به جای a یا 3 به جای e
webhook: webhook:
events: گزینش رویدادها برای فرستادن events: گزینش رویدادها برای فرستادن
template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید. template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید.
@ -372,6 +376,10 @@ fa:
name: نام name: نام
permissions_as_keys: اجازه‌ها permissions_as_keys: اجازه‌ها
position: اولویت position: اولویت
username_block:
allow_with_approval: اجازهٔ ثبت‌نام با تأیید
comparison: روش مقایسه
username: واژه برای تطبیق
webhook: webhook:
events: رویدادهای به کار افتاده events: رویدادهای به کار افتاده
template: قالب بار 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. 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_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_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_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_default: Celar le medios marcate como sensibile
setting_display_media_hide_all: Sempre celar contento multimedial setting_display_media_hide_all: Sempre celar contento multimedial
setting_display_media_show_all: Sempre monstrar 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_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_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 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 name: Tu pote solmente cambiar le litteras inter majusculas e minusculas, per exemplo, pro render lo plus legibile
terms_of_service: terms_of_service:
changelog: Pote esser structurate con le syntaxe Markdown. 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. text: Pote esser structurate con le syntaxe Markdown.
terms_of_service_generator: terms_of_service_generator:
admin_email: Le avisos juridic include le contra-avisos, ordinantias judiciari, demandas de retiro e demandas de application del lege. 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. 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_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. 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. 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. min_age: Non deberea esser infra le etate minime requirite per le leges de tu jurisdiction.
user: user:
chosen_languages: Si marcate, solmente le messages in le linguas seligite apparera in chronologias public 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. role: Le rolo controla qual permissos le usator ha.
user_role: user_role:
color: Color a esser usate pro le rolo in omne parte del UI, como RGB in formato hexadecimal 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 name: Nomine public del rolo, si rolo es definite a esser monstrate como insignia
permissions_as_keys: Usatores con iste rolo habera accesso a... 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 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: webhook:
events: Selige le eventos a inviar events: Selige le eventos a inviar
template: Compone tu proprie carga utile JSON per interpolation de variabile. Lassar blanc pro JSON predefinite. 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_default: Predefinite
setting_display_media_hide_all: Celar toto setting_display_media_hide_all: Celar toto
setting_display_media_show_all: Monstrar 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_expand_spoilers: Sempre expander messages marcate con avisos de contento
setting_hide_network: Cela tu rete social setting_hide_network: Cela tu rete social
setting_missing_alt_text_modal: Monstrar un dialogo de confirmation ante de publicar multimedia sin texto alternative setting_missing_alt_text_modal: Monstrar un dialogo de confirmation ante de publicar multimedia sin texto alternative
@ -271,6 +285,7 @@ ia:
favicon: Favicon favicon: Favicon
mascot: Personalisar le mascotte (hereditage) mascot: Personalisar le mascotte (hereditage)
media_cache_retention_period: Periodo de retention del cache multimedial 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 peers_api_enabled: Publicar le lista de servitores discoperite in le API
profile_directory: Activar directorio de profilos profile_directory: Activar directorio de profilos
registrations_mode: Qui pote inscriber se registrations_mode: Qui pote inscriber se
@ -314,6 +329,7 @@ ia:
follow_request: Alcuno ha demandate de sequer te follow_request: Alcuno ha demandate de sequer te
mention: Alcuno te ha mentionate mention: Alcuno te ha mentionate
pending_account: Nove conto besonia de revision pending_account: Nove conto besonia de revision
quote: Alcuno te ha citate
reblog: Alcuno ha impulsate tu message reblog: Alcuno ha impulsate tu message
report: Un nove reporto es inviate report: Un nove reporto es inviate
software_updates: software_updates:
@ -360,6 +376,10 @@ ia:
name: Nomine name: Nomine
permissions_as_keys: Permissiones permissions_as_keys: Permissiones
position: Prioritate position: Prioritate
username_block:
allow_with_approval: Permitter registrationes con approbation
comparison: Methodo de comparation
username: Parola a comparar
webhook: webhook:
events: Eventos activate events: Eventos activate
template: Modello de carga utile template: Modello de carga utile

View File

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

View File

@ -369,10 +369,6 @@ namespace :api, format: false do
namespace :web do namespace :web do
resource :settings, only: [:update] resource :settings, only: [:update]
resources :embeds, only: [:show] resources :embeds, only: [:show]
resources :push_subscriptions, only: [:create, :destroy] do resources :push_subscriptions, only: [:create, :destroy, :update]
member do
put :update
end
end
end end
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. # 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 # These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql" 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 "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.boolean "legacy", default: false, 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 ["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 ["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_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 t.index ["status_id"], name: "index_quotes_on_status_id", unique: true
end end

View File

@ -91,7 +91,7 @@ development environment configured with the software needed for this project.
## Next steps ## Next steps
- Once you have successfully set up a development environment, it will be available on http://localhost:3000 - 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. - 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. - 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) expect(DistributionWorker)
.to have_enqueued_sidekiq_job(status.id, { 'update' => true }) .to have_enqueued_sidekiq_job(status.id, { 'update' => true })
expect(ActivityPub::StatusUpdateDistributionWorker) expect(ActivityPub::StatusUpdateDistributionWorker)
.to have_enqueued_sidekiq_job(status.id) .to have_enqueued_sidekiq_job(status.id, { 'updated_at' => anything })
end end
end end

View File

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

View File

@ -86,6 +86,42 @@ RSpec.shared_examples 'User::Confirmation' do
end end
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 context 'when registrations mode is approved' do
before { Setting.registrations_mode = 'approved' } before { Setting.registrations_mode = 'approved' }

View File

@ -130,14 +130,19 @@ RSpec.describe 'Settings applications page' do
describe 'Regenerating an app token' do describe 'Regenerating an app token' do
it 'updates the 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 } expect { regenerate_token }
.to(change { user.token_for_app(application) }) .to(change { user_application_token.first.token })
expect(page) expect(page)
.to have_content(I18n.t('applications.token_regenerated')) .to have_content(I18n.t('applications.token_regenerated'))
end end
def user_application_token
Doorkeeper::AccessToken.where(application:).where(resource_owner_id: user)
end
def regenerate_token def regenerate_token
click_on I18n.t('applications.regenerate_token') click_on I18n.t('applications.regenerate_token')
end 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"] # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
# renovate: datasource=node-version depName=node # renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="22" ARG NODE_MAJOR_VERSION="22"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"] # Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
ARG DEBIAN_VERSION="bookworm" ARG DEBIAN_VERSION="trixie"
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim) # 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 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 # 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 languageName: node
linkType: hard 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": "@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.0 version: 7.28.3
resolution: "@babel/core@npm:7.28.0" resolution: "@babel/core@npm:7.28.3"
dependencies: dependencies:
"@ampproject/remapping": "npm:^2.2.0" "@ampproject/remapping": "npm:^2.2.0"
"@babel/code-frame": "npm:^7.27.1" "@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-compilation-targets": "npm:^7.27.2"
"@babel/helper-module-transforms": "npm:^7.27.3" "@babel/helper-module-transforms": "npm:^7.28.3"
"@babel/helpers": "npm:^7.27.6" "@babel/helpers": "npm:^7.28.3"
"@babel/parser": "npm:^7.28.0" "@babel/parser": "npm:^7.28.3"
"@babel/template": "npm:^7.27.2" "@babel/template": "npm:^7.27.2"
"@babel/traverse": "npm:^7.28.0" "@babel/traverse": "npm:^7.28.3"
"@babel/types": "npm:^7.28.0" "@babel/types": "npm:^7.28.2"
convert-source-map: "npm:^2.0.0" convert-source-map: "npm:^2.0.0"
debug: "npm:^4.1.0" debug: "npm:^4.1.0"
gensync: "npm:^1.0.0-beta.2" gensync: "npm:^1.0.0-beta.2"
json5: "npm:^2.2.3" json5: "npm:^2.2.3"
semver: "npm:^6.3.1" semver: "npm:^6.3.1"
checksum: 10c0/423302e7c721e73b1c096217880272e02020dfb697a55ccca60ad01bba90037015f84d0c20c6ce297cf33a19bb704bc5c2b3d3095f5284dfa592bd1de0b9e8c3 checksum: 10c0/e6b3eb830c4b93f5a442b305776df1cd2bb4fafa4612355366f67c764f3e54a69d45b84def77fb2d4fd83439102667b0a92c3ea2838f678733245b748c602a7b
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/generator@npm:^7.28.0": "@babel/generator@npm:^7.28.3":
version: 7.28.0 version: 7.28.3
resolution: "@babel/generator@npm:7.28.0" resolution: "@babel/generator@npm:7.28.3"
dependencies: dependencies:
"@babel/parser": "npm:^7.28.0" "@babel/parser": "npm:^7.28.3"
"@babel/types": "npm:^7.28.0" "@babel/types": "npm:^7.28.2"
"@jridgewell/gen-mapping": "npm:^0.3.12" "@jridgewell/gen-mapping": "npm:^0.3.12"
"@jridgewell/trace-mapping": "npm:^0.3.28" "@jridgewell/trace-mapping": "npm:^0.3.28"
jsesc: "npm:^3.0.2" jsesc: "npm:^3.0.2"
checksum: 10c0/1b3d122268ea3df50fde707ad864d9a55c72621357d5cebb972db3dd76859c45810c56e16ad23123f18f80cc2692f5a015d2858361300f0f224a05dc43d36a92 checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc
languageName: node languageName: node
linkType: hard linkType: hard
@ -203,16 +203,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-module-transforms@npm:^7.27.1, @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.27.3 version: 7.28.3
resolution: "@babel/helper-module-transforms@npm:7.27.3" resolution: "@babel/helper-module-transforms@npm:7.28.3"
dependencies: dependencies:
"@babel/helper-module-imports": "npm:^7.27.1" "@babel/helper-module-imports": "npm:^7.27.1"
"@babel/helper-validator-identifier": "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: peerDependencies:
"@babel/core": ^7.0.0 "@babel/core": ^7.0.0
checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb
languageName: node languageName: node
linkType: hard linkType: hard
@ -300,24 +300,24 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helpers@npm:^7.27.6": "@babel/helpers@npm:^7.28.3":
version: 7.27.6 version: 7.28.3
resolution: "@babel/helpers@npm:7.27.6" resolution: "@babel/helpers@npm:7.28.3"
dependencies: dependencies:
"@babel/template": "npm:^7.27.2" "@babel/template": "npm:^7.27.2"
"@babel/types": "npm:^7.27.6" "@babel/types": "npm:^7.28.2"
checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 checksum: 10c0/03a8f94135415eec62d37be9c62c63908f2d5386c7b00e04545de4961996465775330e3eb57717ea7451e19b0e24615777ebfec408c2adb1df3b10b4df6bf1ce
languageName: node languageName: node
linkType: hard 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": "@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.0 version: 7.28.3
resolution: "@babel/parser@npm:7.28.0" resolution: "@babel/parser@npm:7.28.3"
dependencies: dependencies:
"@babel/types": "npm:^7.28.0" "@babel/types": "npm:^7.28.2"
bin: bin:
parser: ./bin/babel-parser.js parser: ./bin/babel-parser.js
checksum: 10c0/c2ef81d598990fa949d1d388429df327420357cb5200271d0d0a2784f1e6d54afc8301eb8bdf96d8f6c77781e402da93c7dc07980fcc136ac5b9d5f1fce701b5 checksum: 10c0/1f41eb82623b0ca0f94521b57f4790c6c457cd922b8e2597985b36bdec24114a9ccf54640286a760ceb60f11fe9102d192bf60477aee77f5d45f1029b9b72729
languageName: node languageName: node
linkType: hard linkType: hard
@ -1179,22 +1179,22 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@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.0 version: 7.28.3
resolution: "@babel/traverse@npm:7.28.0" resolution: "@babel/traverse@npm:7.28.3"
dependencies: dependencies:
"@babel/code-frame": "npm:^7.27.1" "@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/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/template": "npm:^7.27.2"
"@babel/types": "npm:^7.28.0" "@babel/types": "npm:^7.28.2"
debug: "npm:^4.3.1" debug: "npm:^4.3.1"
checksum: 10c0/32794402457827ac558173bcebdcc0e3a18fa339b7c41ca35621f9f645f044534d91bb923ff385f5f960f2e495f56ce18d6c7b0d064d2f0ccb55b285fa6bc7b9 checksum: 10c0/26e95b29a46925b7b41255e03185b7e65b2c4987e14bbee7bbf95867fb19c69181f301bbe1c7b201d4fe0cce6aa0cbea0282dad74b3a0fef3d9058f6c76fdcb3
languageName: node languageName: node
linkType: hard 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 version: 7.28.2
resolution: "@babel/types@npm:7.28.2" resolution: "@babel/types@npm:7.28.2"
dependencies: dependencies:
@ -3210,10 +3210,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@rolldown/pluginutils@npm:1.0.0-beta.30": "@rolldown/pluginutils@npm:1.0.0-beta.32":
version: 1.0.0-beta.30 version: 1.0.0-beta.32
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.30" resolution: "@rolldown/pluginutils@npm:1.0.0-beta.32"
checksum: 10c0/aff8b532cb9d82d94c9a4101fa12ecb10620ad47d52dbb9135a5c65bde1ad19895b41026b821f4d607083699239a5d0010198401b6a6a54ab6a10d0015302768 checksum: 10c0/ba3582fc3c35c8eb57b0df2d22d0733b1be83d37edcc258203364773f094f58fc0cb7a056d604603573a69dd0105a466506cad467f59074e1e53d0dc26191f06
languageName: node languageName: node
linkType: hard linkType: hard
@ -4712,18 +4712,18 @@ __metadata:
linkType: hard linkType: hard
"@vitejs/plugin-react@npm:^5.0.0": "@vitejs/plugin-react@npm:^5.0.0":
version: 5.0.0 version: 5.0.1
resolution: "@vitejs/plugin-react@npm:5.0.0" resolution: "@vitejs/plugin-react@npm:5.0.1"
dependencies: 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-self": "npm:^7.27.1"
"@babel/plugin-transform-react-jsx-source": "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" "@types/babel__core": "npm:^7.20.5"
react-refresh: "npm:^0.17.0" react-refresh: "npm:^0.17.0"
peerDependencies: peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
checksum: 10c0/e5813839d319ab5dc1b90cab40b6c08388f26e456166ba9df10ffc3c3f4ecc594cec06715b5c93390bba56140ca5f68a18f2233f7d275d77e5bbfeb979e4fd9b checksum: 10c0/2641171beedfc38edc5671abb47706906f9af2a79a6dfff4e946106c9550de4f83ccae41c164f3ee26a3edf07127ecc0e415fe5cddbf7abc71fbb2540016c27d
languageName: node languageName: node
linkType: hard linkType: hard
@ -7371,15 +7371,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fdir@npm:^6.4.4, fdir@npm:^6.4.6": "fdir@npm:^6.4.4, fdir@npm:^6.5.0":
version: 6.4.6 version: 6.5.0
resolution: "fdir@npm:6.4.6" resolution: "fdir@npm:6.5.0"
peerDependencies: peerDependencies:
picomatch: ^3 || ^4 picomatch: ^3 || ^4
peerDependenciesMeta: peerDependenciesMeta:
picomatch: picomatch:
optional: true optional: true
checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f
languageName: node languageName: node
linkType: hard linkType: hard
@ -13818,8 +13818,8 @@ __metadata:
linkType: hard linkType: hard
"vite-plugin-pwa@npm:^1.0.2": "vite-plugin-pwa@npm:^1.0.2":
version: 1.0.2 version: 1.0.3
resolution: "vite-plugin-pwa@npm:1.0.2" resolution: "vite-plugin-pwa@npm:1.0.3"
dependencies: dependencies:
debug: "npm:^4.3.6" debug: "npm:^4.3.6"
pretty-bytes: "npm:^6.1.1" pretty-bytes: "npm:^6.1.1"
@ -13834,7 +13834,7 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@vite-pwa/assets-generator": "@vite-pwa/assets-generator":
optional: true optional: true
checksum: 10c0/e4f2f4dfff843ee2585a0d89e74187168ba20da77cd0d127ce7ad7eebcf5a68b2bf09000afb6bb86d43a2034fea9f568cd6db2a2d4b47a72e175d999a5e07eb1 checksum: 10c0/03fc24bd12ae4a4130979da4877e3dabddf13d7d6ff2bd68e5e8497a2643b8874a78e6c2502874277ddf2f28593d0a3b025d78af2335bdcc5d2966295784fd46
languageName: node languageName: node
linkType: hard linkType: hard
@ -13883,11 +13883,11 @@ __metadata:
linkType: hard linkType: hard
"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": "vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1":
version: 7.1.2 version: 7.1.3
resolution: "vite@npm:7.1.2" resolution: "vite@npm:7.1.3"
dependencies: dependencies:
esbuild: "npm:^0.25.0" esbuild: "npm:^0.25.0"
fdir: "npm:^6.4.6" fdir: "npm:^6.5.0"
fsevents: "npm:~2.3.3" fsevents: "npm:~2.3.3"
picomatch: "npm:^4.0.3" picomatch: "npm:^4.0.3"
postcss: "npm:^8.5.6" postcss: "npm:^8.5.6"
@ -13933,7 +13933,7 @@ __metadata:
optional: true optional: true
bin: bin:
vite: bin/vite.js vite: bin/vite.js
checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced checksum: 10c0/a0aa418beab80673dc9a3e9d1fa49472955d6ef9d41a4c9c6bd402953f411346f612864dae267adfb2bb8ceeb894482369316ffae5816c84fd45990e352b727d
languageName: node languageName: node
linkType: hard linkType: hard