Merge commit 'b2aa476abbe82e2b49d84c9fb8ef654f95391fd3' into glitch-soc/merge-upstream

This commit is contained in:
Claire 2026-05-07 18:26:17 +02:00
commit 99f0a03dec
115 changed files with 1483 additions and 699 deletions

View File

@ -16,7 +16,7 @@ runs:
# The following is needed because we can not use `cache: true` for `setup-node`, as it does not support Corepack yet and mess up with the cache location if ran after Node is installed
- name: Enable corepack
shell: bash
run: corepack enable
run: npm i -g corepack
- name: Get yarn cache directory path
id: yarn-cache-dir-path

View File

@ -342,7 +342,7 @@ COPY --from=node /usr/local/lib /usr/local/lib
RUN \
# Configure Corepack
rm /usr/local/bin/yarn*; \
corepack enable; \
npm i -g corepack; \
corepack prepare --activate;
# hadolint ignore=DL3008

View File

@ -58,6 +58,7 @@ gem 'httplog', '~> 1.8.0', require: false
gem 'i18n'
gem 'idn-ruby', require: 'idn'
gem 'inline_svg'
gem 'ipaddr', '~> 1.2'
gem 'irb', '~> 1.8'
gem 'kaminari', '~> 1.2'
gem 'link_header', '~> 0.0'

View File

@ -343,6 +343,7 @@ GEM
activesupport (>= 3.0)
nokogiri (>= 1.6)
io-console (0.8.2)
ipaddr (1.2.9)
irb (1.18.0)
pp (>= 0.6.0)
prism (>= 1.3.0)
@ -992,6 +993,7 @@ DEPENDENCIES
i18n-tasks (~> 1.0)
idn-ruby
inline_svg
ipaddr (~> 1.2)
irb (~> 1.8)
jd-paperclip-azure (~> 3.0)
json

2
Vagrantfile vendored
View File

@ -115,7 +115,7 @@ gem install bundler foreman
bundle install
# Install node modules
sudo corepack enable
sudo npm i -g corepack
corepack prepare
yarn install

View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
class Redirect::CollectionsController < Redirect::BaseController
private
def set_resource
@resource = Collection.find(params[:id])
not_found if @resource.local? || @resource&.account&.suspended?
end
end

View File

@ -49,9 +49,9 @@ module ContextHelper
},
quote_authorizations: {
'gts' => 'https://gotosocial.org/ns#',
'quoteAuthorization' => { '@id' => 'https://w3id.org/fep/044f#quoteAuthorization', '@type' => '@id' },
'interactingObject' => { '@id' => 'gts:interactingObject' },
'interactionTarget' => { '@id' => 'gts:interactionTarget' },
'QuoteAuthorization' => 'https://w3id.org/fep/044f#QuoteAuthorization',
'interactingObject' => { '@id' => 'gts:interactingObject', '@type' => '@id' },
'interactionTarget' => { '@id' => 'gts:interactionTarget', '@type' => '@id' },
},
}.freeze

View File

