mirror of
https://github.com/mastodon/mastodon.git
synced 2025-09-05 17:31:12 +00:00
Merge branch 'main' into feature/require-mfa-by-admin
This commit is contained in:
commit
879fd3406e
|
@ -1,17 +1,21 @@
|
|||
---
|
||||
Metrics/AbcSize:
|
||||
Exclude:
|
||||
- lib/mastodon/cli/*.rb
|
||||
Enabled: false
|
||||
|
||||
Metrics/BlockLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/BlockNesting:
|
||||
Enabled: false
|
||||
|
||||
Metrics/ClassLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/CollectionLiteralLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/CyclomaticComplexity:
|
||||
Exclude:
|
||||
- lib/mastodon/cli/*.rb
|
||||
Enabled: false
|
||||
|
||||
Metrics/MethodLength:
|
||||
Enabled: false
|
||||
|
@ -20,4 +24,7 @@ Metrics/ModuleLength:
|
|||
Enabled: false
|
||||
|
||||
Metrics/ParameterLists:
|
||||
CountKeywordArgs: false
|
||||
Enabled: false
|
||||
|
||||
Metrics/PerceivedComplexity:
|
||||
Enabled: false
|
||||
|
|
|
@ -6,23 +6,6 @@
|
|||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
||||
Metrics/AbcSize:
|
||||
Max: 82
|
||||
|
||||
# Configuration parameters: CountBlocks, CountModifierForms, Max.
|
||||
Metrics/BlockNesting:
|
||||
Exclude:
|
||||
- 'lib/tasks/mastodon.rake'
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||
Metrics/CyclomaticComplexity:
|
||||
Max: 25
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 27
|
||||
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowedVars, DefaultToNil.
|
||||
Style/FetchEnvVar:
|
||||
|
|
35
Dockerfile
35
Dockerfile
|
@ -17,11 +17,11 @@ ARG RUBY_VERSION="3.4.5"
|
|||
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||
# renovate: datasource=node-version depName=node
|
||||
ARG NODE_MAJOR_VERSION="22"
|
||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
||||
ARG DEBIAN_VERSION="bookworm"
|
||||
# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
|
||||
ARG DEBIAN_VERSION="trixie"
|
||||
# Node.js image to use for base image based on combined variables (ex: 20-trixie-slim)
|
||||
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
|
||||
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
|
||||
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-trixie)
|
||||
FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
||||
|
||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||
|
@ -96,9 +96,6 @@ RUN \
|
|||
# Set /opt/mastodon as working directory
|
||||
WORKDIR /opt/mastodon
|
||||
|
||||
# Add backport repository for some specific packages where we need the latest version
|
||||
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
|
||||
|
||||
# hadolint ignore=DL3008,DL3005
|
||||
RUN \
|
||||
# Mount Apt cache and lib directories from Docker buildx caches
|
||||
|
@ -161,11 +158,11 @@ RUN \
|
|||
libexif-dev \
|
||||
libexpat1-dev \
|
||||
libgirepository1.0-dev \
|
||||
libheif-dev/bookworm-backports \
|
||||
libheif-dev \
|
||||
libhwy-dev \
|
||||
libimagequant-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
liblcms2-dev \
|
||||
liborc-dev \
|
||||
libspng-dev \
|
||||
libtiff-dev \
|
||||
libwebp-dev \
|
||||
|
@ -209,7 +206,7 @@ FROM build AS ffmpeg
|
|||
|
||||
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
|
||||
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg
|
||||
ARG FFMPEG_VERSION=7.1
|
||||
ARG FFMPEG_VERSION=7.1.1
|
||||
# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
|
||||
ARG FFMPEG_URL=https://ffmpeg.org/releases
|
||||
|
||||
|
@ -327,28 +324,28 @@ RUN \
|
|||
# Apt update install non-dev versions of necessary components
|
||||
apt-get install -y --no-install-recommends \
|
||||
libexpat1 \
|
||||
libglib2.0-0 \
|
||||
libicu72 \
|
||||
libglib2.0-0t64 \
|
||||
libicu76 \
|
||||
libidn12 \
|
||||
libpq5 \
|
||||
libreadline8 \
|
||||
libssl3 \
|
||||
libreadline8t64 \
|
||||
libssl3t64 \
|
||||
libyaml-0-2 \
|
||||
# libvips components
|
||||
libcgif0 \
|
||||
libexif12 \
|
||||
libheif1/bookworm-backports \
|
||||
libheif1 \
|
||||
libhwy1t64 \
|
||||
libimagequant0 \
|
||||
libjpeg62-turbo \
|
||||
liblcms2-2 \
|
||||
liborc-0.4-0 \
|
||||
libspng0 \
|
||||
libtiff6 \
|
||||
libwebp7 \
|
||||
libwebpdemux2 \
|
||||
libwebpmux3 \
|
||||
# ffmpeg components
|
||||
libdav1d6 \
|
||||
libdav1d7 \
|
||||
libmp3lame0 \
|
||||
libopencore-amrnb0 \
|
||||
libopencore-amrwb0 \
|
||||
|
@ -358,9 +355,9 @@ RUN \
|
|||
libvorbis0a \
|
||||
libvorbisenc2 \
|
||||
libvorbisfile3 \
|
||||
libvpx7 \
|
||||
libvpx9 \
|
||||
libx264-164 \
|
||||
libx265-199 \
|
||||
libx265-215 \
|
||||
;
|
||||
|
||||
# Copy Mastodon sources into final layer
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -102,7 +102,7 @@ gem 'rdf-normalize', '~> 0.5'
|
|||
|
||||
gem 'prometheus_exporter', '~> 2.2', require: false
|
||||
|
||||
gem 'opentelemetry-api', '~> 1.5.0'
|
||||
gem 'opentelemetry-api', '~> 1.6.0'
|
||||
|
||||
group :opentelemetry do
|
||||
gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false
|
||||
|
|
12
Gemfile.lock
12
Gemfile.lock
|
@ -497,7 +497,7 @@ GEM
|
|||
openssl (3.3.0)
|
||||
openssl-signature_algorithm (1.3.0)
|
||||
openssl (> 2.0)
|
||||
opentelemetry-api (1.5.0)
|
||||
opentelemetry-api (1.6.0)
|
||||
opentelemetry-common (0.22.0)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-exporter-otlp (0.30.0)
|
||||
|
@ -589,7 +589,7 @@ GEM
|
|||
opentelemetry-instrumentation-base (~> 0.23.0)
|
||||
opentelemetry-registry (0.4.0)
|
||||
opentelemetry-api (~> 1.1)
|
||||
opentelemetry-sdk (1.8.0)
|
||||
opentelemetry-sdk (1.8.1)
|
||||
opentelemetry-api (~> 1.1)
|
||||
opentelemetry-common (~> 0.20)
|
||||
opentelemetry-registry (~> 0.2)
|
||||
|
@ -625,7 +625,7 @@ GEM
|
|||
premailer (~> 1.7, >= 1.7.9)
|
||||
prettyprint (0.2.0)
|
||||
prism (1.4.0)
|
||||
prometheus_exporter (2.2.0)
|
||||
prometheus_exporter (2.3.0)
|
||||
webrick
|
||||
propshaft (1.2.1)
|
||||
actionpack (>= 7.0.0)
|
||||
|
@ -688,7 +688,7 @@ GEM
|
|||
rails-html-sanitizer (1.6.2)
|
||||
loofah (~> 2.21)
|
||||
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
||||
rails-i18n (8.0.1)
|
||||
rails-i18n (8.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 8.0.0, < 9)
|
||||
railties (8.0.2.1)
|
||||
|
@ -806,7 +806,7 @@ GEM
|
|||
ruby-saml (1.18.1)
|
||||
nokogiri (>= 1.13.10)
|
||||
rexml
|
||||
ruby-vips (2.2.4)
|
||||
ruby-vips (2.2.5)
|
||||
ffi (~> 1.12)
|
||||
logger
|
||||
rubyzip (3.0.1)
|
||||
|
@ -1025,7 +1025,7 @@ DEPENDENCIES
|
|||
omniauth-rails_csrf_protection (~> 1.0)
|
||||
omniauth-saml (~> 2.0)
|
||||
omniauth_openid_connect (~> 0.8.0)
|
||||
opentelemetry-api (~> 1.5.0)
|
||||
opentelemetry-api (~> 1.6.0)
|
||||
opentelemetry-exporter-otlp (~> 0.30.0)
|
||||
opentelemetry-instrumentation-active_job (~> 0.8.0)
|
||||
opentelemetry-instrumentation-active_model_serializers (~> 0.22.0)
|
||||
|
|
|
@ -28,6 +28,6 @@ class Api::V1::Statuses::InteractionPoliciesController < Api::V1::Statuses::Base
|
|||
|
||||
def broadcast_updates!
|
||||
DistributionWorker.perform_async(@status.id, { 'update' => true })
|
||||
ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id)
|
||||
ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id, { 'updated_at' => Time.now.utc.iso8601 })
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,6 +2,7 @@ import type { ApiStatusJSON } from './statuses';
|
|||
|
||||
export type ApiQuoteState = 'accepted' | 'pending' | 'revoked' | 'unauthorized';
|
||||
export type ApiQuotePolicy = 'public' | 'followers' | 'nobody' | 'unknown';
|
||||
export type ApiUserQuotePolicy = 'automatic' | 'manual' | 'denied' | 'unknown';
|
||||
|
||||
interface ApiQuoteEmptyJSON {
|
||||
state: Exclude<ApiQuoteState, 'accepted'>;
|
||||
|
@ -25,7 +26,7 @@ export type ApiQuoteJSON = ApiQuoteAcceptedJSON | ApiQuoteEmptyJSON;
|
|||
export interface ApiQuotePolicyJSON {
|
||||
automatic: ApiQuotePolicy[];
|
||||
manual: ApiQuotePolicy[];
|
||||
current_user: ApiQuotePolicy;
|
||||
current_user: ApiUserQuotePolicy;
|
||||
}
|
||||
|
||||
export function isQuotePolicy(policy: string): policy is ApiQuotePolicy {
|
||||
|
|
|
@ -53,6 +53,7 @@ const AutosuggestTextarea = forwardRef(({
|
|||
onFocus,
|
||||
autoFocus = true,
|
||||
lang,
|
||||
className,
|
||||
}, textareaRef) => {
|
||||
|
||||
const [suggestionsHidden, setSuggestionsHidden] = useState(true);
|
||||
|
@ -192,7 +193,7 @@ const AutosuggestTextarea = forwardRef(({
|
|||
};
|
||||
|
||||
return (
|
||||
<div className='autosuggest-textarea'>
|
||||
<div className={classNames('autosuggest-textarea', className)}>
|
||||
<Textarea
|
||||
ref={textareaRef}
|
||||
className='autosuggest-textarea__textarea'
|
||||
|
|
|
@ -41,13 +41,16 @@ import { IconButton } from './icon_button';
|
|||
|
||||
let id = 0;
|
||||
|
||||
type RenderItemFn<Item = MenuItem> = (
|
||||
export interface RenderItemFnHandlers {
|
||||
onClick: React.MouseEventHandler;
|
||||
onKeyUp: React.KeyboardEventHandler;
|
||||
}
|
||||
|
||||
export type RenderItemFn<Item = MenuItem> = (
|
||||
item: Item,
|
||||
index: number,
|
||||
handlers: {
|
||||
onClick: (e: React.MouseEvent) => void;
|
||||
onKeyUp: (e: React.KeyboardEvent) => void;
|
||||
},
|
||||
handlers: RenderItemFnHandlers,
|
||||
focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void,
|
||||
) => React.ReactNode;
|
||||
|
||||
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
|
||||
|
@ -173,7 +176,7 @@ export const DropdownMenu = <Item = MenuItem,>({
|
|||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
item.action(e);
|
||||
}
|
||||
},
|
||||
[onClose, onItemClick, items],
|
||||
|
@ -277,10 +280,15 @@ export const DropdownMenu = <Item = MenuItem,>({
|
|||
})}
|
||||
>
|
||||
{items.map((option, i) =>
|
||||
renderItemMethod(option, i, {
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
}),
|
||||
renderItemMethod(
|
||||
option,
|
||||
i,
|
||||
{
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
},
|
||||
i === 0 ? handleFocusedItemRef : undefined,
|
||||
),
|
||||
)}
|
||||
</ul>
|
||||
)}
|
||||
|
@ -307,7 +315,9 @@ interface DropdownProps<Item = MenuItem> {
|
|||
forceDropdown?: boolean;
|
||||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onOpen?: () => void;
|
||||
onOpen?: // Must use a union type for the full function as a union with void is not allowed.
|
||||
| ((event: React.MouseEvent | React.KeyboardEvent) => void)
|
||||
| ((event: React.MouseEvent | React.KeyboardEvent) => boolean);
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
|
@ -376,7 +386,7 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
item.action(e);
|
||||
}
|
||||
},
|
||||
[handleClose, onItemClick, items],
|
||||
|
@ -389,7 +399,10 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
if (open) {
|
||||
handleClose();
|
||||
} else {
|
||||
onOpen?.();
|
||||
const allow = onOpen?.(e);
|
||||
if (allow === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (prefetchAccountId) {
|
||||
dispatch(fetchRelationships([prefetchAccountId]));
|
||||
|
|
|
@ -10,6 +10,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
|||
|
||||
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import CancelFillIcon from '@/material-icons/400-24px/cancel-fill.svg?react';
|
||||
import { Hotkeys } from 'mastodon/components/hotkeys';
|
||||
import { ContentWarning } from 'mastodon/components/content_warning';
|
||||
import { FilterWarning } from 'mastodon/components/filter_warning';
|
||||
|
@ -34,6 +35,8 @@ import StatusActionBar from './status_action_bar';
|
|||
import StatusContent from './status_content';
|
||||
import { StatusThreadLabel } from './status_thread_label';
|
||||
import { VisibilityIcon } from './visibility_icon';
|
||||
import { IconButton } from './icon_button';
|
||||
|
||||
const domParser = new DOMParser();
|
||||
|
||||
export const textForScreenReader = (intl, status, rebloggedByText = false) => {
|
||||
|
@ -75,6 +78,7 @@ const messages = defineMessages({
|
|||
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers' },
|
||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Specific people' },
|
||||
edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
|
||||
quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' },
|
||||
});
|
||||
|
||||
class Status extends ImmutablePureComponent {
|
||||
|
@ -126,6 +130,7 @@ class Status extends ImmutablePureComponent {
|
|||
inUse: PropTypes.bool,
|
||||
available: PropTypes.bool,
|
||||
}),
|
||||
contextType: PropTypes.string,
|
||||
...WithOptionalRouterPropTypes,
|
||||
};
|
||||
|
||||
|
@ -359,6 +364,10 @@ class Status extends ImmutablePureComponent {
|
|||
this.setState(state => ({ ...state, showDespiteFilter: !state.showDespiteFilter }));
|
||||
};
|
||||
|
||||
handleQuoteCancel = () => {
|
||||
this.props.onQuoteCancel?.();
|
||||
}
|
||||
|
||||
_properStatus () {
|
||||
const { status } = this.props;
|
||||
|
||||
|
@ -573,6 +582,16 @@ class Status extends ImmutablePureComponent {
|
|||
|
||||
<DisplayName account={status.get('account')} />
|
||||
</Link>
|
||||
|
||||
{this.props.contextType === 'compose' && isQuotedPost && (
|
||||
<IconButton
|
||||
onClick={this.handleQuoteCancel}
|
||||
className='status__quote-cancel'
|
||||
title={intl.formatMessage(messages.quote_cancel)}
|
||||
icon="cancel-fill"
|
||||
iconComponent={CancelFillIcon}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{matchedFilters && <FilterWarning title={matchedFilters.join(', ')} expanded={this.state.showDespiteFilter} onClick={this.handleFilterToggle} />}
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
),
|
||||
};
|
373
app/javascript/mastodon/components/status/reblog_button.tsx
Normal file
373
app/javascript/mastodon/components/status/reblog_button.tsx
Normal 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;
|
||||
}
|
|
@ -2,7 +2,6 @@ import PropTypes from 'prop-types';
|
|||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { withRouter } from 'react-router-dom';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
@ -12,15 +11,10 @@ import { connect } from 'react-redux';
|
|||
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
|
||||
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
|
||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
|
||||
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
|
||||
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
|
||||
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
||||
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
||||
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
||||
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
|
||||
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
||||
|
@ -30,6 +24,7 @@ import { me } from '../initial_state';
|
|||
|
||||
import { IconButton } from './icon_button';
|
||||
import { isFeatureEnabled } from '../utils/environment';
|
||||
import { ReblogButton } from './status/reblog_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
@ -43,10 +38,6 @@ const messages = defineMessages({
|
|||
share: { id: 'status.share', defaultMessage: 'Share' },
|
||||
more: { id: 'status.more', defaultMessage: 'More' },
|
||||
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
|
||||
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
|
||||
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
||||
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
|
||||
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
|
||||
|
@ -85,10 +76,9 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
identity: identityContextPropShape,
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
quotedAccountId: ImmutablePropTypes.string,
|
||||
quotedAccountId: PropTypes.string,
|
||||
onReply: PropTypes.func,
|
||||
onFavourite: PropTypes.func,
|
||||
onReblog: PropTypes.func,
|
||||
onDelete: PropTypes.func,
|
||||
onRevokeQuote: PropTypes.func,
|
||||
onQuotePolicyChange: PropTypes.func,
|
||||
|
@ -152,16 +142,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
}
|
||||
};
|
||||
|
||||
handleReblogClick = e => {
|
||||
const { signedIn } = this.props.identity;
|
||||
|
||||
if (signedIn) {
|
||||
this.props.onReblog(this.props.status, e);
|
||||
} else {
|
||||
this.props.onInteractionModal('reblog', this.props.status);
|
||||
}
|
||||
};
|
||||
|
||||
handleBookmarkClick = () => {
|
||||
this.props.onBookmark(this.props.status);
|
||||
};
|
||||
|
@ -377,25 +357,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
replyTitle = intl.formatMessage(messages.replyAll);
|
||||
}
|
||||
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle, reblogIconComponent;
|
||||
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
reblogIconComponent = RepeatIcon;
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
reblogIconComponent = RepeatPrivateIcon;
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
reblogIconComponent = RepeatDisabledIcon;
|
||||
}
|
||||
|
||||
|
||||
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
|
||||
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
|
||||
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
|
||||
|
@ -406,7 +367,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
<IconButton className='status__action-bar__button' title={replyTitle} icon={isReply ? 'reply' : replyIcon} iconComponent={isReply ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
|
||||
</div>
|
||||
<div className='status__action-bar__button-wrapper'>
|
||||
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
|
||||
<ReblogButton status={status} counters={withCounters} />
|
||||
</div>
|
||||
<div className='status__action-bar__button-wrapper'>
|
||||
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />
|
||||
|
|
|
@ -44,6 +44,7 @@ import {
|
|||
import Status from '../components/status';
|
||||
import { deleteModal } from '../initial_state';
|
||||
import { makeGetStatus, makeGetPictureInPicture } from '../selectors';
|
||||
import { quoteComposeCancel } from '../actions/compose_typed';
|
||||
|
||||
const makeMapStateToProps = () => {
|
||||
const getStatus = makeGetStatus();
|
||||
|
@ -111,6 +112,12 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
|
|||
}
|
||||
},
|
||||
|
||||
onQuoteCancel() {
|
||||
if (contextType === 'compose') {
|
||||
dispatch(quoteComposeCancel());
|
||||
}
|
||||
},
|
||||
|
||||
onRevokeQuote (status) {
|
||||
dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }}));
|
||||
},
|
||||
|
|
|
@ -31,6 +31,7 @@ import { PollForm } from "./poll_form";
|
|||
import { ReplyIndicator } from './reply_indicator';
|
||||
import { UploadForm } from './upload_form';
|
||||
import { Warning } from './warning';
|
||||
import { ComposeQuotedStatus } from './quoted_post';
|
||||
|
||||
const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d';
|
||||
|
||||
|
@ -258,6 +259,11 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
<div className={classNames('compose-form__highlightable', { active: highlighted })} ref={this.setRef}>
|
||||
<EditIndicator />
|
||||
|
||||
<div className='compose-form__dropdowns'>
|
||||
<PrivacyDropdownContainer disabled={this.props.isEditing} />
|
||||
<LanguageDropdown />
|
||||
</div>
|
||||
|
||||
{this.props.spoiler && (
|
||||
<div className='spoiler-input'>
|
||||
<div className='spoiler-input__border' />
|
||||
|
@ -284,11 +290,6 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
</div>
|
||||
)}
|
||||
|
||||
<div className='compose-form__dropdowns'>
|
||||
<PrivacyDropdownContainer disabled={this.props.isEditing} />
|
||||
<LanguageDropdown />
|
||||
</div>
|
||||
|
||||
<AutosuggestTextarea
|
||||
ref={this.textareaRef}
|
||||
placeholder={intl.formatMessage(messages.placeholder)}
|
||||
|
@ -304,10 +305,12 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
onPaste={onPaste}
|
||||
autoFocus={autoFocus}
|
||||
lang={this.props.lang}
|
||||
className='compose-form__input'
|
||||
/>
|
||||
|
||||
<UploadForm />
|
||||
<PollForm />
|
||||
<ComposeQuotedStatus />
|
||||
|
||||
<div className='compose-form__footer'>
|
||||
<div className='compose-form__actions'>
|
||||
|
|
|
@ -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' />;
|
||||
};
|
|
@ -3,10 +3,16 @@ import { connect } from 'react-redux';
|
|||
import { addPoll, removePoll } from '../../../actions/compose';
|
||||
import PollButton from '../components/poll_button';
|
||||
|
||||
const mapStateToProps = state => ({
|
||||
disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0),
|
||||
active: state.getIn(['compose', 'poll']) !== null,
|
||||
});
|
||||
const mapStateToProps = state => {
|
||||
const readyAttachmentsSize = state.compose.get('media_attachments').size ?? 0;
|
||||
const hasAttachments = readyAttachmentsSize > 0 || !!state.compose.get('is_uploading');
|
||||
const hasQuote = !!state.compose.get('quoted_status_id');
|
||||
|
||||
return ({
|
||||
disabled: hasAttachments || hasQuote,
|
||||
active: state.getIn(['compose', 'poll']) !== null,
|
||||
});
|
||||
};
|
||||
|
||||
const mapDispatchToProps = dispatch => ({
|
||||
|
||||
|
|
|
@ -11,9 +11,10 @@ const mapStateToProps = state => {
|
|||
const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize;
|
||||
const isOverLimit = attachmentsSize > state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments'])-1;
|
||||
const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')));
|
||||
const hasQuote = !!state.compose.get('quoted_status_id');
|
||||
|
||||
return {
|
||||
disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio,
|
||||
disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio || hasQuote,
|
||||
resetFileKey: state.getIn(['compose', 'resetFileKey']),
|
||||
};
|
||||
};
|
||||
|
|
|
@ -3,23 +3,16 @@ import { PureComponent } from 'react';
|
|||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
|
||||
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
|
||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
|
||||
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
|
||||
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
|
||||
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
||||
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
||||
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
||||
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
|
||||
|
||||
|
@ -27,6 +20,7 @@ import { IconButton } from '../../../components/icon_button';
|
|||
import { Dropdown } from 'mastodon/components/dropdown_menu';
|
||||
import { me } from '../../../initial_state';
|
||||
import { isFeatureEnabled } from '@/mastodon/utils/environment';
|
||||
import { ReblogButton } from '@/mastodon/components/status/reblog_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
@ -35,10 +29,6 @@ const messages = defineMessages({
|
|||
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
|
||||
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
|
||||
reply: { id: 'status.reply', defaultMessage: 'Reply' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
|
||||
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
|
||||
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
||||
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
|
||||
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
|
||||
|
@ -313,31 +303,15 @@ class ActionBar extends PureComponent {
|
|||
replyIconComponent = ReplyAllIcon;
|
||||
}
|
||||
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle, reblogIconComponent;
|
||||
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
reblogIconComponent = RepeatIcon;
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
reblogIconComponent = RepeatPrivateIcon;
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
reblogIconComponent = RepeatDisabledIcon;
|
||||
}
|
||||
|
||||
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
|
||||
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
|
||||
|
||||
return (
|
||||
<div className='detailed-status__action-bar'>
|
||||
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} iconComponent={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} /></div>
|
||||
<div className='detailed-status__button'>
|
||||
<ReblogButton status={status} />
|
||||
</div>
|
||||
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={bookmarkTitle} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} /></div>
|
||||
|
||||
|
|
|
@ -174,7 +174,7 @@
|
|||
"column.lists": "Siyahılar",
|
||||
"column.mutes": "Səssizləşdirilmiş istifadəçilər",
|
||||
"column.notifications": "Bildirişlər",
|
||||
"column.pins": "Bərkidilmiş paylaşımlar",
|
||||
"column.pins": "Sancılmış göndərişlər",
|
||||
"column.public": "Federasiya zaman qrafiki",
|
||||
"column_back_button.label": "Geriyə",
|
||||
"column_header.hide_settings": "Ayarları gizlət",
|
||||
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.my_profile": "Profilinizi açın",
|
||||
"keyboard_shortcuts.notifications": "Bildirişlər sütununu aç",
|
||||
"keyboard_shortcuts.open_media": "Medianı aç",
|
||||
"keyboard_shortcuts.pinned": "Sancılmış göndərişlərin siyahısını aç",
|
||||
"keyboard_shortcuts.profile": "Müəllifin profilini aç",
|
||||
"keyboard_shortcuts.reply": "Göndərişə cavab ver",
|
||||
"keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç",
|
||||
|
@ -863,6 +864,7 @@
|
|||
"status.mute": "@{name} - səssizə al",
|
||||
"status.mute_conversation": "Danışığın səsini kəs",
|
||||
"status.open": "Bu göndərişi genişləndir",
|
||||
"status.pin": "Profildə sanc",
|
||||
"status.quote_error.filtered": "Bəzi filtrlərinizə görə gizlidir",
|
||||
"status.quote_error.not_available": "Göndəriş əlçatmazdır",
|
||||
"status.quote_error.pending_approval": "Göndəriş gözləmədədir",
|
||||
|
@ -892,6 +894,7 @@
|
|||
"status.translated_from_with": "{provider} ilə {lang} dilindən tərcümə edilib",
|
||||
"status.uncached_media_warning": "Önizləmə mövcud deyil",
|
||||
"status.unmute_conversation": "Danışığın səsini aç",
|
||||
"status.unpin": "Profil sancağı götür",
|
||||
"subscribed_languages.lead": "Dəyişiklikdən sonra əsas ekran və siyahı zaman xəttinizdə yalnız seçdiyiniz dillərdəki göndərişlər görünəcək. Bütün dillərdə göndəriş almaq üçün heç birini seçməyin.",
|
||||
"subscribed_languages.save": "Dəyişiklikləri saxla",
|
||||
"subscribed_languages.target": "{target} üçün abunə olunmuş dilləri dəyişdir",
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Ваш ідэнтыфікатар:",
|
||||
"domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.",
|
||||
"domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.",
|
||||
"dropdown.empty": "Выбраць варыянт",
|
||||
"embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.",
|
||||
"embed.preview": "Вось як гэта будзе выглядаць:",
|
||||
"emoji_button.activity": "Актыўнасць",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Ігнараваць размову",
|
||||
"status.open": "Разгарнуць гэты допіс",
|
||||
"status.pin": "Замацаваць у профілі",
|
||||
"status.quote.cancel": "Адмяніць цытаванне",
|
||||
"status.quote_error.filtered": "Схавана адным з Вашых фільтраў",
|
||||
"status.quote_error.not_available": "Допіс недаступны",
|
||||
"status.quote_error.pending_approval": "Допіс чакае пацвярджэння",
|
||||
"status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.",
|
||||
"status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой",
|
||||
"status.quote_policy_change": "Змяніць, хто можа цытаваць",
|
||||
"status.quote_post_author": "Цытаваў допіс @{name}",
|
||||
"status.read_more": "Чытаць болей",
|
||||
"status.reblog": "Пашырыць",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Праматаць уперад",
|
||||
"video.unmute": "Уключыць гук",
|
||||
"video.volume_down": "Паменшыць гучнасць",
|
||||
"video.volume_up": "Павялічыць гучнасць"
|
||||
"video.volume_up": "Павялічыць гучнасць",
|
||||
"visibility_modal.button_title": "Вызначыць бачнасць",
|
||||
"visibility_modal.header": "Бачнасць і ўзаемадзеянне",
|
||||
"visibility_modal.helper.direct_quoting": "Прыватныя згадванні нельга цытаваць.",
|
||||
"visibility_modal.helper.privacy_editing": "Апублікаваным допісам нельга змяняць бачнасць.",
|
||||
"visibility_modal.helper.private_quoting": "Допісы для падпісчыкаў нельга цытаваць.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Калі людзі працытуюць Вас, іх допіс таксама будзе схаваны ад стужкі трэндаў.",
|
||||
"visibility_modal.instructions": "Кантралюйце, хто можа ўзаемадзейнічаць з Вашым допісам. Глабальныя налады можна знайсці ў <link>Налады > Іншае</link>.",
|
||||
"visibility_modal.privacy_label": "Прыватнасць",
|
||||
"visibility_modal.quote_followers": "Толькі падпісчыкі",
|
||||
"visibility_modal.quote_label": "Змяніць, хто можа цытаваць",
|
||||
"visibility_modal.quote_nobody": "Ніхто",
|
||||
"visibility_modal.quote_public": "Усе"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "Модерирани сървъри",
|
||||
"about.contact": "За контакти:",
|
||||
"about.default_locale": "По подразбиране",
|
||||
"about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Няма налична причина",
|
||||
"about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.",
|
||||
|
@ -244,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Премахване на последовател",
|
||||
"confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?",
|
||||
"confirmations.remove_from_followers.title": "Премахвате ли последовател?",
|
||||
"confirmations.revoke_quote.confirm": "Премахване на публикация",
|
||||
"confirmations.revoke_quote.message": "Действието е неотменимо.",
|
||||
"confirmations.revoke_quote.title": "Премахвате ли публикацията?",
|
||||
"confirmations.unfollow.confirm": "Без следване",
|
||||
"confirmations.unfollow.message": "Наистина ли искате вече да не следвате {name}?",
|
||||
"confirmations.unfollow.title": "Спирате ли да следвате потребителя?",
|
||||
|
@ -288,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Вашият адрес:",
|
||||
"domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.",
|
||||
"domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.",
|
||||
"dropdown.empty": "Изберете възможност",
|
||||
"embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.",
|
||||
"embed.preview": "Ето как ще изглежда:",
|
||||
"emoji_button.activity": "Дейност",
|
||||
|
@ -493,6 +498,8 @@
|
|||
"keyboard_shortcuts.translate": "за превод на публикация",
|
||||
"keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
|
||||
"keyboard_shortcuts.up": "Преместване нагоре в списъка",
|
||||
"learn_more_link.got_it": "Разбрах",
|
||||
"learn_more_link.learn_more": "Научете повече",
|
||||
"lightbox.close": "Затваряне",
|
||||
"lightbox.next": "Напред",
|
||||
"lightbox.previous": "Назад",
|
||||
|
@ -587,6 +594,7 @@
|
|||
"notification.label.mention": "Споменаване",
|
||||
"notification.label.private_mention": "Частно споменаване",
|
||||
"notification.label.private_reply": "Личен отговор",
|
||||
"notification.label.quote": "{name} цитира ваша публикация",
|
||||
"notification.label.reply": "Отговор",
|
||||
"notification.mention": "Споменаване",
|
||||
"notification.mentioned_you": "{name} ви спомена",
|
||||
|
@ -644,6 +652,7 @@
|
|||
"notifications.column_settings.mention": "Споменавания:",
|
||||
"notifications.column_settings.poll": "Резултати от анкета:",
|
||||
"notifications.column_settings.push": "Изскачащи известия",
|
||||
"notifications.column_settings.quote": "Цитати:",
|
||||
"notifications.column_settings.reblog": "Подсилвания:",
|
||||
"notifications.column_settings.show": "Показване в колоната",
|
||||
"notifications.column_settings.sound": "Пускане на звук",
|
||||
|
@ -834,6 +843,8 @@
|
|||
"status.bookmark": "Отмятане",
|
||||
"status.cancel_reblog_private": "Край на подсилването",
|
||||
"status.cannot_reblog": "Публикацията не може да се подсилва",
|
||||
"status.context.load_new_replies": "Има нови отговори",
|
||||
"status.context.loading": "Проверка за още отговори",
|
||||
"status.continued_thread": "Продължена нишка",
|
||||
"status.copy": "Копиране на връзката към публикация",
|
||||
"status.delete": "Изтриване",
|
||||
|
@ -860,6 +871,10 @@
|
|||
"status.open": "Разширяване на публикацията",
|
||||
"status.pin": "Закачане в профила",
|
||||
"status.quote_error.filtered": "Скрито поради един от филтрите ви",
|
||||
"status.quote_error.not_available": "Неналична публикация",
|
||||
"status.quote_error.pending_approval": "Публикацията чака одобрение",
|
||||
"status.quote_policy_change": "Промяна кой може да цитира",
|
||||
"status.quote_post_author": "Цитирах публикация от @{name}",
|
||||
"status.read_more": "Още за четене",
|
||||
"status.reblog": "Подсилване",
|
||||
"status.reblog_private": "Подсилване с оригиналната видимост",
|
||||
|
@ -874,6 +889,7 @@
|
|||
"status.reply": "Отговор",
|
||||
"status.replyAll": "Отговор на нишка",
|
||||
"status.report": "Докладване на @{name}",
|
||||
"status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}",
|
||||
"status.sensitive_warning": "Деликатно съдържание",
|
||||
"status.share": "Споделяне",
|
||||
"status.show_less_all": "Показване на по-малко за всички",
|
||||
|
@ -933,5 +949,15 @@
|
|||
"video.skip_forward": "Прескок напред",
|
||||
"video.unmute": "Без заглушаване",
|
||||
"video.volume_down": "Намаляване на звука",
|
||||
"video.volume_up": "Увеличаване на звука"
|
||||
"video.volume_up": "Увеличаване на звука",
|
||||
"visibility_modal.button_title": "Задаване на видимост",
|
||||
"visibility_modal.header": "Видимост и взаимодействие",
|
||||
"visibility_modal.helper.direct_quoting": "Частни споменавания не може да се цитират.",
|
||||
"visibility_modal.helper.privacy_editing": "Публикуваните публикации не може да променят видимостта си.",
|
||||
"visibility_modal.instructions": "Управлявайте кой може да взаимодейства с тази публикация. Глобалните настройки може да се намерят под <link>Предпочитания> Друго</link>.",
|
||||
"visibility_modal.privacy_label": "Поверителност",
|
||||
"visibility_modal.quote_followers": "Само последователи",
|
||||
"visibility_modal.quote_label": "Промяна кой може да цитира",
|
||||
"visibility_modal.quote_nobody": "Никого",
|
||||
"visibility_modal.quote_public": "Някой"
|
||||
}
|
||||
|
|
|
@ -245,7 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Elimina el seguidor",
|
||||
"confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?",
|
||||
"confirmations.remove_from_followers.title": "Eliminem el seguidor?",
|
||||
"confirmations.revoke_quote.confirm": "Eliminar la publicació",
|
||||
"confirmations.revoke_quote.message": "Aquesta acció no es pot desfer.",
|
||||
"confirmations.revoke_quote.title": "Eliminar la publicació?",
|
||||
"confirmations.unfollow.confirm": "Deixa de seguir",
|
||||
"confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
|
||||
"confirmations.unfollow.title": "Deixar de seguir l'usuari?",
|
||||
|
@ -290,6 +292,7 @@
|
|||
"domain_pill.your_handle": "El vostre identificador:",
|
||||
"domain_pill.your_server": "La vostra llar digital, on són totes les vostres publicacions. No us agrada aquesta? Canvieu de servidor quan vulgueu i emporteu-vos els vostres seguidors.",
|
||||
"domain_pill.your_username": "El vostre identificador únic en aquest servidor. Hi pot haver usuaris amb el mateix nom a diferents servidors.",
|
||||
"dropdown.empty": "Seleccioneu una opció",
|
||||
"embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
|
||||
"embed.preview": "Aquest aspecte tindrà:",
|
||||
"emoji_button.activity": "Activitat",
|
||||
|
@ -876,11 +879,13 @@
|
|||
"status.mute_conversation": "Silencia la conversa",
|
||||
"status.open": "Amplia el tut",
|
||||
"status.pin": "Fixa en el perfil",
|
||||
"status.quote.cancel": "Canceŀlar la citació",
|
||||
"status.quote_error.filtered": "No es mostra a causa d'un dels vostres filtres",
|
||||
"status.quote_error.not_available": "Publicació no disponible",
|
||||
"status.quote_error.pending_approval": "Publicació pendent",
|
||||
"status.quote_error.pending_approval_popout.body": "Les citacions compartides a través del Fediverse poden trigar en aparèixer, perquè diferents servidors tenen diferents protocols.",
|
||||
"status.quote_error.pending_approval_popout.title": "Publicació pendent? Mantinguem la calma",
|
||||
"status.quote_policy_change": "Canvieu qui us pot citar",
|
||||
"status.quote_post_author": "S'ha citat una publicació de @{name}",
|
||||
"status.read_more": "Més informació",
|
||||
"status.reblog": "Impulsa",
|
||||
|
@ -956,5 +961,17 @@
|
|||
"video.skip_forward": "Salta endavant",
|
||||
"video.unmute": "Deixa de silenciar",
|
||||
"video.volume_down": "Abaixa el volum",
|
||||
"video.volume_up": "Apuja el volum"
|
||||
"video.volume_up": "Apuja el volum",
|
||||
"visibility_modal.button_title": "Establiu la visibilitat",
|
||||
"visibility_modal.header": "Visibilitat i interacció",
|
||||
"visibility_modal.helper.direct_quoting": "No es poden citar les mencions privades.",
|
||||
"visibility_modal.helper.privacy_editing": "No es pot canviar la visibilitat de les publicacions ja fetes.",
|
||||
"visibility_modal.helper.private_quoting": "No es poden citar les publicacions només per a seguidors.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quan la gent et citi les seves publicacions estaran amagades de les línies de temps de tendències.",
|
||||
"visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. La configuració global es troba a <link>Preferències>Altres</link>.",
|
||||
"visibility_modal.privacy_label": "Privacitat",
|
||||
"visibility_modal.quote_followers": "Només seguidors",
|
||||
"visibility_modal.quote_label": "Canvieu qui us pot citar",
|
||||
"visibility_modal.quote_nobody": "Ningú",
|
||||
"visibility_modal.quote_public": "Qualsevol"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tvůj handle:",
|
||||
"domain_pill.your_server": "Tvůj digitální domov, kde žijí všechny tvé příspěvky. Nelíbí se ti? Kdykoliv se přesuň na jiný server a vezmi si sebou i své sledující.",
|
||||
"domain_pill.your_username": "Tvůj jedinečný identifikátor na tomto serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
|
||||
"dropdown.empty": "Vyberte možnost",
|
||||
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
|
||||
"embed.preview": "Takhle to bude vypadat:",
|
||||
"emoji_button.activity": "Aktivita",
|
||||
|
@ -884,6 +885,7 @@
|
|||
"status.quote_error.pending_approval": "Příspěvek čeká na schválení",
|
||||
"status.quote_error.pending_approval_popout.body": "Zobrazení citátů sdílených napříč Fediversem může chvíli trvat, protože různé servery používají různé protokoly.",
|
||||
"status.quote_error.pending_approval_popout.title": "Příspěvek čeká na schválení? Buďte klidní",
|
||||
"status.quote_policy_change": "Změňte, kdo může citovat",
|
||||
"status.quote_post_author": "Citovali příspěvek od @{name}",
|
||||
"status.read_more": "Číst více",
|
||||
"status.reblog": "Boostnout",
|
||||
|
@ -959,5 +961,17 @@
|
|||
"video.skip_forward": "Přeskočit vpřed",
|
||||
"video.unmute": "Zrušit ztlumení",
|
||||
"video.volume_down": "Snížit hlasitost",
|
||||
"video.volume_up": "Zvýšit hlasitost"
|
||||
"video.volume_up": "Zvýšit hlasitost",
|
||||
"visibility_modal.button_title": "Nastavit viditelnost",
|
||||
"visibility_modal.header": "Viditelnost a interakce",
|
||||
"visibility_modal.helper.direct_quoting": "Soukromé zmínky nemohou být citovány.",
|
||||
"visibility_modal.helper.privacy_editing": "Publikované příspěvky nemohou změnit svou viditelnost.",
|
||||
"visibility_modal.helper.private_quoting": "Nelze citovat příspěvky, které jsou pouze pro sledující.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt.",
|
||||
"visibility_modal.instructions": "Kontrolujte, kdo může interagovat s tímto příspěvkem. Globální nastavení můžete najít pod <link>Nastavení > Ostatní</link>.",
|
||||
"visibility_modal.privacy_label": "Soukromí",
|
||||
"visibility_modal.quote_followers": "Pouze sledující",
|
||||
"visibility_modal.quote_label": "Změňte, kdo může citovat",
|
||||
"visibility_modal.quote_nobody": "Nikdo",
|
||||
"visibility_modal.quote_public": "Kdokoliv"
|
||||
}
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Dileu dilynwr",
|
||||
"confirmations.remove_from_followers.message": "Bydd {name} yn rhoi'r gorau i'ch dilyn. A ydych yn siŵr eich bod am fwrw ymlaen?",
|
||||
"confirmations.remove_from_followers.title": "Tynnu dilynwr?",
|
||||
"confirmations.revoke_quote.confirm": "Dileu'r postiad",
|
||||
"confirmations.revoke_quote.message": "Does dim modd dadwneud y weithred hon.",
|
||||
"confirmations.revoke_quote.title": "Dileu'r postiad?",
|
||||
"confirmations.unfollow.confirm": "Dad-ddilyn",
|
||||
"confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?",
|
||||
"confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Eich handlen:",
|
||||
"domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.",
|
||||
"domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
|
||||
"dropdown.empty": "Dewis dewis",
|
||||
"embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
|
||||
"embed.preview": "Dyma sut olwg fydd arno:",
|
||||
"emoji_button.activity": "Gweithgarwch",
|
||||
|
@ -498,6 +502,8 @@
|
|||
"keyboard_shortcuts.translate": "i gyfieithu postiad",
|
||||
"keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio",
|
||||
"keyboard_shortcuts.up": "Symud yn uwch yn y rhestr",
|
||||
"learn_more_link.got_it": "Iawn",
|
||||
"learn_more_link.learn_more": "Dysgu rhagor",
|
||||
"lightbox.close": "Cau",
|
||||
"lightbox.next": "Nesaf",
|
||||
"lightbox.previous": "Blaenorol",
|
||||
|
@ -558,7 +564,7 @@
|
|||
"navigation_bar.favourites": "Ffefrynnau",
|
||||
"navigation_bar.filters": "Geiriau wedi'u tewi",
|
||||
"navigation_bar.follow_requests": "Ceisiadau dilyn",
|
||||
"navigation_bar.followed_tags": "Hashnodau a ddilynir",
|
||||
"navigation_bar.followed_tags": "Hashnodau sy'n cael eu dilyn",
|
||||
"navigation_bar.follows_and_followers": "Yn dilyn a dilynwyr",
|
||||
"navigation_bar.import_export": "Mewnforio ac allforio",
|
||||
"navigation_bar.lists": "Rhestrau",
|
||||
|
@ -598,6 +604,7 @@
|
|||
"notification.label.mention": "Crybwyll",
|
||||
"notification.label.private_mention": "Crybwyll preifat",
|
||||
"notification.label.private_reply": "Ymateb preifat",
|
||||
"notification.label.quote": "Mae {name} wedi dyfynnu eich postiad",
|
||||
"notification.label.reply": "Ymateb",
|
||||
"notification.mention": "Crybwyll",
|
||||
"notification.mentioned_you": "Rydych wedi'ch crybwyll gan {name}",
|
||||
|
@ -655,6 +662,7 @@
|
|||
"notifications.column_settings.mention": "Crybwylliadau:",
|
||||
"notifications.column_settings.poll": "Canlyniadau pleidlais:",
|
||||
"notifications.column_settings.push": "Hysbysiadau gwthio",
|
||||
"notifications.column_settings.quote": "Dyfyniadau:",
|
||||
"notifications.column_settings.reblog": "Hybiau:",
|
||||
"notifications.column_settings.show": "Dangos yn y golofn",
|
||||
"notifications.column_settings.sound": "Chwarae sain",
|
||||
|
@ -845,6 +853,8 @@
|
|||
"status.bookmark": "Nod tudalen",
|
||||
"status.cancel_reblog_private": "Dadhybu",
|
||||
"status.cannot_reblog": "Does dim modd hybu'r postiad hwn",
|
||||
"status.context.load_new_replies": "Mae atebion newydd ar gael",
|
||||
"status.context.loading": "Yn chwilio am fwy o atebion",
|
||||
"status.continued_thread": "Edefyn parhaus",
|
||||
"status.copy": "Copïo dolen i'r post",
|
||||
"status.delete": "Dileu",
|
||||
|
@ -871,6 +881,12 @@
|
|||
"status.open": "Ehangu'r post hwn",
|
||||
"status.pin": "Pinio ar y proffil",
|
||||
"status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr",
|
||||
"status.quote_error.not_available": "Postiad ddim ar gael",
|
||||
"status.quote_error.pending_approval": "Postiad yn yr arfaeth",
|
||||
"status.quote_error.pending_approval_popout.body": "Gall dyfyniadau sy'n cael eu rhannu ar draws y Ffedysawd gymryd amser i'w dangos, gan fod gan wahanol weinyddion brotocolau gwahanol.",
|
||||
"status.quote_error.pending_approval_popout.title": "Dyfyniad yn aros? Amynedd :-)",
|
||||
"status.quote_policy_change": "Newid pwy all ddyfynnu",
|
||||
"status.quote_post_author": "Wedi dyfynnu postiad gan @{name}",
|
||||
"status.read_more": "Darllen rhagor",
|
||||
"status.reblog": "Hybu",
|
||||
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
|
||||
|
@ -885,6 +901,7 @@
|
|||
"status.reply": "Ymateb",
|
||||
"status.replyAll": "Ateb edefyn",
|
||||
"status.report": "Adrodd ar @{name}",
|
||||
"status.revoke_quote": "Dileu fy mhostiad o bostiad @{name}",
|
||||
"status.sensitive_warning": "Cynnwys sensitif",
|
||||
"status.share": "Rhannu",
|
||||
"status.show_less_all": "Dangos llai i bawb",
|
||||
|
@ -944,5 +961,17 @@
|
|||
"video.skip_forward": "Symud ymlaen",
|
||||
"video.unmute": "Dad-dewi",
|
||||
"video.volume_down": "Lefel sain i lawr",
|
||||
"video.volume_up": "Lefel sain i fyny"
|
||||
"video.volume_up": "Lefel sain i fyny",
|
||||
"visibility_modal.button_title": "Gosod gwelededd",
|
||||
"visibility_modal.header": "Gwelededd a rhyngweithio",
|
||||
"visibility_modal.helper.direct_quoting": "Does dim modd dyfynnu crybwylliadau preifat.",
|
||||
"visibility_modal.helper.privacy_editing": "Does dim modd newid gwelededd postiadau wedi'u cyhoeddi.",
|
||||
"visibility_modal.helper.private_quoting": "Does dim modd dyfynnu postiadau dilynwyr yn unig.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio.",
|
||||
"visibility_modal.instructions": "Rheolwch bwy all ryngweithio â'r postiad hwn. Mae modd dod o hyd i osodiadau eang o dan <link>Dewisiadau > Arall</link>.",
|
||||
"visibility_modal.privacy_label": "Preifatrwydd",
|
||||
"visibility_modal.quote_followers": "Dilynwyr yn unig",
|
||||
"visibility_modal.quote_label": "Newid pwy all ddyfynnu",
|
||||
"visibility_modal.quote_nobody": "Neb",
|
||||
"visibility_modal.quote_public": "Pawb"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Dit handle:",
|
||||
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
|
||||
"domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
|
||||
"dropdown.empty": "Vælg en indstillingsmulighed",
|
||||
"embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
|
||||
"embed.preview": "Sådan kommer det til at se ud:",
|
||||
"emoji_button.activity": "Aktivitet",
|
||||
|
@ -884,6 +885,7 @@
|
|||
"status.quote_error.pending_approval": "Afventende indlæg",
|
||||
"status.quote_error.pending_approval_popout.body": "Citater delt på tværs af Fediverset kan tage tid at vise, da forskellige servere har forskellige protokoller.",
|
||||
"status.quote_error.pending_approval_popout.title": "Afventende citat? Tag det roligt",
|
||||
"status.quote_policy_change": "Ændr hvem der kan citere",
|
||||
"status.quote_post_author": "Citerede et indlæg fra @{name}",
|
||||
"status.read_more": "Læs mere",
|
||||
"status.reblog": "Fremhæv",
|
||||
|
@ -959,5 +961,17 @@
|
|||
"video.skip_forward": "Overspring fremad",
|
||||
"video.unmute": "Slå lyd tl",
|
||||
"video.volume_down": "Lydstyrke ned",
|
||||
"video.volume_up": "Lydstyrke op"
|
||||
"video.volume_up": "Lydstyrke op",
|
||||
"visibility_modal.button_title": "Indstil synlighed",
|
||||
"visibility_modal.header": "Synlighed og interaktion",
|
||||
"visibility_modal.helper.direct_quoting": "Private omtaler kan ikke citeres.",
|
||||
"visibility_modal.helper.privacy_editing": "Publicerede indlægs synlighed kan ikke ændres.",
|
||||
"visibility_modal.helper.private_quoting": "Indlæg kun for følgere kan ikke citeres.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Når man citeres af andre, skjules deres indlæg også på tendenstidslinjer.",
|
||||
"visibility_modal.instructions": "Styr, hvem der kan interagere med dette indlæg. Globale indstillinger findes under <link>Præferencer > Andet</link>.",
|
||||
"visibility_modal.privacy_label": "Fortrolighed",
|
||||
"visibility_modal.quote_followers": "Kun følgere",
|
||||
"visibility_modal.quote_label": "Ændr hvem der kan citere",
|
||||
"visibility_modal.quote_nobody": "Ingen",
|
||||
"visibility_modal.quote_public": "Alle"
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
"account.mute_short": "Stummschalten",
|
||||
"account.muted": "Stummgeschaltet",
|
||||
"account.muting": "Stummgeschaltet",
|
||||
"account.mutual": "Ihr folgt euch",
|
||||
"account.mutual": "Ihr folgt einander",
|
||||
"account.no_bio": "Keine Beschreibung verfügbar.",
|
||||
"account.open_original_page": "Ursprüngliche Seite öffnen",
|
||||
"account.posts": "Beiträge",
|
||||
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "Unterhaltung stummschalten",
|
||||
"status.open": "Beitrag öffnen",
|
||||
"status.pin": "Im Profil anheften",
|
||||
"status.quote.cancel": "Zitat abbrechen",
|
||||
"status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter",
|
||||
"status.quote_error.not_available": "Beitrag nicht verfügbar",
|
||||
"status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend",
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Το πλήρες όνομα χρήστη σου:",
|
||||
"domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου.",
|
||||
"domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.",
|
||||
"dropdown.empty": "Διαλέξτε μια επιλογή",
|
||||
"embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.",
|
||||
"embed.preview": "Ορίστε πως θα φαίνεται:",
|
||||
"emoji_button.activity": "Δραστηριότητα",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Σίγαση συνομιλίας",
|
||||
"status.open": "Επέκταση ανάρτησης",
|
||||
"status.pin": "Καρφίτσωσε στο προφίλ",
|
||||
"status.quote.cancel": "Ακύρωση παράθεσης",
|
||||
"status.quote_error.filtered": "Κρυφό λόγω ενός από τα φίλτρα σου",
|
||||
"status.quote_error.not_available": "Ανάρτηση μη διαθέσιμη",
|
||||
"status.quote_error.pending_approval": "Ανάρτηση σε αναμονή",
|
||||
"status.quote_error.pending_approval_popout.body": "Οι παραθέσεις που μοιράζονται στο Fediverse μπορεί να χρειαστούν χρόνο για να εμφανιστούν, καθώς διαφορετικοί διακομιστές έχουν διαφορετικά πρωτόκολλα.",
|
||||
"status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι",
|
||||
"status.quote_policy_change": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
|
||||
"status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}",
|
||||
"status.read_more": "Διάβασε περισότερα",
|
||||
"status.reblog": "Ενίσχυση",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Παράλειψη εμπρός",
|
||||
"video.unmute": "Άρση σίγασης",
|
||||
"video.volume_down": "Μείωση έντασης",
|
||||
"video.volume_up": "Αύξηση έντασης"
|
||||
"video.volume_up": "Αύξηση έντασης",
|
||||
"visibility_modal.button_title": "Ορισμός ορατότητας",
|
||||
"visibility_modal.header": "Ορατότητα και αλληλεπίδραση",
|
||||
"visibility_modal.helper.direct_quoting": "Ιδιωτικές επισημάνσεις δεν μπορούν να παρατεθούν.",
|
||||
"visibility_modal.helper.privacy_editing": "Δημοσιευμένες αναρτήσεις δεν μπορούν να αλλάξουν την ορατότητά τους.",
|
||||
"visibility_modal.helper.private_quoting": "Οι αναρτήσεις μόνο για ακολούθους δεν μπορούν να παρατεθούν.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Όταν οι άνθρωποι σας παραθέτουν, η ανάρτηση τους θα είναι επίσης κρυμμένη από τα δημοφιλή χρονοδιαγράμματα.",
|
||||
"visibility_modal.instructions": "Ελέγξτε ποιός μπορεί να αλληλεπιδράσει με αυτή την ανάρτηση. Οι καθολικές ρυθμίσεις μπορούν να βρεθούν κάτω από <link>Προτιμήσεις > Άλλα</link>.",
|
||||
"visibility_modal.privacy_label": "Απόρρητο",
|
||||
"visibility_modal.quote_followers": "Μόνο ακόλουθοι",
|
||||
"visibility_modal.quote_label": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
|
||||
"visibility_modal.quote_nobody": "Κανένας",
|
||||
"visibility_modal.quote_public": "Οποιοσδήποτε"
|
||||
}
|
||||
|
|
|
@ -849,9 +849,11 @@
|
|||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_domain": "Open moderation interface for {domain}",
|
||||
"status.admin_status": "Open this post in the moderation interface",
|
||||
"status.all_disabled": "Boosts and quotes are disabled",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_quote": "Author has disabled quoting on this post",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.context.load_new_replies": "New replies available",
|
||||
"status.context.loading": "Checking for more replies",
|
||||
|
@ -880,6 +882,8 @@
|
|||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this post",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.quote": "Quote",
|
||||
"status.quote.cancel": "Cancel quote",
|
||||
"status.quote_error.filtered": "Hidden due to one of your filters",
|
||||
"status.quote_error.not_available": "Post unavailable",
|
||||
"status.quote_error.pending_approval": "Post pending",
|
||||
|
@ -887,6 +891,7 @@
|
|||
"status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm",
|
||||
"status.quote_policy_change": "Change who can quote",
|
||||
"status.quote_post_author": "Quoted a post by @{name}",
|
||||
"status.quote_private": "Private posts cannot be quoted",
|
||||
"status.read_more": "Read more",
|
||||
"status.reblog": "Boost",
|
||||
"status.reblog_private": "Boost with original visibility",
|
||||
|
|
|
@ -287,6 +287,7 @@
|
|||
"domain_pill.your_handle": "Via identigo:",
|
||||
"domain_pill.your_server": "Via cifereca hejmo, kie loĝas ĉiuj viaj afiŝoj. Ĉu vi ne ŝatas ĉi tiun? Transloku servilojn iam ajn kaj alportu ankaŭ viajn sekvantojn.",
|
||||
"domain_pill.your_username": "Via unika identigilo sur ĉi tiu servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.",
|
||||
"dropdown.empty": "Elektu opcion",
|
||||
"embed.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.",
|
||||
"embed.preview": "Ĝi aperos tiel:",
|
||||
"emoji_button.activity": "Agadoj",
|
||||
|
@ -940,5 +941,16 @@
|
|||
"video.skip_forward": "Preterpasi antaŭen",
|
||||
"video.unmute": "Ne plu silentigi",
|
||||
"video.volume_down": "Laŭteco Malpliigi",
|
||||
"video.volume_up": "Laŭteco pliigi"
|
||||
"video.volume_up": "Laŭteco pliigi",
|
||||
"visibility_modal.button_title": "Agordu videblon",
|
||||
"visibility_modal.header": "Videblo kaj interago",
|
||||
"visibility_modal.helper.direct_quoting": "Privataj mencioj ne povas esti cititaj.",
|
||||
"visibility_modal.helper.privacy_editing": "Publikigitaj afiŝoj ne povas ŝanĝi sian videblon.",
|
||||
"visibility_modal.helper.private_quoting": "Afiŝoj nur por sekvantoj ne povas esti cititaj.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj.",
|
||||
"visibility_modal.privacy_label": "Privateco",
|
||||
"visibility_modal.quote_followers": "Nur sekvantoj",
|
||||
"visibility_modal.quote_label": "Ŝanĝi kiu povas citi",
|
||||
"visibility_modal.quote_nobody": "Neniu",
|
||||
"visibility_modal.quote_public": "Iu ajn"
|
||||
}
|
||||
|
|
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir este mensaje",
|
||||
"status.pin": "Fijar en el perfil",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Mensaje no disponible",
|
||||
"status.quote_error.pending_approval": "Mensaje pendiente",
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tu alias:",
|
||||
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
|
||||
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
|
||||
"dropdown.empty": "Elige una opción",
|
||||
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
|
||||
"embed.preview": "Así es como se verá:",
|
||||
"emoji_button.activity": "Actividad",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir estado",
|
||||
"status.pin": "Fijar",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Publicación no disponible",
|
||||
"status.quote_error.pending_approval": "Publicación pendiente",
|
||||
"status.quote_error.pending_approval_popout.body": "Las citas compartidas en el Fediverso pueden tardar en mostrarse, ya que cada servidor tiene un protocolo diferente.",
|
||||
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
|
||||
"status.quote_policy_change": "Cambia quién puede citarte",
|
||||
"status.quote_post_author": "Ha citado una publicación de @{name}",
|
||||
"status.read_more": "Leer más",
|
||||
"status.reblog": "Impulsar",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Saltar adelante",
|
||||
"video.unmute": "Dejar de silenciar",
|
||||
"video.volume_down": "Bajar el volumen",
|
||||
"video.volume_up": "Subir el volumen"
|
||||
"video.volume_up": "Subir el volumen",
|
||||
"visibility_modal.button_title": "Establece la visibilidad",
|
||||
"visibility_modal.header": "Visibilidad e interacción",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas no pueden citarse.",
|
||||
"visibility_modal.helper.privacy_editing": "Las publicaciones ya enviadas no pueden cambiar su visibilidad.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando las personas te citen, sus publicaciones también se ocultarán de las cronologías de tendencias.",
|
||||
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. La configuración global se encuentra en <link>Preferencias > Otros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidad",
|
||||
"visibility_modal.quote_followers": "Solo seguidores",
|
||||
"visibility_modal.quote_label": "Cambia quién puede citarte",
|
||||
"visibility_modal.quote_nobody": "Nadie",
|
||||
"visibility_modal.quote_public": "Cualquiera"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tu alias:",
|
||||
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
|
||||
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
|
||||
"dropdown.empty": "Selecciona una opción",
|
||||
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
|
||||
"embed.preview": "Así es como se verá:",
|
||||
"emoji_button.activity": "Actividad",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir publicación",
|
||||
"status.pin": "Fijar",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Publicación no disponible",
|
||||
"status.quote_error.pending_approval": "Publicación pendiente",
|
||||
"status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que los diferentes servidores tienen diferentes protocolos.",
|
||||
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
|
||||
"status.quote_policy_change": "Cambia quién puede citarte",
|
||||
"status.quote_post_author": "Ha citado una publicación de @{name}",
|
||||
"status.read_more": "Leer más",
|
||||
"status.reblog": "Impulsar",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Adelantar",
|
||||
"video.unmute": "Dejar de silenciar",
|
||||
"video.volume_down": "Bajar volumen",
|
||||
"video.volume_up": "Subir volumen"
|
||||
"video.volume_up": "Subir volumen",
|
||||
"visibility_modal.button_title": "Configura la visibilidad",
|
||||
"visibility_modal.header": "Visibilidad e interacciones",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas no se pueden citar.",
|
||||
"visibility_modal.helper.privacy_editing": "Las publicaciones no pueden cambiar su visibilidad.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando la gente te cite, su publicación tampoco se mostrará en las cronologías públicas.",
|
||||
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. Puedes encontrar los ajustes globales en <link>Preferencias > Otros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidad",
|
||||
"visibility_modal.quote_followers": "Sólo seguidores",
|
||||
"visibility_modal.quote_label": "Cambia quién puede citarte",
|
||||
"visibility_modal.quote_nobody": "Nadie",
|
||||
"visibility_modal.quote_public": "Cualquiera"
|
||||
}
|
||||
|
|
|
@ -39,11 +39,11 @@
|
|||
"account.featured_tags.last_status_at": "آخرین فرسته در {date}",
|
||||
"account.featured_tags.last_status_never": "بدون فرسته",
|
||||
"account.follow": "پیگرفتن",
|
||||
"account.follow_back": "دنبال کردن متقابل",
|
||||
"account.follow_back": "پیگیری متقابل",
|
||||
"account.followers": "پیگیرندگان",
|
||||
"account.followers.empty": "هنوز کسی پیگیر این کاربر نیست.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} پیگیرنده} other {{counter} پیگیرنده}}",
|
||||
"account.followers_you_know_counter": "{counter} را میشناسید",
|
||||
"account.followers_you_know_counter": "{counter} نفر را میشناسید",
|
||||
"account.following": "پی میگیرید",
|
||||
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
|
||||
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
|
||||
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "شناسهتان:",
|
||||
"domain_pill.your_server": "خانهٔ رقمیتان. جایی که همهٔ فرستههایتان میزیند. دوستش ندارید؟ در هر زمان کارسازتان را جابهجا کرده و پیگیرندگانتان را نیز بیاورید.",
|
||||
"domain_pill.your_username": "شناسهٔ یکتایتان روی این کارساز. ممکن است کاربرانی با نام کاربری مشابه روی کارسازهای دیگر باشند.",
|
||||
"dropdown.empty": "انتخاب یک گزینه",
|
||||
"embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.",
|
||||
"embed.preview": "این گونه دیده خواهد شد:",
|
||||
"emoji_button.activity": "فعالیت",
|
||||
|
@ -879,9 +880,13 @@
|
|||
"status.mute_conversation": "خموشاندن گفتوگو",
|
||||
"status.open": "گسترش این فرسته",
|
||||
"status.pin": "سنجاق به نمایه",
|
||||
"status.quote.cancel": "لغو نقل",
|
||||
"status.quote_error.filtered": "نهفته بنا بر یکی از پالایههایتان",
|
||||
"status.quote_error.not_available": "فرسته در دسترس نیست",
|
||||
"status.quote_error.pending_approval": "فرسته منتظر",
|
||||
"status.quote_error.pending_approval_popout.body": "نقلقولهایی که در سراسر فدیورس همرسانی میشوند ممکن است زمانبر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوهنامههای متفاوتی استفاده میکنند.",
|
||||
"status.quote_error.pending_approval_popout.title": "منتظر نقل؟ خونسرد بمانید",
|
||||
"status.quote_policy_change": "تغییر کسانی که میتوانند نقل کنند",
|
||||
"status.quote_post_author": "فرستهای از @{name} نقل شد",
|
||||
"status.read_more": "بیشتر بخوانید",
|
||||
"status.reblog": "تقویت",
|
||||
|
@ -957,5 +962,17 @@
|
|||
"video.skip_forward": "پرش به پیش",
|
||||
"video.unmute": "ناخموشی",
|
||||
"video.volume_down": "کاهش حجم صدا",
|
||||
"video.volume_up": "افزایش حجم صدا"
|
||||
"video.volume_up": "افزایش حجم صدا",
|
||||
"visibility_modal.button_title": "تنظیم نمایانی",
|
||||
"visibility_modal.header": "نمایانی و برهمکنش",
|
||||
"visibility_modal.helper.direct_quoting": "نامبریهای خصوصی قابل نقل نیستند.",
|
||||
"visibility_modal.helper.privacy_editing": "نمیتوان نمایانی فرستههای منتشر شده را تغییر داد.",
|
||||
"visibility_modal.helper.private_quoting": "فرستههای فقط برای پیگیرندگان نمیتوانند نقل شوند.",
|
||||
"visibility_modal.helper.unlisted_quoting": "هنگامی که افراد نقلتان میکنند فرستهشان هم از خطزمانیهای داغ پنهان خواهد بود.",
|
||||
"visibility_modal.instructions": "واپایش کسانی که میتوانند با این فرسته برهمکنش داشته باشند. تنظیمات سراسری میتواند در <link>ترجیحات > دیگر</link> پیدا شود.",
|
||||
"visibility_modal.privacy_label": "محرمانگی",
|
||||
"visibility_modal.quote_followers": "فقط پیگیرندگان",
|
||||
"visibility_modal.quote_label": "تغییر کسانی که میتوانند نقل کنند",
|
||||
"visibility_modal.quote_nobody": "هیچکس",
|
||||
"visibility_modal.quote_public": "هرکسی"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Käyttäjätunnuksesi:",
|
||||
"domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.",
|
||||
"domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.",
|
||||
"dropdown.empty": "Valitse vaihtoehto",
|
||||
"embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
|
||||
"embed.preview": "Tältä se näyttää:",
|
||||
"emoji_button.activity": "Aktiviteetit",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Mykistä keskustelu",
|
||||
"status.open": "Laajenna julkaisu",
|
||||
"status.pin": "Kiinnitä profiiliin",
|
||||
"status.quote.cancel": "Peruuta lainaus",
|
||||
"status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia",
|
||||
"status.quote_error.not_available": "Julkaisu ei saatavilla",
|
||||
"status.quote_error.pending_approval": "Julkaisu odottaa",
|
||||
"status.quote_error.pending_approval_popout.body": "Saattaa viedä jonkin ainaa ennen kuin fediversumin kautta jaetut julkaisut tulevat näkyviin, sillä eri palvelimet käyttävät eri protokollia.",
|
||||
"status.quote_error.pending_approval_popout.title": "Odottava lainaus? Pysy rauhallisena",
|
||||
"status.quote_policy_change": "Vaihda, kuka voi lainata",
|
||||
"status.quote_post_author": "Lainaa käyttäjän @{name} julkaisua",
|
||||
"status.read_more": "Näytä enemmän",
|
||||
"status.reblog": "Tehosta",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Siirry eteenpäin",
|
||||
"video.unmute": "Poista mykistys",
|
||||
"video.volume_down": "Vähennä äänenvoimakkuutta",
|
||||
"video.volume_up": "Lisää äänenvoimakkuutta"
|
||||
"video.volume_up": "Lisää äänenvoimakkuutta",
|
||||
"visibility_modal.button_title": "Aseta näkyvyys",
|
||||
"visibility_modal.header": "Näkyvyys ja vuorovaikutus",
|
||||
"visibility_modal.helper.direct_quoting": "Yksityismainintoja ei voi lainata.",
|
||||
"visibility_modal.helper.privacy_editing": "Lähetettyjen julkaisujen näkyvyyttä ei voi vaihtaa.",
|
||||
"visibility_modal.helper.private_quoting": "Vain seuraajille tarkoitettuja julkaisuja ei voi lainata.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kun ihmiset lainaavat sinua, myös heidän julkaisunsa piilotetaan suosittujen julkaisujen aikajanoilta.",
|
||||
"visibility_modal.instructions": "Hallitse, kuka voi olla vuorovaikutuksessa tämän julkaisun kanssa. Yleiset asetukset sijaitsevat kohdassa <link>Asetukset > Muut</link>.",
|
||||
"visibility_modal.privacy_label": "Yksityisyys",
|
||||
"visibility_modal.quote_followers": "Vain seuraajat",
|
||||
"visibility_modal.quote_label": "Vaihda, kuka voi lainata",
|
||||
"visibility_modal.quote_nobody": "Ei kukaan",
|
||||
"visibility_modal.quote_public": "Kuka tahansa"
|
||||
}
|
||||
|
|
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "Doyv samrøðu",
|
||||
"status.open": "Víðka henda postin",
|
||||
"status.pin": "Ger fastan í vangan",
|
||||
"status.quote.cancel": "Ógilda sitat",
|
||||
"status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta",
|
||||
"status.quote_error.not_available": "Postur ikki tøkur",
|
||||
"status.quote_error.pending_approval": "Postur bíðar",
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Do láimhseáil:",
|
||||
"domain_pill.your_server": "Do theach digiteach, áit a bhfuil do phoist go léir ina gcónaí. Nach maith leat an ceann seo? Aistrigh freastalaithe am ar bith agus tabhair leat do leantóirí freisin.",
|
||||
"domain_pill.your_username": "D'aitheantóir uathúil ar an bhfreastalaí seo. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.",
|
||||
"dropdown.empty": "Roghnaigh rogha",
|
||||
"embed.instructions": "Embed this status on your website by copying the code below.",
|
||||
"embed.preview": "Seo an chuma a bheidh air:",
|
||||
"emoji_button.activity": "Gníomhaíocht",
|
||||
|
@ -884,6 +885,7 @@
|
|||
"status.quote_error.pending_approval": "Post ar feitheamh",
|
||||
"status.quote_error.pending_approval_popout.body": "D’fhéadfadh sé go dtógfadh sé tamall le Sleachta a roinntear ar fud Fediverse a thaispeáint, toisc go mbíonn prótacail éagsúla ag freastalaithe éagsúla.",
|
||||
"status.quote_error.pending_approval_popout.title": "Ag fanacht le luachan? Fan socair",
|
||||
"status.quote_policy_change": "Athraigh cé a fhéadann luachan a thabhairt",
|
||||
"status.quote_post_author": "Luaigh mé post le @{name}",
|
||||
"status.read_more": "Léan a thuilleadh",
|
||||
"status.reblog": "Treisiú",
|
||||
|
@ -959,5 +961,17 @@
|
|||
"video.skip_forward": "Scipeáil ar aghaidh",
|
||||
"video.unmute": "Díbhalbhú",
|
||||
"video.volume_down": "Toirt síos",
|
||||
"video.volume_up": "Toirt suas"
|
||||
"video.volume_up": "Toirt suas",
|
||||
"visibility_modal.button_title": "Socraigh infheictheacht",
|
||||
"visibility_modal.header": "Infheictheacht agus idirghníomhaíocht",
|
||||
"visibility_modal.helper.direct_quoting": "Ní féidir lua a thabhairt ar luanna príobháideacha.",
|
||||
"visibility_modal.helper.privacy_editing": "Ní féidir infheictheacht postálacha foilsithe a athrú.",
|
||||
"visibility_modal.helper.private_quoting": "Ní féidir poist atá dírithe ar leanúna amháin a lua.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Nuair a luann daoine thú, beidh a bpost i bhfolach ó amlínte treochta freisin.",
|
||||
"visibility_modal.instructions": "Rialú cé a fhéadfaidh idirghníomhú leis an bpost seo. Is féidir socruithe domhanda a fháil faoi <link>Sainroghanna > Eile</link>.",
|
||||
"visibility_modal.privacy_label": "Príobháideacht",
|
||||
"visibility_modal.quote_followers": "Leantóirí amháin",
|
||||
"visibility_modal.quote_label": "Athraigh cé a fhéadann luachan a thabhairt",
|
||||
"visibility_modal.quote_nobody": "Níl aon duine",
|
||||
"visibility_modal.quote_public": "Aon duine"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "O teu alcume:",
|
||||
"domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.",
|
||||
"domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.",
|
||||
"dropdown.empty": "Escolle unha opción",
|
||||
"embed.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.",
|
||||
"embed.preview": "Vaise ver así:",
|
||||
"emoji_button.activity": "Actividade",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "Silenciar conversa",
|
||||
"status.open": "Estender esta publicación",
|
||||
"status.pin": "Fixar no perfil",
|
||||
"status.quote.cancel": "Cancelar a cita",
|
||||
"status.quote_error.filtered": "Oculto debido a un dos teus filtros",
|
||||
"status.quote_error.not_available": "Publicación non dispoñible",
|
||||
"status.quote_error.pending_approval": "Publicación pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "As citas compartidas no Fediverso poderían tardar en mostrarse, xa que os diferentes servidores teñen diferentes protocolos.",
|
||||
"status.quote_error.pending_approval_popout.title": "Cita pendente? Non te apures",
|
||||
"status.quote_policy_change": "Cambia quen pode citarte",
|
||||
"status.quote_post_author": "Citou unha publicación de @{name}",
|
||||
"status.read_more": "Ler máis",
|
||||
"status.reblog": "Promover",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "Avanzar",
|
||||
"video.unmute": "Non silenciar",
|
||||
"video.volume_down": "Baixar volume",
|
||||
"video.volume_up": "Subir volume"
|
||||
"video.volume_up": "Subir volume",
|
||||
"visibility_modal.button_title": "Establece a visibilidade",
|
||||
"visibility_modal.header": "Visibilidade e interaccións",
|
||||
"visibility_modal.helper.direct_quoting": "A mencións privadas non se poden citar.",
|
||||
"visibility_modal.helper.privacy_editing": "Non se pode cambiar a visibilidade das publicacións xa publicadas.",
|
||||
"visibility_modal.helper.private_quoting": "As publicacións só para seguidoras non se poden citar.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cando alguén te cite, a súa publicación non aparecerá nas cronoloxías de popularidade.",
|
||||
"visibility_modal.instructions": "Controla quen pode interactuar con esta publicación. Os axustes xerais están en <link>Preferencias > Outros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidade",
|
||||
"visibility_modal.quote_followers": "Só para seguidoras",
|
||||
"visibility_modal.quote_label": "Cambia quen pode citarte",
|
||||
"visibility_modal.quote_nobody": "Ninguén",
|
||||
"visibility_modal.quote_public": "Calquera"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "הכינוי שלך:",
|
||||
"domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.",
|
||||
"domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.",
|
||||
"dropdown.empty": "בחירת אפשרות",
|
||||
"embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.",
|
||||
"embed.preview": "דוגמא כיצד זה יראה:",
|
||||
"emoji_button.activity": "פעילות",
|
||||
|
@ -879,11 +880,13 @@
|
|||
"status.mute_conversation": "השתקת שיחה",
|
||||
"status.open": "הרחבת הודעה זו",
|
||||
"status.pin": "הצמדה לפרופיל שלי",
|
||||
"status.quote.cancel": "ביטול הודעת ציטוט",
|
||||
"status.quote_error.filtered": "מוסתר בהתאם לסננים שלך",
|
||||
"status.quote_error.not_available": "ההודעה לא זמינה",
|
||||
"status.quote_error.pending_approval": "ההודעה בהמתנה לאישור",
|
||||
"status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.",
|
||||
"status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע",
|
||||
"status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך",
|
||||
"status.quote_post_author": "ההודעה צוטטה על ידי @{name}",
|
||||
"status.read_more": "לקרוא עוד",
|
||||
"status.reblog": "הדהוד",
|
||||
|
@ -959,5 +962,17 @@
|
|||
"video.skip_forward": "דילוג קדימה",
|
||||
"video.unmute": "ביטול השתקה",
|
||||
"video.volume_down": "הנמכת עוצמת השמע",
|
||||
"video.volume_up": "הגברת עוצמת שמע"
|
||||
"video.volume_up": "הגברת עוצמת שמע",
|
||||
"visibility_modal.button_title": "בחירת רמת חשיפה",
|
||||
"visibility_modal.header": "חשיפה והידוּד (אינטראקציה)",
|
||||
"visibility_modal.helper.direct_quoting": "הודעות פרטיות לא ניתנות לציטוט.",
|
||||
"visibility_modal.helper.privacy_editing": "לא ניתן לשנות את דרגת החשיפה של הודעות שפורסמו.",
|
||||
"visibility_modal.helper.private_quoting": "לא ניתן לצטט הודעות שחשופות לעוקבים בלבד.",
|
||||
"visibility_modal.helper.unlisted_quoting": "כאשר אחרים מצטטים אותך, ההודעות שלהם יוסתרו גם מ\"נושאים חמים\".",
|
||||
"visibility_modal.instructions": "שליטה בהרשאה להידוּד (תגובות וציטוטים) עם הודעה זו. הגדרות ברירת המחדל ניתן למצוא תחת <link>העדפות > אחרים</link>.",
|
||||
"visibility_modal.privacy_label": "פרטיות",
|
||||
"visibility_modal.quote_followers": "לעוקבים בלבד",
|
||||
"visibility_modal.quote_label": "הגדרת הרשאה לציטוט הודעותיך",
|
||||
"visibility_modal.quote_nobody": "אף אחד",
|
||||
"visibility_modal.quote_public": "כולם"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "Servitores moderate",
|
||||
"about.contact": "Contacto:",
|
||||
"about.default_locale": "Default",
|
||||
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Ration non disponibile",
|
||||
"about.domain_blocks.preamble": "Mastodon generalmente permitte vider le contento de, e interager con, usatores de qualcunque altere servitor in le fediverso. Istes es le exceptiones que ha essite facite sur iste servitor particular.",
|
||||
|
@ -8,6 +9,7 @@
|
|||
"about.domain_blocks.silenced.title": "Limitate",
|
||||
"about.domain_blocks.suspended.explanation": "Nulle datos de iste servitor essera processate, immagazinate o excambiate, rendente omne interaction o communication con usatores de iste servitor impossibile.",
|
||||
"about.domain_blocks.suspended.title": "Suspendite",
|
||||
"about.language_label": "Lingua",
|
||||
"about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.",
|
||||
"about.powered_by": "Rete social decentralisate, actionate per {mastodon}",
|
||||
"about.rules": "Regulas del servitor",
|
||||
|
@ -41,6 +43,7 @@
|
|||
"account.followers": "Sequitores",
|
||||
"account.followers.empty": "Necuno seque ancora iste usator.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}",
|
||||
"account.followers_you_know_counter": "{counter} que tu cognosce",
|
||||
"account.following": "Sequente",
|
||||
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
|
||||
"account.follows.empty": "Iste usator non seque ancora alcuno.",
|
||||
|
@ -216,6 +219,13 @@
|
|||
"confirmations.delete_list.confirm": "Deler",
|
||||
"confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
|
||||
"confirmations.delete_list.title": "Deler lista?",
|
||||
"confirmations.discard_draft.confirm": "Discartar e continuar",
|
||||
"confirmations.discard_draft.edit.cancel": "Reprender le modification",
|
||||
"confirmations.discard_draft.edit.message": "Si tu continua, tu perdera tote le modificatione que tu ha apportate al message que tu modifica in iste momento.",
|
||||
"confirmations.discard_draft.edit.title": "Discartar le modificationes de tu message?",
|
||||
"confirmations.discard_draft.post.cancel": "Retornar al esbosso",
|
||||
"confirmations.discard_draft.post.message": "Si tu continua, tu perdera le message que tu compone in iste momento.",
|
||||
"confirmations.discard_draft.post.title": "Discartar tu esbosso de message?",
|
||||
"confirmations.discard_edit_media.confirm": "Abandonar",
|
||||
"confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?",
|
||||
"confirmations.follow_to_list.confirm": "Sequer e adder al lista",
|
||||
|
@ -235,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Remover sequitor",
|
||||
"confirmations.remove_from_followers.message": "{name} non plus te sequera. Es tu secur de voler continuar?",
|
||||
"confirmations.remove_from_followers.title": "Remover sequitor?",
|
||||
"confirmations.revoke_quote.confirm": "Remover message",
|
||||
"confirmations.revoke_quote.message": "Iste action non pote esser disfacite.",
|
||||
"confirmations.revoke_quote.title": "Remover message?",
|
||||
"confirmations.unfollow.confirm": "Non plus sequer",
|
||||
"confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?",
|
||||
"confirmations.unfollow.title": "Cessar de sequer le usator?",
|
||||
|
@ -279,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tu pseudonymo:",
|
||||
"domain_pill.your_server": "Tu casa digital, ubi vive tote tu messages. Non te place? Cambia de servitor a omne momento e porta tu sequitores con te.",
|
||||
"domain_pill.your_username": "Tu identificator unic sur iste servitor. Es possibile trovar usatores con le mesme nomine de usator sur servitores differente.",
|
||||
"dropdown.empty": "Selige un option",
|
||||
"embed.instructions": "Incorpora iste message sur tu sito web con le codice sequente.",
|
||||
"embed.preview": "Ecce como illlo parera:",
|
||||
"emoji_button.activity": "Activitate",
|
||||
|
@ -296,6 +310,8 @@
|
|||
"emoji_button.search_results": "Resultatos de recerca",
|
||||
"emoji_button.symbols": "Symbolos",
|
||||
"emoji_button.travel": "Viages e locos",
|
||||
"empty_column.account_featured.me": "Tu non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
|
||||
"empty_column.account_featured.other": "{acct} non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
|
||||
"empty_column.account_featured_other.unknown": "Iste conto non ha ancora mittite alcun cosa in evidentia.",
|
||||
"empty_column.account_hides_collections": "Le usator non ha rendite iste information disponibile",
|
||||
"empty_column.account_suspended": "Conto suspendite",
|
||||
|
@ -325,9 +341,15 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "Copiar le traciamento del pila al area de transferentia",
|
||||
"errors.unexpected_crash.report_issue": "Reportar problema",
|
||||
"explore.suggested_follows": "Personas",
|
||||
"explore.title": "In tendentia",
|
||||
"explore.trending_links": "Novas",
|
||||
"explore.trending_statuses": "Messages",
|
||||
"explore.trending_tags": "Hashtags",
|
||||
"featured_carousel.header": "{count, plural, one {Message fixate} other {Messages fixate}}",
|
||||
"featured_carousel.next": "Sequente",
|
||||
"featured_carousel.post": "Message",
|
||||
"featured_carousel.previous": "Precedente",
|
||||
"featured_carousel.slide": "{index} de {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Iste categoria de filtros non se applica al contexto in le qual tu ha accedite a iste message. Pro filtrar le message in iste contexto tamben, modifica le filtro.",
|
||||
"filter_modal.added.context_mismatch_title": "Contexto incoherente!",
|
||||
"filter_modal.added.expired_explanation": "Iste categoria de filtros ha expirate. Tu debe modificar le data de expiration pro applicar lo.",
|
||||
|
@ -380,6 +402,8 @@
|
|||
"generic.saved": "Salvate",
|
||||
"getting_started.heading": "Prime passos",
|
||||
"hashtag.admin_moderation": "Aperir le interfacie de moderation pro #{name}",
|
||||
"hashtag.browse": "Percurrer messages in #{hashtag}",
|
||||
"hashtag.browse_from_account": "Percurrer le messages de @{name} in #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "e {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
|
@ -404,6 +428,7 @@
|
|||
"hints.profiles.see_more_followers": "Vider plus de sequitores sur {domain}",
|
||||
"hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}",
|
||||
"hints.profiles.see_more_posts": "Vider plus de messages sur {domain}",
|
||||
"home.column_settings.show_quotes": "Monstrar citationes",
|
||||
"home.column_settings.show_reblogs": "Monstrar impulsos",
|
||||
"home.column_settings.show_replies": "Monstrar responsas",
|
||||
"home.hide_announcements": "Celar annuncios",
|
||||
|
@ -477,6 +502,8 @@
|
|||
"keyboard_shortcuts.translate": "a traducer un message",
|
||||
"keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca",
|
||||
"keyboard_shortcuts.up": "Displaciar in alto in le lista",
|
||||
"learn_more_link.got_it": "Comprendite",
|
||||
"learn_more_link.learn_more": "Pro saper plus",
|
||||
"lightbox.close": "Clauder",
|
||||
"lightbox.next": "Sequente",
|
||||
"lightbox.previous": "Precedente",
|
||||
|
@ -526,8 +553,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
|
||||
"mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.",
|
||||
"navigation_bar.about": "A proposito",
|
||||
"navigation_bar.account_settings": "Contrasigno e securitate",
|
||||
"navigation_bar.administration": "Administration",
|
||||
"navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate",
|
||||
"navigation_bar.automated_deletion": "Deletion automatic del message",
|
||||
"navigation_bar.blocks": "Usatores blocate",
|
||||
"navigation_bar.bookmarks": "Marcapaginas",
|
||||
"navigation_bar.direct": "Mentiones private",
|
||||
|
@ -537,13 +566,23 @@
|
|||
"navigation_bar.follow_requests": "Requestas de sequimento",
|
||||
"navigation_bar.followed_tags": "Hashtags sequite",
|
||||
"navigation_bar.follows_and_followers": "Sequites e sequitores",
|
||||
"navigation_bar.import_export": "Importar e exportar",
|
||||
"navigation_bar.lists": "Listas",
|
||||
"navigation_bar.live_feed_local": "Canal in directo (local)",
|
||||
"navigation_bar.live_feed_public": "Canal in directo (public)",
|
||||
"navigation_bar.logout": "Clauder session",
|
||||
"navigation_bar.moderation": "Moderation",
|
||||
"navigation_bar.more": "Plus",
|
||||
"navigation_bar.mutes": "Usatores silentiate",
|
||||
"navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.",
|
||||
"navigation_bar.preferences": "Preferentias",
|
||||
"navigation_bar.privacy_and_reach": "Confidentialitate e portata",
|
||||
"navigation_bar.search": "Cercar",
|
||||
"navigation_bar.search_trends": "Cercar / In tendentia",
|
||||
"navigation_panel.collapse_followed_tags": "Contraher le menu de hashtags sequite",
|
||||
"navigation_panel.collapse_lists": "Contraher le menu de listas",
|
||||
"navigation_panel.expand_followed_tags": "Expander le menu de hashtags sequite",
|
||||
"navigation_panel.expand_lists": "Expander le menu de listas",
|
||||
"not_signed_in_indicator.not_signed_in": "Es necessari aperir session pro acceder a iste ressource.",
|
||||
"notification.admin.report": "{name} ha reportate {target}",
|
||||
"notification.admin.report_account": "{name} ha reportate {count, plural, one {un message} other {# messages}} de {target} per {category}",
|
||||
|
@ -565,6 +604,7 @@
|
|||
"notification.label.mention": "Mention",
|
||||
"notification.label.private_mention": "Mention private",
|
||||
"notification.label.private_reply": "Responsa private",
|
||||
"notification.label.quote": "{name} ha citate tu message",
|
||||
"notification.label.reply": "Responder",
|
||||
"notification.mention": "Mention",
|
||||
"notification.mentioned_you": "{name} te ha mentionate",
|
||||
|
@ -622,6 +662,7 @@
|
|||
"notifications.column_settings.mention": "Mentiones:",
|
||||
"notifications.column_settings.poll": "Resultatos del sondage:",
|
||||
"notifications.column_settings.push": "Notificationes push",
|
||||
"notifications.column_settings.quote": "Citationes:",
|
||||
"notifications.column_settings.reblog": "Impulsos:",
|
||||
"notifications.column_settings.show": "Monstrar in columna",
|
||||
"notifications.column_settings.sound": "Reproducer sono",
|
||||
|
@ -770,6 +811,7 @@
|
|||
"report_notification.categories.violation": "Violation del regulas",
|
||||
"report_notification.categories.violation_sentence": "violation del regulas",
|
||||
"report_notification.open": "Aperir reporto",
|
||||
"search.clear": "Rader le recerca",
|
||||
"search.no_recent_searches": "Nulle recercas recente",
|
||||
"search.placeholder": "Cercar",
|
||||
"search.quick_action.account_search": "Profilos correspondente a {x}",
|
||||
|
@ -811,6 +853,8 @@
|
|||
"status.bookmark": "Adder al marcapaginas",
|
||||
"status.cancel_reblog_private": "Disfacer impulso",
|
||||
"status.cannot_reblog": "Iste message non pote esser impulsate",
|
||||
"status.context.load_new_replies": "Nove responsas disponibile",
|
||||
"status.context.loading": "Cercante plus responsas",
|
||||
"status.continued_thread": "Continuation del discussion",
|
||||
"status.copy": "Copiar ligamine a message",
|
||||
"status.delete": "Deler",
|
||||
|
@ -836,6 +880,14 @@
|
|||
"status.mute_conversation": "Silentiar conversation",
|
||||
"status.open": "Expander iste message",
|
||||
"status.pin": "Fixar sur profilo",
|
||||
"status.quote.cancel": "Cancellar le citation",
|
||||
"status.quote_error.filtered": "Celate a causa de un de tu filtros",
|
||||
"status.quote_error.not_available": "Message indisponibile",
|
||||
"status.quote_error.pending_approval": "Message pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "Le citationes distribuite a transverso le Fediverso pote tardar in apparer, perque differente servitores ha differente protocollos.",
|
||||
"status.quote_error.pending_approval_popout.title": "Citation pendente? Resta calme",
|
||||
"status.quote_policy_change": "Cambiar qui pote citar",
|
||||
"status.quote_post_author": "Ha citate un message de @{name}",
|
||||
"status.read_more": "Leger plus",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_private": "Impulsar con visibilitate original",
|
||||
|
@ -850,6 +902,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al discussion",
|
||||
"status.report": "Reportar @{name}",
|
||||
"status.revoke_quote": "Remover mi message del message de @{name}",
|
||||
"status.sensitive_warning": "Contento sensibile",
|
||||
"status.share": "Compartir",
|
||||
"status.show_less_all": "Monstrar minus pro totes",
|
||||
|
@ -865,9 +918,13 @@
|
|||
"subscribed_languages.save": "Salvar le cambiamentos",
|
||||
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
|
||||
"tabs_bar.home": "Initio",
|
||||
"tabs_bar.menu": "Menu",
|
||||
"tabs_bar.notifications": "Notificationes",
|
||||
"tabs_bar.publish": "Nove message",
|
||||
"tabs_bar.search": "Cercar",
|
||||
"terms_of_service.effective_as_of": "In vigor a partir de {date}",
|
||||
"terms_of_service.title": "Conditiones de servicio",
|
||||
"terms_of_service.upcoming_changes_on": "Cambiamentos a venir le {date}",
|
||||
"time_remaining.days": "{number, plural, one {# die} other {# dies}} restante",
|
||||
"time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante",
|
||||
"time_remaining.minutes": "{number, plural, one {# minuta} other {# minutas}} restante",
|
||||
|
@ -875,7 +932,7 @@
|
|||
"time_remaining.seconds": "{number, plural, one {# secunda} other {# secundas}} restante",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} in le passate {days, plural, one {die} other {{days} dies}}",
|
||||
"trends.trending_now": "Ora in tendentias",
|
||||
"ui.beforeunload": "Tu esbosso essera predite si tu exi de Mastodon.",
|
||||
"ui.beforeunload": "Tu esbosso essera perdite si tu exi de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
|
@ -902,7 +959,20 @@
|
|||
"video.pause": "Pausa",
|
||||
"video.play": "Reproducer",
|
||||
"video.skip_backward": "Saltar a retro",
|
||||
"video.skip_forward": "Avantiar",
|
||||
"video.unmute": "Non plus silentiar",
|
||||
"video.volume_down": "Abassar le volumine",
|
||||
"video.volume_up": "Augmentar le volumine"
|
||||
"video.volume_up": "Augmentar le volumine",
|
||||
"visibility_modal.button_title": "Definir visibilitate",
|
||||
"visibility_modal.header": "Visibilitate e interaction",
|
||||
"visibility_modal.helper.direct_quoting": "Le mentiones private non pote esser citate.",
|
||||
"visibility_modal.helper.privacy_editing": "Le messages ja publicate non pote cambiar de visibilitate.",
|
||||
"visibility_modal.helper.private_quoting": "Le messages reservate al sequitores non pote esser citate.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando un persona te cita, su message essera tamben celate del chronologia \"In tendentia\".",
|
||||
"visibility_modal.instructions": "Controla qui pote interager con iste message. Le parametros global se trova sub <link>Preferentias > Alteres</link>.",
|
||||
"visibility_modal.privacy_label": "Confidentialitate",
|
||||
"visibility_modal.quote_followers": "Solmente sequitores",
|
||||
"visibility_modal.quote_label": "Cambiar qui pote citar",
|
||||
"visibility_modal.quote_nobody": "Necuno",
|
||||
"visibility_modal.quote_public": "Omnes"
|
||||
}
|
||||
|
|
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "Þagga niður í samtali",
|
||||
"status.open": "Opna þessa færslu",
|
||||
"status.pin": "Festa á notandasnið",
|
||||
"status.quote.cancel": "Hætta við tilvitnun",
|
||||
"status.quote_error.filtered": "Falið vegna einnar síu sem er virk",
|
||||
"status.quote_error.not_available": "Færsla ekki tiltæk",
|
||||
"status.quote_error.pending_approval": "Færsla í bið",
|
||||
|
@ -964,6 +965,11 @@
|
|||
"video.volume_up": "Hækka hljóðstyrk",
|
||||
"visibility_modal.button_title": "Stilla sýnileika",
|
||||
"visibility_modal.header": "Sýnileiki og gagnvirkni",
|
||||
"visibility_modal.helper.direct_quoting": "Ekki er hægt að vitna í einkaspjall.",
|
||||
"visibility_modal.helper.privacy_editing": "Ekki er hægt að breyta sýnileika birtra færslna.",
|
||||
"visibility_modal.helper.private_quoting": "Ekki er hægt að vitna í færslur sem eingöngu eru til fylgjenda.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Þegar fólk vitnar í þig verða færslurnar þeirr einnig faldar á vinsældatímalínum.",
|
||||
"visibility_modal.instructions": "Stýrðu hverjir geta átt við þessa færslu. Víðværar stillingar finnast undir <link>Kjörstillingar > Annað</link>.",
|
||||
"visibility_modal.privacy_label": "Persónuvernd",
|
||||
"visibility_modal.quote_followers": "Einungis fylgjendur",
|
||||
"visibility_modal.quote_label": "Breyttu því hver getur tilvitnað",
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Rimuovi il seguace",
|
||||
"confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?",
|
||||
"confirmations.remove_from_followers.title": "Rimuovi il seguace?",
|
||||
"confirmations.revoke_quote.confirm": "Elimina il post",
|
||||
"confirmations.revoke_quote.message": "Questa azione non può essere annullata.",
|
||||
"confirmations.revoke_quote.title": "Rimuovere il post?",
|
||||
"confirmations.unfollow.confirm": "Smetti di seguire",
|
||||
"confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?",
|
||||
"confirmations.unfollow.title": "Smettere di seguire l'utente?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Il tuo nome univoco:",
|
||||
"domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi seguaci.",
|
||||
"domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.",
|
||||
"dropdown.empty": "Seleziona un'opzione",
|
||||
"embed.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.",
|
||||
"embed.preview": "Ecco come apparirà:",
|
||||
"emoji_button.activity": "Attività",
|
||||
|
@ -876,11 +880,13 @@
|
|||
"status.mute_conversation": "Silenzia conversazione",
|
||||
"status.open": "Espandi questo post",
|
||||
"status.pin": "Fissa in cima sul profilo",
|
||||
"status.quote.cancel": "Annulla la citazione",
|
||||
"status.quote_error.filtered": "Nascosto a causa di uno dei tuoi filtri",
|
||||
"status.quote_error.not_available": "Post non disponibile",
|
||||
"status.quote_error.pending_approval": "Post in attesa",
|
||||
"status.quote_error.pending_approval_popout.body": "Le citazioni condivise in tutto il Fediverso possono richiedere del tempo per la visualizzazione, poiché server diversi hanno protocolli diversi.",
|
||||
"status.quote_error.pending_approval_popout.title": "Citazione in attesa? Resta calmo",
|
||||
"status.quote_policy_change": "Cambia chi può citare",
|
||||
"status.quote_post_author": "Citato un post di @{name}",
|
||||
"status.read_more": "Leggi di più",
|
||||
"status.reblog": "Reblog",
|
||||
|
@ -955,5 +961,17 @@
|
|||
"video.skip_forward": "Vai avanti",
|
||||
"video.unmute": "Muta",
|
||||
"video.volume_down": "Abbassa volume",
|
||||
"video.volume_up": "Alza volume"
|
||||
"video.volume_up": "Alza volume",
|
||||
"visibility_modal.button_title": "Imposta la visibilità",
|
||||
"visibility_modal.header": "Visibilità e interazione",
|
||||
"visibility_modal.helper.direct_quoting": "Le menzioni private non possono essere citate.",
|
||||
"visibility_modal.helper.privacy_editing": "La visibilità dei post pubblicati non può essere modificata.",
|
||||
"visibility_modal.helper.private_quoting": "I post riservati ai seguaci non possono essere citati.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando le persone ti citano, il loro post verrà nascosto anche dalle timeline di tendenza.",
|
||||
"visibility_modal.instructions": "Controlla chi può interagire con questo post. Le impostazioni globali si trovano in <link>Preferenze > Altro</link>.",
|
||||
"visibility_modal.privacy_label": "Privacy",
|
||||
"visibility_modal.quote_followers": "Solo i seguaci",
|
||||
"visibility_modal.quote_label": "Cambia chi può citare",
|
||||
"visibility_modal.quote_nobody": "Nessuno",
|
||||
"visibility_modal.quote_public": "Chiunque"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Lí ê口座:",
|
||||
"domain_pill.your_server": "Lí數位ê厝,內底有lí所有ê PO文。無kah意?Ē當轉kàu別ê服侍器,koh保有跟tuè lí êl âng。.",
|
||||
"domain_pill.your_username": "Lí 佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。",
|
||||
"dropdown.empty": "揀選項",
|
||||
"embed.instructions": "Khóo-pih 下kha ê程式碼,來kā tsit篇PO文tàu佇lí ê網站。",
|
||||
"embed.preview": "伊e án-ne顯示:\n",
|
||||
"emoji_button.activity": "活動",
|
||||
|
@ -570,7 +571,7 @@
|
|||
"navigation_bar.live_feed_local": "即時ê內容(本地)",
|
||||
"navigation_bar.live_feed_public": "即時ê內容(公開)",
|
||||
"navigation_bar.logout": "登出",
|
||||
"navigation_bar.moderation": "審核",
|
||||
"navigation_bar.moderation": "管理",
|
||||
"navigation_bar.more": "其他",
|
||||
"navigation_bar.mutes": "消音ê用者",
|
||||
"navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面,預設ē佇經典ê網頁界面內phah開。",
|
||||
|
@ -608,11 +609,11 @@
|
|||
"notification.mention": "提起",
|
||||
"notification.mentioned_you": "{name}kā lí提起",
|
||||
"notification.moderation-warning.learn_more": "看詳細",
|
||||
"notification.moderation_warning": "Lí有收著審核ê警告",
|
||||
"notification.moderation_warning": "Lí有收著管理ê警告",
|
||||
"notification.moderation_warning.action_delete_statuses": "Lí ê一寡PO文hōo lâng thâi掉ah。",
|
||||
"notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。",
|
||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文,hōo lâng標做敏感ê內容。",
|
||||
"notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。",
|
||||
"notification.moderation_warning.action_none": "Lí ê口座有收著管理ê警告。",
|
||||
"notification.moderation_warning.action_sensitive": "Tuì tsit-má開始,lí êPO文ē標做敏感ê內容。",
|
||||
"notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。",
|
||||
"notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。",
|
||||
|
@ -883,6 +884,7 @@
|
|||
"status.quote_error.pending_approval": "鋪文當咧送",
|
||||
"status.quote_error.pending_approval_popout.body": "因為無kâng ê服侍器有無kâng ê協定,佇聯邦宇宙分享ê引文可能愛開時間來顯示。",
|
||||
"status.quote_error.pending_approval_popout.title": "Leh送引文?請sió等leh",
|
||||
"status.quote_policy_change": "改通引用ê lâng",
|
||||
"status.quote_post_author": "引用 @{name} ê PO文ah",
|
||||
"status.read_more": "讀詳細",
|
||||
"status.reblog": "轉送",
|
||||
|
@ -957,5 +959,17 @@
|
|||
"video.skip_forward": "跳kah頭前",
|
||||
"video.unmute": "取消消音",
|
||||
"video.volume_down": "變khah細聲",
|
||||
"video.volume_up": "變khah大聲"
|
||||
"video.volume_up": "變khah大聲",
|
||||
"visibility_modal.button_title": "設定通看ê程度",
|
||||
"visibility_modal.header": "通看ê程度kap互動",
|
||||
"visibility_modal.helper.direct_quoting": "私人ê提起bē當引用。",
|
||||
"visibility_modal.helper.privacy_editing": "公開ê PO文bē當改in通看ê程度。",
|
||||
"visibility_modal.helper.private_quoting": "Bē當引用kan-ta跟tuè ê通看ê PO文。",
|
||||
"visibility_modal.helper.unlisted_quoting": "若別lâng引用lí,in ê PO文mā ē tuì趨勢時間線隱藏。",
|
||||
"visibility_modal.instructions": "控制ē當kap tsit篇PO文互動ê lâng,Ē當佇 <link>偏愛ê設定>其他</link>tshuē tio̍h全地ê設定。",
|
||||
"visibility_modal.privacy_label": "隱私權",
|
||||
"visibility_modal.quote_followers": "Kan-ta hōo跟tuè ê lâng",
|
||||
"visibility_modal.quote_label": "改通引用ê lâng",
|
||||
"visibility_modal.quote_nobody": "無半位",
|
||||
"visibility_modal.quote_public": "Ta̍k ê lâng"
|
||||
}
|
||||
|
|
|
@ -603,6 +603,7 @@
|
|||
"notification.label.mention": "Упоминание",
|
||||
"notification.label.private_mention": "Личное упоминание",
|
||||
"notification.label.private_reply": "Приватный ответ",
|
||||
"notification.label.quote": "{name} процитировал(а) ваш пост",
|
||||
"notification.label.reply": "Ответ",
|
||||
"notification.mention": "Упоминание",
|
||||
"notification.mentioned_you": "{name} упомянул(а) вас",
|
||||
|
@ -660,6 +661,7 @@
|
|||
"notifications.column_settings.mention": "Вас упомянули в посте:",
|
||||
"notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
|
||||
"notifications.column_settings.push": "Push-уведомления",
|
||||
"notifications.column_settings.quote": "Ваш пост процитировали:",
|
||||
"notifications.column_settings.reblog": "Ваш пост продвинули:",
|
||||
"notifications.column_settings.show": "Отображать в списке",
|
||||
"notifications.column_settings.sound": "Проигрывать звук",
|
||||
|
@ -851,7 +853,7 @@
|
|||
"status.cancel_reblog_private": "Отменить продвижение",
|
||||
"status.cannot_reblog": "Этот пост не может быть продвинут",
|
||||
"status.context.load_new_replies": "Доступны новые ответы",
|
||||
"status.context.loading": "Проверяем, есть ли еще ответы",
|
||||
"status.context.loading": "Проверяем, есть ли ещё ответы",
|
||||
"status.continued_thread": "Продолжение предыдущего поста",
|
||||
"status.copy": "Скопировать ссылку на пост",
|
||||
"status.delete": "Удалить",
|
||||
|
@ -879,6 +881,8 @@
|
|||
"status.pin": "Закрепить в профиле",
|
||||
"status.quote_error.filtered": "Скрыто одним из ваших фильтров",
|
||||
"status.quote_error.not_available": "Пост недоступен",
|
||||
"status.quote_error.pending_approval": "Пост ожидает подтверждения",
|
||||
"status.quote_error.pending_approval_popout.title": "Цитирование ещё не подтверждено? Не беспокойтесь",
|
||||
"status.read_more": "Читать далее",
|
||||
"status.reblog": "Продвинуть",
|
||||
"status.reblog_private": "Продвинуть для своей аудитории",
|
||||
|
|
|
@ -246,6 +246,7 @@
|
|||
"confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?",
|
||||
"confirmations.remove_from_followers.title": "Ta bort följare?",
|
||||
"confirmations.revoke_quote.confirm": "Ta bort inlägg",
|
||||
"confirmations.revoke_quote.message": "Denna åtgärd kan inte ångras.",
|
||||
"confirmations.revoke_quote.title": "Ta bort inlägg?",
|
||||
"confirmations.unfollow.confirm": "Avfölj",
|
||||
"confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?",
|
||||
|
@ -603,6 +604,7 @@
|
|||
"notification.label.mention": "Nämn",
|
||||
"notification.label.private_mention": "Privat omnämnande",
|
||||
"notification.label.private_reply": "Privata svar",
|
||||
"notification.label.quote": "{name} citerade ditt inlägg",
|
||||
"notification.label.reply": "Svar",
|
||||
"notification.mention": "Nämn",
|
||||
"notification.mentioned_you": "{name} nämnde dig",
|
||||
|
@ -660,6 +662,7 @@
|
|||
"notifications.column_settings.mention": "Omnämningar:",
|
||||
"notifications.column_settings.poll": "Omröstningsresultat:",
|
||||
"notifications.column_settings.push": "Push-aviseringar",
|
||||
"notifications.column_settings.quote": "Citerat:",
|
||||
"notifications.column_settings.reblog": "Boostar:",
|
||||
"notifications.column_settings.show": "Visa i kolumnen",
|
||||
"notifications.column_settings.sound": "Spela upp ljud",
|
||||
|
@ -877,8 +880,14 @@
|
|||
"status.mute_conversation": "Tysta konversation",
|
||||
"status.open": "Utvidga detta inlägg",
|
||||
"status.pin": "Fäst i profil",
|
||||
"status.quote.cancel": "Återkalla citering",
|
||||
"status.quote_error.filtered": "Dolt på grund av ett av dina filter",
|
||||
"status.quote_error.not_available": "Inlägg ej tillgängligt",
|
||||
"status.quote_error.pending_approval": "Väntande inlägg",
|
||||
"status.quote_error.pending_approval_popout.body": "Citat som delas över Fediverse kan ta tid att visa, eftersom olika servrar har olika protokoll.",
|
||||
"status.quote_error.pending_approval_popout.title": "Väntande citat? Förbli lugn",
|
||||
"status.quote_policy_change": "Ändra vem som kan citera",
|
||||
"status.quote_post_author": "Citerade ett inlägg av @{name}",
|
||||
"status.read_more": "Läs mer",
|
||||
"status.reblog": "Boosta",
|
||||
"status.reblog_private": "Boosta med ursprunglig synlighet",
|
||||
|
@ -893,6 +902,7 @@
|
|||
"status.reply": "Svara",
|
||||
"status.replyAll": "Svara på tråden",
|
||||
"status.report": "Rapportera @{name}",
|
||||
"status.revoke_quote": "Ta bort mitt inlägg från @{name}s inlägg",
|
||||
"status.sensitive_warning": "Känsligt innehåll",
|
||||
"status.share": "Dela",
|
||||
"status.show_less_all": "Visa mindre för alla",
|
||||
|
@ -953,7 +963,10 @@
|
|||
"video.unmute": "Avtysta",
|
||||
"video.volume_down": "Volym ned",
|
||||
"video.volume_up": "Volym upp",
|
||||
"visibility_modal.button_title": "Ange synlighet",
|
||||
"visibility_modal.header": "Synlighet och interaktion",
|
||||
"visibility_modal.helper.direct_quoting": "Privata omnämnanden kan inte bli citerade.",
|
||||
"visibility_modal.helper.private_quoting": "Inlägg som endast är synliga för följare kan inte citeras.",
|
||||
"visibility_modal.privacy_label": "Integritet",
|
||||
"visibility_modal.quote_followers": "Endast följare",
|
||||
"visibility_modal.quote_nobody": "Ingen",
|
||||
|
|
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "Tắt thông báo",
|
||||
"status.open": "Mở tút",
|
||||
"status.pin": "Ghim lên hồ sơ",
|
||||
"status.quote.cancel": "Bỏ trích dẫn",
|
||||
"status.quote_error.filtered": "Bị ẩn vì một bộ lọc của bạn",
|
||||
"status.quote_error.not_available": "Tút không khả dụng",
|
||||
"status.quote_error.pending_approval": "Tút đang chờ duyệt",
|
||||
|
|
|
@ -240,6 +240,8 @@
|
|||
"confirmations.remove_from_followers.confirm": "移除关注者",
|
||||
"confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?",
|
||||
"confirmations.remove_from_followers.title": "移除关注者?",
|
||||
"confirmations.revoke_quote.confirm": "移除嘟文",
|
||||
"confirmations.revoke_quote.title": "移除嘟文?",
|
||||
"confirmations.unfollow.confirm": "取消关注",
|
||||
"confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
|
||||
"confirmations.unfollow.title": "确定要取消关注用户?",
|
||||
|
@ -491,6 +493,7 @@
|
|||
"keyboard_shortcuts.translate": "翻译嘟文",
|
||||
"keyboard_shortcuts.unfocus": "取消输入/搜索",
|
||||
"keyboard_shortcuts.up": "在列表中让光标上移",
|
||||
"learn_more_link.got_it": "明白了",
|
||||
"lightbox.close": "关闭",
|
||||
"lightbox.next": "下一个",
|
||||
"lightbox.previous": "上一个",
|
||||
|
@ -861,6 +864,7 @@
|
|||
"status.mute_conversation": "关闭此对话的通知",
|
||||
"status.open": "展开嘟文",
|
||||
"status.pin": "在个人资料页面置顶",
|
||||
"status.quote.cancel": "取消引用",
|
||||
"status.quote_error.filtered": "已根据你的筛选器过滤",
|
||||
"status.read_more": "查看更多",
|
||||
"status.reblog": "转嘟",
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
"domain_pill.your_handle": "您的帳號:",
|
||||
"domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。",
|
||||
"domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。",
|
||||
"dropdown.empty": "選取選項",
|
||||
"dropdown.empty": "選項",
|
||||
"embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。",
|
||||
"embed.preview": "它將顯示成這樣:",
|
||||
"emoji_button.activity": "活動",
|
||||
|
@ -880,6 +880,7 @@
|
|||
"status.mute_conversation": "靜音對話",
|
||||
"status.open": "展開此嘟文",
|
||||
"status.pin": "釘選至個人檔案頁面",
|
||||
"status.quote.cancel": "取消引用嘟文",
|
||||
"status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏",
|
||||
"status.quote_error.not_available": "無法取得該嘟文",
|
||||
"status.quote_error.pending_approval": "嘟文正在發送中",
|
||||
|
@ -965,9 +966,9 @@
|
|||
"visibility_modal.button_title": "設定可見性",
|
||||
"visibility_modal.header": "可見性與互動",
|
||||
"visibility_modal.helper.direct_quoting": "無法引用私人提及。",
|
||||
"visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文的可見性。",
|
||||
"visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文之可見性。",
|
||||
"visibility_modal.helper.private_quoting": "無法引用僅追蹤者的嘟文。",
|
||||
"visibility_modal.helper.unlisted_quoting": "當期他人引用您時,他們的嘟文也會自熱門時間軸隱藏。",
|
||||
"visibility_modal.helper.unlisted_quoting": "當其他人引用您時,他們的嘟文也會自熱門時間軸隱藏。",
|
||||
"visibility_modal.instructions": "控制誰能與此嘟文互動。可在<link>偏好設定 > 其他</link>下找到全域設定。",
|
||||
"visibility_modal.privacy_label": "隱私權",
|
||||
"visibility_modal.quote_followers": "僅限跟隨者",
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react';
|
||||
|
||||
interface BaseMenuItem {
|
||||
text: string;
|
||||
dangerous?: boolean;
|
||||
}
|
||||
|
||||
export interface ActionMenuItem extends BaseMenuItem {
|
||||
action: () => void;
|
||||
action: (event: MouseEvent | KeyboardEvent | TouchEvent) => void;
|
||||
}
|
||||
|
||||
export interface LinkMenuItem extends BaseMenuItem {
|
||||
|
|
|
@ -331,8 +331,16 @@ export const composeReducer = (state = initialState, action) => {
|
|||
return state.set('is_changing_upload', false);
|
||||
} else if (quoteComposeByStatus.match(action)) {
|
||||
const status = action.payload;
|
||||
if (status.getIn(['quote_approval', 'current_user']) === 'automatic') {
|
||||
return state.set('quoted_status_id', status.get('id'));
|
||||
if (
|
||||
status.getIn(['quote_approval', 'current_user']) === 'automatic' &&
|
||||
state.get('media_attachments').size === 0 &&
|
||||
!state.get('is_uploading') &&
|
||||
!state.get('poll')
|
||||
) {
|
||||
return state
|
||||
.set('quoted_status_id', status.get('id'))
|
||||
.set('spoiler', status.get('sensitive'))
|
||||
.set('spoiler_text', status.get('spoiler_text'));
|
||||
}
|
||||
} else if (quoteComposeCancel.match(action)) {
|
||||
return state.set('quoted_status_id', null);
|
||||
|
@ -512,6 +520,8 @@ export const composeReducer = (state = initialState, action) => {
|
|||
map.set('sensitive', action.status.get('sensitive'));
|
||||
map.set('language', action.status.get('language'));
|
||||
map.set('id', null);
|
||||
// Mastodon-authored posts can be expected to have at most one automatic approval policy
|
||||
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
|
||||
|
||||
if (action.status.get('spoiler_text').length > 0) {
|
||||
map.set('spoiler', true);
|
||||
|
@ -541,6 +551,8 @@ export const composeReducer = (state = initialState, action) => {
|
|||
map.set('idempotencyKey', uuid());
|
||||
map.set('sensitive', action.status.get('sensitive'));
|
||||
map.set('language', action.status.get('language'));
|
||||
// Mastodon-authored posts can be expected to have at most one automatic approval policy
|
||||
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
|
||||
|
||||
if (action.spoiler_text.length > 0) {
|
||||
map.set('spoiler', true);
|
||||
|
|
|
@ -15,7 +15,7 @@ export const getFilters = createSelector(
|
|||
(_, { contextType }: { contextType: string }) => contextType,
|
||||
],
|
||||
(filters, contextType) => {
|
||||
if (!contextType) {
|
||||
if (!contextType || contextType === 'compose') {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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 |
|
@ -16,7 +16,7 @@
|
|||
|
||||
.status-card__actions button,
|
||||
.status-card__actions a {
|
||||
color: rgba($white, 0.8);
|
||||
color: color.change($white, $alpha: 0.8);
|
||||
|
||||
&:hover,
|
||||
&:active,
|
||||
|
@ -298,14 +298,14 @@
|
|||
.simple_form {
|
||||
.warning {
|
||||
box-shadow: none;
|
||||
background: rgba($error-red, 0.5);
|
||||
background: color.change($error-red, $alpha: 0.5);
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
.recommended {
|
||||
border-color: $ui-highlight-color;
|
||||
color: $ui-highlight-color;
|
||||
background-color: rgba($ui-highlight-color, 0.1);
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
}
|
||||
|
||||
input[type='text'],
|
||||
|
@ -327,7 +327,7 @@
|
|||
|
||||
.compose-form .compose-form__warning {
|
||||
border-color: $ui-highlight-color;
|
||||
background-color: rgba($ui-highlight-color, 0.1);
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
|
||||
&,
|
||||
a {
|
||||
|
@ -375,10 +375,10 @@
|
|||
}
|
||||
|
||||
.status__wrapper-direct {
|
||||
background-color: rgba($ui-highlight-color, 0.1);
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
|
||||
&:focus {
|
||||
background-color: rgba($ui-highlight-color, 0.15);
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -433,8 +433,8 @@
|
|||
}
|
||||
|
||||
.inline-follow-suggestions {
|
||||
background-color: rgba($ui-highlight-color, 0.1);
|
||||
border-bottom-color: rgba($ui-highlight-color, 0.3);
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
border-bottom-color: color.change($ui-highlight-color, $alpha: 0.3);
|
||||
}
|
||||
|
||||
.inline-follow-suggestions__body__scrollable__card {
|
||||
|
@ -508,7 +508,7 @@ a.sparkline {
|
|||
|
||||
@supports not selector(::-webkit-scrollbar) {
|
||||
html {
|
||||
scrollbar-color: rgba($action-button-color, 0.25)
|
||||
scrollbar-color: color.change($action-button-color, $alpha: 0.25)
|
||||
var(--background-border-color);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'variables' as *;
|
||||
|
||||
@mixin search-input {
|
||||
|
@ -22,7 +23,7 @@
|
|||
padding-bottom: 14px;
|
||||
margin-top: 10px;
|
||||
color: $light-text-color;
|
||||
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
|
||||
box-shadow: 2px 4px 15px color.change($base-shadow-color, $alpha: 0.4);
|
||||
|
||||
h4 {
|
||||
text-transform: uppercase;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'variables' as *;
|
||||
@use 'functions' as *;
|
||||
|
||||
|
@ -161,7 +162,7 @@
|
|||
|
||||
.nothing-here {
|
||||
background: $ui-base-color;
|
||||
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
|
||||
color: $darker-text-color;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
|
@ -205,8 +206,8 @@
|
|||
.simple_form .overridden,
|
||||
.simple_form .recommended,
|
||||
.simple_form .not_recommended {
|
||||
background-color: rgba($ui-secondary-color, 0.1);
|
||||
border: 1px solid rgba($ui-secondary-color, 0.5);
|
||||
background-color: color.change($ui-secondary-color, $alpha: 0.1);
|
||||
border: 1px solid color.change($ui-secondary-color, $alpha: 0.5);
|
||||
}
|
||||
|
||||
.account-role {
|
||||
|
@ -240,8 +241,8 @@
|
|||
.information-badge {
|
||||
&.superapp {
|
||||
color: $success-green;
|
||||
background-color: rgba($success-green, 0.1);
|
||||
border-color: rgba($success-green, 0.5);
|
||||
background-color: color.change($success-green, $alpha: 0.1);
|
||||
border-color: color.change($success-green, $alpha: 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,8 +303,8 @@
|
|||
}
|
||||
|
||||
.verified {
|
||||
border: 1px solid rgba($valid-value-color, 0.5);
|
||||
background: rgba($valid-value-color, 0.25);
|
||||
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
|
||||
background: color.change($valid-value-color, $alpha: 0.25);
|
||||
|
||||
a {
|
||||
color: $valid-value-color;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'sass:math';
|
||||
@use 'functions' as *;
|
||||
@use 'variables' as *;
|
||||
|
@ -1255,7 +1256,7 @@ a.name-tag,
|
|||
}
|
||||
|
||||
path:first-child {
|
||||
fill: rgba($highlight-text-color, 0.25) !important;
|
||||
fill: color.change($highlight-text-color, $alpha: 0.25) !important;
|
||||
fill-opacity: 1 !important;
|
||||
}
|
||||
|
||||
|
|
|
@ -311,7 +311,7 @@
|
|||
&:active,
|
||||
&:focus-visible {
|
||||
color: lighten($action-button-color, 7%);
|
||||
background-color: rgba($action-button-color, 0.15);
|
||||
background-color: color.change($action-button-color, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus-visible {
|
||||
|
@ -331,7 +331,7 @@
|
|||
&:active,
|
||||
&:focus-visible {
|
||||
color: darken($lighter-text-color, 7%);
|
||||
background-color: rgba($lighter-text-color, 0.15);
|
||||
background-color: color.change($lighter-text-color, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus-visible {
|
||||
|
@ -361,14 +361,14 @@
|
|||
|
||||
&.overlayed {
|
||||
box-sizing: content-box;
|
||||
background: rgba($black, 0.65);
|
||||
background: color.change($black, $alpha: 0.65);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
color: rgba($white, 0.7);
|
||||
color: color.change($white, $alpha: 0.7);
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
|
||||
&:hover {
|
||||
background: rgba($black, 0.9);
|
||||
background: color.change($black, $alpha: 0.9);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -391,7 +391,7 @@
|
|||
border-color: $valid-value-color;
|
||||
color: $valid-value-color;
|
||||
transition: none;
|
||||
background-color: rgba($valid-value-color, 0.15);
|
||||
background-color: color.change($valid-value-color, $alpha: 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -411,7 +411,7 @@
|
|||
&:active,
|
||||
&:focus {
|
||||
color: darken($lighter-text-color, 7%);
|
||||
background-color: rgba($lighter-text-color, 0.15);
|
||||
background-color: color.change($lighter-text-color, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus-visible {
|
||||
|
@ -618,7 +618,7 @@ body > [data-popper-placement] {
|
|||
&__warning {
|
||||
color: $inverted-text-color;
|
||||
background: $ui-primary-color;
|
||||
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);
|
||||
box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.3);
|
||||
padding: 8px 10px;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
|
@ -656,19 +656,12 @@ body > [data-popper-placement] {
|
|||
background: url('@/images/warning-stripes.svg') repeat-y;
|
||||
width: 5px;
|
||||
flex: 0 0 auto;
|
||||
|
||||
&:first-child {
|
||||
border-start-start-radius: 4px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-start-end-radius: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.autosuggest-input {
|
||||
flex: 1 1 auto;
|
||||
border-bottom: 1px solid var(--background-border-color);
|
||||
border: 1px solid var(--background-border-color);
|
||||
border-width: 1px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -694,7 +687,7 @@ body > [data-popper-placement] {
|
|||
|
||||
.spoiler-input__input {
|
||||
padding: 12px 12px - 5px;
|
||||
background: rgba($ui-highlight-color, 0.05);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.05);
|
||||
color: $highlight-text-color;
|
||||
}
|
||||
|
||||
|
@ -946,6 +939,24 @@ body > [data-popper-placement] {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status__quote {
|
||||
margin: 0 8px;
|
||||
max-height: 220px;
|
||||
overflow: hidden;
|
||||
|
||||
// Override .status__content .status__content__text.status__content__text--visible
|
||||
.status__content__text.status__content__text {
|
||||
display: -webkit-box;
|
||||
}
|
||||
|
||||
.status__content__text {
|
||||
-webkit-line-clamp: 4;
|
||||
line-clamp: 4;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-button {
|
||||
|
@ -1428,7 +1439,7 @@ body > [data-popper-placement] {
|
|||
.focusable {
|
||||
&:focus-visible {
|
||||
outline: 0;
|
||||
background: rgba($ui-highlight-color, 0.05);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.05);
|
||||
box-shadow: inset 0 0 0 2px $ui-button-focus-outline-color;
|
||||
}
|
||||
}
|
||||
|
@ -1471,18 +1482,19 @@ body > [data-popper-placement] {
|
|||
|
||||
border-bottom: 0;
|
||||
|
||||
.status__content,
|
||||
.status__action-bar,
|
||||
.media-gallery,
|
||||
.video-player,
|
||||
.audio-player,
|
||||
.attachment-list,
|
||||
.picture-in-picture-placeholder,
|
||||
.more-from-author,
|
||||
.status-card,
|
||||
.hashtag-bar,
|
||||
.content-warning,
|
||||
.filter-warning {
|
||||
& > .status__content,
|
||||
& > .status__action-bar,
|
||||
& > .media-gallery,
|
||||
& > .video-player,
|
||||
& > .audio-player,
|
||||
& > .attachment-list,
|
||||
& > .picture-in-picture-placeholder,
|
||||
& > .more-from-author,
|
||||
& > .status-card,
|
||||
& > .hashtag-bar,
|
||||
& > .content-warning,
|
||||
& > .filter-warning,
|
||||
& > .status__quote {
|
||||
margin-inline-start: var(--thread-margin);
|
||||
width: calc(100% - var(--thread-margin));
|
||||
}
|
||||
|
@ -1583,6 +1595,7 @@ body > [data-popper-placement] {
|
|||
align-items: center;
|
||||
gap: 10px;
|
||||
overflow: hidden;
|
||||
flex-grow: 1;
|
||||
|
||||
.display-name {
|
||||
bdi {
|
||||
|
@ -1599,6 +1612,11 @@ body > [data-popper-placement] {
|
|||
}
|
||||
}
|
||||
|
||||
.status__quote-cancel {
|
||||
align-self: self-start;
|
||||
order: 5;
|
||||
}
|
||||
|
||||
.status__info {
|
||||
font-size: 15px;
|
||||
padding-bottom: 10px;
|
||||
|
@ -1683,10 +1701,10 @@ body > [data-popper-placement] {
|
|||
.notification-ungrouped--direct,
|
||||
.notification-group--direct,
|
||||
.notification-group--annual-report {
|
||||
background: rgba($ui-highlight-color, 0.05);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.05);
|
||||
|
||||
&:focus {
|
||||
background: rgba($ui-highlight-color, 0.1);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2016,7 +2034,7 @@ body > [data-popper-placement] {
|
|||
|
||||
&__domain-pill {
|
||||
display: inline-flex;
|
||||
background: rgba($highlight-text-color, 0.2);
|
||||
background: color.change($highlight-text-color, $alpha: 0.2);
|
||||
border-radius: 4px;
|
||||
border: 0;
|
||||
color: $highlight-text-color;
|
||||
|
@ -2077,7 +2095,7 @@ body > [data-popper-placement] {
|
|||
|
||||
&__handle {
|
||||
border: 2px dashed $highlight-text-color;
|
||||
background: rgba($highlight-text-color, 0.1);
|
||||
background: color.change($highlight-text-color, $alpha: 0.1);
|
||||
padding: 12px 8px;
|
||||
color: $highlight-text-color;
|
||||
border-radius: 4px;
|
||||
|
@ -2839,10 +2857,43 @@ a.account__display-name {
|
|||
&:focus,
|
||||
&:hover,
|
||||
&:active {
|
||||
background: var(--dropdown-border-color);
|
||||
outline: 0;
|
||||
&:not(:disabled) {
|
||||
background: var(--dropdown-border-color);
|
||||
outline: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
color: $dark-text-color;
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.reblog-button {
|
||||
&__item {
|
||||
width: 280px;
|
||||
|
||||
button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
white-space: inherit;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
&.active:not(.disabled) {
|
||||
color: $highlight-text-color;
|
||||
}
|
||||
}
|
||||
|
||||
&__meta {
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
|
||||
.inline-account {
|
||||
|
@ -3283,7 +3334,7 @@ a.account__display-name {
|
|||
|
||||
.columns-area__panels__pane--overlay {
|
||||
pointer-events: auto;
|
||||
background: rgba($base-overlay-background, 0.5);
|
||||
background: color.change($base-overlay-background, $alpha: 0.5);
|
||||
z-index: 3;
|
||||
|
||||
.columns-area__panels__pane__inner {
|
||||
|
@ -3820,7 +3871,10 @@ a.account__display-name {
|
|||
border-radius: 10px;
|
||||
padding: 0;
|
||||
user-select: none;
|
||||
-webkit-tap-highlight-color: rgba($base-overlay-background, 0);
|
||||
-webkit-tap-highlight-color: color.change(
|
||||
$base-overlay-background,
|
||||
$alpha: 0
|
||||
);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
|
@ -4069,7 +4123,7 @@ a.account__display-name {
|
|||
cursor: pointer;
|
||||
|
||||
& > div {
|
||||
background: rgba($base-shadow-color, 0.6);
|
||||
background: color.change($base-shadow-color, $alpha: 0.6);
|
||||
border-radius: 8px;
|
||||
padding: 12px 9px;
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
|
@ -4399,7 +4453,7 @@ a.status-card {
|
|||
z-index: 1;
|
||||
|
||||
&.active {
|
||||
box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);
|
||||
box-shadow: 0 1px 0 color.change($highlight-text-color, $alpha: 0.3);
|
||||
|
||||
&::before {
|
||||
display: block;
|
||||
|
@ -4415,8 +4469,8 @@ a.status-card {
|
|||
z-index: 1;
|
||||
background: radial-gradient(
|
||||
ellipse,
|
||||
rgba($ui-highlight-color, 0.23) 0%,
|
||||
rgba($ui-highlight-color, 0) 60%
|
||||
color.change($ui-highlight-color, $alpha: 0.23) 0%,
|
||||
color.change($ui-highlight-color, $alpha: 0) 60%
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -4510,7 +4564,7 @@ a.status-card {
|
|||
&.active {
|
||||
.column-header__icon {
|
||||
color: $highlight-text-color;
|
||||
text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);
|
||||
text-shadow: 0 0 10px color.change($highlight-text-color, $alpha: 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4855,7 +4909,7 @@ a.status-card {
|
|||
font-size: 14px;
|
||||
|
||||
&__label {
|
||||
background-color: rgba($black, 0.45);
|
||||
background-color: color.change($black, $alpha: 0.45);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
border-radius: 8px;
|
||||
padding: 12px 16px;
|
||||
|
@ -4875,7 +4929,7 @@ a.status-card {
|
|||
&:hover,
|
||||
&:focus {
|
||||
.spoiler-button__overlay__label {
|
||||
background-color: rgba($black, 0.9);
|
||||
background-color: color.change($black, $alpha: 0.9);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5266,7 +5320,7 @@ a.status-card {
|
|||
|
||||
.upload-area {
|
||||
align-items: center;
|
||||
background: rgba($base-overlay-background, 0.8);
|
||||
background: color.change($base-overlay-background, $alpha: 0.8);
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
justify-content: center;
|
||||
|
@ -5301,7 +5355,7 @@ a.status-card {
|
|||
z-index: -1;
|
||||
border-radius: 4px;
|
||||
background: $ui-base-color;
|
||||
box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 0 0 5px color.change($base-shadow-color, $alpha: 0.2);
|
||||
}
|
||||
|
||||
.upload-area__content {
|
||||
|
@ -5939,7 +5993,7 @@ a.status-card {
|
|||
align-items: center;
|
||||
|
||||
.icon-button {
|
||||
color: rgba($white, 0.7);
|
||||
color: color.change($white, $alpha: 0.7);
|
||||
padding: 8px;
|
||||
|
||||
.icon {
|
||||
|
@ -5952,11 +6006,11 @@ a.status-card {
|
|||
&:focus,
|
||||
&:active {
|
||||
color: $white;
|
||||
background-color: rgba($white, 0.15);
|
||||
background-color: color.change($white, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background-color: rgba($white, 0.3);
|
||||
background-color: color.change($white, $alpha: 0.3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5997,7 +6051,7 @@ a.status-card {
|
|||
background: transparent;
|
||||
box-sizing: border-box;
|
||||
border: 0;
|
||||
color: rgba($white, 0.7);
|
||||
color: color.change($white, $alpha: 0.7);
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
@ -6051,11 +6105,11 @@ a.status-card {
|
|||
&:focus,
|
||||
&:active {
|
||||
color: $white;
|
||||
background-color: rgba($white, 0.15);
|
||||
background-color: color.change($white, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background-color: rgba($white, 0.3);
|
||||
background-color: color.change($white, $alpha: 0.3);
|
||||
}
|
||||
|
||||
&.active {
|
||||
|
@ -6064,11 +6118,11 @@ a.status-card {
|
|||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
background: rgba($highlight-text-color, 0.15);
|
||||
background: color.change($highlight-text-color, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: rgba($highlight-text-color, 0.3);
|
||||
background: color.change($highlight-text-color, $alpha: 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6078,11 +6132,11 @@ a.status-card {
|
|||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
background: rgba($gold-star, 0.15);
|
||||
background: color.change($gold-star, $alpha: 0.15);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
background: rgba($gold-star, 0.3);
|
||||
background: color.change($gold-star, $alpha: 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6954,7 +7008,7 @@ a.status-card {
|
|||
display: block;
|
||||
color: $white;
|
||||
border: 0;
|
||||
background: rgba($black, 0.65);
|
||||
background: color.change($black, $alpha: 0.65);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
padding: 3px 12px;
|
||||
border-radius: 99px;
|
||||
|
@ -6979,7 +7033,7 @@ a.status-card {
|
|||
text-align: center;
|
||||
color: $white;
|
||||
border: 0;
|
||||
background: rgba($black, 0.65);
|
||||
background: color.change($black, $alpha: 0.65);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
padding: 3px 8px;
|
||||
border-radius: 4px;
|
||||
|
@ -7001,7 +7055,7 @@ a.status-card {
|
|||
}
|
||||
|
||||
.media-gallery__alt__popover {
|
||||
background: rgba($black, 0.65);
|
||||
background: color.change($black, $alpha: 0.65);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
border-radius: 4px;
|
||||
box-shadow: var(--dropdown-shadow);
|
||||
|
@ -7023,7 +7077,7 @@ a.status-card {
|
|||
p {
|
||||
font-size: 15px;
|
||||
line-height: 20px;
|
||||
color: rgba($white, 0.85);
|
||||
color: color.change($white, $alpha: 0.85);
|
||||
white-space: pre-line;
|
||||
}
|
||||
}
|
||||
|
@ -7467,8 +7521,8 @@ a.status-card {
|
|||
box-sizing: border-box;
|
||||
background: linear-gradient(
|
||||
0deg,
|
||||
rgba($base-shadow-color, 0.85) 0,
|
||||
rgba($base-shadow-color, 0.45) 60%,
|
||||
color.change($base-shadow-color, $alpha: 0.85) 0,
|
||||
color.change($base-shadow-color, $alpha: 0.45) 60%,
|
||||
transparent
|
||||
);
|
||||
padding: 0 15px;
|
||||
|
@ -7564,7 +7618,7 @@ a.status-card {
|
|||
flex: 0 0 auto;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
color: rgba($white, 0.75);
|
||||
color: color.change($white, $alpha: 0.75);
|
||||
font-weight: 500;
|
||||
|
||||
&:active,
|
||||
|
@ -7628,7 +7682,7 @@ a.status-card {
|
|||
&::before {
|
||||
content: '';
|
||||
width: 50px;
|
||||
background: rgba($white, 0.35);
|
||||
background: color.change($white, $alpha: 0.35);
|
||||
border-radius: 4px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
@ -7660,7 +7714,7 @@ a.status-card {
|
|||
margin-inline-start: -6px;
|
||||
transform: translate(0, -50%);
|
||||
background: $white;
|
||||
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2);
|
||||
opacity: 0;
|
||||
|
||||
.no-reduce-motion & {
|
||||
|
@ -7698,7 +7752,7 @@ a.status-card {
|
|||
&::before {
|
||||
content: '';
|
||||
width: 100%;
|
||||
background: rgba($white, 0.35);
|
||||
background: color.change($white, $alpha: 0.35);
|
||||
border-radius: 4px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
@ -7717,7 +7771,7 @@ a.status-card {
|
|||
}
|
||||
|
||||
&__buffer {
|
||||
background: rgba($white, 0.2);
|
||||
background: color.change($white, $alpha: 0.2);
|
||||
}
|
||||
|
||||
&__handle {
|
||||
|
@ -7730,7 +7784,7 @@ a.status-card {
|
|||
top: 10px;
|
||||
margin-inline-start: -6px;
|
||||
background: $white;
|
||||
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2);
|
||||
|
||||
.no-reduce-motion & {
|
||||
transition: opacity 0.1s ease;
|
||||
|
@ -7754,7 +7808,7 @@ a.status-card {
|
|||
top: 50%;
|
||||
inset-inline-start: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background: rgba($base-shadow-color, 0.45);
|
||||
background: color.change($base-shadow-color, $alpha: 0.45);
|
||||
backdrop-filter: $backdrop-blur-filter;
|
||||
color: $white;
|
||||
border-radius: 8px;
|
||||
|
@ -8089,7 +8143,7 @@ noscript {
|
|||
inset-inline-start: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba($base-overlay-background, 0.5);
|
||||
background: color.change($base-overlay-background, $alpha: 0.5);
|
||||
}
|
||||
|
||||
.focal-point {
|
||||
|
@ -8111,7 +8165,7 @@ noscript {
|
|||
transform: translate(-50%, -50%);
|
||||
border: 2px solid #fff;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35);
|
||||
box-shadow: 0 0 0 9999em color.change($base-shadow-color, $alpha: 0.35);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
@ -8353,7 +8407,7 @@ noscript {
|
|||
}
|
||||
|
||||
.verified {
|
||||
border: 1px solid rgba($valid-value-color, 0.5);
|
||||
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
|
||||
margin-top: -1px;
|
||||
margin-inline: -1px;
|
||||
|
||||
|
@ -8573,7 +8627,7 @@ noscript {
|
|||
width: 50px;
|
||||
|
||||
path:first-child {
|
||||
fill: rgba($highlight-text-color, 0.25) !important;
|
||||
fill: color.change($highlight-text-color, $alpha: 0.25) !important;
|
||||
fill-opacity: 1 !important;
|
||||
}
|
||||
|
||||
|
@ -8598,7 +8652,7 @@ noscript {
|
|||
|
||||
.trends__item__sparkline {
|
||||
path:first-child {
|
||||
fill: rgba($gold-star, 0.25) !important;
|
||||
fill: color.change($gold-star, $alpha: 0.25) !important;
|
||||
}
|
||||
|
||||
path:last-child {
|
||||
|
@ -9763,7 +9817,7 @@ noscript {
|
|||
margin-bottom: 5px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid $highlight-text-color;
|
||||
background: rgba($highlight-text-color, 0.15);
|
||||
background: color.change($highlight-text-color, $alpha: 0.15);
|
||||
overflow: hidden;
|
||||
flex-shrink: 0;
|
||||
|
||||
|
@ -9818,7 +9872,7 @@ noscript {
|
|||
}
|
||||
|
||||
.button-tertiary {
|
||||
background: rgba($ui-base-color, 0.15);
|
||||
background: color.change($ui-base-color, $alpha: 0.15);
|
||||
backdrop-filter: blur(8px);
|
||||
}
|
||||
}
|
||||
|
@ -9835,7 +9889,7 @@ noscript {
|
|||
|
||||
.warning-banner {
|
||||
border: 1px solid $warning-red;
|
||||
background: rgba($warning-red, 0.15);
|
||||
background: color.change($warning-red, $alpha: 0.15);
|
||||
|
||||
&__message {
|
||||
h1 {
|
||||
|
@ -10170,13 +10224,13 @@ noscript {
|
|||
padding: 15px;
|
||||
margin: 0;
|
||||
color: $white;
|
||||
background: rgba($black, 0.85);
|
||||
background: color.change($black, $alpha: 0.85);
|
||||
backdrop-filter: blur(8px);
|
||||
border: 1px solid rgba(lighten($classic-base-color, 4%), 0.85);
|
||||
border-radius: 8px;
|
||||
box-shadow:
|
||||
0 10px 15px -3px rgba($base-shadow-color, 0.25),
|
||||
0 4px 6px -4px rgba($base-shadow-color, 0.25);
|
||||
0 10px 15px -3px color.change($base-shadow-color, $alpha: 0.25),
|
||||
0 4px 6px -4px color.change($base-shadow-color, $alpha: 0.25);
|
||||
cursor: default;
|
||||
font-size: 15px;
|
||||
line-height: 21px;
|
||||
|
@ -10214,7 +10268,7 @@ noscript {
|
|||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
background: rgba($ui-base-color, 0.85);
|
||||
background: color.change($ui-base-color, $alpha: 0.85);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10312,7 +10366,7 @@ noscript {
|
|||
padding: 16px 0;
|
||||
padding-bottom: 0;
|
||||
border-bottom: 1px solid var(--background-border-color);
|
||||
background: rgba($ui-highlight-color, 0.05);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.05);
|
||||
|
||||
&__header {
|
||||
display: flex;
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
--dropdown-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--dropdown-shadow:
|
||||
0 20px 25px -5px #{rgba($base-shadow-color, 0.25)},
|
||||
0 8px 10px -6px #{rgba($base-shadow-color, 0.25)};
|
||||
0 20px 25px -5px #{color.change($base-shadow-color, $alpha: 0.25)},
|
||||
0 8px 10px -6px #{color.change($base-shadow-color, $alpha: 0.25)};
|
||||
--modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)};
|
||||
--modal-background-variant-color: #{rgba($ui-base-color, 0.7)};
|
||||
--modal-background-variant-color: #{color.change($ui-base-color, $alpha: 0.7)};
|
||||
--modal-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-color: #{darken($ui-base-color, 8%)};
|
||||
|
@ -21,7 +21,9 @@
|
|||
--on-surface-color: #{color.adjust($ui-base-color, $alpha: -0.5)};
|
||||
--avatar-border-radius: 8px;
|
||||
--media-outline-color: #{rgba(#fcf8ff, 0.15)};
|
||||
--overlay-icon-shadow: drop-shadow(0 0 8px #{rgba($base-shadow-color, 0.35)});
|
||||
--overlay-icon-shadow: drop-shadow(
|
||||
0 0 8px #{color.change($base-shadow-color, $alpha: 0.35)}
|
||||
);
|
||||
--error-background-color: #{darken($error-red, 16%)};
|
||||
--error-active-background-color: #{darken($error-red, 12%)};
|
||||
--on-error-color: #fff;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'variables' as *;
|
||||
@use 'functions' as *;
|
||||
|
||||
|
@ -733,20 +734,20 @@ code {
|
|||
text-align: center;
|
||||
|
||||
&.notice {
|
||||
border: 1px solid rgba($valid-value-color, 0.5);
|
||||
background: rgba($valid-value-color, 0.25);
|
||||
border: 1px solid color.change($valid-value-color, $alpha: 0.5);
|
||||
background: color.change($valid-value-color, $alpha: 0.25);
|
||||
color: $valid-value-color;
|
||||
}
|
||||
|
||||
&.warning {
|
||||
border: 1px solid rgba($gold-star, 0.5);
|
||||
background: rgba($gold-star, 0.25);
|
||||
border: 1px solid color.change($gold-star, $alpha: 0.5);
|
||||
background: color.change($gold-star, $alpha: 0.25);
|
||||
color: $gold-star;
|
||||
}
|
||||
|
||||
&.alert {
|
||||
border: 1px solid rgba($error-value-color, 0.5);
|
||||
background: rgba($error-value-color, 0.1);
|
||||
border: 1px solid color.change($error-value-color, $alpha: 0.5);
|
||||
background: color.change($error-value-color, $alpha: 0.1);
|
||||
color: $error-value-color;
|
||||
}
|
||||
|
||||
|
@ -965,7 +966,7 @@ code {
|
|||
background: $simple-background-color;
|
||||
padding: 4px;
|
||||
margin: 0 10px 20px 0;
|
||||
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
|
||||
display: inline-block;
|
||||
|
||||
svg {
|
||||
|
@ -988,10 +989,10 @@ code {
|
|||
.simple_form {
|
||||
.warning {
|
||||
box-sizing: border-box;
|
||||
background: rgba($error-value-color, 0.5);
|
||||
background: color.change($error-value-color, $alpha: 0.5);
|
||||
color: $primary-text-color;
|
||||
text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);
|
||||
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);
|
||||
text-shadow: 1px 1px 0 color.change($base-shadow-color, $alpha: 0.3);
|
||||
box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.4);
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
margin-bottom: 15px;
|
||||
|
@ -1350,7 +1351,7 @@ code {
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
background: rgba($error-value-color, 0.25);
|
||||
background: color.change($error-value-color, $alpha: 0.25);
|
||||
z-index: 2;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'variables' as *;
|
||||
@use 'functions' as *;
|
||||
|
||||
|
@ -206,7 +207,7 @@
|
|||
|
||||
&:active,
|
||||
&:focus {
|
||||
background-color: rgba($dark-text-color, 0.1);
|
||||
background-color: color.change($dark-text-color, $alpha: 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -225,7 +226,7 @@
|
|||
background: rgba(darken($ui-primary-color, 14%), 0.7);
|
||||
|
||||
&.leading {
|
||||
background: rgba($ui-highlight-color, 0.5);
|
||||
background: color.change($ui-highlight-color, $alpha: 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
@use 'sass:color';
|
||||
@use 'variables' as *;
|
||||
@use 'functions' as *;
|
||||
|
||||
|
@ -16,7 +17,7 @@
|
|||
padding: 15px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
|
||||
box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2);
|
||||
}
|
||||
|
||||
& > a {
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
import { Map as ImmutableMap } from 'immutable';
|
||||
|
||||
import type { ApiRelationshipJSON } from '@/mastodon/api_types/relationships';
|
||||
import type { ApiStatusJSON } from '@/mastodon/api_types/statuses';
|
||||
import type {
|
||||
CustomEmojiData,
|
||||
UnicodeEmojiData,
|
||||
} from '@/mastodon/features/emoji/types';
|
||||
import { createAccountFromServerJSON } from '@/mastodon/models/account';
|
||||
import type { Status } from '@/mastodon/models/status';
|
||||
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
|
||||
|
||||
type FactoryOptions<T> = {
|
||||
|
@ -51,6 +55,36 @@ export const accountFactoryState = (
|
|||
options: FactoryOptions<ApiAccountJSON> = {},
|
||||
) => createAccountFromServerJSON(accountFactory(options));
|
||||
|
||||
export const statusFactory: FactoryFunction<ApiStatusJSON> = ({
|
||||
id,
|
||||
...data
|
||||
} = {}) => ({
|
||||
id: id ?? '1',
|
||||
created_at: '2023-01-01T00:00:00.000Z',
|
||||
sensitive: false,
|
||||
visibility: 'public',
|
||||
language: 'en',
|
||||
uri: 'https://example.com/status/1',
|
||||
url: 'https://example.com/status/1',
|
||||
replies_count: 0,
|
||||
reblogs_count: 0,
|
||||
favorites_count: 0,
|
||||
account: accountFactory(),
|
||||
media_attachments: [],
|
||||
mentions: [],
|
||||
tags: [],
|
||||
emojis: [],
|
||||
content: '<p>This is a test status.</p>',
|
||||
...data,
|
||||
});
|
||||
|
||||
export const statusFactoryState = (
|
||||
options: FactoryOptions<ApiStatusJSON> = {},
|
||||
) =>
|
||||
ImmutableMap<string, unknown>(
|
||||
statusFactory(options) as unknown as Record<string, unknown>,
|
||||
) as unknown as Status;
|
||||
|
||||
export const relationshipsFactory: FactoryFunction<ApiRelationshipJSON> = ({
|
||||
id,
|
||||
...data
|
||||
|
|
|
@ -412,7 +412,7 @@ class User < ApplicationRecord
|
|||
|
||||
def set_approved
|
||||
self.approved = begin
|
||||
if sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval?
|
||||
if requires_approval?
|
||||
false
|
||||
else
|
||||
open_registrations? || valid_invitation? || external?
|
||||
|
@ -426,7 +426,11 @@ class User < ApplicationRecord
|
|||
|
||||
def grant_approval_on_confirmation?
|
||||
# Re-check approval on confirmation if the server has switched to open registrations
|
||||
open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval?
|
||||
open_registrations? && !requires_approval?
|
||||
end
|
||||
|
||||
def requires_approval?
|
||||
sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval?
|
||||
end
|
||||
|
||||
def wrap_email_confirmation
|
||||
|
|
|
@ -12,7 +12,7 @@ class InitialStateSerializer < ActiveModel::Serializer
|
|||
has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
|
||||
has_one :role, serializer: REST::RoleSerializer
|
||||
|
||||
def meta # rubocop:disable Metrics/AbcSize
|
||||
def meta
|
||||
store = default_meta_store
|
||||
|
||||
if object.current_account
|
||||
|
|
|
@ -6,4 +6,5 @@ class REST::ShallowStatusSerializer < REST::StatusSerializer
|
|||
# It looks like redefining one `has_one` requires redefining all inherited ones
|
||||
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
|
||||
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
|
||||
has_one :quote_approval, if: -> { Mastodon::Feature.outgoing_quotes_enabled? }
|
||||
end
|
||||
|
|
|
@ -29,6 +29,8 @@ class REST::StatusSerializer < ActiveModel::Serializer
|
|||
has_many :tags
|
||||
has_many :emojis, serializer: REST::CustomEmojiSerializer
|
||||
|
||||
# Due to a ActiveModel::Serializer quirk, if you change any of the following, have a look at
|
||||
# updating `app/serializers/rest/shallow_status_serializer.rb` as well
|
||||
has_one :quote, key: :quote, serializer: REST::QuoteSerializer
|
||||
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
|
||||
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
|
||||
|
|
|
@ -21,8 +21,9 @@ class Scheduler::SelfDestructScheduler
|
|||
|
||||
def sidekiq_overwhelmed?
|
||||
redis_mem_info = Sidekiq.default_configuration.redis_info
|
||||
maxmemory = [redis_mem_info['maxmemory'].to_f, redis_mem_info['total_system_memory'].to_f].filter(&:positive?).min
|
||||
|
||||
Sidekiq::Stats.new.enqueued > MAX_ENQUEUED || redis_mem_info['used_memory'].to_f > redis_mem_info['total_system_memory'].to_f * MAX_REDIS_MEM_USAGE
|
||||
Sidekiq::Stats.new.enqueued > MAX_ENQUEUED || redis_mem_info['used_memory'].to_f > maxmemory * MAX_REDIS_MEM_USAGE
|
||||
end
|
||||
|
||||
def delete_accounts!
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Disable httplog in production unless log_level is `debug`
|
||||
if !Rails.env.production? || Rails.configuration.log_level == :debug
|
||||
# Disable in production unless log level is `debug`
|
||||
if Rails.env.local? || Rails.logger.debug?
|
||||
require 'httplog'
|
||||
|
||||
HttpLog.configure do |config|
|
||||
|
|
|
@ -49,6 +49,10 @@ ia:
|
|||
attributes:
|
||||
reblog:
|
||||
taken: del message jam existe
|
||||
terms_of_service:
|
||||
attributes:
|
||||
effective_date:
|
||||
too_soon: es troppo tosto, debe esser plus tarde que %{date}
|
||||
user:
|
||||
attributes:
|
||||
date_of_birth:
|
||||
|
|
|
@ -190,6 +190,7 @@ bg:
|
|||
create_relay: Създаване на пренасочване
|
||||
create_unavailable_domain: Създаване на недостъпен домейн
|
||||
create_user_role: Създаване на роля
|
||||
create_username_block: Създаване на правило за потебителско име
|
||||
demote_user: Понижаване на потребител
|
||||
destroy_announcement: Изтриване на оповестяване
|
||||
destroy_canonical_email_block: Изтриване на блокиране за е-поща
|
||||
|
@ -202,6 +203,7 @@ bg:
|
|||
destroy_status: Изтриване на публикация
|
||||
destroy_unavailable_domain: Изтриване на недостъпен домейн
|
||||
destroy_user_role: Унищожаване на роля
|
||||
destroy_username_block: Изтриване на правило за потебителско име
|
||||
disable_2fa_user: Изкл. на 2факт.удостов.
|
||||
disable_custom_emoji: Деактивиране на персонализирано емоджи
|
||||
disable_sign_in_token_auth_user: Изключване на удостоверяването с код по имейл за потребител
|
||||
|
@ -234,6 +236,7 @@ bg:
|
|||
update_report: Обновяване на доклада
|
||||
update_status: Обновяване на публикация
|
||||
update_user_role: Обновяване на ролята
|
||||
update_username_block: Обновяване на правило за потеб. име
|
||||
actions:
|
||||
approve_appeal_html: "%{name} одобри обжалването на решение за модериране от %{target}"
|
||||
approve_user_html: "%{name} одобри регистрирането от %{target}"
|
||||
|
@ -251,6 +254,7 @@ bg:
|
|||
create_ip_block_html: "%{name} създаде правило за IP %{target}"
|
||||
create_unavailable_domain_html: "%{name} спря доставянето до домейн %{target}"
|
||||
create_user_role_html: "%{name} създаде роля %{target}"
|
||||
create_username_block_html: "%{name} добави правило за потребителско име, съдържащо %{target}"
|
||||
demote_user_html: "%{name} понижи потребителя %{target}"
|
||||
destroy_announcement_html: "%{name} изтри оповестяване %{target}"
|
||||
destroy_canonical_email_block_html: "%{name} отблокира имейла с хеш %{target}"
|
||||
|
@ -263,6 +267,7 @@ bg:
|
|||
destroy_status_html: "%{name} премахна публикация от %{target}"
|
||||
destroy_unavailable_domain_html: "%{name} възобнови доставката до домейн %{target}"
|
||||
destroy_user_role_html: "%{name} изтри роля %{target}"
|
||||
destroy_username_block_html: "%{name} премахна правило за потребителско име, съдържащо %{target}"
|
||||
disable_2fa_user_html: "%{name} изключи двуфакторното изискване за потребител %{target}"
|
||||
disable_custom_emoji_html: "%{name} изключи емоджито %{target}"
|
||||
disable_sign_in_token_auth_user_html: "%{name} изключва удостоверението с код по е-поща за %{target}"
|
||||
|
@ -295,6 +300,7 @@ bg:
|
|||
update_report_html: "%{name} осъвремени доклад %{target}"
|
||||
update_status_html: "%{name} обнови публикация от %{target}"
|
||||
update_user_role_html: "%{name} промени ролята %{target}"
|
||||
update_username_block_html: "%{name} обнови правило за потребителско име, съдържащо %{target}"
|
||||
deleted_account: изтрит акаунт
|
||||
empty: Няма намерени дневници.
|
||||
filter_by_action: Филтриране по действие
|
||||
|
@ -791,12 +797,16 @@ bg:
|
|||
title: Сървърни правила
|
||||
translation: Превод
|
||||
translations: Преводи
|
||||
translations_explanation: Може по избор да добавите преводи за правилата. Стандартната стойност ще се показва, ако няма налична преведена версия. Винаги се уверявайте, че всеки предоставен превод е синхронизиран със стандартната стойност.
|
||||
settings:
|
||||
about:
|
||||
manage_rules: Управление на правилата на сървъра
|
||||
preamble: Предложете задълбочена информация за това как вашият сървър се управлява, модерира и финансира.
|
||||
rules_hint: Съществува специална част за правилата, които се очаква вашите потребители да спазват.
|
||||
title: Относно
|
||||
allow_referrer_origin:
|
||||
desc: Когато потребителите ви щракнат върху връзки към външни сайтове, то браузърите им може да изпращат адреса на сървъра ви в Mastodon както референтът. Изключете това, ако то неповторимо би установило самоличността на потребителя ви, например ако това е личен сървър в Mastodon.
|
||||
title: Позволяване на външни сайтове да виждат сървъра ви в Mastodon като източник на трафик
|
||||
appearance:
|
||||
preamble: Настройване на мрежовия интерфейс на Mastodon.
|
||||
title: Външен вид
|
||||
|
@ -1067,6 +1077,23 @@ bg:
|
|||
other: Използвано от %{count} души през последната седмица
|
||||
title: Препоръки и насоки на развитие
|
||||
trending: Изгряващи
|
||||
username_blocks:
|
||||
add_new: Добавяне на ново
|
||||
block_registrations: Блокиране на регистрациите
|
||||
comparison:
|
||||
contains: Съдържа
|
||||
contains_html: Съдържа %{string}
|
||||
created_msg: Успешно създадено правило за потребителско име
|
||||
delete: Изтриване
|
||||
edit:
|
||||
title: Промяна на правило за потреб. име
|
||||
new:
|
||||
create: Създаване на правило
|
||||
title: Създаване на ново правило за потреб. име
|
||||
no_username_block_selected: Няма променени правила за потребителско име, тъй като нищо не бе избрано
|
||||
not_permitted: Няма позволение
|
||||
title: Правила за потребителско име
|
||||
updated_msg: Успешно обновено правило за потребителско име
|
||||
warning_presets:
|
||||
add_new: Добавяне на ново
|
||||
delete: Изтриване
|
||||
|
@ -1331,6 +1358,10 @@ bg:
|
|||
basic_information: Основна информация
|
||||
hint_html: "<strong>Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви.</strong> Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила."
|
||||
other: Друго
|
||||
emoji_styles:
|
||||
auto: Автоматично
|
||||
native: Естествено системно
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Подадохте невалидна или деформирана заявка.
|
||||
'403': Нямате позволение да разгледате тази страница.
|
||||
|
@ -1640,6 +1671,10 @@ bg:
|
|||
title: Ново споменаване
|
||||
poll:
|
||||
subject: Анкетата от %{name} приключи
|
||||
quote:
|
||||
body: 'Ваша публикация беше цитирана от %{name}:'
|
||||
subject: "%{name} цитира ваша публикация"
|
||||
title: Нов цитат
|
||||
reblog:
|
||||
body: 'Ваша публикация беше раздута от %{name}:'
|
||||
subject: "%{name} разду ваша публикация"
|
||||
|
@ -1850,6 +1885,7 @@ bg:
|
|||
edited_at_html: Редактирано на %{date}
|
||||
errors:
|
||||
in_reply_not_found: Изглежда, че публикацията, на която се опитвате да отговорите, не съществува.
|
||||
quoted_status_not_found: Публикацията, която се опитвате да цитирате, не съществува.
|
||||
over_character_limit: прехвърлен лимит от %{max} символа
|
||||
pin_errors:
|
||||
direct: Публикациите, които са видими само за потребители споменати в тях, не могат да бъдат закачани
|
||||
|
@ -1857,6 +1893,8 @@ bg:
|
|||
ownership: Публикация на някого другиго не може да бъде закачена
|
||||
reblog: Раздуване не може да бъде закачано
|
||||
quote_policies:
|
||||
followers: Само последователите ви
|
||||
nobody: Никого
|
||||
public: Всеки
|
||||
title: "%{name}: „%{quote}“"
|
||||
visibilities:
|
||||
|
|
|
@ -1713,7 +1713,7 @@ ca:
|
|||
too_few_options: ha de tenir més d'una opció
|
||||
too_many_options: no pot contenir més de %{max} opcions
|
||||
preferences:
|
||||
other: Altre
|
||||
other: Altres
|
||||
posting_defaults: Valors per defecte de publicació
|
||||
public_timelines: Línies de temps públiques
|
||||
privacy:
|
||||
|
|
|
@ -202,6 +202,7 @@ cy:
|
|||
create_relay: Creu Cyfnewidiad
|
||||
create_unavailable_domain: Creu Parth Ddim ar Gael
|
||||
create_user_role: Creu Rôl
|
||||
create_username_block: Creu Rheol Enw Defnyddiwr
|
||||
demote_user: Diraddio Defnyddiwr
|
||||
destroy_announcement: Dileu Cyhoeddiad
|
||||
destroy_canonical_email_block: Dileu Rhwystr E-bost
|
||||
|
@ -215,6 +216,7 @@ cy:
|
|||
destroy_status: Dileu Postiad
|
||||
destroy_unavailable_domain: Dileu Parth Ddim ar Gael
|
||||
destroy_user_role: Dileu Rôl
|
||||
destroy_username_block: Dileu Rheol Enw Defnyddiwr
|
||||
disable_2fa_user: Diffodd 2FA
|
||||
disable_custom_emoji: Analluogi Emoji Addasedig
|
||||
disable_relay: Analluogi Cyfnewidiad
|
||||
|
@ -249,6 +251,7 @@ cy:
|
|||
update_report: Diweddaru Adroddiad
|
||||
update_status: Diweddaru Postiad
|
||||
update_user_role: Diweddaru Rôl
|
||||
update_username_block: Diweddaru Rheol Enw Defnyddiwr
|
||||
actions:
|
||||
approve_appeal_html: Mae %{name} wedi cymeradwyo penderfyniad cymedroli gan %{target}
|
||||
approve_user_html: Mae %{name} wedi cymeradwyo cofrestru gan %{target}
|
||||
|
@ -267,6 +270,7 @@ cy:
|
|||
create_relay_html: Creodd %{name} gyfnewidiad %{target}
|
||||
create_unavailable_domain_html: Mae %{name} wedi stopio danfon i barth %{target}
|
||||
create_user_role_html: Mae %{name} wedi creu rôl %{target}
|
||||
create_username_block_html: Mae %{name} wedi ychwanegu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
|
||||
demote_user_html: Mae %{name} wedi israddio defnyddiwr %{target}
|
||||
destroy_announcement_html: Mae %{name} wedi dileu cyhoeddiad %{target}
|
||||
destroy_canonical_email_block_html: Mae %{name} wedi dad-rwystro parth e-bost %{target}
|
||||
|
@ -280,6 +284,7 @@ cy:
|
|||
destroy_status_html: Mae %{name} wedi tynnu postiad gan %{target}
|
||||
destroy_unavailable_domain_html: Mae %{name} wedi ailddechrau anfon i barth %{target}
|
||||
destroy_user_role_html: Mae %{name} wedi dileu rôl %{target}
|
||||
destroy_username_block_html: Mae %{name} wedi dileu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
|
||||
disable_2fa_user_html: Mae %{name} wedi analluogi gofyniad dau ffactor ar gyfer defnyddiwr %{target}
|
||||
disable_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target}
|
||||
disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target}
|
||||
|
@ -314,6 +319,7 @@ cy:
|
|||
update_report_html: Mae %{name} wedi diweddaru adroddiad %{target}
|
||||
update_status_html: Mae %{name} wedi diweddaru postiad gan %{target}
|
||||
update_user_role_html: Mae %{name} wedi newid rôl %{target}
|
||||
update_username_block_html: Mae %{name} wedi diweddaru rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target}
|
||||
deleted_account: cyfrif wedi'i ddileu
|
||||
empty: Dim logiau ar gael.
|
||||
filter_by_action: Hidlo yn ôl gweithred
|
||||
|
@ -1157,6 +1163,25 @@ cy:
|
|||
zero: Wedi'i ddefnyddio gan %{count} o bobl dros yr wythnos ddiwethaf
|
||||
title: Argymhellion a Threndiau
|
||||
trending: Trendio
|
||||
username_blocks:
|
||||
add_new: Ychwanegu newydd
|
||||
block_registrations: Rhwystro cofrestriadau
|
||||
comparison:
|
||||
contains: Yn cynnwys
|
||||
equals: Yn hafal i
|
||||
contains_html: Yn cynnwys %{string}
|
||||
created_msg: Rheol enw defnyddiwr wedi'i chreu'n llwyddiannus
|
||||
delete: Dileu
|
||||
edit:
|
||||
title: Golygu rheol enw defnyddiwr
|
||||
matches_exactly_html: Yn hafal i %{string}
|
||||
new:
|
||||
create: Creu rheol
|
||||
title: Creu rheol enw defnyddiwr newydd
|
||||
no_username_block_selected: Heb newid unrhyw reolau enw defnyddiwr gan nad oes un ohonyn nhw wedi'u dewis
|
||||
not_permitted: Dim caniatâd
|
||||
title: Rheolau enw defnyddiwr
|
||||
updated_msg: Rheol enw defnyddiwr wedi'i diweddaru'n llwyddiannus
|
||||
warning_presets:
|
||||
add_new: Ychwanegu newydd
|
||||
delete: Dileu
|
||||
|
@ -1817,6 +1842,10 @@ cy:
|
|||
title: Crywbylliad newydd
|
||||
poll:
|
||||
subject: Mae arolwg gan %{name} wedi dod i ben
|
||||
quote:
|
||||
body: 'Mae %{name} wedi dyfynnu eich postiad :'
|
||||
subject: Mae %{name} wedi dyfynnu eich postiad
|
||||
title: Dyfyniad newydd
|
||||
reblog:
|
||||
body: 'Cafodd eich postiad ei hybu gan %{name}:'
|
||||
subject: Rhoddodd %{name} hwb i'ch postiad
|
||||
|
@ -1901,7 +1930,7 @@ cy:
|
|||
last_active: Yn weithgar ddiwethaf
|
||||
most_recent: Y diweddaraf
|
||||
moved: Wedi symud
|
||||
mutual: Cydfudd
|
||||
mutual: Yn Gyffredin
|
||||
primary: Cynradd
|
||||
relationship: Perthynas
|
||||
remove_selected_domains: Tynnu'r holl ddilynwyr o'r parthau a ddewiswyd
|
||||
|
@ -2051,6 +2080,8 @@ cy:
|
|||
ownership: Nid oes modd pinio postiad rhywun arall
|
||||
reblog: Nid oes modd pinio hwb
|
||||
quote_policies:
|
||||
followers: Dim ond eich dilynwyr
|
||||
nobody: Neb
|
||||
public: Pawb
|
||||
title: '%{name}: "%{quote}"'
|
||||
visibilities:
|
||||
|
|
|
@ -58,7 +58,7 @@ be:
|
|||
subtitle: Для вашага ўліковага запісу была ўключаная двухфактарная аўтэнтыфікацыя.
|
||||
title: двухэтапнае спраўджанне уключана
|
||||
two_factor_recovery_codes_changed:
|
||||
explanation: Папярэднія коды аднаўлення былі ануляваны і былі створаныя новыя.
|
||||
explanation: Папярэднія коды аднаўлення былі ануляваны і створаны новыя.
|
||||
subject: 'Mastodon: створаныя новыя коды аднаўлення'
|
||||
subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх былі створаныя новыя.
|
||||
title: 2FA коды аднаўлення былі зменены
|
||||
|
|
|
@ -72,7 +72,7 @@ fa:
|
|||
revoke: آیا مطمئن هستید؟
|
||||
index:
|
||||
authorized_at: تایید شده در %{date}
|
||||
description_html: اینها نرمافزار هایی هستند که میتوانند به حساب کاربری شما با استفاده از رابط نرمافزاری دسترسی پیدا کنند. اگر نرمافزار های در اینجا هستند که نمیشناسید، یا نرمافزاری که رفتار مشکوک دارد، میتوانید دسترسی اش را باطل کنید.
|
||||
description_html: اینها برنامههاییند که میتوانند با استفاده از میانای برنامهنویسی به حسابتان دسترسی پیدا کنند. اگر برنامهای هست که نمیشناسیدش یا رفتار بدی دارد میتوانید دسترسیش را باطل کنید.
|
||||
last_used_at: آخرین استفاده در %{date}
|
||||
never_used: هرگز استفاده نشده
|
||||
scopes: اجازهها
|
||||
|
|
|
@ -2090,4 +2090,4 @@ eo:
|
|||
not_enabled: Vi ankoraŭ ne ŝaltis WebAuth
|
||||
not_supported: Ĉi tiu legilo ne povas uzi sekurecŝlosilojn
|
||||
otp_required: Por uzi sekurecŝlosilojn, ebligu 2-faktoran autentigon unue.
|
||||
registered_on: Registrigita je %{date}
|
||||
registered_on: Registrita je %{date}
|
||||
|
|
|
@ -258,6 +258,7 @@ fa:
|
|||
create_relay_html: "%{name} یک رله %{target} ایجاد کرد"
|
||||
create_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را متوقف کرد"
|
||||
create_user_role_html: "%{name} نقش %{target} را ایجاد کرد"
|
||||
create_username_block_html: "%{name} قانونی برای نامهای کاربری دارای %{target} افزود"
|
||||
demote_user_html: "%{name} کاربر %{target} را تنزل داد"
|
||||
destroy_announcement_html: "%{name} اعلامیهٔ %{target} را حذف کرد"
|
||||
destroy_canonical_email_block_html: "%{name} رایانامه با درهمریزی %{target} را نامسدود کرد"
|
||||
|
@ -271,6 +272,7 @@ fa:
|
|||
destroy_status_html: "%{name} وضعیت %{target} را برداشت"
|
||||
destroy_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را از سر گرفت"
|
||||
destroy_user_role_html: "%{name} نقش %{target} را حذف کرد"
|
||||
destroy_username_block_html: "%{name} قانون نامهای کاربری دارای %{target} را برداشت"
|
||||
disable_2fa_user_html: "%{name} ضرورت ورود دو مرحلهای را برای کاربر %{target} غیر فعال کرد"
|
||||
disable_custom_emoji_html: "%{name} شکلک %{target} را غیرفعال کرد"
|
||||
disable_relay_html: "%{name} رله %{target} را غیرفعال کرد"
|
||||
|
@ -305,6 +307,7 @@ fa:
|
|||
update_report_html: "%{name} گزارش %{target} را بهروز کرد"
|
||||
update_status_html: "%{name} نوشتهٔ %{target} را بهروز کرد"
|
||||
update_user_role_html: "%{name} نقش %{target} را تغییر داد"
|
||||
update_username_block_html: "%{name} قانونی برای نامهای کاربری دارای %{target} را بهروز کرد"
|
||||
deleted_account: حساب حذف شد
|
||||
empty: هیچ گزارشی پیدا نشد.
|
||||
filter_by_action: پالایش بر اساس کنش
|
||||
|
@ -1089,7 +1092,24 @@ fa:
|
|||
title: توصیه ها و روندها
|
||||
trending: پرطرفدار
|
||||
username_blocks:
|
||||
add_new: افزودن جدید
|
||||
block_registrations: انسداد ثبتنامها
|
||||
comparison:
|
||||
contains: دارای
|
||||
equals: برابر
|
||||
contains_html: دارای %{string}
|
||||
created_msg: قانون نام کاربری با موفّقیت ایجاد شد
|
||||
delete: حذف
|
||||
edit:
|
||||
title: ویرایش قانون نامکاربری
|
||||
matches_exactly_html: برابر %{string}
|
||||
new:
|
||||
create: ایجاد قانون
|
||||
title: ایجاد قانون نامکاربری جدید
|
||||
no_username_block_selected: هیچ قاعدهٔ نام کاربریای تغییری نکرد زیرا هیچکدام گزیده نشده بودند
|
||||
not_permitted: مجاز نیست
|
||||
title: قانون نام کاربری
|
||||
updated_msg: قانون نام کاربری با موفّقیت بهروز شد
|
||||
warning_presets:
|
||||
add_new: افزودن تازه
|
||||
delete: زدودن
|
||||
|
|
|
@ -18,8 +18,8 @@ fi:
|
|||
pin_errors:
|
||||
following: Sinun täytyy seurata käyttäjää, jota haluat tukea
|
||||
posts:
|
||||
one: Julkaisu
|
||||
other: Julkaisua
|
||||
one: julkaisu
|
||||
other: julkaisua
|
||||
posts_tab_heading: Julkaisut
|
||||
self_follow_error: Oman tilisi seuraaminen ei ole sallittua
|
||||
admin:
|
||||
|
@ -507,14 +507,14 @@ fi:
|
|||
registration_requested: Rekisteröintiä pyydetty
|
||||
registrations:
|
||||
confirm: Vahvista
|
||||
description: Sait rekisteröinnin FASP:lta. Hylkää se, jos et aloittanut sitä. Jos aloitat tämän, vertaile huolellisesti nimeä ja sormenjälkeä ennen rekisteröinnin vahvistamista.
|
||||
description: Vastaanotit rekisteröintymisen FASP-palvelusta. Hylkää rekisteröintyminen, jos et aloittanut sitä. Jos aloitit sen, vertaile huolellisesti nimeä ja avaimen sormenjälkeä ennen kuin hyväksyt rekisteröintymisen.
|
||||
reject: Hylkää
|
||||
title: Vahvista FASP-rekisteröinti
|
||||
save: Tallenna
|
||||
select_capabilities: Valitse kyvykkyydet
|
||||
sign_in: Kirjaudu sisään
|
||||
status: Tila
|
||||
title: Fediversumin Tukitoimintojen Tarjoajat
|
||||
title: Fediversumin tukitoimintojen tarjoajat
|
||||
title: FASP
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä</strong>. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä."
|
||||
|
|
|
@ -190,6 +190,7 @@ ia:
|
|||
create_relay: Crear repetitor
|
||||
create_unavailable_domain: Crear dominio indisponibile
|
||||
create_user_role: Crear un rolo
|
||||
create_username_block: Crear regula de nomine de usator
|
||||
demote_user: Degradar usator
|
||||
destroy_announcement: Deler annuncio
|
||||
destroy_canonical_email_block: Deler blocada de e-mail
|
||||
|
@ -203,6 +204,7 @@ ia:
|
|||
destroy_status: Deler message
|
||||
destroy_unavailable_domain: Deler dominio indisponibile
|
||||
destroy_user_role: Destruer rolo
|
||||
destroy_username_block: Deler regula de nomine de usator
|
||||
disable_2fa_user: Disactivar A2F
|
||||
disable_custom_emoji: Disactivar emoji personalisate
|
||||
disable_relay: Disactivar repetitor
|
||||
|
@ -237,6 +239,7 @@ ia:
|
|||
update_report: Actualisar le reporto
|
||||
update_status: Actualisar le message
|
||||
update_user_role: Actualisar rolo
|
||||
update_username_block: Actualisar regula de nomine de usator
|
||||
actions:
|
||||
approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}"
|
||||
approve_user_html: "%{name} approbava inscription de %{target}"
|
||||
|
@ -255,6 +258,7 @@ ia:
|
|||
create_relay_html: "%{name} ha create un repetitor %{target}"
|
||||
create_unavailable_domain_html: "%{name} stoppava livration al dominio %{target}"
|
||||
create_user_role_html: "%{name} creava rolo de %{target}"
|
||||
create_username_block_html: "%{name} ha addite un regula pro nomines de usator que contine %{target}"
|
||||
demote_user_html: "%{name} degradava usator %{target}"
|
||||
destroy_announcement_html: "%{name} deleva annuncio %{target}"
|
||||
destroy_canonical_email_block_html: "%{name} disblocava le e-mail con le hash %{target}"
|
||||
|
@ -268,6 +272,7 @@ ia:
|
|||
destroy_status_html: "%{name} removeva un message de %{target}"
|
||||
destroy_unavailable_domain_html: "%{name} reprendeva le livration al dominio %{target}"
|
||||
destroy_user_role_html: "%{name} deleva le rolo %{target}"
|
||||
destroy_username_block_html: "%{name} ha removite un regula pro nomines de usator que contine %{target}"
|
||||
disable_2fa_user_html: "%{name} disactivava le authentication a duo factores pro le usator %{target}"
|
||||
disable_custom_emoji_html: "%{name} disactivava le emoji %{target}"
|
||||
disable_relay_html: "%{name} ha disactivate le repetitor %{target}"
|
||||
|
@ -302,6 +307,7 @@ ia:
|
|||
update_report_html: "%{name} actualisava reporto %{target}"
|
||||
update_status_html: "%{name} actualisava message de %{target}"
|
||||
update_user_role_html: "%{name} cambiava rolo de %{target}"
|
||||
update_username_block_html: "%{name} ha actualisate un regula pro nomines de usator que contine %{target}"
|
||||
deleted_account: conto delite
|
||||
empty: Nulle registros trovate.
|
||||
filter_by_action: Filtrar per action
|
||||
|
@ -321,7 +327,7 @@ ia:
|
|||
preview:
|
||||
disclaimer: Proque le usatores non pote optar pro non reciper los, le notificationes per e-mail debe limitar se a annuncios importante tal como le notificationes de violation de datos personal o de clausura de servitores.
|
||||
explanation_html: 'Le e-mail essera inviate a <strong>%{display_count} usatores</strong>. Le sequente texto essera includite in le e-mail:'
|
||||
title: Previder le notification de annuncio
|
||||
title: Previsualisar le notification de annuncio
|
||||
publish: Publicar
|
||||
published_msg: Annuncio publicate con successo!
|
||||
scheduled_for: Programmate pro %{time}
|
||||
|
@ -480,6 +486,36 @@ ia:
|
|||
new:
|
||||
title: Importar blocadas de dominio
|
||||
no_file: Necun file seligite
|
||||
fasp:
|
||||
debug:
|
||||
callbacks:
|
||||
created_at: Data de creation
|
||||
delete: Deler
|
||||
ip: Adresse IP
|
||||
request_body: Corpore del requesta
|
||||
title: Depurar le appellos de retorno
|
||||
providers:
|
||||
active: Active
|
||||
base_url: URL de base
|
||||
callback: Appello de retorno
|
||||
delete: Deler
|
||||
edit: Modificar fornitor
|
||||
finish_registration: Terminar registration
|
||||
name: Nomine
|
||||
providers: Fornitores
|
||||
public_key_fingerprint: Dactylogramma del clave public
|
||||
registration_requested: Registration requestate
|
||||
registrations:
|
||||
confirm: Confirmar
|
||||
description: Tu ha recipite un registration de un FSAF. Rejecta lo si tu non lo ha initiate. Si tu lo ha initiate, compara attentemente le nomine e le dactylogramma del clave ante de confirmar le registration.
|
||||
reject: Rejectar
|
||||
title: Confirmar registration FSAF
|
||||
save: Salvar
|
||||
select_capabilities: Selige capacitates
|
||||
sign_in: Aperir session
|
||||
status: Stato
|
||||
title: Fornitores de Servicios Auxiliar del Fediverso
|
||||
title: FSAF
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Le recommendationes de sequimento adjuta le nove usatores a trovar rapidemente contento interessante.</strong> Quando un usator non ha un historia sufficiente de interactiones con alteres pro formar recommendationes personalisate de sequimento, iste contos es recommendate. Illos se recalcula cata die a partir de un mixtura de contos con le plus grande numero de ingagiamentos recente e le numero de sequitores local le plus alte pro un lingua date."
|
||||
language: Pro le lingua
|
||||
|
@ -548,6 +584,13 @@ ia:
|
|||
all: Toto
|
||||
limited: Limitate
|
||||
title: Moderation
|
||||
moderation_notes:
|
||||
create: Adder nota de moderation
|
||||
created_msg: Le nota de moderation del servitor ha essite create.
|
||||
description_html: Vider e lassar notas pro altere moderatores e pro referentia futur
|
||||
destroyed_msg: Le nota de moderation del servitor ha essite delite.
|
||||
placeholder: Informationes sur iste servitor, actiones prendite o altere cosas que pote adjutar te a moderar iste servitor in le futuro.
|
||||
title: Notas de moderation
|
||||
private_comment: Commento private
|
||||
public_comment: Commento public
|
||||
purge: Purgar
|
||||
|
@ -756,11 +799,17 @@ ia:
|
|||
title: Rolos
|
||||
rules:
|
||||
add_new: Adder regula
|
||||
add_translation: Adder traduction
|
||||
delete: Deler
|
||||
description_html: Ben que multes affirma de haber legite e acceptate le conditiones de servicio, generalmente le gente non los lege completemente usque un problema surge. <strong>Facilita le visibilitate del regulas de tu servitor in un colpo de oculo forniente los in un lista a punctos.</strong> Tenta mantener le regulas individual curte e simple, ma sin divider los in multe punctos separate.
|
||||
edit: Modificar regula
|
||||
empty: Necun regula del servitor ha essite definite ancora.
|
||||
move_down: Displaciar a basso
|
||||
move_up: Displaciar in alto
|
||||
title: Regulas del servitor
|
||||
translation: Traduction
|
||||
translations: Traductiones
|
||||
translations_explanation: Tu ha le option de adder traductiones al regulas. Le valor predefinite apparera si necun version traducite es disponibile. Per favor sempre assecura te que omne traduction fornite es ben synchronisate con le valor predefinite.
|
||||
settings:
|
||||
about:
|
||||
manage_rules: Gerer le regulas del servitor
|
||||
|
@ -877,7 +926,7 @@ ia:
|
|||
database_schema_check:
|
||||
message_html: Il ha migrationes de base de datos pendente. Per favor exeque los pro assecurar que le application se comporta como expectate
|
||||
elasticsearch_analysis_index_mismatch:
|
||||
message_html: Le parametros del analisator del indice de Elasticsearch es obsolete. Executa <code>tootctl search deploy --only-mapping --only=%{value}</code>
|
||||
message_html: Le parametros del analysator del indice de Elasticsearch es obsolete. Executa <code>tootctl search deploy --only-mapping --only=%{value}</code>
|
||||
elasticsearch_health_red:
|
||||
message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile
|
||||
elasticsearch_health_yellow:
|
||||
|
@ -942,7 +991,7 @@ ia:
|
|||
changelog: Lo que ha cambiate
|
||||
create: Usar tu proprie
|
||||
current: Actual
|
||||
draft: Provisori
|
||||
draft: Esbosso
|
||||
generate: Usar modello
|
||||
generates:
|
||||
action: Generar
|
||||
|
@ -965,7 +1014,7 @@ ia:
|
|||
title: Previsualisar le notification sur le conditiones de servicio
|
||||
publish: Publicar
|
||||
published_on_html: Publicate le %{date}
|
||||
save_draft: Salvar version provisori
|
||||
save_draft: Salvar esbosso
|
||||
title: Conditiones de servicio
|
||||
title: Administration
|
||||
trends:
|
||||
|
@ -1043,8 +1092,17 @@ ia:
|
|||
title: Recommendationes e tendentias
|
||||
trending: In tendentia
|
||||
username_blocks:
|
||||
add_new: Adder nove
|
||||
block_registrations: Blocar registrationes
|
||||
comparison:
|
||||
contains: Contine
|
||||
equals: Es equal a
|
||||
contains_html: Contine %{string}
|
||||
created_msg: Regula de nomine de usator create con successo
|
||||
delete: Deler
|
||||
edit:
|
||||
title: Modificar regula de nomine de usator
|
||||
matches_exactly_html: Es equal a %{string}
|
||||
new:
|
||||
create: Crear regula
|
||||
title: Crear nove regula de nomine de usator
|
||||
|
@ -1316,6 +1374,10 @@ ia:
|
|||
basic_information: Information basic
|
||||
hint_html: "<strong>Personalisa lo que le personas vide sur tu profilo public e presso tu messages.</strong> Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo complete e un photo."
|
||||
other: Alteres
|
||||
emoji_styles:
|
||||
auto: Automatic
|
||||
native: Native
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Le requesta que tu ha inviate non es valide o es mal formate.
|
||||
'403': Tu non ha le permission de acceder a iste pagina.
|
||||
|
@ -1625,6 +1687,10 @@ ia:
|
|||
title: Nove mention
|
||||
poll:
|
||||
subject: Un sondage de %{name} ha finite
|
||||
quote:
|
||||
body: 'Tu message ha essite citate per %{name}:'
|
||||
subject: "%{name} ha citate tu message"
|
||||
title: Nove citation
|
||||
reblog:
|
||||
body: "%{name} ha impulsate tu message:"
|
||||
subject: "%{name} ha impulsate tu message"
|
||||
|
@ -1835,6 +1901,7 @@ ia:
|
|||
edited_at_html: Modificate le %{date}
|
||||
errors:
|
||||
in_reply_not_found: Le message a que tu tenta responder non pare exister.
|
||||
quoted_status_not_found: Le message que tu tenta citar non pare exister.
|
||||
over_character_limit: limite de characteres de %{max} excedite
|
||||
pin_errors:
|
||||
direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate
|
||||
|
@ -1842,6 +1909,8 @@ ia:
|
|||
ownership: Le message de alcuno altere non pote esser appunctate
|
||||
reblog: Un impulso non pote esser affixate
|
||||
quote_policies:
|
||||
followers: Solmente tu sequitores
|
||||
nobody: Necuno
|
||||
public: Omnes
|
||||
title: "%{name}: “%{quote}”"
|
||||
visibilities:
|
||||
|
@ -1897,7 +1966,7 @@ ia:
|
|||
terms_of_service:
|
||||
title: Conditiones de servicio
|
||||
terms_of_service_interstitial:
|
||||
future_preamble_html: Nos face alcun cambios a nostre conditiones de servicio, que entrara in vigor in <strong>%{date}</strong>. Nos te invita a revider le conditiones actualisate.
|
||||
future_preamble_html: Nos apporta alcun modificationes a nostre conditiones de servicio, le quales entrara in vigor le <strong>%{date}</strong>. Nos te invita a revider le conditiones actualisate.
|
||||
past_preamble_html: Nos ha cambiate nostre conditiones de servicio desde tu ultime visita. Nos te invita a revider le conditiones actualisate.
|
||||
review_link: Revider le conditiones de servicio
|
||||
title: Le conditiones de servicio de %{domain} cambia
|
||||
|
@ -1969,7 +2038,7 @@ ia:
|
|||
agreement: Si tu continua a usar %{domain}, tu accepta iste conditiones. Si tu non es de accordo con le conditiones actualisate, tu pote sempre eliminar tu conto pro terminar tu accordo con %{domain}.
|
||||
changelog: 'In summario, ecce lo que iste actualisation significa pro te:'
|
||||
description: 'Tu recipe iste e-mail proque nos face alcun cambios al nostre conditiones de servicio a %{domain}. Iste actualisationes entrara in vigor in %{date}. Nos te invita a revider integralmente le conditiones actualisate hic:'
|
||||
description_html: Tu recipe iste e-mail proque nos face alcun cambios al nostre conditiones de servicio a %{domain}. Iste actualisationes entrara in vigor in <strong>%{date}</strong>. Nos te invita a revider <a href="%{path}" target="_blank">integralmente le conditiones actualisate hic</a>.
|
||||
description_html: Tu recipe iste message perque nos apporta alcun modificationes a nostre conditiones de servicio sur %{domain}. Iste actualisationes entrara in vigor le <strong>%{date}</strong>. Nos te invita a <a href="%{path}" target="_blank">leger integralmente le conditiones actualisate</a>.
|
||||
sign_off: Le equipa de %{domain}
|
||||
subject: Actualisationes de nostre conditiones de servicio
|
||||
subtitle: Le conditiones de servicio de %{domain} ha cambiate
|
||||
|
|
|
@ -25,7 +25,7 @@ nan:
|
|||
action: 執行動作
|
||||
already_silenced: Tsit ê口座有受著限制。
|
||||
already_suspended: Tsit ê口座ê權限已經hōo lâng停止。
|
||||
title: Kā %{acct} 做審核ê動作
|
||||
title: Kā %{acct} 做管理ê動作
|
||||
account_moderation_notes:
|
||||
create: 留記錄
|
||||
created_msg: 管理記錄成功建立!
|
||||
|
@ -238,7 +238,7 @@ nan:
|
|||
update_user_role: 更新角色
|
||||
update_username_block: 更新使用者號名規則
|
||||
actions:
|
||||
approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì審核決定ê投訴"
|
||||
approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì管理決定ê投訴"
|
||||
approve_user_html: "%{name} 允准 %{target} ê 註冊"
|
||||
assigned_to_self_report_html: "%{name} kā報告 %{target} 分配hōo家tī"
|
||||
change_email_user_html: "%{name} 改變 %{target} ê電子phue地址"
|
||||
|
@ -282,7 +282,7 @@ nan:
|
|||
memorialize_account_html: "%{name} kā %{target} 設做故人口座"
|
||||
promote_user_html: "%{name} kā 用者 %{target} 升級"
|
||||
publish_terms_of_service_html: "%{name} 公佈服務規則ê更新"
|
||||
reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì審核決定ê投訴"
|
||||
reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì管理決定ê投訴"
|
||||
reject_user_html: "%{name} 拒絕 %{target} ê 註冊"
|
||||
remove_avatar_user_html: "%{name} thâi掉 %{target} ê標頭"
|
||||
reopen_report_html: "%{name} 重開 %{target} ê檢舉"
|
||||
|
@ -667,7 +667,7 @@ nan:
|
|||
none: 無
|
||||
comment_description_html: 為著提供其他資訊,%{name} 寫:
|
||||
confirm: 確認
|
||||
confirm_action: 確認kā %{acct} 審核ê動作
|
||||
confirm_action: 確認kā %{acct} 管理ê動作
|
||||
created_at: 檢舉tī
|
||||
delete_and_resolve: Thâi掉PO文
|
||||
forwarded: 轉送ah
|
||||
|
@ -720,9 +720,48 @@ nan:
|
|||
target_origin: 受檢舉ê口座ê來源
|
||||
title: 檢舉
|
||||
unassign: 取消分配
|
||||
unknown_action_msg: M̄知影ê動作:%{action}
|
||||
unresolved: 無解決
|
||||
updated_at: 更新
|
||||
view_profile: 看個人資料
|
||||
roles:
|
||||
add_new: 加添角色
|
||||
assigned_users:
|
||||
other: "%{count} ê用者"
|
||||
categories:
|
||||
administration: 管理員
|
||||
devops: DevOps
|
||||
invites: 邀請
|
||||
moderation: 管理
|
||||
special: 特別
|
||||
delete: Thâi掉
|
||||
description_html: 用<strong>用者角色</strong>,lí通自訂lí ê用者ē當接近使用Mastodon ê siánn物功能kap區域。
|
||||
edit: 編「%{name}」ê角色
|
||||
everyone: 預設ê權限
|
||||
everyone_full_description_html: Tse是ē影響<strong>所有用者</strong>ê<strong>基本角色</strong>,就算是無分配tio̍h角色ê mā kâng款。所有其他ê角色繼承伊ê權限。
|
||||
permissions_count:
|
||||
other: "%{count} ê權限"
|
||||
privileges:
|
||||
administrator: 管理員
|
||||
administrator_description: 有tsit ê權限ê用者ē忽略所有ê權限。
|
||||
delete_user_data: Thâi掉用者ê資料
|
||||
delete_user_data_description: 允准用者liâm-mi thâi掉其他用者ê資料
|
||||
invite_users: 邀請用者
|
||||
invite_users_description: 允准用者邀請新lâng來tsit ê服侍器
|
||||
manage_announcements: 管理公告
|
||||
manage_announcements_description: 允准用者管理佇tsit ê服侍器ê公告
|
||||
manage_appeals: 管理投訴
|
||||
manage_appeals_description: 允准用者審查tuì管理動作ê投訴
|
||||
manage_blocks: 管理封鎖
|
||||
manage_blocks_description: 允准用者封鎖電子phue ê 提供者kap IP地址
|
||||
manage_custom_emojis: 管理自訂ê Emoji
|
||||
manage_custom_emojis_description: 允准用者管理佇tsit ê服侍器ê自訂Emoji
|
||||
manage_federation: 管理聯邦
|
||||
manage_federation_description: 允准用者封鎖á是允准kap其他域名相連,mā控制寄送ê能力
|
||||
manage_invites: 管理邀請
|
||||
manage_invites_description: 允准用者瀏覽kap停止使用邀請連結
|
||||
manage_reports: 管理檢舉
|
||||
manage_reports_description: 允准用者審查檢舉kap執行對in ê管理ê動作。
|
||||
statuses:
|
||||
language: 語言
|
||||
trends:
|
||||
|
|
|
@ -1996,7 +1996,7 @@ ru:
|
|||
ignore_favs: Не учитывать добавление в избранное
|
||||
ignore_reblogs: Не учитывать продвижения
|
||||
interaction_exceptions: Исключения на основе взаимодействий
|
||||
interaction_exceptions_explanation: 'Обратите внимание: нет никаких гарантий, что посты будут удалены, после того, как они единожды перешли порог по отметкам «избранного» или продвижений.'
|
||||
interaction_exceptions_explanation: 'Обратите внимание: даже если количество взаимодействий опустится ниже установленного значения после того, как оно однажды превысило его, то всё равно может случиться так, что пост не будет удалён.'
|
||||
keep_direct: Не удалять личные сообщения
|
||||
keep_direct_hint: Те ваши посты, которые видны только упомянутым в них людям, не будут удалены
|
||||
keep_media: Не удалять посты с вложениями
|
||||
|
@ -2040,31 +2040,31 @@ ru:
|
|||
contrast: Mastodon (высококонтрастная)
|
||||
default: Mastodon (тёмная)
|
||||
mastodon-light: Mastodon (светлая)
|
||||
system: Автоматически (используйте системную тему)
|
||||
system: Автоматически (как в системе)
|
||||
time:
|
||||
formats:
|
||||
default: "%d %b %Y, %H:%M"
|
||||
month: "%m.%Y"
|
||||
time: "%H:%M"
|
||||
with_time_zone: "%b %d, %Y, %H:%M %Z"
|
||||
with_time_zone: "%d %b %Y, %H:%M %Z"
|
||||
translation:
|
||||
errors:
|
||||
quota_exceeded: Превышена квота использования службы перевода в масштабах всего сервера.
|
||||
too_many_requests: В последнее время в службу переводов поступает слишком много запросов.
|
||||
two_factor_authentication:
|
||||
add: Добавить
|
||||
disable: Отключить
|
||||
disabled_success: Двухфакторная аутентификация успешно отключена
|
||||
disable: Отключить 2FA
|
||||
disabled_success: Двухфакторная аутентификация отключена
|
||||
edit: Изменить
|
||||
enabled: Двухфакторная аутентификация настроена
|
||||
enabled_success: Двухфакторная авторизация успешно настроена
|
||||
generate_recovery_codes: Сгенерировать коды восстановления
|
||||
lost_recovery_codes: Коды восстановления позволяются войти в учётную запись в случае утери смартфона. Если вы потеряли свои коды восстановления, вы можете создать новые здесь. Прошлые коды работать перестанут.
|
||||
methods: Методы двухфакторной аутентификации
|
||||
otp: Приложение для проверки подлинности
|
||||
recovery_codes: Коды восстановления
|
||||
recovery_codes_regenerated: Коды восстановления успешно сгенерированы
|
||||
recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен только один раз</strong>.'
|
||||
enabled: Двухфакторная аутентификация включена
|
||||
enabled_success: Двухфакторная аутентификация настроена
|
||||
generate_recovery_codes: Сгенерировать резервные коды
|
||||
lost_recovery_codes: Резервные коды позволят вам восстановить доступ к своей учётной записи в случае потери смартфона. Если вы потеряли свои резервные коды, просто создайте новые. Ваши старые коды будут аннулированы.
|
||||
methods: Способы подтверждения входа
|
||||
otp: Приложение-аутентификатор
|
||||
recovery_codes: Резервные коды
|
||||
recovery_codes_regenerated: Новые резервные коды сгенерированы
|
||||
recovery_instructions_html: Если случится так, что у вас не будет доступа к смартфону, резервные коды позволят вам восстановить доступ к своей учётной записи. <strong>Храните резервные коды в надёжном месте.</strong> К примеру, вы можете распечатать их и убрать туда, где лежат другие важные документы.
|
||||
webauthn: Электронные ключи
|
||||
user_mailer:
|
||||
announcement_published:
|
||||
|
@ -2083,16 +2083,16 @@ ru:
|
|||
subtitle: Ваша апелляция отклонена.
|
||||
title: Обжалование отклонено
|
||||
backup_ready:
|
||||
explanation: Вы запросили полное резервное копирование вашей учетной записи Mastodon.
|
||||
extra: Теперь он готов к загрузке!
|
||||
explanation: Вы запросили экспорт данных своей учётной записи Mastodon.
|
||||
extra: Теперь ваш архив готов и доступен для скачивания!
|
||||
subject: Ваш архив готов к загрузке
|
||||
title: Архив ваших данных готов
|
||||
title: Экспорт данных
|
||||
failed_2fa:
|
||||
details: 'Вот подробности попытки регистрации:'
|
||||
explanation: Кто-то пытался войти в вашу учетную запись, но указал неверный второй фактор аутентификации.
|
||||
further_actions_html: Если это не вы, мы рекомендуем %{action} немедленно принять меры, так как он может быть скомпрометирован.
|
||||
subject: Сбой двухфакторной аутентификации
|
||||
title: Сбой двухфакторной аутентификации
|
||||
details: 'Вот подробности попытки входа:'
|
||||
explanation: Кто-то пытался войти в вашу учётную запись, но не смог подтвердить вход при помощи второго фактора.
|
||||
further_actions_html: Если это были не вы, рекомендуем немедленно %{action}, так как он мог быть скомпрометирован.
|
||||
subject: Неудачная попытка подтверждения входа
|
||||
title: Неудачная попытка подтверждения входа
|
||||
suspicious_sign_in:
|
||||
change_password: сменить пароль
|
||||
details: 'Подробности о новом входе:'
|
||||
|
@ -2146,58 +2146,45 @@ ru:
|
|||
apps_step: Загрузите наши официальные приложения.
|
||||
apps_title: Приложения Mastodon
|
||||
checklist_subtitle: 'Давайте начнем знакомство с этим новым социальным рубежом:'
|
||||
checklist_title: Приветственный контрольный список
|
||||
edit_profile_action: Персонализация
|
||||
edit_profile_step: Усильте взаимодействие, заполнив полный профиль.
|
||||
edit_profile_title: Персонализируйте свой профиль
|
||||
explanation: Вот несколько советов для новичков
|
||||
feature_action: Подробнее
|
||||
feature_audience: Mastodon предоставляет вам уникальную возможность управлять своей аудиторией без посредников. Mastodon, развернутый на вашей собственной инфраструктуре, позволяет вам следить и быть преследуемым с любого другого сервера Mastodon в Интернете и не контролируется никем, кроме вас.
|
||||
feature_audience_title: Создайте уверенную аудиторию
|
||||
feature_control: Вы сами знаете, что хотите видеть в своей ленте. Никаких алгоритмов или рекламы, чтобы тратить ваше время. Следите за любым человеком на любом сервере Mastodon с одного аккаунта и получайте его сообщения в хронологическом порядке, а также сделайте свой уголок интернета немного больше похожим на себя.
|
||||
feature_control_title: Контролируйте свой график
|
||||
feature_creativity: Mastodon поддерживает аудио-, видео- и фотопосты, описания доступности, опросы, предупреждения о содержании, анимированные аватары, пользовательские emojis, управление обрезкой миниатюр и многое другое, чтобы помочь вам выразить себя в Интернете. Публикуете ли вы свои работы, музыку или подкаст, Mastodon всегда готов помочь вам.
|
||||
feature_creativity_title: Непревзойденная креативность
|
||||
feature_moderation: Mastodon возвращает принятие решений в ваши руки. Каждый сервер создает свои собственные правила и нормы, которые соблюдаются локально, а не сверху вниз, как в корпоративных социальных сетях, что позволяет наиболее гибко реагировать на потребности различных групп людей. Присоединяйтесь к серверу с правилами, с которыми вы согласны, или создайте свой собственный.
|
||||
feature_moderation_title: Модерирование, каким оно должно быть
|
||||
follow_action: Следуйте за
|
||||
follow_step: Следить за интересными людьми - вот что такое Mastodon.
|
||||
follow_title: Персонализируйте свою домашнюю ленту
|
||||
follows_subtitle: Следите за известными аккаунтами
|
||||
follows_title: За кем следить
|
||||
follows_view_more: Посмотреть больше людей, за которыми стоит следить
|
||||
hashtags_recent_count:
|
||||
few: "%{people} человека за последние 2 дня"
|
||||
many: "%{people} человек за последние 2 дня"
|
||||
one: "%{people} человек за последние 2 дня"
|
||||
other: "%{people} человек за последние 2 дня"
|
||||
hashtags_subtitle: Изучите, что было в тренде за последние 2 дня
|
||||
hashtags_title: Модные хэштеги
|
||||
hashtags_view_more: Посмотреть другие трендовые хэштеги
|
||||
post_action: Составить
|
||||
post_step: Поприветствуйте мир с помощью текста, фотографий, видео или опросов.
|
||||
post_title: Сделайте свой первый пост
|
||||
share_step: Пусть ваши друзья знают, как найти вас на Mastodon.
|
||||
share_title: Поделитесь информацией о компании Mastodon
|
||||
sign_in_action: Зарегистрироваться
|
||||
subject: Добро пожаловать в Mastodon
|
||||
title: Добро пожаловать на борт, %{name}!
|
||||
users:
|
||||
follow_limit_reached: Вы не можете подписаться больше, чем на %{limit} человек
|
||||
follow_limit_reached: Вы можете подписаться не больше чем на %{limit} человек
|
||||
go_to_sso_account_settings: Перейти к настройкам сторонних аккаунтов учетной записи
|
||||
invalid_otp_token: Введен неверный код двухфакторной аутентификации
|
||||
otp_lost_help_html: Если Вы потеряли доступ к обоим, свяжитесь с %{email}
|
||||
rate_limited: Слишком много попыток аутентификации, повторите попытку позже.
|
||||
invalid_otp_token: Введён неверный код двухфакторной аутентификации
|
||||
otp_lost_help_html: Если вы утратили доступ и к приложению-аутентификатору, и к резервным кодам, свяжитесь с %{email}
|
||||
rate_limited: Слишком много попыток аутентификации, попробуйте позже.
|
||||
seamless_external_login: Вы вошли в систему через внешнюю службу, поэтому настройки пароля и электронной почты недоступны.
|
||||
signed_in_as: 'Выполнен вход под именем:'
|
||||
signed_in_as: Выполнен вход в учётную запись
|
||||
verification:
|
||||
extra_instructions_html: <strong>Подсказка:</strong> Ссылка на вашем сайте может быть невидимой. Важной частью является <code>rel="me"</code>, который предотвращает выдачу себя за другое лицо на сайтах с пользовательским контентом. Вы даже можете использовать тег <code>link</code> в заголовке страницы вместо <code>a</code>, но HTML должен быть доступен без выполнения JavaScript.
|
||||
here_is_how: Вот как
|
||||
hint_html: "<strong>Подтверждение личности на Mastodon доступно каждому.</strong> Основано на открытых веб-стандартах, отныне и навсегда бесплатно. Всё, что вам нужно, - это персональный сайт, по которому вас узнают. Когда вы ссылаетесь на этот сайт из своего профиля, мы проверим, что сайт ссылается на ваш профиль, и отобразим на нём визуальный индикатор."
|
||||
instructions_html: Скопируйте и вставьте код ниже в HTML вашего сайта. Затем, добавьте адрес вашего веб сайта в одно из дополнительных полей на вкладке "Редактировать профиль" и сохраните изменения.
|
||||
verification: Верификация ссылок
|
||||
verified_links: Ваши ссылки подтверждения
|
||||
website_verification: Проверка веб-сайта
|
||||
extra_instructions_html: <strong>Подсказка:</strong> Ссылка на вашем сайте может быть невидимой. Ключевое значение имеет атрибут <code>rel="me"</code>, который не даёт выдать себя за другое лицо на сайтах, где контент создают сами пользователи. Вместо тега <code>a</code> можно использовать тег <code>link</code> в <code>head</code>-секции страницы, но необходимо, чтобы HTML-код был доступен без выполнения JavaScript.
|
||||
here_is_how: Как это делается?
|
||||
hint_html: "<strong>Подтверждение личности в Mastodon доступно каждому.</strong> Оно предоставляется на основе открытых веб-стандартов, бесплатно навсегда. Всё, что вам нужно, — это личный веб-сайт, по которому другие люди смогут вас узнать. После того как вы разместите ссылку на этот сайт в своём профиле, мы убедимся, что сайт в свою очередь ссылается на ваш профиль, и затем напротив ссылки появится визуальный индикатор."
|
||||
instructions_html: Скопируйте и вставьте следующий код в HTML-разметку вашего сайта. Затем добавьте адрес вашего веб-сайта в одно из дополнительных полей на вкладке «Данные профиля» и сохраните изменения.
|
||||
verification: Верификация
|
||||
verified_links: Верифицированные ссылки
|
||||
website_verification: Верификация по веб-сайту
|
||||
webauthn_credentials:
|
||||
add: Добавить новый электронный ключ
|
||||
create:
|
||||
|
|
|
@ -56,10 +56,12 @@ bg:
|
|||
scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални.
|
||||
setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания)
|
||||
setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon
|
||||
setting_default_quote_policy: Тази настройка ще се отрази само за публикациите, създадени със следващата версия на Mastodon, но може да изберете предпочитанията си в подготовката.
|
||||
setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване
|
||||
setting_display_media_default: Скриване на мултимедия отбелязана като деликатна
|
||||
setting_display_media_hide_all: Винаги скриване на мултимедията
|
||||
setting_display_media_show_all: Винаги показване на мултимедията
|
||||
setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри.
|
||||
setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome
|
||||
setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите
|
||||
setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала
|
||||
|
@ -147,6 +149,9 @@ bg:
|
|||
min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви.
|
||||
user:
|
||||
chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси
|
||||
date_of_birth:
|
||||
one: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
|
||||
other: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това.
|
||||
role: Ролята управлява какви позволения има потребителят.
|
||||
user_role:
|
||||
color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат
|
||||
|
@ -154,6 +159,10 @@ bg:
|
|||
name: Публично име на ролята, ако ролята е зададена да се показва като значка
|
||||
permissions_as_keys: Потребители с тази роля ще имат достъп до...
|
||||
position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет
|
||||
username_block:
|
||||
allow_with_approval: Вместо напълно да се предотвратява регистрирането, съвпадащите регистрирания ще изискват одобрението ви
|
||||
comparison: Имайте предвид проблема със Scunthorpe, блокирайки частично съвпаденията
|
||||
username: Ще се намира съвпадение независимо от главните и малките букви и често срещаните приличащи си знаци като "4" за "a" или "3" за "e"
|
||||
webhook:
|
||||
events: Изберете събития за изпращане
|
||||
template: Съставете свой полезен товар на JSON посредством променлива интерполация. Оставете празно за подразбиращ се JSON.
|
||||
|
@ -236,6 +245,7 @@ bg:
|
|||
setting_display_media_default: Стандартно
|
||||
setting_display_media_hide_all: Скриване на всичко
|
||||
setting_display_media_show_all: Показване на всичко
|
||||
setting_emoji_style: Стил на емоджито
|
||||
setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание
|
||||
setting_hide_network: Скриване на социалния ви свързан граф
|
||||
setting_missing_alt_text_modal: Показване на диалогов прозорец потвърждение преди публикуване на мултимедия без алт. текст
|
||||
|
@ -318,6 +328,7 @@ bg:
|
|||
follow_request: Някой пожела да ви последва
|
||||
mention: Някой ви спомена
|
||||
pending_account: Новите акаунти се нуждаят от преглед
|
||||
quote: Някой ви цитира
|
||||
reblog: Някой подсили ваша публикация
|
||||
report: Новият доклад е подаден
|
||||
software_updates:
|
||||
|
@ -364,6 +375,10 @@ bg:
|
|||
name: Име
|
||||
permissions_as_keys: Разрешения
|
||||
position: Приоритет
|
||||
username_block:
|
||||
allow_with_approval: Позволяване на регистрации с одобрение
|
||||
comparison: Начин на сравнение
|
||||
username: Думи, които трябва да пасват
|
||||
webhook:
|
||||
events: Включване на събития
|
||||
template: Шаблон за полезен товар
|
||||
|
|
|
@ -56,6 +56,7 @@ cy:
|
|||
scopes: Pa APIs y bydd y rhaglen yn cael mynediad iddynt. Os dewiswch gwmpas lefel uchaf, nid oes angen i chi ddewis rhai unigol.
|
||||
setting_aggregate_reblogs: Peidiwch â dangos hybiau newydd ar bostiadau sydd wedi cael eu hybu'n ddiweddar (dim ond yn effeithio ar hybiau newydd ei dderbyn)
|
||||
setting_always_send_emails: Fel arfer ni fydd hysbysiadau e-bost yn cael eu hanfon pan fyddwch chi wrthi'n defnyddio Mastodon
|
||||
setting_default_quote_policy: Dim ond ar gyfer fersiynau nesaf Mastodon bydd y gosodiadau hyn yn dod i rym, ond gallwch wneud eich dewis ymlaen llaw.
|
||||
setting_default_sensitive: Mae cyfryngau sensitif wedi'u cuddio yn rhagosodedig a gellir eu datgelu trwy glicio
|
||||
setting_display_media_default: Cuddio cyfryngau wedi eu marcio'n sensitif
|
||||
setting_display_media_hide_all: Cuddio cyfryngau bob tro
|
||||
|
@ -163,6 +164,10 @@ cy:
|
|||
name: Enw cyhoeddus y rôl, os yw'r rôl wedi'i gosod i'w dangos fel bathodyn
|
||||
permissions_as_keys: Bydd defnyddwyr sydd â'r rôl hon yn cael mynediad at...
|
||||
position: Mae rôl uwch yn penderfynu ar ddatrys gwrthdrawiadau mewn rhai sefyllfaoedd. Dim ond ar rolau â blaenoriaeth is y gellir cyflawni rhai gweithredoedd
|
||||
username_block:
|
||||
allow_with_approval: Yn lle atal cofrestru’n llwyr, bydd angen eich cymeradwyaeth rhag cofrestru cyfatebol
|
||||
comparison: Byddwch yn ymwybodol o Broblem Scunthorpe wrth rwystro cyfatebion rhannol.
|
||||
username: Bydd yn cael ei gyfatebu waeth beth fo'r nodau bach a mawr a homoglyffau cyffredin fel "4" ar gyfer "a" neu "3" ar gyfer "e"
|
||||
webhook:
|
||||
events: Dewiswch ddigwyddiadau i'w hanfon
|
||||
template: Cyfansoddwch eich llwyth tâl JSON eich hun gan ddefnyddio rhyngosod newidiol. Gadewch yn wag ar gyfer JSON rhagosodedig.
|
||||
|
@ -328,6 +333,7 @@ cy:
|
|||
follow_request: Mae rhywun yn ceisio eich dilyn chi
|
||||
mention: Mae rhywun yn sôn amdanoch chi
|
||||
pending_account: Mae cyfrif newydd angen adolygiad
|
||||
quote: Dyfynnodd rhywun chi
|
||||
reblog: Mae rhywun wedi hybu eich postiad
|
||||
report: Cyflwynwyd adroddiad newydd
|
||||
software_updates:
|
||||
|
@ -374,6 +380,10 @@ cy:
|
|||
name: Enw
|
||||
permissions_as_keys: Caniatâd
|
||||
position: Blaenoriaeth
|
||||
username_block:
|
||||
allow_with_approval: Caniatáu cofrestru gyda chymeradwyaeth
|
||||
comparison: Dull cymharu
|
||||
username: Gair i gyfatebu
|
||||
webhook:
|
||||
events: Digwyddiadau wedi'u galluogi
|
||||
template: Templed prif lwyth
|
||||
|
|
|
@ -160,6 +160,10 @@ fa:
|
|||
name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود
|
||||
permissions_as_keys: کاربرانی که این نقش را دارند به...
|
||||
position: نقش بالاتر در موقعیتهای خاص حل تعارض را تعیین میکند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد
|
||||
username_block:
|
||||
allow_with_approval: به جای جلوگیری از ثبتنام، ثبتنامهای مطابق نیازمند تأییدتان خواهند بود
|
||||
comparison: لطفاً هنگام مسدود کردن تطابقهای جزیی به مشکل اسکانثورپ توجّه داشته باشید
|
||||
username: تطبیق بدون توجه به بزرگی و کوچکی یا استفاده از نویسههای مشابه مثل 4 به جای a یا 3 به جای e
|
||||
webhook:
|
||||
events: گزینش رویدادها برای فرستادن
|
||||
template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید.
|
||||
|
@ -372,6 +376,10 @@ fa:
|
|||
name: نام
|
||||
permissions_as_keys: اجازهها
|
||||
position: اولویت
|
||||
username_block:
|
||||
allow_with_approval: اجازهٔ ثبتنام با تأیید
|
||||
comparison: روش مقایسه
|
||||
username: واژه برای تطبیق
|
||||
webhook:
|
||||
events: رویدادهای به کار افتاده
|
||||
template: قالب بار
|
||||
|
|
|
@ -56,10 +56,12 @@ ia:
|
|||
scopes: Le APIs al quales le application habera accesso. Si tu selige un ambito de nivello superior, non es necessari seliger ambitos individual.
|
||||
setting_aggregate_reblogs: Non monstrar nove impulsos pro messages que ha essite recentemente impulsate (affecta solmente le impulsos novemente recipite)
|
||||
setting_always_send_emails: Normalmente, le notificationes de e-mail non es inviate quando tu activemente usa Mastodon
|
||||
setting_default_quote_policy: Iste parametro solo habera effecto pro messages create con le proxime version de Mastodon, ma tu pote seliger tu preferentia anticipatemente.
|
||||
setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic
|
||||
setting_display_media_default: Celar le medios marcate como sensibile
|
||||
setting_display_media_hide_all: Sempre celar contento multimedial
|
||||
setting_display_media_show_all: Sempre monstrar contento multimedial
|
||||
setting_emoji_style: Como monstrar emojis. “Automatic” tentara usar emojis native, ma recurre al Twemojis pro navigatores ancian.
|
||||
setting_system_scrollbars_ui: Se applica solmente al navigatores de scriptorio basate sur Safari e Chrome
|
||||
setting_use_blurhash: Le imagines degradate se basa sur le colores del visuales celate, ma illos offusca tote le detalios
|
||||
setting_use_pending_items: Requirer un clic pro monstrar nove messages in vice de rolar automaticamente le fluxo
|
||||
|
@ -134,16 +136,23 @@ ia:
|
|||
name: Tu pote solmente cambiar le litteras inter majusculas e minusculas, per exemplo, pro render lo plus legibile
|
||||
terms_of_service:
|
||||
changelog: Pote esser structurate con le syntaxe Markdown.
|
||||
effective_date: Un periodo rationabile pote variar inter 10 e 30 dies post le data al qual tu notifica tu usatores.
|
||||
text: Pote esser structurate con le syntaxe Markdown.
|
||||
terms_of_service_generator:
|
||||
admin_email: Le avisos juridic include le contra-avisos, ordinantias judiciari, demandas de retiro e demandas de application del lege.
|
||||
arbitration_address: Pote esser le mesme que le adresse physic supra, o “N/A” si se usa e-mail.
|
||||
arbitration_website: Pote esser un formulario web, o “N/A” si se usa e-mail.
|
||||
choice_of_law: Citate, region, territorio o stato cuje leges substantive interne governa omne disputa juridic.
|
||||
dmca_address: Pro operatores in le SUA, usa le adresse registrate in le Directorio de Agentes Designate pro le DMCA (DMCA Designated Agent Directory). Un adresse de cassa postal es disponibile per requesta directe; usa le Requesta de Exemption de Cassa Postal pro Agentes Designate del DMCA (DMCA Designated Agent Post Office Box Waiver Request) pro inviar un message electronic al Officio del Derecto de Autor (Copyright Office) e describer que tu es un moderator de contento que travalia de casa e qui time vengiantias o represalias pro tu actiones, necessitante le uso un cassa postal pro remover tu adresse personal del vista public.
|
||||
dmca_email: Pote esser le mesme adresse de e-mail usate pro “Adresse de e-mail pro avisos juridic” supra.
|
||||
domain: Identification unic del servicio in linea que tu forni.
|
||||
jurisdiction: Indica le pais ubi vive le persona qui paga le facturas. Si se tracta de un interprisa o altere organisation, indica le pais ubi illo es incorporate, e le citate, region, territorio o stato del maniera appropriate pro le pais.
|
||||
min_age: Non deberea esser infra le etate minime requirite per le leges de tu jurisdiction.
|
||||
user:
|
||||
chosen_languages: Si marcate, solmente le messages in le linguas seligite apparera in chronologias public
|
||||
date_of_birth:
|
||||
one: Nos debe assecurar que tu ha al minus %{count} anno pro usar %{domain}. Nos non va immagazinar isto.
|
||||
other: Nos debe assecurar que tu ha al minus %{count} annos pro usar %{domain}. Nos non va immagazinar isto.
|
||||
role: Le rolo controla qual permissos le usator ha.
|
||||
user_role:
|
||||
color: Color a esser usate pro le rolo in omne parte del UI, como RGB in formato hexadecimal
|
||||
|
@ -151,6 +160,10 @@ ia:
|
|||
name: Nomine public del rolo, si rolo es definite a esser monstrate como insignia
|
||||
permissions_as_keys: Usatores con iste rolo habera accesso a...
|
||||
position: Rolo superior decide resolution de conflicto in certe situationes. Certe actiones pote solo esser exequite sur rolos con un prioritate inferior
|
||||
username_block:
|
||||
allow_with_approval: In loco de impedir totalmente le inscription, le inscriptiones correspondente requirera tu approbation
|
||||
comparison: Tene in conto le “problema Scunthorpe” si tu bloca correspondentias partial
|
||||
username: Correspondera independentemente de majusculas e minusculas e de homoglyphos commun como "4" pro "a" or "3" pro "e"
|
||||
webhook:
|
||||
events: Selige le eventos a inviar
|
||||
template: Compone tu proprie carga utile JSON per interpolation de variabile. Lassar blanc pro JSON predefinite.
|
||||
|
@ -233,6 +246,7 @@ ia:
|
|||
setting_display_media_default: Predefinite
|
||||
setting_display_media_hide_all: Celar toto
|
||||
setting_display_media_show_all: Monstrar toto
|
||||
setting_emoji_style: Stilo de emojis
|
||||
setting_expand_spoilers: Sempre expander messages marcate con avisos de contento
|
||||
setting_hide_network: Cela tu rete social
|
||||
setting_missing_alt_text_modal: Monstrar un dialogo de confirmation ante de publicar multimedia sin texto alternative
|
||||
|
@ -271,6 +285,7 @@ ia:
|
|||
favicon: Favicon
|
||||
mascot: Personalisar le mascotte (hereditage)
|
||||
media_cache_retention_period: Periodo de retention del cache multimedial
|
||||
min_age: Etate minime requirite
|
||||
peers_api_enabled: Publicar le lista de servitores discoperite in le API
|
||||
profile_directory: Activar directorio de profilos
|
||||
registrations_mode: Qui pote inscriber se
|
||||
|
@ -314,6 +329,7 @@ ia:
|
|||
follow_request: Alcuno ha demandate de sequer te
|
||||
mention: Alcuno te ha mentionate
|
||||
pending_account: Nove conto besonia de revision
|
||||
quote: Alcuno te ha citate
|
||||
reblog: Alcuno ha impulsate tu message
|
||||
report: Un nove reporto es inviate
|
||||
software_updates:
|
||||
|
@ -360,6 +376,10 @@ ia:
|
|||
name: Nomine
|
||||
permissions_as_keys: Permissiones
|
||||
position: Prioritate
|
||||
username_block:
|
||||
allow_with_approval: Permitter registrationes con approbation
|
||||
comparison: Methodo de comparation
|
||||
username: Parola a comparar
|
||||
webhook:
|
||||
events: Eventos activate
|
||||
template: Modello de carga utile
|
||||
|
|
|
@ -56,6 +56,7 @@ ru:
|
|||
scopes: Выберите, какие API приложение сможет использовать. Разрешения верхнего уровня имплицитно включают в себя все разрешения более низких уровней.
|
||||
setting_aggregate_reblogs: Не показывать новые продвижения постов, которые уже были недавно продвинуты (применяется только к будущим продвижениям)
|
||||
setting_always_send_emails: По умолчанию уведомления не доставляются по электронной почте, пока вы активно используете Mastodon
|
||||
setting_default_quote_policy: Эта настройка будет применена только к постам, созданным в следующей версии Mastodon, но вы можете заранее определить свои предпочтения.
|
||||
setting_default_sensitive: Медиа деликатного характера скрыты по умолчанию и могут быть показаны по нажатию на них
|
||||
setting_display_media_default: Скрывать медиа деликатного характера
|
||||
setting_display_media_hide_all: Скрывать все медиа
|
||||
|
@ -148,6 +149,11 @@ ru:
|
|||
min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции.
|
||||
user:
|
||||
chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку
|
||||
date_of_birth:
|
||||
few: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
|
||||
many: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
|
||||
one: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} года. Мы не храним введённые здесь данные.
|
||||
other: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные.
|
||||
role: Роль определяет, какими правами обладает пользователь.
|
||||
user_role:
|
||||
color: Цвет, который будет использоваться для роли в интерфейсе (UI), как RGB в формате HEX
|
||||
|
|
|
@ -369,10 +369,6 @@ namespace :api, format: false do
|
|||
namespace :web do
|
||||
resource :settings, only: [:update]
|
||||
resources :embeds, only: [:show]
|
||||
resources :push_subscriptions, only: [:create, :destroy] do
|
||||
member do
|
||||
put :update
|
||||
end
|
||||
end
|
||||
resources :push_subscriptions, only: [:create, :destroy, :update]
|
||||
end
|
||||
end
|
||||
|
|
13
db/migrate/20250819100545_update_quote_index.rb
Normal file
13
db/migrate/20250819100545_update_quote_index.rb
Normal 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
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[8.0].define(version: 2025_08_05_075010) do
|
||||
ActiveRecord::Schema[8.0].define(version: 2025_08_19_100545) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_catalog.plpgsql"
|
||||
|
||||
|
@ -926,11 +926,11 @@ ActiveRecord::Schema[8.0].define(version: 2025_08_05_075010) do
|
|||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.boolean "legacy", default: false, null: false
|
||||
t.index ["account_id", "quoted_account_id"], name: "index_quotes_on_account_id_and_quoted_account_id"
|
||||
t.index ["account_id", "quoted_account_id", "id"], name: "index_quotes_on_account_id_and_quoted_account_id_and_id"
|
||||
t.index ["activity_uri"], name: "index_quotes_on_activity_uri", unique: true, where: "(activity_uri IS NOT NULL)"
|
||||
t.index ["approval_uri"], name: "index_quotes_on_approval_uri", where: "(approval_uri IS NOT NULL)"
|
||||
t.index ["quoted_account_id"], name: "index_quotes_on_quoted_account_id"
|
||||
t.index ["quoted_status_id"], name: "index_quotes_on_quoted_status_id"
|
||||
t.index ["quoted_status_id", "id"], name: "index_quotes_on_quoted_status_id_and_id"
|
||||
t.index ["status_id"], name: "index_quotes_on_status_id", unique: true
|
||||
end
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ development environment configured with the software needed for this project.
|
|||
## Next steps
|
||||
|
||||
- Once you have successfully set up a development environment, it will be available on http://localhost:3000
|
||||
- Log in as the default admin user with the username `admin@mastodon.local` and the password `mastodonadmin`.
|
||||
- Log in as the default admin user with the username `admin@mastodon.local` or `admin@localhost` (depending on your setup) and the password `mastodonadmin`.
|
||||
- Check out the [Mastodon docs] for tips on working with emails in development (you'll need this when creating new user accounts) as well as a list of useful commands for testing and updating your dev instance.
|
||||
- You can optionally populate your database with sample data by running `bin/rails dev:populate_sample_data`. This will create a `@showcase_account` account with various types of contents.
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ RSpec.describe 'Interaction policies', feature: :outgoing_quotes do
|
|||
expect(DistributionWorker)
|
||||
.to have_enqueued_sidekiq_job(status.id, { 'update' => true })
|
||||
expect(ActivityPub::StatusUpdateDistributionWorker)
|
||||
.to have_enqueued_sidekiq_job(status.id)
|
||||
.to have_enqueued_sidekiq_job(status.id, { 'updated_at' => anything })
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ RSpec.describe 'API Web Push Subscriptions' do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'PUT /api/web/push_subscriptions' do
|
||||
describe 'PUT /api/web/push_subscriptions/:id' do
|
||||
before { sign_in Fabricate :user }
|
||||
|
||||
let(:subscription) { Fabricate :web_push_subscription }
|
||||
|
|
|
@ -86,6 +86,42 @@ RSpec.shared_examples 'User::Confirmation' do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when the user requires explicit approval because of signup IP address' do
|
||||
let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, sign_up_ip: '192.0.2.5') }
|
||||
|
||||
before do
|
||||
Setting.registrations_mode = 'open'
|
||||
Fabricate(:ip_block, ip: '192.0.2.5', severity: :sign_up_requires_approval)
|
||||
end
|
||||
|
||||
it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do
|
||||
expect { subject }
|
||||
.to change { user.reload.email }.to(new_email)
|
||||
.and change { user.reload.confirmed_at }.from(nil)
|
||||
.and not_change { user.reload.approved }.from(false)
|
||||
expect(TriggerWebhookWorker)
|
||||
.to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the user requires explicit approval because of username' do
|
||||
let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, account_attributes: { username: 'VeryStrangeUsername' }) }
|
||||
|
||||
before do
|
||||
Setting.registrations_mode = 'open'
|
||||
Fabricate(:username_block, username: 'StrangeUser', exact: false, allow_with_approval: true)
|
||||
end
|
||||
|
||||
it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do
|
||||
expect { subject }
|
||||
.to change { user.reload.email }.to(new_email)
|
||||
.and change { user.reload.confirmed_at }.from(nil)
|
||||
.and not_change { user.reload.approved }.from(false)
|
||||
expect(TriggerWebhookWorker)
|
||||
.to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when registrations mode is approved' do
|
||||
before { Setting.registrations_mode = 'approved' }
|
||||
|
||||
|
|
|
@ -130,14 +130,19 @@ RSpec.describe 'Settings applications page' do
|
|||
|
||||
describe 'Regenerating an app token' do
|
||||
it 'updates the app token' do
|
||||
visit settings_application_path(application)
|
||||
expect { visit settings_application_path(application) }
|
||||
.to change(user_application_token, :first).from(be_nil).to(be_present)
|
||||
|
||||
expect { regenerate_token }
|
||||
.to(change { user.token_for_app(application) })
|
||||
.to(change { user_application_token.first.token })
|
||||
expect(page)
|
||||
.to have_content(I18n.t('applications.token_regenerated'))
|
||||
end
|
||||
|
||||
def user_application_token
|
||||
Doorkeeper::AccessToken.where(application:).where(resource_owner_id: user)
|
||||
end
|
||||
|
||||
def regenerate_token
|
||||
click_on I18n.t('applications.regenerate_token')
|
||||
end
|
||||
|
|
|
@ -11,9 +11,9 @@ ARG BASE_REGISTRY="docker.io"
|
|||
# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||
# renovate: datasource=node-version depName=node
|
||||
ARG NODE_MAJOR_VERSION="22"
|
||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
||||
ARG DEBIAN_VERSION="bookworm"
|
||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
|
||||
ARG DEBIAN_VERSION="trixie"
|
||||
# Node image to use for base image based on combined variables (ex: 20-trixie-slim)
|
||||
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming
|
||||
|
||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||
|
|
118
yarn.lock
118
yarn.lock
|
@ -73,39 +73,39 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0":
|
||||
version: 7.28.0
|
||||
resolution: "@babel/core@npm:7.28.0"
|
||||
"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/core@npm:7.28.3"
|
||||
dependencies:
|
||||
"@ampproject/remapping": "npm:^2.2.0"
|
||||
"@babel/code-frame": "npm:^7.27.1"
|
||||
"@babel/generator": "npm:^7.28.0"
|
||||
"@babel/generator": "npm:^7.28.3"
|
||||
"@babel/helper-compilation-targets": "npm:^7.27.2"
|
||||
"@babel/helper-module-transforms": "npm:^7.27.3"
|
||||
"@babel/helpers": "npm:^7.27.6"
|
||||
"@babel/parser": "npm:^7.28.0"
|
||||
"@babel/helper-module-transforms": "npm:^7.28.3"
|
||||
"@babel/helpers": "npm:^7.28.3"
|
||||
"@babel/parser": "npm:^7.28.3"
|
||||
"@babel/template": "npm:^7.27.2"
|
||||
"@babel/traverse": "npm:^7.28.0"
|
||||
"@babel/types": "npm:^7.28.0"
|
||||
"@babel/traverse": "npm:^7.28.3"
|
||||
"@babel/types": "npm:^7.28.2"
|
||||
convert-source-map: "npm:^2.0.0"
|
||||
debug: "npm:^4.1.0"
|
||||
gensync: "npm:^1.0.0-beta.2"
|
||||
json5: "npm:^2.2.3"
|
||||
semver: "npm:^6.3.1"
|
||||
checksum: 10c0/423302e7c721e73b1c096217880272e02020dfb697a55ccca60ad01bba90037015f84d0c20c6ce297cf33a19bb704bc5c2b3d3095f5284dfa592bd1de0b9e8c3
|
||||
checksum: 10c0/e6b3eb830c4b93f5a442b305776df1cd2bb4fafa4612355366f67c764f3e54a69d45b84def77fb2d4fd83439102667b0a92c3ea2838f678733245b748c602a7b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/generator@npm:^7.28.0":
|
||||
version: 7.28.0
|
||||
resolution: "@babel/generator@npm:7.28.0"
|
||||
"@babel/generator@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/generator@npm:7.28.3"
|
||||
dependencies:
|
||||
"@babel/parser": "npm:^7.28.0"
|
||||
"@babel/types": "npm:^7.28.0"
|
||||
"@babel/parser": "npm:^7.28.3"
|
||||
"@babel/types": "npm:^7.28.2"
|
||||
"@jridgewell/gen-mapping": "npm:^0.3.12"
|
||||
"@jridgewell/trace-mapping": "npm:^0.3.28"
|
||||
jsesc: "npm:^3.0.2"
|
||||
checksum: 10c0/1b3d122268ea3df50fde707ad864d9a55c72621357d5cebb972db3dd76859c45810c56e16ad23123f18f80cc2692f5a015d2858361300f0f224a05dc43d36a92
|
||||
checksum: 10c0/0ff58bcf04f8803dcc29479b547b43b9b0b828ec1ee0668e92d79f9e90f388c28589056637c5ff2fd7bcf8d153c990d29c448d449d852bf9d1bc64753ca462bc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -203,16 +203,16 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3":
|
||||
version: 7.27.3
|
||||
resolution: "@babel/helper-module-transforms@npm:7.27.3"
|
||||
"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/helper-module-transforms@npm:7.28.3"
|
||||
dependencies:
|
||||
"@babel/helper-module-imports": "npm:^7.27.1"
|
||||
"@babel/helper-validator-identifier": "npm:^7.27.1"
|
||||
"@babel/traverse": "npm:^7.27.3"
|
||||
"@babel/traverse": "npm:^7.28.3"
|
||||
peerDependencies:
|
||||
"@babel/core": ^7.0.0
|
||||
checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01
|
||||
checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -300,24 +300,24 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/helpers@npm:^7.27.6":
|
||||
version: 7.27.6
|
||||
resolution: "@babel/helpers@npm:7.27.6"
|
||||
"@babel/helpers@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/helpers@npm:7.28.3"
|
||||
dependencies:
|
||||
"@babel/template": "npm:^7.27.2"
|
||||
"@babel/types": "npm:^7.27.6"
|
||||
checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3
|
||||
"@babel/types": "npm:^7.28.2"
|
||||
checksum: 10c0/03a8f94135415eec62d37be9c62c63908f2d5386c7b00e04545de4961996465775330e3eb57717ea7451e19b0e24615777ebfec408c2adb1df3b10b4df6bf1ce
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0":
|
||||
version: 7.28.0
|
||||
resolution: "@babel/parser@npm:7.28.0"
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/parser@npm:7.28.3"
|
||||
dependencies:
|
||||
"@babel/types": "npm:^7.28.0"
|
||||
"@babel/types": "npm:^7.28.2"
|
||||
bin:
|
||||
parser: ./bin/babel-parser.js
|
||||
checksum: 10c0/c2ef81d598990fa949d1d388429df327420357cb5200271d0d0a2784f1e6d54afc8301eb8bdf96d8f6c77781e402da93c7dc07980fcc136ac5b9d5f1fce701b5
|
||||
checksum: 10c0/1f41eb82623b0ca0f94521b57f4790c6c457cd922b8e2597985b36bdec24114a9ccf54640286a760ceb60f11fe9102d192bf60477aee77f5d45f1029b9b72729
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -1179,22 +1179,22 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.28.0":
|
||||
version: 7.28.0
|
||||
resolution: "@babel/traverse@npm:7.28.0"
|
||||
"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3":
|
||||
version: 7.28.3
|
||||
resolution: "@babel/traverse@npm:7.28.3"
|
||||
dependencies:
|
||||
"@babel/code-frame": "npm:^7.27.1"
|
||||
"@babel/generator": "npm:^7.28.0"
|
||||
"@babel/generator": "npm:^7.28.3"
|
||||
"@babel/helper-globals": "npm:^7.28.0"
|
||||
"@babel/parser": "npm:^7.28.0"
|
||||
"@babel/parser": "npm:^7.28.3"
|
||||
"@babel/template": "npm:^7.27.2"
|
||||
"@babel/types": "npm:^7.28.0"
|
||||
"@babel/types": "npm:^7.28.2"
|
||||
debug: "npm:^4.3.1"
|
||||
checksum: 10c0/32794402457827ac558173bcebdcc0e3a18fa339b7c41ca35621f9f645f044534d91bb923ff385f5f960f2e495f56ce18d6c7b0d064d2f0ccb55b285fa6bc7b9
|
||||
checksum: 10c0/26e95b29a46925b7b41255e03185b7e65b2c4987e14bbee7bbf95867fb19c69181f301bbe1c7b201d4fe0cce6aa0cbea0282dad74b3a0fef3d9058f6c76fdcb3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4":
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.4.4":
|
||||
version: 7.28.2
|
||||
resolution: "@babel/types@npm:7.28.2"
|
||||
dependencies:
|
||||
|
@ -3210,10 +3210,10 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@rolldown/pluginutils@npm:1.0.0-beta.30":
|
||||
version: 1.0.0-beta.30
|
||||
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.30"
|
||||
checksum: 10c0/aff8b532cb9d82d94c9a4101fa12ecb10620ad47d52dbb9135a5c65bde1ad19895b41026b821f4d607083699239a5d0010198401b6a6a54ab6a10d0015302768
|
||||
"@rolldown/pluginutils@npm:1.0.0-beta.32":
|
||||
version: 1.0.0-beta.32
|
||||
resolution: "@rolldown/pluginutils@npm:1.0.0-beta.32"
|
||||
checksum: 10c0/ba3582fc3c35c8eb57b0df2d22d0733b1be83d37edcc258203364773f094f58fc0cb7a056d604603573a69dd0105a466506cad467f59074e1e53d0dc26191f06
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -4712,18 +4712,18 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"@vitejs/plugin-react@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "@vitejs/plugin-react@npm:5.0.0"
|
||||
version: 5.0.1
|
||||
resolution: "@vitejs/plugin-react@npm:5.0.1"
|
||||
dependencies:
|
||||
"@babel/core": "npm:^7.28.0"
|
||||
"@babel/core": "npm:^7.28.3"
|
||||
"@babel/plugin-transform-react-jsx-self": "npm:^7.27.1"
|
||||
"@babel/plugin-transform-react-jsx-source": "npm:^7.27.1"
|
||||
"@rolldown/pluginutils": "npm:1.0.0-beta.30"
|
||||
"@rolldown/pluginutils": "npm:1.0.0-beta.32"
|
||||
"@types/babel__core": "npm:^7.20.5"
|
||||
react-refresh: "npm:^0.17.0"
|
||||
peerDependencies:
|
||||
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
|
||||
checksum: 10c0/e5813839d319ab5dc1b90cab40b6c08388f26e456166ba9df10ffc3c3f4ecc594cec06715b5c93390bba56140ca5f68a18f2233f7d275d77e5bbfeb979e4fd9b
|
||||
checksum: 10c0/2641171beedfc38edc5671abb47706906f9af2a79a6dfff4e946106c9550de4f83ccae41c164f3ee26a3edf07127ecc0e415fe5cddbf7abc71fbb2540016c27d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -7371,15 +7371,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fdir@npm:^6.4.4, fdir@npm:^6.4.6":
|
||||
version: 6.4.6
|
||||
resolution: "fdir@npm:6.4.6"
|
||||
"fdir@npm:^6.4.4, fdir@npm:^6.5.0":
|
||||
version: 6.5.0
|
||||
resolution: "fdir@npm:6.5.0"
|
||||
peerDependencies:
|
||||
picomatch: ^3 || ^4
|
||||
peerDependenciesMeta:
|
||||
picomatch:
|
||||
optional: true
|
||||
checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9
|
||||
checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -13818,8 +13818,8 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"vite-plugin-pwa@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "vite-plugin-pwa@npm:1.0.2"
|
||||
version: 1.0.3
|
||||
resolution: "vite-plugin-pwa@npm:1.0.3"
|
||||
dependencies:
|
||||
debug: "npm:^4.3.6"
|
||||
pretty-bytes: "npm:^6.1.1"
|
||||
|
@ -13834,7 +13834,7 @@ __metadata:
|
|||
peerDependenciesMeta:
|
||||
"@vite-pwa/assets-generator":
|
||||
optional: true
|
||||
checksum: 10c0/e4f2f4dfff843ee2585a0d89e74187168ba20da77cd0d127ce7ad7eebcf5a68b2bf09000afb6bb86d43a2034fea9f568cd6db2a2d4b47a72e175d999a5e07eb1
|
||||
checksum: 10c0/03fc24bd12ae4a4130979da4877e3dabddf13d7d6ff2bd68e5e8497a2643b8874a78e6c2502874277ddf2f28593d0a3b025d78af2335bdcc5d2966295784fd46
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -13883,11 +13883,11 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1":
|
||||
version: 7.1.2
|
||||
resolution: "vite@npm:7.1.2"
|
||||
version: 7.1.3
|
||||
resolution: "vite@npm:7.1.3"
|
||||
dependencies:
|
||||
esbuild: "npm:^0.25.0"
|
||||
fdir: "npm:^6.4.6"
|
||||
fdir: "npm:^6.5.0"
|
||||
fsevents: "npm:~2.3.3"
|
||||
picomatch: "npm:^4.0.3"
|
||||
postcss: "npm:^8.5.6"
|
||||
|
@ -13933,7 +13933,7 @@ __metadata:
|
|||
optional: true
|
||||
bin:
|
||||
vite: bin/vite.js
|
||||
checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced
|
||||
checksum: 10c0/a0aa418beab80673dc9a3e9d1fa49472955d6ef9d41a4c9c6bd402953f411346f612864dae267adfb2bb8ceeb894482369316ffae5816c84fd45990e352b727d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user