mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-02-15 07:03:49 -05:00
Merge commit 'f79b96a5ef0f6c4f57eee7f44ce2579b28a22098' into glitch-soc/merge-upstream
Conflicts: - `app/lib/feed_manager.rb`: Not a real conflict, but glitch-soc has an extra `populate_direct_feed` method. Added upstream's code. - `app/models/user_settings.rb`: Not a real conflict, glitch-soc has an extra setting textually-adjacent to a setting added upstream. Added upstream's setting. - `app/serializers/initial_state_serializer.rb`: Same. - `app/services/precompute_feed_service.rb`: Not a real conflict, glitch-soc has extra code for the direct feed. Added upstream's new code for populating lists.
This commit is contained in:
commit
c85616ee3a
@ -9,6 +9,7 @@
|
|||||||
# See: https://docs.docker.com/build/building/multi-platform/
|
# See: https://docs.docker.com/build/building/multi-platform/
|
||||||
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
||||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
||||||
|
ARG BASE_REGISTRY="docker.io"
|
||||||
|
|
||||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
|
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
|
||||||
# renovate: datasource=docker depName=docker.io/ruby
|
# renovate: datasource=docker depName=docker.io/ruby
|
||||||
@ -19,9 +20,9 @@ ARG NODE_MAJOR_VERSION="22"
|
|||||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
||||||
ARG DEBIAN_VERSION="bookworm"
|
ARG DEBIAN_VERSION="bookworm"
|
||||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||||
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
|
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
|
||||||
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
|
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
|
||||||
FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
||||||
|
|
||||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||||
# Example: v4.3.0-nightly.2023.11.09+pr-123456
|
# Example: v4.3.0-nightly.2023.11.09+pr-123456
|
||||||
|
10
Gemfile.lock
10
Gemfile.lock
@ -273,7 +273,7 @@ GEM
|
|||||||
activesupport (>= 5.1)
|
activesupport (>= 5.1)
|
||||||
haml (>= 4.0.6)
|
haml (>= 4.0.6)
|
||||||
railties (>= 5.1)
|
railties (>= 5.1)
|
||||||
haml_lint (0.59.0)
|
haml_lint (0.60.0)
|
||||||
haml (>= 5.0)
|
haml (>= 5.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
rainbow
|
rainbow
|
||||||
@ -591,7 +591,7 @@ GEM
|
|||||||
date
|
date
|
||||||
stringio
|
stringio
|
||||||
public_suffix (6.0.1)
|
public_suffix (6.0.1)
|
||||||
puma (6.5.0)
|
puma (6.6.0)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.4.0)
|
pundit (2.4.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
@ -716,14 +716,14 @@ GEM
|
|||||||
rspec-mocks (~> 3.0)
|
rspec-mocks (~> 3.0)
|
||||||
sidekiq (>= 5, < 8)
|
sidekiq (>= 5, < 8)
|
||||||
rspec-support (3.13.2)
|
rspec-support (3.13.2)
|
||||||
rubocop (1.71.0)
|
rubocop (1.71.1)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (>= 3.17.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.3.0.2)
|
parser (>= 3.3.0.2)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 2.9.3, < 3.0)
|
regexp_parser (>= 2.9.3, < 3.0)
|
||||||
rubocop-ast (>= 1.36.2, < 2.0)
|
rubocop-ast (>= 1.38.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 4.0)
|
unicode-display_width (>= 2.4.0, < 4.0)
|
||||||
rubocop-ast (1.38.0)
|
rubocop-ast (1.38.0)
|
||||||
@ -818,7 +818,7 @@ GEM
|
|||||||
climate_control
|
climate_control
|
||||||
test-prof (1.4.4)
|
test-prof (1.4.4)
|
||||||
thor (1.3.2)
|
thor (1.3.2)
|
||||||
tilt (2.5.0)
|
tilt (2.6.0)
|
||||||
timeout (0.4.3)
|
timeout (0.4.3)
|
||||||
tpm-key_attestation (0.12.1)
|
tpm-key_attestation (0.12.1)
|
||||||
bindata (~> 2.4)
|
bindata (~> 2.4)
|
||||||
|
55
app/javascript/hooks/useSelectableClick.ts
Normal file
55
app/javascript/hooks/useSelectableClick.ts
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { useRef, useCallback } from 'react';
|
||||||
|
|
||||||
|
type Position = [number, number];
|
||||||
|
|
||||||
|
export const useSelectableClick = (
|
||||||
|
onClick: React.MouseEventHandler,
|
||||||
|
maxDelta = 5,
|
||||||
|
) => {
|
||||||
|
const clickPositionRef = useRef<Position | null>(null);
|
||||||
|
|
||||||
|
const handleMouseDown = useCallback((e: React.MouseEvent) => {
|
||||||
|
clickPositionRef.current = [e.clientX, e.clientY];
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleMouseUp = useCallback(
|
||||||
|
(e: React.MouseEvent) => {
|
||||||
|
if (!clickPositionRef.current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [startX, startY] = clickPositionRef.current;
|
||||||
|
const [deltaX, deltaY] = [
|
||||||
|
Math.abs(e.clientX - startX),
|
||||||
|
Math.abs(e.clientY - startY),
|
||||||
|
];
|
||||||
|
|
||||||
|
let element: EventTarget | null = e.target;
|
||||||
|
|
||||||
|
while (element && element instanceof HTMLElement) {
|
||||||
|
if (
|
||||||
|
element.localName === 'button' ||
|
||||||
|
element.localName === 'a' ||
|
||||||
|
element.localName === 'label'
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
element = element.parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
deltaX + deltaY < maxDelta &&
|
||||||
|
(e.button === 0 || e.button === 1) &&
|
||||||
|
e.detail >= 1
|
||||||
|
) {
|
||||||
|
onClick(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
clickPositionRef.current = null;
|
||||||
|
},
|
||||||
|
[maxDelta, onClick],
|
||||||
|
);
|
||||||
|
|
||||||
|
return [handleMouseDown, handleMouseUp] as const;
|
||||||
|
};
|
@ -1,4 +1,4 @@
|
|||||||
import { useState, useCallback, useRef } from 'react';
|
import { useState, useCallback, useRef, useId } from 'react';
|
||||||
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
@ -8,12 +8,15 @@ import type {
|
|||||||
UsePopperOptions,
|
UsePopperOptions,
|
||||||
} from 'react-overlays/esm/usePopper';
|
} from 'react-overlays/esm/usePopper';
|
||||||
|
|
||||||
|
import { useSelectableClick } from '@/hooks/useSelectableClick';
|
||||||
|
|
||||||
const offset = [0, 4] as OffsetValue;
|
const offset = [0, 4] as OffsetValue;
|
||||||
const popperConfig = { strategy: 'fixed' } as UsePopperOptions;
|
const popperConfig = { strategy: 'fixed' } as UsePopperOptions;
|
||||||
|
|
||||||
export const AltTextBadge: React.FC<{
|
export const AltTextBadge: React.FC<{
|
||||||
description: string;
|
description: string;
|
||||||
}> = ({ description }) => {
|
}> = ({ description }) => {
|
||||||
|
const accessibilityId = useId();
|
||||||
const anchorRef = useRef<HTMLButtonElement>(null);
|
const anchorRef = useRef<HTMLButtonElement>(null);
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
@ -25,12 +28,16 @@ export const AltTextBadge: React.FC<{
|
|||||||
setOpen(false);
|
setOpen(false);
|
||||||
}, [setOpen]);
|
}, [setOpen]);
|
||||||
|
|
||||||
|
const [handleMouseDown, handleMouseUp] = useSelectableClick(handleClose);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
ref={anchorRef}
|
ref={anchorRef}
|
||||||
className='media-gallery__alt__label'
|
className='media-gallery__alt__label'
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
aria-expanded={open}
|
||||||
|
aria-controls={accessibilityId}
|
||||||
>
|
>
|
||||||
ALT
|
ALT
|
||||||
</button>
|
</button>
|
||||||
@ -47,9 +54,12 @@ export const AltTextBadge: React.FC<{
|
|||||||
>
|
>
|
||||||
{({ props }) => (
|
{({ props }) => (
|
||||||
<div {...props} className='hover-card-controller'>
|
<div {...props} className='hover-card-controller'>
|
||||||
<div
|
<div // eslint-disable-line jsx-a11y/no-noninteractive-element-interactions
|
||||||
className='media-gallery__alt__popover dropdown-animation'
|
className='media-gallery__alt__popover dropdown-animation'
|
||||||
role='tooltip'
|
role='region'
|
||||||
|
id={accessibilityId}
|
||||||
|
onMouseDown={handleMouseDown}
|
||||||
|
onMouseUp={handleMouseUp}
|
||||||
>
|
>
|
||||||
<h4>
|
<h4>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { useState, useRef, useCallback } from 'react';
|
import { useState, useRef, useCallback, useId } from 'react';
|
||||||
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
@ -16,6 +16,7 @@ export const DomainPill: React.FC<{
|
|||||||
username: string;
|
username: string;
|
||||||
isSelf: boolean;
|
isSelf: boolean;
|
||||||
}> = ({ domain, username, isSelf }) => {
|
}> = ({ domain, username, isSelf }) => {
|
||||||
|
const accessibilityId = useId();
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
const triggerRef = useRef(null);
|
const triggerRef = useRef(null);
|
||||||
@ -34,6 +35,8 @@ export const DomainPill: React.FC<{
|
|||||||
className={classNames('account__domain-pill', { active: open })}
|
className={classNames('account__domain-pill', { active: open })}
|
||||||
ref={triggerRef}
|
ref={triggerRef}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
aria-expanded={open}
|
||||||
|
aria-controls={accessibilityId}
|
||||||
>
|
>
|
||||||
{domain}
|
{domain}
|
||||||
</button>
|
</button>
|
||||||
@ -48,6 +51,8 @@ export const DomainPill: React.FC<{
|
|||||||
{({ props }) => (
|
{({ props }) => (
|
||||||
<div
|
<div
|
||||||
{...props}
|
{...props}
|
||||||
|
role='region'
|
||||||
|
id={accessibilityId}
|
||||||
className='account__domain-pill__popout dropdown-animation'
|
className='account__domain-pill__popout dropdown-animation'
|
||||||
>
|
>
|
||||||
<div className='account__domain-pill__popout__header'>
|
<div className='account__domain-pill__popout__header'>
|
||||||
|
@ -6,6 +6,7 @@ import classNames from 'classnames';
|
|||||||
|
|
||||||
import Overlay from 'react-overlays/Overlay';
|
import Overlay from 'react-overlays/Overlay';
|
||||||
|
|
||||||
|
import { useSelectableClick } from '@/hooks/useSelectableClick';
|
||||||
import QuestionMarkIcon from '@/material-icons/400-24px/question_mark.svg?react';
|
import QuestionMarkIcon from '@/material-icons/400-24px/question_mark.svg?react';
|
||||||
import { Icon } from 'mastodon/components/icon';
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
|
||||||
@ -23,6 +24,8 @@ export const InfoButton: React.FC = () => {
|
|||||||
setOpen(!open);
|
setOpen(!open);
|
||||||
}, [open, setOpen]);
|
}, [open, setOpen]);
|
||||||
|
|
||||||
|
const [handleMouseDown, handleMouseUp] = useSelectableClick(handleClick);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
@ -46,10 +49,13 @@ export const InfoButton: React.FC = () => {
|
|||||||
target={triggerRef}
|
target={triggerRef}
|
||||||
>
|
>
|
||||||
{({ props }) => (
|
{({ props }) => (
|
||||||
<div
|
<div // eslint-disable-line jsx-a11y/no-noninteractive-element-interactions
|
||||||
{...props}
|
{...props}
|
||||||
className='dialog-modal__popout prose dropdown-animation'
|
className='dialog-modal__popout prose dropdown-animation'
|
||||||
|
role='region'
|
||||||
id={accessibilityId}
|
id={accessibilityId}
|
||||||
|
onMouseDown={handleMouseDown}
|
||||||
|
onMouseUp={handleMouseUp}
|
||||||
>
|
>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='info_button.what_is_alt_text'
|
id='info_button.what_is_alt_text'
|
||||||
|
@ -10,6 +10,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
|||||||
|
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
|
|
||||||
|
import { missingAltTextModal } from 'mastodon/initial_state';
|
||||||
|
|
||||||
import AutosuggestInput from '../../../components/autosuggest_input';
|
import AutosuggestInput from '../../../components/autosuggest_input';
|
||||||
import AutosuggestTextarea from '../../../components/autosuggest_textarea';
|
import AutosuggestTextarea from '../../../components/autosuggest_textarea';
|
||||||
import { Button } from '../../../components/button';
|
import { Button } from '../../../components/button';
|
||||||
@ -65,6 +67,7 @@ class ComposeForm extends ImmutablePureComponent {
|
|||||||
autoFocus: PropTypes.bool,
|
autoFocus: PropTypes.bool,
|
||||||
withoutNavigation: PropTypes.bool,
|
withoutNavigation: PropTypes.bool,
|
||||||
anyMedia: PropTypes.bool,
|
anyMedia: PropTypes.bool,
|
||||||
|
missingAltText: PropTypes.bool,
|
||||||
isInReply: PropTypes.bool,
|
isInReply: PropTypes.bool,
|
||||||
singleColumn: PropTypes.bool,
|
singleColumn: PropTypes.bool,
|
||||||
lang: PropTypes.string,
|
lang: PropTypes.string,
|
||||||
@ -117,7 +120,7 @@ class ComposeForm extends ImmutablePureComponent {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.onSubmit();
|
this.props.onSubmit(missingAltTextModal && this.props.missingAltText);
|
||||||
|
|
||||||
if (e) {
|
if (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -9,7 +9,9 @@ import {
|
|||||||
changeComposeSpoilerText,
|
changeComposeSpoilerText,
|
||||||
insertEmojiCompose,
|
insertEmojiCompose,
|
||||||
uploadCompose,
|
uploadCompose,
|
||||||
} from '../../../actions/compose';
|
} from 'mastodon/actions/compose';
|
||||||
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
|
|
||||||
import ComposeForm from '../components/compose_form';
|
import ComposeForm from '../components/compose_form';
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
@ -26,6 +28,7 @@ const mapStateToProps = state => ({
|
|||||||
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
|
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
|
||||||
isUploading: state.getIn(['compose', 'is_uploading']),
|
isUploading: state.getIn(['compose', 'is_uploading']),
|
||||||
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
|
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
|
||||||
|
missingAltText: state.getIn(['compose', 'media_attachments']).some(media => ['image', 'gifv'].includes(media.get('type')) && (media.get('description') ?? '').length === 0),
|
||||||
isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
|
isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
|
||||||
lang: state.getIn(['compose', 'language']),
|
lang: state.getIn(['compose', 'language']),
|
||||||
maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500),
|
maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500),
|
||||||
@ -37,8 +40,15 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
dispatch(changeCompose(text));
|
dispatch(changeCompose(text));
|
||||||
},
|
},
|
||||||
|
|
||||||
onSubmit () {
|
onSubmit (missingAltText) {
|
||||||
dispatch(submitCompose());
|
if (missingAltText) {
|
||||||
|
dispatch(openModal({
|
||||||
|
modalType: 'CONFIRM_MISSING_ALT_TEXT',
|
||||||
|
modalProps: {},
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
dispatch(submitCompose());
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onClearSuggestions () {
|
onClearSuggestions () {
|
||||||
|
@ -56,14 +56,6 @@ export const ConfirmationModal: React.FC<
|
|||||||
|
|
||||||
<div className='safety-action-modal__bottom'>
|
<div className='safety-action-modal__bottom'>
|
||||||
<div className='safety-action-modal__actions'>
|
<div className='safety-action-modal__actions'>
|
||||||
{secondary && (
|
|
||||||
<>
|
|
||||||
<Button onClick={handleSecondary}>{secondary}</Button>
|
|
||||||
|
|
||||||
<div className='spacer' />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<button onClick={handleCancel} className='link-button'>
|
<button onClick={handleCancel} className='link-button'>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='confirmation_modal.cancel'
|
id='confirmation_modal.cancel'
|
||||||
@ -71,6 +63,15 @@ export const ConfirmationModal: React.FC<
|
|||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
{secondary && (
|
||||||
|
<>
|
||||||
|
<div className='spacer' />
|
||||||
|
<button onClick={handleSecondary} className='link-button'>
|
||||||
|
{secondary}
|
||||||
|
</button>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* eslint-disable-next-line jsx-a11y/no-autofocus -- we are in a modal and thus autofocusing is justified */}
|
{/* eslint-disable-next-line jsx-a11y/no-autofocus -- we are in a modal and thus autofocusing is justified */}
|
||||||
<Button onClick={handleClick} autoFocus>
|
<Button onClick={handleClick} autoFocus>
|
||||||
{confirm}
|
{confirm}
|
||||||
|
@ -7,3 +7,4 @@ export { ConfirmUnfollowModal } from './unfollow';
|
|||||||
export { ConfirmClearNotificationsModal } from './clear_notifications';
|
export { ConfirmClearNotificationsModal } from './clear_notifications';
|
||||||
export { ConfirmLogOutModal } from './log_out';
|
export { ConfirmLogOutModal } from './log_out';
|
||||||
export { ConfirmFollowToListModal } from './follow_to_list';
|
export { ConfirmFollowToListModal } from './follow_to_list';
|
||||||
|
export { ConfirmMissingAltTextModal } from './missing_alt_text';
|
||||||
|
@ -0,0 +1,81 @@
|
|||||||
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
|
|
||||||
|
import type { Map as ImmutableMap, List as ImmutableList } from 'immutable';
|
||||||
|
|
||||||
|
import { submitCompose } from 'mastodon/actions/compose';
|
||||||
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
|
import type { MediaAttachment } from 'mastodon/models/media_attachment';
|
||||||
|
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
|
import type { BaseConfirmationModalProps } from './confirmation_modal';
|
||||||
|
import { ConfirmationModal } from './confirmation_modal';
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
title: {
|
||||||
|
id: 'confirmations.missing_alt_text.title',
|
||||||
|
defaultMessage: 'Add alt text?',
|
||||||
|
},
|
||||||
|
confirm: {
|
||||||
|
id: 'confirmations.missing_alt_text.confirm',
|
||||||
|
defaultMessage: 'Add alt text',
|
||||||
|
},
|
||||||
|
message: {
|
||||||
|
id: 'confirmations.missing_alt_text.message',
|
||||||
|
defaultMessage:
|
||||||
|
'Your post contains media without alt text. Adding descriptions helps make your content accessible to more people.',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
id: 'confirmations.missing_alt_text.secondary',
|
||||||
|
defaultMessage: 'Post anyway',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ConfirmMissingAltTextModal: React.FC<
|
||||||
|
BaseConfirmationModalProps
|
||||||
|
> = ({ onClose }) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const mediaId = useAppSelector(
|
||||||
|
(state) =>
|
||||||
|
(
|
||||||
|
(state.compose as ImmutableMap<string, unknown>).get(
|
||||||
|
'media_attachments',
|
||||||
|
) as ImmutableList<MediaAttachment>
|
||||||
|
)
|
||||||
|
.find(
|
||||||
|
(media) =>
|
||||||
|
['image', 'gifv'].includes(media.get('type') as string) &&
|
||||||
|
((media.get('description') ?? '') as string).length === 0,
|
||||||
|
)
|
||||||
|
?.get('id') as string,
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleConfirm = useCallback(() => {
|
||||||
|
dispatch(
|
||||||
|
openModal({
|
||||||
|
modalType: 'FOCAL_POINT',
|
||||||
|
modalProps: {
|
||||||
|
mediaId,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}, [dispatch, mediaId]);
|
||||||
|
|
||||||
|
const handleSecondary = useCallback(() => {
|
||||||
|
dispatch(submitCompose());
|
||||||
|
}, [dispatch]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ConfirmationModal
|
||||||
|
title={intl.formatMessage(messages.title)}
|
||||||
|
message={intl.formatMessage(messages.message)}
|
||||||
|
confirm={intl.formatMessage(messages.confirm)}
|
||||||
|
secondary={intl.formatMessage(messages.secondary)}
|
||||||
|
onConfirm={handleConfirm}
|
||||||
|
onSecondary={handleSecondary}
|
||||||
|
onClose={onClose}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
@ -37,6 +37,7 @@ import {
|
|||||||
ConfirmClearNotificationsModal,
|
ConfirmClearNotificationsModal,
|
||||||
ConfirmLogOutModal,
|
ConfirmLogOutModal,
|
||||||
ConfirmFollowToListModal,
|
ConfirmFollowToListModal,
|
||||||
|
ConfirmMissingAltTextModal,
|
||||||
} from './confirmation_modals';
|
} from './confirmation_modals';
|
||||||
import ImageModal from './image_modal';
|
import ImageModal from './image_modal';
|
||||||
import MediaModal from './media_modal';
|
import MediaModal from './media_modal';
|
||||||
@ -58,6 +59,7 @@ export const MODAL_COMPONENTS = {
|
|||||||
'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }),
|
'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }),
|
||||||
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
|
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
|
||||||
'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }),
|
'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }),
|
||||||
|
'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }),
|
||||||
'MUTE': MuteModal,
|
'MUTE': MuteModal,
|
||||||
'BLOCK': BlockModal,
|
'BLOCK': BlockModal,
|
||||||
'DOMAIN_BLOCK': DomainBlockModal,
|
'DOMAIN_BLOCK': DomainBlockModal,
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
* @property {string} admin
|
* @property {string} admin
|
||||||
* @property {boolean=} boost_modal
|
* @property {boolean=} boost_modal
|
||||||
* @property {boolean=} delete_modal
|
* @property {boolean=} delete_modal
|
||||||
|
* @property {boolean=} missing_alt_text_modal
|
||||||
* @property {boolean=} disable_swiping
|
* @property {boolean=} disable_swiping
|
||||||
* @property {boolean=} disable_hover_cards
|
* @property {boolean=} disable_hover_cards
|
||||||
* @property {string=} disabled_account_id
|
* @property {string=} disabled_account_id
|
||||||
@ -88,6 +89,7 @@ export const activityApiEnabled = getMeta('activity_api_enabled');
|
|||||||
export const autoPlayGif = getMeta('auto_play_gif');
|
export const autoPlayGif = getMeta('auto_play_gif');
|
||||||
export const boostModal = getMeta('boost_modal');
|
export const boostModal = getMeta('boost_modal');
|
||||||
export const deleteModal = getMeta('delete_modal');
|
export const deleteModal = getMeta('delete_modal');
|
||||||
|
export const missingAltTextModal = getMeta('missing_alt_text_modal');
|
||||||
export const disableSwiping = getMeta('disable_swiping');
|
export const disableSwiping = getMeta('disable_swiping');
|
||||||
export const disableHoverCards = getMeta('disable_hover_cards');
|
export const disableHoverCards = getMeta('disable_hover_cards');
|
||||||
export const disabledAccountId = getMeta('disabled_account_id');
|
export const disabledAccountId = getMeta('disabled_account_id');
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Tanca la sessió",
|
"confirmations.logout.confirm": "Tanca la sessió",
|
||||||
"confirmations.logout.message": "Segur que vols tancar la sessió?",
|
"confirmations.logout.message": "Segur que vols tancar la sessió?",
|
||||||
"confirmations.logout.title": "Tancar la sessió?",
|
"confirmations.logout.title": "Tancar la sessió?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Afegiu text alternatiu",
|
||||||
|
"confirmations.missing_alt_text.message": "La vostra publicació té contingut sense text alternatiu. Afegir-hi descripcions la farà accessible a més persones.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publica-la igualment",
|
||||||
|
"confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?",
|
||||||
"confirmations.mute.confirm": "Silencia",
|
"confirmations.mute.confirm": "Silencia",
|
||||||
"confirmations.redraft.confirm": "Esborra i reescriu",
|
"confirmations.redraft.confirm": "Esborra i reescriu",
|
||||||
"confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.",
|
"confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Log ud",
|
"confirmations.logout.confirm": "Log ud",
|
||||||
"confirmations.logout.message": "Er du sikker på, at du vil logge ud?",
|
"confirmations.logout.message": "Er du sikker på, at du vil logge ud?",
|
||||||
"confirmations.logout.title": "Log ud?",
|
"confirmations.logout.title": "Log ud?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Tilføj alt-tekst",
|
||||||
|
"confirmations.missing_alt_text.message": "Indlægget indeholder medier uden alt-tekst. Tilføjelse af beskrivelser bidrager til at gøre indholdet tilgængeligt for flere brugere.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Læg op alligevel",
|
||||||
|
"confirmations.missing_alt_text.title": "Tilføj alt-tekst?",
|
||||||
"confirmations.mute.confirm": "Skjul (mute)",
|
"confirmations.mute.confirm": "Skjul (mute)",
|
||||||
"confirmations.redraft.confirm": "Slet og omformulér",
|
"confirmations.redraft.confirm": "Slet og omformulér",
|
||||||
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
|
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og boosts går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Abmelden",
|
"confirmations.logout.confirm": "Abmelden",
|
||||||
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
|
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
|
||||||
"confirmations.logout.title": "Abmelden?",
|
"confirmations.logout.title": "Abmelden?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Bildbeschreibung hinzufügen",
|
||||||
|
"confirmations.missing_alt_text.message": "Dein Beitrag enthält Medien ohne Bildbeschreibung. Mit Alt-Texten erreichst du auch Menschen mit einer Sehschwäche.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Trotzdem veröffentlichen",
|
||||||
|
"confirmations.missing_alt_text.title": "Bildbeschreibung hinzufügen?",
|
||||||
"confirmations.mute.confirm": "Stummschalten",
|
"confirmations.mute.confirm": "Stummschalten",
|
||||||
"confirmations.redraft.confirm": "Löschen und neu erstellen",
|
"confirmations.redraft.confirm": "Löschen und neu erstellen",
|
||||||
"confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Alle Favoriten sowie die bisher geteilten Beiträge werden verloren gehen und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.",
|
"confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Alle Favoriten sowie die bisher geteilten Beiträge werden verloren gehen und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Log out",
|
"confirmations.logout.confirm": "Log out",
|
||||||
"confirmations.logout.message": "Are you sure you want to log out?",
|
"confirmations.logout.message": "Are you sure you want to log out?",
|
||||||
"confirmations.logout.title": "Log out?",
|
"confirmations.logout.title": "Log out?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Add alt text",
|
||||||
|
"confirmations.missing_alt_text.message": "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Post anyway",
|
||||||
|
"confirmations.missing_alt_text.title": "Add alt text?",
|
||||||
"confirmations.mute.confirm": "Mute",
|
"confirmations.mute.confirm": "Mute",
|
||||||
"confirmations.redraft.confirm": "Delete & redraft",
|
"confirmations.redraft.confirm": "Delete & redraft",
|
||||||
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.",
|
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Elsaluti",
|
"confirmations.logout.confirm": "Elsaluti",
|
||||||
"confirmations.logout.message": "Ĉu vi certas, ke vi volas elsaluti?",
|
"confirmations.logout.message": "Ĉu vi certas, ke vi volas elsaluti?",
|
||||||
"confirmations.logout.title": "Ĉu elsaluti?",
|
"confirmations.logout.title": "Ĉu elsaluti?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Aldoni alttekston",
|
||||||
|
"confirmations.missing_alt_text.message": "Via afiŝo enhavas amaskomunikilaron sen altteksto. Aldono de priskriboj helpas fari vian enhavon alirebla por pli da homoj.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Afiŝu ĉiukaze",
|
||||||
|
"confirmations.missing_alt_text.title": "Ĉu aldoni alttekston?",
|
||||||
"confirmations.mute.confirm": "Silentigi",
|
"confirmations.mute.confirm": "Silentigi",
|
||||||
"confirmations.redraft.confirm": "Forigi kaj reskribi",
|
"confirmations.redraft.confirm": "Forigi kaj reskribi",
|
||||||
"confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun afiŝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
|
"confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun afiŝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Cerrar sesión",
|
"confirmations.logout.confirm": "Cerrar sesión",
|
||||||
"confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
|
"confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
|
||||||
"confirmations.logout.title": "¿Cerrar sesión?",
|
"confirmations.logout.title": "¿Cerrar sesión?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Añadir texto alternativo",
|
||||||
|
"confirmations.missing_alt_text.message": "Tu publicación contiene medios sin texto alternativo. Añadir descripciones ayuda a que tu contenido sea accesible para más personas.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publicar de todos modos",
|
||||||
|
"confirmations.missing_alt_text.title": "¿Deseas añadir texto alternativo?",
|
||||||
"confirmations.mute.confirm": "Silenciar",
|
"confirmations.mute.confirm": "Silenciar",
|
||||||
"confirmations.redraft.confirm": "Eliminar mensaje original y editarlo",
|
"confirmations.redraft.confirm": "Eliminar mensaje original y editarlo",
|
||||||
"confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.",
|
"confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Cerrar sesión",
|
"confirmations.logout.confirm": "Cerrar sesión",
|
||||||
"confirmations.logout.message": "¿Estás seguro de que quieres cerrar la sesión?",
|
"confirmations.logout.message": "¿Estás seguro de que quieres cerrar la sesión?",
|
||||||
"confirmations.logout.title": "¿Deseas cerrar sesión?",
|
"confirmations.logout.title": "¿Deseas cerrar sesión?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Añadir texto alternativo",
|
||||||
|
"confirmations.missing_alt_text.message": "Tu publicación contiene contenido multimedia sin texto alternativo. Agregar descripciones ayuda a que tu contenido sea accesible para más personas.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publicar de todas maneras",
|
||||||
|
"confirmations.missing_alt_text.title": "¿Añadir texto alternativo?",
|
||||||
"confirmations.mute.confirm": "Silenciar",
|
"confirmations.mute.confirm": "Silenciar",
|
||||||
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
||||||
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
|
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Cerrar sesión",
|
"confirmations.logout.confirm": "Cerrar sesión",
|
||||||
"confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?",
|
"confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?",
|
||||||
"confirmations.logout.title": "¿Cerrar sesión?",
|
"confirmations.logout.title": "¿Cerrar sesión?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Añadir texto alternativo",
|
||||||
|
"confirmations.missing_alt_text.message": "Tu publicación contiene medios sin texto alternativo. Añadir descripciones ayuda a que tu contenido sea accesible para más personas.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publicar de todos modos",
|
||||||
|
"confirmations.missing_alt_text.title": "¿Deseas añadir texto alternativo?",
|
||||||
"confirmations.mute.confirm": "Silenciar",
|
"confirmations.mute.confirm": "Silenciar",
|
||||||
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
"confirmations.redraft.confirm": "Borrar y volver a borrador",
|
||||||
"confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.",
|
"confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.",
|
||||||
|
@ -208,6 +208,9 @@
|
|||||||
"confirmations.logout.confirm": "Amaitu saioa",
|
"confirmations.logout.confirm": "Amaitu saioa",
|
||||||
"confirmations.logout.message": "Ziur saioa amaitu nahi duzula?",
|
"confirmations.logout.message": "Ziur saioa amaitu nahi duzula?",
|
||||||
"confirmations.logout.title": "Itxi saioa?",
|
"confirmations.logout.title": "Itxi saioa?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Gehitu testu alternatiboa",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Bidali edonola ere",
|
||||||
|
"confirmations.missing_alt_text.title": "Testu alternatiboa gehitu?",
|
||||||
"confirmations.mute.confirm": "Mututu",
|
"confirmations.mute.confirm": "Mututu",
|
||||||
"confirmations.redraft.confirm": "Ezabatu eta berridatzi",
|
"confirmations.redraft.confirm": "Ezabatu eta berridatzi",
|
||||||
"confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.",
|
"confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Kirjaudu ulos",
|
"confirmations.logout.confirm": "Kirjaudu ulos",
|
||||||
"confirmations.logout.message": "Haluatko varmasti kirjautua ulos?",
|
"confirmations.logout.message": "Haluatko varmasti kirjautua ulos?",
|
||||||
"confirmations.logout.title": "Kirjaudutaanko ulos?",
|
"confirmations.logout.title": "Kirjaudutaanko ulos?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Lisää vaihtoehtoinen teksti",
|
||||||
|
"confirmations.missing_alt_text.message": "Julkaisussasi on mediaa ilman vaihtoehtoista tekstiä. Kuvausten lisääminen auttaa tekemään sisällöstäsi saavutettavamman useammille ihmisille.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Julkaise silti",
|
||||||
|
"confirmations.missing_alt_text.title": "Lisätäänkö vaihtoehtoinen teksti?",
|
||||||
"confirmations.mute.confirm": "Mykistä",
|
"confirmations.mute.confirm": "Mykistä",
|
||||||
"confirmations.redraft.confirm": "Poista ja palauta muokattavaksi",
|
"confirmations.redraft.confirm": "Poista ja palauta muokattavaksi",
|
||||||
"confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.",
|
"confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Rita út",
|
"confirmations.logout.confirm": "Rita út",
|
||||||
"confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?",
|
"confirmations.logout.message": "Ert tú vís/ur í, at tú vilt útrita teg?",
|
||||||
"confirmations.logout.title": "Rita út?",
|
"confirmations.logout.title": "Rita út?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Legg alternativan tekst afturat",
|
||||||
|
"confirmations.missing_alt_text.message": "Posturin hjá tær inniheldur miðlar uttan alternativan tekst. Leggur tú lýsingar afturat verður tilfarið hjá tær atkomuligt hjá fleiri.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Posta allíkavæl",
|
||||||
|
"confirmations.missing_alt_text.title": "Legg alternativan tekst afturat?",
|
||||||
"confirmations.mute.confirm": "Doyv",
|
"confirmations.mute.confirm": "Doyv",
|
||||||
"confirmations.redraft.confirm": "Sletta og skriva umaftur",
|
"confirmations.redraft.confirm": "Sletta og skriva umaftur",
|
||||||
"confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.",
|
"confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Se déconnecter",
|
"confirmations.logout.confirm": "Se déconnecter",
|
||||||
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?",
|
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?",
|
||||||
"confirmations.logout.title": "Se déconnecter ?",
|
"confirmations.logout.title": "Se déconnecter ?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Ajouter un texte alternatif",
|
||||||
|
"confirmations.missing_alt_text.message": "Votre post contient des médias sans texte alternatif. Ajouter des descriptions rend votre contenu accessible à un plus grand nombre de personnes.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publier quand-même",
|
||||||
|
"confirmations.missing_alt_text.title": "Ajouter un texte alternatif?",
|
||||||
"confirmations.mute.confirm": "Masquer",
|
"confirmations.mute.confirm": "Masquer",
|
||||||
"confirmations.redraft.confirm": "Supprimer et réécrire",
|
"confirmations.redraft.confirm": "Supprimer et réécrire",
|
||||||
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.",
|
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Se déconnecter",
|
"confirmations.logout.confirm": "Se déconnecter",
|
||||||
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?",
|
"confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?",
|
||||||
"confirmations.logout.title": "Se déconnecter ?",
|
"confirmations.logout.title": "Se déconnecter ?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Ajouter un texte alternatif",
|
||||||
|
"confirmations.missing_alt_text.message": "Votre post contient des médias sans texte alternatif. Ajouter des descriptions rend votre contenu accessible à un plus grand nombre de personnes.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publier quand-même",
|
||||||
|
"confirmations.missing_alt_text.title": "Ajouter un texte alternatif?",
|
||||||
"confirmations.mute.confirm": "Masquer",
|
"confirmations.mute.confirm": "Masquer",
|
||||||
"confirmations.redraft.confirm": "Supprimer et ré-écrire",
|
"confirmations.redraft.confirm": "Supprimer et ré-écrire",
|
||||||
"confirmations.redraft.message": "Voulez-vous vraiment supprimer le message pour le réécrire ? Ses partages ainsi que ses mises en favori seront perdues, et ses réponses seront orphelines.",
|
"confirmations.redraft.message": "Voulez-vous vraiment supprimer le message pour le réécrire ? Ses partages ainsi que ses mises en favori seront perdues, et ses réponses seront orphelines.",
|
||||||
|
@ -86,14 +86,33 @@
|
|||||||
"alert.unexpected.message": "Der is in ûnferwachte flater bard.",
|
"alert.unexpected.message": "Der is in ûnferwachte flater bard.",
|
||||||
"alert.unexpected.title": "Oepsy!",
|
"alert.unexpected.title": "Oepsy!",
|
||||||
"alt_text_badge.title": "Alternative tekst",
|
"alt_text_badge.title": "Alternative tekst",
|
||||||
|
"alt_text_modal.add_alt_text": "Alt-tekst tafoegje",
|
||||||
|
"alt_text_modal.add_text_from_image": "Tekst fan ôfbylding tafoegje",
|
||||||
|
"alt_text_modal.cancel": "Annulearje",
|
||||||
|
"alt_text_modal.change_thumbnail": "Miniatuerôfbylding wizigje",
|
||||||
|
"alt_text_modal.describe_for_people_with_hearing_impairments": "Beskriuw dit foar dôven en hurdhearrige…",
|
||||||
|
"alt_text_modal.describe_for_people_with_visual_impairments": "Beskriuw dit foar blinen en fisueel beheinde…",
|
||||||
|
"alt_text_modal.done": "Klear",
|
||||||
"announcement.announcement": "Oankundiging",
|
"announcement.announcement": "Oankundiging",
|
||||||
"annual_report.summary.archetype.booster": "De cool-hunter",
|
"annual_report.summary.archetype.booster": "De cool-hunter",
|
||||||
|
"annual_report.summary.archetype.lurker": "De lurker",
|
||||||
"annual_report.summary.archetype.oracle": "It orakel",
|
"annual_report.summary.archetype.oracle": "It orakel",
|
||||||
"annual_report.summary.archetype.pollster": "De opinypeiler",
|
"annual_report.summary.archetype.pollster": "De opinypeiler",
|
||||||
"annual_report.summary.archetype.replier": "De sosjale flinter",
|
"annual_report.summary.archetype.replier": "De sosjale flinter",
|
||||||
"annual_report.summary.followers.followers": "folgers",
|
"annual_report.summary.followers.followers": "folgers",
|
||||||
"annual_report.summary.followers.total": "totaal {count}",
|
"annual_report.summary.followers.total": "totaal {count}",
|
||||||
"annual_report.summary.here_it_is": "Jo jieroersjoch foar {year}:",
|
"annual_report.summary.here_it_is": "Jo jieroersjoch foar {year}:",
|
||||||
|
"annual_report.summary.highlighted_post.by_favourites": "berjocht mei de measte favoriten",
|
||||||
|
"annual_report.summary.highlighted_post.by_reblogs": "berjocht mei de measte boosts",
|
||||||
|
"annual_report.summary.highlighted_post.by_replies": "berjocht mei de measte reaksjes",
|
||||||
|
"annual_report.summary.highlighted_post.possessive": "{name}’s",
|
||||||
|
"annual_report.summary.most_used_app.most_used_app": "meast brûkte app",
|
||||||
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "meast brûkte hashtag",
|
||||||
|
"annual_report.summary.most_used_hashtag.none": "Gjin",
|
||||||
|
"annual_report.summary.new_posts.new_posts": "nije berjochten",
|
||||||
|
"annual_report.summary.percentile.text": "<topLabel>Hjirmei hearre jo ta de top</topLabel><percentage></percentage><bottomLabel> fan {domain}.</bottomLabel>",
|
||||||
|
"annual_report.summary.percentile.we_wont_tell_bernie": "Wy sille Bernie neat fertelle.",
|
||||||
|
"annual_report.summary.thanks": "Tank dat jo part binne fan Mastodon!",
|
||||||
"attachments_list.unprocessed": "(net ferwurke)",
|
"attachments_list.unprocessed": "(net ferwurke)",
|
||||||
"audio.hide": "Audio ferstopje",
|
"audio.hide": "Audio ferstopje",
|
||||||
"block_modal.remote_users_caveat": "Wy freegje de server {domain} om jo beslút te respektearjen. It neilibben hjirfan is echter net garandearre, omdat guon servers blokkaden oars ynterpretearje kinne. Iepenbiere berjochten binne mooglik noch hieltyd sichtber foar net-oanmelde brûkers.",
|
"block_modal.remote_users_caveat": "Wy freegje de server {domain} om jo beslút te respektearjen. It neilibben hjirfan is echter net garandearre, omdat guon servers blokkaden oars ynterpretearje kinne. Iepenbiere berjochten binne mooglik noch hieltyd sichtber foar net-oanmelde brûkers.",
|
||||||
@ -117,6 +136,7 @@
|
|||||||
"bundle_column_error.routing.body": "De opfrege side kin net fûn wurde. Binne jo wis dat de URL yn de adresbalke goed is?",
|
"bundle_column_error.routing.body": "De opfrege side kin net fûn wurde. Binne jo wis dat de URL yn de adresbalke goed is?",
|
||||||
"bundle_column_error.routing.title": "404",
|
"bundle_column_error.routing.title": "404",
|
||||||
"bundle_modal_error.close": "Slute",
|
"bundle_modal_error.close": "Slute",
|
||||||
|
"bundle_modal_error.message": "Der gie wat mis by it laden fan dit skerm.",
|
||||||
"bundle_modal_error.retry": "Opnij probearje",
|
"bundle_modal_error.retry": "Opnij probearje",
|
||||||
"closed_registrations.other_server_instructions": "Omdat Mastodon desintralisearre is, kinne jo in account meitsje op in oare server en noch hieltyd ynteraksje hawwe mei dizze.",
|
"closed_registrations.other_server_instructions": "Omdat Mastodon desintralisearre is, kinne jo in account meitsje op in oare server en noch hieltyd ynteraksje hawwe mei dizze.",
|
||||||
"closed_registrations_modal.description": "It oanmeitsjen fan in account op {domain} is op dit stuit net mooglik, mar hâld asjebleaft yn gedachten dat jo gjin account spesifyk op {domain} nedich hawwe om Mastodon te brûken.",
|
"closed_registrations_modal.description": "It oanmeitsjen fan in account op {domain} is op dit stuit net mooglik, mar hâld asjebleaft yn gedachten dat jo gjin account spesifyk op {domain} nedich hawwe om Mastodon te brûken.",
|
||||||
@ -127,13 +147,16 @@
|
|||||||
"column.blocks": "Blokkearre brûkers",
|
"column.blocks": "Blokkearre brûkers",
|
||||||
"column.bookmarks": "Blêdwizers",
|
"column.bookmarks": "Blêdwizers",
|
||||||
"column.community": "Lokale tiidline",
|
"column.community": "Lokale tiidline",
|
||||||
|
"column.create_list": "List oanmeitsje",
|
||||||
"column.direct": "Priveefermeldingen",
|
"column.direct": "Priveefermeldingen",
|
||||||
"column.directory": "Profilen trochsykje",
|
"column.directory": "Profilen trochsykje",
|
||||||
"column.domain_blocks": "Blokkearre domeinen",
|
"column.domain_blocks": "Blokkearre domeinen",
|
||||||
|
"column.edit_list": "List bewurkje",
|
||||||
"column.favourites": "Favoriten",
|
"column.favourites": "Favoriten",
|
||||||
"column.firehose": "Live feeds",
|
"column.firehose": "Live feeds",
|
||||||
"column.follow_requests": "Folchfersiken",
|
"column.follow_requests": "Folchfersiken",
|
||||||
"column.home": "Startside",
|
"column.home": "Startside",
|
||||||
|
"column.list_members": "Listleden beheare",
|
||||||
"column.lists": "Listen",
|
"column.lists": "Listen",
|
||||||
"column.mutes": "Negearre brûkers",
|
"column.mutes": "Negearre brûkers",
|
||||||
"column.notifications": "Meldingen",
|
"column.notifications": "Meldingen",
|
||||||
@ -146,6 +169,7 @@
|
|||||||
"column_header.pin": "Fêstsette",
|
"column_header.pin": "Fêstsette",
|
||||||
"column_header.show_settings": "Ynstellingen toane",
|
"column_header.show_settings": "Ynstellingen toane",
|
||||||
"column_header.unpin": "Losmeitsje",
|
"column_header.unpin": "Losmeitsje",
|
||||||
|
"column_search.cancel": "Annulearje",
|
||||||
"column_subheading.settings": "Ynstellingen",
|
"column_subheading.settings": "Ynstellingen",
|
||||||
"community.column_settings.local_only": "Allinnich lokaal",
|
"community.column_settings.local_only": "Allinnich lokaal",
|
||||||
"community.column_settings.media_only": "Allinnich media",
|
"community.column_settings.media_only": "Allinnich media",
|
||||||
@ -188,6 +212,9 @@
|
|||||||
"confirmations.edit.confirm": "Bewurkje",
|
"confirmations.edit.confirm": "Bewurkje",
|
||||||
"confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
|
"confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
|
||||||
"confirmations.edit.title": "Berjocht oerskriuwe?",
|
"confirmations.edit.title": "Berjocht oerskriuwe?",
|
||||||
|
"confirmations.follow_to_list.confirm": "Folgje en tafoegje oan de list",
|
||||||
|
"confirmations.follow_to_list.message": "Jo moatte {name} folgje om se ta te foegjen oan in list.",
|
||||||
|
"confirmations.follow_to_list.title": "Brûker folgje?",
|
||||||
"confirmations.logout.confirm": "Ofmelde",
|
"confirmations.logout.confirm": "Ofmelde",
|
||||||
"confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?",
|
"confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?",
|
||||||
"confirmations.logout.title": "Ofmelde?",
|
"confirmations.logout.title": "Ofmelde?",
|
||||||
@ -219,6 +246,7 @@
|
|||||||
"disabled_account_banner.text": "Jo account {disabledAccount} is op dit stuit útskeakele.",
|
"disabled_account_banner.text": "Jo account {disabledAccount} is op dit stuit útskeakele.",
|
||||||
"dismissable_banner.community_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op {domain}.",
|
"dismissable_banner.community_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op {domain}.",
|
||||||
"dismissable_banner.dismiss": "Slute",
|
"dismissable_banner.dismiss": "Slute",
|
||||||
|
"dismissable_banner.explore_links": "Dizze nijsartikelen wurde hjoed de dei it meast dield op de fediverse. Nijere artikelen dy’t troch mear ferskate minsken pleatst binne, wurde heger rangskikt.",
|
||||||
"domain_block_modal.block": "Server blokkearje",
|
"domain_block_modal.block": "Server blokkearje",
|
||||||
"domain_block_modal.block_account_instead": "Yn stee hjirfan {name} blokkearje",
|
"domain_block_modal.block_account_instead": "Yn stee hjirfan {name} blokkearje",
|
||||||
"domain_block_modal.they_can_interact_with_old_posts": "Minsken op dizze server kinne ynteraksje hawwe mei jo âlde berjochten.",
|
"domain_block_modal.they_can_interact_with_old_posts": "Minsken op dizze server kinne ynteraksje hawwe mei jo âlde berjochten.",
|
||||||
@ -381,6 +409,9 @@
|
|||||||
"ignore_notifications_modal.not_followers_title": "Meldingen negearje fan minsken dy’t jo net folgje?",
|
"ignore_notifications_modal.not_followers_title": "Meldingen negearje fan minsken dy’t jo net folgje?",
|
||||||
"ignore_notifications_modal.not_following_title": "Meldingen negearje fan minsken dy’t josels net folgje?",
|
"ignore_notifications_modal.not_following_title": "Meldingen negearje fan minsken dy’t josels net folgje?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "Meldingen negearje fan net frege priveeberjochten?",
|
"ignore_notifications_modal.private_mentions_title": "Meldingen negearje fan net frege priveeberjochten?",
|
||||||
|
"info_button.label": "Help",
|
||||||
|
"interaction_modal.go": "Gean",
|
||||||
|
"interaction_modal.no_account_yet": "Hawwe jo noch gjin account?",
|
||||||
"interaction_modal.on_another_server": "Op een oare server",
|
"interaction_modal.on_another_server": "Op een oare server",
|
||||||
"interaction_modal.on_this_server": "Op dizze server",
|
"interaction_modal.on_this_server": "Op dizze server",
|
||||||
"interaction_modal.title.favourite": "Berjocht fan {name} as favoryt markearje",
|
"interaction_modal.title.favourite": "Berjocht fan {name} as favoryt markearje",
|
||||||
@ -388,6 +419,7 @@
|
|||||||
"interaction_modal.title.reblog": "Berjocht fan {name} booste",
|
"interaction_modal.title.reblog": "Berjocht fan {name} booste",
|
||||||
"interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
|
"interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
|
||||||
"interaction_modal.title.vote": "Stimme yn {name}’s peiling",
|
"interaction_modal.title.vote": "Stimme yn {name}’s peiling",
|
||||||
|
"interaction_modal.username_prompt": "Byg. {example}",
|
||||||
"intervals.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
"intervals.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
||||||
"intervals.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
"intervals.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
||||||
"intervals.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
|
"intervals.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
|
||||||
@ -423,6 +455,7 @@
|
|||||||
"keyboard_shortcuts.toggle_hidden": "Tekst efter CW-fjild ferstopje/toane",
|
"keyboard_shortcuts.toggle_hidden": "Tekst efter CW-fjild ferstopje/toane",
|
||||||
"keyboard_shortcuts.toggle_sensitivity": "Media ferstopje/toane",
|
"keyboard_shortcuts.toggle_sensitivity": "Media ferstopje/toane",
|
||||||
"keyboard_shortcuts.toot": "Nij berjocht skriuwe",
|
"keyboard_shortcuts.toot": "Nij berjocht skriuwe",
|
||||||
|
"keyboard_shortcuts.translate": "om in berjocht oer te setten",
|
||||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||||
"keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
|
"keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
|
||||||
"lightbox.close": "Slute",
|
"lightbox.close": "Slute",
|
||||||
@ -435,11 +468,32 @@
|
|||||||
"link_preview.author": "Troch {name}",
|
"link_preview.author": "Troch {name}",
|
||||||
"link_preview.more_from_author": "Mear fan {name}",
|
"link_preview.more_from_author": "Mear fan {name}",
|
||||||
"link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}",
|
"link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}",
|
||||||
|
"lists.add_member": "Tafoegje",
|
||||||
|
"lists.add_to_list": "Oan list tafoegje",
|
||||||
|
"lists.add_to_lists": "{name} oan listen tafoegje",
|
||||||
|
"lists.create": "Oanmeitsje",
|
||||||
|
"lists.create_a_list_to_organize": "Meitsje in nije list oan om jo starttiidline te organisearjen",
|
||||||
|
"lists.create_list": "List oanmeitsje",
|
||||||
"lists.delete": "List fuortsmite",
|
"lists.delete": "List fuortsmite",
|
||||||
|
"lists.done": "Klear",
|
||||||
"lists.edit": "List bewurkje",
|
"lists.edit": "List bewurkje",
|
||||||
|
"lists.exclusive": "Leden op jo Startside ferstopje",
|
||||||
|
"lists.exclusive_hint": "As ien op dizze list stiet, ferstopje dizze persoan dan op jo starttiidline om foar te kommen dat harren berjochten twa kear toand wurde.",
|
||||||
|
"lists.find_users_to_add": "Fyn brûkers om ta te foegjen",
|
||||||
|
"lists.list_members": "Listleden",
|
||||||
|
"lists.list_members_count": "{count, plural, one{# lid} other{# leden}}",
|
||||||
|
"lists.list_name": "Listnamme",
|
||||||
|
"lists.new_list_name": "Nije listnamme",
|
||||||
|
"lists.no_lists_yet": "Noch gjin listen.",
|
||||||
|
"lists.no_members_yet": "Noch gjin leden.",
|
||||||
|
"lists.no_results_found": "Gjin resultaten fûn.",
|
||||||
|
"lists.remove_member": "Fuortsmite",
|
||||||
"lists.replies_policy.followed": "Elke folge brûker",
|
"lists.replies_policy.followed": "Elke folge brûker",
|
||||||
"lists.replies_policy.list": "Leden fan de list",
|
"lists.replies_policy.list": "Leden fan de list",
|
||||||
"lists.replies_policy.none": "Net ien",
|
"lists.replies_policy.none": "Net ien",
|
||||||
|
"lists.save": "Bewarje",
|
||||||
|
"lists.search": "Sykje",
|
||||||
|
"lists.show_replies_to": "Foegje antwurden fan listleden ta oan",
|
||||||
"load_pending": "{count, plural, one {# nij item} other {# nije items}}",
|
"load_pending": "{count, plural, one {# nij item} other {# nije items}}",
|
||||||
"loading_indicator.label": "Lade…",
|
"loading_indicator.label": "Lade…",
|
||||||
"media_gallery.hide": "Ferstopje",
|
"media_gallery.hide": "Ferstopje",
|
||||||
@ -488,8 +542,12 @@
|
|||||||
"notification.admin.report_statuses_other": "{name} hat {target} rapportearre",
|
"notification.admin.report_statuses_other": "{name} hat {target} rapportearre",
|
||||||
"notification.admin.sign_up": "{name} hat harren registrearre",
|
"notification.admin.sign_up": "{name} hat harren registrearre",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe harren registrearre",
|
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# oar} other {# oaren}} hawwe harren registrearre",
|
||||||
|
"notification.annual_report.message": "Jo {year} #Wrapstodon stiet klear! Lit de hichtepunten en memorabele mominten fan jo jier sjen op Mastodon!",
|
||||||
|
"notification.annual_report.view": "#Wrapstodon besjen",
|
||||||
"notification.favourite": "{name} hat jo berjocht as favoryt markearre",
|
"notification.favourite": "{name} hat jo berjocht as favoryt markearre",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# oar} other {# oaren}}</a> hawwe jo berjocht as favoryt markearre",
|
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# oar} other {# oaren}}</a> hawwe jo berjocht as favoryt markearre",
|
||||||
|
"notification.favourite_pm": "{name} hat jo priveeberjocht as favoryt markearre",
|
||||||
|
"notification.favourite_pm.name_and_others_with_link": "{name} en <a>{count, plural, one {# oar} other {# oaren}}</a> hawwe jo priveeberjocht as favoryt markearre",
|
||||||
"notification.follow": "{name} folget dy",
|
"notification.follow": "{name} folget dy",
|
||||||
"notification.follow.name_and_others": "{name} en <a>{count, plural, one {# oar persoan} other {# oare persoanen}}</a> folgje jo no",
|
"notification.follow.name_and_others": "{name} en <a>{count, plural, one {# oar persoan} other {# oare persoanen}}</a> folgje jo no",
|
||||||
"notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
|
"notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
|
||||||
@ -594,7 +652,11 @@
|
|||||||
"notifications_permission_banner.enable": "Desktopmeldingen ynskeakelje",
|
"notifications_permission_banner.enable": "Desktopmeldingen ynskeakelje",
|
||||||
"notifications_permission_banner.how_to_control": "Om meldingen te ûntfangen wannear’t Mastodon net iepen stiet. Jo kinne krekt bepale hokker soarte fan ynteraksjes wol of gjin desktopmeldingen jouwe fia de boppesteande {icon} knop.",
|
"notifications_permission_banner.how_to_control": "Om meldingen te ûntfangen wannear’t Mastodon net iepen stiet. Jo kinne krekt bepale hokker soarte fan ynteraksjes wol of gjin desktopmeldingen jouwe fia de boppesteande {icon} knop.",
|
||||||
"notifications_permission_banner.title": "Mis neat",
|
"notifications_permission_banner.title": "Mis neat",
|
||||||
|
"onboarding.follows.back": "Tebek",
|
||||||
|
"onboarding.follows.done": "Klear",
|
||||||
"onboarding.follows.empty": "Spitigernôch kinne op dit stuit gjin resultaten toand wurde. Jo kinne probearje te sykjen of te blêdzjen troch de ferkenningsside om minsken te finen dy’t jo folgje kinne, of probearje it letter opnij.",
|
"onboarding.follows.empty": "Spitigernôch kinne op dit stuit gjin resultaten toand wurde. Jo kinne probearje te sykjen of te blêdzjen troch de ferkenningsside om minsken te finen dy’t jo folgje kinne, of probearje it letter opnij.",
|
||||||
|
"onboarding.follows.search": "Sykje",
|
||||||
|
"onboarding.follows.title": "Folgje minsken om te begjinnen",
|
||||||
"onboarding.profile.discoverable": "Meitsje myn profyl te finen",
|
"onboarding.profile.discoverable": "Meitsje myn profyl te finen",
|
||||||
"onboarding.profile.discoverable_hint": "Wannear’t jo akkoard gean mei it te finen wêzen op Mastodon, ferskine jo berjochten yn sykresultaten en kinne se trending wurde, en jo profyl kin oan oare minsken oanrekommandearre wurde wannear’t se fergelykbere ynteressen hawwe.",
|
"onboarding.profile.discoverable_hint": "Wannear’t jo akkoard gean mei it te finen wêzen op Mastodon, ferskine jo berjochten yn sykresultaten en kinne se trending wurde, en jo profyl kin oan oare minsken oanrekommandearre wurde wannear’t se fergelykbere ynteressen hawwe.",
|
||||||
"onboarding.profile.display_name": "Werjeftenamme",
|
"onboarding.profile.display_name": "Werjeftenamme",
|
||||||
@ -632,6 +694,8 @@
|
|||||||
"privacy_policy.title": "Privacybelied",
|
"privacy_policy.title": "Privacybelied",
|
||||||
"recommended": "Oanrekommandearre",
|
"recommended": "Oanrekommandearre",
|
||||||
"refresh": "Ferfarskje",
|
"refresh": "Ferfarskje",
|
||||||
|
"regeneration_indicator.please_stand_by": "In amerijke.",
|
||||||
|
"regeneration_indicator.preparing_your_home_feed": "Tarieden fan jo starttiidline…",
|
||||||
"relative_time.days": "{number}d",
|
"relative_time.days": "{number}d",
|
||||||
"relative_time.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
"relative_time.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
|
||||||
"relative_time.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
"relative_time.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
|
||||||
@ -715,8 +779,11 @@
|
|||||||
"search_results.accounts": "Profilen",
|
"search_results.accounts": "Profilen",
|
||||||
"search_results.all": "Alles",
|
"search_results.all": "Alles",
|
||||||
"search_results.hashtags": "Hashtags",
|
"search_results.hashtags": "Hashtags",
|
||||||
|
"search_results.no_results": "Gjin resultaten.",
|
||||||
|
"search_results.no_search_yet": "Probearje te sykjen nei berjochten, profilen of hashtags.",
|
||||||
"search_results.see_all": "Alles besjen",
|
"search_results.see_all": "Alles besjen",
|
||||||
"search_results.statuses": "Berjochten",
|
"search_results.statuses": "Berjochten",
|
||||||
|
"search_results.title": "Sykje nei ‘{q}’",
|
||||||
"server_banner.about_active_users": "Oantal brûkers yn de ôfrûne 30 dagen (MAU)",
|
"server_banner.about_active_users": "Oantal brûkers yn de ôfrûne 30 dagen (MAU)",
|
||||||
"server_banner.active_users": "warbere brûkers",
|
"server_banner.active_users": "warbere brûkers",
|
||||||
"server_banner.administered_by": "Beheard troch:",
|
"server_banner.administered_by": "Beheard troch:",
|
||||||
@ -768,6 +835,7 @@
|
|||||||
"status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.",
|
"status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.",
|
||||||
"status.redraft": "Fuortsmite en opnij opstelle",
|
"status.redraft": "Fuortsmite en opnij opstelle",
|
||||||
"status.remove_bookmark": "Blêdwizer fuortsmite",
|
"status.remove_bookmark": "Blêdwizer fuortsmite",
|
||||||
|
"status.remove_favourite": "Ut favoriten fuortsmite",
|
||||||
"status.replied_in_thread": "Antwurde yn petear",
|
"status.replied_in_thread": "Antwurde yn petear",
|
||||||
"status.replied_to": "Antwurde op {name}",
|
"status.replied_to": "Antwurde op {name}",
|
||||||
"status.reply": "Beäntwurdzje",
|
"status.reply": "Beäntwurdzje",
|
||||||
@ -789,6 +857,7 @@
|
|||||||
"subscribed_languages.target": "Toande talen foar {target} wizigje",
|
"subscribed_languages.target": "Toande talen foar {target} wizigje",
|
||||||
"tabs_bar.home": "Startside",
|
"tabs_bar.home": "Startside",
|
||||||
"tabs_bar.notifications": "Meldingen",
|
"tabs_bar.notifications": "Meldingen",
|
||||||
|
"terms_of_service.title": "Gebrûksbetingsten",
|
||||||
"time_remaining.days": "{number, plural, one {# dei} other {# dagen}} te gean",
|
"time_remaining.days": "{number, plural, one {# dei} other {# dagen}} te gean",
|
||||||
"time_remaining.hours": "{number, plural, one {# oere} other {# oeren}} te gean",
|
"time_remaining.hours": "{number, plural, one {# oere} other {# oeren}} te gean",
|
||||||
"time_remaining.minutes": "{number, plural, one {# minút} other {# minuten}} te gean",
|
"time_remaining.minutes": "{number, plural, one {# minút} other {# minuten}} te gean",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Pechar sesión",
|
"confirmations.logout.confirm": "Pechar sesión",
|
||||||
"confirmations.logout.message": "Desexas pechar a sesión?",
|
"confirmations.logout.message": "Desexas pechar a sesión?",
|
||||||
"confirmations.logout.title": "Pechar sesión?",
|
"confirmations.logout.title": "Pechar sesión?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Engadir texto descritivo",
|
||||||
|
"confirmations.missing_alt_text.message": "A publicación contén multimedia sen un texto que o describa. Ao engadir a descrición fas o contido accesible para máis persoas.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publicar igualmente",
|
||||||
|
"confirmations.missing_alt_text.title": "Engadir texto descritivo?",
|
||||||
"confirmations.mute.confirm": "Acalar",
|
"confirmations.mute.confirm": "Acalar",
|
||||||
"confirmations.redraft.confirm": "Eliminar e reescribir",
|
"confirmations.redraft.confirm": "Eliminar e reescribir",
|
||||||
"confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.",
|
"confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "התנתקות",
|
"confirmations.logout.confirm": "התנתקות",
|
||||||
"confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
|
"confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
|
||||||
"confirmations.logout.title": "להתנתק?",
|
"confirmations.logout.title": "להתנתק?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "הוספת מלל חלופי",
|
||||||
|
"confirmations.missing_alt_text.message": "ההודעה שלך כוללת קבצים גרפיים ללא תיאור (מלל חלופי). הוספת תיאורים עוזרת להנגיש את התוכן ליותר אנשים.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "לפרסם בכל זאת",
|
||||||
|
"confirmations.missing_alt_text.title": "להוסיף מלל חלופי?",
|
||||||
"confirmations.mute.confirm": "להשתיק",
|
"confirmations.mute.confirm": "להשתיק",
|
||||||
"confirmations.redraft.confirm": "מחיקה ועריכה מחדש",
|
"confirmations.redraft.confirm": "מחיקה ועריכה מחדש",
|
||||||
"confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.",
|
"confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Kijelentkezés",
|
"confirmations.logout.confirm": "Kijelentkezés",
|
||||||
"confirmations.logout.message": "Biztos, hogy kijelentkezel?",
|
"confirmations.logout.message": "Biztos, hogy kijelentkezel?",
|
||||||
"confirmations.logout.title": "Kijelentkezel?",
|
"confirmations.logout.title": "Kijelentkezel?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Helyettesítő szöveg hozzáadása",
|
||||||
|
"confirmations.missing_alt_text.message": "A bejegyzés helyettesítő szöveg nélküli médiát tartalmaz. A leírások hozzáadása segít a tartalom akadálymentesebbé tételében.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Közzététel mindenképpen",
|
||||||
|
"confirmations.missing_alt_text.title": "Helyettesítő szöveg hozzáadása?",
|
||||||
"confirmations.mute.confirm": "Némítás",
|
"confirmations.mute.confirm": "Némítás",
|
||||||
"confirmations.redraft.confirm": "Törlés és újraírás",
|
"confirmations.redraft.confirm": "Törlés és újraírás",
|
||||||
"confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.",
|
"confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Skrá út",
|
"confirmations.logout.confirm": "Skrá út",
|
||||||
"confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?",
|
"confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?",
|
||||||
"confirmations.logout.title": "Skrá út?",
|
"confirmations.logout.title": "Skrá út?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Bæta við hjálpartexta",
|
||||||
|
"confirmations.missing_alt_text.message": "Færslan þín inniheldur myndefni án ALT-hjálpartexta. Ef þú bætir við lýsingu á myndefninu gerir það efnið þitt aðgengilegt fyrir fleira fólk.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Birta samt",
|
||||||
|
"confirmations.missing_alt_text.title": "Bæta við hjálpartexta?",
|
||||||
"confirmations.mute.confirm": "Þagga",
|
"confirmations.mute.confirm": "Þagga",
|
||||||
"confirmations.redraft.confirm": "Eyða og endurvinna drög",
|
"confirmations.redraft.confirm": "Eyða og endurvinna drög",
|
||||||
"confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
|
"confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Atsijungti",
|
"confirmations.logout.confirm": "Atsijungti",
|
||||||
"confirmations.logout.message": "Ar tikrai nori atsijungti?",
|
"confirmations.logout.message": "Ar tikrai nori atsijungti?",
|
||||||
"confirmations.logout.title": "Atsijungti?",
|
"confirmations.logout.title": "Atsijungti?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Pridėti alternatyvųjį tekstą",
|
||||||
|
"confirmations.missing_alt_text.message": "Jūsų įrašas turi mediją be alternatyvaus teksto. Pridėjus aprašymus, jūsų turinys taps pasiekiamas daugeliui asmenų.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Siųsti vis tiek",
|
||||||
|
"confirmations.missing_alt_text.title": "Pridėti alternatyvųjį tekstą?",
|
||||||
"confirmations.mute.confirm": "Nutildyti",
|
"confirmations.mute.confirm": "Nutildyti",
|
||||||
"confirmations.redraft.confirm": "Ištrinti ir iš naujo parengti",
|
"confirmations.redraft.confirm": "Ištrinti ir iš naujo parengti",
|
||||||
"confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo? Bus prarasti mėgstami ir pasidalinimai, o atsakymai į originalų įrašą bus panaikinti.",
|
"confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo? Bus prarasti mėgstami ir pasidalinimai, o atsakymai į originalų įrašą bus panaikinti.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Uitloggen",
|
"confirmations.logout.confirm": "Uitloggen",
|
||||||
"confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
|
"confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
|
||||||
"confirmations.logout.title": "Uitloggen?",
|
"confirmations.logout.title": "Uitloggen?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Alt-tekst toevoegen",
|
||||||
|
"confirmations.missing_alt_text.message": "Je bericht bevat media zonder alt-tekst. Het toevoegen van beschrijvingen helpt je om je inhoud toegankelijk te maken voor meer mensen.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Toch plaatsen",
|
||||||
|
"confirmations.missing_alt_text.title": "Alt-tekst toevoegen?",
|
||||||
"confirmations.mute.confirm": "Negeren",
|
"confirmations.mute.confirm": "Negeren",
|
||||||
"confirmations.redraft.confirm": "Verwijderen en herschrijven",
|
"confirmations.redraft.confirm": "Verwijderen en herschrijven",
|
||||||
"confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.",
|
"confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.",
|
||||||
@ -301,7 +305,7 @@
|
|||||||
"empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
|
"empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
|
||||||
"empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je een bericht als favoriet markeert, valt deze hier te zien.",
|
"empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je een bericht als favoriet markeert, valt deze hier te zien.",
|
||||||
"empty_column.favourites": "Niemand heeft dit bericht nog als favoriet gemarkeerd. Wanneer iemand dit doet, valt dat hier te zien.",
|
"empty_column.favourites": "Niemand heeft dit bericht nog als favoriet gemarkeerd. Wanneer iemand dit doet, valt dat hier te zien.",
|
||||||
"empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.",
|
"empty_column.follow_requests": "Je hebt nog geen volgverzoeken ontvangen. Wanneer je er een ontvangt, valt dat hier te zien.",
|
||||||
"empty_column.followed_tags": "Je hebt nog geen hashtags gevolgd. Nadat je dit doet, komen deze hier te staan.",
|
"empty_column.followed_tags": "Je hebt nog geen hashtags gevolgd. Nadat je dit doet, komen deze hier te staan.",
|
||||||
"empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
|
"empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
|
||||||
"empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen.",
|
"empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen.",
|
||||||
|
@ -211,6 +211,10 @@
|
|||||||
"confirmations.logout.confirm": "Logg ut",
|
"confirmations.logout.confirm": "Logg ut",
|
||||||
"confirmations.logout.message": "Er du sikker på at du vil logga ut?",
|
"confirmations.logout.message": "Er du sikker på at du vil logga ut?",
|
||||||
"confirmations.logout.title": "Logg ut?",
|
"confirmations.logout.title": "Logg ut?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Legg til alternativ tekst",
|
||||||
|
"confirmations.missing_alt_text.message": "Posten din inneheld media utan alternativ-tekst. Det å leggje til skildringar hjelper med gjere innhaldet ditt tilgjengeleg for fleire personar.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publiser likevel",
|
||||||
|
"confirmations.missing_alt_text.title": "Legg til alternativ tekst?",
|
||||||
"confirmations.mute.confirm": "Demp",
|
"confirmations.mute.confirm": "Demp",
|
||||||
"confirmations.redraft.confirm": "Slett & skriv på nytt",
|
"confirmations.redraft.confirm": "Slett & skriv på nytt",
|
||||||
"confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opprinnelege innlegget vert foreldrelause.",
|
"confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opprinnelege innlegget vert foreldrelause.",
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
"account.hide_reblogs": "Esconder partilhas impulsionadas de @{name}",
|
"account.hide_reblogs": "Esconder partilhas impulsionadas de @{name}",
|
||||||
"account.in_memoriam": "Em Memória.",
|
"account.in_memoriam": "Em Memória.",
|
||||||
"account.joined_short": "Juntou-se a",
|
"account.joined_short": "Juntou-se a",
|
||||||
"account.languages": "Alterar línguas subscritas",
|
"account.languages": "Alterar idiomas subscritos",
|
||||||
"account.link_verified_on": "O proprietário desta hiperligação foi verificado em {date}",
|
"account.link_verified_on": "O proprietário desta hiperligação foi verificado em {date}",
|
||||||
"account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.",
|
"account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.",
|
||||||
"account.media": "Multimédia",
|
"account.media": "Multimédia",
|
||||||
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Terminar sessão",
|
"confirmations.logout.confirm": "Terminar sessão",
|
||||||
"confirmations.logout.message": "Tens a certeza de que queres terminar a sessão?",
|
"confirmations.logout.message": "Tens a certeza de que queres terminar a sessão?",
|
||||||
"confirmations.logout.title": "Terminar sessão?",
|
"confirmations.logout.title": "Terminar sessão?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Adicionar texto alternativo",
|
||||||
|
"confirmations.missing_alt_text.message": "A tua publicação contém multimédia sem texto alternativo. A adição de descrições ajuda a tornar o conteúdo acessível a mais pessoas.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Publicar mesmo assim",
|
||||||
|
"confirmations.missing_alt_text.title": "Adicionar texto alternativo?",
|
||||||
"confirmations.mute.confirm": "Ocultar",
|
"confirmations.mute.confirm": "Ocultar",
|
||||||
"confirmations.redraft.confirm": "Eliminar e reescrever",
|
"confirmations.redraft.confirm": "Eliminar e reescrever",
|
||||||
"confirmations.redraft.message": "Tens a certeza de que queres eliminar e tornar a escrever esta publicação? Os favoritos e as publicações impulsionadas perder-se-ão e as respostas à publicação original ficarão órfãs.",
|
"confirmations.redraft.message": "Tens a certeza de que queres eliminar e tornar a escrever esta publicação? Os favoritos e as publicações impulsionadas perder-se-ão e as respostas à publicação original ficarão órfãs.",
|
||||||
|
@ -452,6 +452,8 @@
|
|||||||
"lists.delete": "Vymazať zoznam",
|
"lists.delete": "Vymazať zoznam",
|
||||||
"lists.done": "Hotovo",
|
"lists.done": "Hotovo",
|
||||||
"lists.edit": "Upraviť zoznam",
|
"lists.edit": "Upraviť zoznam",
|
||||||
|
"lists.exclusive": "Skryť členov na Domovskej osi",
|
||||||
|
"lists.exclusive_hint": "Ak je niekto na tomto zozname, skry ich na tvojej Domácej osi, aby si ich príspevky nevidel/a dvakrát.",
|
||||||
"lists.find_users_to_add": "Nájdi užívateľov na pridanie",
|
"lists.find_users_to_add": "Nájdi užívateľov na pridanie",
|
||||||
"lists.list_members": "Členovia zoznamu",
|
"lists.list_members": "Členovia zoznamu",
|
||||||
"lists.list_name": "Názov zoznamu",
|
"lists.list_name": "Názov zoznamu",
|
||||||
@ -465,6 +467,7 @@
|
|||||||
"lists.replies_policy.none": "Nikomu",
|
"lists.replies_policy.none": "Nikomu",
|
||||||
"lists.save": "Ulož",
|
"lists.save": "Ulož",
|
||||||
"lists.search": "Hľadaj",
|
"lists.search": "Hľadaj",
|
||||||
|
"lists.show_replies_to": "Zahrnúť odpovede od členov zoznamu na",
|
||||||
"load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}",
|
"load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}",
|
||||||
"loading_indicator.label": "Načítavanie…",
|
"loading_indicator.label": "Načítavanie…",
|
||||||
"media_gallery.hide": "Skryť",
|
"media_gallery.hide": "Skryť",
|
||||||
@ -598,6 +601,7 @@
|
|||||||
"onboarding.follows.done": "Hotovo",
|
"onboarding.follows.done": "Hotovo",
|
||||||
"onboarding.follows.empty": "Žiaľ, momentálne sa nedajú zobraziť žiadne výsledky. Môžete skúsiť použiť vyhľadávanie alebo navštíviť stránku objavovania a nájsť ľudí, ktorých chcete sledovať, alebo to skúste znova neskôr.",
|
"onboarding.follows.empty": "Žiaľ, momentálne sa nedajú zobraziť žiadne výsledky. Môžete skúsiť použiť vyhľadávanie alebo navštíviť stránku objavovania a nájsť ľudí, ktorých chcete sledovať, alebo to skúste znova neskôr.",
|
||||||
"onboarding.follows.search": "Hľadať",
|
"onboarding.follows.search": "Hľadať",
|
||||||
|
"onboarding.follows.title": "Pre začiatok nasleduj ľudí",
|
||||||
"onboarding.profile.discoverable": "Nastavte svoj profil ako objaviteľný",
|
"onboarding.profile.discoverable": "Nastavte svoj profil ako objaviteľný",
|
||||||
"onboarding.profile.discoverable_hint": "Keď si na Mastodone zapnete objaviteľnosť, vaše príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania a v populárnych. Váš profil môže byť navyše navrhovaný ľuďom, s ktorými máte podobné záujmy.",
|
"onboarding.profile.discoverable_hint": "Keď si na Mastodone zapnete objaviteľnosť, vaše príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania a v populárnych. Váš profil môže byť navyše navrhovaný ľuďom, s ktorými máte podobné záujmy.",
|
||||||
"onboarding.profile.display_name": "Používateľské meno",
|
"onboarding.profile.display_name": "Používateľské meno",
|
||||||
|
@ -213,6 +213,10 @@
|
|||||||
"confirmations.logout.confirm": "Dilni",
|
"confirmations.logout.confirm": "Dilni",
|
||||||
"confirmations.logout.message": "Jeni i sigurt se doni të dilet?",
|
"confirmations.logout.message": "Jeni i sigurt se doni të dilet?",
|
||||||
"confirmations.logout.title": "Të dilet?",
|
"confirmations.logout.title": "Të dilet?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Shtoni tekst alternativ",
|
||||||
|
"confirmations.missing_alt_text.message": "Postimi juaj përmban media pa tekst alternativ. Shtimi i përshkrimeve ndihmon të bëhet lënda juaj e përdorshme nga më tepër njerëz.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Postoje, sido qoftë",
|
||||||
|
"confirmations.missing_alt_text.title": "Të shtohet tekst alternativ?",
|
||||||
"confirmations.mute.confirm": "Heshtoje",
|
"confirmations.mute.confirm": "Heshtoje",
|
||||||
"confirmations.redraft.confirm": "Fshijeni & rihartojeni",
|
"confirmations.redraft.confirm": "Fshijeni & rihartojeni",
|
||||||
"confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.",
|
"confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Oturumu kapat",
|
"confirmations.logout.confirm": "Oturumu kapat",
|
||||||
"confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?",
|
"confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?",
|
||||||
"confirmations.logout.title": "Oturumu kapat?",
|
"confirmations.logout.title": "Oturumu kapat?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Alternatif metin ekle",
|
||||||
|
"confirmations.missing_alt_text.message": "Gönderiniz alternatif metni olmayan medya içeriyor. Tanımlamalar eklemek, içeriğinizi insanlar açısından daha erişilebilir kılar.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Yine de gönder",
|
||||||
|
"confirmations.missing_alt_text.title": "Alternatif metin ekle?",
|
||||||
"confirmations.mute.confirm": "Sessize al",
|
"confirmations.mute.confirm": "Sessize al",
|
||||||
"confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş",
|
"confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş",
|
||||||
"confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.",
|
"confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.",
|
||||||
|
@ -218,6 +218,9 @@
|
|||||||
"confirmations.logout.confirm": "Вийти",
|
"confirmations.logout.confirm": "Вийти",
|
||||||
"confirmations.logout.message": "Ви впевнені, що хочете вийти?",
|
"confirmations.logout.message": "Ви впевнені, що хочете вийти?",
|
||||||
"confirmations.logout.title": "Вийти?",
|
"confirmations.logout.title": "Вийти?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Додати альтернативний текст",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Все одно опублікувати",
|
||||||
|
"confirmations.missing_alt_text.title": "Додати альтернативний текст?",
|
||||||
"confirmations.mute.confirm": "Приховати",
|
"confirmations.mute.confirm": "Приховати",
|
||||||
"confirmations.redraft.confirm": "Видалити та виправити",
|
"confirmations.redraft.confirm": "Видалити та виправити",
|
||||||
"confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.",
|
"confirmations.redraft.message": "Ви впевнені, що хочете видалити цей допис та переписати його? Додавання у вибране та поширення буде втрачено, а відповіді на оригінальний допис залишаться без першоджерела.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "Đăng xuất",
|
"confirmations.logout.confirm": "Đăng xuất",
|
||||||
"confirmations.logout.message": "Bạn có chắc muốn thoát?",
|
"confirmations.logout.message": "Bạn có chắc muốn thoát?",
|
||||||
"confirmations.logout.title": "Đăng xuất",
|
"confirmations.logout.title": "Đăng xuất",
|
||||||
|
"confirmations.missing_alt_text.confirm": "Thêm văn bản thay thế",
|
||||||
|
"confirmations.missing_alt_text.message": "Tút của bạn chứa media không có văn bản thay thế. Thêm mô tả giúp nội dung của bạn dễ tiếp cận với nhiều người hơn.",
|
||||||
|
"confirmations.missing_alt_text.secondary": "Đăng luôn",
|
||||||
|
"confirmations.missing_alt_text.title": "Thêm văn bản thay thế?",
|
||||||
"confirmations.mute.confirm": "Ẩn",
|
"confirmations.mute.confirm": "Ẩn",
|
||||||
"confirmations.redraft.confirm": "Xóa & viết lại",
|
"confirmations.redraft.confirm": "Xóa & viết lại",
|
||||||
"confirmations.redraft.message": "Điều này sẽ khiến những lượt thích và đăng lại của tút bị mất, cũng như những trả lời sẽ không còn nội dung gốc.",
|
"confirmations.redraft.message": "Điều này sẽ khiến những lượt thích và đăng lại của tút bị mất, cũng như những trả lời sẽ không còn nội dung gốc.",
|
||||||
@ -414,6 +418,8 @@
|
|||||||
"ignore_notifications_modal.not_followers_title": "Bỏ qua thông báo từ những người chưa theo dõi bạn?",
|
"ignore_notifications_modal.not_followers_title": "Bỏ qua thông báo từ những người chưa theo dõi bạn?",
|
||||||
"ignore_notifications_modal.not_following_title": "Bỏ qua thông báo từ những người bạn không theo dõi?",
|
"ignore_notifications_modal.not_following_title": "Bỏ qua thông báo từ những người bạn không theo dõi?",
|
||||||
"ignore_notifications_modal.private_mentions_title": "Bỏ qua thông báo từ những lượt Nhắn Riêng không mong muốn?",
|
"ignore_notifications_modal.private_mentions_title": "Bỏ qua thông báo từ những lượt Nhắn Riêng không mong muốn?",
|
||||||
|
"info_button.label": "Trợ giúp",
|
||||||
|
"info_button.what_is_alt_text": "<h1>Văn bản thay thế là gì?</h1> <p>Văn bản thay thế giúp mô tả hình ảnh cho những người khiếm thị, kết nối mạng chậm hoặc những người muốn biết ngữ cảnh bổ sung.</p> <p>Bạn có thể cải thiện khả năng tiếp cận và giải thích kỹ hơn cho mọi người bằng cách viết văn bản thay thế rõ ràng, ngắn gọn và khách quan.</p> <ul> <li>Nắm bắt thành phần quan trọng</li> <li>Tóm tắt văn bản trong hình</li> <li>Dùng cấu trúc câu đơn</li> <li>Tránh giải thích rối rắmn</li> <li>Tập trung vào các xu hướng và phát hiện chính trong hình ảnh phức tạp (như biểu đồ hoặc bản đồ)</li> </ul>",
|
||||||
"interaction_modal.action.favourite": "Để thích, bạn cần dùng tài khoản của bạn.",
|
"interaction_modal.action.favourite": "Để thích, bạn cần dùng tài khoản của bạn.",
|
||||||
"interaction_modal.action.follow": "Để theo dõi, bạn cần dùng tài khoản của bạn.",
|
"interaction_modal.action.follow": "Để theo dõi, bạn cần dùng tài khoản của bạn.",
|
||||||
"interaction_modal.action.reblog": "Để đăng lại, bạn cần dùng tài khoản của bạn.",
|
"interaction_modal.action.reblog": "Để đăng lại, bạn cần dùng tài khoản của bạn.",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "退出登录",
|
"confirmations.logout.confirm": "退出登录",
|
||||||
"confirmations.logout.message": "确定要退出登录吗?",
|
"confirmations.logout.message": "确定要退出登录吗?",
|
||||||
"confirmations.logout.title": "确定要退出登录?",
|
"confirmations.logout.title": "确定要退出登录?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "添加替代文本",
|
||||||
|
"confirmations.missing_alt_text.message": "您的帖子包含没有添加替代文本的媒体。添加描述有助于使更多人访问您的内容。",
|
||||||
|
"confirmations.missing_alt_text.secondary": "就这样发布",
|
||||||
|
"confirmations.missing_alt_text.title": "添加替代文本?",
|
||||||
"confirmations.mute.confirm": "隐藏",
|
"confirmations.mute.confirm": "隐藏",
|
||||||
"confirmations.redraft.confirm": "删除并重新编辑",
|
"confirmations.redraft.confirm": "删除并重新编辑",
|
||||||
"confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。",
|
"confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。",
|
||||||
|
@ -218,6 +218,10 @@
|
|||||||
"confirmations.logout.confirm": "登出",
|
"confirmations.logout.confirm": "登出",
|
||||||
"confirmations.logout.message": "您確定要登出嗎?",
|
"confirmations.logout.message": "您確定要登出嗎?",
|
||||||
"confirmations.logout.title": "您確定要登出嗎?",
|
"confirmations.logout.title": "您確定要登出嗎?",
|
||||||
|
"confirmations.missing_alt_text.confirm": "新增說明文字",
|
||||||
|
"confirmations.missing_alt_text.message": "您的嘟文中的多媒體內容未附上說明文字。添加說明文字描述能幫助更多人存取您的內容。",
|
||||||
|
"confirmations.missing_alt_text.secondary": "仍要發嘟",
|
||||||
|
"confirmations.missing_alt_text.title": "是否新增說明文字?",
|
||||||
"confirmations.mute.confirm": "靜音",
|
"confirmations.mute.confirm": "靜音",
|
||||||
"confirmations.redraft.confirm": "刪除並重新編輯",
|
"confirmations.redraft.confirm": "刪除並重新編輯",
|
||||||
"confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。",
|
"confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。",
|
||||||
|
@ -351,6 +351,38 @@ class FeedManager
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Populate list feed of account from scratch
|
||||||
|
# @param [List] list
|
||||||
|
# @return [void]
|
||||||
|
def populate_list(list)
|
||||||
|
limit = FeedManager::MAX_ITEMS / 2
|
||||||
|
aggregate = list.account.user&.aggregates_reblogs?
|
||||||
|
timeline_key = key(:list, list.id)
|
||||||
|
|
||||||
|
list.active_accounts.includes(:account_stat).reorder(nil).find_each do |target_account|
|
||||||
|
if redis.zcard(timeline_key) >= limit
|
||||||
|
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
|
||||||
|
last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at)
|
||||||
|
|
||||||
|
# If the feed is full and this account has not posted more recently
|
||||||
|
# than the last item on the feed, then we can skip the whole account
|
||||||
|
# because none of its statuses would stay on the feed anyway
|
||||||
|
next if last_status_score < oldest_home_score
|
||||||
|
end
|
||||||
|
|
||||||
|
statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit)
|
||||||
|
crutches = build_crutches(list.account_id, statuses)
|
||||||
|
|
||||||
|
statuses.each do |status|
|
||||||
|
next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list)
|
||||||
|
|
||||||
|
add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate)
|
||||||
|
end
|
||||||
|
|
||||||
|
trim(:list, list.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Completely clear multiple feeds at once
|
# Completely clear multiple feeds at once
|
||||||
# @param [Symbol] type
|
# @param [Symbol] type
|
||||||
# @param [Array<Integer>] ids
|
# @param [Array<Integer>] ids
|
||||||
|
@ -24,6 +24,7 @@ class List < ApplicationRecord
|
|||||||
|
|
||||||
has_many :list_accounts, inverse_of: :list, dependent: :destroy
|
has_many :list_accounts, inverse_of: :list, dependent: :destroy
|
||||||
has_many :accounts, through: :list_accounts
|
has_many :accounts, through: :list_accounts
|
||||||
|
has_many :active_accounts, -> { merge(ListAccount.active) }, through: :list_accounts, source: :account
|
||||||
|
|
||||||
validates :title, presence: true
|
validates :title, presence: true
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ class ListAccount < ApplicationRecord
|
|||||||
validates :account_id, uniqueness: { scope: :list_id }
|
validates :account_id, uniqueness: { scope: :list_id }
|
||||||
validate :validate_relationship
|
validate :validate_relationship
|
||||||
|
|
||||||
|
scope :active, -> { where.not(follow_id: nil) }
|
||||||
|
|
||||||
before_validation :set_follow, unless: :list_owner_account_is_account?
|
before_validation :set_follow, unless: :list_owner_account_is_account?
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -34,6 +34,7 @@ class UserSettings
|
|||||||
setting :delete_modal, default: true
|
setting :delete_modal, default: true
|
||||||
setting :reblog_modal, default: false
|
setting :reblog_modal, default: false
|
||||||
setting :favourite_modal, default: false
|
setting :favourite_modal, default: false
|
||||||
|
setting :missing_alt_text_modal, default: true
|
||||||
setting :reduce_motion, default: false
|
setting :reduce_motion, default: false
|
||||||
setting :expand_content_warnings, default: false
|
setting :expand_content_warnings, default: false
|
||||||
setting :display_media, default: 'default', in: %w(default show_all hide_all)
|
setting :display_media, default: 'default', in: %w(default show_all hide_all)
|
||||||
|
@ -26,7 +26,7 @@ class InitialStateSerializer < ActiveModel::Serializer
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def meta
|
def meta # rubocop:disable Metrics/AbcSize
|
||||||
store = default_meta_store
|
store = default_meta_store
|
||||||
|
|
||||||
if object.current_account
|
if object.current_account
|
||||||
@ -34,6 +34,7 @@ class InitialStateSerializer < ActiveModel::Serializer
|
|||||||
store[:boost_modal] = object_account_user.setting_boost_modal
|
store[:boost_modal] = object_account_user.setting_boost_modal
|
||||||
store[:favourite_modal] = object_account_user.setting_favourite_modal
|
store[:favourite_modal] = object_account_user.setting_favourite_modal
|
||||||
store[:delete_modal] = object_account_user.setting_delete_modal
|
store[:delete_modal] = object_account_user.setting_delete_modal
|
||||||
|
store[:missing_alt_text_modal] = object_account_user.settings['web.missing_alt_text_modal']
|
||||||
store[:auto_play_gif] = object_account_user.setting_auto_play_gif
|
store[:auto_play_gif] = object_account_user.setting_auto_play_gif
|
||||||
store[:display_media] = object_account_user.setting_display_media
|
store[:display_media] = object_account_user.setting_display_media
|
||||||
store[:expand_spoilers] = object_account_user.setting_expand_spoilers
|
store[:expand_spoilers] = object_account_user.setting_expand_spoilers
|
||||||
|
@ -6,6 +6,10 @@ class PrecomputeFeedService < BaseService
|
|||||||
def call(account)
|
def call(account)
|
||||||
FeedManager.instance.populate_home(account)
|
FeedManager.instance.populate_home(account)
|
||||||
FeedManager.instance.populate_direct_feed(account)
|
FeedManager.instance.populate_direct_feed(account)
|
||||||
|
|
||||||
|
account.owned_lists.each do |list|
|
||||||
|
FeedManager.instance.populate_list(list)
|
||||||
|
end
|
||||||
ensure
|
ensure
|
||||||
redis.del("account:#{account.id}:regeneration")
|
redis.del("account:#{account.id}:regeneration")
|
||||||
end
|
end
|
||||||
|
@ -5,9 +5,12 @@ class PollExpirationValidator < ActiveModel::Validator
|
|||||||
MIN_EXPIRATION = 5.minutes.freeze
|
MIN_EXPIRATION = 5.minutes.freeze
|
||||||
|
|
||||||
def validate(poll)
|
def validate(poll)
|
||||||
|
# We have a `presence: true` check for this attribute already
|
||||||
|
return if poll.expires_at.nil?
|
||||||
|
|
||||||
current_time = Time.now.utc
|
current_time = Time.now.utc
|
||||||
|
|
||||||
poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_long')) if poll.expires_at.nil? || poll.expires_at - current_time > MAX_EXPIRATION
|
poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_long')) if poll.expires_at - current_time > MAX_EXPIRATION
|
||||||
poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_short')) if poll.expires_at.present? && (poll.expires_at - current_time).ceil < MIN_EXPIRATION
|
poll.errors.add(:expires_at, I18n.t('polls.errors.duration_too_short')) if (poll.expires_at - current_time).ceil < MIN_EXPIRATION
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
= ff.input :'web.reblog_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_boost_modal')
|
= ff.input :'web.reblog_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_boost_modal')
|
||||||
= ff.input :'web.favourite_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_favourite_modal'), glitch_only: true
|
= ff.input :'web.favourite_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_favourite_modal'), glitch_only: true
|
||||||
= ff.input :'web.delete_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_delete_modal')
|
= ff.input :'web.delete_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_delete_modal')
|
||||||
|
= ff.input :'web.missing_alt_text_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_missing_alt_text_modal')
|
||||||
|
|
||||||
%h4= t 'appearance.sensitive_content'
|
%h4= t 'appearance.sensitive_content'
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ fy:
|
|||||||
models:
|
models:
|
||||||
account:
|
account:
|
||||||
attributes:
|
attributes:
|
||||||
|
fields:
|
||||||
|
fields_with_values_missing_labels: befettet wearden mei ûntbrekkende labels
|
||||||
username:
|
username:
|
||||||
invalid: mei allinnich letters, nûmers en ûnderstreekjes befetsje
|
invalid: mei allinnich letters, nûmers en ûnderstreekjes befetsje
|
||||||
reserved: reservearre
|
reserved: reservearre
|
||||||
|
@ -948,6 +948,9 @@ fo:
|
|||||||
preview:
|
preview:
|
||||||
explanation_html: 'Teldubrævið verður sent til <strong>%{display_count} brúkarar</strong>, sum hava stovna kontu áðrenn %{date}. Fylgjandi tekstur kemur við í teldubrævið:'
|
explanation_html: 'Teldubrævið verður sent til <strong>%{display_count} brúkarar</strong>, sum hava stovna kontu áðrenn %{date}. Fylgjandi tekstur kemur við í teldubrævið:'
|
||||||
send_preview: Send undanvísing til %{email}
|
send_preview: Send undanvísing til %{email}
|
||||||
|
send_to_all:
|
||||||
|
one: Send %{display_count} teldubræv
|
||||||
|
other: Send %{display_count} teldubrøv
|
||||||
title: Undanvís fráboðan um tænastutreytir
|
title: Undanvís fráboðan um tænastutreytir
|
||||||
publish: Útgev
|
publish: Útgev
|
||||||
published_on_html: Útgivið %{date}
|
published_on_html: Útgivið %{date}
|
||||||
|
@ -1209,6 +1209,7 @@ fy:
|
|||||||
too_fast: Formulier is te fluch yntsjinne. Probearje it nochris.
|
too_fast: Formulier is te fluch yntsjinne. Probearje it nochris.
|
||||||
use_security_key: Befeiligingskaai brûke
|
use_security_key: Befeiligingskaai brûke
|
||||||
user_agreement_html: Ik haw de <a href="%{terms_of_service_path}" target="_blank">gebrûksbetingsten</a> en it <a href="%{privacy_policy_path}" target="_blank">privacybelied</a> lêzen en gean der mei akkoard
|
user_agreement_html: Ik haw de <a href="%{terms_of_service_path}" target="_blank">gebrûksbetingsten</a> en it <a href="%{privacy_policy_path}" target="_blank">privacybelied</a> lêzen en gean der mei akkoard
|
||||||
|
user_privacy_agreement_html: Ik haw it <a href="%{privacy_policy_path}" target="_blank">privacybelied</a> lêzen en gean dêrmei akkoard
|
||||||
author_attribution:
|
author_attribution:
|
||||||
example_title: Faorbyldtekst
|
example_title: Faorbyldtekst
|
||||||
hint_html: Skriuwe jo nijs- of blogartikelen bûten Mastodon? Bepaal hoe’t jo oahelle wurde as dizze dield wurde op Mastodon.
|
hint_html: Skriuwe jo nijs- of blogartikelen bûten Mastodon? Bepaal hoe’t jo oahelle wurde as dizze dield wurde op Mastodon.
|
||||||
|
@ -176,7 +176,7 @@ gl:
|
|||||||
approve_appeal: Aprobar apelación
|
approve_appeal: Aprobar apelación
|
||||||
approve_user: Aprobar Usuaria
|
approve_user: Aprobar Usuaria
|
||||||
assigned_to_self_report: Asignar denuncia
|
assigned_to_self_report: Asignar denuncia
|
||||||
change_email_user: Cambiar o correo da Usuaria
|
change_email_user: Cambiar o correo da usuaria
|
||||||
change_role_user: Cambiar Rol da Usuaria
|
change_role_user: Cambiar Rol da Usuaria
|
||||||
confirm_user: Confirmar usuaria
|
confirm_user: Confirmar usuaria
|
||||||
create_account_warning: Crear aviso
|
create_account_warning: Crear aviso
|
||||||
|
@ -134,6 +134,7 @@ bg:
|
|||||||
changelog: Може да се структурира със синтаксиса на Markdown.
|
changelog: Може да се структурира със синтаксиса на Markdown.
|
||||||
text: Може да се структурира със синтаксиса на Markdown.
|
text: Може да се структурира със синтаксиса на Markdown.
|
||||||
terms_of_service_generator:
|
terms_of_service_generator:
|
||||||
|
admin_email: Правните бележки включват насрещни известия, постановления на съда, заявки за сваляне и заявки от правоохранителните органи.
|
||||||
domain: Неповторимо идентифициране на онлайн услугата, която предоставяте.
|
domain: Неповторимо идентифициране на онлайн услугата, която предоставяте.
|
||||||
jurisdiction: Впишете държавата, където живее всеки, който плаща сметките. Ако е дружество или друго образувание, то впишете държавата, в която е регистрирано, и градът, регионът, територията или щатът според случая.
|
jurisdiction: Впишете държавата, където живее всеки, който плаща сметките. Ако е дружество или друго образувание, то впишете държавата, в която е регистрирано, и градът, регионът, територията или щатът според случая.
|
||||||
user:
|
user:
|
||||||
|
@ -225,6 +225,7 @@ ca:
|
|||||||
setting_display_media_show_all: Mostra-ho tot
|
setting_display_media_show_all: Mostra-ho tot
|
||||||
setting_expand_spoilers: Desplega sempre els tuts marcats amb advertències de contingut
|
setting_expand_spoilers: Desplega sempre els tuts marcats amb advertències de contingut
|
||||||
setting_hide_network: Amaga la teva xarxa
|
setting_hide_network: Amaga la teva xarxa
|
||||||
|
setting_missing_alt_text_modal: Mostra un diàleg de confirmació abans de publicar contingut sense text alternatiu
|
||||||
setting_reduce_motion: Redueix el moviment de les animacions
|
setting_reduce_motion: Redueix el moviment de les animacions
|
||||||
setting_system_font_ui: Usa la lletra predeterminada del sistema
|
setting_system_font_ui: Usa la lletra predeterminada del sistema
|
||||||
setting_system_scrollbars_ui: Usa la barra de desplaçament predeterminada del sistema
|
setting_system_scrollbars_ui: Usa la barra de desplaçament predeterminada del sistema
|
||||||
|
@ -233,6 +233,7 @@ da:
|
|||||||
setting_display_media_show_all: Vis alle
|
setting_display_media_show_all: Vis alle
|
||||||
setting_expand_spoilers: Ekspandér altid indlæg markeret med indholdsadvarsler
|
setting_expand_spoilers: Ekspandér altid indlæg markeret med indholdsadvarsler
|
||||||
setting_hide_network: Skjul din sociale graf
|
setting_hide_network: Skjul din sociale graf
|
||||||
|
setting_missing_alt_text_modal: Vis bekræftelsesdialog inden medier uden alt-tekst lægges op
|
||||||
setting_reduce_motion: Reducér animationsbevægelse
|
setting_reduce_motion: Reducér animationsbevægelse
|
||||||
setting_system_font_ui: Brug systemets standardskrifttype
|
setting_system_font_ui: Brug systemets standardskrifttype
|
||||||
setting_system_scrollbars_ui: Brug standard systemrullebjælke
|
setting_system_scrollbars_ui: Brug standard systemrullebjælke
|
||||||
|
@ -233,6 +233,7 @@ de:
|
|||||||
setting_display_media_show_all: Alle Medien anzeigen
|
setting_display_media_show_all: Alle Medien anzeigen
|
||||||
setting_expand_spoilers: Beiträge mit Inhaltswarnung immer ausklappen
|
setting_expand_spoilers: Beiträge mit Inhaltswarnung immer ausklappen
|
||||||
setting_hide_network: Follower und „Folge ich“ nicht anzeigen
|
setting_hide_network: Follower und „Folge ich“ nicht anzeigen
|
||||||
|
setting_missing_alt_text_modal: Bestätigungsdialog anzeigen, bevor Medien ohne Bildbeschreibung veröffentlicht werden
|
||||||
setting_reduce_motion: Bewegung in Animationen verringern
|
setting_reduce_motion: Bewegung in Animationen verringern
|
||||||
setting_system_font_ui: Standardschriftart des Browsers verwenden
|
setting_system_font_ui: Standardschriftart des Browsers verwenden
|
||||||
setting_system_scrollbars_ui: Bildlaufleiste des Systems verwenden
|
setting_system_scrollbars_ui: Bildlaufleiste des Systems verwenden
|
||||||
|
@ -233,6 +233,7 @@ en:
|
|||||||
setting_display_media_show_all: Show all
|
setting_display_media_show_all: Show all
|
||||||
setting_expand_spoilers: Always expand posts marked with content warnings
|
setting_expand_spoilers: Always expand posts marked with content warnings
|
||||||
setting_hide_network: Hide your social graph
|
setting_hide_network: Hide your social graph
|
||||||
|
setting_missing_alt_text_modal: Show confirmation dialog before posting media without alt text
|
||||||
setting_reduce_motion: Reduce motion in animations
|
setting_reduce_motion: Reduce motion in animations
|
||||||
setting_system_font_ui: Use system's default font
|
setting_system_font_ui: Use system's default font
|
||||||
setting_system_scrollbars_ui: Use system's default scrollbar
|
setting_system_scrollbars_ui: Use system's default scrollbar
|
||||||
|
@ -233,6 +233,7 @@ eo:
|
|||||||
setting_display_media_show_all: Montri ĉiujn
|
setting_display_media_show_all: Montri ĉiujn
|
||||||
setting_expand_spoilers: Ĉiam malfoldas mesaĝojn markitajn per averto pri enhavo
|
setting_expand_spoilers: Ĉiam malfoldas mesaĝojn markitajn per averto pri enhavo
|
||||||
setting_hide_network: Kaŝi viajn sekvantojn kaj sekvatojn
|
setting_hide_network: Kaŝi viajn sekvantojn kaj sekvatojn
|
||||||
|
setting_missing_alt_text_modal: Montru konfirman dialogon antaŭ afiŝado de amaskomunikiloj sen altteksto
|
||||||
setting_reduce_motion: Redukti la movecojn de la animacioj
|
setting_reduce_motion: Redukti la movecojn de la animacioj
|
||||||
setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo
|
setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo
|
||||||
setting_system_scrollbars_ui: Uzu la defaŭltan rulumilon de la sistemo
|
setting_system_scrollbars_ui: Uzu la defaŭltan rulumilon de la sistemo
|
||||||
|
@ -233,6 +233,7 @@ es-AR:
|
|||||||
setting_display_media_show_all: Mostrar todo
|
setting_display_media_show_all: Mostrar todo
|
||||||
setting_expand_spoilers: Siempre expandir los mensajes marcados con advertencias de contenido
|
setting_expand_spoilers: Siempre expandir los mensajes marcados con advertencias de contenido
|
||||||
setting_hide_network: Ocultá tu gráfica social
|
setting_hide_network: Ocultá tu gráfica social
|
||||||
|
setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de publicar medios sin texto alternativo
|
||||||
setting_reduce_motion: Reducir el movimiento de las animaciones
|
setting_reduce_motion: Reducir el movimiento de las animaciones
|
||||||
setting_system_font_ui: Utilizar la tipografía predeterminada del sistema
|
setting_system_font_ui: Utilizar la tipografía predeterminada del sistema
|
||||||
setting_system_scrollbars_ui: Usar la barra de desplazamiento predeterminada del sistema operativo
|
setting_system_scrollbars_ui: Usar la barra de desplazamiento predeterminada del sistema operativo
|
||||||
|
@ -233,6 +233,7 @@ es-MX:
|
|||||||
setting_display_media_show_all: Mostrar todo
|
setting_display_media_show_all: Mostrar todo
|
||||||
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
||||||
setting_hide_network: Ocultar tu red
|
setting_hide_network: Ocultar tu red
|
||||||
|
setting_missing_alt_text_modal: Mostrar cuadro de diálogo de confirmación antes de publicar contenido multimedia sin texto alternativo
|
||||||
setting_reduce_motion: Reducir el movimiento de las animaciones
|
setting_reduce_motion: Reducir el movimiento de las animaciones
|
||||||
setting_system_font_ui: Usar la fuente por defecto del sistema
|
setting_system_font_ui: Usar la fuente por defecto del sistema
|
||||||
setting_system_scrollbars_ui: Usar la barra de desplazamiento por defecto del sistema
|
setting_system_scrollbars_ui: Usar la barra de desplazamiento por defecto del sistema
|
||||||
|
@ -233,6 +233,7 @@ es:
|
|||||||
setting_display_media_show_all: Mostrar todo
|
setting_display_media_show_all: Mostrar todo
|
||||||
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
||||||
setting_hide_network: Ocultar tu red
|
setting_hide_network: Ocultar tu red
|
||||||
|
setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de publicar medios sin texto alternativo
|
||||||
setting_reduce_motion: Reducir el movimiento de las animaciones
|
setting_reduce_motion: Reducir el movimiento de las animaciones
|
||||||
setting_system_font_ui: Utilizar la tipografía por defecto del sistema
|
setting_system_font_ui: Utilizar la tipografía por defecto del sistema
|
||||||
setting_system_scrollbars_ui: Utilizar barra de desplazamiento predeterminada del sistema
|
setting_system_scrollbars_ui: Utilizar barra de desplazamiento predeterminada del sistema
|
||||||
|
@ -233,6 +233,7 @@ fi:
|
|||||||
setting_display_media_show_all: Näytä kaikki
|
setting_display_media_show_all: Näytä kaikki
|
||||||
setting_expand_spoilers: Laajenna aina sisältövaroituksilla merkityt julkaisut
|
setting_expand_spoilers: Laajenna aina sisältövaroituksilla merkityt julkaisut
|
||||||
setting_hide_network: Piilota verkostotietosi
|
setting_hide_network: Piilota verkostotietosi
|
||||||
|
setting_missing_alt_text_modal: Näytä vahvistusikkuna ennen kuin julkaistaan mediaa ilman vaihtoehtoista tekstiä
|
||||||
setting_reduce_motion: Vähennä animaatioiden liikettä
|
setting_reduce_motion: Vähennä animaatioiden liikettä
|
||||||
setting_system_font_ui: Käytä järjestelmän oletusfonttia
|
setting_system_font_ui: Käytä järjestelmän oletusfonttia
|
||||||
setting_system_scrollbars_ui: Käytä järjestelmän oletusarvoista vierityspalkkia
|
setting_system_scrollbars_ui: Käytä järjestelmän oletusarvoista vierityspalkkia
|
||||||
|
@ -233,6 +233,7 @@ fo:
|
|||||||
setting_display_media_show_all: Vís alt
|
setting_display_media_show_all: Vís alt
|
||||||
setting_expand_spoilers: Víðka altíð postar, sum eru merktir við innihaldsávaringum
|
setting_expand_spoilers: Víðka altíð postar, sum eru merktir við innihaldsávaringum
|
||||||
setting_hide_network: Fjal sosiala grafin hjá tær
|
setting_hide_network: Fjal sosiala grafin hjá tær
|
||||||
|
setting_missing_alt_text_modal: Spyr um góðkenning áðrenn miðlar uttan alternativan tekst verða postaðir
|
||||||
setting_reduce_motion: Minka um rørslu í teknimyndum
|
setting_reduce_motion: Minka um rørslu í teknimyndum
|
||||||
setting_system_font_ui: Brúka vanliga skriftaslagið hjá skipanini
|
setting_system_font_ui: Brúka vanliga skriftaslagið hjá skipanini
|
||||||
setting_system_scrollbars_ui: Brúka vanliga skrullibjálkan hjá skipanini
|
setting_system_scrollbars_ui: Brúka vanliga skrullibjálkan hjá skipanini
|
||||||
|
@ -233,6 +233,7 @@ fr-CA:
|
|||||||
setting_display_media_show_all: Montrer tout
|
setting_display_media_show_all: Montrer tout
|
||||||
setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu
|
setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu
|
||||||
setting_hide_network: Cacher votre réseau
|
setting_hide_network: Cacher votre réseau
|
||||||
|
setting_missing_alt_text_modal: Afficher une fenêtre de confirmation avant de poster un média sans texte alternatif
|
||||||
setting_reduce_motion: Réduire la vitesse des animations
|
setting_reduce_motion: Réduire la vitesse des animations
|
||||||
setting_system_font_ui: Utiliser la police par défaut du système
|
setting_system_font_ui: Utiliser la police par défaut du système
|
||||||
setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système
|
setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système
|
||||||
|
@ -233,6 +233,7 @@ fr:
|
|||||||
setting_display_media_show_all: Montrer tout
|
setting_display_media_show_all: Montrer tout
|
||||||
setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu
|
setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu
|
||||||
setting_hide_network: Cacher votre réseau
|
setting_hide_network: Cacher votre réseau
|
||||||
|
setting_missing_alt_text_modal: Afficher une fenêtre de confirmation avant de poster un média sans texte alternatif
|
||||||
setting_reduce_motion: Réduire la vitesse des animations
|
setting_reduce_motion: Réduire la vitesse des animations
|
||||||
setting_system_font_ui: Utiliser la police par défaut du système
|
setting_system_font_ui: Utiliser la police par défaut du système
|
||||||
setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système
|
setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système
|
||||||
|
@ -3,6 +3,7 @@ fy:
|
|||||||
simple_form:
|
simple_form:
|
||||||
hints:
|
hints:
|
||||||
account:
|
account:
|
||||||
|
attribution_domains: Ien per rigel. Beskermet tsjin falske attribúsjes.
|
||||||
discoverable: Jo iepenbiere berjochten kinne útljochte wurde op ferskate plakken binnen Mastodon en jo account kin oanrekommandearre wurde oan oare brûkers.
|
discoverable: Jo iepenbiere berjochten kinne útljochte wurde op ferskate plakken binnen Mastodon en jo account kin oanrekommandearre wurde oan oare brûkers.
|
||||||
display_name: Jo folsleine namme of in aardige bynamme.
|
display_name: Jo folsleine namme of in aardige bynamme.
|
||||||
fields: Jo website, persoanlike foarnammewurden, leeftiid, alles wat jo mar kwyt wolle.
|
fields: Jo website, persoanlike foarnammewurden, leeftiid, alles wat jo mar kwyt wolle.
|
||||||
@ -155,6 +156,7 @@ fy:
|
|||||||
url: Wêr’t eveneminten nei ta stjoerd wurde
|
url: Wêr’t eveneminten nei ta stjoerd wurde
|
||||||
labels:
|
labels:
|
||||||
account:
|
account:
|
||||||
|
attribution_domains: Websites dy’t jo wurdearring jaan meie
|
||||||
discoverable: Profyl en bydragen yn sykalgoritmen opnimme litte
|
discoverable: Profyl en bydragen yn sykalgoritmen opnimme litte
|
||||||
fields:
|
fields:
|
||||||
name: Label
|
name: Label
|
||||||
|
@ -233,6 +233,7 @@ gl:
|
|||||||
setting_display_media_show_all: Mostrar todo
|
setting_display_media_show_all: Mostrar todo
|
||||||
setting_expand_spoilers: Despregar sempre as publicacións marcadas con avisos de contido
|
setting_expand_spoilers: Despregar sempre as publicacións marcadas con avisos de contido
|
||||||
setting_hide_network: Non mostrar contactos
|
setting_hide_network: Non mostrar contactos
|
||||||
|
setting_missing_alt_text_modal: Mostrar mensaxe de confirmación antes de publicar multimedia sen texto descritivo
|
||||||
setting_reduce_motion: Reducir o movemento nas animacións
|
setting_reduce_motion: Reducir o movemento nas animacións
|
||||||
setting_system_font_ui: Utilizar a tipografía por defecto do sistema
|
setting_system_font_ui: Utilizar a tipografía por defecto do sistema
|
||||||
setting_system_scrollbars_ui: Usar barras de desprazamento predeterminadas no sistema
|
setting_system_scrollbars_ui: Usar barras de desprazamento predeterminadas no sistema
|
||||||
|
@ -233,6 +233,7 @@ he:
|
|||||||
setting_display_media_show_all: להציג הכול
|
setting_display_media_show_all: להציג הכול
|
||||||
setting_expand_spoilers: להרחיב תמיד הודעות מסומנות באזהרת תוכן
|
setting_expand_spoilers: להרחיב תמיד הודעות מסומנות באזהרת תוכן
|
||||||
setting_hide_network: להחביא את הגרף החברתי שלך
|
setting_hide_network: להחביא את הגרף החברתי שלך
|
||||||
|
setting_missing_alt_text_modal: הצג כרטיס אישור לפני פרסום קובץ גרפי ללא תיאור מילולי
|
||||||
setting_reduce_motion: הפחתת תנועה בהנפשות
|
setting_reduce_motion: הפחתת תנועה בהנפשות
|
||||||
setting_system_font_ui: להשתמש בגופן ברירת המחדל של המערכת
|
setting_system_font_ui: להשתמש בגופן ברירת המחדל של המערכת
|
||||||
setting_system_scrollbars_ui: להשתמש בפס הגלילה שהוא ברירת המחדל של המערכת
|
setting_system_scrollbars_ui: להשתמש בפס הגלילה שהוא ברירת המחדל של המערכת
|
||||||
|
@ -230,6 +230,7 @@ hu:
|
|||||||
setting_display_media_show_all: Mindent mutat
|
setting_display_media_show_all: Mindent mutat
|
||||||
setting_expand_spoilers: Tartalmi figyelmeztetéssel ellátott bejegyzések automatikus kinyitása
|
setting_expand_spoilers: Tartalmi figyelmeztetéssel ellátott bejegyzések automatikus kinyitása
|
||||||
setting_hide_network: Hálózatod elrejtése
|
setting_hide_network: Hálózatod elrejtése
|
||||||
|
setting_missing_alt_text_modal: Megerősítési párbeszédablak megjelenítése a helyettesítő szöveg nélküli média közzététele előtt
|
||||||
setting_reduce_motion: Animációk mozgásának csökkentése
|
setting_reduce_motion: Animációk mozgásának csökkentése
|
||||||
setting_system_font_ui: Rendszer betűtípusának használata
|
setting_system_font_ui: Rendszer betűtípusának használata
|
||||||
setting_system_scrollbars_ui: Rendszer alapértelmezett görgetősávjának használata
|
setting_system_scrollbars_ui: Rendszer alapértelmezett görgetősávjának használata
|
||||||
|
@ -233,6 +233,7 @@ is:
|
|||||||
setting_display_media_show_all: Birta allt
|
setting_display_media_show_all: Birta allt
|
||||||
setting_expand_spoilers: Alltaf útfella færslur sem eru með aðvörun vegna efnisins
|
setting_expand_spoilers: Alltaf útfella færslur sem eru með aðvörun vegna efnisins
|
||||||
setting_hide_network: Fela félagsnetið þitt
|
setting_hide_network: Fela félagsnetið þitt
|
||||||
|
setting_missing_alt_text_modal: Birta staðfestingarglugga áður en myndefni án ALT-hjálpartexta er birt
|
||||||
setting_reduce_motion: Minnka hreyfingu í hreyfimyndum
|
setting_reduce_motion: Minnka hreyfingu í hreyfimyndum
|
||||||
setting_system_font_ui: Nota sjálfgefið letur kerfisins
|
setting_system_font_ui: Nota sjálfgefið letur kerfisins
|
||||||
setting_system_scrollbars_ui: Nota sjálfgefna skrunstiku kerfisins
|
setting_system_scrollbars_ui: Nota sjálfgefna skrunstiku kerfisins
|
||||||
|
@ -160,6 +160,7 @@ lt:
|
|||||||
setting_display_media_show_all: Rodyti viską
|
setting_display_media_show_all: Rodyti viską
|
||||||
setting_expand_spoilers: Visada išplėsti įrašus, pažymėtus turinio įspėjimais
|
setting_expand_spoilers: Visada išplėsti įrašus, pažymėtus turinio įspėjimais
|
||||||
setting_hide_network: Slėpti savo socialinę diagramą
|
setting_hide_network: Slėpti savo socialinę diagramą
|
||||||
|
setting_missing_alt_text_modal: Rodyti patvirtinimo dialogo langą prieš skelbiant mediją be alternatyvaus teksto.
|
||||||
setting_reduce_motion: Sumažinti judėjimą animacijose
|
setting_reduce_motion: Sumažinti judėjimą animacijose
|
||||||
setting_system_font_ui: Naudoti numatytąjį sistemos šriftą
|
setting_system_font_ui: Naudoti numatytąjį sistemos šriftą
|
||||||
setting_system_scrollbars_ui: Naudoti numatytąją sistemos slankjuostę
|
setting_system_scrollbars_ui: Naudoti numatytąją sistemos slankjuostę
|
||||||
|
@ -233,6 +233,7 @@ nl:
|
|||||||
setting_display_media_show_all: Alles tonen
|
setting_display_media_show_all: Alles tonen
|
||||||
setting_expand_spoilers: Berichten met inhoudswaarschuwingen altijd uitklappen
|
setting_expand_spoilers: Berichten met inhoudswaarschuwingen altijd uitklappen
|
||||||
setting_hide_network: Jouw volgers en wie je volgt verbergen
|
setting_hide_network: Jouw volgers en wie je volgt verbergen
|
||||||
|
setting_missing_alt_text_modal: Bevestigingsvenster tonen voor het plaatsen van media zonder alt-tekst
|
||||||
setting_reduce_motion: Beweging in animaties verminderen
|
setting_reduce_motion: Beweging in animaties verminderen
|
||||||
setting_system_font_ui: Standaardlettertype van het systeem gebruiken
|
setting_system_font_ui: Standaardlettertype van het systeem gebruiken
|
||||||
setting_system_scrollbars_ui: Standaard scrollbalk van het systeem gebruiken
|
setting_system_scrollbars_ui: Standaard scrollbalk van het systeem gebruiken
|
||||||
|
@ -231,6 +231,7 @@ nn:
|
|||||||
setting_display_media_show_all: Vis alle
|
setting_display_media_show_all: Vis alle
|
||||||
setting_expand_spoilers: Vid alltid ut tut som er merka med innhaldsåtvaringar
|
setting_expand_spoilers: Vid alltid ut tut som er merka med innhaldsåtvaringar
|
||||||
setting_hide_network: Gøym nettverket ditt
|
setting_hide_network: Gøym nettverket ditt
|
||||||
|
setting_missing_alt_text_modal: Vis stadfestingsdialog før du legg ut media utan alt-tekst
|
||||||
setting_reduce_motion: Minsk rørsle i animasjonar
|
setting_reduce_motion: Minsk rørsle i animasjonar
|
||||||
setting_system_font_ui: Bruk standardskrifttypen på systemet
|
setting_system_font_ui: Bruk standardskrifttypen på systemet
|
||||||
setting_system_scrollbars_ui: Bruk standardrullefeltet til systemet
|
setting_system_scrollbars_ui: Bruk standardrullefeltet til systemet
|
||||||
|
@ -233,6 +233,7 @@ pt-PT:
|
|||||||
setting_display_media_show_all: Mostrar todos
|
setting_display_media_show_all: Mostrar todos
|
||||||
setting_expand_spoilers: Expandir sempre as publicações marcadas com avisos de conteúdo
|
setting_expand_spoilers: Expandir sempre as publicações marcadas com avisos de conteúdo
|
||||||
setting_hide_network: Esconder a tua rede
|
setting_hide_network: Esconder a tua rede
|
||||||
|
setting_missing_alt_text_modal: Mostrar janela de confirmação antes de publicar multimédia sem texto alternativo
|
||||||
setting_reduce_motion: Reduzir movimento em animações
|
setting_reduce_motion: Reduzir movimento em animações
|
||||||
setting_system_font_ui: Usar o tipo de letra padrão do sistema
|
setting_system_font_ui: Usar o tipo de letra padrão do sistema
|
||||||
setting_system_scrollbars_ui: Utilizar a barra de deslocação predefinida do sistema
|
setting_system_scrollbars_ui: Utilizar a barra de deslocação predefinida do sistema
|
||||||
|
@ -232,6 +232,7 @@ sq:
|
|||||||
setting_display_media_show_all: Shfaqi krejt
|
setting_display_media_show_all: Shfaqi krejt
|
||||||
setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë
|
setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë
|
||||||
setting_hide_network: Fshiheni rrjetin tuaj
|
setting_hide_network: Fshiheni rrjetin tuaj
|
||||||
|
setting_missing_alt_text_modal: Shfaq dialog ripohimi, para postimi mediash pa tekst alternativ
|
||||||
setting_reduce_motion: Zvogëlo lëvizjen në animacione
|
setting_reduce_motion: Zvogëlo lëvizjen në animacione
|
||||||
setting_system_font_ui: Përdor shkronja parazgjedhje të sistemit
|
setting_system_font_ui: Përdor shkronja parazgjedhje të sistemit
|
||||||
setting_system_scrollbars_ui: Përdor shtyllë rrëshqitjesh parazgjedhje të sistemit
|
setting_system_scrollbars_ui: Përdor shtyllë rrëshqitjesh parazgjedhje të sistemit
|
||||||
|
@ -233,6 +233,7 @@ tr:
|
|||||||
setting_display_media_show_all: Tümünü göster
|
setting_display_media_show_all: Tümünü göster
|
||||||
setting_expand_spoilers: İçerik uyarılarıyla işaretli gönderileri her zaman genişlet
|
setting_expand_spoilers: İçerik uyarılarıyla işaretli gönderileri her zaman genişlet
|
||||||
setting_hide_network: Sosyal grafiğini gizle
|
setting_hide_network: Sosyal grafiğini gizle
|
||||||
|
setting_missing_alt_text_modal: Alternatif metni olmayan medya göndermeden önce onay sorusu göster
|
||||||
setting_reduce_motion: Animasyonlarda hareketi azalt
|
setting_reduce_motion: Animasyonlarda hareketi azalt
|
||||||
setting_system_font_ui: Sistemin varsayılan yazı tipini kullan
|
setting_system_font_ui: Sistemin varsayılan yazı tipini kullan
|
||||||
setting_system_scrollbars_ui: Sistemin varsayılan kaydırma çubuğunu kullan
|
setting_system_scrollbars_ui: Sistemin varsayılan kaydırma çubuğunu kullan
|
||||||
|
@ -233,6 +233,7 @@ vi:
|
|||||||
setting_display_media_show_all: Hiện toàn bộ
|
setting_display_media_show_all: Hiện toàn bộ
|
||||||
setting_expand_spoilers: Luôn mở rộng tút chứa nội dung ẩn
|
setting_expand_spoilers: Luôn mở rộng tút chứa nội dung ẩn
|
||||||
setting_hide_network: Ẩn quan hệ của bạn
|
setting_hide_network: Ẩn quan hệ của bạn
|
||||||
|
setting_missing_alt_text_modal: Hiện xác nhận trước khi đăng media không có văn bản thay thế
|
||||||
setting_reduce_motion: Giảm chuyển động ảnh GIF
|
setting_reduce_motion: Giảm chuyển động ảnh GIF
|
||||||
setting_system_font_ui: Dùng phông chữ mặc định hệ thống
|
setting_system_font_ui: Dùng phông chữ mặc định hệ thống
|
||||||
setting_system_scrollbars_ui: Dùng scrollbar mặc định hệ thống
|
setting_system_scrollbars_ui: Dùng scrollbar mặc định hệ thống
|
||||||
|
@ -233,6 +233,7 @@ zh-CN:
|
|||||||
setting_display_media_show_all: 显示全部
|
setting_display_media_show_all: 显示全部
|
||||||
setting_expand_spoilers: 一律展开具有内容警告的嘟文
|
setting_expand_spoilers: 一律展开具有内容警告的嘟文
|
||||||
setting_hide_network: 隐藏你的社交网络
|
setting_hide_network: 隐藏你的社交网络
|
||||||
|
setting_missing_alt_text_modal: 发布媒体时若未为其设置替代文本,则显示确认对话框
|
||||||
setting_reduce_motion: 降低过渡动画效果
|
setting_reduce_motion: 降低过渡动画效果
|
||||||
setting_system_font_ui: 使用系统默认字体
|
setting_system_font_ui: 使用系统默认字体
|
||||||
setting_system_scrollbars_ui: 使用系统默认样式的滚动条
|
setting_system_scrollbars_ui: 使用系统默认样式的滚动条
|
||||||
|
@ -233,6 +233,7 @@ zh-TW:
|
|||||||
setting_display_media_show_all: 全部顯示
|
setting_display_media_show_all: 全部顯示
|
||||||
setting_expand_spoilers: 永遠展開標有內容警告的嘟文
|
setting_expand_spoilers: 永遠展開標有內容警告的嘟文
|
||||||
setting_hide_network: 隱藏您的社交網路
|
setting_hide_network: 隱藏您的社交網路
|
||||||
|
setting_missing_alt_text_modal: 發表未包含說明文字之多媒體嘟文前先詢問我
|
||||||
setting_reduce_motion: 減少過渡動畫效果
|
setting_reduce_motion: 減少過渡動畫效果
|
||||||
setting_system_font_ui: 使用系統預設字型
|
setting_system_font_ui: 使用系統預設字型
|
||||||
setting_system_scrollbars_ui: 使用系統預設捲動軸
|
setting_system_scrollbars_ui: 使用系統預設捲動軸
|
||||||
|
@ -1190,6 +1190,7 @@ vi:
|
|||||||
too_fast: Nghi vấn đăng ký spam, xin thử lại.
|
too_fast: Nghi vấn đăng ký spam, xin thử lại.
|
||||||
use_security_key: Dùng khóa bảo mật
|
use_security_key: Dùng khóa bảo mật
|
||||||
user_agreement_html: Tôi đã đọc và đồng ý với <a href="%{terms_of_service_path}" target="_blank">điều khoản dịch vụ</a> và <a href="%{privacy_policy_path}" target="_blank">chính sách bảo mật</a>
|
user_agreement_html: Tôi đã đọc và đồng ý với <a href="%{terms_of_service_path}" target="_blank">điều khoản dịch vụ</a> và <a href="%{privacy_policy_path}" target="_blank">chính sách bảo mật</a>
|
||||||
|
user_privacy_agreement_html: Tôi đã đọc và đồng ý <a href="%{privacy_policy_path}" target="_blank">chính sách bảo mật</a>
|
||||||
author_attribution:
|
author_attribution:
|
||||||
example_title: Văn bản mẫu
|
example_title: Văn bản mẫu
|
||||||
hint_html: Bạn là nhà báo hoặc blogger bên ngoài Mastodon? Kiểm soát cách bài viết của bạn được ghi nhận khi chia sẻ trên Mastodon.
|
hint_html: Bạn là nhà báo hoặc blogger bên ngoài Mastodon? Kiểm soát cách bài viết của bạn được ghi nhận khi chia sẻ trên Mastodon.
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe Admin::ReportsController do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
let(:user) { Fabricate(:admin_user) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
sign_in user, scope: :user
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'GET #index' do
|
|
||||||
it 'returns http success with no filters' do
|
|
||||||
specified = Fabricate(:report, action_taken_at: nil, comment: 'First report')
|
|
||||||
other = Fabricate(:report, action_taken_at: Time.now.utc, comment: 'Second report')
|
|
||||||
|
|
||||||
get :index
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
expect(response.body)
|
|
||||||
.to include(specified.comment)
|
|
||||||
.and not_include(other.comment)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns http success with resolved filter' do
|
|
||||||
specified = Fabricate(:report, action_taken_at: Time.now.utc, comment: 'First report')
|
|
||||||
other = Fabricate(:report, action_taken_at: nil, comment: 'Second report')
|
|
||||||
|
|
||||||
get :index, params: { resolved: '1' }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
expect(response.body)
|
|
||||||
.to include(specified.comment)
|
|
||||||
.and not_include(other.comment)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'GET #show' do
|
|
||||||
it 'renders report' do
|
|
||||||
report = Fabricate(:report, comment: 'A big problem')
|
|
||||||
|
|
||||||
get :show, params: { id: report }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
expect(response.body)
|
|
||||||
.to include(report.comment)
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'account moderation notes' do
|
|
||||||
let(:report) { Fabricate(:report) }
|
|
||||||
|
|
||||||
it 'includes moderation notes' do
|
|
||||||
note1 = Fabricate(:report_note, report: report)
|
|
||||||
note2 = Fabricate(:report_note, report: report)
|
|
||||||
|
|
||||||
get :show, params: { id: report }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
|
|
||||||
report_notes = assigns(:report_notes).to_a
|
|
||||||
|
|
||||||
expect(report_notes.size).to be 2
|
|
||||||
expect(report_notes).to eq [note1, note2]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST #resolve' do
|
|
||||||
it 'resolves the report' do
|
|
||||||
report = Fabricate(:report)
|
|
||||||
|
|
||||||
put :resolve, params: { id: report }
|
|
||||||
expect(response).to redirect_to(admin_reports_path)
|
|
||||||
report.reload
|
|
||||||
expect(report.action_taken_by_account).to eq user.account
|
|
||||||
expect(report.action_taken?).to be true
|
|
||||||
expect(last_action_log.target).to eq(report)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST #reopen' do
|
|
||||||
it 'reopens the report' do
|
|
||||||
report = Fabricate(:report, action_taken_at: 3.days.ago)
|
|
||||||
|
|
||||||
put :reopen, params: { id: report }
|
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
|
||||||
report.reload
|
|
||||||
expect(report.action_taken_by_account).to be_nil
|
|
||||||
expect(report.action_taken?).to be false
|
|
||||||
expect(last_action_log.target).to eq(report)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST #assign_to_self' do
|
|
||||||
it 'reopens the report' do
|
|
||||||
report = Fabricate(:report)
|
|
||||||
|
|
||||||
put :assign_to_self, params: { id: report }
|
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
|
||||||
report.reload
|
|
||||||
expect(report.assigned_account).to eq user.account
|
|
||||||
expect(last_action_log.target).to eq(report)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST #unassign' do
|
|
||||||
it 'reopens the report' do
|
|
||||||
report = Fabricate(:report, assigned_account_id: Account.last.id)
|
|
||||||
|
|
||||||
put :unassign, params: { id: report }
|
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
|
||||||
report.reload
|
|
||||||
expect(report.assigned_account).to be_nil
|
|
||||||
expect(last_action_log.target).to eq(report)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def last_action_log
|
|
||||||
Admin::ActionLog.last
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,102 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe Auth::PasswordsController do
|
|
||||||
include Devise::Test::ControllerHelpers
|
|
||||||
|
|
||||||
describe 'GET #new' do
|
|
||||||
it 'returns http success' do
|
|
||||||
request.env['devise.mapping'] = Devise.mappings[:user]
|
|
||||||
get :new
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'GET #edit' do
|
|
||||||
let(:user) { Fabricate(:user) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
request.env['devise.mapping'] = Devise.mappings[:user]
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with valid reset_password_token' do
|
|
||||||
it 'returns http success' do
|
|
||||||
token = user.send_reset_password_instructions
|
|
||||||
|
|
||||||
get :edit, params: { reset_password_token: token }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with invalid reset_password_token' do
|
|
||||||
it 'redirects to #new' do
|
|
||||||
get :edit, params: { reset_password_token: 'some_invalid_value' }
|
|
||||||
expect(response).to redirect_to subject.new_password_path(subject.send(:resource_name))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST #update' do
|
|
||||||
let(:user) { Fabricate(:user) }
|
|
||||||
let(:password) { 'reset0password' }
|
|
||||||
|
|
||||||
before do
|
|
||||||
request.env['devise.mapping'] = Devise.mappings[:user]
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with valid reset_password_token' do
|
|
||||||
let!(:session_activation) { Fabricate(:session_activation, user: user) }
|
|
||||||
let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) }
|
|
||||||
let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
token = user.send_reset_password_instructions
|
|
||||||
|
|
||||||
post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: token } }
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'resets the password' do
|
|
||||||
expect(response)
|
|
||||||
.to redirect_to '/auth/sign_in'
|
|
||||||
|
|
||||||
# Change password
|
|
||||||
expect(User.find(user.id))
|
|
||||||
.to be_present
|
|
||||||
.and be_valid_password(password)
|
|
||||||
|
|
||||||
# Deactivate session
|
|
||||||
expect(user.session_activations.count)
|
|
||||||
.to eq 0
|
|
||||||
expect { session_activation.reload }
|
|
||||||
.to raise_error(ActiveRecord::RecordNotFound)
|
|
||||||
|
|
||||||
# Revoke tokens
|
|
||||||
expect(Doorkeeper::AccessToken.active_for(user).count)
|
|
||||||
.to eq 0
|
|
||||||
|
|
||||||
# Remove push subs
|
|
||||||
expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count)
|
|
||||||
.to eq 0
|
|
||||||
expect { web_push_subscription.reload }
|
|
||||||
.to raise_error(ActiveRecord::RecordNotFound)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with invalid reset_password_token' do
|
|
||||||
before do
|
|
||||||
post :update, params: { user: { password: password, password_confirmation: password, reset_password_token: 'some_invalid_value' } }
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'renders reset password and retains password' do
|
|
||||||
expect(response)
|
|
||||||
.to render_template(:new)
|
|
||||||
|
|
||||||
expect(User.find(user.id))
|
|
||||||
.to be_present
|
|
||||||
.and be_external_or_valid_password(user.password)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -153,7 +153,7 @@ RSpec.describe 'Notifications' do
|
|||||||
it 'returns a notification group covering all notifications' do
|
it 'returns a notification group covering all notifications' do
|
||||||
subject
|
subject
|
||||||
|
|
||||||
notification_ids = user.account.notifications.reload.pluck(:id)
|
notification_ids = user.account.notifications.order(id: :asc).pluck(:id)
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
expect(response.content_type)
|
expect(response.content_type)
|
||||||
@ -175,7 +175,7 @@ RSpec.describe 'Notifications' do
|
|||||||
it 'returns a notification group covering all notifications' do
|
it 'returns a notification group covering all notifications' do
|
||||||
subject
|
subject
|
||||||
|
|
||||||
notification_ids = user.account.notifications.reload.pluck(:id)
|
notification_ids = user.account.notifications.order(id: :asc).pluck(:id)
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
expect(response.content_type)
|
expect(response.content_type)
|
||||||
|
34
spec/requests/auth/passwords_spec.rb
Normal file
34
spec/requests/auth/passwords_spec.rb
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Auth Passwords' do
|
||||||
|
describe 'GET /auth/password/edit' do
|
||||||
|
context 'with invalid reset_password_token' do
|
||||||
|
it 'redirects to #new' do
|
||||||
|
get edit_user_password_path, params: { reset_password_token: 'some_invalid_value' }
|
||||||
|
|
||||||
|
expect(response)
|
||||||
|
.to redirect_to new_user_password_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'PUT /auth/password' do
|
||||||
|
let(:user) { Fabricate(:user) }
|
||||||
|
let(:password) { 'reset0password' }
|
||||||
|
|
||||||
|
context 'with invalid reset_password_token' do
|
||||||
|
it 'renders reset password and retains password' do
|
||||||
|
put user_password_path, params: { user: { password: password, password_confirmation: password, reset_password_token: 'some_invalid_value' } }
|
||||||
|
|
||||||
|
expect(response.body)
|
||||||
|
.to include(I18n.t('auth.set_new_password'))
|
||||||
|
|
||||||
|
expect(User.find(user.id))
|
||||||
|
.to be_present
|
||||||
|
.and be_external_or_valid_password(user.password)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -7,31 +7,69 @@ RSpec.describe PrecomputeFeedService do
|
|||||||
|
|
||||||
describe 'call' do
|
describe 'call' do
|
||||||
let(:account) { Fabricate(:account) }
|
let(:account) { Fabricate(:account) }
|
||||||
|
let!(:list) { Fabricate(:list, account: account, exclusive: false) }
|
||||||
|
|
||||||
it 'fills a user timeline with statuses' do
|
context 'when no eligible status exist' do
|
||||||
account = Fabricate(:account)
|
it 'raises no error and results in an empty timeline' do
|
||||||
status = Fabricate(:status, account: account)
|
expect { subject.call(account) }.to_not raise_error
|
||||||
|
|
||||||
subject.call(account)
|
expect(redis.zcard(FeedManager.instance.key(:home, account.id))).to eq(0)
|
||||||
|
end
|
||||||
expect(redis.zscore(FeedManager.instance.key(:home, account.id), status.id)).to be_within(0.1).of(status.id.to_f)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not raise an error even if it could not find any status' do
|
context 'with eligible statuses' do
|
||||||
account = Fabricate(:account)
|
let(:muted_account) { Fabricate(:account) }
|
||||||
expect { subject.call(account) }.to_not raise_error
|
let!(:followed_account) { Fabricate(:account) }
|
||||||
end
|
let!(:requested_account) { Fabricate(:account) }
|
||||||
|
let!(:own_status) { Fabricate(:status, account: account) }
|
||||||
|
let!(:followed_status) { Fabricate(:status, account: followed_account) }
|
||||||
|
let!(:unreadable_dm_from_followed) { Fabricate(:status, account: followed_account, visibility: :direct) }
|
||||||
|
let!(:requested_status) { Fabricate(:status, account: requested_account) }
|
||||||
|
let!(:muted_status) { Fabricate(:status, account: muted_account) }
|
||||||
|
let!(:muted_reblog) { Fabricate(:status, account: followed_account, reblog: muted_status) }
|
||||||
|
let!(:known_reply) { Fabricate(:status, account: followed_account, in_reply_to_id: own_status.id) }
|
||||||
|
let!(:unknown_reply) { Fabricate(:status, account: followed_account, in_reply_to_id: requested_status.id) }
|
||||||
|
|
||||||
it 'filters statuses' do
|
before do
|
||||||
account = Fabricate(:account)
|
account.follow!(followed_account)
|
||||||
muted_account = Fabricate(:account)
|
account.request_follow!(requested_account)
|
||||||
Fabricate(:mute, account: account, target_account: muted_account)
|
account.mute!(muted_account)
|
||||||
reblog = Fabricate(:status, account: muted_account)
|
|
||||||
Fabricate(:status, account: account, reblog: reblog)
|
|
||||||
|
|
||||||
subject.call(account)
|
AddAccountsToListService.new.call(list, [followed_account])
|
||||||
|
end
|
||||||
|
|
||||||
expect(redis.zscore(FeedManager.instance.key(:home, account.id), reblog.id)).to be_nil
|
it "fills a user's home and list timelines with the expected posts" do
|
||||||
|
subject.call(account)
|
||||||
|
|
||||||
|
home_timeline_ids = redis.zrevrangebyscore(FeedManager.instance.key(:home, account.id), '(+inf', '(-inf', limit: [0, 30], with_scores: true).map { |id| id.first.to_i }
|
||||||
|
list_timeline_ids = redis.zrevrangebyscore(FeedManager.instance.key(:list, list.id), '(+inf', '(-inf', limit: [0, 30], with_scores: true).map { |id| id.first.to_i }
|
||||||
|
|
||||||
|
expect(home_timeline_ids).to include(
|
||||||
|
own_status.id,
|
||||||
|
followed_status.id,
|
||||||
|
known_reply.id
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(list_timeline_ids).to include(
|
||||||
|
followed_status.id
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(home_timeline_ids).to_not include(
|
||||||
|
requested_status.id,
|
||||||
|
unknown_reply.id,
|
||||||
|
unreadable_dm_from_followed.id,
|
||||||
|
muted_status.id,
|
||||||
|
muted_reblog.id
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(list_timeline_ids).to_not include(
|
||||||
|
requested_status.id,
|
||||||
|
unknown_reply.id,
|
||||||
|
unreadable_dm_from_followed.id,
|
||||||
|
muted_status.id,
|
||||||
|
muted_reblog.id
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
112
spec/system/admin/reports_spec.rb
Normal file
112
spec/system/admin/reports_spec.rb
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Admin Reports' do
|
||||||
|
let(:user) { Fabricate(:admin_user) }
|
||||||
|
|
||||||
|
before { sign_in(user) }
|
||||||
|
|
||||||
|
describe 'Viewing existing reports' do
|
||||||
|
let!(:unresolved_report) { Fabricate(:report, action_taken_at: nil, comment: 'First report') }
|
||||||
|
let!(:resolved_report) { Fabricate(:report, action_taken_at: Time.now.utc, comment: 'Second report') }
|
||||||
|
let!(:report_note) { Fabricate :report_note, report: resolved_report, content: 'Note about resolved report' }
|
||||||
|
|
||||||
|
it 'Shows basic report details' do
|
||||||
|
visit admin_reports_path
|
||||||
|
|
||||||
|
expect(page)
|
||||||
|
.to have_content(unresolved_report.comment)
|
||||||
|
.and have_no_content(resolved_report.comment)
|
||||||
|
|
||||||
|
click_on I18n.t('admin.reports.resolved')
|
||||||
|
expect(page)
|
||||||
|
.to have_content(resolved_report.comment)
|
||||||
|
.and have_no_content(unresolved_report.comment)
|
||||||
|
|
||||||
|
click_on resolved_report.comment
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.reports.report', id: resolved_report.id))
|
||||||
|
.and have_content(resolved_report.comment)
|
||||||
|
.and have_content(report_note.content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Resolving reports' do
|
||||||
|
let!(:report) { Fabricate :report }
|
||||||
|
|
||||||
|
it 'resolves an open report' do
|
||||||
|
visit admin_report_path(report)
|
||||||
|
within '.content__heading__actions' do
|
||||||
|
click_on I18n.t('admin.reports.mark_as_resolved')
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.reports.title'))
|
||||||
|
.and have_content(I18n.t('admin.reports.resolved_msg'))
|
||||||
|
|
||||||
|
report.reload
|
||||||
|
expect(report.action_taken_by_account)
|
||||||
|
.to eq user.account
|
||||||
|
expect(report)
|
||||||
|
.to be_action_taken
|
||||||
|
expect(last_action_log.target)
|
||||||
|
.to eq(report)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Reopening reports' do
|
||||||
|
let!(:report) { Fabricate :report, action_taken_at: 3.days.ago }
|
||||||
|
|
||||||
|
it 'reopens a resolved report' do
|
||||||
|
visit admin_report_path(report)
|
||||||
|
within '.content__heading__actions' do
|
||||||
|
click_on I18n.t('admin.reports.mark_as_unresolved')
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.reports.report', id: report.id))
|
||||||
|
|
||||||
|
report.reload
|
||||||
|
expect(report.action_taken_by_account)
|
||||||
|
.to be_nil
|
||||||
|
expect(report)
|
||||||
|
.to_not be_action_taken
|
||||||
|
expect(last_action_log.target)
|
||||||
|
.to eq(report)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Assigning reports' do
|
||||||
|
let!(:report) { Fabricate :report }
|
||||||
|
|
||||||
|
it 'assigns report to user and then unassigns' do
|
||||||
|
visit admin_report_path(report)
|
||||||
|
|
||||||
|
click_on I18n.t('admin.reports.assign_to_self')
|
||||||
|
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.reports.report', id: report.id))
|
||||||
|
report.reload
|
||||||
|
expect(report.assigned_account)
|
||||||
|
.to eq user.account
|
||||||
|
expect(last_action_log.target)
|
||||||
|
.to eq(report)
|
||||||
|
|
||||||
|
click_on I18n.t('admin.reports.unassign')
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.reports.report', id: report.id))
|
||||||
|
report.reload
|
||||||
|
expect(report.assigned_account)
|
||||||
|
.to be_nil
|
||||||
|
expect(last_action_log.target)
|
||||||
|
.to eq(report)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def last_action_log
|
||||||
|
Admin::ActionLog.last
|
||||||
|
end
|
||||||
|
end
|
83
spec/system/auth/passwords_spec.rb
Normal file
83
spec/system/auth/passwords_spec.rb
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Auth Passwords' do
|
||||||
|
let(:user) { Fabricate :user }
|
||||||
|
let!(:session_activation) { Fabricate(:session_activation, user: user) }
|
||||||
|
let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) }
|
||||||
|
let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) }
|
||||||
|
|
||||||
|
describe 'Resetting a password', :inline_jobs do
|
||||||
|
let(:new_password) { 'New.Pass.123' }
|
||||||
|
|
||||||
|
before { allow(Devise).to receive(:pam_authentication).and_return(false) } # Avoid the "seamless external" path
|
||||||
|
|
||||||
|
it 'initiates reset, sends link, resets password from form, clears data' do
|
||||||
|
visit new_user_password_path
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('auth.reset_password'))
|
||||||
|
|
||||||
|
submit_email_reset
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('auth.set_new_password'))
|
||||||
|
|
||||||
|
set_new_password
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('auth.login'))
|
||||||
|
|
||||||
|
# Change password
|
||||||
|
expect(User.find(user.id))
|
||||||
|
.to be_present
|
||||||
|
.and be_valid_password(new_password)
|
||||||
|
|
||||||
|
# Deactivate session
|
||||||
|
expect(user_session_count)
|
||||||
|
.to eq(0)
|
||||||
|
expect { session_activation.reload }
|
||||||
|
.to raise_error(ActiveRecord::RecordNotFound)
|
||||||
|
|
||||||
|
# Revoke tokens
|
||||||
|
expect(user_token_count)
|
||||||
|
.to eq(0)
|
||||||
|
|
||||||
|
# Remove push subs
|
||||||
|
expect(push_subs_count)
|
||||||
|
.to eq(0)
|
||||||
|
expect { web_push_subscription.reload }
|
||||||
|
.to raise_error(ActiveRecord::RecordNotFound)
|
||||||
|
end
|
||||||
|
|
||||||
|
def submit_email_reset
|
||||||
|
fill_in 'user_email', with: user.email
|
||||||
|
click_on I18n.t('auth.reset_password')
|
||||||
|
open_last_email
|
||||||
|
visit_in_email(I18n.t('devise.mailer.reset_password_instructions.action'))
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_new_password
|
||||||
|
fill_in 'user_password', with: new_password
|
||||||
|
fill_in 'user_password_confirmation', with: new_password
|
||||||
|
click_on I18n.t('auth.set_new_password')
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_session_count
|
||||||
|
user
|
||||||
|
.session_activations
|
||||||
|
.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_token_count
|
||||||
|
Doorkeeper::AccessToken
|
||||||
|
.active_for(user)
|
||||||
|
.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def push_subs_count
|
||||||
|
Web::PushSubscription
|
||||||
|
.where(user: user)
|
||||||
|
.or(Web::PushSubscription.where(access_token: access_token))
|
||||||
|
.count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -6,6 +6,7 @@
|
|||||||
# See: https://docs.docker.com/build/building/multi-platform/
|
# See: https://docs.docker.com/build/building/multi-platform/
|
||||||
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
||||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
||||||
|
ARG BASE_REGISTRY="docker.io"
|
||||||
|
|
||||||
# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||||
# renovate: datasource=node-version depName=node
|
# renovate: datasource=node-version depName=node
|
||||||
@ -13,7 +14,7 @@ ARG NODE_MAJOR_VERSION="22"
|
|||||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
||||||
ARG DEBIAN_VERSION="bookworm"
|
ARG DEBIAN_VERSION="bookworm"
|
||||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||||
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming
|
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming
|
||||||
|
|
||||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||||
# Example: v4.3.0-nightly.2023.11.09+pr-123456
|
# Example: v4.3.0-nightly.2023.11.09+pr-123456
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
"@types/uuid": "^10.0.0",
|
"@types/uuid": "^10.0.0",
|
||||||
"@types/ws": "^8.5.9",
|
"@types/ws": "^8.5.9",
|
||||||
"eslint-define-config": "^2.0.0",
|
"eslint-define-config": "^2.0.0",
|
||||||
"pino-pretty": "^11.0.0",
|
"pino-pretty": "^13.0.0",
|
||||||
"typescript": "^5.0.4"
|
"typescript": "^5.0.4"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
58
yarn.lock
58
yarn.lock
@ -2987,7 +2987,7 @@ __metadata:
|
|||||||
pg-connection-string: "npm:^2.6.0"
|
pg-connection-string: "npm:^2.6.0"
|
||||||
pino: "npm:^9.0.0"
|
pino: "npm:^9.0.0"
|
||||||
pino-http: "npm:^10.0.0"
|
pino-http: "npm:^10.0.0"
|
||||||
pino-pretty: "npm:^11.0.0"
|
pino-pretty: "npm:^13.0.0"
|
||||||
prom-client: "npm:^15.0.0"
|
prom-client: "npm:^15.0.0"
|
||||||
typescript: "npm:^5.0.4"
|
typescript: "npm:^5.0.4"
|
||||||
utf-8-validate: "npm:^6.0.3"
|
utf-8-validate: "npm:^6.0.3"
|
||||||
@ -4641,15 +4641,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"abort-controller@npm:^3.0.0":
|
|
||||||
version: 3.0.0
|
|
||||||
resolution: "abort-controller@npm:3.0.0"
|
|
||||||
dependencies:
|
|
||||||
event-target-shim: "npm:^5.0.0"
|
|
||||||
checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8":
|
"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8":
|
||||||
version: 1.3.8
|
version: 1.3.8
|
||||||
resolution: "accepts@npm:1.3.8"
|
resolution: "accepts@npm:1.3.8"
|
||||||
@ -5502,7 +5493,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"base64-js@npm:^1.0.2, base64-js@npm:^1.3.1":
|
"base64-js@npm:^1.0.2":
|
||||||
version: 1.5.1
|
version: 1.5.1
|
||||||
resolution: "base64-js@npm:1.5.1"
|
resolution: "base64-js@npm:1.5.1"
|
||||||
checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf
|
checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf
|
||||||
@ -5818,16 +5809,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"buffer@npm:^6.0.3":
|
|
||||||
version: 6.0.3
|
|
||||||
resolution: "buffer@npm:6.0.3"
|
|
||||||
dependencies:
|
|
||||||
base64-js: "npm:^1.3.1"
|
|
||||||
ieee754: "npm:^1.2.1"
|
|
||||||
checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"bufferutil@npm:^4.0.7":
|
"bufferutil@npm:^4.0.7":
|
||||||
version: 4.0.9
|
version: 4.0.9
|
||||||
resolution: "bufferutil@npm:4.0.9"
|
resolution: "bufferutil@npm:4.0.9"
|
||||||
@ -8301,13 +8282,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"event-target-shim@npm:^5.0.0":
|
|
||||||
version: 5.0.1
|
|
||||||
resolution: "event-target-shim@npm:5.0.1"
|
|
||||||
checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"eventemitter3@npm:^4.0.0":
|
"eventemitter3@npm:^4.0.0":
|
||||||
version: 4.0.7
|
version: 4.0.7
|
||||||
resolution: "eventemitter3@npm:4.0.7"
|
resolution: "eventemitter3@npm:4.0.7"
|
||||||
@ -8322,7 +8296,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"events@npm:^3.0.0, events@npm:^3.3.0":
|
"events@npm:^3.0.0":
|
||||||
version: 3.3.0
|
version: 3.3.0
|
||||||
resolution: "events@npm:3.3.0"
|
resolution: "events@npm:3.3.0"
|
||||||
checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6
|
checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6
|
||||||
@ -9699,7 +9673,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ieee754@npm:^1.1.4, ieee754@npm:^1.2.1":
|
"ieee754@npm:^1.1.4":
|
||||||
version: 1.2.1
|
version: 1.2.1
|
||||||
resolution: "ieee754@npm:1.2.1"
|
resolution: "ieee754@npm:1.2.1"
|
||||||
checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb
|
checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb
|
||||||
@ -13272,9 +13246,9 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"pino-pretty@npm:^11.0.0":
|
"pino-pretty@npm:^13.0.0":
|
||||||
version: 11.3.0
|
version: 13.0.0
|
||||||
resolution: "pino-pretty@npm:11.3.0"
|
resolution: "pino-pretty@npm:13.0.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
colorette: "npm:^2.0.7"
|
colorette: "npm:^2.0.7"
|
||||||
dateformat: "npm:^4.6.3"
|
dateformat: "npm:^4.6.3"
|
||||||
@ -13286,13 +13260,12 @@ __metadata:
|
|||||||
on-exit-leak-free: "npm:^2.1.0"
|
on-exit-leak-free: "npm:^2.1.0"
|
||||||
pino-abstract-transport: "npm:^2.0.0"
|
pino-abstract-transport: "npm:^2.0.0"
|
||||||
pump: "npm:^3.0.0"
|
pump: "npm:^3.0.0"
|
||||||
readable-stream: "npm:^4.0.0"
|
|
||||||
secure-json-parse: "npm:^2.4.0"
|
secure-json-parse: "npm:^2.4.0"
|
||||||
sonic-boom: "npm:^4.0.1"
|
sonic-boom: "npm:^4.0.1"
|
||||||
strip-json-comments: "npm:^3.1.1"
|
strip-json-comments: "npm:^3.1.1"
|
||||||
bin:
|
bin:
|
||||||
pino-pretty: bin.js
|
pino-pretty: bin.js
|
||||||
checksum: 10c0/8e4d842bfce5fa3fc69d3a6adb1bca873051e000f0fb4879ae1cc5d1410387b2464a7208f6ecc70ec49bb149a9617ec233cb3ec7a5f017ec141cb482d79917c2
|
checksum: 10c0/015dac25006c1b9820b9e01fccb8a392a019e12b30e6bfc3f3f61ecca8dbabcd000a8f3f64410b620b7f5d08579ba85e6ef137f7fbeaad70d46397a97a5f75ea
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -14972,19 +14945,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"readable-stream@npm:^4.0.0":
|
|
||||||
version: 4.4.2
|
|
||||||
resolution: "readable-stream@npm:4.4.2"
|
|
||||||
dependencies:
|
|
||||||
abort-controller: "npm:^3.0.0"
|
|
||||||
buffer: "npm:^6.0.3"
|
|
||||||
events: "npm:^3.3.0"
|
|
||||||
process: "npm:^0.11.10"
|
|
||||||
string_decoder: "npm:^1.3.0"
|
|
||||||
checksum: 10c0/cf7cc8daa2b57872d120945a20a1458c13dcb6c6f352505421115827b18ac4df0e483ac1fe195cb1f5cd226e1073fc55b92b569269d8299e8530840bcdbba40c
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"readdirp@npm:^2.2.1":
|
"readdirp@npm:^2.2.1":
|
||||||
version: 2.2.1
|
version: 2.2.1
|
||||||
resolution: "readdirp@npm:2.2.1"
|
resolution: "readdirp@npm:2.2.1"
|
||||||
@ -16530,7 +16490,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0":
|
"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1":
|
||||||
version: 1.3.0
|
version: 1.3.0
|
||||||
resolution: "string_decoder@npm:1.3.0"
|
resolution: "string_decoder@npm:1.3.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user