Merge commit '64629eadb71afab79a741b016dc56a8bdf1d46f2' into glitch-soc/merge-upstream

This commit is contained in:
Claire
2026-03-10 18:04:32 +01:00
57 changed files with 755 additions and 253 deletions

View File

@@ -50,6 +50,8 @@ You can contribute in the following ways:
Please review the org-level [contribution guidelines] for high-level acceptance
criteria guidance and the [DEVELOPMENT] guide for environment-specific details.
You should also read the project's [AI Contribution Policy] to understand how we approach
AI-assisted contributions.
## API Changes and Additions
@@ -80,7 +82,7 @@ reviewed and merged into the codebase.
Our time is limited and PRs making large, unsolicited changes are unlikely to
get a response. Changes which link to an existing confirmed issue, or which come
from a "help wanted" issue or other request are more likely to be reviewed.
from a "help wanted" issue or other request, are more likely to be reviewed.
The smaller and more narrowly focused the changes in a PR are, the easier they
are to review and potentially merge. If the change only makes sense in some
@@ -130,3 +132,4 @@ and API docs. Improvements are made via PRs to the [documentation repository].
[keepachangelog]: https://keepachangelog.com/en/1.0.0/
[Mastodon documentation]: https://docs.joinmastodon.org
[SECURITY]: SECURITY.md
[AI Contribution Policy]: https://github.com/mastodon/.github/blob/main/AI_POLICY.md

View File