@ -3,8 +3,6 @@ import type { FC } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import classNames from 'classnames';
import { followAccount } from '@/mastodon/actions/accounts';
import { useAccount } from '@/mastodon/hooks/useAccount';
import { getAccountHidden } from '@/mastodon/selectors/accounts';
@ -18,6 +16,7 @@ import { FollowButton } from '../follow_button';
import { IconButton } from '../icon_button';
import { AccountMenu } from './menu';
import classes from './styles.module.scss';
const messages = defineMessages({
enableNotifications: {
@ -49,7 +48,7 @@ export const AccountButtons: FC<AccountButtonsProps> = ({
const me = useAppSelector((state) => state.meta.get('me') as string);
return (
<div className={classNames('account__header__buttons', className)}>
<div className={className}>
{!hidden && (
<AccountButtonsOther accountId={accountId} noShare={noShare} />
)}
@ -94,7 +93,7 @@ const AccountButtonsOther: FC<
{!isMovedAndUnfollowedAccount && (
<FollowButton
accountId={accountId}
className='account__header__follow-button'
className={classes.followButton}
labelLength='long'
/>
)}

View File

@ -108,11 +108,9 @@ const FieldCard: FC<{
}> = ({ htmlHandlers, field }) => {
const intl = useIntl();
const {
name,
name_emojified,
nameHasEmojis,
value_emojified,
value_plain,
valueHasEmojis,
verified_at,
} = field;
@ -138,8 +136,7 @@ const FieldCard: FC<{
)}
label={
<FieldHTML
text={name}
textEmojified={name_emojified}
text={name_emojified}
textHasCustomEmoji={nameHasEmojis}
className='translate'
isOverflowing={isLabelOverflowing}
@ -149,8 +146,7 @@ const FieldCard: FC<{
}
value={
<FieldHTML
text={value_plain}
textEmojified={value_emojified}
text={value_emojified}
textHasCustomEmoji={valueHasEmojis}
isOverflowing={isValueOverflowing}
onOverflowClick={handleOverflowClick}
@ -175,7 +171,6 @@ const FieldCard: FC<{
type FieldHTMLProps = {
text: string;
textEmojified: string;
textHasCustomEmoji: boolean;
isOverflowing?: boolean;
onOverflowClick?: () => void;
@ -183,9 +178,7 @@ type FieldHTMLProps = {
const FieldHTML: FC<FieldHTMLProps> = ({
className,
extraEmojis,
text,
textEmojified,
textHasCustomEmoji,
isOverflowing,
onOverflowClick,
@ -198,7 +191,7 @@ const FieldHTML: FC<FieldHTMLProps> = ({
const html = (
<EmojiHTML
as='span'
htmlString={textEmojified}
htmlString={text}
className={className}
onElement={handleElement}
data-contents

View File

@ -1,7 +1,8 @@
import { useCallback } from 'react';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { openModal } from '@/mastodon/actions/modal';
import FollowRequestNoteContainer from '@/mastodon/features/account/containers/follow_request_note_container';
@ -96,22 +97,20 @@ export const AccountHeader: React.FC<{
const isMe = me && account.id === me;
return (
<div className='account-timeline__header'>
<div>
{!hidden && account.memorial && <MemorialNote />}
{!hidden && account.moved && (
<MovedNote accountId={account.id} targetAccountId={account.moved} />
)}
<AnimateEmojiProvider
className={classNames('account__header', {
inactive: !!account.moved,
})}
className={classNames(!!account.moved && classes.moved)}
>
{!suspendedOrHidden && !account.moved && relationship?.requested_by && (
<FollowRequestNoteContainer account={account} />
)}
<div className={classNames('account__header__image', classes.header)}>
<div className={classes.header}>
{!suspendedOrHidden && (
<img
src={autoPlayGif ? account.header : account.header_static}
@ -121,21 +120,16 @@ export const AccountHeader: React.FC<{
)}
</div>
<div className={classNames('account__header__bar', classes.barWrapper)}>
<div
className={classNames(
'account__header__tabs',
classes.avatarWrapper,
)}
>
<div className={classes.barWrapper}>
<div className={classes.avatarWrapper}>
<a
className='avatar'
href={account.avatar}
rel='noopener'
target='_blank'
onClick={handleOpenAvatar}
>
<Avatar
className={classes.avatar}
account={suspendedOrHidden ? undefined : account}
alt={account.avatar_description}
size={80}
@ -143,12 +137,7 @@ export const AccountHeader: React.FC<{
</a>
</div>
<div
className={classNames(
'account__header__tabs__name',
classes.displayNameWrapper,
)}
>
<div className={classes.displayNameWrapper}>
<AccountName accountId={accountId} />
<AccountButtons
accountId={accountId}
@ -168,23 +157,16 @@ export const AccountHeader: React.FC<{
)}
{!suspendedOrHidden && (
<div className='account__header__extra'>
<div className='account__header__bio'>
{me && account.id !== me && (
<AccountNote accountId={accountId} />
)}
<div className={classes.bioButtonsWrapper}>
{me && account.id !== me && <AccountNote accountId={accountId} />}
<AccountBio
showDropdown
accountId={accountId}
className={classNames(
'account__header__content',
classes.bio,
)}
/>
<AccountBio
showDropdown
accountId={accountId}
className={classes.bio}
/>
<AccountHeaderFields accountId={accountId} />
</div>
<AccountHeaderFields accountId={accountId} />
{!me && account.email_subscriptions && (
<AccountSubscriptionForm accountId={accountId} />

View File

@ -1,26 +1,79 @@
.moved {
opacity: 0.5;
}
// Account header
.header {
height: 120px;
overflow: hidden;
background: var(--color-bg-secondary);
border-bottom: 1px solid var(--color-border-primary);
img {
object-fit: cover;
display: block;
width: 100%;
height: 100%;
margin: 0;
}
@container (width >= 500px) {
height: 160px;
}
:global(.inactive) & {
filter: grayscale(100%);
}
}
// Wraps everything except the header image.
.barWrapper {
border-bottom: none;
padding-inline: 16px;
}
// Avatar
.avatarWrapper {
margin-top: -64px;
padding-top: 0;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
overflow: hidden;
margin-inline-start: -2px; // aligns the pfp with content below
}
.avatar {
background: var(--color-bg-primary);
border: 1px solid var(--color-border-primary);
border-radius: var(--avatar-border-radius);
.moved & {
filter: grayscale(100%);
}
}
.displayNameWrapper {
display: flex;
align-items: start;
gap: 16px;
margin-top: 16px;
margin-bottom: 16px;
h1 {
font-size: 17px;
line-height: 22px;
color: var(--color-text-primary);
font-weight: 600;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
:global(.emojione) {
width: 22px;
height: 22px;
}
}
.nameWrapper {
@ -112,21 +165,6 @@
}
}
$button-breakpoint: 420px;
$button-fallback-breakpoint: $button-breakpoint + 55px;
.buttonsDesktop {
@container (width < #{$button-breakpoint}) {
display: none;
}
@supports (not (container-type: inline-size)) {
@media (max-width: #{$button-fallback-breakpoint}) {
display: none;
}
}
}
.handleCopy {
border: 1px solid var(--color-border-primary);
border-radius: 8px;
@ -147,6 +185,45 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
}
}
$button-breakpoint: 420px;
$button-fallback-breakpoint: $button-breakpoint + 55px;
.buttonsDesktop,
.buttonsMobile {
display: flex;
align-items: center;
gap: 8px;
:global(.button) {
flex-shrink: 1;
white-space: nowrap;
min-width: 80px;
}
:global(.icon-button) {
border: 1px solid var(--color-border-primary);
border-radius: 4px;
box-sizing: content-box;
padding: 5px;
&:global(.copied) {
border-color: var(--color-text-success);
}
}
}
.buttonsDesktop {
@container (width < #{$button-breakpoint}) {
display: none;
}
@supports (not (container-type: inline-size)) {
@media (max-width: #{$button-fallback-breakpoint}) {
display: none;
}
}
}
.buttonsMobile {
position: sticky;
bottom: var(--mobile-bottom-nav-height);
@ -188,6 +265,7 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
.bio {
font-size: 15px;
color: var(--color-text-primary);
}
.familiarFollowers {
@ -420,3 +498,13 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
background: var(--color-bg-primary);
}
}
// Buttons
.followButton {
flex-grow: 1;
}
.bioButtonsWrapper {
margin-top: 16px;
}

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import StackTrace from 'stacktrace-js';

View File

@ -154,17 +154,19 @@ export const HoverCardAccount = forwardRef<
{(isMutual || isFollower) && (
<>
&middot;
{isMutual ? (
<FormattedMessage
id='account.mutual'
defaultMessage='You follow each other'
/>
) : (
<FormattedMessage
id='account.follows_you'
defaultMessage='Follows you'
/>
)}
<span>
{isMutual ? (
<FormattedMessage
id='account.mutual'
defaultMessage='You follow each other'
/>
) : (
<FormattedMessage
id='account.follows_you'
defaultMessage='Follows you'
/>
)}
</span>
</>
)}
</div>

View File

@ -1,6 +1,6 @@
import { PureComponent } from 'react';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { Route } from 'react-router-dom';
import { Provider as ReduxProvider } from 'react-redux';

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';

View File

@ -2,9 +2,10 @@ import type { FC } from 'react';
import { FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import { Column } from '@/mastodon/components/column';
import { ColumnHeader } from '@/mastodon/components/column_header';
import { LoadingIndicator } from '@/mastodon/components/loading_indicator';

View File

@ -24,6 +24,7 @@ import Column from '@/mastodon/features/ui/components/column';
import { useAccount } from '@/mastodon/hooks/useAccount';
import { useAccountId } from '@/mastodon/hooks/useAccountId';
import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility';
import { me } from '@/mastodon/initial_state';
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
import AddIcon from '@/material-icons/400-24px/add.svg?react';
@ -173,12 +174,14 @@ const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({
defaultMessage='Collections'
/>
</h2>
<SubheadingLink to='/collections/new' icon={AddIcon}>
<FormattedMessage
id='account.featured.new_collection'
defaultMessage='New collection'
/>
</SubheadingLink>
{accountId === me && (
<SubheadingLink to='/collections/new' icon={AddIcon}>
<FormattedMessage
id='account.featured.new_collection'
defaultMessage='New collection'
/>
</SubheadingLink>
)}
</Subheading>
{hasCollections ? (
<ItemList>

View File

@ -2,7 +2,7 @@ import { useEffect, useRef, useCallback } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react';
import {

View File

@ -131,7 +131,7 @@ export const CollectionMenu: React.FC<{
{
text: intl.formatMessage(messages.copyLink),
action: () => {
void navigator.clipboard.writeText(getCollectionPath(id));
void navigator.clipboard.writeText(collection.url);
dispatch(showAlert({ message: messages.copyLinkConfirmation }));
},
},
@ -196,13 +196,14 @@ export const CollectionMenu: React.FC<{
id,
openShareModal,
isOwnCollection,
collection.url,
dispatch,
openDeleteConfirmation,
context,
currentAccountInCollection,
openReportModal,
openBlockModal,
openRevokeConfirmation,
openBlockModal,
]);
return (

View File

@ -42,7 +42,7 @@ export const CollectionShareModal: React.FC<{
const isNew = !!location.state?.newCollection;
const isOwnCollection = collection.account_id === me;
const collectionLink = `${window.location.origin}/collections/${collection.id}`;
const collectionLink = collection.url;
const handleShareOnDevice = useCallback(() => {
void navigator.share({

View File

@ -138,12 +138,16 @@ export const CollectionAccountsList: React.FC<{
const renderAccountItemButton = useCallback(
({ relationship, accountId }: RenderButtonOptions) => {
if (!me || !relationship) {
// Show follow button when logged out (it will trigger the remote interaction modal)
return <AccountListItemFollowButton accountId={accountId} />;
}
// When viewing your own collection, only show the Follow button
// for accounts you're not following anymore.
const withoutButton =
!relationship ||
(collectionOwnerId === me &&
(relationship.following || relationship.requested));
collectionOwnerId === me &&
(relationship.following || relationship.requested);
if (withoutButton) return null;

View File

@ -2,10 +2,11 @@ import { useCallback, useEffect } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { useHistory, useLocation, useParams } from 'react-router';
import { Link } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import HelpIcon from '@/material-icons/400-24px/help.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import ShareIcon from '@/material-icons/400-24px/share.svg?react';

View File

@ -2,7 +2,6 @@ import { useEffect } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import {
Switch,
Route,
@ -12,6 +11,8 @@ import {
useLocation,
} from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import { Callout } from '@/mastodon/components/callout';
import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId';
import { initialState } from '@/mastodon/initial_state';

View File

@ -1,8 +1,9 @@
import { defineMessages, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Route, Switch, useRouteMatch } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import { TabLink, TabList } from '@/mastodon/components/tab_list';
import { Column } from 'mastodon/components/column';
import { ColumnHeader } from 'mastodon/components/column_header';

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { connect } from 'react-redux';

View File

@ -2,11 +2,12 @@ import { useEffect, useCallback } from 'react';
import { useIntl, defineMessages } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import type { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { Helmet } from '@unhead/react/helmet';
import elephantUIPlane from '@/images/elephant_ui_plane.svg';
import EditIcon from '@/material-icons/400-24px/edit_square.svg?react';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';

View File

@ -3,7 +3,7 @@ import { useRef, useCallback, useEffect } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { useDispatch } from 'react-redux';

View File

@ -3,10 +3,10 @@ import { useCallback, useEffect, useRef } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { List as ImmutableList } from 'immutable';
import { Helmet } from '@unhead/react/helmet';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
import {
addColumn,

View File

@ -2,7 +2,7 @@ import { useEffect, useRef, useCallback, useState } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react';
import { apiGetDomainBlocks } from 'mastodon/api/domain_blocks';

View File

@ -2,9 +2,10 @@ import { useCallback, useRef } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { NavLink, Switch, Route } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import TrendingUpIcon from '@/material-icons/400-24px/trending_up.svg?react';
import { Column } from 'mastodon/components/column';
import type { ColumnRef } from 'mastodon/components/column';

View File

@ -2,7 +2,7 @@ import { useEffect, useRef, useCallback } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns';

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -3,7 +3,7 @@ import { useRef, useCallback, useEffect } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { NavLink } from 'react-router-dom';
import { useIdentity } from '@/mastodon/identity_context';

View File

@ -10,11 +10,11 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import CheckIcon from '@/material-icons/400-24px/check.svg?react';
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
import { AccountBio } from '@/mastodon/components/account_bio';
import { Avatar } from '@/mastodon/components/avatar';
import { DisplayName } from '@/mastodon/components/display_name';
import { IconButton } from '@/mastodon/components/icon_button';
import { injectIntl } from '@/mastodon/components/intl';
import { EmojiHTML } from '@/mastodon/components/emoji/html';
const messages = defineMessages({
authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },
@ -41,11 +41,7 @@ class AccountAuthorize extends ImmutablePureComponent {
<DisplayName account={account} />
</Link>
<EmojiHTML
className='account__header__content translate'
htmlString={account.get('note_emojified')}
extraEmojis={account.get('emojis')}
/>
<AccountBio accountId={account.id} />
</div>
<div className='account--panel'>

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -2,10 +2,10 @@ import { useEffect, useCallback, useRef } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { isFulfilled } from '@reduxjs/toolkit';
import { Helmet } from '@unhead/react/helmet';
import TagIcon from '@/material-icons/400-24px/tag.svg?react';
import {
fetchFollowedHashtags,

View File

@ -28,6 +28,7 @@ interface AccountListProps {
list?: AccountList | null;
loadMore: () => void;
prependAccountId?: string | null;
withoutFollowsYouBadge?: boolean;
scrollKey: string;
}
@ -40,6 +41,7 @@ export const AccountList: FC<AccountListProps> = ({
list,
loadMore,
prependAccountId,
withoutFollowsYouBadge,
scrollKey,
}) => {
const account = useAccount(accountId);
@ -57,6 +59,7 @@ export const AccountList: FC<AccountListProps> = ({
key={followerId}
accountId={followerId}
withBio={false}
badge={withoutFollowsYouBadge ? false : null}
/>
)) ?? [];
@ -66,11 +69,12 @@ export const AccountList: FC<AccountListProps> = ({
key={prependAccountId}
accountId={prependAccountId}
withBio={false}
badge={withoutFollowsYouBadge ? false : null}
/>,
);
}
return children;
}, [prependAccountId, list, forceEmptyState]);
}, [prependAccountId, list, forceEmptyState, withoutFollowsYouBadge]);
const { multiColumn } = useLayout();

View File

@ -9,6 +9,7 @@ import { expandFollowers, fetchFollowers } from '@/mastodon/actions/accounts';
import { useAccount } from '@/mastodon/hooks/useAccount';
import { useAccountId } from '@/mastodon/hooks/useAccountId';
import { useRelationship } from '@/mastodon/hooks/useRelationship';
import { me } from '@/mastodon/initial_state';
import { selectUserListWithoutMe } from '@/mastodon/selectors/user_lists';
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
@ -85,6 +86,7 @@ const Followers: FC = () => {
list={followerList}
loadMore={loadMore}
prependAccountId={followerId}
withoutFollowsYouBadge={accountId === me}
scrollKey='followers'
/>
);

View File

@ -1,6 +1,6 @@
import { useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { Column } from 'mastodon/components/column';

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { connect } from 'react-redux';

View File

@ -4,7 +4,7 @@ import { PureComponent } from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { connect } from 'react-redux';

View File

@ -483,11 +483,19 @@ const InteractionModal: React.FC<{
/>
</h3>
<p>
<FormattedMessage
id='interaction_modal.action'
defaultMessage="To interact with {name}'s post, you need to sign into your account on whatever Mastodon server you use."
values={{ name }}
/>
{intent === 'follow' ? (
<FormattedMessage
id='interaction_modal.action_follow'
defaultMessage='To follow {name}, you need to sign into your account on whatever Mastodon server you use.'
values={{ name }}
/>
) : (
<FormattedMessage
id='interaction_modal.action'
defaultMessage="To interact with {name}'s post, you need to sign into your account on whatever Mastodon server you use."
values={{ name }}
/>
)}
</p>
</div>

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -1,8 +1,9 @@
import { useRef, useEffect, useCallback } from 'react';
import { Helmet } from 'react-helmet';
import { useParams } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import TrendingUpIcon from '@/material-icons/400-24px/trending_up.svg?react';
import { expandLinkTimeline } from 'mastodon/actions/timelines';
import { Column } from 'mastodon/components/column';

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { Link, withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';

View File

@ -2,9 +2,10 @@ import { useEffect, useMemo, useCallback } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import AddIcon from '@/material-icons/400-24px/add.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';

View File

@ -2,9 +2,10 @@ import { useCallback, useState, useEffect } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { useParams, Link } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import SquigglyArrow from '@/svg-icons/squiggly_arrow.svg?react';
import { fetchRelationships } from 'mastodon/actions/accounts';

View File

@ -2,11 +2,12 @@ import { useCallback, useState, useEffect } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { useParams, useHistory, Link } from 'react-router-dom';
import { isFulfilled } from '@reduxjs/toolkit';
import { Helmet } from '@unhead/react/helmet';
import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import { fetchList } from 'mastodon/actions/lists';

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -3,7 +3,7 @@ import { useRef, useCallback, useEffect } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { useSelector, useDispatch } from 'react-redux';

View File

@ -3,7 +3,7 @@ import { useRef, useCallback, useEffect, useState } from 'react';
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { useSelector, useDispatch } from 'react-redux';

View File

@ -2,8 +2,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { isEqual } from 'lodash';
import { useDebouncedCallback } from 'use-debounce';

View File

@ -2,9 +2,9 @@ import { useEffect, useState, useCallback, useRef } from 'react';
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import { useDebouncedCallback } from 'use-debounce';
import PersonIcon from '@/material-icons/400-24px/person.svg?react';

View File

@ -3,9 +3,10 @@ import { useState, useMemo, useCallback, createRef } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { useHistory } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate.svg?react';
import EditIcon from '@/material-icons/400-24px/edit.svg?react';
import PersonIcon from '@/material-icons/400-24px/person.svg?react';

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -2,7 +2,7 @@ import { useState, useEffect } from 'react';
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { apiGetPrivacyPolicy } from 'mastodon/api/instance';
import type { ApiPrivacyPolicyJSON } from 'mastodon/api_types/instance';

View File

@ -3,7 +3,7 @@ import { PureComponent } from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { connect } from 'react-redux';

View File

@ -2,10 +2,10 @@ import { useCallback, useEffect } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import { List as ImmutableList } from 'immutable';
import { Helmet } from '@unhead/react/helmet';
import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react';
import { fetchQuotes } from 'mastodon/actions/interactions_typed';
import { ColumnHeader } from 'mastodon/components/column_header';

View File

@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';

View File

@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef } from 'react';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { defineMessages } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { withRouter } from 'react-router-dom';
import { difference } from 'lodash';

View File

@ -7,9 +7,10 @@ import {
defineMessages,
} from 'react-intl';
import { Helmet } from 'react-helmet';
import { Link, useParams } from 'react-router-dom';
import { Helmet } from '@unhead/react/helmet';
import { apiGetTermsOfService } from 'mastodon/api/instance';
import type { ApiTermsOfServiceJSON } from 'mastodon/api_types/instance';
import { Column } from 'mastodon/components/column';

View File

@ -4,7 +4,7 @@ import { PureComponent } from 'react';
import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import { Link } from 'react-router-dom';
import { Button } from 'mastodon/components/button';

View File

@ -1,7 +1,7 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { Helmet } from 'react-helmet';
import { Helmet } from '@unhead/react/helmet';
import Base from 'mastodon/components/modal_root';
import { AltTextModal } from 'mastodon/features/alt_text_modal';

View File

@ -25,7 +25,7 @@ class IntersectionObserverWrapper {
this.observerBacklog.forEach(([ id, node, callback ]) => {
this.observe(id, node, callback);
});
this.observerBacklog = null;
this.observerBacklog = [];
}
observe (id, node, callback) {

View File

@ -136,10 +136,10 @@
"account.share": "Κοινοποίηση του προφίλ @{name}",
"account.show_reblogs": "Εμφάνιση ενισχύσεων από @{name}",
"account.statuses_counter": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}",
"account.timeline.pinned": "Καρφιτσωμένα",
"account.timeline.pinned": "Καρφιτσωμένη",
"account.timeline.pinned.view_all": "Προβολή όλων των καρφιτσωμένων αναρτήσεων",
"account.unblock": "Άρση αποκλεισμού @{name}",
"account.unblock_domain": "Άρση αποκλεισμού του τομέα {domain}",
"account.unblock_domain": "Άρση αποκλεισμού τομέα {domain}",
"account.unblock_domain_short": "Άρση αποκλ.",
"account.unblock_short": "Άρση αποκλεισμού",
"account.unendorse": "Να μην αναδεικνύεται στο προφίλ",
@ -162,7 +162,7 @@
"account_edit.custom_fields.edit_label": "Επεξεργασία πεδίου",
"account_edit.custom_fields.placeholder": "Προσθέστε τις αντωνυμίες σας, εξωτερικούς συνδέσμους ή οτιδήποτε άλλο θέλετε να μοιραστείτε.",
"account_edit.custom_fields.reorder_button": "Αναδιάταξη πεδίων",
"account_edit.custom_fields.tip_content": "Μπορείς εύκολα να προσθέσεις αξιοπιστία στον Mastodon λογαριασμό σου επαληθεύοντας συνδέσμους σε οποιεσδήποτε ιστοσελίδες κατέχεις.",
"account_edit.custom_fields.tip_content": "Μπορείς εύκολα να προσθέσεις αξιοπιστία στον Mastodon λογαριασμό σου επαληθεύοντας συνδέσμους προς οποιεσδήποτε ιστοσελίδες κατέχεις.",
"account_edit.custom_fields.tip_title": "Συμβουλή: Προσθήκη επαληθευμένων συνδέσμων",
"account_edit.custom_fields.title": "Προσαρμοσμένα πεδία",
"account_edit.custom_fields.verified_hint": "Πώς προσθέτω έναν επαληθευμένο σύνδεσμο;",
@ -241,7 +241,7 @@
"account_edit.upload_modal.title_add.header": "Προσθήκη εικόνας εξωφύλλου",
"account_edit.upload_modal.title_replace.avatar": "Αντικατάσταση εικόνας προφίλ",
"account_edit.upload_modal.title_replace.header": "Αντικατάσταση εικόνας εξωφύλλου",
"account_edit.verified_modal.details": "Πρόσθεσε αξιοπιστία στο Mastodon προφίλ σας επαληθεύοντας συνδέσμους σε προσωπικές ιστοσελίδες. Ορίστε πως δουλεύει:",
"account_edit.verified_modal.details": "Πρόσθεσε αξιοπιστία στο Mastodon προφίλ σου επαληθεύοντας συνδέσμους προς προσωπικές ιστοσελίδες. Ορίστε πως δουλεύει:",
"account_edit.verified_modal.invisible_link.details": "Πρόσθεσε τον σύνδεσμο στην κεφαλίδα σου. Το σημαντικό μέρος είναι το rel=\"me\" που αποτρέπει την μίμηση σε ιστοσελίδες με περιεχόμενο παραγόμενο από χρήστες. Μπορείς ακόμα να χρησιμοποιήσεις μια ετικέτα link στην κεφαλίδα της σελίδας αντί για {tag}, αλλά η HTML πρέπει να είναι προσβάσιμη χωρίς την εκτέλεση JavaScript.",
"account_edit.verified_modal.invisible_link.summary": "Πώς κάνω αυτόν τον σύνδεσμο αόρατο;",
"account_edit.verified_modal.step1.header": "Αντίγραψε τον παρακάτω κώδικα HTML και επικόλλησε τον στην κεφαλίδα της ιστοσελίδας σου",
@ -250,7 +250,7 @@
"account_edit.verified_modal.title": "Πώς να προσθέσεις έναν επαληθευμένο σύνδεσμο",
"account_edit_tags.add_tag": "Προσθήκη #{tagName}",
"account_edit_tags.column_title": "Επεξεργασία Ετικετών",
"account_edit_tags.help_text": "Οι αναδεδειγμένες ετικέτες βοηθούν τους χρήστες να ανακαλύψουν και να αλληλεπιδράσουν με το προφίλ σας. Εμφανίζονται ως φίλτρα στην προβολή Δραστηριότητας της σελίδας προφίλ σας.",
"account_edit_tags.help_text": "Οι αναδεδειγμένες ετικέτες βοηθούν τους χρήστες να ανακαλύψουν και να αλληλεπιδράσουν με το προφίλ σας. Εμφανίζονται ως φίλτρα στην καρτέλα Δραστηριότητα της σελίδας προφίλ σας.",
"account_edit_tags.max_tags_reached": "Έχετε φτάσει τον μέγιστο αριθμό των προτεινόμενων ετικετών.",
"account_edit_tags.search_placeholder": "Εισάγετε μια ετικέτα…",
"account_edit_tags.suggestions": "Προτάσεις:",
@ -866,7 +866,7 @@
"lists.done": "Έγινε",
"lists.edit": "Επεξεργασία λίστας",
"lists.exclusive": "Απόκρυψη μελών από την Αρχική",
"lists.exclusive_hint": "Αν κάποιος είναι σε αυτή τη λίστα, απόκρυψέ τον από την Αρχική σου για να αποφύγεις να βλέπεις τις αναρτήσεις του δύο φορές.",
"lists.exclusive_hint": "Αν κάποιος είναι σε αυτή τη λίστα, απόκρυψέ τον από την Αρχική ροή σου για να αποφύγεις να βλέπεις τις αναρτήσεις του δύο φορές.",
"lists.find_users_to_add": "Εύρεση χρηστών για προσθήκη",
"lists.list_members_count": "{count, plural, one {# μέλος} other {# μέλη}}",
"lists.list_name": "Όνομα λίστας",

View File

@ -796,6 +796,7 @@
"info_button.label": "Help",
"info_button.what_is_alt_text": "<h1>What is alt text?</h1> <p>Alt text provides image descriptions for people with vision impairments, low-bandwidth connections, or those seeking extra context.</p> <p>You can improve accessibility and understanding for everyone by writing clear, concise, and objective alt text.</p> <ul> <li>Capture important elements</li> <li>Summarize text in images</li> <li>Use regular sentence structure</li> <li>Avoid redundant information</li> <li>Focus on trends and key findings in complex visuals (like diagrams or maps)</li> </ul>",
"interaction_modal.action": "To interact with {name}'s post, you need to sign into your account on whatever Mastodon server you use.",
"interaction_modal.action_follow": "To follow {name}, you need to sign into your account on whatever Mastodon server you use.",
"interaction_modal.go": "Go",
"interaction_modal.no_account_yet": "Don't have an account yet?",
"interaction_modal.on_another_server": "On a different server",

View File

@ -1043,9 +1043,9 @@
"notifications.policy.filter_not_followers_title": "Personnes qui ne vous suivent pas",
"notifications.policy.filter_not_following_hint": "Jusqu'à ce que vous les validiez manuellement",
"notifications.policy.filter_not_following_title": "Personnes que vous ne suivez pas",
"notifications.policy.filter_private_mentions_hint": "Filtrées sauf si c'est en réponse à l'une de vos mentions ou si vous suivez l'expéditeur·ice",
"notifications.policy.filter_private_mentions_hint": "Filtrées sauf si c'est en réponse à l'une de vos mentions ou si vous suivez la personne",
"notifications.policy.filter_private_mentions_title": "Mentions privées non sollicitées",
"notifications.policy.title": "Gestion des notifications des …",
"notifications.policy.title": "Gestion des notifications des…",
"notifications_permission_banner.enable": "Activer les notifications de bureau",
"notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon nest pas ouvert, activez les notifications de bureau. Vous pouvez contrôler précisément quels types dinteractions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois quelles sont activées.",
"notifications_permission_banner.title": "Ne rien rater",

View File

@ -1027,7 +1027,7 @@
"notifications.group": "{count} notifications",
"notifications.mark_as_read": "Marquer toutes les notifications comme lues",
"notifications.permission_denied": "Impossible dactiver les notifications de bureau car lautorisation a été refusée.",
"notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car lautorisation du navigateur a été refusée avant",
"notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car lautorisation du navigateur a été refusée auparavant",
"notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car lautorisation requise na pas été accordée.",
"notifications.policy.accept": "Accepter",
"notifications.policy.accept_hint": "Afficher dans les notifications",
@ -1043,9 +1043,9 @@
"notifications.policy.filter_not_followers_title": "Personnes qui ne vous suivent pas",
"notifications.policy.filter_not_following_hint": "Jusqu'à ce que vous les validiez manuellement",
"notifications.policy.filter_not_following_title": "Personnes que vous ne suivez pas",
"notifications.policy.filter_private_mentions_hint": "Filtrées sauf si c'est en réponse à l'une de vos mentions ou si vous suivez l'expéditeur·ice",
"notifications.policy.filter_private_mentions_hint": "Filtrées sauf si c'est en réponse à l'une de vos mentions ou si vous suivez la personne",
"notifications.policy.filter_private_mentions_title": "Mentions privées non sollicitées",
"notifications.policy.title": "Gestion des notifications des …",
"notifications.policy.title": "Gestion des notifications des…",
"notifications_permission_banner.enable": "Activer les notifications de bureau",
"notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon nest pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types dinteractions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois quelles sont activées.",
"notifications_permission_banner.title": "Toujours au courant",

View File

@ -328,11 +328,15 @@
"annual_report.summary.share_on_mastodon": "Comhroinn ar Mastodon",
"attachments_list.unprocessed": "(neamhphróiseáilte)",
"audio.hide": "Cuir fuaim i bhfolach",
"block_modal.no_collections": "Ní féidir le ceachtar agaibh a chéile a chur le bailiúcháin. Bainfear sibh go huathoibríoch ó bhailiúcháin atá agaibh cheana féin, más infheidhme.",
"block_modal.remote_users_caveat": "Iarrfaimid ar an bhfreastalaí {domain} meas a bheith agat ar do chinneadh. Mar sin féin, ní ráthaítear comhlíonadh toisc go bhféadfadh roinnt freastalaithe bloic a láimhseáil ar bhealach difriúil. Seans go mbeidh postálacha poiblí fós le feiceáil ag úsáideoirí nach bhfuil logáilte isteach.",
"block_modal.show_less": "Taispeáin níos lú",
"block_modal.show_more": "Taispeáin níos mó",
"block_modal.they_cant_mention": "Ní féidir libh a chéile a lua, a leanúint ná a chéile a lua.",
"block_modal.they_cant_see_posts": "Ní féidir leo dábhar a fheiceáil agus ní fheicfidh tú a gcuid ábhair.",
"block_modal.they_will_know": "Is féidir leo a fheiceáil go bhfuil bac orthu.",
"block_modal.title": "Úsáideoir a bhlocáil?",
"block_modal.you_wont_see_mentions": "Ní fheicfidh tú poist ó dhaoine eile a luann iad.",
"boost_modal.combo": "Is féidir leat {combo} a bhrú chun é seo a scipeáil an chéad uair eile",
"boost_modal.reblog": "An post a threisiú?",
"boost_modal.undo_reblog": "An deireadh a chur le postáil?",

View File

@ -224,6 +224,7 @@
"account_edit.profile_tab.show_media.title": "„Média” lap megjelenítése",
"account_edit.profile_tab.show_media_replies.description": "Ha engedélyezve van, akkor a Média lap megjeleníti a bejegyzéseidet és a mások bejegyzéseihez írt válaszaidat.",
"account_edit.profile_tab.show_media_replies.title": "Válaszok megjelenítése a „Média” lapon",
"account_edit.profile_tab.show_relations.description": "A profilodban megjeleníti azokat a fiókokat, melyeket követsz, valamint a többi felhasználó követőit. Mások továbbra is látni fogják, hogy követed-e őket.",
"account_edit.profile_tab.show_relations.title": "„Követők” és „Követettek” megjelenítése",
"account_edit.profile_tab.subtitle": "A profil megjelenítésének testreszabása.",
"account_edit.profile_tab.title": "Profil megjelenítési beállításai",
@ -327,6 +328,7 @@
"annual_report.summary.share_on_mastodon": "Megosztás a Mastodonon",
"attachments_list.unprocessed": "(feldolgozatlan)",
"audio.hide": "Hang elrejtése",
"block_modal.no_collections": "Egyikőtök sem adhatja hozzá a másikat gyűjteményekhez. Automatikusan el is lesztek távolítva az egymás gyűjteményéből.",
"block_modal.remote_users_caveat": "Arra kérjük a {domain} kiszolgálót, hogy tartsa tiszteletben a döntésedet. Ugyanakkor az együttműködés nem garantált, mivel néhány kiszolgáló másképp kezelheti a letiltásokat. A nyilvános bejegyzések a be nem jelentkezett felhasználók számára továbbra is látszódhatnak.",
"block_modal.show_less": "Kevesebb mutatása",
"block_modal.show_more": "Több mutatása",

View File

@ -36,6 +36,7 @@
"account.familiar_followers_many": "Yeṭṭafaṛ-it {name1} d {name2}, akked {othersCount, plural, one {yiwen nniḍen i tessneḍ} other {# nniḍen i tessneḍ}}",
"account.familiar_followers_one": "Yeṭṭafar-it {name1}",
"account.familiar_followers_two": "Yeṭṭafar-it {name1} akked {name2}",
"account.featured": "Ufrinen",
"account.featured.accounts": "Imeɣna",
"account.featured.collections": "Tilkensa",
"account.featured.new_collection": "Talkensit tamaynut",
@ -68,6 +69,8 @@
"account.join_modal.me_today": "Ass-a, d ass-ik⋅im amezwaru deg {server}!",
"account.join_modal.other": "{name} yerna-d ɣer {server} ass n",
"account.join_modal.other_today": "D ass amezwaru n {name} ɣef {server}!",
"account.join_modal.share.intro": "Bḍu izen anida deg-s ad temmeslayeḍ fell-ak⋅am",
"account.join_modal.years": "{number, plural, one {n useggas} other {n iseggasen}}",
"account.joined_short": "Izeddi da seg ass n",
"account.languages": "Beddel tutlayin yettwajerden",
"account.last_active": "Armud aneggaru",
@ -87,6 +90,7 @@
"account.menu.remove_follower": "Kkes aneḍfar",
"account.menu.report": "Cetki ɣef umiḍan-a",
"account.menu.share": "Zuzer…",
"account.menu.unblock": "Kkes asewḥel i umiḍan",
"account.moved_to": "{name} yenna-d dakken amiḍan-is amaynut yuɣal :",
"account.mute": "Sgugem @{name}",
"account.mute_notifications_short": "Susem ilɣa",
@ -141,6 +145,7 @@
"account_edit.display_name.edit_label": "Ẓreg isem ara d-yettwaskanen",
"account_edit.display_name.title": "Isem ara d-yettwaskanen",
"account_edit.featured_hashtags.edit_label": "Rnu ihacṭagen",
"account_edit.featured_hashtags.title": "Ihacṭagen ufrinen",
"account_edit.field_actions.delete": "Kkes urti",
"account_edit.field_actions.edit": "Ẓreg urti",
"account_edit.field_delete_modal.delete_button": "Kkes",
@ -167,6 +172,7 @@
"account_edit.name_modal.add_title": "Rnu isem ara d-yettwaskanen",
"account_edit.name_modal.edit_title": "Ẓreg isem ara d-yettwaskanen",
"account_edit.profile_tab.button_label": "Sagen",
"account_edit.profile_tab.show_featured.title": "Sken-d accer n \"Ufrinen\"",
"account_edit.save": "Sekles",
"account_edit.upload_modal.back": "Uɣal",
"account_edit.upload_modal.done": "Dayen",
@ -179,12 +185,16 @@
"account_edit.upload_modal.title_add.header": "Rnu tawlaft n tduli",
"account_edit.upload_modal.title_replace.avatar": "Semselsi tawlaft n umaɣnu",
"account_edit.upload_modal.title_replace.header": "Semselsi tawlaft n tduli",
"account_edit.verified_modal.invisible_link.summary": "Amek ara rreɣ aseɣwen-nni ur yettban ara?",
"account_edit.verified_modal.title": "Amek ara ternuḍ aseɣwen yettuselknen",
"account_edit_tags.add_tag": "Rnu #{tagName}",
"account_edit_tags.column_title": "Asiẓreg n yihacṭagen",
"account_edit_tags.search_placeholder": "Sekcem-d ahacṭag…",
"account_edit_tags.suggestions": "Isumren:",
"account_edit_tags.tag_status_count": "{count, plural, one {# n yizen} other {# n yiznan}}",
"account_list.total": "{total, plural, one {# n umiḍan} other {# n imiḍanen}}",
"account_note.placeholder": "Ulac iwenniten",
"admin.dashboard.retention.cohort": "Ajerred deg ayyur",
"admin.dashboard.retention.cohort_size": "Iseqdacen imaynuten",
"alert.rate_limited.message": "Ma ulac aɣilif ɛreḍ tikelt-nniḍen akka {retry_time, time, medium}.",
"alert.rate_limited.title": "Aktum s talast",
@ -223,6 +233,7 @@
"block_modal.title": "Sewḥel aseqdac ?",
"boost_modal.combo": "Tzemreḍ ad tsiteḍ ɣef {combo} akken ad tzegleḍ aya tikelt i d-iteddun",
"boost_modal.reblog": "Zuzer tasuffeɣt?",
"boost_modal.undo_reblog": "Semmet azuzer n yizen-a?",
"bundle_column_error.copy_stacktrace": "Nɣel tuccḍa n uneqqis",
"bundle_column_error.error.title": "Uh, ala !",
"bundle_column_error.network.body": "Teḍra-d tuccḍa deg usali n usebter-a. Aya yezmer ad yili d ugur akudan deg tuqqna-inek·inem ɣer internet neɣ deg uqeddac-a.",
@ -234,6 +245,7 @@
"bundle_modal_error.close": "Mdel",
"bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen",
"callout.dismiss": "Zgel-it",
"character_counter.required": "{currentLength}/{maxLength} n yisekkilen",
"closed_registrations_modal.description": "Asnulfu n umiḍan deg {domain} mačči d ayen izemren ad yili, maca ttxil-k·m, err deg lbal-ik·im belli ur teḥwaǧeḍ ara amiḍan s wudem ibanen ɣef {domain} akken ad tesqedceḍ Mastodon.",
"closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen",
"closed_registrations_modal.title": "Ajerred deg Masṭudun",
@ -243,6 +255,8 @@
"collection.share_modal.title": "Bḍu talkensit",
"collection.share_modal.title_new": "Zuzer talkensit-ik·im tamaynut!",
"collections.account_count": "{count, plural, one {# n umiḍan} other {# n imiḍanen}}",
"collections.accounts.empty_description": "Rnu alamma d {count} n imiḍanen",
"collections.accounts.empty_editor_title": "Ulac ula yiwen ɛad deg telkensit-a",
"collections.accounts.empty_title": "Talkensit-a d tilemt",
"collections.block_collection_owner": "Sewḥel amiḍan",
"collections.by_account": "sɣur {account_handle}",
@ -262,12 +276,14 @@
"collections.detail.revoke_inclusion": "Kkes-iyi",
"collections.detail.sensitive_content": "Agbur amḥulfu",
"collections.detail.share": "Zuzer talkensit-a",
"collections.detail.you_are_in_this_collection": "Aql-ik⋅em ɣer sdat deg telsenkit-a",
"collections.edit_details": "Ẓreg talqayt",
"collections.hidden_accounts_link": "{count, plural, one {# n umiḍan uffir} other {# n imiḍanen yettwaffaren}}",
"collections.hints.accounts_counter": "{count}/{max} n imiḍanen",
"collections.last_updated_at": "Taẓrigt taneggarut: {date}",
"collections.list.created_by_author": "D-yesnulfa {name}",
"collections.list.created_by_you": "D-tesnulfaḍ",
"collections.list.featuring_you": "Yid-k⋅m",
"collections.manage_accounts": "Sefrek imiḍanen",
"collections.name_length_hint": "talast n 40 n yisekkilen",
"collections.new_collection": "Talkensit tamaynut",
@ -276,6 +292,7 @@
"collections.revoke_collection_inclusion": "Kkes-iyi seg telkensit-a",
"collections.search_accounts_label": "Nadi ɣef umiḍan ara ternuḍ",
"collections.share_short": "Bḍu",
"collections.suggestions.can_not_add": "Ur tezmireḍ ara ad t-ternuḍt",
"collections.view_collection": "Wali talkensit",
"collections.visibility_public": "Azayaz",
"collections.visibility_title": "Abani",
@ -290,6 +307,7 @@
"column.edit_list": "Ẓreg tabdart",
"column.favourites": "Imenyafen",
"column.firehose": "Isuddam usriden",
"column.firehose_singular": "Asuddem usrid",
"column.follow_requests": "Isuturen n teḍfeṛt",
"column.home": "Agejdan",
"column.list_members": "Sefrek iεeggalen n tebdart",
@ -299,6 +317,7 @@
"column.other_collections": "Tilkensa sɣur {name}",
"column.pins": "Tisuffaɣ yettwasenṭḍen",
"column.public": "Tasuddemt tamatut",
"column.your_collections": "Tilkensa-k·m",
"column_back_button.label": "Tuɣalin",
"column_header.hide_settings": "Ffer iɣewwaṛen",
"column_header.moveLeft_settings": "Err ajgu ɣer tama tazelmaḍt",
@ -355,6 +374,7 @@
"confirmations.follow_to_list.confirm": "Ḍfeṛ-it sakin rnu-t ɣer tebdart",
"confirmations.follow_to_list.title": "Ḍfer aseqdac?",
"confirmations.hide_featured_tab.confirm": "Ffer accer",
"confirmations.hide_featured_tab.title": "Ffer accer n \"Ufrinen\"?",
"confirmations.logout.confirm": "Ffeɣ",
"confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?",
"confirmations.logout.title": "Tebɣiḍ ad teffɣeḍ ssya?",
@ -432,11 +452,13 @@
"emoji_button.symbols": "Izamulen",
"emoji_button.travel": "Imeḍqan d Yinigen",
"empty_column.account_featured_self.no_collections_button": "Snulfu-d talkensit",
"empty_column.account_featured_self.no_collections_hide_tab": "Ɣumm accer-a",
"empty_column.account_suspended": "Amiḍan yettwaḥbas",
"empty_column.account_timeline": "Ulac tisuffaɣ da !",
"empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi",
"empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
"empty_column.bookmarked_statuses": "Ulac kra n tsuffeɣt i terniḍ ɣer yismenyifen-ik·im ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
"empty_column.collections.featured_in": "Ur-k yerni ḥedd ɛad ɣer kra n telkensit.",
"empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
"empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.",
"empty_column.explore_statuses": "Ulac ayen yellan d anezzuɣ akka tura. Uɣal-d ticki!",
@ -458,6 +480,7 @@
"explore.trending_tags": "Ihacṭagen",
"featured_carousel.current": "<sr>Izen wis</sr> {current, number} / {max, number}",
"featured_carousel.header": "{count, plural, one {n tsuffeɣt tunṭiḍt} other {n tsuffaɣ tunṭiḍin}}",
"featured_carousel.slide": "Iznen {current, number} ɣef {max, number}",
"featured_tags.more_items": "+{count}",
"featured_tags.suggestions.add": "Rnu",
"featured_tags.suggestions.dismiss": "Uhu, tanemmirt",

View File

@ -43,6 +43,7 @@
"account.featured": "Utvald",
"account.featured.accounts": "Profilar",
"account.featured.collections": "Samlingar",
"account.featured.new_collection": "Ny samling",
"account.field_overflow": "Vis heile innhaldet",
"account.filters.all": "All aktivitet",
"account.filters.boosts_toggle": "Vis framhevingar",
@ -68,6 +69,16 @@
"account.go_to_profile": "Gå til profil",
"account.hide_reblogs": "Gøym framhevingar frå @{name}",
"account.in_memoriam": "Til minne om.",
"account.join_modal.day": "Dag",
"account.join_modal.me": "Du vart medlem av {server} den",
"account.join_modal.me_anniversary": "God allheimsbursdag! Du vart medlem av {server} den",
"account.join_modal.me_today": "Det er fyrste dagen din på {server}!",
"account.join_modal.other": "{name} vart medlem av {server} den",
"account.join_modal.other_today": "{name} har sin fyrste dag på {server}!",
"account.join_modal.share.celebrate": "Skriv eit jubileumsinnlegg",
"account.join_modal.share.intro": "Skriv eit introduksjonsinnlegg",
"account.join_modal.share.welcome": "Skriv eit velkomstinnlegg",
"account.join_modal.years": "{number, plural, one {år} other {år}}",
"account.joined_short": "Vart med",
"account.languages": "Endre språktingingar",
"account.last_active": "Sist aktiv",

View File

@ -324,11 +324,15 @@
"annual_report.summary.share_on_mastodon": "Ndajeni në Mastodon me të tjerë",
"attachments_list.unprocessed": "(e papërpunuar)",
"audio.hide": "Fshihe audion",
"block_modal.no_collections": "Asnjë prej jush smund shtojë tjetrin te koleksione. Do të hiqeni automatikisht nga koleksionne ekzistuese të njëri-tjetrit, nëse ka vend.",
"block_modal.remote_users_caveat": "Do ti kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi sështë i garantuar, ngaqë disa shërbyes mund ti trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.",
"block_modal.show_less": "Shfaq më pak",
"block_modal.show_more": "Shfaq më tepër",
"block_modal.they_cant_mention": "Smund të përmendni, ndiqni, ose citoni njëri-tjetrin.",
"block_modal.they_cant_see_posts": "Smund të shohin lëndën tuaj dhe ju sdo të shihni të tyren.",
"block_modal.they_will_know": "Mund të shohin se janë bllokuar.",
"block_modal.title": "Të bllokohet përdoruesi?",
"block_modal.you_wont_see_mentions": "Sdo të shihni postime nga të tjerë që i përmendin ata.",
"boost_modal.combo": "Që kjo të anashkalohet herës tjetër, mund të shtypni {combo}",
"boost_modal.reblog": "Përforcim postimi?",
"boost_modal.undo_reblog": "Të hiqet përforcim për postimin?",

View File

@ -1,3 +1,4 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { Globals } from '@react-spring/web';
@ -33,7 +34,11 @@ function main() {
await initializeEmoji();
const root = createRoot(mountNode);
root.render(<Mastodon {...props} />);
root.render(
<StrictMode>
<Mastodon {...props} />
</StrictMode>,
);
store.dispatch(setupBrowserNotifications());
if (isProduction() && me && 'serviceWorker' in navigator) {

View File

@ -231,75 +231,6 @@
border-color: var(--color-border-error-soft);
}
.account__header__fields {
max-width: 100vw;
padding: 0;
margin: 15px -15px -15px;
border: 0 none;
border-top: 1px solid var(--color-border-primary);
border-bottom: 1px solid var(--color-border-primary);
font-size: 14px;
line-height: 20px;
dl {
display: flex;
border-bottom: 1px solid var(--color-border-primary);
}
dt,
dd {
box-sizing: border-box;
padding: 14px;
text-align: center;
max-height: 48px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
dt {
font-weight: 500;
width: 120px;
flex: 0 0 auto;
color: var(--color-text-primary);
background: var(--color-bg-secondary);
}
dd {
flex: 1 1 auto;
color: var(--color-text-secondary);
}
a {
color: var(--color-text-brand);
text-decoration: none;
&:hover,
&:focus,
&:active {
text-decoration: underline;
}
}
.verified {
border: 1px solid var(--color-border-success-soft);
background: var(--color-bg-success-softest);
a {
color: var(--color-text-success);
font-weight: 500;
}
&__mark {
color: var(--color-text-success);
}
}
dl:last-child {
border-bottom: 0;
}
}
.directory__tag .trends__item__current {
width: auto;
}

View File

@ -1051,35 +1051,121 @@ a.name-tag,
max-width: 100%;
}
.account__header__fields,
.account__header__content {
&__fields,
&__content {
background: var(--color-bg-primary);
border: 1px solid var(--color-border-primary);
border-radius: 4px;
height: 100%;
}
.account__header__fields {
margin: 0;
&__fields {
border: 1px solid var(--color-border-primary);
font-size: 14px;
line-height: 20px;
display: grid;
grid-template-columns: 120px auto;
grid-auto-flow: row;
dl {
display: flex;
}
dt,
dd {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
padding: 14px;
text-align: center;
border-bottom: 1px solid var(--color-border-primary);
&:last-of-type:not(.verified) {
border-bottom: none;
}
}
dt {
font-weight: 500;
width: 120px;
flex: 0 0 auto;
color: var(--color-text-primary);
background: var(--color-bg-secondary);
}
dd {
flex: 1 1 auto;
color: var(--color-text-secondary);
&:first-of-type.verified {
border-top-right-radius: 4px;
}
&:last-of-type.verified {
border-bottom-right-radius: 4px;
}
}
a {
color: var(--color-text-brand);
text-decoration: none;
&:hover,
&:focus,
&:active {
text-decoration: underline;
}
}
dl:first-child .verified {
border-radius: 0 4px 0 0;
}
.verified {
border: 1px solid var(--color-border-success-soft);
background: var(--color-bg-success-softest);
.verified a {
color: var(--color-text-success);
a {
color: var(--color-text-success);
font-weight: 500;
}
&__mark {
color: var(--color-text-success);
> svg {
vertical-align: middle;
}
}
}
}
.account__header__content {
&__content {
box-sizing: border-box;
padding: 20px;
color: var(--color-text-primary);
font-size: 14px;
font-weight: 400;
overflow: hidden;
word-break: normal;
overflow-wrap: break-word;
p {
margin-bottom: 20px;
unicode-bidi: plaintext;
&:last-child {
margin-bottom: 0;
}
}
a {
color: var(--color-text-brand);
text-decoration: none;
&:hover,
&:focus,
&:active {
text-decoration: underline;
}
}
}
}

View File

@ -8320,372 +8320,6 @@ noscript {
}
}
.account__header__content {
color: var(--color-text-secondary);
font-size: 14px;
font-weight: 400;
overflow: hidden;
word-break: normal;
overflow-wrap: break-word;
p {
margin-bottom: 20px;
unicode-bidi: plaintext;
&:last-child {
margin-bottom: 0;
}
}
a {
color: inherit;
text-decoration: underline;
&:hover {
text-decoration: none;
}
}
}
.account__header {
container: account-header / inline-size;
&.inactive {
opacity: 0.5;
.account__header__image,
.account__avatar {
filter: grayscale(100%);
}
}
&__info {
position: absolute;
top: 20px;
inset-inline-end: 20px;
display: flex;
flex-wrap: wrap;
gap: 2px;
}
&__image {
overflow: hidden;
height: 145px;
position: relative;
background: var(--color-bg-tertiary);
border-bottom: 1px solid var(--color-border-primary);
img {
object-fit: cover;
display: block;
width: 100%;
height: 100%;
margin: 0;
}
}
&__bar {
position: relative;
padding: 0 20px;
border-bottom: 1px solid var(--color-border-primary);
.avatar {
display: block;
flex: 0 0 auto;
.account__avatar {
background: var(--color-bg-primary);
border: 1px solid var(--color-border-primary);
border-radius: var(--avatar-border-radius);
}
}
}
&__tabs {
display: flex;
align-items: flex-start;
justify-content: space-between;
margin-top: -55px;
padding-top: 10px;
gap: 8px;
overflow: hidden;
margin-inline-start: -2px; // aligns the pfp with content below
&__name {
margin-top: 16px;
margin-bottom: 16px;
.emojione {
width: 22px;
height: 22px;
}
h1 {
font-size: 17px;
line-height: 22px;
color: var(--color-text-primary);
font-weight: 600;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
small {
display: flex;
align-items: center;
gap: 4px;
font-size: 14px;
line-height: 20px;
color: var(--color-text-secondary);
font-weight: 400;
overflow: hidden;
text-overflow: ellipsis;
span {
overflow: hidden;
text-overflow: ellipsis;
user-select: all;
}
.icon-lock {
height: 18px;
width: 18px;
}
}
}
}
.spacer {
flex: 1 1 auto;
}
}
&__follow-button {
flex-grow: 1;
}
&__buttons {
display: flex;
align-items: center;
gap: 8px;
$button-breakpoint: 420px;
$button-fallback-breakpoint: $button-breakpoint + 55px;
&--desktop {
margin-top: 55px;
@container (width < #{$button-breakpoint}) {
display: none;
}
@supports (not (container-type: inline-size)) {
@media (max-width: #{$button-fallback-breakpoint}) {
display: none;
}
}
}
&--mobile {
margin-block: 16px;
@container (width >= #{$button-breakpoint}) {
display: none;
}
@supports (not (container-type: inline-size)) {
@media (min-width: ($button-fallback-breakpoint + 1px)) {
display: none;
}
}
}
.button {
flex-shrink: 1;
white-space: nowrap;
min-width: 80px;
}
.icon-button {
border: 1px solid var(--color-border-primary);
border-radius: 4px;
box-sizing: content-box;
padding: 5px;
.icon {
width: 24px;
height: 24px;
}
&.copied {
border-color: var(--color-text-success);
}
}
}
&__bio {
.account__header__content {
color: var(--color-text-primary);
}
.account__header__fields {
margin: 0;
margin-top: 16px;
border-radius: 4px;
border: 1px solid var(--color-border-primary);
dl {
display: block;
padding: 11px 16px;
border-bottom-color: var(--color-border-primary);
}
dd,
dt {
font-size: 13px;
line-height: 18px;
padding: 0;
text-align: initial;
}
dt {
width: auto;
background: transparent;
text-transform: uppercase;
color: var(--color-text-tertiary);
}
dd {
color: var(--color-text-secondary);
}
a {
color: var(--color-text-brand);
}
.icon {
width: 18px;
height: 18px;
}
.verified {
border: 1px solid var(--color-text-success);
margin-top: -1px;
margin-inline: -1px;
&:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
&:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
margin-bottom: -1px;
}
dt,
dd {
color: var(--color-text-success);
}
dd {
display: flex;
align-items: center;
gap: 4px;
span {
display: flex;
}
}
a {
color: var(--color-text-success);
}
}
}
}
&__extra {
margin-top: 16px;
&__links {
font-size: 14px;
color: var(--color-text-secondary);
margin: 0 -10px;
padding-top: 16px;
padding-bottom: 10px;
a {
display: inline-block;
color: var(--color-text-secondary);
text-decoration: none;
padding: 5px 10px;
font-weight: 500;
strong {
font-weight: 700;
color: var(--color-text-primary);
}
}
}
}
&__account-note {
color: var(--color-text-primary);
font-size: 14px;
font-weight: 400;
margin-bottom: 10px;
&__loading-indicator-wrapper {
position: relative;
height: 37px;
.loading-indicator {
left: 10px;
}
.circular-progress {
width: 14px;
height: 14px;
}
}
label {
display: block;
font-size: 12px;
font-weight: 500;
color: var(--color-text-secondary);
text-transform: uppercase;
margin-bottom: 5px;
}
textarea {
display: block;
box-sizing: border-box;
width: calc(100% + 20px);
color: var(--color-text-primary);
background: transparent;
padding: 10px;
margin: 0 -10px;
font-family: inherit;
font-size: 14px;
resize: none;
border: 0;
outline: 0;
border-radius: 4px;
&::placeholder {
color: var(--color-text-tertiary);
opacity: 1;
}
&:focus {
background: var(--color-bg-brand-softest);
}
}
}
}
.account__contents {
overflow: hidden;
}

View File

@ -21,6 +21,9 @@ class PermalinkRedirector
elsif accounts_request? && record_integer_id_request?
account = Account.find_by(id: second_segment)
account if !account&.local? && !account&.suspended?
elsif collections_request? && record_integer_id_request?
collection = Collection.find_by(id: second_segment)
collection if !collection&.local? && !collection&.account&.suspended?
end
end
end
@ -43,6 +46,8 @@ class PermalinkRedirector
redirect_account_path(object.id)
when 'Status'
redirect_status_path(object.id)
when 'Collection'
redirect_collection_path(object.id)
else
@path.delete_prefix('/deck') if @path.start_with?('/deck')
end
@ -70,6 +75,10 @@ class PermalinkRedirector
first_segment == 'accounts'
end
def collections_request?
first_segment == 'collections'
end
def record_integer_id_request?
second_segment =~ /\d/
end

View File

@ -30,7 +30,7 @@ class CollectionItem < ApplicationRecord
delegate :local?, :remote?, to: :collection
validates :account_id, uniqueness: { scope: :collection_id }
validates :account_id, uniqueness: { scope: :collection_id, allow_nil: true }
validates :position, numericality: { only_integer: true, greater_than: 0 }
validates :activity_uri, presence: true, if: :local_item_with_remote_account?
validates :approval_uri, presence: true, unless: -> { local? || account&.local? || !accepted? }

View File

@ -1,9 +1,8 @@
-# locals: (field:, account:)
%dl
%dt.emojify{ title: field.name }
= prerender_custom_emojis(h(field.name), account.emojis)
%dd{ title: field.value, class: field_verified_class(field.verified?) }
- if field.verified?
%span.verified__mark{ title: t('accounts.link_verified_on', date: l(field.verified_at)) }
= material_symbol 'check'
= prerender_custom_emojis(account_field_value_format(field, with_rel_me: false), account.emojis)
%dt.emojify{ title: field.name }
= prerender_custom_emojis(h(field.name), account.emojis)
%dd{ title: field.value, class: field_verified_class(field.verified?) }
- if field.verified?
%span.verified__mark{ title: t('accounts.link_verified_on', date: l(field.verified_at)) }
= material_symbol 'check'
= prerender_custom_emojis(account_field_value_format(field, with_rel_me: false), account.emojis)

View File

@ -11,12 +11,12 @@
.admin-account-bio
- if @account.fields?
%div
.account__header__fields
%dl.admin-account-bio__fields
= render partial: 'field', collection: @account.fields, locals: { account: @account }
- if @account.note?
%div
.account__header__content.emojify
.admin-account-bio__content.emojify
= prerender_custom_emojis(account_bio_format(@account), @account.emojis)
= render 'admin/accounts/counters', account: @account

View File

@ -61,14 +61,11 @@
wrapper: :with_block_label
- if approved_registrations? && @invite.blank?
%p.lead= t('auth.sign_up.manual_review', domain: site_hostname)
.fields-group
= f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields|
= invite_request_fields.input :text,
as: :text,
hint: false,
label: false,
hint: t('auth.sign_up.manual_review', domain: site_hostname),
input_html: { maxlength: UserInviteRequest::TEXT_SIZE_LIMIT },
required: Setting.require_invite_text,
wrapper: :with_block_label

View File

@ -18,7 +18,7 @@ FileUtils.chdir APP_ROOT do
system('bundle check') || system!('bundle install')
puts "\n== Installing JS dependencies =="
system! 'corepack enable'
system! 'npm i -g corepack'
system! 'bin/yarn install --immutable'
puts "\n== Preparing database =="

View File

@ -484,8 +484,10 @@ da:
title: Blokér nyt e-maildomæne
no_email_domain_block_selected: Ingen e-maildomæneblokeringer ændret (ingen var valgt)
not_permitted: Ikke tilladt
reset: Nulstil
resolved_dns_records_hint_html: Domænenavnet opløses til flg. MX-domæner, som i sidste ende er ansvarlige for e-mailmodtagelse. Blokering af et MX-domæne blokerer også tilmeldinger fra enhver e-mailadresse på det pågældende MX-domæne, selv hvis det synlige domænenavn er et andet. <strong>Pas på ikke at blokere større e-mailudbydere.</strong>
resolved_through_html: Opløst via %{domain}
search: Søg
title: Blokerede e-maildomæner
email_subscriptions:
accounts:

View File

@ -484,8 +484,10 @@ de:
title: Neue E-Mail-Domain sperren
no_email_domain_block_selected: Es wurden keine E-Mail-Domain-Sperren geändert, da keine ausgewählt wurden
not_permitted: Nicht erlaubt
reset: Zurücksetzen
resolved_dns_records_hint_html: Die Domain wird zu den folgenden MX-Domains aufgelöst, die für die Annahme von E-Mails zuständig sind. Das Sperren einer MX-Domain sperrt Anmeldungen aller E-Mail-Adressen, die dieselbe MX-Domain verwenden, auch wenn die sichtbare Domain anders lautet. <strong>Achte daher darauf, keine großen E-Mail-Anbieter versehentlich zu sperren.</strong>
resolved_through_html: Durch %{domain} aufgelöst
search: Suchen
title: Gesperrte E-Mail-Domains
email_subscriptions:
accounts:
@ -495,26 +497,39 @@ de:
hint: Bisher wurden keine Konten abonniert.
no_lists_yet: Noch keine Listen vorhanden
inactive: Deaktiviert
last_email: Letzte E-Mail
lead: Konten, die die Funktion aktiviert haben und abonniert wurden, werden unten angezeigt.
status: Status
subscribers: Abonnent*innen
title: Mailingliste
additional_footer_texts:
show:
title: Fußzeile
compliance_settings:
additional_footer_text:
action: Verwalten
hint: Der Text erscheint ausschließlich in der Fußzeile von E-Mails
title: Fußzeile
lead: E-Mail-Newsletter können abhängig vom geltenden Recht als Marketing-E-Mails betrachtet werden.
privacy_policy:
action: Verwalten
hint: Die Datenschutzerklärung wird in der Fußzeile jeder E-Mail beigefügt
title: Datenschutzerklärung
title: Einstellungen zur Einhaltung von Vorschriften
danger_zone:
disable_feature:
action: Deaktivieren
hint: Funktion für alle Konten deaktivieren
title: Funktion deaktivieren
erase_all_data:
action: Daten löschen
hint: Löscht dauerhaft alle E-Mails aus allen Mailinglisten
title: Alle Daten löschen
title: Gefahrenzone
disabled_msg: E-Mail-Abonnements wurden erfolgreich deaktiviert.
index:
disabled:
description: Diese Funktion ermöglicht bestimmten Konten, ein Widget zu ihrem Profil hinzuzufügen, damit Gäste ohne Mastodon-Konto deren Beiträge per E-Mail erhalten können.
get_started: Loslegen
lead: Ermögliche Gästen, Beiträge von ausgewählten Konten dieses Servers per E-Mail zu abonnieren.
title: E-Mail-Newsletter
@ -533,6 +548,11 @@ de:
show:
enable_feature: Funktionen aktivieren
important_information: Wichtige Informationen
list:
1_permission_explanation: Wenn die Funktion aktiviert ist, können alle berechtigten Konten ein E-Mail-Formular zu ihrem Profil hinzufügen.
2_feature_explanation: Sobald Gäste ein Profil abonnieren und das Abonnement bestätigen, werden sie E-Mails über neue öffentliche Beiträge des betreffenden Profils erhalten.
3_privacy_policy_warning: Server-Admins werden Zugriff auf persönlich identifizierbare Informationen (E-Mail-Adressen) haben. Daher müssen die Datenschutzerklärung und Nutzungsbedingungen im Vorfeld aktualisiert werden, bevor diese Funktion verwendet werden kann.
4_cost_warning: Abhängig vom Hosting-Provider können Gebühren für den E-Mail-Versand anfallen. Kläre für deinen Server vorher alle Details, da diese Funktion die Anzahl versendeter E-Mails drastisch erhöhen kann.
export_domain_allows:
new:
title: Erlaubte Domains importieren
@ -838,6 +858,7 @@ de:
manage_custom_emojis: Emojis
manage_custom_emojis_description: Spezielle Emojis dieses Servers verwalten
manage_email_subscriptions: E-Mail-Abonnements
manage_email_subscriptions_description: Konten mit dieser Berechtigung dürfen die Funktion für E-Mail-Newsletter verwenden
manage_federation: Föderation
manage_federation_description: Domains anderer Mastodon-Server sperren/zulassen und Zustellbarkeit kontrollieren
manage_invites: Einladungen

View File

@ -484,8 +484,10 @@ el:
title: Αποκλεισμός νέου τομέα email
no_email_domain_block_selected: Δεν άλλαξαν οι αποκλεισμοί τομέα email καθώς δεν επιλέχθηκε κανένας
not_permitted: Δεν επιτρέπεται
reset: Επαναφορά
resolved_dns_records_hint_html: Το όνομα τομέα επιλύεται στους ακόλουθους τομείς MX, οι οποίοι είναι τελικά υπεύθυνοι για την αποδοχή των email. Αποκλείοντας έναν τομέα MX θα αποκλείει τις εγγραφές από οποιαδήποτε διεύθυνση email που χρησιμοποιεί τον ίδιο τομέα MX, ακόμη και αν το ορατό όνομα τομέα είναι διαφορετικό. <strong>Προσέξτε να μην αποκλείσετε τους μεγάλους παρόχους ηλεκτρονικού ταχυδρομείου.</strong>
resolved_through_html: Επιλύθηκε μέσω %{domain}
search: Αναζήτηση
title: Αποκλεισμένοι τομείς email
email_subscriptions:
accounts:

View File

@ -484,8 +484,10 @@ es-AR:
title: Bloquear nuevo dominio de correo electrónico
no_email_domain_block_selected: No se cambiaron bloqueos de dominio de correo electrónico, ya que no se seleccionó ninguno
not_permitted: No permitidos
reset: Restablecer
resolved_dns_records_hint_html: El nombre de dominio resuelve los siguientes dominios MX, los cuales son responsables en última instancia de aceptar el correo electrónico. Bloquear un dominio MX bloqueará los registros de cualquier dirección de correo electrónico que utilice el mismo dominio MX, incluso si el nombre de dominio visible es diferente. <strong>Tené cuidado de no bloquear los principales proveedores de correo electrónico.</strong>
resolved_through_html: Resuelto a través de %{domain}
search: Buscar
title: Dominios bloqueados de correo electrónico
email_subscriptions:
accounts:

View File

@ -484,8 +484,10 @@ es-MX:
title: Bloquear nuevo dominio de correo
no_email_domain_block_selected: No se han cambiado bloqueos de dominio de correo, ya que ninguno ha sido seleccionado
not_permitted: No permitido
reset: Restablecer
resolved_dns_records_hint_html: El nombre de dominio resuelve los siguientes dominios MX, los cuales son responsables en última instancia de aceptar el correo electrónico. Bloquear un dominio MX bloqueará los registros de cualquier dirección de correo electrónico que utilice el mismo dominio MX, incluso si el nombre de dominio visible es diferente. <strong>Ten cuidado de no bloquear los principales proveedores de correo electrónico.</strong>
resolved_through_html: Resuelto a través de %{domain}
search: Buscar
title: Dominios de correo bloqueados
email_subscriptions:
accounts:
@ -496,7 +498,7 @@ es-MX:
no_lists_yet: No hay listas todavía
inactive: Inactiva
last_email: Último correo electrónico
lead: Las cuentas que han habilitado la función y tienen suscriptores se mostrarán a continuación.
lead: A continuación se mostrarán las cuentas que hayan activado la función y tengan suscriptores.
status: Estado
subscribers: Suscriptores
title: Listas de correo
@ -506,33 +508,33 @@ es-MX:
compliance_settings:
additional_footer_text:
action: Administrar
hint: Texto opcional que aparece únicamente en el pie de los correos electrónicos del boletín de noticias
hint: Texto opcional que aparece únicamente en el pie de página de los correos electrónicos del boletín informativo
title: Texto de pie de página adicional
lead: Los boletines de correo electrónico pueden considerarse correos electrónicos de marketing, dependiendo de las jurisdicciones en las que operas.
lead: Los boletines informativos por correo electrónico pueden considerarse correos electrónicos de marketing, dependiendo de las jurisdicciones en las que operes.
privacy_policy:
action: Administrar
hint: Esta política está enlazada en el pie de cada correo electrónico
hint: Esta política aparece en el pie de página de cada correo electrónico
title: Política de privacidad
title: Ajustes de cumplimiento normativo
danger_zone:
disable_feature:
action: Desactivar
hint: Desactivar función para todas las cuentas
hint: Desactivar la función para todas las cuentas
title: Desactivar función
erase_all_data:
action: Borrar datos
hint: Borra permanentemente todos los correos electrónicos de todas las listas de correo
title: Borrar todos los datos
action: Eliminar datos
hint: Elimina de forma permanente todos los correos electrónicos de todas las listas de correo
title: Eliminar todos los datos
title: Zona peligrosa
disabled_msg: Las suscripciones de correo electrónico se han desactivado correctamente.
disabled_msg: Las suscripciones por correo electrónico se han desactivado correctamente.
index:
disabled:
cannot_be_enabled: Tu proveedor técnico no ha habilitado esta función para tu servidor.
description: Esta función permite a las cuentas especificadas añadir un widget a sus perfiles, permitiendo a los visitantes sin una cuenta de Mastodon recibir sus publicaciones por correo electrónico.
description: Esta función permite a las cuentas especificadas añadir un widget a sus perfiles, lo que permite a los visitantes que no tienen una cuenta de Mastodon recibir sus publicaciones por correo electrónico.
get_started: Primeros pasos
lead: Permitir a los visitantes recibir publicaciones por correo electrónico de cuentas dedicadas en este servidor.
title: Boletines de correo electrónico
purged_msg: Todos los datos de las suscripciones de correo electrónico están siendo borrados.
lead: Permitir que los visitantes reciban publicaciones por correo electrónico desde cuentas específicas de este servidor.
title: Boletines informativos por correo electrónico
purged_msg: Se están borrando todos los datos de las suscripciones por correo electrónico.
roles:
accounts: Cuentas
edit_role: Editar rol
@ -545,13 +547,13 @@ es-MX:
title: Roles
setups:
show:
enable_feature: Activar función
enable_feature: Habilitar función
important_information: Información importante
list:
1_permission_explanation: Cuando esta función está activada, las cuentas con los permisos designados pueden añadir un formulario de recopilación de correo electrónico a sus perfiles.
2_feature_explanation: Cuando los visitantes se registran en la página de perfil de una cuenta y confirman su suscripción, comenzarán a recibir actualizaciones por correo electrónico cuando la cuenta cree nuevas publicaciones públicas.
3_privacy_policy_warning: Los administradores del servidor tendrán acceso a información de identificación personal (direcciones de correo electrónico). Por lo tanto, la política de privacidad y los Términos del Servicio del servidor deben actualizarse antes de usar esta función.
4_cost_warning: Los correos electrónicos pueden incurrir en un cargo dependiendo de la configuración del alojamiento. Habla con tu proveedor de alojamiento antes de activarlo, ya que esta característica podría aumentar drásticamente la cantidad de correos electrónicos enviados desde tu servidor.
1_permission_explanation: Cuando esta función está habilitada, las cuentas con los permisos correspondientes pueden añadir un formulario de recopilación de correos electrónicos a sus perfiles.
2_feature_explanation: Cuando los visitantes se suscriban en la página de perfil de una cuenta y confirmen su suscripción, empezarán a recibir notificaciones por correo electrónico cada vez que la cuenta publique nuevas entradas públicas.
3_privacy_policy_warning: Los administradores del servidor tendrán acceso a la información de identificación personal (direcciones de correo electrónico) recopilada. Por lo tanto, es necesario actualizar la política de privacidad y los Términos de servicio del servidor antes de utilizar esta función.
4_cost_warning: El envío de correos electrónicos puede conllevar un cargo adicional dependiendo de la configuración del alojamiento web. Consúltalo con tu proveedor de alojamiento antes de habilitar esta función, ya que podría aumentar considerablemente el volumen de correos electrónicos enviados desde tu servidor.
export_domain_allows:
new:
title: Importar dominios permitidos
@ -857,7 +859,7 @@ es-MX:
manage_custom_emojis: Administrar Emojis Personalizados
manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor
manage_email_subscriptions: Gestionar suscripciones por correo electrónico
manage_email_subscriptions_description: Permite a los usuarios con este permiso habilitar la función del boletín de noticias por correo electrónico para su cuenta
manage_email_subscriptions_description: Permitir a los usuarios con este permiso activar la función de boletín informativo por correo electrónico en su cuenta
manage_federation: Administrar Federación
manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad
manage_invites: Administrar Invitaciones

View File

@ -484,8 +484,10 @@ es:
title: Bloquear nuevo dominio de correo
no_email_domain_block_selected: No se han cambiado bloqueos de dominio de correo, ya que ninguno ha sido seleccionado
not_permitted: No permitido
reset: Restablecer
resolved_dns_records_hint_html: El nombre de dominio resuelve los siguientes dominios MX, los cuales son responsables en última instancia de aceptar el correo electrónico. Bloquear un dominio MX bloqueará los registros de cualquier dirección de correo electrónico que utilice el mismo dominio MX, incluso si el nombre de dominio visible es diferente. <strong>Ten cuidado de no bloquear los principales proveedores de correo electrónico.</strong>
resolved_through_html: Resuelto a través de %{domain}
search: Buscar
title: Dominios de correo bloqueados
email_subscriptions:
accounts:

View File

@ -539,6 +539,19 @@ et:
empty:
hint: Kellelgi pole õigust seda oskust kasutada.
no_roles_added: Rolle pole lisatud
lead: Järgmiste rollidega kontod saavad selle oskuse oma profiilis sisse lülitada.
manage_roles: Halda rolle
role_name: Rolli nimi
title: Rollid
setups:
show:
enable_feature: Luba oskus
important_information: Oluline info
list:
1_permission_explanation: Kui see funktsioon on sisse lülitatud, saavad vastavate õigustega kontod lisada oma profiilidesse e-posti kogumise vormi.
2_feature_explanation: Kui külastajad registreeruvad konto profiililehel ja kinnitavad tellimuse, hakkavad nad saama e-kirju, kui konto avaldab uusi avalikke postitusi.
3_privacy_policy_warning: Serveri administraatoritel on juurdepääs kogutud isikuandmetele (e-posti aadressidele). Seetõttu tuleb enne selle funktsiooni kasutamist ajakohastada serveri privaatsuspoliitika ja kasutustingimused.
4_cost_warning: Sõltuvalt veebimajutuse seadistustest võib e-kirjade saatmine kaasa tuua lisatasu. Enne selle funktsiooni aktiveerimist konsulteeri oma veebimajutuse pakkujaga, kuna sinu serverist saadetavate e-kirjade arv võib oluliselt suureneda.
export_domain_allows:
new:
title: Lubatud domeenide import
@ -844,6 +857,7 @@ et:
manage_custom_emojis: Halda isetehtud emotikone
manage_custom_emojis_description: Lubab kasutajatel hallata serveris isetehtud emotikone
manage_email_subscriptions: Halda e-posti tellimusi
manage_email_subscriptions_description: Luba selle õigusega kasutajatel oma kontol e-posti uudiskirja funktsioon sisse lülitada
manage_federation: Halda födereerumist
manage_federation_description: Lubab kasutajail keelata või lubada föderatsioone teiste domeenidega ja hallata ühenduvust
manage_invites: Halda kutseid

View File

@ -517,6 +517,71 @@ ga:
resolved_dns_records_hint_html: Réitíonn an t-ainm fearainn chuig na fearainn MX seo a leanas, atá freagrach sa deireadh as glacadh le ríomhphost. Má dhéantar fearann MX a bhlocáil, cuirfear bac ar chlárúcháin ó aon seoladh ríomhphoist a úsáideann an fearann MX céanna, fiú má tá an t-ainm fearainn infheicthe difriúil. <strong>Bí cúramach gan bac a chur ar phríomhsholáthraithe ríomhphoist.</strong>
resolved_through_html: Réitithe trí %{domain}
title: Fearainn ríomhphoist bactha
email_subscriptions:
accounts:
account: Cuntas
active: Gníomhach
empty:
hint: Níl aon síntiúsóirí ag aon chuntas go fóill.
no_lists_yet: Gan aon liostaí fós
inactive: Neamhghníomhach
last_email: Ríomhphost deireanach
lead: Taispeánfar thíos cuntais a bhfuil an ghné cumasaithe acu agus a bhfuil síntiúsóirí acu.
status: Stádas
subscribers: Síntiúsóirí
title: Liostaí poist
additional_footer_texts:
show:
title: Téacs breise sa bhuntásc
compliance_settings:
additional_footer_text:
action: Bainistigh
hint: Téacs roghnach a thaispeántar i mbunús ríomhphoist nuachtlitir amháin
title: Téacs breise sa bhuntásc
lead: Féadfar nuachtlitreacha ríomhphoist a mheas mar ríomhphoist mhargaíochta, ag brath ar na dlínsí ina bhfeidhmíonn tú.
privacy_policy:
action: Bainistigh
hint: Tá nasc chuig an mbeartas seo i mbun gach ríomhphoist
title: Polasaí príobháideachta
title: Socruithe comhlíontachta
danger_zone:
disable_feature:
action: Díchumasaigh
hint: Múch an ghné do gach cuntas
title: Díchumasaigh gné
erase_all_data:
action: Scrios sonraí
hint: Scriosann sé gach ríomhphost i ngach liosta seoltaí go buan
title: Scrios na sonraí go léir
title: Crios contúirte
disabled_msg: Tá síntiúis ríomhphoist díchumasaithe go rathúil.
index:
disabled:
cannot_be_enabled: Níl an ghné seo cumasaithe ag do sholáthraí teicniúil do do fhreastalaí.
description: Leis an ngné seo, is féidir le cuntais shonraithe giuirléid a chur lena bpróifílí, rud a chuireann ar chumas cuairteoirí gan cuntas Mastodon a gcuid post a fháil trí ríomhphost.
get_started: Tosaigh
lead: Lig do chuairteoirí poist a fháil trí ríomhphost ó chuntais tiomnaithe ar an bhfreastalaí seo.
title: Nuachtlitreacha ríomhphoist
purged_msg: Tá gach sonraí síntiúis ríomhphoist á scriosadh.
roles:
accounts: Cuntais
edit_role: Cuir ról in eagar
empty:
hint: Níl cead ag aon duine an ghné seo a úsáid.
no_roles_added: Níor cuireadh aon róil leis
lead: Is féidir le cuntais leis na róil seo a leanas an ghné seo a chumasú ar a bpróifílí.
manage_roles: Bainistigh róil
role_name: Ainm an róil
title: Róil
setups:
show:
enable_feature: Cumasaigh gné
important_information: Faisnéis thábhachtach
list:
1_permission_explanation: Nuair a bhíonn an ghné seo cumasaithe, is féidir le cuntais a bhfuil na ceadanna ainmnithe acu foirm bhailiúcháin ríomhphoist a chur lena bpróifílí.
2_feature_explanation: Nuair a chláraíonn cuairteoirí ar leathanach próifíle cuntais agus a dheimhníonn siad a síntiús, tosóidh siad ag fáil nuashonruithe ríomhphoist nuair a chruthaíonn an cuntas poist phoiblí nua.
3_privacy_policy_warning: Beidh rochtain ag riarthóirí freastalaí ar PII (seoltaí ríomhphoist) a bhailítear. Dá bhrí sin, ní mór an polasaí príobháideachta agus na Téarmaí Seirbhíse don fhreastalaí a nuashonrú sula n-úsáidtear an ghné seo.
4_cost_warning: Dfhéadfadh táille a bheith i gceist le ríomhphoist ag brath ar shocrú an óstála. Pléigh le do sholáthraí óstála sula gcumasaíonn tú é, mar dfhéadfadh an ghné seo líon na ríomhphoist a sheoltar ó do fhreastalaí a mhéadú go mór.
export_domain_allows:
new:
title: Ceadaíonn fearann iomportála
@ -840,6 +905,7 @@ ga:
manage_custom_emojis: Bainistigh Emojis Saincheaptha
manage_custom_emojis_description: Ligeann sé d'úsáideoirí emojis saincheaptha a bhainistiú ar an bhfreastalaí
manage_email_subscriptions: Bainistigh Síntiúis Ríomhphoist
manage_email_subscriptions_description: Lig dúsáideoirí a bhfuil an cead seo acu gné an nuachtlitir ríomhphoist a chumasú dá gcuntas
manage_federation: Cónaidhm a bhainistiú
manage_federation_description: Ligeann sé dúsáideoirí cónaidhm a bhlocáil nó a cheadú le fearainn eile, agus inseachadacht a rialú
manage_invites: Bainistigh Cuirí

View File

@ -484,8 +484,10 @@ gl:
title: Bloquear novo dominio de correo
no_email_domain_block_selected: Non se cambiou ningún bloqueo de dominio porque non había ningún seleccionado
not_permitted: Non permitido
reset: Restabelecer
resolved_dns_records_hint_html: O nome de dominio corresponde cos seguintes dominios MX, que son os responsables últimos de aceptar o correo. Ao bloquear un dominio MX bloquerás a creación de contas para todo enderezo de correo que use o mesmo dominio MX, incluso se o nome de dominio visible é diferente. <strong>Ten coidado xa que podes bloquear os principais provedores de correo.</strong>
resolved_through_html: Resolto a través de %{domain}
search: Buscar
title: Dominios de correo bloqueados
email_subscriptions:
accounts:
@ -551,6 +553,7 @@ gl:
1_permission_explanation: Cando se activa esta ferramenta as contas cos permisos concedidos poden engadir un formulario no seu perfil para recoller correos.
2_feature_explanation: Cando unha persoa visita se apunta na páxina do perfil e confirma a súa subscrición, comezará a recibir actualizacións por correo cando a conta publique novas publicacións públicas.
3_privacy_policy_warning: A administración do servidor vai ter acceso aos PII (enderezos de correo) recollidos. Así, a directiva de privacidade e os termos do servizo do servidor deben actualizarse antes de activar esta ferramenta.
4_cost_warning: Os correos poderían supoñer costes adicionais do servidor. Consulta co teu provedor de hospedaxe antes de activalos, xa que esta ferramenta podería facer aumentar drásticamente o número de correos que envía o teu servidor.
export_domain_allows:
new:
title: Importar dominios permitidos
@ -856,6 +859,7 @@ gl:
manage_custom_emojis: Xestionar Emojis personalizados
manage_custom_emojis_description: Permite xestionar os emojis personalizados do servidor
manage_email_subscriptions: Xestionar subscripcións por correo
manage_email_subscriptions_description: Permitir ás usuarias con este permiso activar para a súa conta a ferramenta do boletín por correo
manage_federation: Xestionar a federación
manage_federation_description: Permite bloquear ou permitir a federación con outros dominios, e controlar as entregas
manage_invites: Xestionar Convites

View File

@ -496,6 +496,7 @@ hu:
no_lists_yet: Még nincsenek listák
inactive: Inaktív
last_email: Legutóbbi e-mail
lead: A fiókok, melyek bekapcsolták a funkciót, és vannak feliratkozóik, itt fognak megjelenni alább.
status: Állapot
subscribers: Feliratkozók
title: Levelezőlisták
@ -527,6 +528,7 @@ hu:
index:
disabled:
cannot_be_enabled: A műszaki szolgáltató nem kapcsolta be ezt a funkciót a kiszolgálód számára.
description: A funkció lehetővé teszi, hogy a megadott fiókok hozzáadjanak egy kisalkalmazást a profiljukhoz, mellyel a Mastodon-fiók nélküli látogatók e-mailben megkaphatják a bejegyzéseiket.
get_started: Első lépések
title: E-mailes hírlevelek
purged_msg: Az összes e-mail-feliratkozási adat törlése folyamatban van.

View File

@ -484,8 +484,10 @@ is:
title: Útiloka nýtt tölvupóstlén
no_email_domain_block_selected: Engum útilokunum tölvupóstléna var breytt þar sem ekkert var valið
not_permitted: Ekki leyft
reset: Endurstilla
resolved_dns_records_hint_html: Heiti lénsins vísar til eftirfarandi MX-léna, sem bera endanlega ábyrgð á að tölvupóstur skili sér. Útilokun á MX-léni mun koma í veg fyrir nýskráningar með hverju því tölvupóstfangi sem notar sama MX-lén, jafnvel þótt sýnilega lénsheitið sé frábrugðið. <strong>Farðu varlega svo þú útilokir ekki algengar tölvupóstþjónustur.</strong>
resolved_through_html: Leyst í gegnum %{domain}
search: Leita
title: Útilokuð tölvupóstlén
email_subscriptions:
accounts:

View File

@ -486,6 +486,7 @@ it:
not_permitted: Non consentito
resolved_dns_records_hint_html: Il nome di dominio si risolve nei seguenti domini MX, che sono in ultima analisi responsabili dell'accettazione delle e-mail. Il blocco di un dominio MX bloccherà le registrazioni da qualsiasi indirizzo e-mail che utilizzi lo stesso dominio MX, anche se il nome di dominio visibile è diverso. <strong>Fai attenzione a non bloccare i principali provider di posta elettronica.</strong>
resolved_through_html: Risolto attraverso %{domain}
search: Cerca
title: Domini e-mail bloccati
email_subscriptions:
accounts:
@ -521,6 +522,7 @@ it:
title: Disabilita la funzionalità
erase_all_data:
action: Cancella i dati
hint: Elimina in modo permanente tutti gli indirizzi email in tutte le mailing list
title: Cancella tutti i dati
title: Zona pericolosa
disabled_msg: Le iscrizioni via email sono state disabilitate con successo.

View File

@ -1005,6 +1005,7 @@ kab:
development: Taneflit
edit_profile: Ẓreg amaɣnu
export: Sifeḍ
featured_tags: Ihacṭagen ufrinen
import: Kter
import_and_export: Taktert d usifeḍ
migrate: Tunigin n umiḍan

View File

@ -92,6 +92,7 @@ de:
closed_registrations_message: Wird angezeigt, wenn Registrierungen deaktiviert sind
content_cache_retention_period: Sämtliche Beiträge von anderen Servern (einschließlich geteilte Beiträge und Antworten) werden, unabhängig von der Interaktion der lokalen Nutzer*innen mit diesen Beiträgen, nach der festgelegten Anzahl von Tagen gelöscht. Davon sind auch Beiträge betroffen, die von lokalen Nutzer*innen favorisiert oder als Lesezeichen gespeichert wurden. Private Erwähnungen zwischen Nutzer*innen von verschiedenen Servern werden ebenfalls verloren gehen und können nicht wiederhergestellt werden. Diese Option richtet sich ausschließlich an Server mit speziellen Zwecken und wird die allgemeine Nutzungserfahrung beeinträchtigen, wenn sie für den allgemeinen Gebrauch aktiviert ist.
custom_css: Du kannst eigene Stylesheets für das Webinterface von Mastodon verwenden.
email_footer_text: Der Text erscheint ausschließlich in der Fußzeile von E-Mails.
favicon: WebP, PNG, GIF oder JPG. Überschreibt das Standard-Mastodon-Favicon mit einem eigenen Favicon.
landing_page: Legt fest, welchen Bereich (nicht angemeldete) Besucher*innen sehen, wenn sie deinen Server besuchen. Für „Trends“ müssen die Trends in den Entdecken-Einstellungen aktiviert sein. Für „Lokaler Feed“ muss „Zugriff auf Live-Feeds, die lokale Beiträge beinhalten“ in den Entdecken-Einstellungen auf „Alle“ gesetzt werden.
mascot: Überschreibt die Abbildung im erweiterten Webinterface.
@ -294,6 +295,7 @@ de:
closed_registrations_message: Nachricht, falls Registrierungen deaktiviert sind
content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte
custom_css: Eigenes CSS
email_footer_text: Fußzeile
favicon: Favicon
landing_page: Landingpage für Gäste
local_live_feed_access: Zugriff auf Live-Feeds, die lokale Beiträge beinhalten
@ -322,6 +324,9 @@ de:
trendable_by_default: Trends ohne vorherige Überprüfung erlauben
trends: Trends aktivieren
wrapstodon: Wrapstodon aktivieren
form_email_subscriptions_confirmation:
agreement_email_volume: Ich verstehe, dass das Aktivieren dieser Funktion die Anzahl versendeter E-Mails drastisch erhöhen kann. Ich übernehme die Verantwortung für mögliche Zusatzkosten.
agreement_privacy_and_terms: Datenschutzerklärung und Nutzungsbedingungen wurden im Vorfeld aktualisiert.
interactions:
must_be_follower: Benachrichtigungen von Profilen, die mir nicht folgen, ausblenden
must_be_following: Benachrichtigungen von Profilen, denen ich nicht folge, ausblenden

View File

@ -156,7 +156,7 @@ el:
jurisdiction: Ανέφερε τη χώρα όπου ζει αυτός που πληρώνει τους λογαριασμούς. Εάν πρόκειται για εταιρεία ή άλλη οντότητα, ανέφερε τη χώρα όπου υφίσταται, και την πόλη, περιοχή, έδαφος ή πολιτεία ανάλογα με την περίπτωση.
min_age: Δεν πρέπει να είναι κάτω από την ελάχιστη ηλικία που απαιτείται από τους νόμους της δικαιοδοσίας σας.
user:
chosen_languages: Όταν ενεργοποιηθεί, μόνο αναρτήσεις σε επιλεγμένες γλώσσες θα εμφανίζονται στις δημόσιες ροές. Αυτή η ρύθμιση δεν επηρεάζει την Αρχική ροή και τις λίστες σας.
chosen_languages: Όταν επιλέξετε, στις δημόσιες ροές θα εμφανίζονται αναρτήσεις μόνο από τις επιλεγμένες γλώσσες. Αυτή η ρύθμιση δεν επηρεάζει την Αρχική ροή και τις λίστες σας.
date_of_birth:
one: Πρέπει να βεβαιωθούμε ότι είσαι τουλάχιστον %{count} για να χρησιμοποιήσεις το %{domain}. Δε θα το αποθηκεύσουμε.
other: Πρέπει να βεβαιωθούμε ότι είσαι τουλάχιστον %{count} για να χρησιμοποιήσεις το %{domain}. Δε θα το αποθηκεύσουμε.

View File

@ -92,7 +92,7 @@ es-MX:
closed_registrations_message: Mostrado cuando los registros están cerrados
content_cache_retention_period: Todas las publicaciones de otros servidores (incluyendo impuestos y respuestas) serán borrados después del número de días especificado, sin tener en cuenta cualquier interacción del usuario local con esas publicaciones. Esto incluye los mensajes que un usuario local haya marcado como favoritos. Las menciones privadas entre usuarios de diferentes instancias también se perderán y será imposible restaurarlas. El uso de esta configuración está pensado para instancias de propósito especial y rompe muchas expectativas de los usuarios cuando se implementa para uso general.
custom_css: Puedes aplicar estilos personalizados a la versión web de Mastodon.
email_footer_text: Texto opcional que aparece únicamente en el pie de los correos electrónicos del boletín de correo electrónico.
email_footer_text: Texto opcional que aparece únicamente en el pie de página de los correos electrónicos del boletín informativo.
favicon: WEBP, PNG, GIF o JPG. Reemplaza el icono predeterminado de Mastodon con un icono personalizado.
landing_page: Selecciona qué página ven los nuevos visitantes cuando llegan por primera vez a tu servidor. Si seleccionas "Tendencias", entonces las tendencias deben estar habilitadas en la Configuración de Descubrimiento. Si selecciona "Cronología local", entonces "Acceso a las cronologías que destacan publicaciones locales" debe configurarse a "Todos" en la Configuración de Descubrimiento.
mascot: Reemplaza la ilustración en la interfaz web avanzada.
@ -325,8 +325,8 @@ es-MX:
trends: Habilitar tendencias
wrapstodon: Habilitar Wrapstodon
form_email_subscriptions_confirmation:
agreement_email_volume: Entiendo que activar esta característica puede aumentar significativamente el volumen de correos electrónicos enviados desde el servidor, y que soy el único responsable de cualquier coste incurrido.
agreement_privacy_and_terms: He actualizado la Política de Privacidad y los Términos del Servicio.
agreement_email_volume: Entiendo que al habilitar esta función puede aumentar considerablemente el volumen de correos electrónicos enviados desde el servidor y que soy el único responsable de los gastos en que se incurra.
agreement_privacy_and_terms: He actualizado la Política de privacidad y los Términos de servicio.
interactions:
must_be_follower: Bloquear notificaciones de personas que no te siguen
must_be_following: Bloquear notificaciones de personas que no sigues

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