Merge commit '66fdd3ae65e13349fbc0b2818d4b91a389075553' into glitch-soc/main

This commit is contained in:
Claire 2026-04-08 19:32:32 +02:00
commit b9014ec220
184 changed files with 1237 additions and 1059 deletions

View File

@ -89,7 +89,7 @@ GEM
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
addressable (2.8.9)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
aes_key_wrap (1.1.0)
android_key_attestation (0.3.0)
@ -816,12 +816,12 @@ GEM
securerandom (0.4.1)
shoulda-matchers (7.0.1)
activesupport (>= 7.1)
sidekiq (8.0.10)
connection_pool (>= 2.5.0)
json (>= 2.9.0)
logger (>= 1.6.2)
rack (>= 3.1.0)
redis-client (>= 0.23.2)
sidekiq (8.1.2)
connection_pool (>= 3.0.0)
json (>= 2.16.0)
logger (>= 1.7.0)
rack (>= 3.2.0)
redis-client (>= 0.26.0)
sidekiq-bulk (0.2.0)
sidekiq
sidekiq-scheduler (6.0.1)

View File

@ -3,6 +3,7 @@
import type { AccountWarningAction } from 'mastodon/models/notification_group';
import type { ApiAccountJSON } from './accounts';
import type { ApiCollectionJSON } from './collections';
import type { ApiReportJSON } from './reports';
import type { ApiStatusJSON } from './statuses';
@ -22,6 +23,8 @@ export const allNotificationTypes: NotificationType[] = [
'moderation_warning',
'severed_relationships',
'annual_report',
'added_to_collection',
'collection_update',
];
export type NotificationWithStatusType =
@ -42,7 +45,9 @@ export type NotificationType =
| 'severed_relationships'
| 'admin.sign_up'
| 'admin.report'
| 'annual_report';
| 'annual_report'
| 'added_to_collection'
| 'collection_update';
export interface BaseNotificationJSON {
id: string;
@ -83,6 +88,26 @@ interface ReportNotificationJSON extends BaseNotificationJSON {
report: ApiReportJSON;
}
interface AddedToCollectionNotificationGroupJSON extends BaseNotificationGroupJSON {
type: 'added_to_collection';
collection: ApiCollectionJSON;
}
interface AddedToCollectionNotificationJSON extends BaseNotificationJSON {
type: 'added_to_collection';
collection: ApiCollectionJSON;
}
interface CollectionUpdateNotificationGroupJSON extends BaseNotificationGroupJSON {
type: 'collection_update';
collection: ApiCollectionJSON;
}
interface CollectionUpdateNotificationJSON extends BaseNotificationJSON {
type: 'collection_update';
collection: ApiCollectionJSON;
}
type SimpleNotificationTypes = 'follow' | 'follow_request' | 'admin.sign_up';
interface SimpleNotificationGroupJSON extends BaseNotificationGroupJSON {
type: SimpleNotificationTypes;
@ -146,7 +171,9 @@ export type ApiNotificationJSON =
| ReportNotificationJSON
| AccountRelationshipSeveranceNotificationJSON
| NotificationWithStatusJSON
| ModerationWarningNotificationJSON;
| ModerationWarningNotificationJSON
| AddedToCollectionNotificationJSON
| CollectionUpdateNotificationJSON;
export type ApiNotificationGroupJSON =
| SimpleNotificationGroupJSON
@ -154,7 +181,9 @@ export type ApiNotificationGroupJSON =
| AccountRelationshipSeveranceNotificationGroupJSON
| NotificationGroupWithStatusJSON
| ModerationWarningNotificationGroupJSON
| AnnualReportNotificationGroupJSON;
| AnnualReportNotificationGroupJSON
| AddedToCollectionNotificationGroupJSON
| CollectionUpdateNotificationGroupJSON;
export interface ApiNotificationGroupsResultJSON {
accounts: ApiAccountJSON[];

View File

@ -21,6 +21,7 @@ import { openModal } from 'mastodon/actions/modal';
import { initMuteModal } from 'mastodon/actions/mutes';
import { apiFollowAccount } from 'mastodon/api/accounts';
import { Avatar } from 'mastodon/components/avatar';
import { VerifiedBadge } from 'mastodon/components/badge';
import { Button } from 'mastodon/components/button';
import { FollowersCounter } from 'mastodon/components/counters';
import { DisplayName } from 'mastodon/components/display_name';
@ -29,7 +30,6 @@ import { FollowButton } from 'mastodon/components/follow_button';
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
import { ShortNumber } from 'mastodon/components/short_number';
import { Skeleton } from 'mastodon/components/skeleton';
import { VerifiedBadge } from 'mastodon/components/verified_badge';
import { useIdentity } from 'mastodon/identity_context';
import { me } from 'mastodon/initial_state';
import type { MenuItem } from 'mastodon/models/dropdown_menu';

View File

@ -0,0 +1,45 @@
import type { Meta, StoryObj } from '@storybook/react-vite';
import { accountFactoryState } from '@/testing/factories';
import { AccountListItem } from './index';
const meta = {
title: 'Components/AccountListItem',
component: AccountListItem,
args: {
accountId: '1',
withBorder: false,
},
parameters: {
state: {
accounts: {
'1': accountFactoryState(),
},
},
},
} satisfies Meta<typeof AccountListItem>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const WithCustomStats: Story = {
args: {
stats: ['posts', 'last-active'],
},
};
export const WithBorder: Story = {
args: {
withBorder: true,
},
};
export const WithoutButton: Story = {
args: {
renderButton: () => null,
},
};

View File

@ -0,0 +1,184 @@
import { useMemo } from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import classNames from 'classnames';
import { Account } from 'mastodon/components/account';
import { VerifiedBadge } from 'mastodon/components/badge';
import { useAccount } from 'mastodon/hooks/useAccount';
import { useRelationship } from 'mastodon/hooks/useRelationship';
import type { Relationship } from 'mastodon/models/relationship';
import { EmojiHTML } from '../emoji/html';
import { FamiliarFollowers } from '../familiar_followers';
import { FollowButton } from '../follow_button';
import { FormattedDateWrapper } from '../formatted_date';
import { NumberFields, NumberFieldsItem } from '../number_fields';
import { RelativeTimestamp } from '../relative_timestamp';
import { ShortNumber } from '../short_number';
import classes from './styles.module.scss';
export interface RenderButtonOptions {
accountId: string | undefined;
relationship: Relationship | null | undefined;
}
type Stat = 'followers' | 'following' | 'posts' | 'joined' | 'last-active';
interface Props {
accountId: string | undefined;
stats?: Stat[];
renderButton?: (options: RenderButtonOptions) => React.ReactNode;
withBorder?: boolean;
}
const DEFAULT_STATS: Stat[] = ['followers', 'following', 'joined'];
/**
* Extended account list item with bio, verified link badge,
* and familiar follower widget.
*
* The displayed account stats can be customised using the `stats` prop,
* and button rendering can be customised via the `renderButton` prop.
*/
export const AccountListItem: React.FC<Props> = ({
accountId,
stats = DEFAULT_STATS,
withBorder = true,
renderButton = defaultRenderButton,
}) => {
const intl = useIntl();
const account = useAccount(accountId);
const relationship = useRelationship(accountId);
const createdThisYear = useMemo(
() => account?.created_at.includes(new Date().getFullYear().toString()),
[account?.created_at],
);
if (!accountId || !account) {
return null;
}
const firstVerifiedField = account.fields.find((item) => !!item.verified_at);
return (
<div className={classes.wrapper} data-with-border={withBorder}>
<div className={classes.header}>
<Account
id={accountId}
minimal
size={40}
withMenu={false}
withBorder={false}
className={classes.account}
/>
{renderButton({ accountId, relationship })}
</div>
<NumberFields>
{stats.includes('followers') && (
<NumberFieldsItem
label={
<FormattedMessage
id='account.followers'
defaultMessage='Followers'
/>
}
hint={intl.formatNumber(account.followers_count)}
>
<ShortNumber value={account.followers_count} />
</NumberFieldsItem>
)}
{stats.includes('following') && (
<NumberFieldsItem
label={
<FormattedMessage
id='account.following'
defaultMessage='Following'
/>
}
hint={intl.formatNumber(account.following_count)}
link={`/@${account.acct}/following`}
>
<ShortNumber value={account.following_count} />
</NumberFieldsItem>
)}
{stats.includes('posts') && (
<NumberFieldsItem
label={
<FormattedMessage id='account.posts' defaultMessage='Posts' />
}
hint={intl.formatNumber(account.statuses_count)}
>
<ShortNumber value={account.statuses_count} />
</NumberFieldsItem>
)}
{stats.includes('joined') && (
<NumberFieldsItem
label={
<FormattedMessage
id='account.joined_short'
defaultMessage='Joined'
/>
}
hint={intl.formatDate(account.created_at)}
>
{createdThisYear ? (
<FormattedDateWrapper
value={account.created_at}
month='short'
day='2-digit'
/>
) : (
<FormattedDateWrapper value={account.created_at} year='numeric' />
)}
</NumberFieldsItem>
)}
{stats.includes('last-active') && (
<NumberFieldsItem
label={
<FormattedMessage
id='account.last_active'
defaultMessage='Last active'
/>
}
>
<RelativeTimestamp
long
timestamp={account.last_status_at}
noFuture
/>
</NumberFieldsItem>
)}
{firstVerifiedField && (
<VerifiedBadge
link={firstVerifiedField.value}
className={classes.verifiedBadge}
/>
)}
</NumberFields>
<FamiliarFollowers accountId={accountId} />
{account.note.length > 0 && (
<EmojiHTML
className={classNames(classes.bio, 'translate')}
htmlString={account.note_emojified}
extraEmojis={account.emojis}
/>
)}
</div>
);
};
const defaultRenderButton = ({ accountId }: RenderButtonOptions) => (
<AccountListItemFollowButton accountId={accountId} />
);
export const AccountListItemFollowButton: React.FC<{
accountId: string | undefined;
}> = ({ accountId }) => (
<FollowButton compact labelLength='short' accountId={accountId} />
);

View File

@ -0,0 +1,50 @@
.wrapper {
display: flex;
flex-direction: column;
align-items: start;
gap: 12px;
padding: 16px;
&[data-with-border='true'] {
border-bottom: 1px solid var(--color-border-primary);
}
:global(.account__note) {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
}
}
.header {
display: flex;
align-items: start;
width: 100%;
}
.account {
--account-name-size: 15px;
--account-handle-color: var(--color-text-secondary);
--account-handle-size: 13px;
--account-bio-color: var(--color-text-primary);
--account-bio-size: 13px;
--account-outer-spacing: 0;
flex-grow: 1;
margin-inline-end: 16px;
}
.verifiedBadge {
align-self: end;
}
.bio {
:any-link {
color: var(--color-text-status-links);
&:hover {
text-decoration: none;
}
}
}

View File

@ -35,6 +35,12 @@ export const Domain: Story = {
},
};
export const Verified: Story = {
render() {
return <badges.VerifiedBadge link='example.com' />;
},
};
export const CustomIcon: Story = {
args: {
...Default.args,

View File

@ -5,18 +5,22 @@ import { FormattedMessage, useIntl } from 'react-intl';
import classNames from 'classnames';
import AdminIcon from '@/images/icons/icon_admin.svg?react';
import IconVerified from '@/images/icons/icon_verified.svg?react';
import type { OnAttributeHandler } from '@/mastodon/utils/html';
import BlockIcon from '@/material-icons/400-24px/block.svg?react';
import GroupsIcon from '@/material-icons/400-24px/group.svg?react';
import PersonIcon from '@/material-icons/400-24px/person.svg?react';
import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react';
import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react';
import { EmojiHTML } from '../emoji/html';
import { Icon } from '../icon';
import classes from './styles.module.scss';
interface BadgeProps {
interface BadgeProps extends React.ComponentPropsWithoutRef<'div'> {
label: ReactNode;
icon?: ReactNode;
className?: string;
domain?: ReactNode;
roleId?: string;
variant?:
@ -35,9 +39,16 @@ export const Badge: FC<BadgeProps> = ({
className,
domain,
roleId,
...otherProps
}) => (
<div
className={classNames(classes.badge, classes[variant], className)}
{...otherProps}
className={classNames(
classes.badge,
!icon && classes.badgeWithoutIcon,
classes[variant],
className,
)}
data-account-role-id={roleId}
>
{icon}
@ -134,3 +145,31 @@ export const BlockedBadge: FC<Partial<BadgeProps>> = ({ label, ...props }) => (
{...props}
/>
);
const onAttribute: OnAttributeHandler = (name, value, tagName) => {
if (name === 'rel' && tagName === 'a') {
if (value === 'me') {
return null;
}
return [
name,
value
.split(' ')
.filter((x) => x !== 'me')
.join(' '),
];
}
return undefined;
};
export const VerifiedBadge: React.FC<{ link: string; className?: string }> = ({
link,
className,
}) => (
<Badge
variant='success'
icon={<Icon id='verified' icon={IconVerified} noFill />}
label={<EmojiHTML as='span' htmlString={link} onAttribute={onAttribute} />}
className={className}
/>
);

View File

@ -2,18 +2,28 @@
color: var(--color-text-primary);
font-size: 13px;
display: inline-flex;
max-width: 100%;
padding: 4px;
padding-inline-end: 8px;
gap: 4px;
border-radius: 6px;
border-radius: 8px;
align-items: center;
overflow-wrap: anywhere;
> svg {
width: auto;
height: 15px;
height: 17px;
fill: currentColor;
opacity: 0.85;
}
a {
color: inherit;
text-decoration: none;
}
&:not(.badgeWithoutIcon) {
padding-inline-end: 8px;
}
}
.domain {
@ -41,7 +51,6 @@
.success {
background-color: var(--color-bg-success-softest);
color: var(--color-text-success);
}
.warning {

View File

@ -1,11 +1,14 @@
import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Avatar } from '@/mastodon/components/avatar';
import { AvatarGroup } from '@/mastodon/components/avatar_group';
import { LinkedDisplayName } from '@/mastodon/components/display_name';
import type { Account } from '@/mastodon/models/account';
import { useFetchFamiliarFollowers } from '../hooks/familiar_followers';
import classes from './styles.module.scss';
import { useFetchFamiliarFollowers } from './use_fetch_familiar_followers';
const FamiliarFollowersReadout: React.FC<{ familiarFollowers: Account[] }> = ({
familiarFollowers,
@ -51,9 +54,10 @@ const FamiliarFollowersReadout: React.FC<{ familiarFollowers: Account[] }> = ({
}
};
export const FamiliarFollowers: React.FC<{ accountId: string }> = ({
accountId,
}) => {
export const FamiliarFollowers: React.FC<{
accountId: string;
className?: string;
}> = ({ accountId, className }) => {
const { familiarFollowers, isLoading } = useFetchFamiliarFollowers({
accountId,
});
@ -63,10 +67,10 @@ export const FamiliarFollowers: React.FC<{ accountId: string }> = ({
}
return (
<div className='account__header__familiar-followers'>
<AvatarGroup compact>
<div className={classNames(classes.wrapper, className)}>
<AvatarGroup compact avatarHeight={24}>
{familiarFollowers.slice(0, 3).map((account) => (
<Avatar withLink key={account.id} account={account} size={28} />
<Avatar withLink key={account.id} account={account} size={24} />
))}
</AvatarGroup>
<span>

View File

@ -0,0 +1,11 @@
.wrapper {
display: flex;
align-items: center;
gap: 10px;
a:any-link {
font-weight: 500;
text-decoration: none;
color: var(--color-text-primary);
}
}

View File

@ -5,6 +5,7 @@ import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Link } from 'react-router-dom';
import { useFetchFamiliarFollowers } from '@/mastodon/components/familiar_followers/use_fetch_familiar_followers';
import { fetchAccount } from 'mastodon/actions/accounts';
import { AccountBio } from 'mastodon/components/account_bio';
import { AccountFields } from 'mastodon/components/account_fields';
@ -18,7 +19,6 @@ import { DisplayName } from 'mastodon/components/display_name';
import { FollowButton } from 'mastodon/components/follow_button';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import { ShortNumber } from 'mastodon/components/short_number';
import { useFetchFamiliarFollowers } from 'mastodon/features/account_timeline/hooks/familiar_followers';
import { domain } from 'mastodon/initial_state';
import { getAccountHidden } from 'mastodon/selectors/accounts';
import { useAppSelector, useAppDispatch } from 'mastodon/store';

View File

@ -1,22 +1,21 @@
import classNames from 'classnames';
import { NavLink } from 'react-router-dom';
import type { MastodonLocationDescriptor } from 'mastodon/components/router';
import classes from './styles.module.scss';
interface WrapperProps {
children: React.ReactNode;
}
export const NumberFields: React.FC<WrapperProps> = ({ children }) => {
return <ul className={classes.list}>{children}</ul>;
export const NumberFields: React.FC<React.ComponentPropsWithoutRef<'ul'>> = ({
children,
className,
}) => {
return <ul className={classNames(classes.list, className)}>{children}</ul>;
};
interface ItemProps {
interface ItemProps extends React.ComponentPropsWithoutRef<'li'> {
label: React.ReactNode;
hint?: string;
link?: MastodonLocationDescriptor;
children: React.ReactNode;
}
export const NumberFieldsItem: React.FC<ItemProps> = ({
@ -24,9 +23,10 @@ export const NumberFieldsItem: React.FC<ItemProps> = ({
hint,
link,
children,
className,
}) => {
return (
<li className={classes.item} title={hint}>
<li className={classNames(classes.item, className)} title={hint}>
{label}
{link ? (
<NavLink exact to={link}>

View File

@ -1,9 +1,9 @@
.list {
display: flex;
flex-wrap: wrap;
margin: 8px 0;
margin: 0;
padding: 0;
gap: 4px 20px;
gap: 4px 24px;
font-size: 13px;
color: var(--color-text-secondary);
}
@ -19,6 +19,7 @@
font-weight: 600;
color: var(--color-text-primary);
font-size: 15px;
white-space: nowrap;
}
a {

View File

@ -1,32 +0,0 @@
import { EmojiHTML } from '@/mastodon/components/emoji/html';
import CheckIcon from '@/material-icons/400-24px/check.svg?react';
import type { OnAttributeHandler } from '../utils/html';
import { Icon } from './icon';
const onAttribute: OnAttributeHandler = (name, value, tagName) => {
if (name === 'rel' && tagName === 'a') {
if (value === 'me') {
return null;
}
return [
name,
value
.split(' ')
.filter((x) => x !== 'me')
.join(' '),
];
}
return undefined;
};
interface Props {
link: string;
}
export const VerifiedBadge: React.FC<Props> = ({ link }) => (
<span className='verified-badge'>
<Icon id='check' icon={CheckIcon} className='verified-badge__mark' />
<EmojiHTML as='span' htmlString={link} onAttribute={onAttribute} />
</span>
);

View File

@ -19,17 +19,17 @@ import type { Account } from '@/mastodon/models/account';
import { getAccountHidden } from '@/mastodon/selectors/accounts';
import { useAppSelector, useAppDispatch } from '@/mastodon/store';
import { FamiliarFollowers } from '../../../components/familiar_followers';
import { AccountName } from './account_name';
import { AccountSubscriptionForm } from './account_subscription_form';
import { AccountBadges } from './badges';
import { AccountButtons } from './buttons';
import { FamiliarFollowers } from './familiar_followers';
import { AccountHeaderFields } from './fields';
import { MemorialNote } from './memorial_note';
import { MovedNote } from './moved_note';
import { AccountNote as AccountNoteRedesign } from './note';
import { AccountNote } from './note';
import { AccountNumberFields } from './number_fields';
import redesignClasses from './redesign.module.scss';
import classes from './styles.module.scss';
import { AccountTabs } from './tabs';
const titleFromAccount = (account: Account) => {
@ -111,12 +111,7 @@ export const AccountHeader: React.FC<{
<FollowRequestNoteContainer account={account} />
)}
<div
className={classNames(
'account__header__image',
redesignClasses.header,
)}
>
<div className={classNames('account__header__image', classes.header)}>
{!suspendedOrHidden && (
<img
src={autoPlayGif ? account.header : account.header_static}
@ -126,16 +121,11 @@ export const AccountHeader: React.FC<{
)}
</div>
<div
className={classNames(
'account__header__bar',
redesignClasses.barWrapper,
)}
>
<div className={classNames('account__header__bar', classes.barWrapper)}>
<div
className={classNames(
'account__header__tabs',
redesignClasses.avatarWrapper,
classes.avatarWrapper,
)}
>
<a
@ -156,31 +146,32 @@ export const AccountHeader: React.FC<{
<div
className={classNames(
'account__header__tabs__name',
redesignClasses.displayNameWrapper,
classes.displayNameWrapper,
)}
>
<AccountName accountId={accountId} />
<AccountButtons
accountId={accountId}
className={redesignClasses.buttonsDesktop}
className={classes.buttonsDesktop}
noShare={!isMe || 'share' in navigator}
forceMenu={'share' in navigator}
/>
</div>
<AccountBadges accountId={accountId} />
<AccountNumberFields accountId={accountId} />
{!isMe && !suspendedOrHidden && (
<FamiliarFollowers accountId={accountId} />
<FamiliarFollowers
accountId={accountId}
className={classes.familiarFollowers}
/>
)}
{!suspendedOrHidden && (
<div className='account__header__extra'>
<div className='account__header__bio'>
{me && account.id !== me && (
<AccountNoteRedesign accountId={accountId} />
<AccountNote accountId={accountId} />
)}
<AccountBio
@ -188,7 +179,7 @@ export const AccountHeader: React.FC<{
accountId={accountId}
className={classNames(
'account__header__content',
redesignClasses.bio,
classes.bio,
)}
/>
@ -203,8 +194,8 @@ export const AccountHeader: React.FC<{
<AccountButtons
className={classNames(
redesignClasses.buttonsMobile,
!isIntersecting && redesignClasses.buttonsMobileIsStuck,
classes.buttonsMobile,
!isIntersecting && classes.buttonsMobileIsStuck,
)}
accountId={accountId}
noShare

View File

@ -21,7 +21,8 @@ import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react';
import HelpIcon from '@/material-icons/400-24px/help.svg?react';
import DomainIcon from '@/material-icons/400-24px/language.svg?react';
import classes from './redesign.module.scss';
import { AccountBadges } from './badges';
import classes from './styles.module.scss';
const messages = defineMessages({
lockedInfo: {
@ -77,6 +78,8 @@ export const AccountName: FC<{ accountId: string }> = ({ accountId }) => {
domain={domain}
isSelf={account.id === me}
/>
<AccountBadges accountId={accountId} />
</div>
);
};

View File

@ -3,6 +3,7 @@ import { useState, useCallback, useId } from 'react';
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
import type { IntlShape } from 'react-intl';
import classNames from 'classnames';
import { Link } from 'react-router-dom';
import { AxiosError } from 'axios';
@ -18,7 +19,7 @@ import type { FieldStatus } from 'mastodon/components/form_fields';
import { TextInputField } from 'mastodon/components/form_fields/text_input_field';
import { useAppSelector } from 'mastodon/store';
import classes from './redesign.module.scss';
import classes from './styles.module.scss';
const messages = defineMessages({
emailInvalid: {
@ -127,7 +128,9 @@ export const AccountSubscriptionForm: React.FC<{ accountId: string }> = ({
if (submitted) {
return (
<div className={classes.bannerBaseCentered}>
<div
className={classNames(classes.bannerBase, classes.bannerBaseCentered)}
>
<div className={classes.bannerTextAndActions}>
<h2>
<FormattedMessage

View File

@ -16,6 +16,8 @@ import { useAccount } from '@/mastodon/hooks/useAccount';
import type { AccountRole } from '@/mastodon/models/account';
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
import classes from './styles.module.scss';
export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => {
const account = useAccount(accountId);
const localDomain = useAppSelector(
@ -101,7 +103,7 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => {
return null;
}
return <div className={'account__header__badges'}>{badges}</div>;
return <div className={classes.badges}>{badges}</div>;
};
function isAdminBadge(role: AccountRole) {

View File

@ -23,7 +23,7 @@ import { cleanExtraEmojis } from '../../emoji/normalize';
import type { AccountField } from '../common';
import { useFieldHtml } from '../hooks/useFieldHtml';
import classes from './redesign.module.scss';
import classes from './styles.module.scss';
const verifyMessage = defineMessage({
id: 'account.link_verified_on',
@ -285,11 +285,14 @@ function useColumnWrap() {
if (!item) {
break;
}
const { ele, span } = item;
if (i < row.length - 1) {
ele.dataset.cols = span.toString();
remainingRowSpan -= span;
} else if (
row.length > 1 &&
row.length === halfColSpan &&
span === 1 &&
remainingRowSpan > 1

View File

@ -4,7 +4,6 @@ import type { FC } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import {
blockAccount,
followAccount,
pinAccount,
unblockAccount,
@ -13,6 +12,7 @@ import {
} from '@/mastodon/actions/accounts';
import { removeAccountFromFollowers } from '@/mastodon/actions/accounts_typed';
import { showAlert } from '@/mastodon/actions/alerts';
import { initBlockModal } from '@/mastodon/actions/blocks';
import { directCompose, mentionCompose } from '@/mastodon/actions/compose';
import {
initDomainBlockModal,
@ -40,7 +40,7 @@ import PersonRemoveIcon from '@/material-icons/400-24px/person_remove.svg?react'
import ReportIcon from '@/material-icons/400-24px/report.svg?react';
import ShareIcon from '@/material-icons/400-24px/share.svg?react';
import classes from './redesign.module.scss';
import classes from './styles.module.scss';
export const AccountMenu: FC<{ accountId: string }> = ({ accountId }) => {
const intl = useIntl();
@ -61,7 +61,7 @@ export const AccountMenu: FC<{ accountId: string }> = ({ accountId }) => {
return [];
}
return redesignMenuItems({
return getMenuItems({
account,
signedIn: !isMe && signedIn,
permissions,
@ -223,7 +223,7 @@ const redesignMessages = defineMessages({
},
});
function redesignMenuItems({
function getMenuItems({
account,
signedIn,
permissions,
@ -435,7 +435,7 @@ function redesignMenuItems({
if (relationship?.blocking) {
dispatch(unblockAccount(account.id));
} else {
dispatch(blockAccount(account.id));
dispatch(initBlockModal(account));
}
},
dangerous: true,

View File

@ -10,7 +10,7 @@ import { IconButton } from '@/mastodon/components/icon_button';
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
import EditIcon from '@/material-icons/400-24px/edit_square.svg?react';
import classes from './redesign.module.scss';
import classes from './styles.module.scss';
const messages = defineMessages({
title: {

View File

@ -28,14 +28,12 @@
}
.name {
display: flex;
gap: 2px;
align-items: baseline;
> h1 {
display: inline;
font-size: 22px;
line-height: normal;
white-space: initial;
margin-inline-end: 4px;
}
}
@ -43,6 +41,10 @@
color: var(--color-text-secondary);
}
.badges {
margin-top: 8px;
}
.handleHelpButton {
display: flex;
gap: 2px;
@ -191,6 +193,10 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
font-size: 15px;
}
.familiarFollowers {
margin-top: 16px;
}
.note {
margin-bottom: 16px;
}
@ -406,6 +412,15 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
margin: 16px 0;
}
.bannerBaseCentered {
min-height: 146px;
align-items: center;
.bannerTextAndActions {
text-align: center;
}
}
.bannerTextAndActions {
display: flex;
flex-direction: column;
@ -426,16 +441,6 @@ $button-fallback-breakpoint: $button-breakpoint + 55px;
}
}
.bannerBaseCentered {
composes: bannerBase;
min-height: 146px;
align-items: center;
.bannerTextAndActions {
text-align: center;
}
}
.bannerInputButton {
display: flex;
gap: 8px;

View File

@ -10,7 +10,7 @@ import { useAccountId } from '@/mastodon/hooks/useAccountId';
import { areCollectionsEnabled } from '../../collections/utils';
import classes from './redesign.module.scss';
import classes from './styles.module.scss';
const isActive: Required<NavLinkProps>['isActive'] = (match, location) =>
match?.url === location.pathname ||

View File

@ -3,22 +3,17 @@ import { useCallback, useRef, useState } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import type { ApiCollectionJSON } from 'mastodon/api_types/collections';
import { Account } from 'mastodon/components/account';
import type { RenderButtonOptions } from 'mastodon/components/account_list_item';
import {
AccountListItem,
AccountListItemFollowButton,
} from 'mastodon/components/account_list_item';
import { Button } from 'mastodon/components/button';
import { Callout } from 'mastodon/components/callout';
import { FollowButton } from 'mastodon/components/follow_button';
import {
NumberFields,
NumberFieldsItem,
} from 'mastodon/components/number_fields';
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
import {
Article,
ItemList,
} from 'mastodon/components/scrollable_list/components';
import { ShortNumber } from 'mastodon/components/short_number';
import { useAccount } from 'mastodon/hooks/useAccount';
import { useRelationship } from 'mastodon/hooks/useRelationship';
import { me } from 'mastodon/initial_state';
import { useConfirmRevoke } from './revoke_collection_inclusion_modal';
@ -31,99 +26,6 @@ const messages = defineMessages({
},
});
const AccountItem: React.FC<{
accountId: string | undefined;
collectionOwnerId: string;
onRevoke: () => void;
withBio?: boolean;
withBorder?: boolean;
}> = ({
accountId,
collectionOwnerId,
onRevoke,
withBio = true,
withBorder = true,
}) => {
const intl = useIntl();
const account = useAccount(accountId);
const relationship = useRelationship(accountId);
if (!accountId || !account) {
return null;
}
// When viewing your own collection, only show the Follow button
// for accounts you're not following (anymore).
// Otherwise, always show the follow button in its various states.
const isOwnAccount = accountId === me;
const withoutButton =
isOwnAccount ||
!relationship ||
(collectionOwnerId === me &&
(relationship.following || relationship.requested));
return (
<div className={classes.accountItemWrapper} data-with-border={withBorder}>
<Account
minimal
id={accountId}
withBio={withBio}
withBorder={false}
withMenu={false}
className={classes.accountItem}
extraAccountInfo={
<NumberFields>
<NumberFieldsItem
label={
<FormattedMessage
id='account.followers'
defaultMessage='Followers'
/>
}
hint={intl.formatNumber(account.followers_count)}
>
<ShortNumber value={account.followers_count} />
</NumberFieldsItem>
<NumberFieldsItem
label={
<FormattedMessage id='account.posts' defaultMessage='Posts' />
}
hint={intl.formatNumber(account.statuses_count)}
>
<ShortNumber value={account.statuses_count} />
</NumberFieldsItem>
<NumberFieldsItem
label={
<FormattedMessage
id='account.last_active'
defaultMessage='Last active'
/>
}
>
<RelativeTimestamp
long
timestamp={account.last_status_at}
noFuture
/>
</NumberFieldsItem>
</NumberFields>
}
/>
{!withoutButton && <FollowButton compact accountId={accountId} />}
{isOwnAccount && (
<Button secondary compact onClick={onRevoke}>
<FormattedMessage
id='collections.detail.revoke_inclusion'
defaultMessage='Remove me'
/>
</Button>
)}
</div>
);
};
const SensitiveScreen: React.FC<{
sensitive: boolean | undefined;
focusTargetRef: React.RefObject<HTMLHeadingElement>;
@ -158,6 +60,7 @@ const SensitiveScreen: React.FC<{
/>
}
onPrimary={showAnyway}
className={classes.sensitiveScreen}
>
<FormattedMessage
id='collections.detail.sensitive_note'
@ -176,14 +79,37 @@ export const CollectionAccountsList: React.FC<{
const listHeadingRef = useRef<HTMLHeadingElement>(null);
const isOwnCollection = collection?.account_id === me;
const { items = [] } = collection ?? {};
const { items = [], account_id: collectionOwnerId } = collection ?? {};
const renderAccountItemButton = useCallback(
({ relationship, accountId }: RenderButtonOptions) => {
// 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));
if (withoutButton) return null;
if (accountId === me) {
return (
<Button secondary compact onClick={confirmRevoke}>
<FormattedMessage
id='collections.detail.revoke_inclusion'
defaultMessage='Remove me'
/>
</Button>
);
}
return <AccountListItemFollowButton accountId={accountId} />;
},
[collectionOwnerId, confirmRevoke],
);
return (
<ItemList
isLoading={isLoading}
emptyMessage={intl.formatMessage(messages.empty)}
className={classes.itemList}
>
<>
<h3
className={classes.columnSubheading}
tabIndex={-1}
@ -207,22 +133,27 @@ export const CollectionAccountsList: React.FC<{
sensitive={!isOwnCollection && collection.sensitive}
focusTargetRef={listHeadingRef}
>
{items.map(({ account_id }, index) => (
<Article
key={account_id}
aria-posinset={index + 1}
aria-setsize={items.length}
>
<AccountItem
withBorder={index !== items.length - 1}
accountId={account_id}
collectionOwnerId={collection.account_id}
onRevoke={confirmRevoke}
/>
</Article>
))}
<ItemList
isLoading={isLoading}
emptyMessage={intl.formatMessage(messages.empty)}
>
{items.map(({ account_id }, index) => (
<Article
key={account_id}
aria-posinset={index + 1}
aria-setsize={items.length}
>
<AccountListItem
accountId={account_id}
withBorder={index !== items.length - 1}
stats={['followers', 'last-active']}
renderButton={renderAccountItemButton}
/>
</Article>
))}
</ItemList>
</SensitiveScreen>
)}
</ItemList>
</>
);
};

View File

@ -11,6 +11,7 @@ import { useAccountHandle } from '@/mastodon/components/display_name/default';
import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react';
import ShareIcon from '@/material-icons/400-24px/share.svg?react';
import type { ApiCollectionJSON } from 'mastodon/api_types/collections';
import { Badge } from 'mastodon/components/badge';
import { Callout } from 'mastodon/components/callout';
import { Column } from 'mastodon/components/column';
import { ColumnHeader } from 'mastodon/components/column_header';
@ -138,7 +139,7 @@ const CollectionHeader: React.FC<{ collection: ApiCollectionJSON }> = ({
<header className={classes.header}>
<div className={classes.titleWithMenu}>
<div className={classes.titleWrapper}>
{tag && <span className={classes.tag}>#{tag.name}</span>}
{tag && <Badge label={`#${tag.name}`} icon={null} />}
<h2 className={classes.name}>{name}</h2>
<AuthorNote id={account_id} />
</div>

View File

@ -2,7 +2,8 @@
display: flex;
flex-direction: column;
gap: 12px;
padding: 24px;
padding: 16px;
padding-bottom: 24px;
}
.titleWithMenu {
@ -20,15 +21,6 @@
min-width: 0;
}
.tag {
display: inline-block;
padding: 4px;
font-size: 13px;
font-weight: 500;
color: var(--color-text-secondary);
background: var(--color-bg-secondary);
}
.name {
font-size: 22px;
font-weight: 500;
@ -71,45 +63,12 @@
}
}
.itemList {
padding-inline: 24px;
.sensitiveScreen {
margin: 16px;
}
.columnSubheading {
padding-bottom: 12px;
padding-inline: 16px;
font-size: 15px;
font-weight: 500;
}
.accountItemWrapper {
display: flex;
align-items: start;
padding-block: 16px;
&[data-with-border='true'] {
border-bottom: 1px solid var(--color-border-primary);
}
:global(.account__note) {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
}
// Hide 'No description provided' message added by `Account` component
:global(.account__note--missing) {
display: none;
}
}
.accountItem {
--account-name-size: 15px;
--account-handle-color: var(--color-text-secondary);
--account-handle-size: 13px;
--account-bio-color: var(--color-text-primary);
--account-bio-size: 13px;
--account-outer-spacing: 0;
flex-grow: 1;
}

View File

@ -1,7 +1,7 @@
import { useMemo } from 'react';
import type { FC, ReactNode } from 'react';
import { Account } from '@/mastodon/components/account';
import { AccountListItem } from '@/mastodon/components/account_list_item';
import { Column } from '@/mastodon/components/column';
import { ColumnBackButton } from '@/mastodon/components/column_back_button';
import { LoadingIndicator } from '@/mastodon/components/loading_indicator';
@ -53,12 +53,12 @@ export const AccountList: FC<AccountListProps> = ({
}
const children =
list?.items.map((followerId) => (
<Account key={followerId} id={followerId} />
<AccountListItem key={followerId} accountId={followerId} />
)) ?? [];
if (prependAccountId) {
children.unshift(
<Account key={prependAccountId} id={prependAccountId} minimal />,
<AccountListItem key={prependAccountId} accountId={prependAccountId} />,
);
}
return children;

View File

@ -16,12 +16,12 @@ import {
} from 'mastodon/actions/suggestions';
import type { ApiSuggestionSourceJSON } from 'mastodon/api_types/suggestions';
import { Avatar } from 'mastodon/components/avatar';
import { Badge, VerifiedBadge } from 'mastodon/components/badge';
import { DisplayName } from 'mastodon/components/display_name';
import { FollowButton } from 'mastodon/components/follow_button';
import { Icon } from 'mastodon/components/icon';
import { IconButton } from 'mastodon/components/icon_button';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import { VerifiedBadge } from 'mastodon/components/verified_badge';
import { domain } from 'mastodon/initial_state';
import { useAppDispatch, useAppSelector } from 'mastodon/store';
@ -110,13 +110,12 @@ const Source: React.FC<{ id: ApiSuggestionSourceJSON }> = ({ id }) => {
}
return (
<div
<Badge
className='inline-follow-suggestions__body__scrollable__card__text-stack__source'
title={hint}
>
<Icon id='' icon={InfoIcon} />
<span>{label}</span>
</div>
label={label}
icon={<InfoIcon />}
/>
);
};

View File

@ -19,6 +19,7 @@ import {
apiRemoveAccountFromList,
} from 'mastodon/api/lists';
import { Avatar } from 'mastodon/components/avatar';
import { VerifiedBadge } from 'mastodon/components/badge';
import { Button } from 'mastodon/components/button';
import { Column } from 'mastodon/components/column';
import { ColumnHeader } from 'mastodon/components/column_header';
@ -27,7 +28,6 @@ import { FollowersCounter } from 'mastodon/components/counters';
import { DisplayName } from 'mastodon/components/display_name';
import ScrollableList from 'mastodon/components/scrollable_list';
import { ShortNumber } from 'mastodon/components/short_number';
import { VerifiedBadge } from 'mastodon/components/verified_badge';
import { useSearchAccounts } from 'mastodon/hooks/useSearchAccounts';
import { me } from 'mastodon/initial_state';
import { useAppDispatch, useAppSelector } from 'mastodon/store';

View File

@ -102,6 +102,7 @@
"account.muted": "Ігнаруецца",
"account.muting": "Ігнараванне",
"account.mutual": "Вы падпісаныя адно на аднаго",
"account.name.copy": "Скапір. ідэнтыфікатар",
"account.name.help.domain": "{domain} — сервер, які ўтрымлівае профіль і допісы гэтага карыстальніка.",
"account.name.help.domain_self": "{domain} — Ваш сервер, які ўтрымлівае Ваш профіль і допісы.",
"account.name.help.footer": "Гэтак жа, як Вы можаце адпраўляць электронныя лісты людзям праз розныя кліенты электроннай пошты, Вы таксама можаце ўзаемадзейнічаць з людзьмі з іншых сервераў Mastodon, а таксама з усімі, хто карыстаецца іншымі сацыяльнымі сеткамі, якія працуюць па тых жа правілах, што і Mastodon (пратакол ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Не ігнараваць @{name}",
"account.unmute_notifications_short": "Апавяшчаць",
"account.unmute_short": "Не ігнараваць",
"account_edit.advanced_settings.bot_hint": "Пакажыце іншым, што гэты ўліковы запіс у асноўным выконвае аўтаматычныя дзеянні і можа не кантралявацца",
"account_edit.advanced_settings.bot_label": "Аўтаматызаваны ўліковы запіс",
"account_edit.advanced_settings.title": "Дадатковыя налады",
"account_edit.bio.add_label": "Апісаць сябе",
"account_edit.bio.edit_label": "Змяніць апісанне",
"account_edit.bio.placeholder": "Коратка апішыце сябе, каб дапамагчы іншым пазнаць Вас.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.",
"domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.",
"dropdown.empty": "Выбраць варыянт",
"email_subscriptions.email": "Адрас электроннай пошты",
"email_subscriptions.email": "Эл. пошта",
"email_subscriptions.form.action": "Падпісацца",
"email_subscriptions.form.disclaimer": "Вы можаце адпісацца ў любы момант. Каб даведацца болей, звярніцеся да <a>Палітыкі прыватнасці</a>.",
"email_subscriptions.form.lead": "Атрымліваць допісы па электроннай пошце без стварэння ўліковага запісу Mastodon.",
"email_subscriptions.form.bottom": "Атрымлівайце допісы ў сваю паштовую скрыню без стварэння ўліковага запісу Mastodon. Пры жаданні зможаце адпісацца ў любы момант. Падрабязней у <a>Палітыцы прыватнасці</a>.",
"email_subscriptions.form.title": "Зарэгістравацца на абнаўленні па электроннай пошце ад {name}",
"email_subscriptions.submitted.lead": "Праверце сваю паштовую скрыню, каб знайсці там ліст і скончыць рэгістрацыю на абнаўленні па электроннай пошце.",
"email_subscriptions.submitted.title": "Яшчэ адзін крок",

View File

@ -102,6 +102,7 @@
"account.muted": "Skjult",
"account.muting": "Skjuler",
"account.mutual": "I følger hinanden",
"account.name.copy": "Kopiér handle",
"account.name.help.domain": "{domain} er den server, der er vært for brugerens profil og indlæg.",
"account.name.help.domain_self": "{domain} er din server, der er vært for din profil og indlæg.",
"account.name.help.footer": "Ligesom du kan sende e-mails til personer, der bruger forskellige e-mail-klienter, kan du interagere med personer på andre Mastodon-servere og med alle på andre sociale apps, der bruger de samme regler som Mastodon (ActivityPub-protokollen).",
@ -138,6 +139,9 @@
"account.unmute": "Vis @{name} igen",
"account.unmute_notifications_short": "Vis notifikationer igen",
"account.unmute_short": "Vis igen",
"account_edit.advanced_settings.bot_hint": "Signalér til andre, at kontoen hovedsageligt udfører automatiserede handlinger og muligvis ikke monitoreres",
"account_edit.advanced_settings.bot_label": "Automatiseret konto",
"account_edit.advanced_settings.title": "Avancerede indstillinger",
"account_edit.bio.add_label": "Tilføj bio",
"account_edit.bio.edit_label": "Rediger bio",
"account_edit.bio.placeholder": "Tilføj en kort introduktion, så andre kan få et indtryk af, hvem du er.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
"domain_pill.your_username": "Din unikke identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
"dropdown.empty": "Vælg en indstilling",
"email_subscriptions.email": "E-mailadresse",
"email_subscriptions.email": "E-mail",
"email_subscriptions.form.action": "Abonnér",
"email_subscriptions.form.disclaimer": "Du kan til enhver tid afmelde dig. For yderligere oplysninger henvises til <a>privatlivspolitikken</a>.",
"email_subscriptions.form.lead": "Få indlæg i din indbakke uden at oprette en Mastodon-konto.",
"email_subscriptions.form.bottom": "Få indlæg sendt direkte til din indbakke uden at oprette en Mastodon-konto. Du kan til enhver tid afmelde dig. For mere information henvises til <a>privatlivspolitikken</a>.",
"email_subscriptions.form.title": "Tilmeld dig e-mailopdateringer fra {name}",
"email_subscriptions.submitted.lead": "Kig i din indbakke efter en e-mail, hvor du kan afslutte tilmeldingen til e-mailopdateringer.",
"email_subscriptions.submitted.title": "Et trin mere",

View File

@ -102,6 +102,7 @@
"account.muted": "Stummgeschaltet",
"account.muting": "Stummgeschaltet",
"account.mutual": "Ihr folgt einander",
"account.name.copy": "Adresse kopieren",
"account.name.help.domain": "{domain} ist der Server, auf dem das Profil registriert ist und die Beiträge verwaltet werden.",
"account.name.help.domain_self": "{domain} ist der Server, auf dem du registriert bist und deine Beiträge verwaltet werden.",
"account.name.help.footer": "So wie du E-Mails an andere trotz unterschiedlicher E-Mail-Provider senden kannst, so kannst du auch mit anderen Profilen auf unterschiedlichen Mastodon-Servern interagieren. Wenn andere soziale Apps die gleichen Kommunikationsregeln (das ActivityPub-Protokoll) wie Mastodon verwenden, dann funktioniert die Kommunikation auch dort.",
@ -138,6 +139,9 @@
"account.unmute": "Stummschaltung von @{name} aufheben",
"account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben",
"account.unmute_short": "Stummschaltung aufheben",
"account_edit.advanced_settings.bot_hint": "Signalisiert, dass dieses Konto hauptsächlich automatisierte Aktionen durchführt und möglicherweise nicht persönlich betreut wird",
"account_edit.advanced_settings.bot_label": "Automatisiertes Konto",
"account_edit.advanced_settings.title": "Erweiterte Einstellungen",
"account_edit.bio.add_label": "Biografie hinzufügen",
"account_edit.bio.edit_label": "Biografie bearbeiten",
"account_edit.bio.placeholder": "Gib anderen einen Einblick über dich, damit sie wissen, wer du bist.",
@ -579,8 +583,7 @@
"dropdown.empty": "Option auswählen",
"email_subscriptions.email": "E-Mail-Adresse",
"email_subscriptions.form.action": "Abonnieren",
"email_subscriptions.form.disclaimer": "Du kannst die Benachrichtigungen jederzeit abbestellen. In der <a>Datenschutzerklärung</a> erfährst du mehr dazu.",
"email_subscriptions.form.lead": "Lass dir Beiträge in dein Postfach senden, ohne ein Mastodon-Konto zu erstellen.",
"email_subscriptions.form.bottom": "Lass dir Beiträge in dein Postfach senden, ohne ein Mastodon-Konto zu erstellen. Du kannst die E-Mails jederzeit abbestellen. Weitere Details findest du in der <a>Datenschutzerklärung</a>.",
"email_subscriptions.form.title": "Erhalte eine E-Mail bei Neuigkeiten von {name}",
"email_subscriptions.submitted.lead": "Überprüfe dein Postfach, um die Benachrichtigungen per E-Mail zu aktivieren.",
"email_subscriptions.submitted.title": "Ein weiterer Schritt",

View File

@ -74,7 +74,7 @@
"account.languages": "Αλλαγή εγγεγραμμένων γλωσσών",
"account.last_active": "Τελευταία ενεργός",
"account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις {date}",
"account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού έχει ρυθμιστεί σε κλειδωμένη. Ο ιδιοκτήτης αξιολογεί χειροκίνητα ποιος μπορεί να τον ακολουθήσει.",
"account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού έχει ρυθμιστεί σε κλειδωμένη. Ο ιδιοκτήτης ελέγχει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.",
"account.media": "Πολυμέσα",
"account.mention": "Επισήμανση @{name}",
"account.menu.add_to_list": "Προσθήκη στη λίστα…",
@ -102,6 +102,7 @@
"account.muted": "Σε σίγαση",
"account.muting": "Σίγαση",
"account.mutual": "Ακολουθείτε ο ένας τον άλλο",
"account.name.copy": "Αντιγραφή πλήρους ονόματος χρήστη",
"account.name.help.domain": "Το {domain} είναι ο διακομιστής που φιλοξενεί το προφίλ και τις αναρτήσεις του χρήστη.",
"account.name.help.domain_self": "Το {domain} είναι ο διακομιστής σας που φιλοξενεί το προφίλ και τις αναρτήσεις σας.",
"account.name.help.footer": "Ακριβώς όπως μπορείτε να στείλετε μηνύματα ηλεκτρονικού ταχυδρομείου σε άτομα χρησιμοποιώντας διαφορετικούς παρόχους email, μπορείτε να αλληλεπιδράσετε με άτομα σε άλλους διακομιστές Mastodon και με οποιονδήποτε σε άλλες κοινωνικές εφαρμογές που τροφοδοτούνται από το ίδιο σύνολο κανόνων όπως χρησιμοποιεί το Mastodon (το πρωτόκολλο ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Άρση σίγασης @{name}",
"account.unmute_notifications_short": "Σίγαση ειδοποιήσεων",
"account.unmute_short": "Κατάργηση σίγασης",
"account_edit.advanced_settings.bot_hint": "Υποδεικνύει σε άλλους χρήστες ότι ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται",
"account_edit.advanced_settings.bot_label": "Αυτοματοποιημένος λογαριασμός",
"account_edit.advanced_settings.title": "Προχωρημένες ρυθμίσεις",
"account_edit.bio.add_label": "Προσθήκη βιογραφικού",
"account_edit.bio.edit_label": "Επεξεργασία βιογραφικού",
"account_edit.bio.placeholder": "Προσθέστε μια σύντομη εισαγωγή για να βοηθήσετε άλλους να σας αναγνωρίσουν.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου μαζί.",
"domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.",
"dropdown.empty": "Διαλέξτε μια επιλογή",
"email_subscriptions.email": "Διεύθυνση email",
"email_subscriptions.email": "Email",
"email_subscriptions.form.action": "Εγγραφή",
"email_subscriptions.form.disclaimer": "Μπορείτε να απεγγραφείτε οποιαδήποτε στιγμή. Για περισσότερες πληροφορίες, ανατρέξτε στην <a>Πολιτική Απορρήτου</a>.",
"email_subscriptions.form.lead": "Λάβετε αναρτήσεις στα εισερχόμενά σας χωρίς να δημιουργήσετε λογαριασμό Mastodon.",
"email_subscriptions.form.bottom": "Λάβετε αναρτήσεις στα εισερχόμενά σας χωρίς να χρειαστεί να δημιουργήσετε λογαριασμό Mastodon. Κάντε απεγγραφή οποιαδήποτε στιγμή. Για περισσότερες πληροφορίες, ανατρέξτε στην <a>Πολιτική Απορρήτου</a>.",
"email_subscriptions.form.title": "Εγγραφείτε για ενημερώσεις μέσω email από {name}",
"email_subscriptions.submitted.lead": "Ελέγξτε τα εισερχόμενά σας για να ολοκληρωθεί η εγγραφή για ενημερώσεις μέσω email.",
"email_subscriptions.submitted.title": "Ένα βήμα ακόμα",

View File

@ -102,6 +102,7 @@
"account.muted": "Silenciado",
"account.muting": "Silenciada",
"account.mutual": "Se siguen mutuamente",
"account.name.copy": "Copiar alias",
"account.name.help.domain": "«{domain}» es el servidor que hospeda el perfil y los mensajes del usuario.",
"account.name.help.domain_self": "«{domain}» es tu servidor que hospeda tu perfil y tus mensajes.",
"account.name.help.footer": "Así como podés enviar correos electrónicos a personas usando diferentes clientes de email, del mismo modo podés interactuar con cuentas en otros servidores de Mastodon; y con cuentas en otras aplicaciones sociales que funcionen bajo las mismas normas que Mastodon (esto es, el protocolo ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications_short": "Dejar de silenciar notificaciones",
"account.unmute_short": "Dejar de silenciar",
"account_edit.advanced_settings.bot_hint": "Señala a otras cuentas que esta cuenta principalmente realiza acciones automatizadas y podría no estar monitoreada",
"account_edit.advanced_settings.bot_label": "Cuenta automatizada",
"account_edit.advanced_settings.title": "Configuración avanzada",
"account_edit.bio.add_label": "Agregar biografía",
"account_edit.bio.edit_label": "Editar biografía",
"account_edit.bio.placeholder": "Agregá una breve introducción para ayudar a otras personas a identificarte.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Tu hogar digital, donde residen todos tus mensajes. ¿No te gusta este sitio? Mudate a otro servidor en cualquier momento y llevate a tus seguidores.",
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar cuentas con el mismo nombre de usuario en diferentes servidores.",
"dropdown.empty": "Seleccioná una opción",
"email_subscriptions.email": "Dirección de correo electrónico",
"email_subscriptions.email": "Correo electrónico",
"email_subscriptions.form.action": "Suscribite",
"email_subscriptions.form.disclaimer": "Podés desuscribirte en cualquier momento. Para más información, consultá la <a>Política de privacidad</a>.",
"email_subscriptions.form.lead": "Obtené mensajes en tu bandeja de entrada sin crear una cuenta de Mastodon.",
"email_subscriptions.form.bottom": "Obtené publicaciones en tu bandeja de entrada sin crear una cuenta de Mastodon. Desuscribite en cualquier momento. Para más información, consultá la <a>Política de privacidad</a>.",
"email_subscriptions.form.title": "Suscribite para recibir actualizaciones por correo electrónico de {name}",
"email_subscriptions.submitted.lead": "Revisá tu bandeja de entrada para confirmar tu suscripción, así podés recibir actualizaciones por correo electrónico.",
"email_subscriptions.submitted.title": "Un paso más",

View File

@ -102,6 +102,7 @@
"account.muted": "Silenciado",
"account.muting": "Silenciando",
"account.mutual": "Se siguen el uno al otro",
"account.name.copy": "Copiar identificador",
"account.name.help.domain": "{domain} es el servidor que aloja el perfil y las publicaciones del usuario.",
"account.name.help.domain_self": "{domain} es el servidor que aloja tu perfil y tus publicaciones.",
"account.name.help.footer": "Al igual que puedes enviar correos electrónicos a personas que utilizan diferentes clientes de correo electrónico, puedes interactuar con personas en otros servidores Mastodon, y con cualquier persona en otras aplicaciones sociales que funcionen con el mismo conjunto de reglas que utiliza Mastodon (el protocolo ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications_short": "Dejar de silenciar notificaciones",
"account.unmute_short": "Dejar de silenciar",
"account_edit.advanced_settings.bot_hint": "Indica a los demás que la cuenta realiza principalmente acciones automatizadas y que es posible que no esté supervisada",
"account_edit.advanced_settings.bot_label": "Cuenta automatizada",
"account_edit.advanced_settings.title": "Configuración avanzada",
"account_edit.bio.add_label": "Añadir biografía",
"account_edit.bio.edit_label": "Editar biografía",
"account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.",
@ -436,7 +440,7 @@
"column_header.moveLeft_settings": "Mover columna a la izquierda",
"column_header.moveRight_settings": "Mover columna a la derecha",
"column_header.pin": "Fijar",
"column_header.show_settings": "Mostrar ajustes",
"column_header.show_settings": "Mostrar configuración",
"column_header.unpin": "Dejar de fijar",
"column_search.cancel": "Cancelar",
"combobox.close_results": "Cerrar resultados",
@ -549,7 +553,7 @@
"directory.local": "Sólo de {domain}",
"directory.new_arrivals": "Recién llegados",
"directory.recently_active": "Recientemente activo",
"disabled_account_banner.account_settings": "Ajustes de la cuenta",
"disabled_account_banner.account_settings": "Configuración de la cuenta",
"disabled_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada.",
"dismissable_banner.community_timeline": "Estas son las publicaciones públicas más recientes de las personas cuyas cuentas están alojadas en {domain}.",
"dismissable_banner.dismiss": "Descartar",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
"dropdown.empty": "Elige una opción",
"email_subscriptions.email": "Dirección de correo electrónico",
"email_subscriptions.email": "Correo electrónico",
"email_subscriptions.form.action": "Suscribirse",
"email_subscriptions.form.disclaimer": "Puedes darte de baja en cualquier momento. Para obtener más información, consulta la <a>Política de privacidad</a>.",
"email_subscriptions.form.lead": "Recibe publicaciones en tu bandeja de entrada sin necesidad de crear una cuenta de Mastodon.",
"email_subscriptions.form.bottom": "Recibe publicaciones en tu bandeja de entrada sin necesidad de crear una cuenta de Mastodon. Puedes darte de baja en cualquier momento. Para obtener más información, consulta la <a>Política de privacidad</a>.",
"email_subscriptions.form.title": "Suscríbete para recibir actualizaciones por correo electrónico de {name}",
"email_subscriptions.submitted.lead": "Revisa tu bandeja de entrada para encontrar el correo electrónico que te permitirá completar tu suscripción a las actualizaciones por correo electrónico.",
"email_subscriptions.submitted.title": "Un paso más",
@ -660,8 +663,8 @@
"filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado; deberás cambiar la fecha de caducidad para que se aplique.",
"filter_modal.added.expired_title": "¡Filtro expirado!",
"filter_modal.added.review_and_configure": "Para revisar y configurar esta categoría de filtros, vaya a {settings_link}.",
"filter_modal.added.review_and_configure_title": "Ajustes de filtro",
"filter_modal.added.settings_link": "página de ajustes",
"filter_modal.added.review_and_configure_title": "Configuración de filtros",
"filter_modal.added.settings_link": "página de configuración",
"filter_modal.added.short_explanation": "Esta publicación ha sido añadida a la siguiente categoría de filtros: {title}.",
"filter_modal.added.title": "¡Filtro añadido!",
"filter_modal.select_filter.context_mismatch": "no se aplica a este contexto",

View File

@ -102,6 +102,7 @@
"account.muted": "Silenciado",
"account.muting": "Silenciando",
"account.mutual": "Os seguís mutuamente",
"account.name.copy": "Copiar alias",
"account.name.help.domain": "{domain} es el servidor que alberga el perfil y las publicaciones del usuario.",
"account.name.help.domain_self": "{domain} es tu servidor que aloja tu perfil y publicaciones.",
"account.name.help.footer": "Al igual que puedes enviar correos electrónicos a personas usando diferentes clientes de correo electrónico, puedes interactuar con personas en otros servidores de Mastodon y con personas en otras aplicaciones sociales que hablen el mismo idioma que Mastodon (el protocolo ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications_short": "Dejar de silenciar notificaciones",
"account.unmute_short": "Dejar de silenciar",
"account_edit.advanced_settings.bot_hint": "Señalar a los demás que la cuenta realiza principalmente acciones automáticas y podría no estar monitorizada",
"account_edit.advanced_settings.bot_label": "Cuenta automatizada",
"account_edit.advanced_settings.title": "Ajustes avanzados",
"account_edit.bio.add_label": "Añadir biografía",
"account_edit.bio.edit_label": "Editar biografía",
"account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.",
"domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.",
"dropdown.empty": "Selecciona una opción",
"email_subscriptions.email": "Dirección de correo electrónico",
"email_subscriptions.email": "Correo electrónico",
"email_subscriptions.form.action": "Suscribirse",
"email_subscriptions.form.disclaimer": "Puedes darte de baja en cualquier momento. Para obtener más información, consulta la <a>Política de Privacidad</a>.",
"email_subscriptions.form.lead": "Obtén mensajes en tu bandeja de entrada sin crear una cuenta de Mastodon.",
"email_subscriptions.form.bottom": "Recibe publicaciones en tu bandeja de entrada sin crear una cuenta de Mastodon. Puedes darte de baja en cualquier momento. Para obtener más información, consulta la <a>Política de Privacidad</a>.",
"email_subscriptions.form.title": "Suscríbete para recibir actualizaciones por correo electrónico de {name}",
"email_subscriptions.submitted.lead": "Revisa tu bandeja de entrada para terminar de suscribirte y recibir actualizaciones por correo electrónico.",
"email_subscriptions.submitted.title": "Un paso más",

View File

@ -102,6 +102,7 @@
"account.muted": "Summutatud",
"account.muting": "Summutatud konto",
"account.mutual": "Te jälgite teineteist",
"account.name.copy": "Kopeeri kasutajatunnus",
"account.name.help.domain": "{domain} on server, kus antud konto koos profiiliga asub ning kust postitused saavad alguse.",
"account.name.help.domain_self": "{domain} on server, kus sinu konto koos profiiliga asub ning kust sinu postitused saavad alguse.",
"account.name.help.footer": "Nii nagu võid saata teiste e-posti serverite kasutajatele e-kirju, saad ka suhelda teiste Mastodoni serverite kasutajatega - ja tegelikult ka muude sotsiaalvõrkude kasutajatega, kus on kasutusel sama lahendus, nagu Mastodon pruugib (ActivityPubi protokoll).",
@ -138,6 +139,9 @@
"account.unmute": "Lõpeta {name} kasutaja summutamine",
"account.unmute_notifications_short": "Lõpeta teavituste summutamine",
"account.unmute_short": "Lõpeta summutamine",
"account_edit.advanced_settings.bot_hint": "Teavita teisi, et sel kontol tehakse peamiselt automatiseeritud toiminguid ja seda ei pruugita jälgida",
"account_edit.advanced_settings.bot_label": "Automatiseeritud konto",
"account_edit.advanced_settings.title": "Täpsemad seaded",
"account_edit.bio.add_label": "Lisa elulugu",
"account_edit.bio.edit_label": "Muuda elulugu",
"account_edit.bio.placeholder": "Lisa lühike tutvustus, et aidata teistel sinust pilti luua.",
@ -158,9 +162,9 @@
"account_edit.display_name.edit_label": "Muuda kuvatavat nime",
"account_edit.display_name.placeholder": "Kuvatav nimi määrab, kuidas sinu nimi on näha sinu profiilis ja ajajoontel.",
"account_edit.display_name.title": "Kuvatav nimi",
"account_edit.featured_hashtags.edit_label": "Lisa silte",
"account_edit.featured_hashtags.edit_label": "Lisa teemaviiteid",
"account_edit.featured_hashtags.placeholder": "Aita teistel leida su lemmikteemasid ja neile kiiresti juurde pääseda.",
"account_edit.featured_hashtags.title": "Esiletõstetud sildid",
"account_edit.featured_hashtags.title": "Esiletõstetud teemaviited",
"account_edit.field_actions.delete": "Kustuta väli",
"account_edit.field_actions.edit": "Muuda välja",
"account_edit.field_delete_modal.confirm": "Kas oled kindel, et soovid selle kohandatud välja kustutada? Seda toimingut ei saa tagasi võtta.",
@ -206,9 +210,42 @@
"account_edit.profile_tab.button_label": "Kohanda",
"account_edit.profile_tab.hint.description": "Need seaded määravad, mida kasutajad näevad {server} ametlikes rakendustes, kuid ei pruugi kehtida teiste serverite kasutajate ja kolmandate osapoolte rakenduste puhul.",
"account_edit.profile_tab.hint.title": "Näitamine siiski erinev",
"account_edit_tags.max_tags_reached": "Oled jõudnud esiletõstetud siltide maksimumarvuni.",
"account_edit_tags.search_placeholder": "Sisesta silt…",
"account_edit.profile_tab.show_featured.description": "\"Esile tõstetud\" on valikuline taab, kus saad näidata teisi kontosid.",
"account_edit.profile_tab.show_featured.title": "Näita esiletõstetute taabi",
"account_edit.profile_tab.show_media.description": "\"Meedia\" on valikuline taab, mis näitab sinu piltide või videotega postitusi.",
"account_edit.profile_tab.show_media.title": "Näita meedia taabi",
"account_edit.profile_tab.show_media_replies.description": "Sisse lülitatuna näitab meedia taab mõlemat, nii sinu postitusi kui su vastuseid teiste postitustele.",
"account_edit.profile_tab.show_media_replies.title": "Kaasa meedia taabile ka vastused",
"account_edit.profile_tab.subtitle": "Kohanda oma profiili vahekaarte ja nende sisu.",
"account_edit.profile_tab.title": "Profiili taabide seaded",
"account_edit.save": "Salvesta",
"account_edit.upload_modal.back": "Tagasi",
"account_edit.upload_modal.done": "Valmis",
"account_edit.upload_modal.next": "Edasi",
"account_edit.upload_modal.step_crop.zoom": "Suum",
"account_edit.upload_modal.step_upload.button": "Sirvi faile",
"account_edit.upload_modal.step_upload.dragging": "Üleslaadimiseks kukuta",
"account_edit.upload_modal.step_upload.header": "Vali pilt",
"account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- või JPG-vormingus, maksimaalselt {limit} MB.{br}Pilt skaleeritakse mõõtmeteni {width}x{height} pikselit.",
"account_edit.upload_modal.title_add.avatar": "Lisa profiilifoto",
"account_edit.upload_modal.title_add.header": "Lisa kaanefoto",
"account_edit.upload_modal.title_replace.avatar": "Asenda profiilifoto",
"account_edit.upload_modal.title_replace.header": "Asenda kaanefoto",
"account_edit.verified_modal.details": "Tõsta oma Mastodoni profiili usaldusväärsust, kinnitades lingid isiklikele veebisaitidele. See toimib järgmiselt:",
"account_edit.verified_modal.invisible_link.details": "Lisa link oma päisesse. Oluline on atribuut rel=\"me\", mis takistab identiteedivargust kasutajate loodud sisuga veebisaitidel. Lehe päises võib kasutada isegi silti link {tag} asemel, kuid HTML peab olema kättesaadav ka ilma JavaScripti käivitamiseta.",
"account_edit.verified_modal.invisible_link.summary": "Kuidas ma muudan lingi nähtamatuks?",
"account_edit.verified_modal.step1.header": "Kopeeri allpool olev HTML-kood ja kleebi oma veebisaidi päisesse",
"account_edit.verified_modal.step2.details": "Kui oled oma veebisaidi kohandatud väljana juba lisanud, pead kinnitamise käivitamiseks selle kustutama ja uuesti lisama.",
"account_edit.verified_modal.step2.header": "Lisa oma veebileht kohandatud väljana",
"account_edit.verified_modal.title": "Kuidas lisada kinnitatud link",
"account_edit_tags.add_tag": "Lisa #{tagName}",
"account_edit_tags.column_title": "Muuda silte",
"account_edit_tags.help_text": "Esiletõstetud teemaviited aitavad kasutajatel sinu profiili leida ja sellega suhestuda. Need kuvatakse filtritena sinu profiili lehe tegevuste vaates.",
"account_edit_tags.max_tags_reached": "Oled jõudnud esiletõstetud teemaviidete maksimumarvuni.",
"account_edit_tags.search_placeholder": "Sisesta teemaviide…",
"account_edit_tags.suggestions": "Soovitused:",
"account_edit_tags.tag_status_count": "{count, plural, one {# postitus} other {# postitust}}",
"account_list.total": "{total, plural, one {# konto} other {# kontot}}",
"account_note.placeholder": "Klõpsa märke lisamiseks",
"admin.dashboard.daily_retention": "Kasutajate päevane allesjäämine peale registreerumist",
"admin.dashboard.monthly_retention": "Kasutajate kuine allesjäämine peale registreerumist",
@ -306,11 +343,18 @@
"callout.dismiss": "Loobu",
"carousel.current": "<sr>Slaid</sr> {current, number} / {max, number}",
"carousel.slide": "Slaid {current, number} / {max, number}",
"character_counter.recommended": "{currentLength}/{maxLength} soovitatud märke",
"character_counter.required": "{currentLength}/{maxLength} märki",
"closed_registrations.other_server_instructions": "Kuna Mastodon on detsentraliseeritud, võib konto teha teise serverisse ja sellegipoolest siinse kontoga suhelda.",
"closed_registrations_modal.description": "Praegu ei ole võimalik teha {domain} peale kontot, aga pea meeles, et sul ei pea olema just {domain} konto, et Mastodoni kasutada.",
"closed_registrations_modal.find_another_server": "Leia mõni muu server",
"closed_registrations_modal.preamble": "Mastodon on hajutatud võrk, mis tähendab, et konto võid luua ükskõik kuhu, kuid ikkagi saad jälgida ja suhelda igaühega selles serveris. Võid isegi oma serveri püsti panna!",
"closed_registrations_modal.title": "Mastodoni registreerumine",
"collection.share_modal.share_link_label": "Kutse jagamise link",
"collection.share_modal.share_via_post": "Postita Mastodonis",
"collection.share_modal.share_via_system": "Jaga kohas…",
"collection.share_modal.title": "Jaga kogumikku",
"collection.share_modal.title_new": "Jaga oma ut kogumikku!",
"collections.account_count": "{count, plural, one {# kasutajakonto} other {# kasutajakontot}}",
"collections.collection_description": "Kirjeldus",
"collections.collection_name": "Nimi",
@ -516,7 +560,7 @@
"emoji_button.search_results": "Otsitulemused",
"emoji_button.symbols": "Sümbolid",
"emoji_button.travel": "Reisimine & kohad",
"empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid teemaviiteid või sõbra kasutajakontot?",
"empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud. Kas teadsid, et oma profiilis saad esile tõsta rohkem kasutatud teemaviiteid või sõbra kasutajakontot?",
"empty_column.account_hides_collections": "See kasutaja otsustas mitte teha seda infot saadavaks",
"empty_column.account_suspended": "Konto kustutatud",
"empty_column.account_timeline": "Siin postitusi ei ole!",
@ -556,6 +600,8 @@
"featured_carousel.header": "{count, plural, one {Esiletõstetud postitus} other {Esiletõstetud postitust}}",
"featured_carousel.slide": "Postitus {current, number} / {max, number}",
"featured_tags.more_items": "+{count}",
"featured_tags.suggestions": "Postitasid hiljuti {items} kohta. Kas lisada need esiletõstetud teemaviideteks?",
"featured_tags.suggestions.added": "Halda mistahes ajal oma esiletõstetud teemaviiteid kohas <link>Muuda profiili > Esiletõstetud teemaviited</link>.",
"filter_modal.added.context_mismatch_explanation": "See filtrikategooria ei rakendu kontekstis, kuidas postituseni jõudsid. Kui tahad postitust ka selles kontekstis filtreerida, pead muutma filtrit.",
"filter_modal.added.context_mismatch_title": "Konteksti mittesobivus!",
"filter_modal.added.expired_explanation": "Selle filtri kategooria on aegunud. pead muutma aegumiskuupäeva, kui tahad, et filter kehtiks.",
@ -620,7 +666,7 @@
"hashtag.column_header.tag_mode.any": "või teemaviide {additional}",
"hashtag.column_header.tag_mode.none": "ilma teemaviiteta {additional}",
"hashtag.column_settings.select.no_options_message": "Soovitusi ei leitud",
"hashtag.column_settings.select.placeholder": "Sisesta sildid…",
"hashtag.column_settings.select.placeholder": "Sisesta teemaviited…",
"hashtag.column_settings.tag_mode.all": "Kõik need",
"hashtag.column_settings.tag_mode.any": "Mõni neist",
"hashtag.column_settings.tag_mode.none": "Mitte ükski neist",
@ -920,7 +966,7 @@
"onboarding.profile.display_name": "Näidatav nimi",
"onboarding.profile.display_name_hint": "Su täisnimi või naljanimi…",
"onboarding.profile.note": "Elulugu",
"onboarding.profile.note_hint": "Saad @mainida teisi kasutajaid või lisada #teemaviidet…",
"onboarding.profile.note_hint": "Saad @mainida teisi kasutajaid või lisada #teemaviiteid…",
"onboarding.profile.title": "Profiili seadistamine",
"onboarding.profile.upload_avatar": "Laadi üles profiilipilt",
"onboarding.profile.upload_header": "Laadi üles profiili päis",
@ -1048,7 +1094,7 @@
"search_popout.user": "kasutaja",
"search_results.accounts": "Profiilid",
"search_results.all": "Kõik",
"search_results.hashtags": "Sildid",
"search_results.hashtags": "Teemaviited",
"search_results.no_results": "Tulemusi pole.",
"search_results.no_search_yet": "Proovi otsida postitusi, profiile või teemaviiteid.",
"search_results.see_all": "Vaata kõiki",

View File

@ -102,6 +102,7 @@
"account.muted": "Mykistetty",
"account.muting": "Mykistetty",
"account.mutual": "Seuraatte toisianne",
"account.name.copy": "Kopioi käyttäjätunnus",
"account.name.help.domain": "{domain} on palvelin, jolla käyttäjän profiili ja julkaisut sijaitsevat.",
"account.name.help.domain_self": "{domain} on palvelin, jolla profiilisi ja julkaisusi sijaitsevat.",
"account.name.help.footer": "Aivan kuten voit lähettää sähköpostia eri sähköpostiohjelmilla, voit olla yhteydessä muihin Mastodon-palvelimiin ja kehen tahansa, joka käyttää sosiaalisen median sovelluksia, jotka toimivat samoilla säännöillä kuin Mastodon (hyödyntävät ActivityPub-protokollaa).",
@ -138,6 +139,9 @@
"account.unmute": "Kumoa käyttäjän @{name} mykistys",
"account.unmute_notifications_short": "Kumoa ilmoitusten mykistys",
"account.unmute_short": "Kumoa mykistys",
"account_edit.advanced_settings.bot_hint": "Ilmaise muille, että tili suorittaa enimmäkseen automaattisia toimia eikä sitä välttämättä valvota",
"account_edit.advanced_settings.bot_label": "Bottitili",
"account_edit.advanced_settings.title": "Edistyneet asetukset",
"account_edit.bio.add_label": "Lisää elämäkerta",
"account_edit.bio.edit_label": "Muokkaa elämäkertaa",
"account_edit.bio.placeholder": "Lisää lyhyt esittely, joka auttaa muita tunnistamaan sinut.",
@ -579,8 +583,7 @@
"dropdown.empty": "Valitse vaihtoehto",
"email_subscriptions.email": "Sähköpostiosoite",
"email_subscriptions.form.action": "Tilaa",
"email_subscriptions.form.disclaimer": "Voit peruuttaa tilauksen milloin tahansa. Jos haluat lisätietoja, katso <a>tietosuojakäytäntö</a>.",
"email_subscriptions.form.lead": "Hanki julkaisut sähköpostilaatikkoosi luomatta Mastodon-tiliä.",
"email_subscriptions.form.bottom": "Saa julkaisut Saapuneet-kansioosi luomatta Mastodon-tiliä. Peruuta tilaus milloin tahansa. Jos haluat lisätietoja, katso <a>tietosuojakäytäntö</a>.",
"email_subscriptions.form.title": "Tilaa sähköpostipäivitykset käyttäjältä {name}",
"email_subscriptions.submitted.lead": "Viimeistele sähköpostipäivitysten tilaus tarkistamalla Saapuneet-kansiosi.",
"email_subscriptions.submitted.title": "Vielä yksi vaihe",

View File

@ -102,6 +102,7 @@
"account.muted": "Masqué·e",
"account.muting": "Masqué",
"account.mutual": "Vous vous suivez mutuellement",
"account.name.copy": "Copier lidentifiant",
"account.name.help.domain": "{domain} est le serveur qui héberge le profil et les messages du compte.",
"account.name.help.domain_self": "{domain} est le serveur qui héberge votre profil et vos messages.",
"account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents logiciels de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon — et avec n'importe qui sur d'autres applications sociales propulsées par le même ensemble de règles que Mastodon utilise (le protocole ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Ne plus masquer @{name}",
"account.unmute_notifications_short": "Ne plus masquer les notifications",
"account.unmute_short": "Ne plus masquer",
"account_edit.advanced_settings.bot_hint": "Indique que le compte effectue principalement des actions automatisées et pourrait ne pas être surveillé",
"account_edit.advanced_settings.bot_label": "Compte automatisé",
"account_edit.advanced_settings.title": "Paramètres avancés",
"account_edit.bio.add_label": "Ajouter une présentation",
"account_edit.bio.edit_label": "Modifier la présentation",
"account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.",
@ -579,8 +583,7 @@
"dropdown.empty": "Sélectionner une option",
"email_subscriptions.email": "Adresse de courriel",
"email_subscriptions.form.action": "Sabonner",
"email_subscriptions.form.disclaimer": "Vous pouvez vous désabonner à tout moment. Pour plus d'informations, référez-vous à la <a>politique de confidentialité</a>.",
"email_subscriptions.form.lead": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon.",
"email_subscriptions.form.bottom": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon. Désabonnez-vous quand vous voulez. Pour plus dinformation, se référer à la <a>politique de confidentialité</a>.",
"email_subscriptions.form.title": "Abonnez-vous pour recevoir par courriel les notifications de {name}",
"email_subscriptions.submitted.lead": "Vérifiez votre boîte de réception pour finaliser de votre inscription aux notifications par courriel.",
"email_subscriptions.submitted.title": "Une dernière chose",

View File

@ -102,6 +102,7 @@
"account.muted": "Masqué·e",
"account.muting": "Masqué",
"account.mutual": "Vous vous suivez mutuellement",
"account.name.copy": "Copier lidentifiant",
"account.name.help.domain": "{domain} est le serveur qui héberge le profil et les messages du compte.",
"account.name.help.domain_self": "{domain} est le serveur qui héberge votre profil et vos messages.",
"account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents logiciels de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon — et avec n'importe qui sur d'autres applications sociales propulsées par le même ensemble de règles que Mastodon utilise (le protocole ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Ne plus masquer @{name}",
"account.unmute_notifications_short": "Réactiver les notifications",
"account.unmute_short": "Ne plus masquer",
"account_edit.advanced_settings.bot_hint": "Indique que le compte effectue principalement des actions automatisées et pourrait ne pas être surveillé",
"account_edit.advanced_settings.bot_label": "Compte automatisé",
"account_edit.advanced_settings.title": "Paramètres avancés",
"account_edit.bio.add_label": "Ajouter une présentation",
"account_edit.bio.edit_label": "Modifier la présentation",
"account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.",
@ -579,8 +583,7 @@
"dropdown.empty": "Sélectionner une option",
"email_subscriptions.email": "Adresse de courriel",
"email_subscriptions.form.action": "Sabonner",
"email_subscriptions.form.disclaimer": "Vous pouvez vous désabonner à tout moment. Pour plus d'informations, référez-vous à la <a>politique de confidentialité</a>.",
"email_subscriptions.form.lead": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon.",
"email_subscriptions.form.bottom": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon. Désabonnez-vous quand vous voulez. Pour plus dinformation, se référer à la <a>politique de confidentialité</a>.",
"email_subscriptions.form.title": "Abonnez-vous pour recevoir par courriel les notifications de {name}",
"email_subscriptions.submitted.lead": "Vérifiez votre boîte de réception pour finaliser de votre inscription aux notifications par courriel.",
"email_subscriptions.submitted.title": "Une dernière chose",

View File

@ -102,6 +102,7 @@
"account.muted": "Balbhaithe",
"account.muting": "Ag balbhaigh",
"account.mutual": "Leanann sibh a chéile",
"account.name.copy": "Láimhseáil chóipeála",
"account.name.help.domain": "Is é {domain} an freastalaí a óstálann próifíl agus poist an úsáideora.",
"account.name.help.domain_self": "Is é {domain} an freastalaí a óstálann do phróifíl agus do phoist.",
"account.name.help.footer": "Díreach mar is féidir leat ríomhphoist a sheoladh chuig daoine ag baint úsáide as cliaint ríomhphoist éagsúla, is féidir leat idirghníomhú le daoine ar fhreastalaithe Mastodon eile agus le duine ar bith ar aipeanna sóisialta eile atá faoi thiomáint ag an tsraith rialacha chéanna a úsáideann Mastodon (an prótacal ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Díbhalbhaigh @{name}",
"account.unmute_notifications_short": "Díbhalbhaigh fógraí",
"account.unmute_short": "Díbhalbhaigh",
"account_edit.advanced_settings.bot_hint": "Tabhair comhartha do dhaoine eile go ndéanann an cuntas gníomhartha uathoibrithe den chuid is mó agus nach bhféadfadh sé go ndéantar monatóireacht air",
"account_edit.advanced_settings.bot_label": "Cuntas uathoibrithe",
"account_edit.advanced_settings.title": "Socruithe ardleibhéil",
"account_edit.bio.add_label": "Cuir beathaisnéis leis",
"account_edit.bio.edit_label": "Cuir beathaisnéis in eagar",
"account_edit.bio.placeholder": "Cuir réamhrá gearr leis chun cabhrú le daoine eile tú a aithint.",
@ -577,10 +581,7 @@
"domain_pill.your_server": "Do theach digiteach, áit a bhfuil do phoist go léir ina gcónaí. Nach maith leat an ceann seo? Aistrigh freastalaithe am ar bith agus tabhair leat do leantóirí freisin.",
"domain_pill.your_username": "D'aitheantóir uathúil ar an bhfreastalaí seo. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.",
"dropdown.empty": "Roghnaigh rogha",
"email_subscriptions.email": "Seoladh ríomhphoist",
"email_subscriptions.form.action": "Liostáil",
"email_subscriptions.form.disclaimer": "Is féidir leat díliostáil ag am ar bith. Le haghaidh tuilleadh eolais, féach ar an <a>Polasaí Príobháideachais</a>.",
"email_subscriptions.form.lead": "Faigh poist i do bhosca isteach gan cuntas Mastodon a chruthú.",
"email_subscriptions.form.title": "Cláraigh le haghaidh nuashonruithe ríomhphoist ó {name}",
"email_subscriptions.submitted.lead": "Seiceáil do bhosca isteach le haghaidh ríomhphoist chun clárú le haghaidh nuashonruithe ríomhphoist a chríochnú.",
"email_subscriptions.submitted.title": "Céim amháin eile",

View File

@ -72,6 +72,7 @@
"account.in_memoriam": "Mar chuimhneachan.",
"account.joined_short": "Air ballrachd fhaighinn",
"account.languages": "Atharraich fo-sgrìobhadh nan cànan",
"account.last_active": "Gnìomhach an turas mu dheireadh",
"account.link_verified_on": "Chaidh dearbhadh cò leis a tha an ceangal seo {date}",
"account.locked_info": "Tha prìobhaideachd ghlaiste aig a chunntais seo. Nì an sealbhadair lèirmheas a làimh air cò dhfhaodas a leantainn.",
"account.media": "Meadhanan",
@ -101,6 +102,7 @@
"account.muted": "Ga mhùchadh",
"account.muting": "Ga mhùchadh",
"account.mutual": "A leantainn càch a chèile",
"account.name.copy": "Dèan lethbhreac dhen aithnichear",
"account.name.help.domain": "Is {domain} am frithealaiche a tha ag òstadh pròifil s postaichean a chleachdaiche.",
"account.name.help.domain_self": "Is {domain} am frithealaiche agad-sa a tha ag òstadh pròifil s postaichean agad-sa.",
"account.name.help.footer": "Air an aon dòigh s a chuireas tu puist-d gu daoine le cliantan puist-d eadar-dhealaichte, s urrainn dhut conaltradh le daoine air frithealaichean Mastodon eile agus le duine sam bith air aplacaidean sòisealta eile a chleachdas na h-aon riaghailtean s a chleachdas Mastodon (sin pròtacal ActivityPub).",
@ -137,6 +139,9 @@
"account.unmute": "Dì-mhùch @{name}",
"account.unmute_notifications_short": "Dì-mhùch na brathan",
"account.unmute_short": "Dì-mhùch",
"account_edit.advanced_settings.bot_hint": "Comharraich do chàch gu bheil an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dhfhaoidte nach doir duine sam bith sùil air idir",
"account_edit.advanced_settings.bot_label": "Cunntas fèin-obrachail",
"account_edit.advanced_settings.title": "Roghainnean adhartach",
"account_edit.bio.add_label": "Cuir ris roinn mu mo dhèidhinn",
"account_edit.bio.edit_label": "Deasaich an roinn mu mo dhèidhinn",
"account_edit.bio.placeholder": "Cuir thu fhèin an aithne càich gu goirid.",
@ -174,7 +179,7 @@
"account_edit.field_edit_modal.name_hint": "Can “Làrach-lìn phearsanta”",
"account_edit.field_edit_modal.name_label": "Leubail",
"account_edit.field_edit_modal.url_warning": "Airson ceangal a chur ris, gabh a-staigh {protocol} aig a thoiseach.",
"account_edit.field_edit_modal.value_hint": "Can “https://example.me”",
"account_edit.field_edit_modal.value_hint": "Can “https://example.com”",
"account_edit.field_edit_modal.value_label": "Luach",
"account_edit.field_reorder_modal.drag_cancel": "Chaidh sgur dhen t-slaodadh. Chaidh an raon “{item}” a leigeil às.",
"account_edit.field_reorder_modal.drag_end": "Chaidh an raon “{item}” a leigeil às.",
@ -231,7 +236,7 @@
"account_edit.verified_modal.invisible_link.summary": "Ciamar a dhfhalaicheas mi an ceangal?",
"account_edit.verified_modal.step1.header": "Dèan lethbhreac dhen chòd HTML gu h-ìosal is cuir e ri bann-cinn na làraich-lìn agad",
"account_edit.verified_modal.step2.details": "Ma chuir thu an làrach-lìn agad mar raon ghnàthaichte ris cheana, feumaidh tu a sguabadh às s a chur ris a-rithist airson an dearbhadh a chur gu dol.",
"account_edit.verified_modal.step2.header": "Cuir an làrach-lìn agad ris na raon gnàthaichte",
"account_edit.verified_modal.step2.header": "Cuir an làrach-lìn agad ris na raon gnàthaichte",
"account_edit.verified_modal.title": "Mar a chuireas tu ceangal dearbhte ris",
"account_edit_tags.add_tag": "Cuir #{tagName} ris",
"account_edit_tags.column_title": "Deasaich na tagaichean",
@ -373,10 +378,13 @@
"collections.delete_collection": "Sguab an cruinneachadh às",
"collections.description_length_hint": "Crìoch de 100 caractar",
"collections.detail.accounts_heading": "Cunntasan",
"collections.detail.author_added_you_on_date": "Chuir {author} ris thu {date}",
"collections.detail.loading": "A luchdadh a chruinneachaidh…",
"collections.detail.revoke_inclusion": "Thoir air falbh mi",
"collections.detail.sensitive_content": "Susbaint fhrionasach",
"collections.detail.sensitive_note": "Tha cunntasan is susbaint sa chruinneachadh seo a dhfhaodadh a bhith frionasach do chuid.",
"collections.detail.share": "Co-roinn an cruinneachadh seo",
"collections.detail.you_are_in_this_collection": "Thathar do bhrosnachadh sa chruinneachadh seo",
"collections.edit_details": "Deasaich am fiosrachadh",
"collections.error_loading_collections": "Thachair mearachd nuair a dhfheuch sinn ris a chruinneachaidhean agad a luchdadh.",
"collections.hints.accounts_counter": "{count} / {max} cunntas(an)",
@ -532,6 +540,7 @@
"content_warning.hide": "Falaich am post",
"content_warning.show": "Seall e co-dhiù",
"content_warning.show_more": "Seall barrachd dheth",
"content_warning.show_short": "Seall",
"conversation.delete": "Sguab às an còmhradh",
"conversation.mark_as_read": "Cuir comharra gun deach a leughadh",
"conversation.open": "Seall an còmhradh",
@ -572,6 +581,13 @@
"domain_pill.your_server": "Do dhachaigh dhigiteach far a bheil na postaichean uile agad a fuireach. Nach toigh leat an tè seo? Dèan imrich gu frithealaiche eile uair sam bith is thoir an luchd-leantainn agad leat cuideachd.",
"domain_pill.your_username": "Seo an t-aithnichear àraidh agad air an fhrithealaiche seo. Dhfhaoidte gu bheil luchd-cleachdaidh air a bheil an t-aon ainm air frithealaichean eile.",
"dropdown.empty": "Tagh roghainn",
"email_subscriptions.email": "Post-d",
"email_subscriptions.form.action": "Fo-sgrìobh",
"email_subscriptions.form.bottom": "Faigh postaichean sa bhogsa a-steach agad às aonais cunntais Mhastodon. Cuir crìoch air an fho-sgrìobhadh uair sam bith. Airson barrachd fiosrachaidh, faic am <a>poileasaidh prìobhaideachd</a>.",
"email_subscriptions.form.title": "Clàraich airson naidheachdan {name} fhaighinn air a phost-d",
"email_subscriptions.submitted.lead": "Thoir sùil a bheil post-d sa a bhogsa a-steach agad airson an clàradh airson naidheachdan puist-d a choileanadh.",
"email_subscriptions.submitted.title": "Aon cheum eile",
"email_subscriptions.validation.email.invalid": "Seòladh puist-d mì-dhligheach",
"embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a dèanamh lethbhreac dhen chòd gu h-ìosal.",
"embed.preview": "Seo an coltas a bhios air:",
"emoji_button.activity": "Gnìomhachd",
@ -590,6 +606,12 @@
"emoji_button.symbols": "Samhlaidhean",
"emoji_button.travel": "Siubhal ⁊ àitichean",
"empty_column.account_featured.other": "Chan eil {acct} a brosnachadh dad fhathast. An robh fios agad gur urrainn dhut na tagaichean hais a chleachdas tu as trice agus fiù s cunntasan do charaidean a bhrosnachadh air a phròifil agad?",
"empty_column.account_featured_other.no_collections_desc": "Cha do chruthaich {acct} cruinneachadh sam bith fhathast.",
"empty_column.account_featured_other.title": "Chan eil dad ri fhaicinn an-seo",
"empty_column.account_featured_self.no_collections": "Chan eil cruinneachadh ann fhathast",
"empty_column.account_featured_self.no_collections_button": "Cruthaich cruinneachadh",
"empty_column.account_featured_unknown.no_collections_desc": "Cha do chruthaich an cunntas seo cruinneachadh sam bith fhathast.",
"empty_column.account_featured_unknown.other": "Chan eil an cunntas seo a brosnachadh dad fhathast.",
"empty_column.account_hides_collections": "Chuir an cleachdaiche seo roimhe nach eil am fiosrachadh seo ri fhaighinn",
"empty_column.account_suspended": "Chaidh an cunntas a chur à rèim",
"empty_column.account_timeline": "Chan eil post an-seo!",
@ -948,7 +970,7 @@
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
"notifications.column_settings.follow": "Luchd-leantainn ùr:",
"notifications.column_settings.follow_request": "Iarrtasan leantainn ùra:",
"notifications.column_settings.group": "Buidheann",
"notifications.column_settings.group": "Buidhnich",
"notifications.column_settings.mention": "Iomraidhean:",
"notifications.column_settings.poll": "Toraidhean cunntais-bheachd:",
"notifications.column_settings.push": "Brathan putaidh",

View File

@ -102,6 +102,7 @@
"account.muted": "Acalada",
"account.muting": "Silenciamento",
"account.mutual": "Seguimento mútuo",
"account.name.copy": "Copiar identificador",
"account.name.help.domain": "{domain} é o servidor que aloxa o perfil e as publicacións da usuaria.",
"account.name.help.domain_self": "{domain} é o servidor que aloxa o teu perfil e publicacións.",
"account.name.help.footer": "Ao igual que envías correos electrónicos a persoas que usan diferentes provedores, podes interactuar con persoas en outros servidores Mastodon ― e con calquera outra que use aplicacións que sigan o mesmo sistema que usa Mastodon (o protocolo ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Deixar de silenciar a @{name}",
"account.unmute_notifications_short": "Reactivar notificacións",
"account.unmute_short": "Non silenciar",
"account_edit.advanced_settings.bot_hint": "Advirte ás usuarias de que esta conta realiza principalmente accións automatizadas e podería non estar monitorizada",
"account_edit.advanced_settings.bot_label": "Conta automatizada",
"account_edit.advanced_settings.title": "Axustes avanzados",
"account_edit.bio.add_label": "Engadir biografía",
"account_edit.bio.edit_label": "Editar biografía",
"account_edit.bio.placeholder": "Escribe unha breve presentación para que te coñezan mellor.",
@ -577,10 +581,8 @@
"domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.",
"domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.",
"dropdown.empty": "Escolle unha opción",
"email_subscriptions.email": "Enderezos de correo",
"email_subscriptions.email": "Correo electrónico",
"email_subscriptions.form.action": "Subscribirse",
"email_subscriptions.form.disclaimer": "Pódeste dar de baixa cando queiras. Para máis información le a <a>Directiva de Privacidade</a>.",
"email_subscriptions.form.lead": "Recibe as publicacións na caixa de correo sen precisar unha conta de Mastodon.",
"email_subscriptions.form.title": "Subscríbete para recibir actualizacións por correo de {name}",
"email_subscriptions.submitted.lead": "Comproba a túa caixa de correo para completar a subscrición ás actualizacións por correo.",
"email_subscriptions.submitted.title": "Un último paso",

View File

@ -577,10 +577,7 @@
"domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.",
"domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.",
"dropdown.empty": "בחירת אפשרות",
"email_subscriptions.email": "כתובת דוא\"ל",
"email_subscriptions.form.action": "הרשמה",
"email_subscriptions.form.disclaimer": "ניתן לבטל את ההרשמה בכל עת. למידע נוסף, הציצו ב<a>מדיניות הפרטיות</a>.",
"email_subscriptions.form.lead": "לקבל הודעות בדואל בלי ליצור חשבון מסטודון.",
"email_subscriptions.form.title": "הרשמה לקבלת עידכוני דואל מאת {name}",
"email_subscriptions.submitted.lead": "יש לחפש בתיבת הדואל הודעה לסיום ההרשמה לעידכונים בדואל.",
"email_subscriptions.submitted.title": "עוד שלב אחד אחרון",

View File

@ -102,6 +102,7 @@
"account.muted": "Némítva",
"account.muting": "Némítás",
"account.mutual": "Követitek egymást",
"account.name.copy": "Fióknév másolása",
"account.name.help.domain": "A(z) {domain} a kiszolgáló, amely a felhasználó profilját és bejegyzéseit szolgálja ki.",
"account.name.help.domain_self": "A(z) {domain} a kiszolgáló, amely a profilodat és bejegyzéseidet szolgálja ki.",
"account.name.help.footer": "Ahogy több különböző szolgáltatónál lévő embernek lehet e-mailt küldeni, úgy más Mastodon-kiszolgálókon lévő emberrekel is kapcsolatba lehet lépni és bárki mással is, akik ugyanazokat a szabályokat (az ActivityPub-protokollt) használó közösségimédia-alkalmazásokat használnak, mint a Mastodon.",
@ -138,6 +139,9 @@
"account.unmute": "@{name} némításának feloldása",
"account.unmute_notifications_short": "Értesítések némításának feloldása",
"account.unmute_short": "Némitás feloldása",
"account_edit.advanced_settings.bot_hint": "Jelzés másoknak, hogy ez a fiók automatikus műveleteket végez és valószínűleg nem figyeljük",
"account_edit.advanced_settings.bot_label": "Automatizált fiók",
"account_edit.advanced_settings.title": "Speciális beállítások",
"account_edit.bio.add_label": "Bemutatkozás hozzáadása",
"account_edit.bio.edit_label": "Bemutatkozás szerkesztése",
"account_edit.bio.placeholder": "Adj meg egy rövid bemutatkozást, hogy mások könnyebben megtaláljanak.",
@ -579,8 +583,7 @@
"dropdown.empty": "Válassz egy lehetőséget",
"email_subscriptions.email": "E-mail-cím",
"email_subscriptions.form.action": "Feliratkozás",
"email_subscriptions.form.disclaimer": "Bármikor leiratkozhatsz. További információkért lásd az <a>Adatvédelmi szabályzatot</a>.",
"email_subscriptions.form.lead": "Kapj bejegyzéseket a postaládádba, Mastodon-fiók létrehozása nélkül.",
"email_subscriptions.form.bottom": "Kapj bejegyzéseket a postaládádba anélkül, hogy Mastodon-fiókot hoznál létre. Bármikor leiratkozhatsz. További információkért nézd meg az <a>Adatvédelmi irányelveket</a>.",
"email_subscriptions.form.title": "Regisztrálj {name} e-mailben küldött híreiért",
"email_subscriptions.submitted.lead": "Ellenőrizd a postaládádat az e-mailes hírek regisztrációs folyamatának befejezéséhez.",
"email_subscriptions.submitted.title": "Csak még egy lépés",

View File

@ -102,6 +102,7 @@
"account.muted": "Þaggaður",
"account.muting": "Þöggun",
"account.mutual": "Þið fylgist með hvor öðrum",
"account.name.copy": "Afrita kennislóð",
"account.name.help.domain": "{domain} er netþjónninn sem hýsir upplýsingasnið um notandann og færslurnar hans.",
"account.name.help.domain_self": "{domain} er netþjónninn þinn sem hýsir upplýsingasniðið þitt og færslurnar þínar.",
"account.name.help.footer": "Rétt eins og að þú getur sent tölvupóst á fólk í gegnum mismunandi þjónustur og forrit, þá getur þú átt í samskiptum við fólk á öðrum Mastodon-netþjónum og reyndar við hverja þá sem eru á öðrum þeim samfélagsmiðlum sem nota sömu samskiptareglur og Mastodon notar (sem er ActivityPub-samskiptamátinn).",
@ -138,6 +139,9 @@
"account.unmute": "Hætta að þagga niður í @{name}",
"account.unmute_notifications_short": "Hætta að þagga í tilkynningum",
"account.unmute_short": "Hætta að þagga niður",
"account_edit.advanced_settings.bot_hint": "Merki til annarra að þessi aðgangur sé aðallega til að framkvæma sjálfvirkar aðgerðir og gæti verið án þess að hann sé vaktaður reglulega",
"account_edit.advanced_settings.bot_label": "Sjálfvirkur aðgangur",
"account_edit.advanced_settings.title": "Ítarlegar stillingar",
"account_edit.bio.add_label": "Bættu við æviágripi",
"account_edit.bio.edit_label": "Breyta æviágripi",
"account_edit.bio.placeholder": "Settu inn stutta kynningu á þér svo aðrir eigi betur með að auðkenna þig.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Stafrænt heimili þitt, þar sem allar færslur þínar eru hýstar. Kanntu ekki við þennan netþjón? Þú getur flutt þig á milli netþjóna hvenær sem er og tekið með þér alla fylgjendurna þína.",
"domain_pill.your_username": "Sértækt auðkenni þitt á þessum netþjóni. Það er mögulegt að finna notendur með sama notandanafn á mismunandi netþjónum.",
"dropdown.empty": "Veldu valkost",
"email_subscriptions.email": "Tölvupóstfang",
"email_subscriptions.email": "Tölvupóstur",
"email_subscriptions.form.action": "Gerast áskrifandi",
"email_subscriptions.form.disclaimer": "Þú getur hætt í áskrift hvenær sem er. Til að sjá nánari upplýsingar geturðu skoðað <a>Meðferð persónuupplýsinga</a>.",
"email_subscriptions.form.lead": "Fáðu færslur í pósthólfið þitt án þess að skrá þig með Mastodon-aðgang.",
"email_subscriptions.form.bottom": "Fáðu færslur í tölvupósti án þess að útbúa Mastodon-aðgang. Segðu upp áskrift hvenær sem er. Nánari upplýsingar má finna í <a>Meðferð persónuupplýsinga</a>.",
"email_subscriptions.form.title": "Skráðu þig í áskrift í tölvupósti að færslum frá {name}",
"email_subscriptions.submitted.lead": "Athugaðu hvort þér hafi borist tölvupóstur til að ljúka áskriftarferlinu.",
"email_subscriptions.submitted.title": "Eitt skref í viðbót",

View File

@ -102,6 +102,7 @@
"account.muted": "Mutato",
"account.muting": "Account silenziato",
"account.mutual": "Vi seguite a vicenda",
"account.name.copy": "Copia il nome univoco",
"account.name.help.domain": "{domain} è il server che ospita il profilo e i post dell'utente.",
"account.name.help.domain_self": "{domain} è il tuo server che ospita il tuo profilo e i post.",
"account.name.help.footer": "Proprio come puoi inviare email a persone che usano diversi client di posta elettronica, così puoi interagire con le persone su altri server Mastodon — e con chiunque utilizzi altre app social basate sulle stesse regole che Mastodon usa (il protocollo ActivityPub).",
@ -138,6 +139,9 @@
"account.unmute": "Riattiva @{name}",
"account.unmute_notifications_short": "Riattiva notifiche",
"account.unmute_short": "Attiva audio",
"account_edit.advanced_settings.bot_hint": "Segnala ad altri che l'account esegue principalmente azioni automatizzate e potrebbe non essere monitorato",
"account_edit.advanced_settings.bot_label": "Account automatizzato",
"account_edit.advanced_settings.title": "Impostazioni avanzate",
"account_edit.bio.add_label": "Aggiungi biografia",
"account_edit.bio.edit_label": "Modifica la biografia",
"account_edit.bio.placeholder": "Aggiungi una breve introduzione per aiutare gli altri a identificarti.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi follower.",
"domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.",
"dropdown.empty": "Seleziona un'opzione",
"email_subscriptions.email": "Indirizzo email",
"email_subscriptions.email": "Email",
"email_subscriptions.form.action": "Iscriviti",
"email_subscriptions.form.disclaimer": "Puoi annullare l'iscrizione in qualsiasi momento. Per ulteriori informazioni, consulta l'<a>Informativa sulla privacy</a>.",
"email_subscriptions.form.lead": "Ricevi i post nella tua casella di posta elettronica senza creare un account Mastodon.",
"email_subscriptions.form.bottom": "Ricevi i post nella tua casella di posta elettronica senza creare un account Mastodon. Puoi disiscriverti in qualsiasi momento. Per maggiori informazioni, consulta l'<a>Informativa sulla privacy</a>.",
"email_subscriptions.form.title": "Iscriviti per ricevere aggiornamenti via email da {name}",
"email_subscriptions.submitted.lead": "Controlla la tua casella di posta elettronica per completare l'iscrizione agli aggiornamenti via email.",
"email_subscriptions.submitted.title": "Ancora un passaggio",
@ -1071,7 +1074,7 @@
"relative_time.days": "{number}g",
"relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa",
"relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa",
"relative_time.full.just_now": "adesso",
"relative_time.full.just_now": "proprio ora",
"relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} fa",
"relative_time.full.seconds": "{number, plural, one {# secondo} other {# secondi}} fa",
"relative_time.hours": "{number}h",
@ -1281,11 +1284,11 @@
"terms_of_service.effective_as_of": "In vigore a partire dal giorno {date}",
"terms_of_service.title": "Termini di Servizio",
"terms_of_service.upcoming_changes_on": "Prossime modifiche nel giorno {date}",
"time_remaining.days": "{number, plural, one {# giorno} other {# giorni}} left",
"time_remaining.hours": "{number, plural, one {# ora} other {# ore}} left",
"time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} left",
"time_remaining.days": "{number, plural, one {# giorno rimanente} other {# giorni rimanenti}}",
"time_remaining.hours": "{number, plural, one {# ora rimanente} other {# ore rimanenti}}",
"time_remaining.minutes": "{number, plural, one {# minuto rimanente} other {# minuti rimanenti}}",
"time_remaining.moments": "Restano pochi istanti",
"time_remaining.seconds": "{number, plural, one {# secondo} other {# secondi}} left",
"time_remaining.seconds": "{number, plural, one {# secondo rimanente} other {# secondi rimanenti}}",
"trends.counter_by_accounts": "{count, plural, one {{count} persona} other {{count} persone}} {days, plural, one {nell'ultimo giorno} other {negli ultimi {days} giorni}}",
"trends.trending_now": "Ora in tendenza",
"ui.beforeunload": "La tua bozza andrà persa, se abbandoni Mastodon.",

View File

@ -577,10 +577,7 @@
"domain_pill.your_server": "Lí數位ê厝內底有lí所有ê PO文。無kah意Ē當轉kàu別ê服侍器koh保有跟tuè lí êl âng。.",
"domain_pill.your_username": "Lí 佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。",
"dropdown.empty": "揀選項",
"email_subscriptions.email": "電子phue地址",
"email_subscriptions.form.action": "訂",
"email_subscriptions.form.disclaimer": "Lí不管時lóng會使取消訂。其他ê資訊請參考<a>隱私權政策</a>。",
"email_subscriptions.form.lead": "無開 Mastodon ê口座mā佇電子phue ê收件箱收著PO文。",
"email_subscriptions.form.title": "訂 {name} ê電子phue更新",
"email_subscriptions.submitted.lead": "請檢查lí ê收件箱來完成訂電子批ê更新。",
"email_subscriptions.submitted.title": "上尾步",

View File

@ -574,10 +574,7 @@
"domain_pill.your_server": "Jouw digitale thuis, waar al jouw berichten zich bevinden. Is deze server toch niet naar jouw wens? Dan kun je op elk moment naar een andere server verhuizen en ook jouw volgers overbrengen.",
"domain_pill.your_username": "Jouw unieke identificatie-adres op deze server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.",
"dropdown.empty": "Selecteer een optie",
"email_subscriptions.email": "E-mailadres",
"email_subscriptions.form.action": "Abonneren",
"email_subscriptions.form.disclaimer": "Je kunt je op elk gewenst moment afmelden. Raadpleeg het <a>Privacybeleid</a> voor meer informatie.",
"email_subscriptions.form.lead": "Krijg berichten in je inbox zonder een Mastodonaccount aan te hoeven maken.",
"email_subscriptions.form.title": "Op e-mailupdates van {name} abonneren",
"email_subscriptions.submitted.lead": "Kijk in je inbox voor een e-mail waarmee je het abbonement op de e-mailupdates kunt bevestigen.",
"email_subscriptions.submitted.title": "Nog één stap",

View File

@ -102,6 +102,7 @@
"account.muted": "Målbunden",
"account.muting": "Dempa",
"account.mutual": "De fylgjer kvarandre",
"account.name.copy": "Kopier brukaradressa",
"account.name.help.domain": "{domain} er tenaren som lagrar brukarprofilen og innlegga.",
"account.name.help.domain_self": "{domain} er tenaren som lagrar brukarprofilen og innlegga dine.",
"account.name.help.footer": "På same måten som du kan senda epost til folk med ulike epostprogram og -kontoar, kan du kommunisera med folk på andre Mastodon-tenarar, og med folk på andre sosiale nettverk som samhandlar på same måte som Mastodon. Det er ActivityPub-protokollen.",
@ -138,6 +139,9 @@
"account.unmute": "Opphev demping av @{name}",
"account.unmute_notifications_short": "Opphev demping av varslingar",
"account.unmute_short": "Opphev demping",
"account_edit.advanced_settings.bot_hint": "Varsla andre om at denne kontoen for det meste er automatisert og truleg ikkje blir sjekka jamnleg",
"account_edit.advanced_settings.bot_label": "Automatisert konto",
"account_edit.advanced_settings.title": "Avanserte innstillingar",
"account_edit.bio.add_label": "Skriv om deg sjølv",
"account_edit.bio.edit_label": "Rediger bio",
"account_edit.bio.placeholder": "Skriv ei kort innleiing slik at andre kan sjå kven du er.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Din digitale heim, der alle innlegga dine bur. Liker du ikkje dette? Byt til ein ny tenar når som helst og ta med fylgjarane dine òg.",
"domain_pill.your_username": "Din unike identifikator på denne tenaren. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.",
"dropdown.empty": "Vel eit alternativ",
"email_subscriptions.email": "Epostadresse",
"email_subscriptions.email": "Epost",
"email_subscriptions.form.action": "Abonner",
"email_subscriptions.form.disclaimer": "Du kan melda deg av når som helst. Sjå <a>personvernretningslinene</a> for meir informasjon.",
"email_subscriptions.form.lead": "Få innlegg i innboksen din utan å laga ein Mastodon-konto.",
"email_subscriptions.form.bottom": "Få innlegg i innboksen din utan å laga ein Mastodon-konto. Meld deg av når du vil. Sjå <a>personvernsida</a> for meir info.",
"email_subscriptions.form.title": "Meld deg på epostoppdateringar frå {name}",
"email_subscriptions.submitted.lead": "Sjekk innboksen din for ein epost om korleis du fullfører abonnementet på epostoppdateringar.",
"email_subscriptions.submitted.title": "Eitt steg til",

View File

@ -536,10 +536,7 @@
"domain_pill.your_server": "Ваш цифровой дом, где находятся все ваши посты. Если вам не нравится этот сервер, вы можете в любое время перенести свою учётную запись на другой сервер, не теряя подписчиков.",
"domain_pill.your_username": "Ваш уникальный идентификатор на этом сервере. На разных серверах могут встречаться люди с тем же именем пользователя.",
"dropdown.empty": "Выберите вариант",
"email_subscriptions.email": "Адрес электронной почты",
"email_subscriptions.form.action": "Подписаться",
"email_subscriptions.form.disclaimer": "Вы можете отписаться в любое время. Больше информации в <a>Политике конфиденциальности</a>.",
"email_subscriptions.form.lead": "Получайте новые посты по электронной почты — для этого не нужно регистрироваться в Mastodon.",
"email_subscriptions.form.title": "Оформите email-подписку на этого пользователя",
"email_subscriptions.submitted.title": "Ещё один шаг",
"email_subscriptions.validation.email.blocked": "Почтовый сервис заблокирован",

View File

@ -138,6 +138,9 @@
"account.unmute": "Ktheji zërin @{name}",
"account.unmute_notifications_short": "Shfaqi njoftimet",
"account.unmute_short": "Çheshtoje",
"account_edit.advanced_settings.bot_hint": "Sinjalizojuni të tjerëve se llogari kryesisht kryen veprime të automatizuara dhe mund të mos vëzhgohet",
"account_edit.advanced_settings.bot_label": "Llogari e automatizuar",
"account_edit.advanced_settings.title": "Rregullime të mëtejshme",
"account_edit.bio.add_label": "Shtoni jetëshkrim",
"account_edit.bio.edit_label": "Përpunoni jetëshkrim",
"account_edit.bio.placeholder": "Shtoni një hyrje të shkurtër për të ndihmuar të tjerët tju identifikojnë.",
@ -573,10 +576,9 @@
"domain_pill.your_server": "Shtëpia juaj dixhitale, kur gjenden krejt postimet tuaja. Sju pëlqen kjo këtu? Shpërngulni shërbyes kur të doni dhe sillni edhe ndjekësit tuaj.",
"domain_pill.your_username": "Identifikuesi juja unik në këtë shërbyes. Është e mundur të gjenden përdorues me të njëjtin emër përdoruesi në shërbyes të ndryshëm.",
"dropdown.empty": "Përzgjidhni një mundësi",
"email_subscriptions.email": "Adresë email",
"email_subscriptions.email": "Email",
"email_subscriptions.form.action": "Pajtohuni",
"email_subscriptions.form.disclaimer": "Smund të shpajtoheni, në çfarëdo kohe. Për më tepër informacion, shihni te <a>Rregulla Privatësie</a>.",
"email_subscriptions.form.lead": "Merrni postime në email-in tuaj, pa krijuar një llogari Mastodon.",
"email_subscriptions.form.bottom": "Merrni postime në email-in tuaj, pa krijuar një llogari Mastodon. Shpajtohuni në çfarëdo kohe. Për më tepër informacion, shihni te <a>Rregulla Privatësie</a>.",
"email_subscriptions.form.title": "Regjistrohuni për përditësime me email nga {name}",
"email_subscriptions.submitted.lead": "Shihni te mesazhet tuaj të marrë për një email, që të përfundoni regjistrimin për përditësime me email.",
"email_subscriptions.submitted.title": "Edhe një hap",

View File

@ -72,6 +72,7 @@
"account.in_memoriam": "Till minne av.",
"account.joined_short": "Gick med",
"account.languages": "Ändra vilka språk du helst vill se i ditt flöde",
"account.last_active": "Senast aktiv",
"account.link_verified_on": "Ägarskap för denna länk kontrollerades den {date}",
"account.locked_info": "Detta konto har låst integritetsstatus. Ägaren väljer manuellt vem som kan följa det.",
"account.media": "Media",
@ -104,7 +105,14 @@
"account.name.help.domain": "{domain} är servern som är värd för användarens profil och inlägg.",
"account.name.help.domain_self": "{domain} är din server som är värd för användarens profil och inlägg.",
"account.name.help.footer": "Precis som du kan skicka e-post till personer med olika e-postklienter, du kan interagera med personer på andra Mastodon-servrar och med vem som helst på andra sociala appar som drivs av samma uppsättning regler som Mastodon använder (ActivityPub-protokollet).",
"account.name.help.header": "Ett handtag är som en e-postadress",
"account.name.help.username": "{username} är kontots användarnamn på deras server. Någon på en annan server kan ha samma användarnamn.",
"account.name.help.username_self": "{username} är ditt användarnamn på denna server. Någon på en annan server kan ha samma användarnamn.",
"account.name_info": "Vad betyder detta?",
"account.no_bio": "Ingen beskrivning angiven.",
"account.node_modal.callout": "Personlig anteckningar är endast synliga för dig.",
"account.node_modal.edit_title": "Redigera en personlig anteckning",
"account.node_modal.error_unknown": "Kunde inte spara anteckningen",
"account.node_modal.field_label": "Personlig anteckning",
"account.node_modal.save": "Spara",
"account.node_modal.title": "Lägg till en personlig anteckning",
@ -130,33 +138,47 @@
"account.unmute": "Sluta tysta @{name}",
"account.unmute_notifications_short": "Aktivera aviseringsljud",
"account.unmute_short": "Avtysta",
"account_edit.advanced_settings.title": "Avancerade inställningar",
"account_edit.bio.add_label": "Lägg till biografi",
"account_edit.bio.edit_label": "Redigera biografi",
"account_edit.bio.placeholder": "Lägg till en kort introduktion för att hjälpa andra att identifiera dig.",
"account_edit.bio.title": "Biografi",
"account_edit.bio_modal.add_title": "Lägg till biografi",
"account_edit.bio_modal.edit_title": "Redigera biografi",
"account_edit.column_button": "Klar",
"account_edit.column_title": "Redigera profil",
"account_edit.custom_fields.add_label": "Lägg till fält",
"account_edit.custom_fields.edit_label": "Redigera fält",
"account_edit.custom_fields.placeholder": "Lägg till dina pronomen, externa länkar eller något annat du vill dela.",
"account_edit.custom_fields.reorder_button": "Ändra ordning för fält",
"account_edit.custom_fields.tip_content": "Du kan enkelt lägga till trovärdighet till ditt Mastodon-konto genom att verifiera länkar till alla webbplatser du äger.",
"account_edit.custom_fields.tip_title": "Tips: Lägga till verifierade länkar",
"account_edit.custom_fields.title": "Tilläggsfält",
"account_edit.custom_fields.verified_hint": "Hur lägger jag till en verifierad länk?",
"account_edit.display_name.add_label": "Lägg till visningsnamn",
"account_edit.display_name.edit_label": "Redigera visningsnamn",
"account_edit.display_name.placeholder": "Visningsnamnet är hur ditt namn ser ut på din profil och i tidslinjer.",
"account_edit.display_name.title": "Visningsnamn",
"account_edit.featured_hashtags.edit_label": "Lägg till hashtaggar",
"account_edit.featured_hashtags.placeholder": "Hjälp andra att identifiera, och få snabb tillgång till, dina favoritämnen.",
"account_edit.featured_hashtags.title": "Utvalda hashtaggar",
"account_edit.field_actions.delete": "Radera fält",
"account_edit.field_actions.edit": "Redigera fält",
"account_edit.field_delete_modal.confirm": "Är du säker på att du vill ta bort detta tilläggsfält? Denna åtgärd kan inte ångras.",
"account_edit.field_delete_modal.delete_button": "Radera",
"account_edit.field_delete_modal.title": "Radera tilläggsfält?",
"account_edit.field_edit_modal.add_title": "Lägg till tilläggsfält",
"account_edit.field_edit_modal.discard_confirm": "Ta bort",
"account_edit.field_edit_modal.discard_message": "Du har osparade ändringar. Är du säker på att du vill ta bort dem?",
"account_edit.field_edit_modal.edit_title": "Redigera tilläggsfält",
"account_edit.field_edit_modal.length_warning": "Rekommenderad teckengräns överskrids. Mobilanvändare kanske inte ser ditt fält i sin helhet.",
"account_edit.field_edit_modal.name_hint": "T.ex. “Personlig webbplats”",
"account_edit.field_edit_modal.name_label": "Etikett",
"account_edit.field_edit_modal.url_warning": "För att lägga till en länk, vänligen inkludera {protocol} i början.",
"account_edit.field_edit_modal.value_hint": "T.ex. \"https://example.me”",
"account_edit.field_edit_modal.value_label": "Värde",
"account_edit.field_reorder_modal.drag_cancel": "Flytten avbröts. Fältet \"{item}\" släpptes.",
"account_edit.image_alt_modal.add_title": "Lägg till alternativ text",
"account_edit.image_edit.add_button": "Lägg till bild",
"account_edit.image_edit.alt_add_button": "Lägg till alternativtext",
"account_edit.image_edit.alt_edit_button": "Redigera alternativtext",
@ -440,9 +462,7 @@
"domain_pill.your_server": "Ditt digitala hem, där alla dina inlägg bor. Gillar du inte just denna? Byt server när som helst och ta med dina anhängare också.",
"domain_pill.your_username": "Din unika identifierare på denna server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.",
"dropdown.empty": "Välj ett alternativ",
"email_subscriptions.email": "E-postadress",
"email_subscriptions.form.action": "Prenumerera",
"email_subscriptions.form.lead": "Få inlägg i din inkorg utan att skapa ett Mastodon-konto.",
"email_subscriptions.submitted.title": "Ett steg kvar",
"email_subscriptions.validation.email.blocked": "Blockerad e-postleverantör",
"email_subscriptions.validation.email.invalid": "Ogiltig epostadress",

View File

@ -102,6 +102,7 @@
"account.muted": "Susturuldu",
"account.muting": "Sessize alınıyor",
"account.mutual": "Birbirinizi takip ediyorsunuz",
"account.name.copy": "İsmi Kopyala",
"account.name.help.domain": "{domain} kullanıcının profilini ve gönderilerini barındıran sunucudur.",
"account.name.help.domain_self": "{domain} profilinizi ve gönderilerinizi barındıran sunucunuzdur.",
"account.name.help.footer": "Farklı e-posta istemcileri kullanan kişilere e-posta gönderebileceğiniz gibi, diğer Mastodon sunucularındaki kişilerle ve Mastodon'un kullandığı kurallarla (ActivityPub protokolü) çalışan diğer sosyal uygulamalardaki herkesle etkileşim kurabilirsiniz.",
@ -138,6 +139,9 @@
"account.unmute": "@{name} adlı kişinin sesini aç",
"account.unmute_notifications_short": "Bildirimlerin sesini aç",
"account.unmute_short": "Susturmayı kaldır",
"account_edit.advanced_settings.bot_hint": "Bu hesap temelde otomatik eylemler gerçekleştirir ve izlenmeyebiliri diğerlerine bildir",
"account_edit.advanced_settings.bot_label": "Otomatik hesap",
"account_edit.advanced_settings.title": "Gelişmiş ayarlar",
"account_edit.bio.add_label": "Kişisel bilgi ekle",
"account_edit.bio.edit_label": "Kişisel bilgiyi düzenle",
"account_edit.bio.placeholder": "Diğerlerinin sizi tanımasına yardımcı olmak için kısa bir tanıtım ekleyin.",
@ -577,10 +581,9 @@
"domain_pill.your_server": "Dijital anasayfanız, tüm gönderilerinizin yaşadığı yerdir. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de getirin.",
"domain_pill.your_username": "Bu sunucudaki tekil tanımlayıcınız. Farklı sunucularda aynı kullanıcı adına sahip kullanıcıları bulmak mümkündür.",
"dropdown.empty": "Bir seçenek seçin",
"email_subscriptions.email": "E-posta adresi",
"email_subscriptions.email": "E-posta",
"email_subscriptions.form.action": "Abone ol",
"email_subscriptions.form.disclaimer": "İstediğiniz zaman abonelikten çıkabilirsiniz. Daha fazla bilgi için <a>Gizlilik Politikası</a> sayfasına bakabilirsiniz.",
"email_subscriptions.form.lead": "Gönderiler gelen kutunuza Mastodon hesabı oluşturmadan gelsin.",
"email_subscriptions.form.bottom": "Gönderiler Mastodon hesabı oluşturmadan e-posta kutunuza gelsin. İstediğiniz zaman aboneliğinizi iptal edebilirsiniz. Daha fazla bilgi için <a>Gizlilik Politikası</a>'na bakın.",
"email_subscriptions.form.title": "{name} kişisinin e-posta güncellemelerine kaydolun",
"email_subscriptions.submitted.lead": "E-posta güncellemelerine kaydolma işlemini tamamlamak için gelen kutunuzu kontrol edin.",
"email_subscriptions.submitted.title": "Bir adım daha",

View File

@ -577,10 +577,7 @@
"domain_pill.your_server": "Nơi lưu trữ tút của bạn. Không thích ở đây? Chuyển sang máy chủ khác và giữ nguyên người theo dõi của bạn.",
"domain_pill.your_username": "Chỉ riêng bạn trên máy chủ này. Những máy chủ khác có thể cũng có tên người dùng giống vậy.",
"dropdown.empty": "Chọn một lựa chọn",
"email_subscriptions.email": "Địa chỉ email",
"email_subscriptions.form.action": "Đăng ký",
"email_subscriptions.form.disclaimer": "Bạn có thể hủy đăng ký bất cứ lúc nào. Để biết thêm thông tin, vui lòng tham khảo <a>Chính sách bảo mật</a>.",
"email_subscriptions.form.lead": "Nhận tút trực tiếp vào hộp thư đến mà không cần tạo tài khoản Mastodon.",
"email_subscriptions.form.title": "Đăng ký nhận cập nhật qua email từ {name}",
"email_subscriptions.submitted.lead": "Kiểm tra hộp thư đến của bạn để tìm email hoàn tất đăng ký nhận thông báo qua email.",
"email_subscriptions.submitted.title": "Một bước nữa",

View File

@ -102,6 +102,7 @@
"account.muted": "已隐藏",
"account.muting": "正在静音",
"account.mutual": "你们互相关注",
"account.name.copy": "复制用户名",
"account.name.help.domain": "{domain} 是托管该用户个人资料及嘟文的服务器。",
"account.name.help.domain_self": "{domain} 是托管你的个人资料及嘟文的服务器。",
"account.name.help.footer": "就像你可以用不同的电子邮件客户端向其他人发送同样的电子邮件一般,你也可以和其他 Mastodon 服务器上的用户互动,甚至还能和与 Mastodon 采用相同规则(即 ActivityPub 协议)的其他社交软件上的任何人互动。",
@ -138,6 +139,9 @@
"account.unmute": "不再隐藏 @{name}",
"account.unmute_notifications_short": "恢复通知",
"account.unmute_short": "取消隐藏",
"account_edit.advanced_settings.bot_hint": "来自这个账号的绝大多数操作都是自动进行的,并且可能无人监控",
"account_edit.advanced_settings.bot_label": "机器人账号",
"account_edit.advanced_settings.title": "高级设置",
"account_edit.bio.add_label": "添加个人简介",
"account_edit.bio.edit_label": "编辑个人简介",
"account_edit.bio.placeholder": "添加一段简短介绍,帮助其他人认识你。",
@ -577,10 +581,9 @@
"domain_pill.your_server": "你的数字家园,你的全部嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。",
"domain_pill.your_username": "你在此服务器上的唯一标识。不同服务器上可能存在相同用户名的用户。",
"dropdown.empty": "选项",
"email_subscriptions.email": "电子邮件地址",
"email_subscriptions.email": "电子邮件",
"email_subscriptions.form.action": "订阅",
"email_subscriptions.form.disclaimer": "你可以随时退订。更多信息参见<a>隐私政策</a>。",
"email_subscriptions.form.lead": "无需注册 Mastodon 账号,在收件箱中获取嘟文。",
"email_subscriptions.form.bottom": "无需注册 Mastodon 账号,在收件箱中获取嘟文。如果想退订了你可以随时退订。更多信息参见<a>隐私政策</a>。",
"email_subscriptions.form.title": "订阅 {name} 的电子邮件推送",
"email_subscriptions.submitted.lead": "请检查你的收件箱来完成邮件订阅注册。",
"email_subscriptions.submitted.title": "最后一步",

View File

@ -102,6 +102,7 @@
"account.muted": "已靜音",
"account.muting": "靜音",
"account.mutual": "跟隨彼此",
"account.name.copy": "複製帳號",
"account.name.help.domain": "{domain} 為託管此使用者個人檔案與嘟文之伺服器。",
"account.name.help.domain_self": "{domain} 為託管您個人檔案與嘟文之伺服器。",
"account.name.help.footer": "就像是您的以不同 email 程式寄信給他人一樣,您能與其他 Mastodon 伺服器中的人們互動,並且能和使用與 Mastodon 一樣規則 (ActivityPub 協定) 的其他社群軟體上任何人互動。",
@ -138,6 +139,9 @@
"account.unmute": "解除靜音 @{name}",
"account.unmute_notifications_short": "解除靜音推播通知",
"account.unmute_short": "解除靜音",
"account_edit.advanced_settings.bot_hint": "告知他人此帳號主要執行自動化操作且可能未受人為監控",
"account_edit.advanced_settings.bot_label": "機器人帳號",
"account_edit.advanced_settings.title": "進階設定",
"account_edit.bio.add_label": "新增個人簡介",
"account_edit.bio.edit_label": "編輯個人簡介",
"account_edit.bio.placeholder": "加入一段簡短介紹以幫助其他人識別您。",
@ -577,10 +581,9 @@
"domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。",
"domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。",
"dropdown.empty": "請選擇一個選項",
"email_subscriptions.email": "電子郵件地址",
"email_subscriptions.email": "電子郵件",
"email_subscriptions.form.action": "訂閱",
"email_subscriptions.form.disclaimer": "您可以任何時候取消訂閱。欲了解更多資訊,請參考<a>隱私權政策</a>。",
"email_subscriptions.form.lead": "於不建立 Mastodon 帳號的情況下,將透過電子郵件取得嘟文。",
"email_subscriptions.form.bottom": "於不建立 Mastodon 帳號的情況下,將透過電子郵件取得嘟文。您可以任何時候取消訂閱。欲了解更多資訊,請參考<a>隱私權政策</a>。",
"email_subscriptions.form.title": "訂閱 {name} 之電子郵件通訊",
"email_subscriptions.submitted.lead": "請檢查您的收件夾以完成訂閱電子郵件通訊。",
"email_subscriptions.submitted.title": "最後一步",

View File

@ -10,6 +10,8 @@ import type {
} from 'mastodon/api_types/notifications';
import type { ApiReportJSON } from 'mastodon/api_types/reports';
import type { ApiCollectionJSON } from '../api_types/collections';
// Maximum number of avatars displayed in a notification group
// This corresponds to the max length of `group.sampleAccountIds`
export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8;
@ -87,6 +89,15 @@ export interface NotificationGroupAdminReport extends BaseNotification<'admin.re
report: Report;
}
type Collection = ApiCollectionJSON;
export interface NotificationGroupAddedToCollection extends BaseNotification<'added_to_collection'> {
collection: Collection;
}
export interface NotificationGroupCollectionUpdate extends BaseNotification<'collection_update'> {
collection: Collection;
}
export type NotificationGroup =
| NotificationGroupFavourite
| NotificationGroupReblog
@ -102,7 +113,9 @@ export type NotificationGroup =
| NotificationGroupSeveredRelationships
| NotificationGroupAdminSignUp
| NotificationGroupAdminReport
| NotificationGroupAnnualReport;
| NotificationGroupAnnualReport
| NotificationGroupAddedToCollection
| NotificationGroupCollectionUpdate;
function createReportFromJSON(reportJSON: ApiReportJSON): Report {
const { target_account, ...report } = reportJSON;
@ -249,6 +262,13 @@ export function createNotificationGroupFromNotificationJSON(
notification.moderation_warning,
),
};
case 'added_to_collection':
case 'collection_update':
return {
...group,
type: notification.type,
collection: notification.collection,
};
default:
return {
...group,

View File

@ -32,7 +32,6 @@ async function loadEmojiPolyfills() {
// Loads Vite's module preload polyfill for older browsers, but not in a Worker context.
function loadVitePreloadPolyfill() {
if (typeof document === 'undefined') return;
// @ts-expect-error -- This is a virtual module provided by Vite.
// eslint-disable-next-line import/extensions
return import('vite/modulepreload-polyfill');
}

View File

@ -8688,20 +8688,6 @@ noscript {
}
}
}
&__familiar-followers {
display: flex;
align-items: center;
gap: 10px;
margin-block: 16px;
color: var(--color-text-secondary);
a:any-link {
font-weight: 500;
text-decoration: none;
color: var(--color-text-primary);
}
}
}
.account__contents {
@ -8711,6 +8697,7 @@ noscript {
.account__details {
display: flex;
flex-wrap: wrap;
align-items: center;
column-gap: 1em;
}
@ -10679,11 +10666,6 @@ noscript {
}
&__source {
display: inline-flex;
align-items: center;
max-width: 100%;
color: var(--color-text-tertiary);
gap: 4px;
overflow: hidden;
white-space: nowrap;
cursor: help;
@ -10692,11 +10674,6 @@ noscript {
overflow: hidden;
text-overflow: ellipsis;
}
.icon {
width: 16px;
height: 16px;
}
}
}
@ -10722,11 +10699,6 @@ noscript {
}
}
.verified-badge {
font-size: 14px;
max-width: 100%;
}
.button {
display: block;
width: 100%;

View File

@ -26,6 +26,7 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity
collection_item_attributes(:accepted)
)
notify_local_user!(collection_item)
queue_delivery!(collection_item, ActivityPub::AcceptFeatureRequestSerializer)
end
@ -52,6 +53,10 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity
{ account: @featured_account, activity_uri: @json['id'], state: }
end
def notify_local_user!(collection_item)
LocalNotificationWorker.perform_async(collection_item.account_id, collection_item.id, collection_item.class.name, 'added_to_collection')
end
def queue_delivery!(collection_item, serializer)
json = JSON.generate(serialize_payload(collection_item, serializer))
ActivityPub::DeliveryWorker.perform_async(json, @featured_account.id, @account.inbox_url)

View File

@ -47,6 +47,10 @@ class CollectionItem < ApplicationRecord
update!(state: :revoked)
end
def with_local_account?
account&.local?
end
def local_item_with_remote_account?
local? && account&.remote?
end

View File

@ -33,7 +33,7 @@ class Notification < ApplicationRecord
'Quote' => :quote,
}.freeze
# Please update app/javascript/api_types/notification.ts if you change this
# Please update app/javascript/mastodon/api_types/notifications.ts if you change this
PROPERTIES = {
mention: {
filterable: true,
@ -80,6 +80,12 @@ class Notification < ApplicationRecord
quoted_update: {
filterable: false,
}.freeze,
added_to_collection: {
filterable: true,
}.freeze,
collection_update: {
filterable: false,
},
}.freeze
TYPES = PROPERTIES.keys.freeze
@ -112,6 +118,8 @@ class Notification < ApplicationRecord
belongs_to :account_warning, inverse_of: false
belongs_to :generated_annual_report, inverse_of: false
belongs_to :quote, inverse_of: :notification
belongs_to :collection_item, inverse_of: false # TODO: have an inverse?
belongs_to :collection, inverse_of: false # TODO: have an inverse?
end
validates :type, inclusion: { in: TYPES }
@ -139,6 +147,15 @@ class Notification < ApplicationRecord
end
end
def target_collection
case type
when :added_to_collection
collection_item&.collection
when :collection_update
collection
end
end
class << self
def browserable(types: [], exclude_types: [], from_account_id: nil, include_filtered: false)
requested_types = if types.empty?
@ -208,8 +225,10 @@ class Notification < ApplicationRecord
case activity_type
when 'Status'
self.from_account_id = type == :quoted_update ? activity&.quote&.quoted_account_id : activity&.account_id
when 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report', 'Quote'
when 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report', 'Quote', 'Collection'
self.from_account_id = activity&.account_id
when 'CollectionItem'
self.from_account_id = activity&.collection&.account_id
when 'Mention'
self.from_account_id = activity&.status&.account_id
when 'Account'

View File

@ -48,6 +48,7 @@ class NotificationGroup < ActiveModelSerializers::Model
delegate :type,
:target_status,
:target_collection,
:report,
:account_relationship_severance_event,
:account_warning,

View File

@ -1,5 +1,5 @@
# frozen_string_literal: true
class Search < ActiveModelSerializers::Model
attributes :accounts, :statuses, :hashtags
attributes :accounts, :statuses, :hashtags, :collections
end

View File

@ -14,9 +14,8 @@ class StatusPolicy < ApplicationPolicy
end
end
# This is about requesting a quote post, not validating it
def quote?
show? && record.quote_policy_for_account(current_account) != :denied
show? && !blocking_author? && record.quote_policy_for_account(current_account) != :denied
end
def reblog?

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
class REST::NotificationGroupSerializer < ActiveModel::Serializer
# Please update app/javascript/api_types/notification.ts when making changes to the attributes
# Please update app/javascript/mastodon/api_types/notifications.ts when making changes to the attributes
attributes :group_key, :notifications_count, :type, :most_recent_notification_id
attribute :page_min_id, if: :paginated?
@ -14,6 +14,7 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer
belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer
belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer
belongs_to :generated_annual_report, key: :annual_report, if: :annual_report_event?, serializer: REST::AnnualReportEventSerializer
belongs_to :target_collection, key: :collection, if: :collection_type?, serializer: REST::CollectionSerializer
def sample_account_ids
object.sample_accounts.pluck(:id).map(&:to_s)
@ -27,6 +28,10 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer
[:favourite, :reblog, :status, :mention, :poll, :update, :quote, :quoted_update].include?(object.type)
end
def collection_type?
[:added_to_collection, :collection_update].include?(object.type)
end
def report_type?
object.type == :'admin.report'
end

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
class REST::NotificationSerializer < ActiveModel::Serializer
# Please update app/javascript/api_types/notification.ts when making changes to the attributes
# Please update app/javascript/mastodon/api_types/notifications.ts when making changes to the attributes
attributes :id, :type, :created_at, :group_key
attribute :filtered, if: :filtered?
@ -11,6 +11,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer
belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer
belongs_to :account_relationship_severance_event, key: :event, if: :relationship_severance_event?, serializer: REST::AccountRelationshipSeveranceEventSerializer
belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer
belongs_to :target_collection, key: :collection, if: :collection_type?, serializer: REST::CollectionSerializer
def id
object.id.to_s
@ -24,6 +25,10 @@ class REST::NotificationSerializer < ActiveModel::Serializer
[:favourite, :reblog, :status, :mention, :poll, :update, :quoted_update, :quote].include?(object.type)
end
def collection_type?
[:added_to_collection, :collection_update].include?(object.type)
end
def report_type?
object.type == :'admin.report'
end

View File

@ -4,4 +4,5 @@ class REST::SearchSerializer < ActiveModel::Serializer
has_many :accounts, serializer: REST::AccountSerializer
has_many :statuses, serializer: REST::StatusSerializer
has_many :hashtags, serializer: REST::TagSerializer
has_many :collections, serializer: REST::CollectionSerializer
end

View File

@ -3,8 +3,12 @@
class ActivityPub::FetchRemoteFeaturedCollectionService < BaseService
include JsonLdHelper
def call(uri, request_id: nil, on_behalf_of: nil)
json = fetch_resource(uri, true, on_behalf_of)
def call(uri, request_id: nil, prefetched_body: nil, on_behalf_of: nil)
json = if prefetched_body.nil?
fetch_resource(uri, true, on_behalf_of)
else
body_to_json(prefetched_body, compare_id: uri)
end
return unless supported_context?(json)
return unless json['type'] == 'FeaturedCollection'

View File

@ -25,6 +25,7 @@ class ActivityPub::ProcessFeaturedCollectionService
end
process_items!
notify_about_update!
@collection
end
@ -32,6 +33,10 @@ class ActivityPub::ProcessFeaturedCollectionService
private
def notify_about_update!
NotifyOfCollectionUpdateService.new.call(@collection)
end
def truncated_summary
text = @json['summaryMap']&.values&.first || @json['summary'] || ''
text[0, Collection::DESCRIPTION_LENGTH_HARD_LIMIT]

View File

@ -11,6 +11,7 @@ class AddAccountToCollectionService
@collection_item = create_collection_item
notify_local_user if @account.local?
distribute_add_activity if @account.local?
distribute_feature_request_activity if @account.remote?
@ -24,6 +25,10 @@ class AddAccountToCollectionService
@collection.collection_items.create!(account: @account, state:)
end
def notify_local_user
LocalNotificationWorker.perform_async(@account.id, @collection_item.id, @collection_item.class.name, 'added_to_collection')
end
def distribute_add_activity
ActivityPub::AccountRawDistributionWorker.perform_async(add_activity_json, @collection.account_id)
end

View File

@ -9,6 +9,7 @@ class CreateCollectionService
@collection.save!
notify_local_users
distribute_add_activity
distribute_feature_request_activities
@ -39,6 +40,12 @@ class CreateCollectionService
end
end
def notify_local_users
@collection.collection_items.select(&:with_local_account?).each do |collection_item|
LocalNotificationWorker.perform_async(@account.id, collection_item.id, collection_item.class.name, 'added_to_collection')
end
end
def activity_json
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::AddFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
end

View File

@ -63,7 +63,7 @@ class FetchResourceService < BaseService
end
def expected_type?(json)
equals_or_includes_any?(json['type'], ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES)
equals_or_includes_any?(json['type'], ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES + %w(FeaturedCollection))
end
def process_html(response)

View File

@ -0,0 +1,21 @@
# frozen_string_literal: true
class NotifyOfCollectionUpdateService
def call(collection)
return unless significantly_changed?(collection)
collection.collection_items.includes(:account).references(:account).merge(Account.local).accepted.find_each do |collection_item|
LocalNotificationWorker.perform_async(collection_item.account_id, collection.id, collection.class.name, 'collection_update')
end
end
private
def significantly_changed?(collection)
# If the collection is brand new, we don't need to look at its members
return false if collection.previously_new_record?
# Only notify of change to description or name
%i(description description_html name).any? { |attr| collection.attribute_previously_changed?(attr) }
end
end

View File

@ -14,6 +14,8 @@ class NotifyService < BaseService
moderation_warning
severed_relationships
annual_report
added_to_collection
collection_update
).freeze
class BaseCondition
@ -21,15 +23,6 @@ class NotifyService < BaseService
NEW_FOLLOWER_THRESHOLD = 3.days.freeze
NON_FILTERABLE_TYPES = %i(
admin.sign_up
admin.report
poll
update
account_warning
annual_report
).freeze
def initialize(notification, **options)
@recipient = notification.account
@sender = notification.from_account

View File

@ -28,6 +28,10 @@ class ResolveURLService < BaseService
status = FetchRemoteStatusService.new.call(resource_url, prefetched_body: body)
authorize_with @on_behalf_of, status, :show? unless status.nil?
status
elsif type == 'FeaturedCollection' && Mastodon::Feature.collections_enabled?
collection = ActivityPub::FetchRemoteFeaturedCollectionService.new.call(resource_url, prefetched_body: body)
authorize_with @on_behalf_of, collection, :show? unless collection.nil?
collection
end
end
@ -111,9 +115,21 @@ class ResolveURLService < BaseService
Account.find_remote(username, domain)
end
when 'collections'
return unless recognized_params[:action] == 'show'
check_collection(Collection.find_by(id: recognized_params[:id]))
end
end
def check_collection(collection)
return if collection.nil?
authorize_with @on_behalf_of, collection, :show?
rescue Mastodon::NotPermittedError
nil
end
def check_local_status(status)
return if status.nil?

View File

@ -64,7 +64,7 @@ class SearchService < BaseService
end
def default_results
{ accounts: [], hashtags: [], statuses: [] }
{ accounts: [], hashtags: [], statuses: [], collections: [] }
end
def url_query?

View File

@ -7,6 +7,7 @@ class UpdateCollectionService
@collection = collection
@collection.update!(params)
notify_about_update
distribute_update_activity
end
@ -18,6 +19,10 @@ class UpdateCollectionService
ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id)
end
def notify_about_update
NotifyOfCollectionUpdateService.new.call(@collection)
end
def activity_json
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::UpdateFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
end

View File

@ -5,19 +5,4 @@
%h1= t('settings.profile')
= render partial: 'settings/shared/profile_navigation'
= simple_form_for @featured_tag, url: settings_featured_tags_path do |f|
= render 'shared/error_messages', object: @featured_tag
%p.lead= t('featured_tags.hint_html')
.fields-group
= f.input :name,
hint: featured_tags_hint(@recently_used_tags),
wrapper: :with_block_label
.actions
= f.button :button, t('featured_tags.add_new'), type: :submit
%hr.spacer/
= render collection: @featured_tags, partial: 'settings/featured_tags/featured_tag'
= render partial: 'settings/shared/profile_new_notice'

View File

@ -5,76 +5,4 @@
%h1= t('settings.profile')
= render partial: 'settings/shared/profile_navigation'
- if Mastodon::Feature.profile_redesign_enabled?
%aside.callout
= material_symbol 'info'
.content
.body
%p.title= t('edit_profile.redesign_title')
%p= t('edit_profile.redesign_body')
= link_to t('edit_profile.redesign_button'), '/profile/edit'
= simple_form_for @account, url: settings_profile_path, html: { id: :edit_profile } do |f|
= render 'shared/error_messages', object: @account
%p.lead= t('edit_profile.hint_html')
%h2= t('edit_profile.basic_information')
.fields-row
.fields-row__column.fields-row__column-6
.fields-group
= f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: Account::DISPLAY_NAME_LENGTH_LIMIT, data: { default: @account.username } }
.fields-group
= f.input :note, wrapper: :with_block_label, input_html: { maxlength: Account::NOTE_LENGTH_LIMIT }
.fields-row__column.fields-group.fields-row__column-6
.input.with_block_label
%label= t('simple_form.labels.defaults.fields')
%span.hint= t('simple_form.hints.account.fields')
= f.simple_fields_for :fields do |fields_f|
.row
= fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: Account::Field::MAX_CHARACTERS_LOCAL }
= fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: Account::Field::MAX_CHARACTERS_LOCAL }
.fields-row
.fields-row__column.fields-row__column-6
.fields-group
= f.input :avatar,
hint: t('simple_form.hints.defaults.avatar', dimensions: Account::Avatar::AVATAR_GEOMETRY, size: number_to_human_size(Account::Avatar::AVATAR_LIMIT)),
input_html: { accept: Account::Avatar::AVATAR_IMAGE_MIME_TYPES },
wrapper: :with_block_label
.fields-row__column.fields-row__column-6
.fields-group
= image_tag @account.avatar.url, class: 'fields-group__thumbnail', id: 'account_avatar-preview'
- if @account.avatar.present?
= link_to settings_profile_picture_path('avatar'), data: { method: :delete }, class: 'link-button link-button--destructive' do
= material_symbol 'delete'
= t('generic.delete')
.fields-row
.fields-row__column.fields-row__column-6
.fields-group
= f.input :header,
hint: t('simple_form.hints.defaults.header', dimensions: Account::Header::HEADER_GEOMETRY, size: number_to_human_size(Account::Header::HEADER_LIMIT)),
input_html: { accept: Account::Header::HEADER_IMAGE_MIME_TYPES },
wrapper: :with_block_label
.fields-row__column.fields-row__column-6
.fields-group
= image_tag @account.header.url, class: 'fields-group__thumbnail', id: 'account_header-preview'
- if @account.header.present?
= link_to settings_profile_picture_path('header'), data: { method: :delete }, class: 'link-button link-button--destructive' do
= material_symbol 'delete'
= t('generic.delete')
%h2= t('edit_profile.other')
.fields-group
= f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot')
.actions
= f.button :button, t('generic.save_changes'), type: :submit
= render partial: 'settings/shared/profile_new_notice'

View File

@ -0,0 +1,7 @@
%aside.callout
= material_symbol 'info'
.content
.body
%p.title= t('edit_profile.redesign_title')
%p= t('edit_profile.redesign_body')
= link_to t('edit_profile.redesign_button'), '/profile/edit'

View File

@ -5,6 +5,8 @@
%h1= t('settings.profile')
= render partial: 'settings/shared/profile_navigation'
= render partial: 'settings/shared/profile_new_notice'
.simple_form.form-section
%h2.heading-medium= t('verification.website_verification')

View File

@ -10,10 +10,8 @@ class LocalNotificationWorker
# For most notification types, only one notification should exist, and the older one is
# preferred. For updates, such as when a status is edited, the new notification
# should replace the previous ones.
if type == 'update'
Notification.where(account: receiver, activity: activity, type: 'update').in_batches.delete_all
elsif type == 'quoted_update'
Notification.where(account: receiver, activity: activity, type: 'quoted_update').in_batches.delete_all
if %w(update quoted_update collection_update).include?(type)
Notification.where(account: receiver, activity: activity, type: type).in_batches.delete_all
elsif Notification.where(account: receiver, activity: activity, type: type).any?
return
end

View File

@ -1038,9 +1038,6 @@ an:
lists: Listas
mutes: Tiens en silencio
storage: Almagazenamiento
featured_tags:
add_new: Anyadir nuevo
hint_html: "<strong>Qué son las etiquetas destacadas?</strong> S'amuestran de forma prominent en o tuyo perfil publico y permiten a los usuarios navegar per las tuyas publicacions publicas especificament baixo ixas etiquetas. Son una gran ferramienta pa fer un seguimiento de treballos creativos u prochectos a largo plazo."
filters:
contexts:
account: Perfils

View File

@ -1448,8 +1448,6 @@ ar:
your_appeal_pending: لقد قمت بتقديم طعن
your_appeal_rejected: تم رفض طعنك
edit_profile:
basic_information: معلومات أساسية
hint_html: "<strong>قم بتخصيص ما سيراه الناس في ملفك الشخصي العام وبجوار منشوراتك.</strong> من المرجح أن يتابعك أشخاص آخرون ويتفاعلون معك إن كان لديك صفحة شخصية مملوء وصورة."
other: أخرى
emoji_styles:
auto: تلقائي
@ -1489,10 +1487,8 @@ ar:
mutes: قُمتَ بكتم
storage: ذاكرة التخزين
featured_tags:
add_new: أضف واحدًا جديدا
errors:
limit: لقد قمت بالفعل بعرض الحد الأقصى من عدد الوسوم
hint_html: "<strong>ما هي الوسوم الرائجة؟</strong> يتم عرضها بشكل بارز على ملفك الشخصي العام وتسمح للناس بتصفح منشوراتك العامة على وجه التحديد تحت تلك الوسوم. وهي أداة رائعة لتتبع الأعمال الإبداعية أو المشاريع الطويلة الأجل."
filters:
contexts:
account: الملفات التعريفية

View File

@ -524,7 +524,6 @@ ast:
your_appeal_pending: Unviesti una apellación
your_appeal_rejected: Refugóse la to apellación
edit_profile:
basic_information: Información básica
other: Otres preferencies
errors:
'400': La solicitú qu'unviesti nun yera válida o yera incorreuta.
@ -554,8 +553,6 @@ ast:
domain_blocks: Dominios bloquiaos
lists: Llistes
storage: Almacenamientu multimedia
featured_tags:
add_new: Amestar
filters:
contexts:
account: Perfiles

View File

@ -170,9 +170,6 @@ az:
confirm_password: Kimliyinizi doğrulamaq üçün hazırkı parolunuzu daxil edin
proceed: Hesabı sil
success_msg: Hesabınız uğurla silindi
edit_profile:
basic_information: Təməl məlumatlar
hint_html: "<strong>İnsanların hər kəsə açıq profilinizdə və göndərişlərinizin yanında nə göstərmək istədiyinizi özəlləşdirin.</strong> Doldurulmuş bir profilə və bir profil şəklinə sahib olduğunuz zaman digər şəxslərin sizi izləmə və sizinlə əlaqə qurma ehtimalı yüksəkdir."
exports:
archive_takeout:
hint_html: "<strong>Göndərişlərinizin və yüklədiyiniz medianın</strong> bir arxivini tələb edə bilərsiniz. Xaricə köçürülmüş verilər, istənilən uyumlu yazılım tərəfindən oxuna bilən ActivityPub formatında olacaq. Hər 7 gündə bir dəfə arxiv tələb edə bilərsiniz."

View File

@ -1460,8 +1460,6 @@ be:
your_appeal_pending: Вы адправілі апеляцыю
your_appeal_rejected: Ваша абскарджанне было адхілена
edit_profile:
basic_information: Асноўная інфармацыя
hint_html: "<strong>Наладзьце тое, што людзі будуць бачыць у вашым профілі і побач з вашымі паведамленнямі.</strong> Іншыя людзі з большай верагоднасцю будуць сачыць і ўзаемадзейнічаць з вамі, калі ў вас ёсць запоўнены профіль і фота профілю."
other: Іншае
redesign_body: Рэдагаванне профілю цяпер даступнае наўпрост са старонкі профілю.
redesign_button: Перайсці туды
@ -1538,10 +1536,8 @@ be:
mutes: Уліковыя запісы, якія вы ігнаруеце
storage: Медыясховішча
featured_tags:
add_new: Дадаць новы
errors:
limit: Вы ўжо дадалі максімальную колькасць хэштэгаў
hint_html: "<strong>Што такое выбраныя хэштэгі?</strong> Яны паказваюцца на бачным месцы вашага профілю і дазваляюць людзям праглядаць вашыя публічныя пасты з гэтымі хэштэгамі. З іхняй дапамогай вельмі зручна сачыць за творчымі ці даўгатэрміновымі праектамі."
filters:
contexts:
account: Профілі

View File

@ -1361,8 +1361,6 @@ bg:
your_appeal_pending: Подадохте обжалване
your_appeal_rejected: Вашето обжалване е отхвърлено
edit_profile:
basic_information: Основна информация
hint_html: "<strong>Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви.</strong> Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила."
other: Друго
emoji_styles:
auto: Автоматично
@ -1402,10 +1400,8 @@ bg:
mutes: Заглушавания
storage: Съхранение на мултимедия
featured_tags:
add_new: Добавяне на нов
errors:
limit: Вече достигнахте максималния брой хаштагове
hint_html: "<strong>Изтъкнете най-важните си хаштагове на профила?</strong> Чудесен инструмент за организиране на вашите творби и дългосрочни проекти, изтъкнатите хаштагове са отчетливо видими на вашия профил и позволяват лесен достъп до вашите собствени публикации."
filters:
contexts:
account: Профили

View File

@ -584,7 +584,6 @@ br:
none: Diwall
suspend: Astaliñ ar gont
edit_profile:
basic_information: Titouroù diavaez
other: All
emoji_styles:
auto: Emgefreek
@ -598,8 +597,6 @@ br:
bookmarks: Sinedoù
csv: CSV
lists: Listennoù
featured_tags:
add_new: Ouzhpennañ unan nevez
filters:
contexts:
account: Profiloù

View File

@ -1376,8 +1376,6 @@ ca:
your_appeal_pending: Has enviat una apel·lació
your_appeal_rejected: La teva apel·lació ha estat rebutjada
edit_profile:
basic_information: Informació bàsica
hint_html: "<strong>Personalitza el que la gent veu en el teu perfil públic i a prop dels teus tuts..</strong> És més probable que altres persones et segueixin i interaccionin amb tu quan tens emplenat el teu perfil i amb la teva imatge."
other: Altres
emoji_styles:
auto: Automàtic
@ -1417,10 +1415,8 @@ ca:
mutes: Persones silenciades
storage: Emmagatzematge
featured_tags:
add_new: Afegeix-ne una de nova
errors:
limit: Ja has mostrat la quantitat màxima d'etiquetes
hint_html: "<strong>Què son les etiquetes destacades?</strong> Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per els teus tuts gràcies a aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini."
filters:
contexts:
account: Perfils

View File

@ -670,9 +670,6 @@ ckb:
lists: لیستەکان
mutes: هەژمارە بێدەنگ کراوە
storage: هەمارگەی میدیا
featured_tags:
add_new: زیادکردنی نوێ
hint_html: "<strong> هاشتاگی تایبەت چییە؟</strong> بە شێوەیەکی دیار نیشان دەدرێت لەسەر پرۆفایلی گشتی و ڕێگە بە خەڵک دەدات بۆ گەڕان لە نووسراوە گشتیەکانت بە تایبەتی لەژێر ئەو هاشتاگە. ئامرازێکی زۆر باشن بۆ پاراستنی کاری داهێنەرانە یان پڕۆژەی درێژخایەنی ئێوە."
filters:
contexts:
account: پرۆفایلەکان

View File

@ -629,9 +629,6 @@ co:
lists: Liste
mutes: Piattate
storage: I vostri media
featured_tags:
add_new: Aghjunghje
hint_html: "<strong>Quale sò i hashtag in mostra?</strong> Sò messi in vista nant'à u vostru prufile pubblicu è permettenu à a ghjente di vede i vostri statuti ch'annu stu hashtag. Sò una bona manere di mustrà e vostre opere creative o i prughjetti à longu termine."
filters:
contexts:
account: Prufili

View File

@ -1449,8 +1449,6 @@ cs:
your_appeal_pending: Podali jste odvolání
your_appeal_rejected: Vaše odvolání bylo zamítnuto
edit_profile:
basic_information: Základní informace
hint_html: "<strong>Nastavte si, co lidé uvidí na vašem veřejném profilu a vedle vašich příspěvků.</strong> Ostatní lidé vás budou spíše sledovat a komunikovat s vámi, když budete mít vyplněný profil a profilový obrázek."
other: Další
emoji_styles:
auto: Auto
@ -1490,10 +1488,8 @@ cs:
mutes: Skrýváte
storage: Úložiště médií
featured_tags:
add_new: Přidat nový
errors:
limit: Již jste zvýraznili maximální počet hashtagů
hint_html: "<strong>Co jsou zvýrazněné hashtagy?</strong> Zobrazují se prominentně na vašem veřejném profilu a dovolují lidem prohlížet si vaše veřejné příspěvky konkrétně pod těmi hashtagy. Je to skvělý nástroj pro sledování kreativních děl nebo dlouhodobých projektů."
filters:
contexts:
account: Profily

View File

@ -1497,8 +1497,6 @@ cy:
your_appeal_pending: Rydych wedi cyflwyno apêl
your_appeal_rejected: Mae eich apêl wedi'i gwrthod
edit_profile:
basic_information: Gwybodaeth Sylfaenol
hint_html: "<strong>Addaswch yr hyn y mae pobl yn ei weld ar eich proffil cyhoeddus ac wrth ymyl eich postiadau.</strong> Mae pobl eraill yn fwy tebygol o'ch dilyn yn ôl a rhyngweithio â chi pan fydd gennych broffil wedi'i lenwi a llun proffil."
other: Arall
emoji_styles:
auto: Awto
@ -1538,10 +1536,8 @@ cy:
mutes: Rydych chi'n anwybyddu
storage: Storfa cyfryngau
featured_tags:
add_new: Ychwanegu
errors:
limit: Rydych chi eisoes wedi cynnwys y nifer mwyaf o hashnodau
hint_html: "<strong>Beth yw hashnodau dan sylw?</strong> Maen nhw'n cael eu dangos yn amlwg ar eich proffil cyhoeddus ac yn caniatáu i bobl bori'ch postiadau cyhoeddus yn benodol o dan yr hashnodau hynny. Maen nhw'n arf gwych ar gyfer cadw golwg ar weithiau creadigol neu brojectau tymor hir."
filters:
contexts:
account: Proffilau

View File

@ -1418,8 +1418,6 @@ da:
your_appeal_pending: Du har indgivet en appel
your_appeal_rejected: Din appel er afvist
edit_profile:
basic_information: Oplysninger
hint_html: "<strong>Tilpas, hvad folk ser på din offentlige profil og ved siden af dine indlæg.</strong> Andre personer er mere tilbøjelige til at følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede."
other: Andre
redesign_body: Profilredigering kan nu tilgås direkte fra profilsiden.
redesign_button: Gå dertil
@ -1494,10 +1492,8 @@ da:
mutes: Du skjuler
storage: Medielagerplads
featured_tags:
add_new: Tilføj nyt
errors:
limit: Det maksimale antal hashtags er allerede fremhævet
hint_html: "<strong>Hvad er fremhævede hashtags?</strong> De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter."
filters:
contexts:
account: Profiler

View File

@ -1417,8 +1417,6 @@ de:
your_appeal_pending: Du hast Einspruch erhoben
your_appeal_rejected: Dein Einspruch wurde abgelehnt
edit_profile:
basic_information: Allgemeine Informationen
hint_html: "<strong>Bestimme, was andere auf deinem öffentlichen Profil und neben deinen Beiträgen sehen können.</strong> Wenn du ein Profilbild festlegst und dein Profil vervollständigst, werden andere eher mit dir interagieren und dir folgen."
other: Andere
redesign_body: Dein Profil kannst du jetzt direkt auf deiner Profilseite bearbeiten.
redesign_button: Loslegen
@ -1484,10 +1482,8 @@ de:
mutes: Stummgeschaltete Profile
storage: Medienspeicher
featured_tags:
add_new: Neuen hinzufügen
errors:
limit: Du hast bereits die maximale Anzahl an Hashtags erreicht
hint_html: "<strong>Präsentiere deine wichtigsten Hashtags auf deinem Profil.</strong> Vorgestellte Hashtags verschaffen einen Überblick über deine kreativen Werke und langfristigen Projekte. Sie werden gut sichtbar auf deinem Profil angezeigt und ermöglichen einen schnellen Zugriff auf deine eigenen Beiträge."
filters:
contexts:
account: Profile

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