@@ -39,18 +39,57 @@ const findLink = (rel: string, data: unknown): JRDLink | undefined => {
}
};
const findTemplateLink = (data: unknown) =>
findLink('http://ostatus.org/schema/1.0/subscribe', data)?.template;
const intentParams = (intent: string) => {
switch (intent) {
case 'follow':
return ['https://w3id.org/fep/3b86/Follow', 'object'] as [string, string];
case 'reblog':
return ['https://w3id.org/fep/3b86/Announce', 'object'] as [
string,
string,
];
case 'favourite':
return ['https://w3id.org/fep/3b86/Like', 'object'] as [string, string];
case 'vote':
case 'reply':
return ['https://w3id.org/fep/3b86/Object', 'object'] as [string, string];
default:
return null;
}
};
const findTemplateLink = (data: unknown, intent: string) => {
const [needle, param] = intentParams(intent) ?? [
'http://ostatus.org/schema/1.0/subscribe',
'uri',
];
const match = findLink(needle, data);
if (match) {
return [match.template, param] as [string, string];
}
const fallback = findLink('http://ostatus.org/schema/1.0/subscribe', data);
if (fallback) {
return [fallback.template, 'uri'] as [string, string];
}
return [null, null];
};
const fetchInteractionURLSuccess = (
uri_or_domain: string,
template: string,
param: string,
) => {
window.parent.postMessage(
{
type: 'fetchInteractionURL-success',
uri_or_domain,
template,
param,
},
window.origin,
);
@@ -74,7 +113,7 @@ const isValidDomain = (value: unknown) => {
};
// Attempt to find a remote interaction URL from a domain
const fromDomain = (domain: string) => {
const fromDomain = (domain: string, intent: string) => {
const fallbackTemplate = `https://${domain}/authorize_interaction?uri={uri}`;
axios
@@ -82,17 +121,21 @@ const fromDomain = (domain: string) => {
params: { resource: `https://${domain}` },
})
.then(({ data }) => {
const template = findTemplateLink(data);
fetchInteractionURLSuccess(domain, template ?? fallbackTemplate);
const [template, param] = findTemplateLink(data, intent);
fetchInteractionURLSuccess(
domain,
template ?? fallbackTemplate,
param ?? 'uri',
);
return;
})
.catch(() => {
fetchInteractionURLSuccess(domain, fallbackTemplate);
fetchInteractionURLSuccess(domain, fallbackTemplate, 'uri');
});
};
// Attempt to find a remote interaction URL from an arbitrary URL
const fromURL = (url: string) => {
const fromURL = (url: string, intent: string) => {
const domain = new URL(url).host;
const fallbackTemplate = `https://${domain}/authorize_interaction?uri={uri}`;
@@ -101,17 +144,21 @@ const fromURL = (url: string) => {
params: { resource: url },
})
.then(({ data }) => {
const template = findTemplateLink(data);
fetchInteractionURLSuccess(url, template ?? fallbackTemplate);
const [template, param] = findTemplateLink(data, intent);
fetchInteractionURLSuccess(
url,
template ?? fallbackTemplate,
param ?? 'uri',
);
return;
})
.catch(() => {
fromDomain(domain);
fromDomain(domain, intent);
});
};
// Attempt to find a remote interaction URL from a `user@domain` string
const fromAcct = (acct: string) => {
const fromAcct = (acct: string, intent: string) => {
acct = acct.replace(/^@/, '');
const segments = acct.split('@');
@@ -134,25 +181,29 @@ const fromAcct = (acct: string) => {
params: { resource: `acct:${acct}` },
})
.then(({ data }) => {
const template = findTemplateLink(data);
fetchInteractionURLSuccess(acct, template ?? fallbackTemplate);
const [template, param] = findTemplateLink(data, intent);
fetchInteractionURLSuccess(
acct,
template ?? fallbackTemplate,
param ?? 'uri',
);
return;
})
.catch(() => {
// TODO: handle host-meta?
fromDomain(domain);
fromDomain(domain, intent);
});
};
const fetchInteractionURL = (uri_or_domain: string) => {
const fetchInteractionURL = (uri_or_domain: string, intent: string) => {
if (uri_or_domain === '') {
fetchInteractionURLFailure();
} else if (/^https?:\/\//.test(uri_or_domain)) {
fromURL(uri_or_domain);
fromURL(uri_or_domain, intent);
} else if (uri_or_domain.includes('@')) {
fromAcct(uri_or_domain);
fromAcct(uri_or_domain, intent);
} else {
fromDomain(uri_or_domain);
fromDomain(uri_or_domain, intent);
}
};
@@ -172,8 +223,10 @@ window.addEventListener('message', (event: MessageEvent<unknown>) => {
'type' in event.data &&
event.data.type === 'fetchInteractionURL' &&
'uri_or_domain' in event.data &&
typeof event.data.uri_or_domain === 'string'
typeof event.data.uri_or_domain === 'string' &&
'intent' in event.data &&
typeof event.data.intent === 'string'
) {
fetchInteractionURL(event.data.uri_or_domain);
fetchInteractionURL(event.data.uri_or_domain, event.data.intent);
}
});

View File

@@ -0,0 +1,80 @@
import { IntlProvider } from 'react-intl';
import { render, screen } from '@testing-library/react';
import { ShortNumber } from '../short_number';
function renderShortNumber(value: number) {
return render(
<IntlProvider locale='en'>
<ShortNumber value={value} />
</IntlProvider>,
);
}
describe('ShortNumber Component', () => {
it('does not abbreviate numbers under 1000', () => {
renderShortNumber(999);
expect(screen.getByText('999')).toBeDefined();
});
it('formats thousands correctly for 1000', () => {
renderShortNumber(1000);
expect(screen.getByText('1K')).toBeDefined();
});
it('truncates decimals for 1051', () => {
renderShortNumber(1051);
expect(screen.getByText('1K')).toBeDefined();
});
it('truncates decimals for 2999', () => {
renderShortNumber(2999);
expect(screen.getByText('2.9K')).toBeDefined();
});
it('truncates decimals for 9999', () => {
renderShortNumber(9999);
expect(screen.getByText('9.9K')).toBeDefined();
});
it('truncates decimals for 10501', () => {
renderShortNumber(10501);
expect(screen.getByText('10K')).toBeDefined();
});
it('truncates decimals for 11000', () => {
renderShortNumber(11000);
expect(screen.getByText('11K')).toBeDefined();
});
it('truncates decimals for 99999', () => {
renderShortNumber(99999);
expect(screen.getByText('99K')).toBeDefined();
});
it('truncates decimals for 100501', () => {
renderShortNumber(100501);
expect(screen.getByText('100K')).toBeDefined();
});
it('truncates decimals for 101000', () => {
renderShortNumber(101000);
expect(screen.getByText('101K')).toBeDefined();
});
it('truncates decimals for 999999', () => {
renderShortNumber(999999);
expect(screen.getByText('999K')).toBeDefined();
});
it('truncates decimals for 2999999', () => {
renderShortNumber(2999999);
expect(screen.getByText('2.9M')).toBeDefined();
});
it('truncates decimals for 9999999', () => {
renderShortNumber(9999999);
expect(screen.getByText('9.9M')).toBeDefined();
});
});

View File

@@ -92,6 +92,7 @@ export const FollowButton: React.FC<{
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'follow',
accountId: accountId,
url: account?.url,
},

View File

@@ -110,6 +110,7 @@ export const Poll: React.FC<PollProps> = ({ pollId, disabled, status }) => {
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'vote',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},

View File

@@ -17,6 +17,9 @@ import { isDevelopment } from 'mastodon/utils/environment';
interface MastodonLocationState {
fromMastodon?: boolean;
mastodonModalKey?: string;
// Prevent the rightmost column in advanced UI from scrolling
// into view on location changes
preventMultiColumnAutoScroll?: string;
}
export type LocationState = MastodonLocationState | null | undefined;

View File

@@ -51,6 +51,7 @@ const ShortNumberCounter: React.FC<ShortNumberCounterProps> = ({ value }) => {
<FormattedNumber
value={rawNumber ?? 0}
maximumFractionDigits={maxFractionDigits}
roundingMode='trunc'
/>
);

View File

@@ -47,6 +47,7 @@ const StandaloneBoostButton: FC<ReblogButtonProps> = ({ status, counters }) => {
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'reblog',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
@@ -120,6 +121,7 @@ const BoostOrQuoteMenu: FC<ReblogButtonProps> = ({ status, counters }) => {
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'reblog',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},

View File

@@ -124,7 +124,7 @@ class StatusActionBar extends ImmutablePureComponent {
if (signedIn) {
this.props.onReply(this.props.status);
} else {
this.props.onInteractionModal(this.props.status);
this.props.onInteractionModal(this.props.status, 'reply');
}
};
@@ -146,7 +146,7 @@ class StatusActionBar extends ImmutablePureComponent {
if (signedIn) {
this.props.onFavourite(this.props.status);
} else {
this.props.onInteractionModal(this.props.status);
this.props.onInteractionModal(this.props.status, 'favourite');
}
};
@@ -382,7 +382,7 @@ class StatusActionBar extends ImmutablePureComponent {
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
const shouldShowQuoteRemovalHint = isQuotingMe && contextType === 'notifications';
return (

View File

@@ -77,7 +77,7 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
onReblog (status, e) {
dispatch(toggleReblog(status.get('id'), e.shiftKey));
},
onQuote (status) {
dispatch(quoteComposeById(status.get('id')));
},
@@ -231,10 +231,11 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
dispatch(deployPictureInPicture({statusId: status.get('id'), accountId: status.getIn(['account', 'id']), playerType: type, props: mediaProps}));
},
onInteractionModal (status) {
onInteractionModal (status, intent) {
dispatch(openModal({
modalType: 'INTERACTION',
modalProps: {
intent,
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},

View File

@@ -103,7 +103,11 @@ const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({
);
}
if (featuredTags.isEmpty() && featuredAccountIds.isEmpty()) {
if (
featuredTags.isEmpty() &&
featuredAccountIds.isEmpty() &&
listedCollections.length === 0
) {
return (
<AccountFeaturedWrapper accountId={accountId}>
<EmptyMessage

View File

@@ -25,6 +25,8 @@ const messages = defineMessages({
},
});
type InteractionIntent = 'follow' | 'reblog' | 'favourite' | 'reply' | 'vote';
interface LoginFormMessage {
type:
| 'fetchInteractionURL'
@@ -32,6 +34,8 @@ interface LoginFormMessage {
| 'fetchInteractionURL-success';
uri_or_domain: string;
template?: string;
param?: string;
intent?: InteractionIntent;
}
const PERSISTENCE_KEY = 'mastodon_home';
@@ -110,7 +114,11 @@ const isValueValid = (value: string) => {
}
};
const sendToFrame = (frame: HTMLIFrameElement | null, value: string): void => {
const sendToFrame = (
frame: HTMLIFrameElement | null,
value: string,
intent: string,
): void => {
if (valueToDomain(value.trim()) === localDomain) {
window.location.href = '/auth/sign_in';
return;
@@ -120,6 +128,7 @@ const sendToFrame = (frame: HTMLIFrameElement | null, value: string): void => {
{
type: 'fetchInteractionURL',
uri_or_domain: value.trim(),
intent,
},
window.origin,
);
@@ -127,7 +136,8 @@ const sendToFrame = (frame: HTMLIFrameElement | null, value: string): void => {
const LoginForm: React.FC<{
resourceUrl: string;
}> = ({ resourceUrl }) => {
intent: string;
}> = ({ resourceUrl, intent }) => {
const intl = useIntl();
const [value, setValue] = useState(
localStorage.getItem(PERSISTENCE_KEY) ?? '',
@@ -161,7 +171,7 @@ const LoginForm: React.FC<{
try {
const url = new URL(
event.data.template.replace(
'{uri}',
`{${event.data.param}}`,
encodeURIComponent(resourceUrl),
),
);
@@ -242,8 +252,8 @@ const LoginForm: React.FC<{
const handleSubmit = useCallback(() => {
setIsSubmitting(true);
sendToFrame(iframeRef.current, value);
}, [setIsSubmitting, value]);
sendToFrame(iframeRef.current, value, intent);
}, [setIsSubmitting, value, intent]);
const handleFocus = useCallback(() => {
setExpanded(true);
@@ -287,7 +297,7 @@ const LoginForm: React.FC<{
setError(false);
setValue(selectedOptionValue);
setIsSubmitting(true);
sendToFrame(iframeRef.current, selectedOptionValue);
sendToFrame(iframeRef.current, selectedOptionValue, intent);
}
break;
@@ -300,6 +310,7 @@ const LoginForm: React.FC<{
setValue,
selectedOption,
options,
intent,
],
);
@@ -318,9 +329,9 @@ const LoginForm: React.FC<{
setValue(option);
setError(false);
setIsSubmitting(true);
sendToFrame(iframeRef.current, option);
sendToFrame(iframeRef.current, option, intent);
},
[options, setSelectedOption, setValue, setError],
[options, setSelectedOption, setValue, setError, intent],
);
const domain = (valueToDomain(value) ?? '').trim();
@@ -404,7 +415,8 @@ const LoginForm: React.FC<{
const InteractionModal: React.FC<{
accountId: string;
url: string;
}> = ({ accountId, url }) => {
intent: string;
}> = ({ accountId, url, intent }) => {
const dispatch = useAppDispatch();
const signupUrl = useAppSelector(
(state) =>
@@ -479,7 +491,7 @@ const InteractionModal: React.FC<{
</p>
</div>
<LoginForm resourceUrl={url} />
<LoginForm resourceUrl={url} intent={intent} />
<p>
<FormattedMessage

View File

@@ -86,6 +86,7 @@ export const Footer: React.FC<{
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'reply',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
@@ -106,6 +107,7 @@ export const Footer: React.FC<{
openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'favourite',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},

View File

@@ -190,6 +190,7 @@ class Status extends ImmutablePureComponent {
dispatch(openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'favourite',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
@@ -219,6 +220,7 @@ class Status extends ImmutablePureComponent {
dispatch(openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'reply',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
@@ -236,6 +238,7 @@ class Status extends ImmutablePureComponent {
dispatch(openModal({
modalType: 'INTERACTION',
modalProps: {
intent: 'reblog',
accountId: status.getIn(['account', 'id']),
url: status.get('uri'),
},
@@ -255,7 +258,12 @@ class Status extends ImmutablePureComponent {
const { dispatch, history } = this.props;
const handleDeleteSuccess = () => {
history.push('/');
history.push('/', {
// Preventing the default "scroll to right" on
// location change in advanced UI to avoid conflict
// with the composer being focused
preventMultiColumnAutoScroll: true
});
};
if (!deleteModal) {
@@ -269,13 +277,13 @@ class Status extends ImmutablePureComponent {
// Error handling - could show error message
});
} else {
dispatch(openModal({
modalType: 'CONFIRM_DELETE_STATUS',
modalProps: {
statusId: status.get('id'),
dispatch(openModal({
modalType: 'CONFIRM_DELETE_STATUS',
modalProps: {
statusId: status.get('id'),
withRedraft,
onDeleteSuccess: handleDeleteSuccess
}
}
}));
}
};
@@ -493,7 +501,7 @@ class Status extends ImmutablePureComponent {
// Only highlight replies after the initial load
if (prevProps.descendantsIds.length && isSameStatus) {
const newRepliesIds = difference(descendantsIds, prevProps.descendantsIds);
if (newRepliesIds.length) {
this.setState({newRepliesIds});
}
@@ -626,7 +634,7 @@ class Status extends ImmutablePureComponent {
</Hotkeys>
{descendants}
<RefreshController
isLocal={isLocal}
statusId={status.get('id')}

View File

@@ -136,7 +136,9 @@ class SwitchingColumnsArea extends PureComponent {
}
handleChildrenContentChange() {
if (!this.props.singleColumn) {
const {preventMultiColumnAutoScroll} = this.props.location.state ?? {};
if (!this.props.singleColumn && !preventMultiColumnAutoScroll) {
const isRtlLayout = document.getElementsByTagName('body')[0]
?.classList.contains('rtl');
const modifier = isRtlLayout ? -1 : 1;
@@ -156,24 +158,23 @@ class SwitchingColumnsArea extends PureComponent {
const { signedIn } = this.props.identity;
const pathName = this.props.location.pathname;
let redirect;
let rootRedirect;
if (signedIn) {
if (forceOnboarding) {
redirect = <Redirect from='/' to='/start' exact />;
rootRedirect = '/start';
} else if (singleColumn) {
redirect = <Redirect from='/' to='/home' exact />;
rootRedirect = '/home';
} else {
redirect = <Redirect from='/' to='/deck/getting-started' exact />;
rootRedirect = '/deck/getting-started';
}
} else if (singleUserMode && owner && initialState?.accounts[owner]) {
redirect = <Redirect from='/' to={`/@${initialState.accounts[owner].username}`} exact />;
rootRedirect = `/@${initialState.accounts[owner].username}`;
} else if (trendsEnabled && landingPage === 'trends') {
redirect = <Redirect from='/' to='/explore' exact />;
rootRedirect = '/explore';
} else if (localLiveFeedAccess === 'public' && landingPage === 'local_feed') {
redirect = <Redirect from='/' to='/public/local' exact />;
rootRedirect = '/public/local';
} else {
redirect = <Redirect from='/' to='/about' exact />;
rootRedirect = '/about';
}
const profileRedesignRoutes = [];
@@ -194,7 +195,7 @@ class SwitchingColumnsArea extends PureComponent {
<ColumnsContextProvider multiColumn={!singleColumn}>
<ColumnsArea ref={this.setRef} singleColumn={singleColumn}>
<WrappedSwitch>
{redirect}
<Redirect from='/' to={{pathname: rootRedirect, state: this.props.location.state}} exact />
{singleColumn ? <Redirect from='/deck' to='/home' exact /> : null}
{singleColumn && pathName.startsWith('/deck/') ? <Redirect from={pathName} to={{...this.props.location, pathname: pathName.slice(5)}} /> : null}

View File

@@ -28,6 +28,7 @@
"account.featured_tags.last_status_never": "Nun hai nenguna publicación",
"account.follow": "Siguir",
"account.follow_back": "Siguir tamién",
"account.follow_request_short": "Solicitú",
"account.followers": "Siguidores",
"account.followers.empty": "Naide sigue a esti perfil.",
"account.following": "Siguiendo",
@@ -43,6 +44,7 @@
"account.mute": "Desactivar los avisos de @{name}",
"account.mute_notifications_short": "Silenciar avisos",
"account.mute_short": "Silenciar",
"account.name.help.header": "Un \"handle\" ye como una dirección de corréu",
"account.no_bio": "Nun se fornió nenguna descripción.",
"account.open_original_page": "Abrir la páxina orixinal",
"account.posts": "Artículos",
@@ -59,10 +61,17 @@
"account.unmute": "Activar los avisos de @{name}",
"account.unmute_notifications_short": "Dexar de silenciar notificaciones",
"account.unmute_short": "Activar los avisos",
"account_edit.custom_fields.placeholder": "Añade los tos pronombres, enllaces externos o cualquier otra cosa que quieras compartir.",
"account_edit.custom_fields.tip_title": "Conseyu: Añadir enllaces verificáos",
"account_edit.display_name.title": "Nome a mostrar",
"account_edit.field_edit_modal.name_hint": "Por exemplu: \"Web personal\"",
"account_edit.profile_tab.hint.title": "Les visualizaciones sigan variando",
"account_edit.verified_modal.details": "Añade credibilidá al to perfil de Mastodon verificando enllaces a webs personales. Asina ye como funciona:",
"account_note.placeholder": "Calca equí p'amestar una nota",
"admin.dashboard.retention.average": "Media",
"admin.dashboard.retention.cohort": "Mes de rexistru",
"admin.dashboard.retention.cohort_size": "Perfiles nuevos",
"admin.impact_report.instance_followers": "Seguidores que perderíen los nuestros usuarios",
"alert.rate_limited.message": "Volvi tentalo dempués de la hora: {retry_time, time, medium}.",
"alert.unexpected.message": "Prodúxose un error inesperáu.",
"alert.unexpected.title": "¡Meca!",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Opret samling",
"collections.delete_collection": "Slet samling",
"collections.description_length_hint": "Begrænset til 100 tegn",
"collections.detail.accept_inclusion": "Okay",
"collections.detail.accounts_heading": "Konti",
"collections.detail.author_added_you": "{author} tilføjede dig til denne samling",
"collections.detail.curated_by_author": "Kurateret af {author}",
"collections.detail.curated_by_you": "Kurateret af dig",
"collections.detail.loading": "Indlæser samling…",
"collections.detail.other_accounts_in_collection": "Andre i denne samling:",
"collections.detail.revoke_inclusion": "Fjern mig",
"collections.detail.sensitive_note": "Denne samling indeholder konti og indhold, der kan være følsomt for nogle brugere.",
"collections.detail.share": "Del denne samling",
"collections.edit_details": "Rediger detaljer",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Seneste indlæg er fra over en uge siden",
"collections.remove_account": "Fjern denne konto",
"collections.report_collection": "Anmeld denne samling",
"collections.revoke_collection_inclusion": "Fjern mig selv fra denne samling",
"collections.revoke_inclusion.confirmation": "Du er blevet fjernet fra \"{collection}\"",
"collections.revoke_inclusion.error": "Der opstod en fejl, prøv igen senere.",
"collections.search_accounts_label": "Søg efter konti for at tilføje…",
"collections.search_accounts_max_reached": "Du har tilføjet det maksimale antal konti",
"collections.sensitive": "Sensitivt",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Fjern følger",
"confirmations.remove_from_followers.message": "{name} vil ikke længere følge dig. Er du sikker på, at du vil fortsætte?",
"confirmations.remove_from_followers.title": "Fjern følger?",
"confirmations.revoke_collection_inclusion.confirm": "Fjern mig",
"confirmations.revoke_collection_inclusion.message": "Denne handling er permanent, og kuratoren vil ikke kunne føje dig til samlingen igen senere.",
"confirmations.revoke_collection_inclusion.title": "Fjern dig selv fra denne samling?",
"confirmations.revoke_quote.confirm": "Fjern indlæg",
"confirmations.revoke_quote.message": "Denne handling kan ikke fortrydes.",
"confirmations.revoke_quote.title": "Fjern indlæg?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Sammlung erstellen",
"collections.delete_collection": "Sammlung löschen",
"collections.description_length_hint": "Maximal 100 Zeichen",
"collections.detail.accept_inclusion": "Einverstanden",
"collections.detail.accounts_heading": "Konten",
"collections.detail.author_added_you": "{author} hat dich zur Sammlung hinzugefügt",
"collections.detail.curated_by_author": "Kuratiert von {author}",
"collections.detail.curated_by_you": "Kuratiert von dir",
"collections.detail.loading": "Sammlung wird geladen …",
"collections.detail.other_accounts_in_collection": "Weitere Profile in dieser Sammlung:",
"collections.detail.revoke_inclusion": "Mich entfernen",
"collections.detail.sensitive_note": "Diese Sammlung enthält Profile und Inhalte, die manche als anstößig empfinden.",
"collections.detail.share": "Sammlung teilen",
"collections.edit_details": "Details bearbeiten",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Neuester Beitrag mehr als eine Woche alt",
"collections.remove_account": "Dieses Konto entfernen",
"collections.report_collection": "Sammlung melden",
"collections.revoke_collection_inclusion": "Mich aus dieser Sammlung entfernen",
"collections.revoke_inclusion.confirmation": "Du wurdest aus „{collection}“ entfernt",
"collections.revoke_inclusion.error": "Es ist ein Fehler aufgetreten. Bitte versuche es später erneut.",
"collections.search_accounts_label": "Suche nach Konten, um sie hinzuzufügen …",
"collections.search_accounts_max_reached": "Du hast die Höchstzahl an Konten hinzugefügt",
"collections.sensitive": "Inhaltswarnung",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Follower entfernen",
"confirmations.remove_from_followers.message": "{name} wird dir nicht länger folgen. Bist du dir sicher?",
"confirmations.remove_from_followers.title": "Follower entfernen?",
"confirmations.revoke_collection_inclusion.confirm": "Mich entfernen",
"confirmations.revoke_collection_inclusion.message": "Diese Aktion kann nicht rückgängig gemacht werden. Es wird daher nicht möglich sein, dich zu dieser Sammlung erneut hinzuzufügen.",
"confirmations.revoke_collection_inclusion.title": "Möchtest du wirklich aus dieser Sammlung entfernt werden?",
"confirmations.revoke_quote.confirm": "Zitat entfernen",
"confirmations.revoke_quote.message": "Diese Aktion kann nicht rückgängig gemacht werden.",
"confirmations.revoke_quote.title": "Mein Zitat aus diesem Beitrag entfernen?",

View File

@@ -231,7 +231,7 @@
"alt_text_modal.change_thumbnail": "Αλλαγή μικρογραφίας",
"alt_text_modal.describe_for_people_with_hearing_impairments": "Περιέγραψε αυτό για άτομα με προβλήματα ακοής…",
"alt_text_modal.describe_for_people_with_visual_impairments": "Περιέγραψε αυτό για άτομα με προβλήματα όρασης…",
"alt_text_modal.done": "Ολοκληρώθηκε",
"alt_text_modal.done": "Τέλος",
"announcement.announcement": "Ανακοίνωση",
"annual_report.announcement.action_build": "Φτιάξε το Wrapstodon μου",
"annual_report.announcement.action_dismiss": "Όχι, ευχαριστώ",
@@ -338,12 +338,14 @@
"collections.create_collection": "Δημιουργία συλλογής",
"collections.delete_collection": "Διαγραφή συλλογής",
"collections.description_length_hint": "Όριο 100 χαρακτήρων",
"collections.detail.accept_inclusion": "Εντάξει",
"collections.detail.accounts_heading": "Λογαριασμοί",
"collections.detail.author_added_you": "Ο/Η {author} σας πρόσθεσε σε αυτήν τη συλλογή",
"collections.detail.curated_by_author": "Επιμέλεια από {author}",
"collections.detail.curated_by_you": "Επιμέλεια από εσάς",
"collections.detail.loading": "Γίνεται φόρτωση της συλλογής…",
"collections.detail.other_accounts_in_collection": "Άλλοι σε αυτήν τη συλλογή:",
"collections.detail.revoke_inclusion": "Αφαίρεσε με",
"collections.detail.sensitive_note": "Αυτή η συλλογή περιέχει λογαριασμούς και περιεχόμενο που μπορεί να είναι ευαίσθητα σε ορισμένους χρήστες.",
"collections.detail.share": "Κοινοποιήστε αυτήν τη συλλογή",
"collections.edit_details": "Επεξεργασία λεπτομερειών",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Τελευταία ανάρτηση πριν από μια εβδομάδα",
"collections.remove_account": "Αφαίρεση λογαριασμού",
"collections.report_collection": "Αναφορά αυτής της συλλογής",
"collections.revoke_collection_inclusion": "Αφαίρεσε τον εαυτό μου από αυτήν τη συλλογή",
"collections.revoke_inclusion.confirmation": "Έχεις αφαιρεθεί από τη συλλογή \"{collection}\"",
"collections.revoke_inclusion.error": "Υπήρξε ένα σφάλμα, παρακαλούμε προσπαθήστε ξανά αργότερα.",
"collections.search_accounts_label": "Αναζήτηση λογαριασμών για προσθήκη…",
"collections.search_accounts_max_reached": "Έχετε προσθέσει τον μέγιστο αριθμό λογαριασμών",
"collections.sensitive": "Ευαίσθητο",
@@ -405,7 +410,7 @@
"combobox.no_results_found": "Κανένα αποτέλεσμα για αυτήν την αναζήτηση",
"combobox.open_results": "Άνοιγμα αποτελεσμάτων",
"combobox.results_available": "{count, plural, one {# πρόταση διαθέσιμη} other {# προτάσεις διαθέσιμες}}. Χρησιμοποιήστε τα βελάκια πάνω και κάτω για να πλοηγηθείτε. Πατήστε Enter για να επιλέξετε.",
"community.column_settings.local_only": "Τοπικά μόνο",
"community.column_settings.local_only": "Τοπική μόνο",
"community.column_settings.media_only": "Μόνο πολυμέσα",
"community.column_settings.remote_only": "Απομακρυσμένα μόνο",
"compose.error.blank_post": "Η ανάρτηση δεν μπορεί να είναι κενή.",
@@ -462,7 +467,7 @@
"confirmations.logout.confirm": "Αποσύνδεση",
"confirmations.logout.message": "Σίγουρα θέλεις να αποσυνδεθείς;",
"confirmations.logout.title": "Αποσύνδεση;",
"confirmations.missing_alt_text.confirm": "Προσθήκη εναλ κειμένου",
"confirmations.missing_alt_text.confirm": "Προσθήκη εναλλακτικού κειμένου",
"confirmations.missing_alt_text.message": "Η ανάρτησή σου περιέχει πολυμέσα χωρίς εναλλακτικό κείμενο. Η προσθήκη περιγραφών βοηθά να γίνει το περιεχόμενό σου προσβάσιμο σε περισσότερους ανθρώπους.",
"confirmations.missing_alt_text.secondary": "Δημοσίευση όπως και να ΄χει",
"confirmations.missing_alt_text.title": "Προσθήκη εναλλακτικού κειμένου;",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Αφαίρεση ακολούθου",
"confirmations.remove_from_followers.message": "Ο χρήστης {name} θα σταματήσει να σε ακολουθεί. Σίγουρα θες να συνεχίσεις;",
"confirmations.remove_from_followers.title": "Αφαίρεση ακολούθου;",
"confirmations.revoke_collection_inclusion.confirm": "Αφαίρεσε με",
"confirmations.revoke_collection_inclusion.message": "Αυτή η ενέργεια είναι μόνιμη, και ο επιμελητής δεν θα μπορεί να σε προσθέσει ξανά στη συλλογή αργότερα.",
"confirmations.revoke_collection_inclusion.title": "Αφαίρεσε τον εαυτό σου από αυτήν τη συλλογή;",
"confirmations.revoke_quote.confirm": "Αφαίρεση ανάρτησης",
"confirmations.revoke_quote.message": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"confirmations.revoke_quote.title": "Αφαίρεση ανάρτησης;",
@@ -541,7 +549,7 @@
"emoji_button.custom": "Προσαρμοσμένα",
"emoji_button.flags": "Σημαίες",
"emoji_button.food": "Φαγητά & Ποτά",
"emoji_button.label": "Εισάγετε emoji",
"emoji_button.label": "Εισαγωγή emoji",
"emoji_button.nature": "Φύση",
"emoji_button.not_found": "Δε βρέθηκε αντιστοίχιση εμότζι",
"emoji_button.objects": "Αντικείμενα",
@@ -697,7 +705,7 @@
"ignore_notifications_modal.not_following_title": "Αγνόηση ειδοποιήσεων από άτομα που δεν ακολουθείς;",
"ignore_notifications_modal.private_mentions_title": "Αγνόηση ειδοποιήσεων από μη ζητηθείσες ιδιωτικές επισημάνσεις;",
"info_button.label": "Βοήθεια",
"info_button.what_is_alt_text": "Το εναλλακτικό κείμενο παρέχει περιγραφές εικόνας για άτομα με προβλήματα όρασης, διαδικτυακές συνδέσεις χαμηλής ταχύτητας ή για άτομα που αναζητούν επιπλέον περιεχόμενο.\\n\\nΜπορείς να βελτιώσεις την προσβασιμότητα και την κατανόηση για όλους, γράφοντας σαφές, συνοπτικό και αντικειμενικό εναλλακτικό κείμενο.\\n\\n<ul><li>Κατέγραψε σημαντικά στοιχεία</li>\\n<li>Συνόψισε το κείμενο στις εικόνες</li>\\n<li>Χρησιμοποίησε δομή κανονικής πρότασης</li>\\n<li>Απέφυγε περιττές πληροφορίες</li>\\n<li>Εστίασε στις τάσεις και τα βασικά ευρήματα σε σύνθετα οπτικά στοιχεία (όπως διαγράμματα ή χάρτες)</li></ul>",
"info_button.what_is_alt_text": "<h1>Τι είναι το εναλλακτικό κείμενο;</h1> <p>Το εναλλακτικό κείμενο (alt text) παρέχει περιγραφές εικόνας για άτομα με προβλήματα όρασης, διαδικτυακές συνδέσεις χαμηλής ταχύτητας ή για άτομα που αναζητούν επιπλέον περιεχόμενο.</p> <p>Μπορείς να βελτιώσεις την προσβασιμότητα και την κατανόηση για όλους, γράφοντας σαφές, συνοπτικό και αντικειμενικό εναλλακτικό κείμενο.</p> <ul> <li>Κατέγραψε σημαντικά στοιχεία</li> <li>Συνόψισε το κείμενο στις εικόνες</li> <li>Χρησιμοποίησε δομή κανονικής πρότασης</li> <li>Απέφυγε περιττές πληροφορίες</li> <li>Εστίασε στις τάσεις και τα βασικά ευρήματα σε σύνθετα οπτικά στοιχεία (όπως διαγράμματα ή χάρτες)</li> </ul>",
"interaction_modal.action": "Για να αλληλεπιδράσετε με την ανάρτηση του/της {name}, πρέπει να συνδεθείτε στον λογαριασμό σας σε οποιονδήποτε διακομιστή Mastodon χρησιμοποιείτε.",
"interaction_modal.go": "Πάμε",
"interaction_modal.no_account_yet": "Δεν έχεις ακόμη λογαριασμό;",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Create collection",
"collections.delete_collection": "Delete collection",
"collections.description_length_hint": "100 characters limit",
"collections.detail.accept_inclusion": "OK",
"collections.detail.accounts_heading": "Accounts",
"collections.detail.author_added_you": "{author} added you to this collection",
"collections.detail.curated_by_author": "Curated by {author}",
"collections.detail.curated_by_you": "Curated by you",
"collections.detail.loading": "Loading collection…",
"collections.detail.other_accounts_in_collection": "Others in this collection:",
"collections.detail.revoke_inclusion": "Remove me",
"collections.detail.sensitive_note": "This collection contains accounts and content that may be sensitive to some users.",
"collections.detail.share": "Share this collection",
"collections.edit_details": "Edit details",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Last posted over a week ago",
"collections.remove_account": "Remove this account",
"collections.report_collection": "Report this collection",
"collections.revoke_collection_inclusion": "Remove myself from this collection",
"collections.revoke_inclusion.confirmation": "You've been removed from \"{collection}\"",
"collections.revoke_inclusion.error": "There was an error, please try again later.",
"collections.search_accounts_label": "Search for accounts to add…",
"collections.search_accounts_max_reached": "You have added the maximum number of accounts",
"collections.sensitive": "Sensitive",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Remove follower",
"confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?",
"confirmations.remove_from_followers.title": "Remove follower?",
"confirmations.revoke_collection_inclusion.confirm": "Remove me",
"confirmations.revoke_collection_inclusion.message": "This action is permanent, and the curator won't be able to re-add you to the collection later on.",
"confirmations.revoke_collection_inclusion.title": "Remove yourself from this collection?",
"confirmations.revoke_quote.confirm": "Remove post",
"confirmations.revoke_quote.message": "This action cannot be undone.",
"confirmations.revoke_quote.title": "Remove post?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Crear colección",
"collections.delete_collection": "Eliminar colección",
"collections.description_length_hint": "Límite de 100 caracteres",
"collections.detail.accept_inclusion": "Aceptar",
"collections.detail.accounts_heading": "Cuentas",
"collections.detail.author_added_you": "{author} te agregó a esta colección",
"collections.detail.curated_by_author": "Curado por {author}",
"collections.detail.curated_by_you": "Curado por vos",
"collections.detail.loading": "Cargando colección…",
"collections.detail.other_accounts_in_collection": "Otras cuentas en esta colección:",
"collections.detail.revoke_inclusion": "Quitarme",
"collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que pueden ser sensibles a algunos usuarios.",
"collections.detail.share": "Compartir esta colección",
"collections.edit_details": "Editar detalles",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Último mensaje hace más de una semana",
"collections.remove_account": "Eliminar esta cuenta",
"collections.report_collection": "Denunciar esta colección",
"collections.revoke_collection_inclusion": "Quitarme de esta colección",
"collections.revoke_inclusion.confirmation": "Saliste de «{collection}»",
"collections.revoke_inclusion.error": "Hubo un error; por favor, intentalo de nuevo más tarde.",
"collections.search_accounts_label": "Buscar cuentas para agregar…",
"collections.search_accounts_max_reached": "Agregaste el número máximo de cuentas",
"collections.sensitive": "Sensible",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Quitar seguidor",
"confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que querés continuar?",
"confirmations.remove_from_followers.title": "¿Quitar seguidor?",
"confirmations.revoke_collection_inclusion.confirm": "Quitarme",
"confirmations.revoke_collection_inclusion.message": "Esta acción es permanente, y el autor no podrá volver a agregarte a la colección más adelante.",
"confirmations.revoke_collection_inclusion.title": "¿Querés quitarte de esta colección?",
"confirmations.revoke_quote.confirm": "Eliminar mensaje",
"confirmations.revoke_quote.message": "Esta acción no se puede deshacer.",
"confirmations.revoke_quote.title": "¿Eliminar mensaje?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Crear colección",
"collections.delete_collection": "Eliminar colección",
"collections.description_length_hint": "Limitado a 100 caracteres",
"collections.detail.accept_inclusion": "Aceptar",
"collections.detail.accounts_heading": "Cuentas",
"collections.detail.author_added_you": "{author} te ha añadido a esta colección",
"collections.detail.curated_by_author": "Seleccionado por {author}",
"collections.detail.curated_by_you": "Seleccionado por ti",
"collections.detail.loading": "Cargando colección…",
"collections.detail.other_accounts_in_collection": "Otros en esta colección:",
"collections.detail.revoke_inclusion": "Excluirme",
"collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que pueden resultar sensibles para algunos usuarios.",
"collections.detail.share": "Compartir esta colección",
"collections.edit_details": "Editar detalles",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Última publicación hace más de una semana",
"collections.remove_account": "Eliminar esta cuenta",
"collections.report_collection": "Reportar esta colección",
"collections.revoke_collection_inclusion": "Excluirme de esta colección",
"collections.revoke_inclusion.confirmation": "Has sido excluido de \"{collection}\"",
"collections.revoke_inclusion.error": "Se ha producido un error, por favor, inténtalo de nuevo más tarde.",
"collections.search_accounts_label": "Buscar cuentas para añadir…",
"collections.search_accounts_max_reached": "Has añadido el número máximo de cuentas",
"collections.sensitive": "Sensible",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Eliminar seguidor",
"confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?",
"confirmations.remove_from_followers.title": "¿Eliminar seguidor?",
"confirmations.revoke_collection_inclusion.confirm": "Excluirme",
"confirmations.revoke_collection_inclusion.message": "Esta acción es permanente y el autor no podrá volver a agregarte a la colección más adelante.",
"confirmations.revoke_collection_inclusion.title": "¿Deseas excluirte de esta colección?",
"confirmations.revoke_quote.confirm": "Eliminar publicación",
"confirmations.revoke_quote.message": "Esta acción no se puede deshacer.",
"confirmations.revoke_quote.title": "¿Deseas eliminar la publicación?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Crear colección",
"collections.delete_collection": "Eliminar colección",
"collections.description_length_hint": "Limitado a 100 caracteres",
"collections.detail.accept_inclusion": "Aceptar",
"collections.detail.accounts_heading": "Cuentas",
"collections.detail.author_added_you": "{author} te añadió a esta colección",
"collections.detail.curated_by_author": "Seleccionado por {author}",
"collections.detail.curated_by_you": "Seleccionado por ti",
"collections.detail.loading": "Cargando colección…",
"collections.detail.other_accounts_in_collection": "Otros en esta colección:",
"collections.detail.revoke_inclusion": "Eliminar",
"collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que puede ser sensible para algunos usuarios.",
"collections.detail.share": "Compartir esta colección",
"collections.edit_details": "Editar detalles",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Última publicación hace más de una semana",
"collections.remove_account": "Quitar esta cuenta",
"collections.report_collection": "Informar de esta colección",
"collections.revoke_collection_inclusion": "Eliminarme de esta colección",
"collections.revoke_inclusion.confirmation": "Ha sido eliminado de\"{collection}\"",
"collections.revoke_inclusion.error": "Se ha producido un error. Inténtelo de nuevo más tarde.",
"collections.search_accounts_label": "Buscar cuentas para añadir…",
"collections.search_accounts_max_reached": "Has añadido el número máximo de cuentas",
"collections.sensitive": "Sensible",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Eliminar seguidor",
"confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?",
"confirmations.remove_from_followers.title": "¿Eliminar seguidor?",
"confirmations.revoke_collection_inclusion.confirm": "Eliminar",
"confirmations.revoke_collection_inclusion.message": "Esta acción es permanente, y el curador no podrá volver a añadirle a la colección más adelante.",
"confirmations.revoke_collection_inclusion.title": "¿Eliminarse de esta colección?",
"confirmations.revoke_quote.confirm": "Eliminar publicación",
"confirmations.revoke_quote.message": "Esta acción no tiene vuelta atrás.",
"confirmations.revoke_quote.title": "¿Eliminar la publicación?",

View File

@@ -153,6 +153,7 @@
"account_edit.column_title": "Muokkaa profiilia",
"account_edit.custom_fields.name": "kenttä",
"account_edit.custom_fields.placeholder": "Lisää pronominisi, ulkoisia linkkejä tai mitä tahansa muuta, jonka haluat jakaa.",
"account_edit.custom_fields.reorder_button": "Järjestele kenttiä",
"account_edit.custom_fields.tip_content": "Voit helposti lisätä Mastodon-tilisi uskottavuutta vahvistamalla mihin tahansa omistamaasi verkkosivustoon ohjaavat linkit.",
"account_edit.custom_fields.tip_title": "Vinkki: Vahvistettujen linkkien lisääminen",
"account_edit.custom_fields.title": "Mukautetut kentät",
@@ -162,15 +163,26 @@
"account_edit.featured_hashtags.item": "aihetunnisteet",
"account_edit.featured_hashtags.placeholder": "Auta muita tunnistamaan suosikkiaiheesi ja saamaan nopea pääsy niihin.",
"account_edit.featured_hashtags.title": "Esiteltävät aihetunnisteet",
"account_edit.field_delete_modal.confirm": "Haluatko varmasti poistaa tämän mukautetun kentän? Tätä toimintoa ei voi peruuttaa.",
"account_edit.field_delete_modal.confirm": "Haluatko varmasti poistaa tämän mukautetun kentän? Tätä toimea ei voi peruuttaa.",
"account_edit.field_delete_modal.delete_button": "Poista",
"account_edit.field_delete_modal.title": "Poistetaanko mukautettu kenttä?",
"account_edit.field_edit_modal.add_title": "Lisää mukautettu kenttä",
"account_edit.field_edit_modal.edit_title": "Muokkaa mukautettua kenttää",
"account_edit.field_edit_modal.limit_header": "Suositeltu merkkiraja ylitetty",
"account_edit.field_edit_modal.limit_message": "Mobiilikäyttäjät eivät välttämättä näe kenttää kokonaan.",
"account_edit.field_edit_modal.link_emoji_warning": "Emme suosittele käyttämään mukautettuja emojeita URL-osoitteiden kanssa. Molempia sisältävät mukautetut kentät näkyvät vain tekstinä linkin sijaan, jotta estetään käyttäjien sekaannus.",
"account_edit.field_edit_modal.name_hint": "Esim. ”Henkilökohtainen verkkosivusto”",
"account_edit.field_edit_modal.name_label": "Nimike",
"account_edit.field_edit_modal.value_hint": "Esim. ”example.me”",
"account_edit.field_edit_modal.value_label": "Arvo",
"account_edit.field_reorder_modal.drag_cancel": "Veto peruttu. Kenttää ”{item}” ei siirretty.",
"account_edit.field_reorder_modal.drag_end": "Kenttä ”{item}” pudotettu.",
"account_edit.field_reorder_modal.drag_instructions": "Siirrä mukautettuja kenttiä painamalla välilyöntiä tai Enter-näppäintä. Raahatessa siirrä kenttää ylös tai alas nuolinäppäimillä. Pudota kenttä uuteen kohtaansa painamalla uudelleen välilyöntiä tai Enter-näppäintä, tai peru painamalla Escape-näppäintä.",
"account_edit.field_reorder_modal.drag_move": "Kenttä ”{item}” siirretty.",
"account_edit.field_reorder_modal.drag_over": "Kenttä ”{item}” siirretty kentän ”{over}” päälle.",
"account_edit.field_reorder_modal.drag_start": "Valittu kenttä ”{item}”.",
"account_edit.field_reorder_modal.handle_label": "Siirrä kenttää ”{item}”",
"account_edit.field_reorder_modal.title": "Järjestele kenttiä",
"account_edit.name_modal.add_title": "Lisää näyttönimi",
"account_edit.name_modal.edit_title": "Muokkaa näyttönimeä",
"account_edit.profile_tab.button_label": "Mukauta",
@@ -186,7 +198,12 @@
"account_edit.profile_tab.title": "Profiilin välilehtien asetukset",
"account_edit.save": "Tallenna",
"account_edit.verified_modal.details": "Lisää Mastodon-profiiliisi uskottavuutta vahvistamalla linkit henkilökohtaisiin verkkosivustoihin. Näin se toimii:",
"account_edit.verified_modal.invisible_link.details": "Lisää linkki HTML:n head-osaan. Tärkeä kohta on rel=\"me\", joka estää toiseksi tekeytymisen sivustoilla, joilla on käyttäjien luomaa sisältöä. Voit jopa käyttää link-tunnistetta sivun head-osassa {tag}-tunnisteen sijaan, mutta HTML:n tulee olla saatavilla suorittamatta JavaScriptia.",
"account_edit.verified_modal.invisible_link.summary": "Miten teen linkistä näkymättömän?",
"account_edit.verified_modal.step1.header": "Kopioi alla oleva HTML-koodi ja liitä se verkkosivustosi head-osaan",
"account_edit.verified_modal.step2.details": "Jos olet jo lisännyt verkkosivustosi mukautettuna kenttänä, sinun tulee poistaa ja lisätä se uudelleen, jotta voit käynnistää vahvistuksen.",
"account_edit.verified_modal.step2.header": "Lisää verkkosivustosi mukautettuna kenttänä",
"account_edit.verified_modal.title": "Miten lisätä vahvistettu linkki",
"account_edit_tags.add_tag": "Lisää #{tagName}",
"account_edit_tags.column_title": "Muokkaa esiteltäviä aihetunnisteita",
"account_edit_tags.help_text": "Esiteltävät aihetunnisteet auttavat käyttäjiä löytämään profiilisi ja olemaan vuorovaikutuksessa sen kanssa. Ne näkyvät suodattimina profiilisivusi Toiminta-näkymässä.",
@@ -321,12 +338,14 @@
"collections.create_collection": "Luo kokoelma",
"collections.delete_collection": "Poista kokoelma",
"collections.description_length_hint": "100 merkin rajoitus",
"collections.detail.accept_inclusion": "Selvä",
"collections.detail.accounts_heading": "Tilit",
"collections.detail.author_added_you": "{author} lisäsi sinut tähän kokoelmaan",
"collections.detail.curated_by_author": "Koonnut {author}",
"collections.detail.curated_by_you": "Itse kokoamasi",
"collections.detail.loading": "Ladataan kokoelmaa…",
"collections.detail.other_accounts_in_collection": "Muut tässä kokoelmassa:",
"collections.detail.revoke_inclusion": "Poista minut",
"collections.detail.sensitive_note": "Tämä kokoelma sisältää tilejä ja sisältöä, jotka saattavat olla arkaluonteisia joillekin käyttäjille.",
"collections.detail.share": "Jaa tämä kokoelma",
"collections.edit_details": "Muokkaa tietoja",
@@ -342,6 +361,9 @@
"collections.old_last_post_note": "Julkaissut viimeksi yli viikko sitten",
"collections.remove_account": "Poista tämä tili",
"collections.report_collection": "Raportoi tämä kokoelma",
"collections.revoke_collection_inclusion": "Poista itseni tästä kokoelmasta",
"collections.revoke_inclusion.confirmation": "Sinut on poistettu kokoelmasta ”{collection}”",
"collections.revoke_inclusion.error": "Tapahtui virhe yritä myöhemmin uudelleen.",
"collections.search_accounts_label": "Hae lisättäviä tilejä…",
"collections.search_accounts_max_reached": "Olet lisännyt enimmäismäärän tilejä",
"collections.sensitive": "Arkaluonteinen",
@@ -465,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Poista seuraaja",
"confirmations.remove_from_followers.message": "{name} lakkaa seuraamasta sinua. Haluatko varmasti jatkaa?",
"confirmations.remove_from_followers.title": "Poistetaanko seuraaja?",
"confirmations.revoke_collection_inclusion.confirm": "Poista minut",
"confirmations.revoke_collection_inclusion.message": "Tämä toimi on pysyvä, eikä kokoaja pysty lisäämään sinua kokoelmaan myöhemmin uudelleen.",
"confirmations.revoke_collection_inclusion.title": "Poistetaanko itsesi tästä kokoelmasta?",
"confirmations.revoke_quote.confirm": "Poista julkaisu",
"confirmations.revoke_quote.message": "Tätä toimea ei voi peruuttaa.",
"confirmations.revoke_quote.title": "Poistetaanko julkaisu?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Cruthaigh bailiúchán",
"collections.delete_collection": "Scrios bailiúchán",
"collections.description_length_hint": "Teorainn 100 carachtar",
"collections.detail.accept_inclusion": "Ceart go leor",
"collections.detail.accounts_heading": "Cuntais",
"collections.detail.author_added_you": "Chuir {author} leis an mbailiúchán seo thú",
"collections.detail.curated_by_author": "Curtha i dtoll a chéile ag {author}",
"collections.detail.curated_by_you": "Curtha i dtoll a chéile agatsa",
"collections.detail.loading": "Ag lódáil an bhailiúcháin…",
"collections.detail.other_accounts_in_collection": "Daoine eile sa bhailiúchán seo:",
"collections.detail.revoke_inclusion": "Bain mé",
"collections.detail.sensitive_note": "Tá cuntais agus ábhar sa bhailiúchán seo a d'fhéadfadh a bheith íogair do roinnt úsáideoirí.",
"collections.detail.share": "Comhroinn an bailiúchán seo",
"collections.edit_details": "Cuir sonraí in eagar",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Postáilte go deireanach breis agus seachtain ó shin",
"collections.remove_account": "Bain an cuntas seo",
"collections.report_collection": "Tuairiscigh an bailiúchán seo",
"collections.revoke_collection_inclusion": "Bain mé féin as an mbailiúchán seo",
"collections.revoke_inclusion.confirmation": "Baineadh as \"{collection}\" thú",
"collections.revoke_inclusion.error": "Tharla earráid, déan iarracht arís ar ball.",
"collections.search_accounts_label": "Cuardaigh cuntais le cur leis…",
"collections.search_accounts_max_reached": "Tá an líon uasta cuntas curtha leis agat",
"collections.sensitive": "Íogair",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Bain leantóir",
"confirmations.remove_from_followers.message": "Scoirfidh {name} de bheith ag leanúint leat. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?",
"confirmations.remove_from_followers.title": "Bain an leantóir?",
"confirmations.revoke_collection_inclusion.confirm": "Bain mé",
"confirmations.revoke_collection_inclusion.message": "Is gníomh buan é seo, agus ní bheidh an coimeádaí in ann tú a chur leis an mbailiúchán arís níos déanaí.",
"confirmations.revoke_collection_inclusion.title": "Bain tú féin den bhailiúchán seo?",
"confirmations.revoke_quote.confirm": "Bain postáil",
"confirmations.revoke_quote.message": "Ní féidir an gníomh seo a chealú.",
"confirmations.revoke_quote.title": "Bain postáil?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Crear colección",
"collections.delete_collection": "Eliminar colección",
"collections.description_length_hint": "Límite de 100 caracteres",
"collections.detail.accept_inclusion": "Vale",
"collections.detail.accounts_heading": "Contas",
"collections.detail.author_added_you": "{author} engadíute a esta colección",
"collections.detail.curated_by_author": "Seleccionadas por {author}",
"collections.detail.curated_by_you": "Seleccionadas por ti",
"collections.detail.loading": "Cargando colección…",
"collections.detail.other_accounts_in_collection": "Outras contas na colección:",
"collections.detail.revoke_inclusion": "Non quero",
"collections.detail.sensitive_note": "Esta colección presenta contas e contido que poderían ser sensibles para algunhas persoas.",
"collections.detail.share": "Compartir esta colección",
"collections.edit_details": "Editar detalles",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Hai máis dunha semana da última publicación",
"collections.remove_account": "Retirar esta conta",
"collections.report_collection": "Denunciar esta colección",
"collections.revoke_collection_inclusion": "Sácame desta colección",
"collections.revoke_inclusion.confirmation": "Quitámoste da colección \"{collection}\"",
"collections.revoke_inclusion.error": "Algo fallou, inténtao outra vez máis tarde.",
"collections.search_accounts_label": "Buscar contas para engadir…",
"collections.search_accounts_max_reached": "Acadaches o máximo de contas permitidas",
"collections.sensitive": "Sensible",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Quitar seguidora",
"confirmations.remove_from_followers.message": "{name} vai deixar de seguirte. É isto o que queres?",
"confirmations.remove_from_followers.title": "Quitar seguidora?",
"confirmations.revoke_collection_inclusion.confirm": "Quítame",
"confirmations.revoke_collection_inclusion.message": "A acción é definitiva, a creadora da colección non poderá volver a engadirte máis adiante.",
"confirmations.revoke_collection_inclusion.title": "Queres que non te inclúan nesta colección?",
"confirmations.revoke_quote.confirm": "Eliminar publicación",
"confirmations.revoke_quote.message": "Esta acción non se pode desfacer.",
"confirmations.revoke_quote.title": "Eliminar publicación?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "יצירת אוסף",
"collections.delete_collection": "מחיקת האוסף",
"collections.description_length_hint": "מגבלה של 100 תווים",
"collections.detail.accept_inclusion": "אישור",
"collections.detail.accounts_heading": "חשבונות",
"collections.detail.author_added_you": "{author} הוסיפו אותך לאוסף",
"collections.detail.curated_by_author": "נאצר על ידי {author}",
"collections.detail.curated_by_you": "נאצר על ידיך",
"collections.detail.loading": "טוען אוסף…",
"collections.detail.other_accounts_in_collection": "אחרים באוסף:",
"collections.detail.revoke_inclusion": "הסירוני",
"collections.detail.sensitive_note": "האוסף מכיל חשבונות ותכנים שאולי יחשבו רגישים לחלק מהמשתמשים.",
"collections.detail.share": "שיתוף אוסף",
"collections.edit_details": "עריכת פרטים",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "פרסמו לאחרונה לפני יותר משבוע",
"collections.remove_account": "הסר חשבון זה",
"collections.report_collection": "דיווח על אוסף זה",
"collections.revoke_collection_inclusion": "הסירוני מאוסף זה",
"collections.revoke_inclusion.confirmation": "הוסרת מֿ\"{collection}\"",
"collections.revoke_inclusion.error": "הייתה שגיאה. נסו שוב מאוחר יותר.",
"collections.search_accounts_label": "לחפש חשבונות להוספה…",
"collections.search_accounts_max_reached": "הגעת למספר החשבונות המירבי",
"collections.sensitive": "רגיש",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "הסרת עוקב",
"confirmations.remove_from_followers.message": "{name} יוסר/תוסר ממעקב אחריך. האם להמשיך?",
"confirmations.remove_from_followers.title": "להסיר עוקב/עוקבת?",
"confirmations.revoke_collection_inclusion.confirm": "הסירוני",
"confirmations.revoke_collection_inclusion.message": "פעולה זו היא סופית, והאוצרים לא יוכלו להוסיף אותך יותר לאוסף בעתיד.",
"confirmations.revoke_collection_inclusion.title": "להסירך מאוסף זה?",
"confirmations.revoke_quote.confirm": "הסרת הודעה",
"confirmations.revoke_quote.message": "פעולה זו אינה הפיכה.",
"confirmations.revoke_quote.title": "הסרת הודעה?",

View File

@@ -153,20 +153,33 @@
"account_edit.column_title": "Profil szerkesztése",
"account_edit.custom_fields.name": "mező",
"account_edit.custom_fields.placeholder": "Add meg a névmásaidat, külső hivatkozásaidat vagy bármi mást, amelyet megosztanál.",
"account_edit.custom_fields.reorder_button": "Mezők átrendezése",
"account_edit.custom_fields.tip_content": "Könnyedén nagyobb hitelességet adhatsz a Mastodon-fiókodnak a saját weboldalaidra mutató hivatkozások megerősítésével.",
"account_edit.custom_fields.tip_title": "Tipp: Ellenőrzött hivatkozások hozzáadása",
"account_edit.custom_fields.title": "Egyéni mezők",
"account_edit.custom_fields.verified_hint": "Hogyan kell ellenőrzött hivatkozást hozzáadni?",
"account_edit.display_name.placeholder": "A megjelenítendő név az, ahogy a neved megjelenik a profilodon és az idővonalakon.",
"account_edit.display_name.title": "Megjelenítendő név",
"account_edit.featured_hashtags.item": "hashtagek",
"account_edit.featured_hashtags.placeholder": "Segíts másoknak, hogy azonosíthassák a kedvenc témáid, és gyorsan elérjék azokat.",
"account_edit.featured_hashtags.title": "Kiemelt hashtagek",
"account_edit.field_delete_modal.confirm": "Biztos, hogy töröld ezt az egyéni mezőt? Ez a művelet nem vonható vissza.",
"account_edit.field_delete_modal.delete_button": "Törlés",
"account_edit.field_delete_modal.title": "Egyéni mező törlése?",
"account_edit.field_edit_modal.add_title": "Egyéni mező hozzáadása",
"account_edit.field_edit_modal.edit_title": "Egyéni mező szerkesztése",
"account_edit.field_edit_modal.limit_header": "Az ajánlott karakterkorlát túllépve",
"account_edit.field_edit_modal.limit_message": "A mobilos felhasználók lehet, hogy nem fogják a teljes mezőt látni.",
"account_edit.field_edit_modal.link_emoji_warning": "Nem javasoljuk az egyéni emodzsik és webcímek együttes használatát. A mindkettőt tartalmazó egyéni mezők a felhasználók megzavarásának elkerülése érdekében csak szövegként jelennek meg, nem hivatkozásként.",
"account_edit.field_edit_modal.name_hint": "Például „Személyes webhely”",
"account_edit.field_edit_modal.name_label": "Címke",
"account_edit.field_edit_modal.value_hint": "Például „example.me”",
"account_edit.field_edit_modal.value_label": "Érték",
"account_edit.field_reorder_modal.drag_cancel": "Az áthúzás megszakítva. A(z) „{item}” mező el lett dobva.",
"account_edit.field_reorder_modal.drag_end": "A(z) „{item}” mező el lett dobva.",
"account_edit.field_reorder_modal.drag_move": "A(z) „{item}” mező át lett helyezve.",
"account_edit.field_reorder_modal.handle_label": "A(z) „{item}” mező húzása",
"account_edit.field_reorder_modal.title": "Mezők átrendezése",
"account_edit.name_modal.add_title": "Megjelenítendő név hozzáadása",
"account_edit.name_modal.edit_title": "Megjelenítendő név szerkesztése",
"account_edit.profile_tab.button_label": "Testreszabás",
@@ -181,6 +194,9 @@
"account_edit.profile_tab.subtitle": "Szabd testre a profilodon látható lapokat, és a megjelenített tartalmukat.",
"account_edit.profile_tab.title": "Profil lap beállításai",
"account_edit.save": "Mentés",
"account_edit.verified_modal.invisible_link.summary": "Hogyan lehet egy hivatkozás láthatatlanná tenni?",
"account_edit.verified_modal.step1.header": "Másold a lenti HTML-kódot és illeszd be a webhelyed fejlécébe",
"account_edit.verified_modal.step2.details": "Ha már egyéni mezőként hozzáadtad a webhelyedet, akkor törölnöd kell, újból hozzá kell adnod, hogy újra ellenőrizve legyen.",
"account_edit.verified_modal.step2.header": "Saját webhely hozzáadása egyéni mezőként",
"account_edit.verified_modal.title": "Hogyan kell ellenőrzött hivatkozást hozzáadni",
"account_edit_tags.add_tag": "#{tagName} hozzáadása",
@@ -317,12 +333,14 @@
"collections.create_collection": "Gyűjtemény létrehozása",
"collections.delete_collection": "Gyűjtemény törlése",
"collections.description_length_hint": "100 karakteres korlát",
"collections.detail.accept_inclusion": "Rendben",
"collections.detail.accounts_heading": "Fiókok",
"collections.detail.author_added_you": "{author} hozzáadott ehhez a gyűjteményhez",
"collections.detail.curated_by_author": "Válogatta: {author}",
"collections.detail.curated_by_you": "Te válogattad",
"collections.detail.loading": "Gyűjtemény betöltése…",
"collections.detail.other_accounts_in_collection": "Mások ebben a gyűjteményben:",
"collections.detail.revoke_inclusion": "Saját magam eltávolítása",
"collections.detail.sensitive_note": "Ebben a gyűjteményben egyesek számára érzékeny fiókok és tartalmak vannak.",
"collections.detail.share": "Gyűjtemény megosztása",
"collections.edit_details": "Részletek szerkesztése",
@@ -338,6 +356,9 @@
"collections.old_last_post_note": "Egy hete osztott meg legutóbb",
"collections.remove_account": "Fiók eltávolítása",
"collections.report_collection": "Gyűjtemény jelentése",
"collections.revoke_collection_inclusion": "Saját magam eltávolítása ebből a gyűjteményből",
"collections.revoke_inclusion.confirmation": "El lettél távolítva innen: „{collection}”",
"collections.revoke_inclusion.error": "Hiba történt, próbáld újra később.",
"collections.search_accounts_label": "Hozzáadandó fiókok keresése…",
"collections.search_accounts_max_reached": "Elérte a hozzáadott fiókok maximális számát",
"collections.sensitive": "Érzékeny",
@@ -461,6 +482,9 @@
"confirmations.remove_from_followers.confirm": "Követő eltávolítása",
"confirmations.remove_from_followers.message": "{name} követ téged. Biztos, hogy folytatod?",
"confirmations.remove_from_followers.title": "Követő eltávolítása?",
"confirmations.revoke_collection_inclusion.confirm": "Saját magam eltávolítása",
"confirmations.revoke_collection_inclusion.message": "Ez a művelet végleges, és a kurátor nem fog tudni újra hozzáadni ehhez a gyűjteményhez.",
"confirmations.revoke_collection_inclusion.title": "Eltávolítod magadat ebből a gyűjteményből?",
"confirmations.revoke_quote.confirm": "Bejegyzés eltávolítása",
"confirmations.revoke_quote.message": "Ez a művelet nem vonható vissza.",
"confirmations.revoke_quote.title": "Bejegyzés eltávolítása?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Búa til safn",
"collections.delete_collection": "Eyða safni",
"collections.description_length_hint": "100 stafa takmörk",
"collections.detail.accept_inclusion": "Í lagi",
"collections.detail.accounts_heading": "Aðgangar",
"collections.detail.author_added_you": "{author} bætti þér í þetta safn",
"collections.detail.curated_by_author": "Safnað saman af {author}",
"collections.detail.curated_by_you": "Safnað saman af þér",
"collections.detail.loading": "Hleð inn safni…",
"collections.detail.other_accounts_in_collection": "Aðrir í þessu safni:",
"collections.detail.revoke_inclusion": "Fjarlægja mig",
"collections.detail.sensitive_note": "Þetta safn inniheldur aðganga og efni sem sumir notendur gætu verið viðkvæmir fyrir.",
"collections.detail.share": "Deila þessu safni",
"collections.edit_details": "Breyta ítarupplýsingum",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Birti síðast fyrir meira en viku síðan",
"collections.remove_account": "Fjarlægja þennan aðgang",
"collections.report_collection": "Kæra þetta safn",
"collections.revoke_collection_inclusion": "Fjarlægja mig úr þessu safni",
"collections.revoke_inclusion.confirmation": "Þú varst fjarlægð/ur úr \"{collection}\"",
"collections.revoke_inclusion.error": "Upp kom villa, reyndu aftur síðar.",
"collections.search_accounts_label": "Leita að aðgöngum til að bæta við…",
"collections.search_accounts_max_reached": "Þú hefur þegar bætt við leyfilegum hámarksfjölda aðganga",
"collections.sensitive": "Viðkvæmt",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Fjarlægja fylgjanda",
"confirmations.remove_from_followers.message": "{name} mun hætta að fylgjast með þér. Ertu viss um að þú viljir halda áfram?",
"confirmations.remove_from_followers.title": "Fjarlægja fylgjanda?",
"confirmations.revoke_collection_inclusion.confirm": "Fjarlægja mig",
"confirmations.revoke_collection_inclusion.message": "Þessi aðgerð er varanleg og umsjónaraðili safnsins mun ekki geta bætt þér aftur við síðar.",
"confirmations.revoke_collection_inclusion.title": "Á að fjarlægja þig úr þessu safni?",
"confirmations.revoke_quote.confirm": "Fjarlægja færslu",
"confirmations.revoke_quote.message": "Þessa aðgerð er ekki hægt að afturkalla.",
"confirmations.revoke_quote.title": "Fjarlægja færslu?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Crea la collezione",
"collections.delete_collection": "Cancella la collezione",
"collections.description_length_hint": "Limite di 100 caratteri",
"collections.detail.accept_inclusion": "Va bene",
"collections.detail.accounts_heading": "Account",
"collections.detail.author_added_you": "{author} ti ha aggiunto a questa collezione",
"collections.detail.curated_by_author": "Curata da {author}",
"collections.detail.curated_by_you": "Curata da te",
"collections.detail.loading": "Caricamento della collezione…",
"collections.detail.other_accounts_in_collection": "Altri in questa collezione:",
"collections.detail.revoke_inclusion": "Rimuovimi",
"collections.detail.sensitive_note": "Questa collezione contiene account e contenuto che potrebbero essere sensibili ad alcuni utenti.",
"collections.detail.share": "Condividi questa collezione",
"collections.edit_details": "Modifica i dettagli",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Ultimo post più di una settimana fa",
"collections.remove_account": "Rimuovi questo account",
"collections.report_collection": "Segnala questa collezione",
"collections.revoke_collection_inclusion": "Rimuovimi da questa collezione",
"collections.revoke_inclusion.confirmation": "Sei stato/a rimosso/a da \"{collection}\"",
"collections.revoke_inclusion.error": "Si è verificato un errore, si prega di riprovare più tardi.",
"collections.search_accounts_label": "Cerca account da aggiungere…",
"collections.search_accounts_max_reached": "Hai aggiunto il numero massimo di account",
"collections.sensitive": "Sensibile",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Rimuovi il follower",
"confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?",
"confirmations.remove_from_followers.title": "Rimuovere il follower?",
"confirmations.revoke_collection_inclusion.confirm": "Rimuovimi",
"confirmations.revoke_collection_inclusion.message": "Questa azione è permanente e l'utente responsabile della collezione non sarà in grado di aggiungerti nuovamente ad essa in seguito.",
"confirmations.revoke_collection_inclusion.title": "Rimuovere te stesso/a da questa collezione?",
"confirmations.revoke_quote.confirm": "Elimina il post",
"confirmations.revoke_quote.message": "Questa azione non può essere annullata.",
"confirmations.revoke_quote.title": "Rimuovere il post?",

View File

@@ -151,13 +151,38 @@
"account_edit.button.edit": "{item} bewerken",
"account_edit.column_button": "Klaar",
"account_edit.column_title": "Profiel bewerken",
"account_edit.custom_fields.name": "veld",
"account_edit.custom_fields.placeholder": "Voeg je voornaamwoorden, externe links of iets anders toe dat je wilt delen.",
"account_edit.custom_fields.reorder_button": "Velden opnieuw ordenen",
"account_edit.custom_fields.tip_content": "Je kunt gemakkelijk geloofwaardigheid toevoegen aan je Mastodon account door links te controleren naar websites die je bezit.",
"account_edit.custom_fields.tip_title": "Tip: Geverifieerde links toevoegen",
"account_edit.custom_fields.title": "Extra velden",
"account_edit.custom_fields.verified_hint": "Hoe voeg ik een geverifieerde link toe?",
"account_edit.display_name.placeholder": "Je weergavenaam wordt op jouw profiel en op tijdlijnen weergegeven.",
"account_edit.display_name.title": "Weergavenaam",
"account_edit.featured_hashtags.item": "hashtags",
"account_edit.featured_hashtags.placeholder": "Geef anderen een overzicht van en snel toegang tot je favoriete onderwerpen.",
"account_edit.featured_hashtags.title": "Uitgelichte hashtags",
"account_edit.field_delete_modal.confirm": "Weet je zeker dat je dit aangepaste veld wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"account_edit.field_delete_modal.delete_button": "Verwijderen",
"account_edit.field_delete_modal.title": "Aangepast veld verwijderen?",
"account_edit.field_edit_modal.add_title": "Aangepast veld toevoegen",
"account_edit.field_edit_modal.edit_title": "Aangepast veld bewerken",
"account_edit.field_edit_modal.limit_header": "Aanbevolen tekenlimiet overschreden",
"account_edit.field_edit_modal.limit_message": "Mobiele gebruikers zien mogelijk het veld niet volledig.",
"account_edit.field_edit_modal.link_emoji_warning": "We raden aan om aangepaste emoji in combinatie met urls te gebruiken. Aangepaste velden die beide bevatten worden alleen als tekst weergegeven in plaats van als een link, om verwarring van de gebruiker te voorkomen.",
"account_edit.field_edit_modal.name_hint": "Bijv. \"Persoonlijke website\"",
"account_edit.field_edit_modal.name_label": "Label",
"account_edit.field_edit_modal.value_hint": "Bijv. \"voorbeeld.me\"",
"account_edit.field_edit_modal.value_label": "Waarde",
"account_edit.field_reorder_modal.drag_cancel": "Slepen is geannuleerd. Veld \"{item}\" is weggevallen.",
"account_edit.field_reorder_modal.drag_end": "Veld \"{item}\" was weggevallen.",
"account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om aangepaste velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld in zijn nieuwe positie te laten vallen, of druk op escape om te annuleren.",
"account_edit.field_reorder_modal.drag_move": "Veld \"{item}\" is verplaatst.",
"account_edit.field_reorder_modal.drag_over": "Veld \"{item}\" is over \"{over} \" verplaatst.",
"account_edit.field_reorder_modal.drag_start": "Opgepakt veld \"{item}\".",
"account_edit.field_reorder_modal.handle_label": "Veld \"{item}\" slepen",
"account_edit.field_reorder_modal.title": "Velden herschikken",
"account_edit.name_modal.add_title": "Weergavenaam toevoegen",
"account_edit.name_modal.edit_title": "Weergavenaam bewerken",
"account_edit.profile_tab.button_label": "Aanpassen",
@@ -172,6 +197,13 @@
"account_edit.profile_tab.subtitle": "De tabbladen op je profiel aanpassen en wat er op wordt weergegeven.",
"account_edit.profile_tab.title": "Instellingen voor tabblad Profiel",
"account_edit.save": "Opslaan",
"account_edit.verified_modal.details": "Voeg geloofwaardigheid toe aan je Mastodonprofiel door links naar persoonlijke websites te verifiëren. Zo werkt het:",
"account_edit.verified_modal.invisible_link.details": "Voeg de link toe aan uw header. Het belangrijke onderdeel is rel=\"me\" om te voorkomen dat websites impersoneren met door de gebruiker gegenereerde inhoud. Je kunt zelfs een linktag gebruiken in de kop van de pagina in plaats van {tag}, maar de HTML moet toegankelijk zijn zonder JavaScript uit te voeren.",
"account_edit.verified_modal.invisible_link.summary": "Hoe maak ik de link onzichtbaar?",
"account_edit.verified_modal.step1.header": "Kopieer de onderstaande HTML-code en plak deze in de koptekst van je website",
"account_edit.verified_modal.step2.details": "Als je je website al als een aangepast veld hebt toegevoegd, moet je deze verwijderen en opnieuw toevoegen om de verificatie te activeren.",
"account_edit.verified_modal.step2.header": "Voeg je website toe als een aangepast veld",
"account_edit.verified_modal.title": "Hoe voeg je een geverifieerde link toe",
"account_edit_tags.add_tag": "#{tagName} toevoegen",
"account_edit_tags.column_title": "Uitgelichte hashtags bewerken",
"account_edit_tags.help_text": "Uitgelichte hashtags helpen gebruikers je profiel te ontdekken en om er interactie mee te communiceren. Ze verschijnen als filters op je Profielpagina onder het tabblad Activiteit.",
@@ -275,6 +307,8 @@
"callout.dismiss": "Afwijzen",
"carousel.current": "<sr>Bericht</sr> {current, number} / {max, number}",
"carousel.slide": "Bericht {current, number} van {max, number}",
"character_counter.recommended": "{currentLength}/{maxLength} aanbevolen tekens",
"character_counter.required": "{currentLength}/{maxLength} tekens",
"closed_registrations.other_server_instructions": "Omdat Mastodon gedecentraliseerd is, kun je op een andere server een account registreren en vanaf daar nog steeds met deze server communiceren.",
"closed_registrations_modal.description": "Momenteel is het niet mogelijk om op {domain} een account aan te maken. Hou echter in gedachte dat om Mastodon te kunnen gebruiken het niet een vereiste is om op {domain} een account te hebben.",
"closed_registrations_modal.find_another_server": "Een andere server zoeken",
@@ -304,10 +338,15 @@
"collections.create_collection": "Verzameling aanmaken",
"collections.delete_collection": "Verzameling verwijderen",
"collections.description_length_hint": "Maximaal 100 karakters",
"collections.detail.accept_inclusion": "Oké",
"collections.detail.accounts_heading": "Accounts",
"collections.detail.author_added_you": "{author} heeft je aan deze verzameling toegevoegd",
"collections.detail.curated_by_author": "Samengesteld door {author}",
"collections.detail.curated_by_you": "Samengesteld door jou",
"collections.detail.loading": "Verzameling laden…",
"collections.detail.other_accounts_in_collection": "Anderen in deze verzameling:",
"collections.detail.revoke_inclusion": "Verwijder mij",
"collections.detail.sensitive_note": "Deze verzameling bevat accounts en inhoud die mogelijk gevoelig zijn voor sommige gebruikers.",
"collections.detail.share": "Deze verzameling delen",
"collections.edit_details": "Gegevens bewerken",
"collections.error_loading_collections": "Er is een fout opgetreden bij het laden van je verzamelingen.",
@@ -322,6 +361,9 @@
"collections.old_last_post_note": "Meer dan een week geleden voor het laatst een bericht geplaatst",
"collections.remove_account": "Dit account verwijderen",
"collections.report_collection": "Deze verzameling rapporteren",
"collections.revoke_collection_inclusion": "Verwijder mezelf uit deze collectie",
"collections.revoke_inclusion.confirmation": "Je bent verwijderd uit \"{collection}\"",
"collections.revoke_inclusion.error": "Er is een fout opgetreden. Probeer het later opnieuw.",
"collections.search_accounts_label": "Naar accounts zoeken om toe te voegen…",
"collections.search_accounts_max_reached": "Je hebt het maximum aantal accounts toegevoegd",
"collections.sensitive": "Gevoelig",
@@ -445,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Volger verwijderen",
"confirmations.remove_from_followers.message": "{name} zal je niet meer volgen. Weet je zeker dat je wilt doorgaan?",
"confirmations.remove_from_followers.title": "Volger verwijderen?",
"confirmations.revoke_collection_inclusion.confirm": "Verwijder mij",
"confirmations.revoke_collection_inclusion.message": "Deze actie is definitief en de curator kan je later niet opnieuw aan de verzameling toevoegen.",
"confirmations.revoke_collection_inclusion.title": "Verwijder jezelf van deze collectie?",
"confirmations.revoke_quote.confirm": "Bericht verwijderen",
"confirmations.revoke_quote.message": "Deze actie kan niet ongedaan worden gemaakt.",
"confirmations.revoke_quote.title": "Bericht verwijderen?",
@@ -767,6 +812,7 @@
"navigation_bar.automated_deletion": "Automatisch berichten verwijderen",
"navigation_bar.blocks": "Geblokkeerde gebruikers",
"navigation_bar.bookmarks": "Bladwijzers",
"navigation_bar.collections": "Verzamelingen",
"navigation_bar.direct": "Privéberichten",
"navigation_bar.domain_blocks": "Geblokkeerde servers",
"navigation_bar.favourites": "Favorieten",

View File

@@ -2,12 +2,12 @@
"about.blocks": "Servidores moderados",
"about.contact": "Contacto:",
"about.default_locale": "Padrão",
"about.disclaimer": "O Mastodon é um software livre, de código aberto e uma marca registada de Mastodon gGmbH.",
"about.disclaimer": "O Mastodon é um 'software' livre, de código aberto e marca registada de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo não disponível",
"about.domain_blocks.preamble": "O Mastodon ver e interagir com o conteúdo de utilizadores de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.",
"about.domain_blocks.silenced.explanation": "Normalmente não verás perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou optes por segui-los.",
"about.domain_blocks.preamble": "O Mastodon, geralmente, permite-lhe ver conteúdo e interagir com utilizadores de qualquer outro servidor na fediverso. Estas são as exceções aplicadas neste servidor em particular.",
"about.domain_blocks.silenced.explanation": "Normalmente não verá perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou opte por segui-los.",
"about.domain_blocks.silenced.title": "Limitados",
"about.domain_blocks.suspended.explanation": "Nenhum dado deste servidor será processado, armazenado ou trocado, tornando impossível qualquer interação ou comunicação com os utilizadores a partir deste servidor.",
"about.domain_blocks.suspended.explanation": "Nenhum dado deste servidor será processado, armazenado ou trocado, impossibilitando qualquer interação ou comunicação com os utilizadores a partir deste servidor.",
"about.domain_blocks.suspended.title": "Suspensos",
"about.language_label": "Idioma",
"about.not_available": "Esta informação não foi disponibilizada neste servidor.",
@@ -132,7 +132,7 @@
"account.show_reblogs": "Mostrar partilhas de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
"account.timeline.pinned": "Fixado",
"account.timeline.pinned.view_all": "Ver todos as publicações fixadas",
"account.timeline.pinned.view_all": "Ver todas as publicações fixadas",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear o domínio {domain}",
"account.unblock_domain_short": "Desbloquear",
@@ -142,7 +142,7 @@
"account.unmute": "Desocultar @{name}",
"account.unmute_notifications_short": "Desocultar notificações",
"account.unmute_short": "Desocultar",
"account_edit.bio.placeholder": "Adicione uma breve introdução para ajudar à sua identificação por outros.",
"account_edit.bio.placeholder": "Adicione uma breve apresentação para ajudar os outros a identificá-lo.",
"account_edit.bio.title": "Bio",
"account_edit.bio_modal.add_title": "Adicionar biografia",
"account_edit.bio_modal.edit_title": "Editar biografia",
@@ -155,15 +155,26 @@
"account_edit.custom_fields.placeholder": "Adicione os seus pronomes, hiperligações externas ou qualquer outra coisa que queira partilhar.",
"account_edit.custom_fields.reorder_button": "Reordenar campos",
"account_edit.custom_fields.tip_content": "Pode adicionar facilmente credibilidade à sua conta Mastodon, verificando ligações para qualquer website que possua.",
"account_edit.custom_fields.tip_title": "Dica: Adicionando links verificados",
"account_edit.custom_fields.title": "Campos personalizados",
"account_edit.display_name.placeholder": "Como o seu nome vai aparecer no seu perfil e nas linhas do tempo.",
"account_edit.custom_fields.verified_hint": "Como adiciono um link verificado?",
"account_edit.display_name.placeholder": "O seu nome de exibição é como o seu nome aparece no seu perfil e nas linhas do tempo.",
"account_edit.display_name.title": "Nome a mostrar",
"account_edit.featured_hashtags.item": "etiquetas",
"account_edit.featured_hashtags.placeholder": "Ajude à sua identificação por outros e tenha acesso rápido aos seus tópicos favoritos.",
"account_edit.featured_hashtags.title": "Etiquetas em destaque",
"account_edit.field_delete_modal.confirm": "Tem certeza de que deseja excluir este campo personalizado? Esta ação não pode ser desfeita.",
"account_edit.field_delete_modal.delete_button": "Excluir",
"account_edit.field_delete_modal.title": "Excluir campo personalizado?",
"account_edit.field_edit_modal.add_title": "Adicionar campo personalizado",
"account_edit.field_edit_modal.edit_title": "Editar campo personalizado",
"account_edit.field_edit_modal.limit_header": "Limite de caracteres recomendado excedido",
"account_edit.field_edit_modal.limit_message": "Os utilizadores de dispositivos móveis podem não conseguir ver o seu campo na totalidade.",
"account_edit.field_edit_modal.link_emoji_warning": "Recomendamos que não utilize emojis personalizados em conjunto com URLs. Os campos personalizados que contenham ambos serão exibidos apenas como texto em vez de uma hiperligação, de modo a evitar a confusão dos utilizadores.",
"account_edit.field_edit_modal.link_emoji_warning": "Não recomendamos o uso de emojis personalizados em combinação com URLs. Campos personalizados que contenham ambos serão exibidos apenas como texto, em vez de como hiperligação, para evitar confusão aos utilizadores.",
"account_edit.field_edit_modal.name_hint": "Ex.: \"Site pessoal\"",
"account_edit.field_edit_modal.name_label": "Rótulo",
"account_edit.field_edit_modal.value_hint": "Ex.: “exemplo.me”",
"account_edit.field_edit_modal.value_label": "Valor",
"account_edit.field_reorder_modal.drag_cancel": "O arrastamento foi cancelado. O campo \"{item}\" foi largado.",
"account_edit.field_reorder_modal.drag_end": "O campo \"{item}\" foi largado.",
"account_edit.field_reorder_modal.drag_instructions": "Para reorganizar os campos personalizados, prima a tecla de espaço ou enter. Enquanto arrasta, utilize as teclas de setas para mover o campo para cima ou para baixo. Prima novamente a tecla de espaço ou enter para largar o campo na nova posição, ou prima escape para cancelar.",
@@ -177,7 +188,21 @@
"account_edit.profile_tab.button_label": "Personalizar",
"account_edit.profile_tab.hint.description": "Estas configurações personalizam o que os utilizadores veem no {server} nas aplicações oficiais, mas podem não se aplicar aos utilizadores de outros servidores nem aplicações de terceiros.",
"account_edit.profile_tab.hint.title": "A apresentação ainda pode variar",
"account_edit.profile_tab.show_featured.description": "\"Destaques\" é uma aba opcional onde pode mostrar outras contas.",
"account_edit.profile_tab.show_featured.title": "Exibir aba “Destaques”",
"account_edit.profile_tab.show_media.description": "\"Mídia\" é uma aba opcional que mostra as suas publicações contendo imagens ou vídeos.",
"account_edit.profile_tab.show_media.title": "Exibir aba \"Mídia\"",
"account_edit.profile_tab.show_media_replies.description": "Quando ativada, a aba \"Mídia\" exibe tanto as suas publicações quanto as suas respostas às publicações de outras pessoas.",
"account_edit.profile_tab.subtitle": "Personalize as abas do seu perfil e o que elas exibem.",
"account_edit.profile_tab.title": "Configurações da aba do perfil",
"account_edit.save": "Guardar",
"account_edit.verified_modal.details": "Adicione credibilidade ao seu perfil no Mastodon verificando links para sites pessoais. Veja como funciona:",
"account_edit.verified_modal.invisible_link.details": "Adicione o link ao seu cabeçalho. A parte importante é rel=\"me\", que evita a personificação em sites com conteúdo gerado por utilizadores. Você também pode usar uma tag de link no cabeçalho da página em vez de {tag}, mas o HTML deve ser acessível sem executar JavaScript.",
"account_edit.verified_modal.invisible_link.summary": "Como faço para tornar o link invisível?",
"account_edit.verified_modal.step1.header": "Copie o código HTML abaixo e cole no cabeçalho do seu site",
"account_edit.verified_modal.step2.details": "Se já adicionou o seu site como um campo personalizado, será necessário excluí-lo e adicioná-lo novamente para acionar a verificação.",
"account_edit.verified_modal.step2.header": "Adicione o seu site como um campo personalizado",
"account_edit.verified_modal.title": "Como adicionar um link verificado",
"account_edit_tags.add_tag": "Adicionar #{tagName}",
"account_edit_tags.column_title": "Editar etiquetas em destaque",
"account_edit_tags.help_text": "As etiquetas destacadas ajudam os utilizadores a descobrir e interagir com o seu perfil. Aparecem como filtros na vista de atividade da sua página de perfil.",
@@ -210,13 +235,13 @@
"annual_report.announcement.action_build": "Criar o meu Wrapstodon",
"annual_report.announcement.action_dismiss": "Não, obrigado",
"annual_report.announcement.action_view": "Ver o meu Wrapstodon",
"annual_report.announcement.description": "Descobre mais sobre o teu envolvimento com o Mastodon durante o último ano.",
"annual_report.announcement.description": "Descubra mais sobre a sua interação no Mastodon ao longo do último ano.",
"annual_report.announcement.title": "Chegou o Wrapstodon {year}",
"annual_report.nav_item.badge": "Novo",
"annual_report.shared_page.donate": "Doar",
"annual_report.shared_page.footer": "Gerado com {heart} pela equipa do Mastodon",
"annual_report.shared_page.footer_server_info": "{username} utiliza {domain}, uma das muitas comunidades baseadas no Mastodon.",
"annual_report.summary.archetype.booster.desc_public": "{name} permaneceu à procura de publicações para partilhar, promovendo outros criadores com uma precisão perfeita.",
"annual_report.summary.archetype.booster.desc_public": "{name} manteve a procura de publicações para impulsionar, amplificando outros criadores com precisão perfeita.",
"annual_report.summary.archetype.booster.desc_self": "Permaneceu à procura de publicações para partilhar, promovendo outros criadores com uma precisão perfeita.",
"annual_report.summary.archetype.booster.name": "O Arqueiro",
"annual_report.summary.archetype.die_drei_fragezeichen": "???",
@@ -233,7 +258,7 @@
"annual_report.summary.archetype.replier.desc_self": "Respondeu frequentemente às publicações de outras pessoas, polinizando o Mastodon com novas discussões.",
"annual_report.summary.archetype.replier.name": "A Borboleta",
"annual_report.summary.archetype.reveal": "Revelar o meu arquétipo",
"annual_report.summary.archetype.reveal_description": "Obrigado por fazer parte do Mastodon! É hora de descobrir qual arquétipo você encarnou em {year}.",
"annual_report.summary.archetype.reveal_description": "Obrigado por fazer parte do Mastodon! É hora de descobrir qual arquétipo foi incorporado em {year}.",
"annual_report.summary.archetype.title_public": "Arquétipo de {name}",
"annual_report.summary.archetype.title_self": "O seu arquétipo",
"annual_report.summary.close": "Fechar",
@@ -255,7 +280,7 @@
"annual_report.summary.share_on_mastodon": "Partilhar no Mastodon",
"attachments_list.unprocessed": "(não processado)",
"audio.hide": "Ocultar áudio",
"block_modal.remote_users_caveat": "Vamos pedir ao servidor {domain} para respeitar a tua decisão. No entanto, não é garantido o seu cumprimento, uma vez que alguns servidores podem tratar os bloqueios de forma diferente. As publicações públicas podem continuar a ser visíveis para utilizadores não autenticados.",
"block_modal.remote_users_caveat": "Solicitaremos ao servidor {domain} que respeite a sua decisão. No entanto, o cumprimento não é garantido, sendo que alguns servidores podem gerir bloqueios de forma diferente. As publicações públicas podem continuar visíveis para utilizadores não autenticados.",
"block_modal.show_less": "Mostrar menos",
"block_modal.show_more": "Mostrar mais",
"block_modal.they_cant_mention": "Ele não o pode mencionar nem seguir.",
@@ -269,7 +294,7 @@
"bundle_column_error.copy_stacktrace": "Copiar relatório de erros",
"bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.",
"bundle_column_error.error.title": "Ó, não!",
"bundle_column_error.network.body": "Houve um erro ao tentar carregar esta página. Isto pode ocorrer devido a um problema temporário com a tua conexão à internet ou a este servidor.",
"bundle_column_error.network.body": "Ocorreu um erro ao tentar carregar esta página. Isto poderá dever-se a um problema temporário na tua ligação à Internet ou neste servidor.",
"bundle_column_error.network.title": "Erro de rede",
"bundle_column_error.retry": "Tenta de novo",
"bundle_column_error.return": "Voltar à página inicial",
@@ -284,10 +309,11 @@
"character_counter.recommended": "{currentLength}/{maxLength} caracteres recomendados",
"character_counter.required": "{currentLength}/{maxLength} caracteres",
"closed_registrations.other_server_instructions": "Visto que o Mastodon é descentralizado, podes criar uma conta noutro servidor e interagir com este na mesma.",
"closed_registrations_modal.description": "Neste momento não é possível criar uma conta em {domain}, mas lembramos que não é preciso ter uma conta especificamente em {domain} para usar o Mastodon.",
"closed_registrations_modal.description": "Criar uma conta em {domain} não é atualmente possível, mas tenha em atenção que não é necessário ter uma conta especificamente em {domain} para usar o Mastodon.",
"closed_registrations_modal.find_another_server": "Procurar outro servidor",
"closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso não importa onde a tua conta é criada, pois continuarás a poder acompanhar e interagir com qualquer um neste servidor. Podes até alojar o teu próprio servidor!",
"closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso, não importa onde crie a sua conta: poderá seguir e interagir com qualquer utilizador neste servidor. Pode até alojá-lo você próprio!",
"closed_registrations_modal.title": "Criar uma conta no Mastodon",
"collection.share_modal.share_link_label": "Link de convite para partilha",
"collection.share_modal.share_via_post": "Publicar no Mastodon",
"collection.share_modal.share_via_system": "Compartilhar com…",
"collection.share_modal.title": "Partilhar coleção",
@@ -311,10 +337,15 @@
"collections.create_collection": "Criar coleção",
"collections.delete_collection": "Eliminar coleção",
"collections.description_length_hint": "Limite de 100 caracteres",
"collections.detail.accept_inclusion": "OK / Aceitar",
"collections.detail.accounts_heading": "Contas",
"collections.detail.author_added_you": "{author} adicionou-o a esta coleção",
"collections.detail.curated_by_author": "Curado por {author}",
"collections.detail.curated_by_you": "Curado por si",
"collections.detail.loading": "A carregar a coleção…",
"collections.detail.other_accounts_in_collection": "Outros nesta coleção:",
"collections.detail.revoke_inclusion": "Remover-me",
"collections.detail.sensitive_note": "Esta coleção contém contas e conteúdos que podem ser sensíveis para alguns utilizadores.",
"collections.detail.share": "Partilhar esta coleção",
"collections.edit_details": "Editar detalhes",
"collections.error_loading_collections": "Ocorreu um erro ao tentar carregar as suas coleções.",
@@ -329,6 +360,9 @@
"collections.old_last_post_note": "Última publicação há mais de uma semana",
"collections.remove_account": "Remover esta conta",
"collections.report_collection": "Denunciar esta coleção",
"collections.revoke_collection_inclusion": "Remover-me desta coleção",
"collections.revoke_inclusion.confirmation": "Foi removido da coleção \"{collection}\"",
"collections.revoke_inclusion.error": "Ocorreu um erro, por favor tente novamente mais tarde.",
"collections.search_accounts_label": "Procurar contas para adicionar…",
"collections.search_accounts_max_reached": "Já adicionou o máximo de contas",
"collections.sensitive": "Sensível",
@@ -342,7 +376,7 @@
"collections.visibility_unlisted_hint": "Visível para qualquer pessoa com uma hiperligação. Não aparece nos resultados de pesquisa e recomendações.",
"column.about": "Sobre",
"column.blocks": "Utilizadores bloqueados",
"column.bookmarks": "Marcadores",
"column.bookmarks": "Favoritos",
"column.collections": "As minhas coleções",
"column.community": "Cronologia local",
"column.create_list": "Criar lista",
@@ -452,6 +486,9 @@
"confirmations.remove_from_followers.confirm": "Remover seguidor",
"confirmations.remove_from_followers.message": "{name} vai parar de seguir-te. Tens a certeza que prentedes continuar?",
"confirmations.remove_from_followers.title": "Remover seguidor?",
"confirmations.revoke_collection_inclusion.confirm": "Remover-me",
"confirmations.revoke_collection_inclusion.message": "Esta ação é permanente, e o curador não poderá adicioná-lo novamente à coleção mais tarde.",
"confirmations.revoke_collection_inclusion.title": "Remover-se desta coleção?",
"confirmations.revoke_quote.confirm": "Remover publicação",
"confirmations.revoke_quote.message": "Esta ação é irreversível.",
"confirmations.revoke_quote.title": "Remover publicação?",
@@ -469,6 +506,7 @@
"conversation.open": "Ver conversa",
"conversation.with": "Com {names}",
"copy_icon_button.copied": "Copiado para a área de transferência",
"copy_icon_button.copy_this_text": "Copiar link para a área de transferência",
"copypaste.copied": "Copiado",
"copypaste.copy_to_clipboard": "Copiar para a área de transferência",
"directory.federated": "Do fediverso conhecido",
@@ -686,6 +724,7 @@
"keyboard_shortcuts.direct": "Abrir coluna de menções privadas",
"keyboard_shortcuts.down": "mover para baixo na lista",
"keyboard_shortcuts.enter": "abrir publicação",
"keyboard_shortcuts.explore": "Abrir linha do tempo em destaque",
"keyboard_shortcuts.favourite": "assinalar como favorita",
"keyboard_shortcuts.favourites": "abrir lista de favoritos",
"keyboard_shortcuts.federated": "abrir a cronologia federada",
@@ -772,6 +811,7 @@
"navigation_bar.automated_deletion": "Eliminação automática de publicações",
"navigation_bar.blocks": "Utilizadores bloqueados",
"navigation_bar.bookmarks": "Itens salvos",
"navigation_bar.collections": "Coleções",
"navigation_bar.direct": "Menções privadas",
"navigation_bar.domain_blocks": "Domínios escondidos",
"navigation_bar.favourites": "Favoritos",
@@ -808,7 +848,7 @@
"notification.annual_report.view": "Ver #Wrapstodon",
"notification.favourite": "{name} assinalou a tua publicação como favorita",
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# outros}}</a> assinalaram a tua publicação como favorita",
"notification.favourite_pm": "{name} assinalou como favorita a tua menção privada",
"notification.favourite_pm": "{name} assinalou como favorita a sua menção privada",
"notification.favourite_pm.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro favoritou} other {# outros favoritaram}}</a> a tua menção privada",
"notification.follow": "{name} começou a seguir-te",
"notification.follow.name_and_others": "{name} e <a>{count, plural, one {# outro seguiram-te} other {# outros seguiram-te}}</a>",
@@ -1003,7 +1043,7 @@
"report.forward": "Reencaminhar para {target}",
"report.forward_hint": "A conta pertence a outro servidor. Enviar uma cópia anónima da denúncia para esse servidor também?",
"report.mute": "Ocultar",
"report.mute_explanation": "Não verás as publicações dele. Ele não poderá ver as tuas publicações nem seguir-te. Ele não saberá que o ocultaste.",
"report.mute_explanation": "Não verá as publicações dele. Ele não poderá ver as suas publicações nem segui-lo. Ele não saberá que o ocultou.",
"report.next": "Seguinte",
"report.placeholder": "Comentários adicionais",
"report.reasons.dislike": "Não gosto disto",
@@ -1075,6 +1115,9 @@
"sign_in_banner.mastodon_is": "O Mastodon é a melhor maneira de acompanhar o que está a acontecer.",
"sign_in_banner.sign_in": "Iniciar sessão",
"sign_in_banner.sso_redirect": "Inicia a sessão ou cria uma conta",
"skip_links.hotkey": "<span>Tecla de atalho</span> {hotkey}",
"skip_links.skip_to_content": "Ir para o conteúdo principal",
"skip_links.skip_to_navigation": "Ir para a navegação principal",
"status.admin_account": "Abrir a interface de moderação para @{name}",
"status.admin_domain": "Abrir interface de moderação para {domain}",
"status.admin_status": "Abrir esta publicação na interface de moderação",
@@ -1147,7 +1190,7 @@
"status.reblogs.empty": "Ainda ninguém partilhou esta publicação. Quando alguém o fizer, aparecerá aqui.",
"status.reblogs_count": "{count, plural, one {{counter} partilha} other {{counter} partilhas}}",
"status.redraft": "Eliminar e reescrever",
"status.remove_bookmark": "Retirar dos marcadores",
"status.remove_bookmark": "Remover marcador",
"status.remove_favourite": "Remover dos favoritos",
"status.remove_quote": "Remover",
"status.replied_in_thread": "Responder na conversa",

View File

@@ -339,6 +339,7 @@
"collections.detail.curated_by_you": "Nën kujdesin tuaj",
"collections.detail.loading": "Po ngarkohet koleksion…",
"collections.detail.other_accounts_in_collection": "Të tjerë në këtë koleksion:",
"collections.detail.revoke_inclusion": "Hiqmëni",
"collections.detail.sensitive_note": "Ky koleksion përmban llogari dhe lëndë që mund të jetë me spec për disa përdorues.",
"collections.detail.share": "Ndajeni këtë koleksion me të tjerë",
"collections.edit_details": "Përpunoni hollësi",
@@ -354,6 +355,9 @@
"collections.old_last_post_note": "Të postuarat e fundit gjatë një jave më parë",
"collections.remove_account": "Hiqe këtë llogari",
"collections.report_collection": "Raportojeni këtë koleksion",
"collections.revoke_collection_inclusion": "Hiqmëni nga ky koleksion",
"collections.revoke_inclusion.confirmation": "U hoqët nga “{collection}”",
"collections.revoke_inclusion.error": "Pati një gabim, ju lutemi, riprovoni më vonë.",
"collections.search_accounts_label": "Kërkoni për llogari për shtim…",
"collections.search_accounts_max_reached": "Keni shtuar numrin maksimum të llogarive",
"collections.sensitive": "Rezervat",
@@ -477,6 +481,9 @@
"confirmations.remove_from_followers.confirm": "Hiqe ndjekësin",
"confirmations.remove_from_followers.message": "{name} do të reshtë së ndjekuri ju. Jeni i sigurt se doni të vazhdohet?",
"confirmations.remove_from_followers.title": "Të hiqet ndjekësi?",
"confirmations.revoke_collection_inclusion.confirm": "Hiqmëni",
"confirmations.revoke_collection_inclusion.message": "Ky veprim është i përhershëm dhe mirëmbajtësi sdo të jetë në gjendje tju rishtojë te koleksioni më vonë.",
"confirmations.revoke_collection_inclusion.title": "Të hiqeni nga ky koleksion?",
"confirmations.revoke_quote.confirm": "Hiqe postimin",
"confirmations.revoke_quote.message": "Ky veprim smund të zhbëhet.",
"confirmations.revoke_quote.title": "Të hiqet postimi?",

View File

@@ -275,11 +275,14 @@
"collections.create_a_collection_hint": "Skapa en samling för att rekommendera eller dela dina favoritkonton med andra.",
"collections.create_collection": "Skapa samling",
"collections.delete_collection": "Radera samling",
"collections.detail.accept_inclusion": "Okej",
"collections.detail.accounts_heading": "Konton",
"collections.detail.revoke_inclusion": "Ta bort mig",
"collections.error_loading_collections": "Det uppstod ett fel när dina samlingar skulle laddas.",
"collections.hints.accounts_counter": "{count} / {max} konton",
"collections.no_collections_yet": "Inga samlingar än.",
"collections.remove_account": "Ta bort detta konto",
"collections.revoke_inclusion.error": "Ett fel uppstod, försök igen senare.",
"collections.search_accounts_label": "Sök efter konton för att lägga till…",
"collections.search_accounts_max_reached": "Du har lagt till maximalt antal konton",
"collections.view_collection": "Visa samling",
@@ -384,6 +387,7 @@
"confirmations.remove_from_followers.confirm": "Ta bort följare",
"confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?",
"confirmations.remove_from_followers.title": "Ta bort följare?",
"confirmations.revoke_collection_inclusion.confirm": "Ta bort mig",
"confirmations.revoke_quote.confirm": "Ta bort inlägg",
"confirmations.revoke_quote.message": "Denna åtgärd kan inte ångras.",
"confirmations.revoke_quote.title": "Ta bort inlägg?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "Tạo gói khởi đầu",
"collections.delete_collection": "Xóa gói khởi đầu",
"collections.description_length_hint": "Giới hạn 100 ký tự",
"collections.detail.accept_inclusion": "Okay",
"collections.detail.accounts_heading": "Tài khoản",
"collections.detail.author_added_you": "{author} đã thêm bạn vào gói khởi đầu này",
"collections.detail.curated_by_author": "Tuyển chọn bởi {author}",
"collections.detail.curated_by_you": "Tuyển chọn bởi bạn",
"collections.detail.loading": "Đang tải gói khởi đầu…",
"collections.detail.other_accounts_in_collection": "Những người khác trong gói khởi đầu này:",
"collections.detail.revoke_inclusion": "Xóa tôi",
"collections.detail.sensitive_note": "Gói khởi đầu này chứa các tài khoản và nội dung có thể nhạy cảm đối với một số người.",
"collections.detail.share": "Chia sẻ gói khởi đầu này",
"collections.edit_details": "Sửa chi tiết",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "Đăng lần cuối hơn một tuần trước",
"collections.remove_account": "Gỡ tài khoản này",
"collections.report_collection": "Báo cáo gói khởi đầu này",
"collections.revoke_collection_inclusion": "Xóa tôi khỏi gói khởi đầu này",
"collections.revoke_inclusion.confirmation": "Bạn đã được gỡ khỏi \"{collection}\"",
"collections.revoke_inclusion.error": "Đã có lỗi, xin vui lòng thử lại.",
"collections.search_accounts_label": "Tìm tài khoản để thêm…",
"collections.search_accounts_max_reached": "Bạn đã đạt đến số lượng tài khoản tối đa",
"collections.sensitive": "Nhạy cảm",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "Xóa người theo dõi",
"confirmations.remove_from_followers.message": "{name} sẽ không còn theo dõi bạn.Bạn có chắc tiếp tục?",
"confirmations.remove_from_followers.title": "Xóa người theo dõi?",
"confirmations.revoke_collection_inclusion.confirm": "Xóa tôi",
"confirmations.revoke_collection_inclusion.message": "Thao tác này là vĩnh viễn, người tuyển chọn sẽ không thể thêm lại bạn về sau này.",
"confirmations.revoke_collection_inclusion.title": "Xóa bạn khỏi gói khởi đầu này?",
"confirmations.revoke_quote.confirm": "Gỡ tút",
"confirmations.revoke_quote.message": "Hành động này không thể hoàn tác.",
"confirmations.revoke_quote.title": "Gỡ tút?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "创建收藏列表",
"collections.delete_collection": "删除收藏列表",
"collections.description_length_hint": "100字限制",
"collections.detail.accept_inclusion": "确定",
"collections.detail.accounts_heading": "账号",
"collections.detail.author_added_you": "{author} 将你添加到了此收藏列表",
"collections.detail.curated_by_author": "由 {author} 精心挑选",
"collections.detail.curated_by_you": "由你精心挑选",
"collections.detail.loading": "正在加载收藏列表…",
"collections.detail.other_accounts_in_collection": "此收藏列表中的其他人:",
"collections.detail.revoke_inclusion": "移除我",
"collections.detail.sensitive_note": "此收藏列表可能包含某些对部分用户而言为敏感内容的账号或内容。",
"collections.detail.share": "分享此收藏列表",
"collections.edit_details": "编辑详情",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "上次发言于一周多以前",
"collections.remove_account": "移除此账号",
"collections.report_collection": "举报此收藏列表",
"collections.revoke_collection_inclusion": "将自己从此收藏列表中移除",
"collections.revoke_inclusion.confirmation": "你已被从“{collection}”中移除",
"collections.revoke_inclusion.error": "出现错误,请稍后重试。",
"collections.search_accounts_label": "搜索要添加的账号…",
"collections.search_accounts_max_reached": "你添加的账号数量已达上限",
"collections.sensitive": "敏感内容",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "移除关注者",
"confirmations.remove_from_followers.message": "{name} 将停止关注你。你确定要继续吗?",
"confirmations.remove_from_followers.title": "移除关注者?",
"confirmations.revoke_collection_inclusion.confirm": "移除我",
"confirmations.revoke_collection_inclusion.message": "此操作是永久的,且此收藏列表的制作者之后将无法再将你添加到其中。",
"confirmations.revoke_collection_inclusion.title": "将自己从此收藏列表中移除吗?",
"confirmations.revoke_quote.confirm": "移除嘟文",
"confirmations.revoke_quote.message": "此操作无法撤销。",
"confirmations.revoke_quote.title": "移除嘟文?",

View File

@@ -338,12 +338,14 @@
"collections.create_collection": "建立收藏名單",
"collections.delete_collection": "刪除收藏名單",
"collections.description_length_hint": "100 字限制",
"collections.detail.accept_inclusion": "Okay",
"collections.detail.accounts_heading": "帳號",
"collections.detail.author_added_you": "{author} 將您加入至此收藏名單",
"collections.detail.curated_by_author": "由 {author} 精選",
"collections.detail.curated_by_you": "由您精選",
"collections.detail.loading": "讀取收藏名單中...",
"collections.detail.other_accounts_in_collection": "此收藏名單中其他人:",
"collections.detail.revoke_inclusion": "移除我",
"collections.detail.sensitive_note": "此收藏名單可能包含對某些使用者敏感之帳號或內容。",
"collections.detail.share": "分享此收藏名單",
"collections.edit_details": "編輯詳細資料",
@@ -359,6 +361,9 @@
"collections.old_last_post_note": "上次發表嘟文已超過一週",
"collections.remove_account": "移除此帳號",
"collections.report_collection": "檢舉此收藏名單",
"collections.revoke_collection_inclusion": "將我自此收藏名單中移除",
"collections.revoke_inclusion.confirmation": "您已自「{collection}」中被移除",
"collections.revoke_inclusion.error": "發生錯誤,請稍候重試。",
"collections.search_accounts_label": "搜尋帳號以加入...",
"collections.search_accounts_max_reached": "您新增之帳號數已達上限",
"collections.sensitive": "敏感內容",
@@ -482,6 +487,9 @@
"confirmations.remove_from_followers.confirm": "移除跟隨者",
"confirmations.remove_from_followers.message": "{name} 將停止跟隨您。您確定要繼續嗎?",
"confirmations.remove_from_followers.title": "是否移除該跟隨者?",
"confirmations.revoke_collection_inclusion.confirm": "移除我",
"confirmations.revoke_collection_inclusion.message": "此操作永久有效,且該收藏名單之擁有者無法稍候將您再次加入至此收藏名單。",
"confirmations.revoke_collection_inclusion.title": "是否將您自此收藏名單中移除?",
"confirmations.revoke_quote.confirm": "移除嘟文",
"confirmations.revoke_quote.message": "此動作無法復原。",
"confirmations.revoke_quote.title": "是否移除該嘟文?",

View File

@@ -5,7 +5,8 @@
# Table name: collections
#
# id :bigint(8) not null, primary key
# description :text not null
# description :text
# description_html :text
# discoverable :boolean not null
# item_count :integer default(0), not null
# language :string
@@ -30,7 +31,10 @@ class Collection < ApplicationRecord
has_many :collection_reports, dependent: :delete_all
validates :name, presence: true
validates :description, presence: true
validates :description, presence: true,
if: :local?
validates :description_html, presence: true,
if: :remote?
validates :local, inclusion: [true, false]
validates :sensitive, inclusion: [true, false]
validates :discoverable, inclusion: [true, false]

View File

@@ -209,8 +209,10 @@ class User < ApplicationRecord
increment(:sign_in_count) if new_sign_in
save(validate: false) unless new_record?
prepare_returning_user!
unless new_record?
save(validate: false)
prepare_returning_user!
end
end
def pending?

View File

@@ -13,6 +13,10 @@ class REST::CollectionSerializer < ActiveModel::Serializer
object.id.to_s
end
def description
object.local? ? object.description : object.description_html
end
def items
object.items_for(current_user&.account)
end

View File

@@ -22,6 +22,8 @@ class WebfingerSerializer < ActiveModel::Serializer
{ rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: profile_page_href },
{ rel: 'self', type: 'application/activity+json', href: self_href },
{ rel: 'http://ostatus.org/schema/1.0/subscribe', template: "#{authorize_interaction_url}?uri={uri}" },
{ rel: 'https://w3id.org/fep/3b86/Create', template: "#{share_url}?text={content}" },
{ rel: 'https://w3id.org/fep/3b86/Object', template: "#{authorize_interaction_url}?uri={object}" },
].tap do |x|
x << { rel: 'http://webfinger.net/rel/avatar', type: object.avatar.content_type, href: full_asset_url(object.avatar_original_url) } if show_avatar?
end

View File

@@ -841,10 +841,10 @@ el:
desc: Όταν οι χρήστες σου κάνουν κλικ συνδέσμους σε εξωτερικές ιστοσελίδες, το πρόγραμμα περιήγησής τους μπορεί να στείλει τη διεύθυνση του διακομιστή σας Mastodon ως αναφέρων. Απενεργοποίησέ το αν αυτό θα αναγνώριζε μοναδικά τους χρήστες σου, π.χ. αν αυτός είναι ένας προσωπικός διακομιστής Mastodon.
title: Να επιτρέπεται σε εξωτερικούς ιστότοπους να βλέπουν τον διακομιστή Mastodon σου ως πηγή κίνησης
appearance:
preamble: Προσάρμοσε την ιστοσελίδα του Mastodon.
preamble: Προσάρμοσε τη διεπαφή ιστού του Mastodon.
title: Εμφάνιση
branding:
preamble: Η ταυτότητα του διακομιστή σου, τον διαφοροποιεί από άλλους διακομιστές του δικτύου. Αυτές οι πληροφορίες μπορεί να εμφανίζονται σε διάφορα περιβάλλοντα, όπως η ιστοσελίδα του Mastodon, εγγενείς εφαρμογές, σε προεπισκοπήσεις συνδέσμου σε άλλους ιστότοπους και εντός εφαρμογών μηνυμάτων και ούτω καθεξής. Γι' αυτό, είναι καλύτερο να διατηρούνται αυτές οι πληροφορίες σαφείς, σύντομες και συνοπτικές.
preamble: Η ταυτότητα του διακομιστή σου, τον διαφοροποιεί από άλλους διακομιστές του δικτύου. Αυτές οι πληροφορίες μπορεί να εμφανίζονται σε διάφορα περιβάλλοντα, όπως η διεπαφή ιστού του Mastodon, εγγενείς εφαρμογές, σε προεπισκοπήσεις συνδέσμου σε άλλους ιστότοπους και εντός εφαρμογών μηνυμάτων και ούτω καθεξής. Γι' αυτό, είναι καλύτερο να διατηρούνται αυτές οι πληροφορίες σαφείς, σύντομες και συνοπτικές.
title: Ταυτότητα
captcha_enabled:
desc_html: Αυτό βασίζεται σε εξωτερικά scripts από το hCaptcha, όπου υπάρχει ανησυχία πέρι ασφάλειας και ιδιωτηκότητας. Επιπρόσθετα, <strong> μπορεί να κάνει τη διαδικασία εγγραφής πολύ λιγότερο προσβάσιμη για κάποια άτομα (ειδικά αυτά με αναπηρίες)</strong>. Για αυτούς τους λόγους, παρακαλώ σκέψου άλλου τρόπους εγγραφής όπως με αποδοχή ή με πρόσκληση.
@@ -1433,7 +1433,7 @@ el:
content: Λυπούμαστε, κάτι πήγε στραβά από τη δική μας μεριά.
title: Η σελίδα αυτή δεν είναι σωστή
'503': Η σελίδα δε μπόρεσε να εμφανιστεί λόγω προσωρινού σφάλματος του διακομιστή.
noscript_html: Για να χρησιμοποιήσεις τη δικτυακή εφαρμογή του Mastodon, ενεργοποίησε την Javascript. Εναλλακτικά, δοκίμασε μια από τις <a href="%{apps_path}">εφαρμογές</a> για το Mastodon για την πλατφόρμα σου.
noscript_html: Για να χρησιμοποιήσεις την εφαρμογή ιστού του Mastodon, παρακαλούμε ενεργοποίησε την Javascript. Εναλλακτικά, δοκίμασε μια από τις <a href="%{apps_path}">εφαρμογές</a> για το Mastodon για την πλατφόρμα σου.
existing_username_validator:
not_found: δεν βρέθηκε τοπικός χρήστης με αυτό το όνομα
not_found_multiple: δεν βρέθηκε %{usernames}
@@ -1471,7 +1471,7 @@ el:
statuses_hint_html: Αυτό το φίλτρο εφαρμόζεται για την επιλογή μεμονωμένων αναρτήσεων, ανεξάρτητα από το αν αντιστοιχούν με τις λέξεις-κλειδιά παρακάτω. <a href="%{path}">Επισκόπηση ή αφαίρεση αναρτήσεων από το φίλτρο</a>.
title: Επεξεργασία φίλτρου
errors:
deprecated_api_multiple_keywords: Αυτές οι παράμετροι δεν μπορούν να αλλάξουν από αυτήν την εφαρμογή επειδή ισχύουν για περισσότερες από μία λέξεις-κλειδιά φίλτρου. Χρησιμοποίησε μια πιο πρόσφατη εφαρμογή ή την ιστοσελίδα.
deprecated_api_multiple_keywords: Αυτές οι παράμετροι δεν μπορούν να αλλάξουν από αυτήν την εφαρμογή επειδή ισχύουν για περισσότερες από μία λέξεις-κλειδιά φίλτρου. Χρησιμοποίησε μια πιο πρόσφατη εφαρμογή ή τη διεπαφή ιστού.
invalid_context: Δόθηκε κενό ή μη έγκυρο περιεχόμενο
index:
contexts: Φίλτρα σε %{contexts}
@@ -1497,7 +1497,7 @@ el:
batch:
remove: Αφαίρεση από φίλτρο
index:
hint: Αυτό το φίλτρο ισχύει για την επιλογή μεμονωμένων αναρτήσεων ανεξάρτητα από άλλα κριτήρια. Μπορείς να προσθέσεις περισσότερες αναρτήσεις σε αυτό το φίλτρο από την ιστοσελίδα.
hint: Αυτό το φίλτρο ισχύει για την επιλογή μεμονωμένων αναρτήσεων ανεξάρτητα από άλλα κριτήρια. Μπορείς να προσθέσεις περισσότερες αναρτήσεις σε αυτό το φίλτρο από τη διεπαφή ιστού.
title: Φιλτραρισμένες αναρτήσεις
generic:
all: Όλα

View File

@@ -91,7 +91,7 @@ el:
bootstrap_timeline_accounts: Αυτοί οι λογαριασμοί θα καρφιτσωθούν στην κορυφή των προτεινόμενων ακολουθήσεων για νέους χρήστες. Παρέχετε μια λίστα λογαριασμών χωρισμένη με κόμμα.
closed_registrations_message: Εμφανίζεται όταν κλείνουν οι εγγραφές
content_cache_retention_period: Όλες οι αναρτήσεις από άλλους διακομιστές (συμπεριλαμβανομένων των ενισχύσεων και απαντήσεων) θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών, χωρίς να λαμβάνεται υπόψη οποιαδήποτε αλληλεπίδραση τοπικού χρήστη με αυτές τις αναρτήσεις. Αυτό περιλαμβάνει αναρτήσεις όπου ένας τοπικός χρήστης την έχει χαρακτηρίσει ως σελιδοδείκτη ή αγαπημένη. Θα χαθούν επίσης ιδιωτικές επισημάνσεις μεταξύ χρηστών από διαφορετικές οντότητες και θα είναι αδύνατο να αποκατασταθούν. Η χρήση αυτής της ρύθμισης προορίζεται για οντότητες ειδικού σκοπού και χαλάει πολλές προσδοκίες του χρήστη όταν εφαρμόζεται για χρήση γενική σκοπού.
custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστοσελίδας του Mastodon.
custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστού του Mastodon.
favicon: WEBP, PNG, GIF ή JPG. Παρακάμπτει το προεπιλεγμένο favicon του Mastodon με ένα προσαρμοσμένο εικονίδιο.
landing_page: Επιλέγει ποια σελίδα βλέπουν οι νέοι επισκέπτες όταν φτάνουν για πρώτη φορά στο διακομιστή σας. Αν επιλέξετε "Τάσεις", τότε οι τάσεις πρέπει να είναι ενεργοποιημένες στις Ρυθμίσεις Ανακάλυψης. Αν επιλέξετε "Τοπική ροή", τότε το "Πρόσβαση σε ζωντανές ροές με τοπικές αναρτήσεις" πρέπει να οριστεί σε "Όλοι" στις Ρυθμίσεις Ανακάλυψης.
mascot: Παρακάμπτει την εικονογραφία στην προηγμένη διεπαφή ιστού.
@@ -236,7 +236,7 @@ el:
otp_attempt: Κωδικός δυο παραγόντων
password: Συνθηματικό
phrase: Λέξη-κλειδί ή φράση
setting_advanced_layout: Ενεργοποίηση προηγμένης λειτουργίας χρήσης
setting_advanced_layout: Ενεργοποίηση προηγμένης διεπαφής ιστού
setting_aggregate_reblogs: Ομαδοποίηση προωθήσεων στις ροές
setting_always_send_emails: Πάντα να αποστέλλονται ειδοποίησεις μέσω email
setting_auto_play_gif: Αυτόματη αναπαραγωγή των GIF

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
class AddDescriptionHtmlToCollections < ActiveRecord::Migration[8.1]
def change
add_column :collections, :description_html, :text
reversible do |direction|
direction.up { change_column :collections, :description, :text, null: true }
direction.down { change_column :collections, :description, :text, null: false }
end
end
end

View File

@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2026_03_03_144409) do
ActiveRecord::Schema[8.1].define(version: 2026_03_10_095021) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql"
@@ -387,7 +387,8 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_03_144409) do
create_table "collections", id: :bigint, default: -> { "timestamp_id('collections'::text)" }, force: :cascade do |t|
t.bigint "account_id", null: false
t.datetime "created_at", null: false
t.text "description", null: false
t.text "description"
t.text "description_html"
t.boolean "discoverable", null: false
t.integer "item_count", default: 0, null: false
t.string "language"

View File

@@ -3,7 +3,7 @@
## Overview
Before starting local development, read the [CONTRIBUTING] guide to understand
what changes are desirable and what general processes to use.
what changes are desirable and what general processes to use. You should also read the project's [AI Contribution Policy] to understand how we approach AI-assisted contributions.
## Environments
@@ -103,3 +103,4 @@ development environment configured with the software needed for this project.
[GitHub Codespaces]: https://docs.github.com/en/codespaces
[Homebrew]: https://brew.sh
[Mastodon docs]: https://docs.joinmastodon.org/dev/setup/#working-with-emails-in-development
[AI Contribution Policy]: https://github.com/mastodon/.github/blob/main/AI_POLICY.md

View File

@@ -0,0 +1,45 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe InstancesIndex do
context 'when elasticsearch is enabled', :search do
describe 'indexing records' do
before do
Fabricate :account, domain: 'host.example'
Instance.refresh
end
it 'indexes records from scope' do
expect { described_class.import }
.to change(described_class, :count).by(1)
end
end
end
describe 'Searching the index' do
before do
mock_elasticsearch_response(described_class, raw_response)
end
it 'returns results from a query' do
results = described_class.query(match: { name: 'account' })
expect(results).to eq []
end
end
def raw_response
{
took: 3,
hits: {
hits: [
{
_id: '0',
_score: 1.6375021,
},
],
},
}
end
end

View File

@@ -12,6 +12,8 @@ end
Fabricator(:remote_collection, from: :collection) do
account { Fabricate.build(:remote_account) }
local false
description nil
description_html '<p>People to follow</p>'
uri { sequence(:uri) { |i| "https://example.com/collections/#{i}" } }
original_number_of_items 0
end

View File

@@ -23,6 +23,10 @@ RSpec.describe Collection do
context 'when collection is remote' do
subject { Fabricate.build :collection, local: false }
it { is_expected.to_not validate_presence_of(:description) }
it { is_expected.to validate_presence_of(:description_html) }
it { is_expected.to validate_presence_of(:uri) }
it { is_expected.to validate_presence_of(:original_number_of_items) }

View File

@@ -208,9 +208,13 @@ RSpec.describe User do
context 'with a new user' do
let(:user) { Fabricate.build :user }
before { allow(ActivityTracker).to receive(:record) }
it 'does not persist the user' do
expect { user.update_sign_in! }
.to_not change(user, :persisted?).from(false)
expect(ActivityTracker)
.to_not have_received(:record).with('activity:logins', anything)
end
end
end

View File

@@ -138,12 +138,6 @@ RSpec.configure do |config|
example.run
end
config.around(:each, type: :search) do |example|
Chewy.settings[:enabled] = true
example.run
Chewy.settings[:enabled] = false
end
config.before :each, type: :cli do
stub_reset_connection_pools
end

View File

@@ -3,48 +3,48 @@
require 'rails_helper'
RSpec.describe Account::Search do
describe 'a non-discoverable account becoming discoverable' do
let(:account) { Account.find_by(username: 'search_test_account_1') }
describe 'Callbacks for discoverable changes' do
let(:results) { AccountsIndex.filter(term: { username: account.username }) }
context 'when picking a non-discoverable account' do
it 'its bio is not in the AccountsIndex' do
results = AccountsIndex.filter(term: { username: account.username })
expect(results.count).to eq(1)
expect(results.first.text).to be_nil
context 'with a non-discoverable account' do
let(:account) { Fabricate :account, discoverable: false, note: 'Account note' }
context 'when looking for the non discoverable account' do
it 'is missing account bio in the AccountsIndex' do
expect(results.count)
.to eq(1)
expect(results.first.text)
.to be_nil
end
end
context 'when the account becomes discoverable' do
it 'has an account bio in the AccountsIndex' do
expect { account.update! discoverable: true }
.to change { results.first.text }.from(be_blank).to(account.note)
.and not_change(results, :count).from(1)
end
end
end
context 'when the non-discoverable account becomes discoverable' do
it 'its bio is added to the AccountsIndex' do
account.discoverable = true
account.save!
describe 'with a discoverable account' do
let(:account) { Fabricate :account, discoverable: true }
results = AccountsIndex.filter(term: { username: account.username })
expect(results.count).to eq(1)
expect(results.first.text).to eq(account.note)
context 'when looking for the account' do
it 'is present in the AccountsIndex' do
expect(results.count)
.to eq(1)
expect(results.first.text)
.to eq(account.note)
end
end
end
end
describe 'a discoverable account becoming non-discoverable' do
let(:account) { Account.find_by(username: 'search_test_account_0') }
context 'when picking an discoverable account' do
it 'has its bio in the AccountsIndex' do
results = AccountsIndex.filter(term: { username: account.username })
expect(results.count).to eq(1)
expect(results.first.text).to eq(account.note)
end
end
context 'when the discoverable account becomes non-discoverable' do
it 'its bio is removed from the AccountsIndex' do
account.discoverable = false
account.save!
results = AccountsIndex.filter(term: { username: account.username })
expect(results.count).to eq(1)
expect(results.first.text).to be_nil
context 'when the account becomes non-discoverable' do
it 'is missing from the AccountsIndex' do
expect { account.update! discoverable: false }
.to change { results.first.text }.from(account.note).to(be_blank)
.and not_change(results, :count).from(1)
end
end
end
end

View File

@@ -3,50 +3,55 @@
require 'rails_helper'
RSpec.describe Account::StatusesSearch, :inline_jobs do
describe 'a non-indexable account becoming indexable' do
let(:account) { Account.find_by(username: 'search_test_account_1') }
describe 'Callbacks for indexable changes' do
let(:account) { Fabricate :account, indexable: }
let(:public_statuses_results) { PublicStatusesIndex.filter(term: { account_id: account.id }) }
let(:statuses_results) { StatusesIndex.filter(term: { account_id: account.id }) }
context 'when picking a non-indexable account' do
it 'has no statuses in the PublicStatusesIndex' do
expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(0)
before do
Fabricate :status, account:, visibility: :private
Fabricate :status, account:, visibility: :public
end
context 'with a non-indexable account' do
let(:indexable) { false }
context 'when looking for statuses from the account' do
it 'does not have public index statuses' do
expect(public_statuses_results.count)
.to eq(0)
expect(statuses_results.count)
.to eq(account.statuses.count)
end
end
it 'has statuses in the StatusesIndex' do
expect(StatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.count)
context 'when the non-indexable account becomes indexable' do
it 'does have public index statuses' do
expect { account.update! indexable: true }
.to change(public_statuses_results, :count).to(account.statuses.public_visibility.count)
.and not_change(statuses_results, :count).from(account.statuses.count)
end
end
end
context 'when the non-indexable account becomes indexable' do
it 'adds the public statuses to the PublicStatusesIndex' do
account.indexable = true
account.save!
describe 'with an indexable account' do
let(:indexable) { true }
expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.public_visibility.count)
expect(StatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.count)
end
end
end
describe 'an indexable account becoming non-indexable' do
let(:account) { Account.find_by(username: 'search_test_account_0') }
context 'when picking an indexable account' do
it 'has statuses in the PublicStatusesIndex' do
expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.public_visibility.count)
context 'when picking an indexable account' do
it 'does have public index statuses' do
expect(public_statuses_results.count)
.to eq(account.statuses.public_visibility.count)
expect(statuses_results.count)
.to eq(account.statuses.count)
end
end
it 'has statuses in the StatusesIndex' do
expect(StatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.count)
end
end
context 'when the indexable account becomes non-indexable' do
it 'removes the statuses from the PublicStatusesIndex' do
account.indexable = false
account.save!
expect(PublicStatusesIndex.filter(term: { account_id: account.id }).count).to eq(0)
expect(StatusesIndex.filter(term: { account_id: account.id }).count).to eq(account.statuses.count)
context 'when the indexable account becomes non-indexable' do
it 'does not have public index statuses' do
expect { account.update! indexable: false }
.to change(public_statuses_results, :count).to(0)
.and not_change(statuses_results, :count).from(account.statuses.count)
end
end
end
end

View File

@@ -43,4 +43,13 @@ RSpec.describe REST::CollectionSerializer do
'items' => []
)
end
context 'when the collection is remote' do
let(:collection) { Fabricate(:remote_collection, description_html: '<p>remote</p>') }
it 'includes the html description' do
expect(subject)
.to include('description' => '<p>remote</p>')
end
end
end

33
spec/support/search.rb Normal file
View File

@@ -0,0 +1,33 @@
# frozen_string_literal: true
RSpec.configure do |config|
config.before :suite do
if search_examples_present?
Chewy.settings[:enabled] = true
# Configure chewy to use `urgent` strategy to index documents immediately
Chewy.strategy(:urgent)
else
Chewy.settings[:enabled] = false
end
end
config.after :each, :search do
search_indices.each(&:delete)
end
private
def search_indices
[
AccountsIndex,
InstancesIndex,
PublicStatusesIndex,
StatusesIndex,
TagsIndex,
]
end
def search_examples_present?
RSpec.world.filtered_examples.values.flatten.any? { |example| example.metadata[:search] == true }
end
end

View File

@@ -1,81 +0,0 @@
# frozen_string_literal: true
class SearchDataManager
def prepare_test_data
4.times do |i|
username = "search_test_account_#{i}"
account = Fabricate.create(:account, username: username, indexable: i.even?, discoverable: i.even?, note: "Lover of #{i}.")
2.times do |j|
Fabricate.create(:status, account: account, text: "#{username}'s #{j} post", visibility: j.even? ? :public : :private)
end
end
3.times do |i|
Fabricate.create(:tag, name: "search_test_tag_#{i}")
end
end
def indexes
[
AccountsIndex,
PublicStatusesIndex,
StatusesIndex,
TagsIndex,
]
end
def populate_indexes
indexes.each do |index_class|
index_class.purge!
index_class.import!
end
end
def remove_indexes
indexes.each(&:delete!)
end
def cleanup_test_data
Status.destroy_all
Account.destroy_all
Tag.destroy_all
end
end
RSpec.configure do |config|
config.before :suite do
if search_examples_present?
Chewy.settings[:enabled] = true
# Configure chewy to use `urgent` strategy to index documents
Chewy.strategy(:urgent)
# Create search data
search_data_manager.prepare_test_data
else
Chewy.settings[:enabled] = false
end
end
config.after :suite do
if search_examples_present?
# Clean up after search data
search_data_manager.cleanup_test_data
end
end
config.around :each, :search do |example|
search_data_manager.populate_indexes
example.run
search_data_manager.remove_indexes
end
private
def search_data_manager
@search_data_manager ||= SearchDataManager.new
end
def search_examples_present?
RSpec.world.filtered_examples.values.flatten.any? { |example| example.metadata[:search] == true }
end
end

View File

@@ -7,7 +7,17 @@ RSpec.describe Scheduler::InstanceRefreshScheduler do
describe 'perform' do
it 'runs without error' do
expect { worker.perform }.to_not raise_error
expect { worker.perform }
.to_not raise_error
end
end
context 'with elasticsearch enabled', :search do
before { Fabricate :remote_account }
it 'updates search indexes' do
expect { worker.perform }
.to change(InstancesIndex, :count).by(1)
end
end
end