4.2.0-Beta2 test update
This commit is contained in:
@@ -18,22 +18,14 @@ delegate(document, '#account_display_name', 'input', ({ target }) => {
|
||||
}
|
||||
});
|
||||
|
||||
delegate(document, '#account_avatar', 'change', ({ target }) => {
|
||||
const avatar = document.querySelector('.card .avatar img');
|
||||
delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => {
|
||||
const avatar = document.getElementById(target.id + '-preview');
|
||||
const [file] = target.files || [];
|
||||
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
|
||||
|
||||
avatar.src = url;
|
||||
});
|
||||
|
||||
delegate(document, '#account_header', 'change', ({ target }) => {
|
||||
const header = document.querySelector('.card .card__img img');
|
||||
const [file] = target.files || [];
|
||||
const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc;
|
||||
|
||||
header.src = url;
|
||||
});
|
||||
|
||||
delegate(document, '#account_locked', 'change', ({ target }) => {
|
||||
const lock = document.querySelector('.card .display-name i');
|
||||
|
||||
|
||||
@@ -75,7 +75,10 @@ export function normalizeStatus(status, normalOldStatus, settings) {
|
||||
normalStatus.contentHtml = normalOldStatus.get('contentHtml');
|
||||
normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml');
|
||||
normalStatus.hidden = normalOldStatus.get('hidden');
|
||||
normalStatus.translation = normalOldStatus.get('translation');
|
||||
|
||||
if (normalOldStatus.get('translation')) {
|
||||
normalStatus.translation = normalOldStatus.get('translation');
|
||||
}
|
||||
} else {
|
||||
const spoilerText = normalStatus.spoiler_text || '';
|
||||
const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
|
||||
|
||||
@@ -157,7 +157,7 @@ export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => ex
|
||||
export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, allow_local_only: !!allowLocalOnly, max_id: maxId, only_media: !!onlyMedia }, done);
|
||||
export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done);
|
||||
export const expandDirectTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }, done);
|
||||
export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, tagged, max_id: maxId });
|
||||
export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId });
|
||||
export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged });
|
||||
export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 });
|
||||
export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done);
|
||||
|
||||
@@ -8,6 +8,7 @@ import classNames from 'classnames';
|
||||
import api from 'flavours/glitch/api';
|
||||
|
||||
const messages = defineMessages({
|
||||
legal: { id: 'report.categories.legal', defaultMessage: 'Legal' },
|
||||
other: { id: 'report.categories.other', defaultMessage: 'Other' },
|
||||
spam: { id: 'report.categories.spam', defaultMessage: 'Spam' },
|
||||
violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' },
|
||||
@@ -150,6 +151,7 @@ class ReportReasonSelector extends PureComponent {
|
||||
return (
|
||||
<div className='report-reason-selector'>
|
||||
<Category id='other' text={intl.formatMessage(messages.other)} selected={category === 'other'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='legal' text={intl.formatMessage(messages.legal)} selected={category === 'legal'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='spam' text={intl.formatMessage(messages.spam)} selected={category === 'spam'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='violation' text={intl.formatMessage(messages.violation)} selected={category === 'violation'} onSelect={this.handleSelect} disabled={disabled}>
|
||||
{rules.map(rule => <Rule key={rule.id} id={rule.id} text={rule.text} selected={rule_ids.includes(rule.id)} onToggle={this.handleToggle} disabled={disabled} />)}
|
||||
|
||||
@@ -18,7 +18,19 @@ export default class Column extends PureComponent {
|
||||
};
|
||||
|
||||
scrollTop () {
|
||||
const scrollable = this.props.bindToDocument ? document.scrollingElement : this.node.querySelector('.scrollable');
|
||||
let scrollable = null;
|
||||
|
||||
if (this.props.bindToDocument) {
|
||||
scrollable = document.scrollingElement;
|
||||
} else {
|
||||
scrollable = this.node.querySelector('.scrollable');
|
||||
|
||||
// Some columns have nested `.scrollable` containers, with the outer one
|
||||
// being a wrapper while the actual scrollable content is deeper.
|
||||
if (scrollable.classList.contains('scrollable--flex')) {
|
||||
scrollable = scrollable?.querySelector('.scrollable') || scrollable;
|
||||
}
|
||||
}
|
||||
|
||||
if (!scrollable) {
|
||||
return;
|
||||
|
||||
@@ -196,9 +196,9 @@ class Header extends ImmutablePureComponent {
|
||||
if (signedIn && !account.get('relationship')) { // Wait until the relationship is loaded
|
||||
actionBtn = '';
|
||||
} else if (account.getIn(['relationship', 'requested'])) {
|
||||
actionBtn = <Button className={classNames({ 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
|
||||
actionBtn = <Button text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
|
||||
} else if (!account.getIn(['relationship', 'blocking'])) {
|
||||
actionBtn = <Button className={classNames({ 'button--destructive': account.getIn(['relationship', 'following']), 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={signedIn ? this.props.onFollow : this.props.onInteractionModal} />;
|
||||
actionBtn = <Button className={classNames({ 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={signedIn ? this.props.onFollow : this.props.onInteractionModal} />;
|
||||
} else if (account.getIn(['relationship', 'blocking'])) {
|
||||
actionBtn = <Button text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ export default class Story extends PureComponent {
|
||||
author: PropTypes.string,
|
||||
sharedTimes: PropTypes.number,
|
||||
thumbnail: PropTypes.string,
|
||||
thumbnailDescription: PropTypes.string,
|
||||
blurhash: PropTypes.string,
|
||||
expanded: PropTypes.bool,
|
||||
};
|
||||
@@ -34,7 +35,7 @@ export default class Story extends PureComponent {
|
||||
handleImageLoad = () => this.setState({ thumbnailLoaded: true });
|
||||
|
||||
render () {
|
||||
const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, blurhash } = this.props;
|
||||
const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, thumbnailDescription, blurhash } = this.props;
|
||||
|
||||
const { thumbnailLoaded } = this.state;
|
||||
|
||||
@@ -50,7 +51,7 @@ export default class Story extends PureComponent {
|
||||
{thumbnail ? (
|
||||
<>
|
||||
<div className={classNames('story__thumbnail__preview', { 'story__thumbnail__preview--hidden': thumbnailLoaded })}><Blurhash hash={blurhash} /></div>
|
||||
<img src={thumbnail} onLoad={this.handleImageLoad} alt='' role='presentation' />
|
||||
<img src={thumbnail} onLoad={this.handleImageLoad} alt={thumbnailDescription} title={thumbnailDescription} lang={lang} />
|
||||
</>
|
||||
) : <Skeleton />}
|
||||
</div>
|
||||
|
||||
@@ -67,6 +67,7 @@ class Links extends PureComponent {
|
||||
author={link.get('author_name')}
|
||||
sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1}
|
||||
thumbnail={link.get('image')}
|
||||
thumbnailDescription={link.get('image_description')}
|
||||
blurhash={link.get('blurhash')}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -110,10 +110,10 @@ class Results extends PureComponent {
|
||||
return (
|
||||
<>
|
||||
<div className='account__section-headline'>
|
||||
<button onClick={this.handleSelectAll} className={type === 'all' && 'active'}><FormattedMessage id='search_results.all' defaultMessage='All' /></button>
|
||||
<button onClick={this.handleSelectAccounts} className={type === 'accounts' && 'active'}><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></button>
|
||||
<button onClick={this.handleSelectHashtags} className={type === 'hashtags' && 'active'}><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></button>
|
||||
<button onClick={this.handleSelectStatuses} className={type === 'statuses' && 'active'}><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></button>
|
||||
<button onClick={this.handleSelectAll} className={type === 'all' ? 'active' : undefined}><FormattedMessage id='search_results.all' defaultMessage='All' /></button>
|
||||
<button onClick={this.handleSelectAccounts} className={type === 'accounts' ? 'active' : undefined}><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></button>
|
||||
<button onClick={this.handleSelectHashtags} className={type === 'hashtags' ? 'active' : undefined}><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></button>
|
||||
<button onClick={this.handleSelectStatuses} className={type === 'statuses' ? 'active' : undefined}><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></button>
|
||||
</div>
|
||||
|
||||
<div className='explore__search-results'>
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
||||
import Button from 'flavours/glitch/components/button';
|
||||
import { ShortNumber } from 'flavours/glitch/components/short_number';
|
||||
|
||||
const messages = defineMessages({
|
||||
followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },
|
||||
unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' },
|
||||
});
|
||||
|
||||
const usesRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_uses'
|
||||
defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
const peopleRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_accounts'
|
||||
defaultMessage='{count, plural, one {{counter} participant} other {{counter} participants}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
const usesTodayRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_uses_today'
|
||||
defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}} today'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
export const HashtagHeader = injectIntl(({ tag, intl, disabled, onClick }) => {
|
||||
if (!tag) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const [uses, people] = tag.get('history').reduce((arr, day) => [arr[0] + day.get('uses') * 1, arr[1] + day.get('accounts') * 1], [0, 0]);
|
||||
const dividingCircle = <span aria-hidden>{' · '}</span>;
|
||||
|
||||
return (
|
||||
<div className='hashtag-header'>
|
||||
<div className='hashtag-header__header'>
|
||||
<h1>#{tag.get('name')}</h1>
|
||||
<Button onClick={onClick} text={intl.formatMessage(tag.get('following') ? messages.unfollowHashtag : messages.followHashtag)} disabled={disabled} />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<ShortNumber value={uses} renderer={usesRenderer} />
|
||||
{dividingCircle}
|
||||
<ShortNumber value={people} renderer={peopleRenderer} />
|
||||
{dividingCircle}
|
||||
<ShortNumber value={tag.getIn(['history', 0, 'uses']) * 1} renderer={usesTodayRenderer} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
HashtagHeader.propTypes = {
|
||||
tag: ImmutablePropTypes.map,
|
||||
disabled: PropTypes.bool,
|
||||
onClick: PropTypes.func,
|
||||
intl: PropTypes.object,
|
||||
};
|
||||
@@ -1,9 +1,8 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { PureComponent } from 'react';
|
||||
|
||||
import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { Helmet } from 'react-helmet';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
@@ -17,17 +16,11 @@ import { fetchHashtag, followHashtag, unfollowHashtag } from 'flavours/glitch/ac
|
||||
import { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';
|
||||
import Column from 'flavours/glitch/components/column';
|
||||
import ColumnHeader from 'flavours/glitch/components/column_header';
|
||||
import { Icon } from 'flavours/glitch/components/icon';
|
||||
import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';
|
||||
|
||||
import { HashtagHeader } from './components/hashtag_header';
|
||||
import ColumnSettingsContainer from './containers/column_settings_container';
|
||||
|
||||
|
||||
const messages = defineMessages({
|
||||
followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },
|
||||
unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' },
|
||||
});
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}${props.params.local ? ':local' : ''}`, 'unread']) > 0,
|
||||
tag: state.getIn(['tags', props.params.id]),
|
||||
@@ -48,7 +41,6 @@ class HashtagTimeline extends PureComponent {
|
||||
hasUnread: PropTypes.bool,
|
||||
tag: ImmutablePropTypes.map,
|
||||
multiColumn: PropTypes.bool,
|
||||
intl: PropTypes.object,
|
||||
};
|
||||
|
||||
handlePin = () => {
|
||||
@@ -188,27 +180,11 @@ class HashtagTimeline extends PureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { hasUnread, columnId, multiColumn, tag, intl } = this.props;
|
||||
const { hasUnread, columnId, multiColumn, tag } = this.props;
|
||||
const { id, local } = this.props.params;
|
||||
const pinned = !!columnId;
|
||||
const { signedIn } = this.context.identity;
|
||||
|
||||
let followButton;
|
||||
|
||||
if (tag) {
|
||||
const following = tag.get('following');
|
||||
|
||||
const classes = classNames('column-header__button', {
|
||||
active: following,
|
||||
});
|
||||
|
||||
followButton = (
|
||||
<button className={classes} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
|
||||
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>
|
||||
<ColumnHeader
|
||||
@@ -220,13 +196,14 @@ class HashtagTimeline extends PureComponent {
|
||||
onClick={this.handleHeaderClick}
|
||||
pinned={pinned}
|
||||
multiColumn={multiColumn}
|
||||
extraButton={followButton}
|
||||
showBackButton
|
||||
>
|
||||
{columnId && <ColumnSettingsContainer columnId={columnId} />}
|
||||
</ColumnHeader>
|
||||
|
||||
<StatusListContainer
|
||||
prepend={pinned ? null : <HashtagHeader tag={tag} disabled={!signedIn} onClick={this.handleFollow} />}
|
||||
alwaysPrepend
|
||||
trackScroll={!pinned}
|
||||
scrollKey={`hashtag_timeline-${columnId}`}
|
||||
timelineId={`hashtag:${id}${local ? ':local' : ''}`}
|
||||
@@ -245,4 +222,4 @@ class HashtagTimeline extends PureComponent {
|
||||
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(injectIntl(HashtagTimeline));
|
||||
export default connect(mapStateToProps)(HashtagTimeline);
|
||||
|
||||
@@ -13,7 +13,7 @@ import { openModal, closeModal } from 'flavours/glitch/actions/modal';
|
||||
import api from 'flavours/glitch/api';
|
||||
import Button from 'flavours/glitch/components/button';
|
||||
import { Icon } from 'flavours/glitch/components/icon';
|
||||
import { registrationsOpen } from 'flavours/glitch/initial_state';
|
||||
import { registrationsOpen, sso_redirect } from 'flavours/glitch/initial_state';
|
||||
|
||||
const messages = defineMessages({
|
||||
loginPrompt: { id: 'interaction_modal.login.prompt', defaultMessage: 'Domain of your home server, e.g. mastodon.social' },
|
||||
@@ -21,12 +21,16 @@ const messages = defineMessages({
|
||||
|
||||
const mapStateToProps = (state, { accountId }) => ({
|
||||
displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']),
|
||||
signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up',
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
onSignupClick() {
|
||||
dispatch(closeModal());
|
||||
dispatch(openModal('CLOSED_REGISTRATIONS'));
|
||||
dispatch(closeModal({
|
||||
modalType: undefined,
|
||||
ignoreFocus: false,
|
||||
}));
|
||||
dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' }));
|
||||
},
|
||||
});
|
||||
|
||||
@@ -250,6 +254,9 @@ class LoginForm extends React.PureComponent {
|
||||
onFocus={this.handleFocus}
|
||||
onBlur={this.handleBlur}
|
||||
onKeyDown={this.handleKeyDown}
|
||||
autocomplete='off'
|
||||
autocapitalize='off'
|
||||
spellcheck='false'
|
||||
/>
|
||||
|
||||
<Button onClick={this.handleSubmit} disabled={isSubmitting}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
|
||||
@@ -291,6 +298,7 @@ class InteractionModal extends React.PureComponent {
|
||||
url: PropTypes.string,
|
||||
type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']),
|
||||
onSignupClick: PropTypes.func.isRequired,
|
||||
signupUrl: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
handleSignupClick = () => {
|
||||
@@ -298,7 +306,7 @@ class InteractionModal extends React.PureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { url, type, displayNameHtml } = this.props;
|
||||
const { url, type, displayNameHtml, signupUrl } = this.props;
|
||||
|
||||
const name = <bdi dangerouslySetInnerHTML={{ __html: displayNameHtml }} />;
|
||||
|
||||
@@ -329,9 +337,15 @@ class InteractionModal extends React.PureComponent {
|
||||
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
if (sso_redirect) {
|
||||
signupButton = (
|
||||
<a href='/auth/sign_up' className='link-button'>
|
||||
<a href={sso_redirect} data-method='post' className='link-button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
} else if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='link-button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
|
||||
@@ -178,7 +178,8 @@ export default class Card extends PureComponent {
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
);
|
||||
let thumbnail = <img src={card.get('image')} alt='' style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
const thumbnailDescription = card.get('image_description');
|
||||
const thumbnail = <img src={card.get('image')} alt={thumbnailDescription} title={thumbnailDescription} lang={language} style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
let spoilerButton = (
|
||||
<button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
|
||||
<span className='spoiler-button__overlay__label'>
|
||||
|
||||
@@ -595,7 +595,7 @@ class Status extends ImmutablePureComponent {
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType='thread'
|
||||
previousId={i > 0 && list.get(i - 1)}
|
||||
previousId={i > 0 ? list.get(i - 1) : undefined}
|
||||
nextId={list.get(i + 1) || (ancestors && statusId)}
|
||||
rootId={statusId}
|
||||
/>
|
||||
|
||||
@@ -1,761 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { Helmet } from 'react-helmet';
|
||||
|
||||
import Immutable from 'immutable';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
|
||||
import { HotKeys } from 'react-hotkeys';
|
||||
|
||||
import { initBlockModal } from 'flavours/glitch/actions/blocks';
|
||||
import { initBoostModal } from 'flavours/glitch/actions/boosts';
|
||||
import {
|
||||
replyCompose,
|
||||
mentionCompose,
|
||||
directCompose,
|
||||
} from 'flavours/glitch/actions/compose';
|
||||
import {
|
||||
favourite,
|
||||
unfavourite,
|
||||
bookmark,
|
||||
unbookmark,
|
||||
reblog,
|
||||
unreblog,
|
||||
pin,
|
||||
unpin,
|
||||
} from 'flavours/glitch/actions/interactions';
|
||||
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
|
||||
import { openModal } from 'flavours/glitch/actions/modal';
|
||||
import { initMuteModal } from 'flavours/glitch/actions/mutes';
|
||||
import { initReport } from 'flavours/glitch/actions/reports';
|
||||
import {
|
||||
fetchStatus,
|
||||
muteStatus,
|
||||
unmuteStatus,
|
||||
deleteStatus,
|
||||
editStatus,
|
||||
hideStatus,
|
||||
revealStatus,
|
||||
translateStatus,
|
||||
undoStatusTranslation,
|
||||
} from 'flavours/glitch/actions/statuses';
|
||||
import { Icon } from 'flavours/glitch/components/icon';
|
||||
import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator';
|
||||
import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status';
|
||||
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
|
||||
import StatusContainer from 'flavours/glitch/containers/status_container';
|
||||
import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
|
||||
import Column from 'flavours/glitch/features/ui/components/column';
|
||||
import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state';
|
||||
import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
|
||||
import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';
|
||||
|
||||
import ColumnHeader from '../../components/column_header';
|
||||
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';
|
||||
|
||||
import ActionBar from './components/action_bar';
|
||||
import DetailedStatus from './components/detailed_status';
|
||||
|
||||
const messages = defineMessages({
|
||||
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
|
||||
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
|
||||
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
|
||||
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },
|
||||
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
|
||||
hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
|
||||
statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' },
|
||||
detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
|
||||
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
|
||||
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
|
||||
tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' },
|
||||
});
|
||||
|
||||
const makeMapStateToProps = () => {
|
||||
const getStatus = makeGetStatus();
|
||||
const getPictureInPicture = makeGetPictureInPicture();
|
||||
|
||||
const getAncestorsIds = createSelector([
|
||||
(_, { id }) => id,
|
||||
state => state.getIn(['contexts', 'inReplyTos']),
|
||||
], (statusId, inReplyTos) => {
|
||||
let ancestorsIds = Immutable.List();
|
||||
ancestorsIds = ancestorsIds.withMutations(mutable => {
|
||||
let id = statusId;
|
||||
|
||||
while (id && !mutable.includes(id)) {
|
||||
mutable.unshift(id);
|
||||
id = inReplyTos.get(id);
|
||||
}
|
||||
});
|
||||
|
||||
return ancestorsIds;
|
||||
});
|
||||
|
||||
const getDescendantsIds = createSelector([
|
||||
(_, { id }) => id,
|
||||
state => state.getIn(['contexts', 'replies']),
|
||||
state => state.get('statuses'),
|
||||
], (statusId, contextReplies, statuses) => {
|
||||
let descendantsIds = [];
|
||||
const ids = [statusId];
|
||||
|
||||
while (ids.length > 0) {
|
||||
let id = ids.pop();
|
||||
const replies = contextReplies.get(id);
|
||||
|
||||
if (statusId !== id) {
|
||||
descendantsIds.push(id);
|
||||
}
|
||||
|
||||
if (replies) {
|
||||
replies.reverse().forEach(reply => {
|
||||
if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));
|
||||
if (insertAt !== -1) {
|
||||
descendantsIds.forEach((id, idx) => {
|
||||
if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {
|
||||
descendantsIds.splice(idx, 1);
|
||||
descendantsIds.splice(insertAt, 0, id);
|
||||
insertAt += 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return Immutable.List(descendantsIds);
|
||||
});
|
||||
|
||||
const mapStateToProps = (state, props) => {
|
||||
const status = getStatus(state, { id: props.params.statusId });
|
||||
|
||||
let ancestorsIds = Immutable.List();
|
||||
let descendantsIds = Immutable.List();
|
||||
|
||||
if (status) {
|
||||
ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
|
||||
descendantsIds = getDescendantsIds(state, { id: status.get('id') });
|
||||
}
|
||||
|
||||
return {
|
||||
isLoading: state.getIn(['statuses', props.params.statusId, 'isLoading']),
|
||||
status,
|
||||
ancestorsIds,
|
||||
descendantsIds,
|
||||
settings: state.get('local_settings'),
|
||||
askReplyConfirmation: state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0,
|
||||
domain: state.getIn(['meta', 'domain']),
|
||||
pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }),
|
||||
};
|
||||
};
|
||||
|
||||
return mapStateToProps;
|
||||
};
|
||||
|
||||
const truncate = (str, num) => {
|
||||
const arr = Array.from(str);
|
||||
if (arr.length > num) {
|
||||
return arr.slice(0, num).join('') + '…';
|
||||
} else {
|
||||
return str;
|
||||
}
|
||||
};
|
||||
|
||||
const titleFromStatus = (intl, status) => {
|
||||
const displayName = status.getIn(['account', 'display_name']);
|
||||
const username = status.getIn(['account', 'username']);
|
||||
const user = displayName.trim().length === 0 ? username : displayName;
|
||||
const text = status.get('search_index');
|
||||
const attachmentCount = status.get('media_attachments').size;
|
||||
|
||||
return text ? `${user}: "${truncate(text, 30)}"` : intl.formatMessage(messages.statusTitleWithAttachments, { user, attachmentCount });
|
||||
};
|
||||
|
||||
class Status extends ImmutablePureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
identity: PropTypes.object,
|
||||
};
|
||||
|
||||
static propTypes = {
|
||||
params: PropTypes.object.isRequired,
|
||||
dispatch: PropTypes.func.isRequired,
|
||||
status: ImmutablePropTypes.map,
|
||||
isLoading: PropTypes.bool,
|
||||
settings: ImmutablePropTypes.map.isRequired,
|
||||
ancestorsIds: ImmutablePropTypes.list.isRequired,
|
||||
descendantsIds: ImmutablePropTypes.list.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
askReplyConfirmation: PropTypes.bool,
|
||||
multiColumn: PropTypes.bool,
|
||||
domain: PropTypes.string.isRequired,
|
||||
pictureInPicture: ImmutablePropTypes.contains({
|
||||
inUse: PropTypes.bool,
|
||||
available: PropTypes.bool,
|
||||
}),
|
||||
};
|
||||
|
||||
state = {
|
||||
fullscreen: false,
|
||||
isExpanded: undefined,
|
||||
threadExpanded: undefined,
|
||||
statusId: undefined,
|
||||
loadedStatusId: undefined,
|
||||
showMedia: undefined,
|
||||
revealBehindCW: undefined,
|
||||
};
|
||||
|
||||
componentDidMount () {
|
||||
attachFullscreenListener(this.onFullScreenChange);
|
||||
this.props.dispatch(fetchStatus(this.props.params.statusId));
|
||||
}
|
||||
|
||||
static getDerivedStateFromProps(props, state) {
|
||||
let update = {};
|
||||
let updated = false;
|
||||
|
||||
if (props.params.statusId && state.statusId !== props.params.statusId) {
|
||||
props.dispatch(fetchStatus(props.params.statusId));
|
||||
update.threadExpanded = undefined;
|
||||
update.statusId = props.params.statusId;
|
||||
updated = true;
|
||||
}
|
||||
|
||||
const revealBehindCW = props.settings.getIn(['media', 'reveal_behind_cw']);
|
||||
if (revealBehindCW !== state.revealBehindCW) {
|
||||
update.revealBehindCW = revealBehindCW;
|
||||
if (revealBehindCW) update.showMedia = defaultMediaVisibility(props.status, props.settings);
|
||||
updated = true;
|
||||
}
|
||||
|
||||
if (props.status && state.loadedStatusId !== props.status.get('id')) {
|
||||
update.showMedia = defaultMediaVisibility(props.status, props.settings);
|
||||
update.loadedStatusId = props.status.get('id');
|
||||
update.isExpanded = autoUnfoldCW(props.settings, props.status);
|
||||
updated = true;
|
||||
}
|
||||
|
||||
return updated ? update : null;
|
||||
}
|
||||
|
||||
handleToggleHidden = () => {
|
||||
const { status } = this.props;
|
||||
|
||||
if (this.props.settings.getIn(['content_warnings', 'shared_state'])) {
|
||||
if (status.get('hidden')) {
|
||||
this.props.dispatch(revealStatus(status.get('id')));
|
||||
} else {
|
||||
this.props.dispatch(hideStatus(status.get('id')));
|
||||
}
|
||||
} else if (this.props.status.get('spoiler_text')) {
|
||||
this.setExpansion(!this.state.isExpanded);
|
||||
}
|
||||
};
|
||||
|
||||
handleToggleMediaVisibility = () => {
|
||||
this.setState({ showMedia: !this.state.showMedia });
|
||||
};
|
||||
|
||||
handleModalFavourite = (status) => {
|
||||
this.props.dispatch(favourite(status));
|
||||
};
|
||||
|
||||
handleFavouriteClick = (status, e) => {
|
||||
const { dispatch } = this.props;
|
||||
const { signedIn } = this.context.identity;
|
||||
|
||||
if (signedIn) {
|
||||
if (status.get('favourited')) {
|
||||
dispatch(unfavourite(status));
|
||||
} else {
|
||||
if ((e && e.shiftKey) || !favouriteModal) {
|
||||
this.handleModalFavourite(status);
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
modalType: 'FAVOURITE',
|
||||
modalProps: {
|
||||
status,
|
||||
onFavourite: this.handleModalFavourite,
|
||||
},
|
||||
}));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
type: 'favourite',
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('url'),
|
||||
},
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
handlePin = (status) => {
|
||||
if (status.get('pinned')) {
|
||||
this.props.dispatch(unpin(status));
|
||||
} else {
|
||||
this.props.dispatch(pin(status));
|
||||
}
|
||||
};
|
||||
|
||||
handleReplyClick = (status) => {
|
||||
const { askReplyConfirmation, dispatch, intl } = this.props;
|
||||
const { signedIn } = this.context.identity;
|
||||
|
||||
if (signedIn) {
|
||||
if (askReplyConfirmation) {
|
||||
dispatch(openModal({
|
||||
modalType: 'CONFIRM',
|
||||
modalProps: {
|
||||
message: intl.formatMessage(messages.replyMessage),
|
||||
confirm: intl.formatMessage(messages.replyConfirm),
|
||||
onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),
|
||||
onConfirm: () => dispatch(replyCompose(status, this.context.router.history)),
|
||||
},
|
||||
}));
|
||||
} else {
|
||||
dispatch(replyCompose(status, this.context.router.history));
|
||||
}
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
type: 'reply',
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('url'),
|
||||
},
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
handleModalReblog = (status, privacy) => {
|
||||
const { dispatch } = this.props;
|
||||
|
||||
if (status.get('reblogged')) {
|
||||
dispatch(unreblog(status));
|
||||
} else {
|
||||
dispatch(reblog(status, privacy));
|
||||
}
|
||||
};
|
||||
|
||||
handleReblogClick = (status, e) => {
|
||||
const { settings, dispatch } = this.props;
|
||||
const { signedIn } = this.context.identity;
|
||||
|
||||
if (signedIn) {
|
||||
if (settings.get('confirm_boost_missing_media_description') && status.get('media_attachments').some(item => !item.get('description')) && !status.get('reblogged')) {
|
||||
dispatch(initBoostModal({ status, onReblog: this.handleModalReblog, missingMediaDescription: true }));
|
||||
} else if ((e && e.shiftKey) || !boostModal) {
|
||||
this.handleModalReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this.handleModalReblog }));
|
||||
}
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
type: 'reblog',
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('url'),
|
||||
},
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
handleBookmarkClick = (status) => {
|
||||
if (status.get('bookmarked')) {
|
||||
this.props.dispatch(unbookmark(status));
|
||||
} else {
|
||||
this.props.dispatch(bookmark(status));
|
||||
}
|
||||
};
|
||||
|
||||
handleDeleteClick = (status, history, withRedraft = false) => {
|
||||
const { dispatch, intl } = this.props;
|
||||
|
||||
if (!deleteModal) {
|
||||
dispatch(deleteStatus(status.get('id'), history, withRedraft));
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
modalType: 'CONFIRM',
|
||||
modalProps: {
|
||||
message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),
|
||||
confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),
|
||||
onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),
|
||||
},
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
handleEditClick = (status, history) => {
|
||||
this.props.dispatch(editStatus(status.get('id'), history));
|
||||
};
|
||||
|
||||
handleDirectClick = (account, router) => {
|
||||
this.props.dispatch(directCompose(account, router));
|
||||
};
|
||||
|
||||
handleMentionClick = (account, router) => {
|
||||
this.props.dispatch(mentionCompose(account, router));
|
||||
};
|
||||
|
||||
handleOpenMedia = (media, index, lang) => {
|
||||
this.props.dispatch(openModal({
|
||||
modalType: 'MEDIA',
|
||||
modalProps: { statusId: this.props.status.get('id'), media, index, lang },
|
||||
}));
|
||||
};
|
||||
|
||||
handleOpenVideo = (media, lang, options) => {
|
||||
this.props.dispatch(openModal({
|
||||
modalType: 'VIDEO',
|
||||
modalProps: { statusId: this.props.status.get('id'), media, lang, options },
|
||||
}));
|
||||
};
|
||||
|
||||
handleHotkeyOpenMedia = e => {
|
||||
const { status } = this.props;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
if (status.get('media_attachments').size > 0) {
|
||||
if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
|
||||
this.handleOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 });
|
||||
} else {
|
||||
this.handleOpenMedia(status.get('media_attachments'), 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
handleMuteClick = (account) => {
|
||||
this.props.dispatch(initMuteModal(account));
|
||||
};
|
||||
|
||||
handleConversationMuteClick = (status) => {
|
||||
if (status.get('muted')) {
|
||||
this.props.dispatch(unmuteStatus(status.get('id')));
|
||||
} else {
|
||||
this.props.dispatch(muteStatus(status.get('id')));
|
||||
}
|
||||
};
|
||||
|
||||
handleToggleAll = () => {
|
||||
const { status, ancestorsIds, descendantsIds, settings } = this.props;
|
||||
const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());
|
||||
let { isExpanded } = this.state;
|
||||
|
||||
if (settings.getIn(['content_warnings', 'shared_state']))
|
||||
isExpanded = !status.get('hidden');
|
||||
|
||||
if (!isExpanded) {
|
||||
this.props.dispatch(revealStatus(statusIds));
|
||||
} else {
|
||||
this.props.dispatch(hideStatus(statusIds));
|
||||
}
|
||||
|
||||
this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded });
|
||||
};
|
||||
|
||||
handleTranslate = status => {
|
||||
const { dispatch } = this.props;
|
||||
|
||||
if (status.get('translation')) {
|
||||
dispatch(undoStatusTranslation(status.get('id'), status.get('poll')));
|
||||
} else {
|
||||
dispatch(translateStatus(status.get('id')));
|
||||
}
|
||||
};
|
||||
|
||||
handleBlockClick = (status) => {
|
||||
const { dispatch } = this.props;
|
||||
const account = status.get('account');
|
||||
dispatch(initBlockModal(account));
|
||||
};
|
||||
|
||||
handleReport = (status) => {
|
||||
this.props.dispatch(initReport(status.get('account'), status));
|
||||
};
|
||||
|
||||
handleEmbed = (status) => {
|
||||
this.props.dispatch(openModal({
|
||||
modalType: 'EMBED',
|
||||
modalProps: { id: status.get('id') },
|
||||
}));
|
||||
};
|
||||
|
||||
handleHotkeyToggleSensitive = () => {
|
||||
this.handleToggleMediaVisibility();
|
||||
};
|
||||
|
||||
handleHotkeyMoveUp = () => {
|
||||
this.handleMoveUp(this.props.status.get('id'));
|
||||
};
|
||||
|
||||
handleHotkeyMoveDown = () => {
|
||||
this.handleMoveDown(this.props.status.get('id'));
|
||||
};
|
||||
|
||||
handleHotkeyReply = e => {
|
||||
e.preventDefault();
|
||||
this.handleReplyClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyFavourite = () => {
|
||||
this.handleFavouriteClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyBoost = () => {
|
||||
this.handleReblogClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyBookmark = () => {
|
||||
this.handleBookmarkClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyMention = e => {
|
||||
e.preventDefault();
|
||||
this.handleMentionClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyOpenProfile = () => {
|
||||
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);
|
||||
};
|
||||
|
||||
handleMoveUp = id => {
|
||||
const { status, ancestorsIds, descendantsIds } = this.props;
|
||||
|
||||
if (id === status.get('id')) {
|
||||
this._selectChild(ancestorsIds.size - 1, true);
|
||||
} else {
|
||||
let index = ancestorsIds.indexOf(id);
|
||||
|
||||
if (index === -1) {
|
||||
index = descendantsIds.indexOf(id);
|
||||
this._selectChild(ancestorsIds.size + index, true);
|
||||
} else {
|
||||
this._selectChild(index - 1, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
handleMoveDown = id => {
|
||||
const { status, ancestorsIds, descendantsIds } = this.props;
|
||||
|
||||
if (id === status.get('id')) {
|
||||
this._selectChild(ancestorsIds.size + 1, false);
|
||||
} else {
|
||||
let index = ancestorsIds.indexOf(id);
|
||||
|
||||
if (index === -1) {
|
||||
index = descendantsIds.indexOf(id);
|
||||
this._selectChild(ancestorsIds.size + index + 2, false);
|
||||
} else {
|
||||
this._selectChild(index + 1, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_selectChild (index, align_top) {
|
||||
const container = this.node;
|
||||
const element = container.querySelectorAll('.focusable')[index];
|
||||
|
||||
if (element) {
|
||||
if (align_top && container.scrollTop > element.offsetTop) {
|
||||
element.scrollIntoView(true);
|
||||
} else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {
|
||||
element.scrollIntoView(false);
|
||||
}
|
||||
element.focus();
|
||||
}
|
||||
}
|
||||
|
||||
handleHeaderClick = () => {
|
||||
this.column.scrollTop();
|
||||
};
|
||||
|
||||
renderChildren (list, ancestors) {
|
||||
const { params: { statusId } } = this.props;
|
||||
|
||||
return list.map((id, i) => (
|
||||
<StatusContainer
|
||||
key={id}
|
||||
id={id}
|
||||
expanded={this.state.threadExpanded}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType='thread'
|
||||
previousId={i > 0 && list.get(i - 1)}
|
||||
nextId={list.get(i + 1) || (ancestors && statusId)}
|
||||
rootId={statusId}
|
||||
/>
|
||||
));
|
||||
}
|
||||
|
||||
setExpansion = value => {
|
||||
this.setState({ isExpanded: value });
|
||||
};
|
||||
|
||||
setRef = c => {
|
||||
this.node = c;
|
||||
};
|
||||
|
||||
setColumnRef = c => {
|
||||
this.column = c;
|
||||
};
|
||||
|
||||
componentDidUpdate (prevProps) {
|
||||
const { status, ancestorsIds, multiColumn } = this.props;
|
||||
|
||||
if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) {
|
||||
window.requestAnimationFrame(() => {
|
||||
this.node?.querySelector('.detailed-status__wrapper')?.scrollIntoView(true);
|
||||
|
||||
// In the single-column interface, `scrollIntoView` will put the post behind the header,
|
||||
// so compensate for that.
|
||||
if (!multiColumn) {
|
||||
const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom;
|
||||
if (offset) {
|
||||
const scrollingElement = document.scrollingElement || document.body;
|
||||
scrollingElement.scrollBy(0, -offset);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
detachFullscreenListener(this.onFullScreenChange);
|
||||
}
|
||||
|
||||
onFullScreenChange = () => {
|
||||
this.setState({ fullscreen: isFullscreen() });
|
||||
};
|
||||
|
||||
render () {
|
||||
let ancestors, descendants;
|
||||
const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props;
|
||||
const { fullscreen } = this.state;
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<Column>
|
||||
<LoadingIndicator />
|
||||
</Column>
|
||||
);
|
||||
}
|
||||
|
||||
if (status === null) {
|
||||
return (
|
||||
<BundleColumnError multiColumn={multiColumn} errorType='routing' />
|
||||
);
|
||||
}
|
||||
|
||||
const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded;
|
||||
|
||||
if (ancestorsIds && ancestorsIds.size > 0) {
|
||||
ancestors = <>{this.renderChildren(ancestorsIds, true)}</>;
|
||||
}
|
||||
|
||||
if (descendantsIds && descendantsIds.size > 0) {
|
||||
descendants = <>{this.renderChildren(descendantsIds)}</>;
|
||||
}
|
||||
|
||||
const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1;
|
||||
const isIndexable = !status.getIn(['account', 'noindex']);
|
||||
|
||||
const handlers = {
|
||||
moveUp: this.handleHotkeyMoveUp,
|
||||
moveDown: this.handleHotkeyMoveDown,
|
||||
reply: this.handleHotkeyReply,
|
||||
favourite: this.handleHotkeyFavourite,
|
||||
boost: this.handleHotkeyBoost,
|
||||
bookmark: this.handleHotkeyBookmark,
|
||||
mention: this.handleHotkeyMention,
|
||||
openProfile: this.handleHotkeyOpenProfile,
|
||||
toggleSpoiler: this.handleToggleHidden,
|
||||
toggleSensitive: this.handleHotkeyToggleSensitive,
|
||||
openMedia: this.handleHotkeyOpenMedia,
|
||||
};
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.detailedStatus)}>
|
||||
<ColumnHeader
|
||||
icon='comment'
|
||||
title={intl.formatMessage(messages.tootHeading)}
|
||||
onClick={this.handleHeaderClick}
|
||||
showBackButton
|
||||
multiColumn={multiColumn}
|
||||
extraButton={(
|
||||
<button type='button' className='column-header__button' title={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll}><Icon id={!isExpanded ? 'eye-slash' : 'eye'} /></button>
|
||||
)}
|
||||
/>
|
||||
|
||||
<ScrollContainer scrollKey='thread'>
|
||||
<div className={classNames('scrollable', { fullscreen })} ref={this.setRef}>
|
||||
{ancestors}
|
||||
|
||||
<HotKeys handlers={handlers}>
|
||||
<div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false, isExpanded)}>
|
||||
<DetailedStatus
|
||||
key={`details-${status.get('id')}`}
|
||||
status={status}
|
||||
settings={settings}
|
||||
onOpenVideo={this.handleOpenVideo}
|
||||
onOpenMedia={this.handleOpenMedia}
|
||||
expanded={isExpanded}
|
||||
onToggleHidden={this.handleToggleHidden}
|
||||
onTranslate={this.handleTranslate}
|
||||
domain={domain}
|
||||
showMedia={this.state.showMedia}
|
||||
onToggleMediaVisibility={this.handleToggleMediaVisibility}
|
||||
pictureInPicture={pictureInPicture}
|
||||
/>
|
||||
|
||||
<ActionBar
|
||||
key={`action-bar-${status.get('id')}`}
|
||||
status={status}
|
||||
onReply={this.handleReplyClick}
|
||||
onFavourite={this.handleFavouriteClick}
|
||||
onReblog={this.handleReblogClick}
|
||||
onBookmark={this.handleBookmarkClick}
|
||||
onDelete={this.handleDeleteClick}
|
||||
onEdit={this.handleEditClick}
|
||||
onDirect={this.handleDirectClick}
|
||||
onMention={this.handleMentionClick}
|
||||
onMute={this.handleMuteClick}
|
||||
onMuteConversation={this.handleConversationMuteClick}
|
||||
onBlock={this.handleBlockClick}
|
||||
onReport={this.handleReport}
|
||||
onPin={this.handlePin}
|
||||
onEmbed={this.handleEmbed}
|
||||
/>
|
||||
</div>
|
||||
</HotKeys>
|
||||
|
||||
{descendants}
|
||||
</div>
|
||||
</ScrollContainer>
|
||||
|
||||
<Helmet>
|
||||
<title>{titleFromStatus(intl, status)}</title>
|
||||
<meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />
|
||||
<link rel='canonical' href={status.get('url')} />
|
||||
</Helmet>
|
||||
</Column>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default injectIntl(connect(makeMapStateToProps)(Status));
|
||||
@@ -423,4 +423,4 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps, null, {
|
||||
forwardRef: true,
|
||||
})(injectIntl(FocalPointModal, { withRef: true }));
|
||||
})(injectIntl(FocalPointModal, { forwardRef: true }));
|
||||
|
||||
@@ -13,7 +13,7 @@ import { Avatar } from 'flavours/glitch/components/avatar';
|
||||
import { Icon } from 'flavours/glitch/components/icon';
|
||||
import { WordmarkLogo, SymbolLogo } from 'flavours/glitch/components/logo';
|
||||
import Permalink from 'flavours/glitch/components/permalink';
|
||||
import { registrationsOpen, me } from 'flavours/glitch/initial_state';
|
||||
import { registrationsOpen, me, sso_redirect } from 'flavours/glitch/initial_state';
|
||||
|
||||
const Account = connect(state => ({
|
||||
account: state.getIn(['accounts', me]),
|
||||
@@ -74,28 +74,35 @@ class Header extends PureComponent {
|
||||
</>
|
||||
);
|
||||
} else {
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
if (sso_redirect) {
|
||||
content = (
|
||||
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
|
||||
)
|
||||
} else {
|
||||
signupButton = (
|
||||
<button className='button' onClick={openClosedRegistrationsModal}>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</button>
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
} else {
|
||||
signupButton = (
|
||||
<button className='button' onClick={openClosedRegistrationsModal}>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
content = (
|
||||
<>
|
||||
{signupButton}
|
||||
<a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
content = (
|
||||
<>
|
||||
{signupButton}
|
||||
<a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -105,14 +105,7 @@ export default class ModalRoot extends PureComponent {
|
||||
|
||||
handleClose = (ignoreFocus = false) => {
|
||||
const { onClose } = this.props;
|
||||
let message = null;
|
||||
try {
|
||||
message = this._modal?.getWrappedInstance?.().getCloseConfirmationMessage?.();
|
||||
} catch (_) {
|
||||
// injectIntl defines `getWrappedInstance` but errors out if `withRef`
|
||||
// isn't set.
|
||||
// This would be much smoother with react-intl 3+ and `forwardRef`.
|
||||
}
|
||||
const message = this._modal?.getCloseConfirmationMessage?.();
|
||||
onClose(message, ignoreFocus);
|
||||
};
|
||||
|
||||
@@ -133,7 +126,10 @@ export default class ModalRoot extends PureComponent {
|
||||
{visible && (
|
||||
<>
|
||||
<BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}>
|
||||
{(SpecificComponent) => <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={this.setModalRef} />}
|
||||
{(SpecificComponent) => {
|
||||
const ref = typeof SpecificComponent !== 'function' ? this.setModalRef : undefined;
|
||||
return <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={ref} />
|
||||
}}
|
||||
</BundleContainer>
|
||||
|
||||
<Helmet>
|
||||
|
||||
@@ -63,7 +63,7 @@ class ReportModal extends ImmutablePureComponent {
|
||||
dispatch(submitReport({
|
||||
account_id: accountId,
|
||||
status_ids: selectedStatusIds.toArray(),
|
||||
selected_domains: selectedDomains.toArray(),
|
||||
forward_to_domains: selectedDomains.toArray(),
|
||||
comment,
|
||||
forward: selectedDomains.size > 0,
|
||||
category,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { useCallback } from 'react';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import { openModal } from 'flavours/glitch/actions/modal';
|
||||
import { registrationsOpen } from 'flavours/glitch/initial_state';
|
||||
import { registrationsOpen, sso_redirect } from 'flavours/glitch/initial_state';
|
||||
import { useAppDispatch, useAppSelector } from 'flavours/glitch/store';
|
||||
|
||||
const SignInBanner = () => {
|
||||
@@ -18,6 +18,15 @@ const SignInBanner = () => {
|
||||
|
||||
const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up');
|
||||
|
||||
if (sso_redirect) {
|
||||
return (
|
||||
<div className='sign-in-banner'>
|
||||
<p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p>
|
||||
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button button--block'>
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
* @property {boolean} use_blurhash
|
||||
* @property {boolean=} use_pending_items
|
||||
* @property {string} version
|
||||
* @property {string} sso_redirect
|
||||
* @property {boolean} translation_enabled
|
||||
* @property {string} status_page_url
|
||||
* @property {boolean} system_emoji_font
|
||||
@@ -160,6 +161,7 @@ export const usePendingItems = getMeta('use_pending_items');
|
||||
export const version = getMeta('version');
|
||||
export const languages = initialState?.languages;
|
||||
export const statusPageUrl = getMeta('status_page_url');
|
||||
export const sso_redirect = getMeta('sso_redirect');
|
||||
|
||||
// Glitch-soc-specific settings
|
||||
export const maxChars = (initialState && initialState.max_toot_chars) || 500;
|
||||
|
||||
@@ -1,10 +1,43 @@
|
||||
{
|
||||
"compose.attach": "Vedhæft...",
|
||||
"compose.attach.doodle": "Tegn noget",
|
||||
"compose.attach.upload": "Upload en fil",
|
||||
"compose_form.poll.multiple_choices": "Tillad flere valg",
|
||||
"confirmations.missing_media_description.message": "Mindst én vedhæftet medie mangler en beskrivelse. Overvej at tilføje en beskrivelse af alle vedhæftede medier af hensyn til personer med nedsat syn, før du publicerer dit indlæg.",
|
||||
"empty_column.follow_recommendations": "Det ser ud til, at der ikke kunne genereres forslag til dig. Du kan prøve med Søg for at lede efter personer, du måske kender, eller udforske hashtags.",
|
||||
"follow_recommendations.done": "Udført",
|
||||
"follow_recommendations.heading": "Følg personer du gerne vil se indlæg fra! Her er nogle forslag.",
|
||||
"follow_recommendations.lead": "Indlæg, fra personer du følger, vil fremgå kronologisk ordnet i dit hjemmefeed. Vær ikke bange for at begå fejl, da du altid og meget nemt kan ændre dit valg!",
|
||||
"home.column_settings.advanced": "Avanceret",
|
||||
"home.column_settings.show_direct": "Vis private omtaler",
|
||||
"navigation_bar.app_settings": "Appindstillinger",
|
||||
"navigation_bar.misc": "Diverse",
|
||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||
"settings.content_warnings": "Content warnings",
|
||||
"settings.preferences": "Preferences"
|
||||
"settings.always_show_spoilers_field": "Vis altid feltet til indholdsadvarsel",
|
||||
"settings.auto_collapse_media": "Indlæg med medier",
|
||||
"settings.close": "Luk",
|
||||
"settings.collapsed_statuses": "Sammenfoldede indlæg",
|
||||
"settings.content_warnings": "Indholdsadvarsler",
|
||||
"settings.content_warnings.regexp": "Regulært udtryk",
|
||||
"settings.general": "Generelt",
|
||||
"settings.image_backgrounds_media_hint": "Hvis et indlæg har vedhæftede medier, brug den første som baggrund",
|
||||
"settings.media": "Medier",
|
||||
"settings.preferences": "Præferencer",
|
||||
"settings.rewrite_mentions": "Omskriv omtaler i viste indlæg",
|
||||
"settings.rewrite_mentions_acct": "Omskriv med brugernavn og domæne (når brugeren ikke er lokal)",
|
||||
"settings.rewrite_mentions_no": "Omskriv ikke omtaler",
|
||||
"settings.rewrite_mentions_username": "Omskriv med brugernavn",
|
||||
"settings.show_reply_counter": "Vis et estimat over antal svar",
|
||||
"settings.status_icons": "Statusikoner",
|
||||
"settings.status_icons_language": "Sprogindikator",
|
||||
"settings.status_icons_local_only": "Kun lokal-indikator",
|
||||
"settings.status_icons_media": "Medie- og afstemningsindikator",
|
||||
"settings.status_icons_reply": "Svarindikator",
|
||||
"settings.status_icons_visibility": "Statussynlighedsindikator",
|
||||
"settings.tag_misleading_links": "Marker vildledende links",
|
||||
"status.has_audio": "Har vedhæftede lydfiler",
|
||||
"status.has_pictures": "Har vedhæftede billeder",
|
||||
"status.has_preview_card": "Har en vedhæftet linkvisning",
|
||||
"status.has_video": "Har vedhæftede videoer"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
"account.disclaimer_full": "Les informations ci-dessous peuvent être incomplètes.",
|
||||
"account.follows": "Abonnements",
|
||||
"account.joined": "Ici depuis {date}",
|
||||
"account.mute_notifications": "Masquer les notifications de @{name}",
|
||||
"account.suspended_disclaimer_full": "Cet utilisateur a été suspendu par un modérateur.",
|
||||
"account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
|
||||
"account.view_full_profile": "Voir le profil complet",
|
||||
"account_note.cancel": "Annuler",
|
||||
"account_note.edit": "Éditer",
|
||||
@@ -50,6 +52,7 @@
|
||||
"empty_column.follow_recommendations": "Il semble qu’aucune suggestion n’ait pu être générée pour vous. Vous pouvez essayer d’utiliser la recherche pour découvrir des personnes que vous pourriez connaître ou explorer les hashtags populaires.",
|
||||
"endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
|
||||
"favourite_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
|
||||
"firehose.column_settings.allow_local_only": "Afficher les messages locaux dans \"Tous\"",
|
||||
"follow_recommendations.done": "Terminé",
|
||||
"follow_recommendations.heading": "Suivez les personnes dont vous aimeriez voir les publications! Voici quelques suggestions.",
|
||||
"follow_recommendations.lead": "Les publication de personnes que vous suivez apparaîtront par ordre chronologique sur votre fil d'accueil. N'ayez pas peur de faire des erreurs, vous pouvez arrêter de suivre les gens aussi facilement n'importe quand!",
|
||||
@@ -98,6 +101,7 @@
|
||||
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
|
||||
"settings.auto_collapse": "Repliage automatique",
|
||||
"settings.auto_collapse_all": "Tout",
|
||||
"settings.auto_collapse_height": "Hauteur (en pixels) pour qu'un pouet soit considéré comme long",
|
||||
"settings.auto_collapse_lengthy": "Posts longs",
|
||||
"settings.auto_collapse_media": "Posts avec média",
|
||||
"settings.auto_collapse_notifications": "Notifications",
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
"account.disclaimer_full": "Les informations ci-dessous peuvent être incomplètes.",
|
||||
"account.follows": "Abonnements",
|
||||
"account.joined": "Ici depuis {date}",
|
||||
"account.mute_notifications": "Masquer les notifications de @{name}",
|
||||
"account.suspended_disclaimer_full": "Cet utilisateur a été suspendu par un modérateur.",
|
||||
"account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
|
||||
"account.view_full_profile": "Voir le profil complet",
|
||||
"account_note.cancel": "Annuler",
|
||||
"account_note.edit": "Éditer",
|
||||
@@ -50,6 +52,7 @@
|
||||
"empty_column.follow_recommendations": "Il semble qu’aucune suggestion n’ait pu être générée pour vous. Vous pouvez essayer d’utiliser la recherche pour découvrir des personnes que vous pourriez connaître ou explorer les hashtags tendance.",
|
||||
"endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
|
||||
"favourite_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
|
||||
"firehose.column_settings.allow_local_only": "Afficher les messages locaux dans \"Tous\"",
|
||||
"follow_recommendations.done": "Terminé",
|
||||
"follow_recommendations.heading": "Suivez les personnes dont vous aimeriez voir les messages ! Voici quelques suggestions.",
|
||||
"follow_recommendations.lead": "Les messages des personnes que vous suivez apparaîtront par ordre chronologique sur votre fil d'accueil. Ne craignez pas de faire des erreurs, vous pouvez arrêter de suivre les gens aussi facilement à tout moment !",
|
||||
@@ -98,6 +101,7 @@
|
||||
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
|
||||
"settings.auto_collapse": "Repliage automatique",
|
||||
"settings.auto_collapse_all": "Tout",
|
||||
"settings.auto_collapse_height": "Hauteur (en pixels) pour qu'un pouet soit considéré comme long",
|
||||
"settings.auto_collapse_lengthy": "Posts longs",
|
||||
"settings.auto_collapse_media": "Posts avec média",
|
||||
"settings.auto_collapse_notifications": "Notifications",
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
{
|
||||
"about.fork_disclaimer": "Glitch-socはMastodonからフォークされたフリーなオープンソースソフトウェアです。",
|
||||
"account.add_account_note": "@{name}のメモを追加",
|
||||
"account.disclaimer_full": "このユーザー情報は不正確な可能性があります。",
|
||||
"account.follows": "フォロー",
|
||||
"account.joined": "{date} に登録",
|
||||
"account.mute_notifications": "@{name}さんからの通知を受け取らない",
|
||||
"account.suspended_disclaimer_full": "このユーザーはモデレータにより停止されました。",
|
||||
"account.unmute_notifications": "@{name}さんからの通知を受け取る",
|
||||
"account.view_full_profile": "正確な情報を見る",
|
||||
"account_note.cancel": "キャンセル",
|
||||
"account_note.edit": "編集",
|
||||
@@ -16,20 +20,25 @@
|
||||
"advanced_options.threaded_mode.short": "スレッドモード",
|
||||
"advanced_options.threaded_mode.tooltip": "スレッドモードを有効にする",
|
||||
"boost_modal.missing_description": "このトゥートには少なくとも1つの画像に説明が付与されていません",
|
||||
"column.favourited_by": "お気に入りしたユーザー",
|
||||
"column.heading": "その他",
|
||||
"column.reblogged_by": "ブーストしたユーザー",
|
||||
"column.subheading": "その他のオプション",
|
||||
"column_header.profile": "プロフィール",
|
||||
"column_subheading.lists": "リスト",
|
||||
"column_subheading.navigation": "ナビゲーション",
|
||||
"community.column_settings.allow_local_only": "ローカル限定投稿を表示する",
|
||||
"compose.attach": "添付...",
|
||||
"compose.attach.doodle": "お絵描きをする",
|
||||
"compose.attach.upload": "ファイルをアップロード",
|
||||
"compose.content-type.html": "HTML",
|
||||
"compose.content-type.markdown": "マークダウン",
|
||||
"compose.content-type.plain": "プレーンテキスト",
|
||||
"compose_form.poll.multiple_choices": "複数回答を許可",
|
||||
"compose_form.poll.single_choice": "単一回答を許可",
|
||||
"compose_form.spoiler": "本文は警告の後ろに隠す",
|
||||
"confirmation_modal.do_not_ask_again": "もう1度尋ねない",
|
||||
"confirmations.deprecated_settings.confirm": "Mastodonの設定を使用",
|
||||
"confirmations.missing_media_description.confirm": "このまま投稿",
|
||||
"confirmations.missing_media_description.edit": "メディアを編集",
|
||||
"confirmations.missing_media_description.message": "少なくとも1つの画像に視覚障害者のための画像説明が付与されていません。すべての画像に対して説明を付与することを望みます。",
|
||||
@@ -38,6 +47,7 @@
|
||||
"confirmations.unfilter.edit_filter": "フィルターを編集",
|
||||
"confirmations.unfilter.filters": "適用されたフィルター",
|
||||
"content-type.change": "コンテンツ形式を変更",
|
||||
"direct.group_by_conversations": "会話でグループ化",
|
||||
"empty_column.follow_recommendations": "おすすめを生成できませんでした。検索を使って知り合いを探したり、トレンドハッシュタグを見てみましょう。",
|
||||
"endorsed_accounts_editor.endorsed_accounts": "紹介しているユーザー",
|
||||
"favourite_modal.combo": "次からは {combo} を押せば、これをスキップできます。",
|
||||
@@ -48,18 +58,22 @@
|
||||
"home.column_settings.advanced": "高度",
|
||||
"home.column_settings.filter_regex": "正規表現でフィルター",
|
||||
"home.column_settings.show_direct": "DMを表示",
|
||||
"home.settings": "カラムの設定",
|
||||
"keyboard_shortcuts.bookmark": "ブックマーク",
|
||||
"keyboard_shortcuts.secondary_toot": "セカンダリートゥートの公開範囲でトゥートする",
|
||||
"keyboard_shortcuts.toggle_collapse": "折りたたむ/折りたたみを解除",
|
||||
"media_gallery.sensitive": "閲覧注意",
|
||||
"moved_to_warning": "このアカウント{moved_to_link}に引っ越したため、新しいフォロワーを受け入れていません。",
|
||||
"navigation_bar.app_settings": "アプリ設定",
|
||||
"navigation_bar.featured_users": "紹介しているアカウント",
|
||||
"navigation_bar.keyboard_shortcuts": "キーボードショートカット",
|
||||
"navigation_bar.misc": "その他",
|
||||
"notification.markForDeletion": "選択",
|
||||
"notification_purge.btn_all": "すべて\n選択",
|
||||
"notification_purge.btn_apply": "選択したものを\n削除",
|
||||
"notification_purge.btn_invert": "選択を\n反転",
|
||||
"notification_purge.btn_none": "選択\n解除",
|
||||
"notification_purge.start": "通知整理モードに入る",
|
||||
"notifications.marked_clear": "選択した通知を削除する",
|
||||
"notifications.marked_clear_confirmation": "削除した全ての通知を完全に削除してもよろしいですか?",
|
||||
"onboarding.page_one.federation": "{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。",
|
||||
@@ -68,6 +82,7 @@
|
||||
"settings.always_show_spoilers_field": "常にコンテンツワーニング設定を表示する(指定がない場合は通常投稿)",
|
||||
"settings.auto_collapse": "自動折りたたみ",
|
||||
"settings.auto_collapse_all": "すべて",
|
||||
"settings.auto_collapse_height": "トゥートが長いと見なされる高さ(ピクセル)",
|
||||
"settings.auto_collapse_lengthy": "長いトゥート",
|
||||
"settings.auto_collapse_media": "メディア付きトゥート",
|
||||
"settings.auto_collapse_notifications": "通知",
|
||||
@@ -82,6 +97,9 @@
|
||||
"settings.content_warnings": "コンテンツワーニング",
|
||||
"settings.content_warnings.regexp": "正規表現",
|
||||
"settings.content_warnings_filter": "説明に指定した文字が含まれているものを自動で展開しないようにする",
|
||||
"settings.content_warnings_media_outside": "コンテンツワーニングの外側にメディア添付ファイルを表示する",
|
||||
"settings.content_warnings_shared_state": "すべてのコピーの内容を一度に表示/非表示",
|
||||
"settings.content_warnings_unfold_opts": "自動展開オプション",
|
||||
"settings.enable_collapsed": "トゥート折りたたみを有効にする",
|
||||
"settings.enable_content_warnings_auto_unfold": "コンテンツワーニング指定されている投稿を常に表示する",
|
||||
"settings.general": "一般",
|
||||
@@ -119,10 +137,24 @@
|
||||
"settings.side_arm_reply_mode.copy": "返信先の投稿範囲を利用する",
|
||||
"settings.side_arm_reply_mode.keep": "セカンダリートゥートボタンの設定を維持する",
|
||||
"settings.side_arm_reply_mode.restrict": "返信先の投稿範囲に制限する",
|
||||
"settings.status_icons": "トゥートアイコン",
|
||||
"settings.status_icons_language": "言語インジケータ",
|
||||
"settings.status_icons_local_only": "ローカル限定インジケータ",
|
||||
"settings.status_icons_media": "メディア・アンケートインジケータ",
|
||||
"settings.status_icons_reply": "返信インジケータ",
|
||||
"settings.status_icons_visibility": "公開範囲インジケータ",
|
||||
"settings.swipe_to_change_columns": "スワイプでカラムを切り替え可能にする(モバイルのみ)",
|
||||
"settings.tag_misleading_links": "誤解を招くリンクにタグをつける",
|
||||
"settings.tag_misleading_links.hint": "明示的に言及していないすべてのリンクに、リンクターゲットホストを含む視覚的な表示を追加します",
|
||||
"settings.wide_view": "ワイドビュー(デスクトップ レイアウトのみ)",
|
||||
"status.collapse": "折りたたむ",
|
||||
"status.has_audio": "添付されたオーディオファイルが表示されます",
|
||||
"status.has_pictures": "添付された画像が表示されます",
|
||||
"status.has_preview_card": "添付されたプレビューカードが表示されます",
|
||||
"status.has_video": "添付動画が表示されます",
|
||||
"status.in_reply_to": "このトゥートは返信です",
|
||||
"status.is_poll": "このトゥートはアンケートです",
|
||||
"status.local_only": "あなたのインスタンスのみに公開",
|
||||
"status.sensitive_toggle": "クリックして表示",
|
||||
"status.uncollapse": "折りたたみを解除"
|
||||
}
|
||||
|
||||
@@ -16,11 +16,17 @@
|
||||
"advanced_options.local-only.long": "不要傳遞給其他實例",
|
||||
"advanced_options.local-only.short": "僅限本地",
|
||||
"advanced_options.local-only.tooltip": "此嘟文僅限本地",
|
||||
"advanced_options.threaded_mode.long": "發佈時自動打開回覆",
|
||||
"advanced_options.threaded_mode.short": "討論串模式",
|
||||
"advanced_options.threaded_mode.tooltip": "已啟用討論串模式",
|
||||
"boost_modal.missing_description": "此嘟文包含未加說明的媒體檔案",
|
||||
"column.favourited_by": "誰按了最愛",
|
||||
"column.heading": "雜項",
|
||||
"column.reblogged_by": "被誰轉嘟",
|
||||
"column.subheading": "其他選項",
|
||||
"column_header.profile": "個人檔案",
|
||||
"column_subheading.lists": "列表",
|
||||
"column_subheading.navigation": "導覽",
|
||||
"community.column_settings.allow_local_only": "顯示僅限本地的嘟文",
|
||||
"compose.attach": "附加...",
|
||||
"compose.attach.doodle": "塗鴉",
|
||||
@@ -30,27 +36,66 @@
|
||||
"compose.content-type.plain": "純文字",
|
||||
"compose_form.poll.multiple_choices": "允許多重選擇",
|
||||
"compose_form.poll.single_choice": "允許單一選擇",
|
||||
"compose_form.spoiler": "將文字隱藏在內容警告後面",
|
||||
"confirmation_modal.do_not_ask_again": "不要再顯示確認訊息",
|
||||
"confirmations.deprecated_settings.confirm": "使用 Mastodon 偏好",
|
||||
"confirmations.deprecated_settings.message": "您正在使用的某些特定於 glitch-soc 設備的 {app_settings} 已被 Mastodon {preferences} 所取代,並將被覆蓋:",
|
||||
"confirmations.missing_media_description.confirm": "仍要張貼",
|
||||
"confirmations.missing_media_description.edit": "編輯媒體",
|
||||
"confirmations.missing_media_description.message": "至少有一個媒體附件缺少說明。 在發送嘟文之前,請考慮為視障人士在所有媒體附件加上說明。",
|
||||
"confirmations.unfilter.author": "作者",
|
||||
"confirmations.unfilter.confirm": "顯示",
|
||||
"confirmations.unfilter.edit_filter": "編輯篩選器",
|
||||
"content-type.change": "內容類型",
|
||||
"direct.group_by_conversations": "以對話分組",
|
||||
"empty_column.follow_recommendations": "似乎未能為您產生任何建議。您可以嘗試使用搜尋來尋找您可能認識的人,或是探索熱門主題標籤。",
|
||||
"endorsed_accounts_editor.endorsed_accounts": "受推薦帳號",
|
||||
"favourite_modal.combo": "下次您可以按 {combo} 跳過",
|
||||
"firehose.column_settings.allow_local_only": "在「全部」顯示僅限本地的貼文",
|
||||
"follow_recommendations.done": "完成",
|
||||
"follow_recommendations.heading": "跟隨您想檢視其嘟文的人!這裡有一些建議。",
|
||||
"follow_recommendations.lead": "來自您跟隨的人之嘟文將會按時間順序顯示在您的首頁時間軸上。不要害怕犯錯,您隨時都可以取消跟隨其他人!",
|
||||
"getting_started.onboarding": "帶我四處看看",
|
||||
"home.column_settings.advanced": "進階設定",
|
||||
"home.column_settings.filter_regex": "以正規表達式進行過濾",
|
||||
"home.column_settings.show_direct": "顯示私人提及",
|
||||
"home.settings": "欄位設定",
|
||||
"keyboard_shortcuts.bookmark": "到書籤",
|
||||
"keyboard_shortcuts.secondary_toot": "使用次要隱私設定來發布嘟文",
|
||||
"keyboard_shortcuts.toggle_collapse": "去折疊/展開嘟文",
|
||||
"media_gallery.sensitive": "敏感",
|
||||
"moved_to_warning": "此帳戶已標記為移至 {moved_to_link},因此可能不接受新的追隨者。",
|
||||
"navigation_bar.app_settings": "應用程式設定",
|
||||
"navigation_bar.featured_users": "被推薦的使用者",
|
||||
"navigation_bar.keyboard_shortcuts": "鍵盤快速鍵",
|
||||
"navigation_bar.misc": "雜項",
|
||||
"notification.markForDeletion": "標記刪除",
|
||||
"notification_purge.btn_all": "選取全部",
|
||||
"notification_purge.btn_apply": "清除所選項目",
|
||||
"notification_purge.btn_invert": "反向選擇",
|
||||
"notification_purge.btn_none": "取消選取",
|
||||
"notification_purge.start": "進入通知清理模式",
|
||||
"notifications.marked_clear": "清除被選取的通知訊息",
|
||||
"notifications.marked_clear_confirmation": "您確定要永久清除所有被選取的通知訊息嗎?",
|
||||
"onboarding.done": "完成",
|
||||
"onboarding.next": "下一個",
|
||||
"onboarding.page_five.public_timelines": "本地時間軸顯示來自 {domain} 上所有人的公開貼文。聯合時間軸顯示 {domain} 上追隨的每個人發表的公開貼文。這些是公共時間軸,是發現新朋友的好方法。",
|
||||
"onboarding.page_four.home": "首頁時間線會顯示你追隨的人發布的貼文。",
|
||||
"onboarding.page_four.notifications": "當有人與您互動時會顯示在通知欄。",
|
||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||
"onboarding.page_one.handle": "你的帳號在 {domain} ,所以你的帳號全名是 {handle}",
|
||||
"onboarding.page_one.welcome": "歡迎來到 {domain} !",
|
||||
"onboarding.page_six.admin": "您的站台管理者是 {admin} 。",
|
||||
"onboarding.page_six.almost_done": "就快完成了…",
|
||||
"onboarding.page_six.apps_available": "有適用於 iOS、Android 和其他平台的 {apps}。",
|
||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||
"onboarding.page_six.guidelines": "社群規範",
|
||||
"onboarding.page_six.read_guidelines": "請閱讀 {domain} 的 {guidelines}!",
|
||||
"onboarding.page_six.various_app": "手機應用程式",
|
||||
"onboarding.page_three.profile": "編輯您的個人資料以更改您的頭像、個人簡介和顯示名稱。在那裡,您還會發現其他偏好設置。",
|
||||
"onboarding.page_three.search": "使用搜索欄查找他人與主題標籤,例如 {illustration} 和 {introductions} 。要尋找其他站台的人,請使用他們的完整帳號名稱。",
|
||||
"onboarding.page_two.compose": "從撰寫欄撰寫帖子。您可以使用下面的圖示上傳圖片、更改隱私設置以及添加內容警告。",
|
||||
"onboarding.skip": "略過",
|
||||
"settings.always_show_spoilers_field": "永遠啟用內容警告欄位",
|
||||
"settings.auto_collapse": "自動折疊",
|
||||
"settings.auto_collapse_all": "全部",
|
||||
@@ -83,19 +128,23 @@
|
||||
"settings.hicolor_privacy_icons.hint": "用明亮且易於區分的顏色顯示隱私圖示",
|
||||
"settings.image_backgrounds": "圖片背景",
|
||||
"settings.image_backgrounds_media": "預覽折疊嘟文的媒體檔案",
|
||||
"settings.image_backgrounds_media_hint": "如果嘟文包含媒體檔案,使用的一個作為圖片背景",
|
||||
"settings.image_backgrounds_media_hint": "如果嘟文包含媒體檔案,使用第一個作為圖片背景",
|
||||
"settings.image_backgrounds_users": "為折疊的嘟文加上圖片背景",
|
||||
"settings.inline_preview_cards": "針對外部連接顯示內嵌的預覽卡",
|
||||
"settings.layout_opts": "版面選項",
|
||||
"settings.media": "媒體",
|
||||
"settings.media_fullwidth": "在媒體預覽中使用完整寬度",
|
||||
"settings.media_letterbox": "在媒體預覽加上黑邊",
|
||||
"settings.media_letterbox_hint": "在媒體預覽中縮小並加上黑邊以取代延展與裁切",
|
||||
"settings.media_reveal_behind_cw": "預設顯示隱藏在內容警告的敏感媒體檔案",
|
||||
"settings.notifications.favicon_badge": "未讀通知網站圖示徽章",
|
||||
"settings.notifications.favicon_badge.hint": "在網站圖示上增加一個未讀通知徽章",
|
||||
"settings.notifications.tab_badge": "未讀通知徽章",
|
||||
"settings.notifications.tab_badge.hint": "當通知列未打開時,在導引圖示中顯示未讀通知的徽章",
|
||||
"settings.notifications_opts": "通知選項",
|
||||
"settings.pop_in_left": "左邊",
|
||||
"settings.pop_in_player": "啟用彈出播放器",
|
||||
"settings.pop_in_position": "彈出播放器位置:",
|
||||
"settings.pop_in_right": "右邊",
|
||||
"settings.preferences": "使用者偏好設定",
|
||||
"settings.prepend_cw_re": "回覆時在內容警告前添加 \"re:\"",
|
||||
@@ -105,6 +154,7 @@
|
||||
"settings.rewrite_mentions_acct": "改寫為使用者名稱與網域(當使用者來自外部)",
|
||||
"settings.rewrite_mentions_no": "不要改寫提及",
|
||||
"settings.rewrite_mentions_username": "改寫為使用者名稱",
|
||||
"settings.shared_settings_link": "使用者偏好設定",
|
||||
"settings.show_action_bar": "在折疊的嘟文顯示操作按鈕",
|
||||
"settings.show_content_type_choice": "在編寫嘟文時顯示內容類型選擇",
|
||||
"settings.show_reply_counter": "顯示回覆數量的估計值",
|
||||
@@ -113,12 +163,14 @@
|
||||
"settings.side_arm_reply_mode": "當回覆一篇嘟文時,次要發出嘟文按鈕應該設為:",
|
||||
"settings.side_arm_reply_mode.copy": "複製回覆嘟文的隱私設置",
|
||||
"settings.side_arm_reply_mode.keep": "保持原本的隱私設定",
|
||||
"settings.side_arm_reply_mode.restrict": "限制只能使用與回覆嘟文相同的隱私設置",
|
||||
"settings.status_icons": "嘟文圖示",
|
||||
"settings.status_icons_language": "語言指示器",
|
||||
"settings.status_icons_local_only": "僅限本地指示器",
|
||||
"settings.status_icons_media": "媒體與投票指示器",
|
||||
"settings.status_icons_reply": "回覆指示器",
|
||||
"settings.status_icons_visibility": "嘟文隱私指示器",
|
||||
"settings.swipe_to_change_columns": "允許使用滑動手勢更改顯示欄位(僅限移動裝置)",
|
||||
"settings.tag_misleading_links": "標記誤導性的連結",
|
||||
"settings.tag_misleading_links.hint": "在每個未明確提及的連結添加帶有連結目標主機的視覺指示",
|
||||
"settings.wide_view": "寬廣模式(僅限桌面模式)",
|
||||
@@ -130,5 +182,17 @@
|
||||
"status.has_video": "包含視訊檔案",
|
||||
"status.in_reply_to": "嘟文有回覆",
|
||||
"status.is_poll": "嘟文有投票",
|
||||
"status.local_only": "只在此實例可見"
|
||||
"status.local_only": "只在此實例可見",
|
||||
"status.sensitive_toggle": "點擊查看",
|
||||
"status.uncollapse": "展開",
|
||||
"web_app_crash.change_your_settings": "修改你的 {settings}",
|
||||
"web_app_crash.content": "您可以嘗試以下任一種方法:",
|
||||
"web_app_crash.debug_info": "除錯資訊",
|
||||
"web_app_crash.disable_addons": "禁用瀏覽器插件或內置翻譯工具",
|
||||
"web_app_crash.issue_tracker": "問題追蹤系統",
|
||||
"web_app_crash.reload": "重新載入",
|
||||
"web_app_crash.reload_page": "{reload} 當前頁面",
|
||||
"web_app_crash.report_issue": "到 {issuetracker} 回報問題",
|
||||
"web_app_crash.settings": "設定",
|
||||
"web_app_crash.title": "很抱歉,Mastodon 應用程序出現問題。"
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import emojify from 'flavours/glitch/features/emoji/emoji';
|
||||
import loadKeyboardExtensions from 'flavours/glitch/load_keyboard_extensions';
|
||||
import { loadLocale, getLocale } from 'flavours/glitch/locales';
|
||||
import { loadPolyfills } from 'flavours/glitch/polyfills';
|
||||
import ready from 'flavours/glitch/ready';
|
||||
|
||||
const messages = defineMessages({
|
||||
usernameTaken: { id: 'username.taken', defaultMessage: 'That username is taken. Try another' },
|
||||
@@ -42,159 +41,157 @@ function main() {
|
||||
};
|
||||
};
|
||||
|
||||
ready(() => {
|
||||
const locale = document.documentElement.lang;
|
||||
const locale = document.documentElement.lang;
|
||||
|
||||
const dateTimeFormat = new Intl.DateTimeFormat(locale, {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
});
|
||||
const dateTimeFormat = new Intl.DateTimeFormat(locale, {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
});
|
||||
|
||||
const dateFormat = new Intl.DateTimeFormat(locale, {
|
||||
year: 'numeric',
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
timeFormat: false,
|
||||
});
|
||||
const dateFormat = new Intl.DateTimeFormat(locale, {
|
||||
year: 'numeric',
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
timeFormat: false,
|
||||
});
|
||||
|
||||
const timeFormat = new Intl.DateTimeFormat(locale, {
|
||||
timeStyle: 'short',
|
||||
hour12: false,
|
||||
});
|
||||
const timeFormat = new Intl.DateTimeFormat(locale, {
|
||||
timeStyle: 'short',
|
||||
hour12: false,
|
||||
});
|
||||
|
||||
const formatMessage = ({ id, defaultMessage }, values) => {
|
||||
const messageFormat = new IntlMessageFormat(localeData[id] || defaultMessage, locale);
|
||||
return messageFormat.format(values);
|
||||
};
|
||||
const formatMessage = ({ id, defaultMessage }, values) => {
|
||||
const messageFormat = new IntlMessageFormat(localeData[id] || defaultMessage, locale);
|
||||
return messageFormat.format(values);
|
||||
};
|
||||
|
||||
[].forEach.call(document.querySelectorAll('.emojify'), (content) => {
|
||||
content.innerHTML = emojify(content.innerHTML);
|
||||
});
|
||||
[].forEach.call(document.querySelectorAll('.emojify'), (content) => {
|
||||
content.innerHTML = emojify(content.innerHTML);
|
||||
});
|
||||
|
||||
[].forEach.call(document.querySelectorAll('time.formatted'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
const formattedDate = dateTimeFormat.format(datetime);
|
||||
[].forEach.call(document.querySelectorAll('time.formatted'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
const formattedDate = dateTimeFormat.format(datetime);
|
||||
|
||||
content.title = formattedDate;
|
||||
content.textContent = formattedDate;
|
||||
});
|
||||
content.title = formattedDate;
|
||||
content.textContent = formattedDate;
|
||||
});
|
||||
|
||||
const isToday = date => {
|
||||
const today = new Date();
|
||||
const isToday = date => {
|
||||
const today = new Date();
|
||||
|
||||
return date.getDate() === today.getDate() &&
|
||||
date.getMonth() === today.getMonth() &&
|
||||
date.getFullYear() === today.getFullYear();
|
||||
};
|
||||
const todayFormat = new IntlMessageFormat(localeData['relative_format.today'] || 'Today at {time}', locale);
|
||||
return date.getDate() === today.getDate() &&
|
||||
date.getMonth() === today.getMonth() &&
|
||||
date.getFullYear() === today.getFullYear();
|
||||
};
|
||||
const todayFormat = new IntlMessageFormat(localeData['relative_format.today'] || 'Today at {time}', locale);
|
||||
|
||||
[].forEach.call(document.querySelectorAll('time.relative-formatted'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
[].forEach.call(document.querySelectorAll('time.relative-formatted'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
|
||||
let formattedContent;
|
||||
let formattedContent;
|
||||
|
||||
if (isToday(datetime)) {
|
||||
const formattedTime = timeFormat.format(datetime);
|
||||
if (isToday(datetime)) {
|
||||
const formattedTime = timeFormat.format(datetime);
|
||||
|
||||
formattedContent = todayFormat.format({ time: formattedTime });
|
||||
} else {
|
||||
formattedContent = dateFormat.format(datetime);
|
||||
}
|
||||
|
||||
content.title = formattedContent;
|
||||
content.textContent = formattedContent;
|
||||
});
|
||||
|
||||
[].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
const now = new Date();
|
||||
|
||||
const timeGiven = content.getAttribute('datetime').includes('T');
|
||||
content.title = timeGiven ? dateTimeFormat.format(datetime) : dateFormat.format(datetime);
|
||||
content.textContent = timeAgoString({
|
||||
formatMessage,
|
||||
formatDate: (date, options) => (new Intl.DateTimeFormat(locale, options)).format(date),
|
||||
}, datetime, now, now.getFullYear(), timeGiven);
|
||||
});
|
||||
|
||||
const reactComponents = document.querySelectorAll('[data-component]');
|
||||
if (reactComponents.length > 0) {
|
||||
import(/* webpackChunkName: "containers/media_container" */ 'flavours/glitch/containers/media_container')
|
||||
.then(({ default: MediaContainer }) => {
|
||||
[].forEach.call(reactComponents, (component) => {
|
||||
[].forEach.call(component.children, (child) => {
|
||||
component.removeChild(child);
|
||||
});
|
||||
});
|
||||
|
||||
const content = document.createElement('div');
|
||||
|
||||
const root = createRoot(content);
|
||||
root.render(<MediaContainer locale={locale} components={reactComponents} />);
|
||||
document.body.appendChild(content);
|
||||
scrollToDetailedStatus();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
scrollToDetailedStatus();
|
||||
});
|
||||
formattedContent = todayFormat.format({ time: formattedTime });
|
||||
} else {
|
||||
scrollToDetailedStatus();
|
||||
formattedContent = dateFormat.format(datetime);
|
||||
}
|
||||
|
||||
delegate(document, '#user_account_attributes_username', 'input', throttle(() => {
|
||||
const username = document.getElementById('user_account_attributes_username');
|
||||
content.title = formattedContent;
|
||||
content.textContent = formattedContent;
|
||||
});
|
||||
|
||||
if (username.value && username.value.length > 0) {
|
||||
axios.get('/api/v1/accounts/lookup', { params: { acct: username.value } }).then(() => {
|
||||
username.setCustomValidity(formatMessage(messages.usernameTaken));
|
||||
}).catch(() => {
|
||||
username.setCustomValidity('');
|
||||
[].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
|
||||
const datetime = new Date(content.getAttribute('datetime'));
|
||||
const now = new Date();
|
||||
|
||||
const timeGiven = content.getAttribute('datetime').includes('T');
|
||||
content.title = timeGiven ? dateTimeFormat.format(datetime) : dateFormat.format(datetime);
|
||||
content.textContent = timeAgoString({
|
||||
formatMessage,
|
||||
formatDate: (date, options) => (new Intl.DateTimeFormat(locale, options)).format(date),
|
||||
}, datetime, now, now.getFullYear(), timeGiven);
|
||||
});
|
||||
|
||||
const reactComponents = document.querySelectorAll('[data-component]');
|
||||
if (reactComponents.length > 0) {
|
||||
import(/* webpackChunkName: "containers/media_container" */ 'flavours/glitch/containers/media_container')
|
||||
.then(({ default: MediaContainer }) => {
|
||||
[].forEach.call(reactComponents, (component) => {
|
||||
[].forEach.call(component.children, (child) => {
|
||||
component.removeChild(child);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
|
||||
const content = document.createElement('div');
|
||||
|
||||
const root = createRoot(content);
|
||||
root.render(<MediaContainer locale={locale} components={reactComponents} />);
|
||||
document.body.appendChild(content);
|
||||
scrollToDetailedStatus();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
scrollToDetailedStatus();
|
||||
});
|
||||
} else {
|
||||
scrollToDetailedStatus();
|
||||
}
|
||||
|
||||
delegate(document, '#user_account_attributes_username', 'input', throttle(() => {
|
||||
const username = document.getElementById('user_account_attributes_username');
|
||||
|
||||
if (username.value && username.value.length > 0) {
|
||||
axios.get('/api/v1/accounts/lookup', { params: { acct: username.value } }).then(() => {
|
||||
username.setCustomValidity(formatMessage(messages.usernameTaken));
|
||||
}).catch(() => {
|
||||
username.setCustomValidity('');
|
||||
}
|
||||
}, 500, { leading: false, trailing: true }));
|
||||
});
|
||||
} else {
|
||||
username.setCustomValidity('');
|
||||
}
|
||||
}, 500, { leading: false, trailing: true }));
|
||||
|
||||
delegate(document, '#user_password,#user_password_confirmation', 'input', () => {
|
||||
const password = document.getElementById('user_password');
|
||||
const confirmation = document.getElementById('user_password_confirmation');
|
||||
if (!confirmation) return;
|
||||
delegate(document, '#user_password,#user_password_confirmation', 'input', () => {
|
||||
const password = document.getElementById('user_password');
|
||||
const confirmation = document.getElementById('user_password_confirmation');
|
||||
if (!confirmation) return;
|
||||
|
||||
if (confirmation.value && confirmation.value.length > password.maxLength) {
|
||||
confirmation.setCustomValidity(formatMessage(messages.passwordExceedsLength));
|
||||
} else if (password.value && password.value !== confirmation.value) {
|
||||
confirmation.setCustomValidity(formatMessage(messages.passwordDoesNotMatch));
|
||||
} else {
|
||||
confirmation.setCustomValidity('');
|
||||
}
|
||||
});
|
||||
if (confirmation.value && confirmation.value.length > password.maxLength) {
|
||||
confirmation.setCustomValidity(formatMessage(messages.passwordExceedsLength));
|
||||
} else if (password.value && password.value !== confirmation.value) {
|
||||
confirmation.setCustomValidity(formatMessage(messages.passwordDoesNotMatch));
|
||||
} else {
|
||||
confirmation.setCustomValidity('');
|
||||
}
|
||||
});
|
||||
|
||||
delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
|
||||
delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
|
||||
delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
|
||||
delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
|
||||
|
||||
delegate(document, '.status__content__spoiler-link', 'click', function() {
|
||||
const statusEl = this.parentNode.parentNode;
|
||||
delegate(document, '.status__content__spoiler-link', 'click', function() {
|
||||
const statusEl = this.parentNode.parentNode;
|
||||
|
||||
if (statusEl.dataset.spoiler === 'expanded') {
|
||||
statusEl.dataset.spoiler = 'folded';
|
||||
this.textContent = (new IntlMessageFormat(localeData['status.show_more'] || 'Show more', locale)).format();
|
||||
} else {
|
||||
statusEl.dataset.spoiler = 'expanded';
|
||||
this.textContent = (new IntlMessageFormat(localeData['status.show_less'] || 'Show less', locale)).format();
|
||||
}
|
||||
if (statusEl.dataset.spoiler === 'expanded') {
|
||||
statusEl.dataset.spoiler = 'folded';
|
||||
this.textContent = (new IntlMessageFormat(localeData['status.show_more'] || 'Show more', locale)).format();
|
||||
} else {
|
||||
statusEl.dataset.spoiler = 'expanded';
|
||||
this.textContent = (new IntlMessageFormat(localeData['status.show_less'] || 'Show less', locale)).format();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
[].forEach.call(document.querySelectorAll('.status__content__spoiler-link'), (spoilerLink) => {
|
||||
const statusEl = spoilerLink.parentNode.parentNode;
|
||||
const message = (statusEl.dataset.spoiler === 'expanded') ? (localeData['status.show_less'] || 'Show less') : (localeData['status.show_more'] || 'Show more');
|
||||
spoilerLink.textContent = (new IntlMessageFormat(message, locale)).format();
|
||||
});
|
||||
[].forEach.call(document.querySelectorAll('.status__content__spoiler-link'), (spoilerLink) => {
|
||||
const statusEl = spoilerLink.parentNode.parentNode;
|
||||
const message = (statusEl.dataset.spoiler === 'expanded') ? (localeData['status.show_less'] || 'Show less') : (localeData['status.show_more'] || 'Show more');
|
||||
spoilerLink.textContent = (new IntlMessageFormat(message, locale)).format();
|
||||
});
|
||||
|
||||
const toggleSidebar = () => {
|
||||
|
||||
@@ -13,4 +13,30 @@ ready(() => {
|
||||
console.error(error);
|
||||
});
|
||||
}, 5000);
|
||||
|
||||
document.querySelectorAll('.timer-button').forEach(button => {
|
||||
let counter = 30;
|
||||
|
||||
const container = document.createElement('span');
|
||||
|
||||
const updateCounter = () => {
|
||||
container.innerText = ` (${counter})`;
|
||||
};
|
||||
|
||||
updateCounter();
|
||||
|
||||
const countdown = setInterval(() => {
|
||||
counter--;
|
||||
|
||||
if (counter === 0) {
|
||||
button.disabled = false;
|
||||
button.removeChild(container);
|
||||
clearInterval(countdown);
|
||||
} else {
|
||||
updateCounter();
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
button.appendChild(container);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1038,3 +1038,33 @@ $ui-header-height: 55px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.hashtag-header {
|
||||
border-bottom: 1px solid lighten($ui-base-color, 8%);
|
||||
padding: 15px;
|
||||
font-size: 17px;
|
||||
line-height: 22px;
|
||||
color: $darker-text-color;
|
||||
|
||||
strong {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
&__header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
gap: 15px;
|
||||
|
||||
h1 {
|
||||
color: $primary-text-color;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
font-size: 22px;
|
||||
line-height: 33px;
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,10 +147,6 @@
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.layout-multiple-columns &.button--with-bell {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-button {
|
||||
@@ -1345,16 +1341,19 @@ button.icon-button.active i.fa-retweet {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: rgba($black, 0.5);
|
||||
background: transparent;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
color: $white;
|
||||
|
||||
&__label {
|
||||
background-color: rgba($black, 0.45);
|
||||
backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
|
||||
border-radius: 6px;
|
||||
padding: 10px 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -1368,6 +1367,13 @@ button.icon-button.active i.fa-retweet {
|
||||
font-weight: 400;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
.spoiler-button__overlay__label {
|
||||
background-color: rgba($black, 0.9);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -719,15 +719,16 @@
|
||||
}
|
||||
|
||||
.button.button-secondary {
|
||||
border-color: $ui-button-secondary-border-color;
|
||||
color: $ui-button-secondary-color;
|
||||
border-color: $inverted-text-color;
|
||||
color: $inverted-text-color;
|
||||
flex: 0 0 auto;
|
||||
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
border-color: $ui-button-secondary-focus-background-color;
|
||||
color: $ui-button-secondary-focus-color;
|
||||
background: transparent;
|
||||
border-color: $ui-button-background-color;
|
||||
color: $ui-button-background-color;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1412,6 +1413,44 @@ img.modal-warning {
|
||||
}
|
||||
}
|
||||
|
||||
&__choices {
|
||||
display: flex;
|
||||
gap: 40px;
|
||||
|
||||
&__choice {
|
||||
flex: 1;
|
||||
box-sizing: border-box;
|
||||
|
||||
h3 {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
p {
|
||||
color: $darker-text-color;
|
||||
margin-bottom: 20px;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.button {
|
||||
margin-bottom: 10px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: $no-gap-breakpoint - 1px) {
|
||||
&__choices {
|
||||
flex-direction: column;
|
||||
|
||||
&__choice {
|
||||
margin-top: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.link-button {
|
||||
font-size: inherit;
|
||||
display: inline;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -159,6 +159,7 @@
|
||||
|
||||
&.active {
|
||||
transform: rotate(90deg);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
|
||||
@@ -310,9 +310,19 @@ code {
|
||||
border-radius: 4px;
|
||||
background: url('images/void.png');
|
||||
|
||||
&[src$='missing.png'] {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&#account_avatar-preview {
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -420,6 +420,10 @@ html {
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
.column-settings__hashtags .column-select__option {
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.dashboard__quick-access,
|
||||
.focal-point__preview strong,
|
||||
.admin-wrapper .content__heading__tabs a.selected {
|
||||
|
||||
@@ -76,7 +76,10 @@ export function normalizeStatus(status, normalOldStatus) {
|
||||
normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml');
|
||||
normalStatus.spoiler_text = normalOldStatus.get('spoiler_text');
|
||||
normalStatus.hidden = normalOldStatus.get('hidden');
|
||||
normalStatus.translation = normalOldStatus.get('translation');
|
||||
|
||||
if (normalOldStatus.get('translation')) {
|
||||
normalStatus.translation = normalOldStatus.get('translation');
|
||||
}
|
||||
} else {
|
||||
// If the status has a CW but no contents, treat the CW as if it were the
|
||||
// status' contents, to avoid having a CW toggle with seemingly no effect.
|
||||
|
||||
@@ -145,7 +145,7 @@ export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
|
||||
export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }, done);
|
||||
export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, max_id: maxId, only_media: !!onlyMedia }, done);
|
||||
export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done);
|
||||
export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, tagged, max_id: maxId });
|
||||
export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId });
|
||||
export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged });
|
||||
export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 });
|
||||
export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done);
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
import { fromJS } from 'immutable';
|
||||
|
||||
import type { StatusLike } from '../hashtag_bar';
|
||||
import { computeHashtagBarForStatus } from '../hashtag_bar';
|
||||
|
||||
function createStatus(
|
||||
content: string,
|
||||
hashtags: string[],
|
||||
hasMedia = false,
|
||||
spoilerText?: string,
|
||||
) {
|
||||
return fromJS({
|
||||
tags: hashtags.map((name) => ({ name })),
|
||||
contentHtml: content,
|
||||
media_attachments: hasMedia ? ['fakeMedia'] : [],
|
||||
spoiler_text: spoilerText,
|
||||
}) as unknown as StatusLike; // need to force the type here, as it is not properly defined
|
||||
}
|
||||
|
||||
describe('computeHashtagBarForStatus', () => {
|
||||
it('does nothing when there are no tags', () => {
|
||||
const status = createStatus('<p>Simple text</p>', []);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Simple text</p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('displays out of band hashtags in the bar', () => {
|
||||
const status = createStatus(
|
||||
'<p>Simple text <a href="test">#hashtag</a></p>',
|
||||
['hashtag', 'test'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual(['test']);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Simple text <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('extract tags from the last line', () => {
|
||||
const status = createStatus(
|
||||
'<p>Simple text</p><p><a href="test">#hashtag</a></p>',
|
||||
['hashtag'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual(['hashtag']);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Simple text</p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('does not include tags from content', () => {
|
||||
const status = createStatus(
|
||||
'<p>Simple text with a <a href="test">#hashtag</a></p><p><a href="test">#hashtag</a></p>',
|
||||
['hashtag'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Simple text with a <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('works with one line status and hashtags', () => {
|
||||
const status = createStatus(
|
||||
'<p><a href="test">#test</a>. And another <a href="test">#hashtag</a></p>',
|
||||
['hashtag', 'test'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p><a href="test">#test</a>. And another <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('de-duplicate accentuated characters with case differences', () => {
|
||||
const status = createStatus(
|
||||
'<p>Text</p><p><a href="test">#éaa</a> <a href="test">#Éaa</a></p>',
|
||||
['éaa'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual(['Éaa']);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Text</p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('handles server-side normalized tags with accentuated characters', () => {
|
||||
const status = createStatus(
|
||||
'<p>Text</p><p><a href="test">#éaa</a> <a href="test">#Éaa</a></p>',
|
||||
['eaa'], // The server may normalize the hashtags in the `tags` attribute
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual(['Éaa']);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Text</p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('does not display in bar a hashtag in content with a case difference', () => {
|
||||
const status = createStatus(
|
||||
'<p>Text <a href="test">#Éaa</a></p><p><a href="test">#éaa</a></p>',
|
||||
['éaa'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>Text <a href="test">#Éaa</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('does not modify a status with a line of hashtags only', () => {
|
||||
const status = createStatus(
|
||||
'<p><a href="test">#test</a> <a href="test">#hashtag</a></p>',
|
||||
['test', 'hashtag'],
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p><a href="test">#test</a> <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('puts the hashtags in the bar if a status content has hashtags in the only line and has a media', () => {
|
||||
const status = createStatus(
|
||||
'<p>This is my content! <a href="test">#hashtag</a></p>',
|
||||
['hashtag'],
|
||||
true,
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p>This is my content! <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
|
||||
it('puts the hashtags in the bar if a status content is only hashtags and has a media', () => {
|
||||
const status = createStatus(
|
||||
'<p><a href="test">#test</a> <a href="test">#hashtag</a></p>',
|
||||
['test', 'hashtag'],
|
||||
true,
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual(['test', 'hashtag']);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(`""`);
|
||||
});
|
||||
|
||||
it('does not use the hashtag bar if the status content is only hashtags, has a CW and a media', () => {
|
||||
const status = createStatus(
|
||||
'<p><a href="test">#test</a> <a href="test">#hashtag</a></p>',
|
||||
['test', 'hashtag'],
|
||||
true,
|
||||
'My CW text',
|
||||
);
|
||||
|
||||
const { hashtagsInBar, statusContentProps } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
expect(hashtagsInBar).toEqual([]);
|
||||
expect(statusContentProps.statusContent).toMatchInlineSnapshot(
|
||||
`"<p><a href="test">#test</a> <a href="test">#hashtag</a></p>"`,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -8,6 +8,7 @@ import classNames from 'classnames';
|
||||
import api from 'mastodon/api';
|
||||
|
||||
const messages = defineMessages({
|
||||
legal: { id: 'report.categories.legal', defaultMessage: 'Legal' },
|
||||
other: { id: 'report.categories.other', defaultMessage: 'Other' },
|
||||
spam: { id: 'report.categories.spam', defaultMessage: 'Spam' },
|
||||
violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' },
|
||||
@@ -150,6 +151,7 @@ class ReportReasonSelector extends PureComponent {
|
||||
return (
|
||||
<div className='report-reason-selector'>
|
||||
<Category id='other' text={intl.formatMessage(messages.other)} selected={category === 'other'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='legal' text={intl.formatMessage(messages.legal)} selected={category === 'legal'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='spam' text={intl.formatMessage(messages.spam)} selected={category === 'spam'} onSelect={this.handleSelect} disabled={disabled} />
|
||||
<Category id='violation' text={intl.formatMessage(messages.violation)} selected={category === 'violation'} onSelect={this.handleSelect} disabled={disabled}>
|
||||
{rules.map(rule => <Rule key={rule.id} id={rule.id} text={rule.text} selected={rule_ids.includes(rule.id)} onToggle={this.handleToggle} disabled={disabled} />)}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import { ReactComponent as GroupsIcon } from '@material-design-icons/svg/outlined/group.svg';
|
||||
import { ReactComponent as PersonIcon } from '@material-design-icons/svg/outlined/person.svg';
|
||||
import { ReactComponent as SmartToyIcon } from '@material-design-icons/svg/outlined/smart_toy.svg';
|
||||
|
||||
|
||||
export const Badge = ({ icon, label, domain }) => (
|
||||
<div className='account-role'>
|
||||
{icon}
|
||||
{label}
|
||||
{domain && <span className='account-role__domain'>{domain}</span>}
|
||||
</div>
|
||||
);
|
||||
|
||||
Badge.propTypes = {
|
||||
icon: PropTypes.node,
|
||||
label: PropTypes.node,
|
||||
domain: PropTypes.node,
|
||||
};
|
||||
|
||||
Badge.defaultProps = {
|
||||
icon: <PersonIcon />,
|
||||
};
|
||||
|
||||
export const GroupBadge = () => (
|
||||
<Badge icon={<GroupsIcon />} label={<FormattedMessage id='account.badges.group' defaultMessage='Group' />} />
|
||||
);
|
||||
|
||||
export const AutomatedBadge = () => (
|
||||
<Badge icon={<SmartToyIcon />} label={<FormattedMessage id='account.badges.bot' defaultMessage='Automated' />} />
|
||||
);
|
||||
@@ -16,7 +16,19 @@ export default class Column extends PureComponent {
|
||||
};
|
||||
|
||||
scrollTop () {
|
||||
const scrollable = this.props.bindToDocument ? document.scrollingElement : this.node.querySelector('.scrollable');
|
||||
let scrollable = null;
|
||||
|
||||
if (this.props.bindToDocument) {
|
||||
scrollable = document.scrollingElement;
|
||||
} else {
|
||||
scrollable = this.node.querySelector('.scrollable');
|
||||
|
||||
// Some columns have nested `.scrollable` containers, with the outer one
|
||||
// being a wrapper while the actual scrollable content is deeper.
|
||||
if (scrollable.classList.contains('scrollable--flex')) {
|
||||
scrollable = scrollable?.querySelector('.scrollable') || scrollable;
|
||||
}
|
||||
}
|
||||
|
||||
if (!scrollable) {
|
||||
return;
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
import { useState, useCallback } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import type { List, Record } from 'immutable';
|
||||
|
||||
import { groupBy, minBy } from 'lodash';
|
||||
|
||||
import { getStatusContent } from './status_content';
|
||||
|
||||
// About two lines on desktop
|
||||
const VISIBLE_HASHTAGS = 7;
|
||||
|
||||
// Those types are not correct, they need to be replaced once this part of the state is typed
|
||||
export type TagLike = Record<{ name: string }>;
|
||||
export type StatusLike = Record<{
|
||||
tags: List<TagLike>;
|
||||
contentHTML: string;
|
||||
media_attachments: List<unknown>;
|
||||
spoiler_text?: string;
|
||||
}>;
|
||||
|
||||
function normalizeHashtag(hashtag: string) {
|
||||
return (
|
||||
hashtag && hashtag.startsWith('#') ? hashtag.slice(1) : hashtag
|
||||
).normalize('NFKC');
|
||||
}
|
||||
|
||||
function isNodeLinkHashtag(element: Node): element is HTMLLinkElement {
|
||||
return (
|
||||
element instanceof HTMLAnchorElement &&
|
||||
// it may be a <a> starting with a hashtag
|
||||
(element.textContent?.[0] === '#' ||
|
||||
// or a #<a>
|
||||
element.previousSibling?.textContent?.[
|
||||
element.previousSibling.textContent.length - 1
|
||||
] === '#')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes duplicates from an hashtag list, case-insensitive, keeping only the best one
|
||||
* "Best" here is defined by the one with the more casing difference (ie, the most camel-cased one)
|
||||
* @param hashtags The list of hashtags
|
||||
* @returns The input hashtags, but with only 1 occurence of each (case-insensitive)
|
||||
*/
|
||||
function uniqueHashtagsWithCaseHandling(hashtags: string[]) {
|
||||
const groups = groupBy(hashtags, (tag) =>
|
||||
tag.normalize('NFKD').toLowerCase(),
|
||||
);
|
||||
|
||||
return Object.values(groups).map((tags) => {
|
||||
if (tags.length === 1) return tags[0];
|
||||
|
||||
// The best match is the one where we have the less difference between upper and lower case letter count
|
||||
const best = minBy(tags, (tag) => {
|
||||
const upperCase = Array.from(tag).reduce(
|
||||
(acc, char) => (acc += char.toUpperCase() === char ? 1 : 0),
|
||||
0,
|
||||
);
|
||||
|
||||
const lowerCase = tag.length - upperCase;
|
||||
|
||||
return Math.abs(lowerCase - upperCase);
|
||||
});
|
||||
|
||||
return best ?? tags[0];
|
||||
});
|
||||
}
|
||||
|
||||
// Create the collator once, this is much more efficient
|
||||
const collator = new Intl.Collator(undefined, {
|
||||
sensitivity: 'base', // we use this to emulate the ASCII folding done on the server-side, hopefuly more efficiently
|
||||
});
|
||||
|
||||
function localeAwareInclude(collection: string[], value: string) {
|
||||
const normalizedValue = value.normalize('NFKC');
|
||||
|
||||
return !!collection.find(
|
||||
(item) => collator.compare(item.normalize('NFKC'), normalizedValue) === 0,
|
||||
);
|
||||
}
|
||||
|
||||
// We use an intermediate function here to make it easier to test
|
||||
export function computeHashtagBarForStatus(status: StatusLike): {
|
||||
statusContentProps: { statusContent: string };
|
||||
hashtagsInBar: string[];
|
||||
} {
|
||||
let statusContent = getStatusContent(status);
|
||||
|
||||
const tagNames = status
|
||||
.get('tags')
|
||||
.map((tag) => tag.get('name'))
|
||||
.toJS();
|
||||
|
||||
// this is returned if we stop the processing early, it does not change what is displayed
|
||||
const defaultResult = {
|
||||
statusContentProps: { statusContent },
|
||||
hashtagsInBar: [],
|
||||
};
|
||||
|
||||
// return early if this status does not have any tags
|
||||
if (tagNames.length === 0) return defaultResult;
|
||||
|
||||
const template = document.createElement('template');
|
||||
template.innerHTML = statusContent.trim();
|
||||
|
||||
const lastChild = template.content.lastChild;
|
||||
|
||||
if (!lastChild) return defaultResult;
|
||||
|
||||
template.content.removeChild(lastChild);
|
||||
const contentWithoutLastLine = template;
|
||||
|
||||
// First, try to parse
|
||||
const contentHashtags = Array.from(
|
||||
contentWithoutLastLine.content.querySelectorAll<HTMLLinkElement>('a[href]'),
|
||||
).reduce<string[]>((result, link) => {
|
||||
if (isNodeLinkHashtag(link)) {
|
||||
if (link.textContent) result.push(normalizeHashtag(link.textContent));
|
||||
}
|
||||
return result;
|
||||
}, []);
|
||||
|
||||
// Now we parse the last line, and try to see if it only contains hashtags
|
||||
const lastLineHashtags: string[] = [];
|
||||
// try to see if the last line is only hashtags
|
||||
let onlyHashtags = true;
|
||||
|
||||
const normalizedTagNames = tagNames.map((tag) => tag.normalize('NFKC'));
|
||||
|
||||
Array.from(lastChild.childNodes).forEach((node) => {
|
||||
if (isNodeLinkHashtag(node) && node.textContent) {
|
||||
const normalized = normalizeHashtag(node.textContent);
|
||||
|
||||
if (!localeAwareInclude(normalizedTagNames, normalized)) {
|
||||
// stop here, this is not a real hashtag, so consider it as text
|
||||
onlyHashtags = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!localeAwareInclude(contentHashtags, normalized))
|
||||
// only add it if it does not appear in the rest of the content
|
||||
lastLineHashtags.push(normalized);
|
||||
} else if (node.nodeType !== Node.TEXT_NODE || node.nodeValue?.trim()) {
|
||||
// not a space
|
||||
onlyHashtags = false;
|
||||
}
|
||||
});
|
||||
|
||||
const hashtagsInBar = tagNames.filter((tag) => {
|
||||
const normalizedTag = tag.normalize('NFKC');
|
||||
// the tag does not appear at all in the status content, it is an out-of-band tag
|
||||
return (
|
||||
!localeAwareInclude(contentHashtags, normalizedTag) &&
|
||||
!localeAwareInclude(lastLineHashtags, normalizedTag)
|
||||
);
|
||||
});
|
||||
|
||||
const isOnlyOneLine = contentWithoutLastLine.content.childElementCount === 0;
|
||||
const hasMedia = status.get('media_attachments').size > 0;
|
||||
const hasSpoiler = !!status.get('spoiler_text');
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- due to https://github.com/microsoft/TypeScript/issues/9998
|
||||
if (onlyHashtags && ((hasMedia && !hasSpoiler) || !isOnlyOneLine)) {
|
||||
// if the last line only contains hashtags, and we either:
|
||||
// - have other content in the status
|
||||
// - dont have other content, but a media and no CW. If it has a CW, then we do not remove the content to avoid having an empty content behind the CW button
|
||||
statusContent = contentWithoutLastLine.innerHTML;
|
||||
// and add the tags to the bar
|
||||
hashtagsInBar.push(...lastLineHashtags);
|
||||
}
|
||||
|
||||
return {
|
||||
statusContentProps: { statusContent },
|
||||
hashtagsInBar: uniqueHashtagsWithCaseHandling(hashtagsInBar),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will process a status to, at the same time (avoiding parsing it twice):
|
||||
* - build the HashtagBar for this status
|
||||
* - remove the last-line hashtags from the status content
|
||||
* @param status The status to process
|
||||
* @returns Props to be passed to the <StatusContent> component, and the hashtagBar to render
|
||||
*/
|
||||
export function getHashtagBarForStatus(status: StatusLike) {
|
||||
const { statusContentProps, hashtagsInBar } =
|
||||
computeHashtagBarForStatus(status);
|
||||
|
||||
return {
|
||||
statusContentProps,
|
||||
hashtagBar: <HashtagBar hashtags={hashtagsInBar} />,
|
||||
};
|
||||
}
|
||||
|
||||
const HashtagBar: React.FC<{
|
||||
hashtags: string[];
|
||||
}> = ({ hashtags }) => {
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
const handleClick = useCallback(() => {
|
||||
setExpanded(true);
|
||||
}, []);
|
||||
|
||||
if (hashtags.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const revealedHashtags = expanded
|
||||
? hashtags
|
||||
: hashtags.slice(0, VISIBLE_HASHTAGS - 1);
|
||||
|
||||
return (
|
||||
<div className='hashtag-bar'>
|
||||
{revealedHashtags.map((hashtag) => (
|
||||
<Link key={hashtag} to={`/tags/${hashtag}`}>
|
||||
#<span>{hashtag}</span>
|
||||
</Link>
|
||||
))}
|
||||
|
||||
{!expanded && hashtags.length > VISIBLE_HASHTAGS && (
|
||||
<button className='link-button' onClick={handleClick}>
|
||||
<FormattedMessage
|
||||
id='hashtags.and_other'
|
||||
defaultMessage='…and {count, plural, other {# more}}'
|
||||
values={{ count: hashtags.length - VISIBLE_HASHTAGS }}
|
||||
/>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -22,6 +22,7 @@ import { displayMedia } from '../initial_state';
|
||||
import { Avatar } from './avatar';
|
||||
import { AvatarOverlay } from './avatar_overlay';
|
||||
import { DisplayName } from './display_name';
|
||||
import { getHashtagBarForStatus } from './hashtag_bar';
|
||||
import { RelativeTimestamp } from './relative_timestamp';
|
||||
import StatusActionBar from './status_action_bar';
|
||||
import StatusContent from './status_content';
|
||||
@@ -544,6 +545,9 @@ class Status extends ImmutablePureComponent {
|
||||
|
||||
const visibilityIcon = visibilityIconInfo[status.get('visibility')];
|
||||
|
||||
const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);
|
||||
const expanded = !status.get('hidden')
|
||||
|
||||
return (
|
||||
<HotKeys handlers={handlers}>
|
||||
<div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), unread, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText)} ref={this.handleRef}>
|
||||
@@ -571,15 +575,18 @@ class Status extends ImmutablePureComponent {
|
||||
<StatusContent
|
||||
status={status}
|
||||
onClick={this.handleClick}
|
||||
expanded={!status.get('hidden')}
|
||||
expanded={expanded}
|
||||
onExpandedToggle={this.handleExpandedToggle}
|
||||
onTranslate={this.handleTranslate}
|
||||
collapsible
|
||||
onCollapsedToggle={this.handleCollapsedToggle}
|
||||
{...statusContentProps}
|
||||
/>
|
||||
|
||||
{media}
|
||||
|
||||
{expanded && hashtagBar}
|
||||
|
||||
<StatusActionBar scrollKey={scrollKey} status={status} account={account} onFilter={matchedFilters ? this.handleFilterClick : null} {...other} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,6 +15,15 @@ import { autoPlayGif, languages as preloadedLanguages } from 'mastodon/initial_s
|
||||
|
||||
const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top)
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {any} status
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getStatusContent(status) {
|
||||
return status.getIn(['translation', 'contentHtml']) || status.get('contentHtml');
|
||||
}
|
||||
|
||||
class TranslateButton extends PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
@@ -65,6 +74,7 @@ class StatusContent extends PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
statusContent: PropTypes.string,
|
||||
expanded: PropTypes.bool,
|
||||
onExpandedToggle: PropTypes.func,
|
||||
onTranslate: PropTypes.func,
|
||||
@@ -225,7 +235,7 @@ class StatusContent extends PureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { status, intl } = this.props;
|
||||
const { status, intl, statusContent } = this.props;
|
||||
|
||||
const hidden = this.props.onExpandedToggle ? !this.props.expanded : this.state.hidden;
|
||||
const renderReadMore = this.props.onClick && status.get('collapsed');
|
||||
@@ -233,7 +243,7 @@ class StatusContent extends PureComponent {
|
||||
const targetLanguages = this.props.languages?.get(status.get('language') || 'und');
|
||||
const renderTranslate = this.props.onTranslate && this.context.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale);
|
||||
|
||||
const content = { __html: status.getIn(['translation', 'contentHtml']) || status.get('contentHtml') };
|
||||
const content = { __html: statusContent ?? getStatusContent(status) };
|
||||
const spoilerContent = { __html: status.getIn(['translation', 'spoilerHtml']) || status.get('spoilerHtml') };
|
||||
const language = status.getIn(['translation', 'language']) || status.get('language');
|
||||
const classNames = classnames('status__content', {
|
||||
|
||||
@@ -10,6 +10,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
|
||||
import { Avatar } from 'mastodon/components/avatar';
|
||||
import { Badge, AutomatedBadge, GroupBadge } from 'mastodon/components/badge';
|
||||
import Button from 'mastodon/components/button';
|
||||
import { FollowersCounter, FollowingCounter, StatusesCounter } from 'mastodon/components/counters';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
@@ -264,9 +265,9 @@ class Header extends ImmutablePureComponent {
|
||||
if (signedIn && !account.get('relationship')) { // Wait until the relationship is loaded
|
||||
actionBtn = '';
|
||||
} else if (account.getIn(['relationship', 'requested'])) {
|
||||
actionBtn = <Button className={classNames({ 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
|
||||
actionBtn = <Button text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
|
||||
} else if (!account.getIn(['relationship', 'blocking'])) {
|
||||
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames({ 'button--destructive': account.getIn(['relationship', 'following']), 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={signedIn ? this.props.onFollow : this.props.onInteractionModal} />;
|
||||
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames({ 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={signedIn ? this.props.onFollow : this.props.onInteractionModal} />;
|
||||
} else if (account.getIn(['relationship', 'blocking'])) {
|
||||
actionBtn = <Button text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
|
||||
}
|
||||
@@ -373,28 +374,13 @@ class Header extends ImmutablePureComponent {
|
||||
const badges = [];
|
||||
|
||||
if (account.get('bot')) {
|
||||
badges.push(
|
||||
<div key='bot-badge' className='account-role bot'>
|
||||
<Icon id='cogs' /> { ' ' }
|
||||
<FormattedMessage id='account.badges.bot' defaultMessage='Automated' />
|
||||
</div>
|
||||
);
|
||||
badges.push(<AutomatedBadge key='bot-badge' />);
|
||||
} else if (account.get('group')) {
|
||||
badges.push(
|
||||
<div key='group-badge' className='account-role group'>
|
||||
<Icon id='users' /> { ' ' }
|
||||
<FormattedMessage id='account.badges.group' defaultMessage='Group' />
|
||||
</div>
|
||||
);
|
||||
badges.push(<GroupBadge key='group-badge' />);
|
||||
}
|
||||
|
||||
account.get('roles', []).forEach((role) => {
|
||||
badges.push(
|
||||
<div key={`role-badge-${role.get('id')}`} className={`account-role user-role-${account.getIn(['roles', 0, 'id'])}`}>
|
||||
<Icon id='circle' /> { ' ' }
|
||||
<span>{role.get('name')} ({domain})</span>
|
||||
</div>
|
||||
);
|
||||
badges.push(<Badge key={`role-badge-${role.get('id')}`} label={<span>{role.get('name')}</span>} domain={domain} />);
|
||||
});
|
||||
|
||||
return (
|
||||
|
||||
@@ -22,6 +22,7 @@ export default class Story extends PureComponent {
|
||||
author: PropTypes.string,
|
||||
sharedTimes: PropTypes.number,
|
||||
thumbnail: PropTypes.string,
|
||||
thumbnailDescription: PropTypes.string,
|
||||
blurhash: PropTypes.string,
|
||||
expanded: PropTypes.bool,
|
||||
};
|
||||
@@ -33,7 +34,7 @@ export default class Story extends PureComponent {
|
||||
handleImageLoad = () => this.setState({ thumbnailLoaded: true });
|
||||
|
||||
render () {
|
||||
const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, blurhash } = this.props;
|
||||
const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, thumbnailDescription, blurhash } = this.props;
|
||||
|
||||
const { thumbnailLoaded } = this.state;
|
||||
|
||||
@@ -49,7 +50,7 @@ export default class Story extends PureComponent {
|
||||
{thumbnail ? (
|
||||
<>
|
||||
<div className={classNames('story__thumbnail__preview', { 'story__thumbnail__preview--hidden': thumbnailLoaded })}><Blurhash hash={blurhash} /></div>
|
||||
<img src={thumbnail} onLoad={this.handleImageLoad} alt='' role='presentation' />
|
||||
<img src={thumbnail} onLoad={this.handleImageLoad} alt={thumbnailDescription} title={thumbnailDescription} lang={lang} />
|
||||
</>
|
||||
) : <Skeleton />}
|
||||
</div>
|
||||
|
||||
@@ -67,6 +67,7 @@ class Links extends PureComponent {
|
||||
author={link.get('author_name')}
|
||||
sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1}
|
||||
thumbnail={link.get('image')}
|
||||
thumbnailDescription={link.get('image_description')}
|
||||
blurhash={link.get('blurhash')}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -108,10 +108,10 @@ class Results extends PureComponent {
|
||||
return (
|
||||
<>
|
||||
<div className='account__section-headline'>
|
||||
<button onClick={this.handleSelectAll} className={type === 'all' && 'active'}><FormattedMessage id='search_results.all' defaultMessage='All' /></button>
|
||||
<button onClick={this.handleSelectAccounts} className={type === 'accounts' && 'active'}><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></button>
|
||||
<button onClick={this.handleSelectHashtags} className={type === 'hashtags' && 'active'}><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></button>
|
||||
<button onClick={this.handleSelectStatuses} className={type === 'statuses' && 'active'}><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></button>
|
||||
<button onClick={this.handleSelectAll} className={type === 'all' ? 'active' : undefined}><FormattedMessage id='search_results.all' defaultMessage='All' /></button>
|
||||
<button onClick={this.handleSelectAccounts} className={type === 'accounts' ? 'active' : undefined}><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></button>
|
||||
<button onClick={this.handleSelectHashtags} className={type === 'hashtags' ? 'active' : undefined}><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></button>
|
||||
<button onClick={this.handleSelectStatuses} className={type === 'statuses' ? 'active' : undefined}><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></button>
|
||||
</div>
|
||||
|
||||
<div className='explore__search-results'>
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
||||
import Button from 'mastodon/components/button';
|
||||
import { ShortNumber } from 'mastodon/components/short_number';
|
||||
|
||||
const messages = defineMessages({
|
||||
followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },
|
||||
unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' },
|
||||
});
|
||||
|
||||
const usesRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_uses'
|
||||
defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
const peopleRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_accounts'
|
||||
defaultMessage='{count, plural, one {{counter} participant} other {{counter} participants}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
const usesTodayRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='hashtag.counter_by_uses_today'
|
||||
defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}} today'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
export const HashtagHeader = injectIntl(({ tag, intl, disabled, onClick }) => {
|
||||
if (!tag) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const [uses, people] = tag.get('history').reduce((arr, day) => [arr[0] + day.get('uses') * 1, arr[1] + day.get('accounts') * 1], [0, 0]);
|
||||
const dividingCircle = <span aria-hidden>{' · '}</span>;
|
||||
|
||||
return (
|
||||
<div className='hashtag-header'>
|
||||
<div className='hashtag-header__header'>
|
||||
<h1>#{tag.get('name')}</h1>
|
||||
<Button onClick={onClick} text={intl.formatMessage(tag.get('following') ? messages.unfollowHashtag : messages.followHashtag)} disabled={disabled} />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<ShortNumber value={uses} renderer={usesRenderer} />
|
||||
{dividingCircle}
|
||||
<ShortNumber value={people} renderer={peopleRenderer} />
|
||||
{dividingCircle}
|
||||
<ShortNumber value={tag.getIn(['history', 0, 'uses']) * 1} renderer={usesTodayRenderer} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
HashtagHeader.propTypes = {
|
||||
tag: ImmutablePropTypes.map,
|
||||
disabled: PropTypes.bool,
|
||||
onClick: PropTypes.func,
|
||||
intl: PropTypes.object,
|
||||
};
|
||||
@@ -1,9 +1,8 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { PureComponent } from 'react';
|
||||
|
||||
import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { Helmet } from 'react-helmet';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
@@ -17,17 +16,12 @@ import { fetchHashtag, followHashtag, unfollowHashtag } from 'mastodon/actions/t
|
||||
import { expandHashtagTimeline, clearTimeline } from 'mastodon/actions/timelines';
|
||||
import Column from 'mastodon/components/column';
|
||||
import ColumnHeader from 'mastodon/components/column_header';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
|
||||
import StatusListContainer from '../ui/containers/status_list_container';
|
||||
|
||||
import { HashtagHeader } from './components/hashtag_header';
|
||||
import ColumnSettingsContainer from './containers/column_settings_container';
|
||||
|
||||
const messages = defineMessages({
|
||||
followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },
|
||||
unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' },
|
||||
});
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}${props.params.local ? ':local' : ''}`, 'unread']) > 0,
|
||||
tag: state.getIn(['tags', props.params.id]),
|
||||
@@ -48,7 +42,6 @@ class HashtagTimeline extends PureComponent {
|
||||
hasUnread: PropTypes.bool,
|
||||
tag: ImmutablePropTypes.map,
|
||||
multiColumn: PropTypes.bool,
|
||||
intl: PropTypes.object,
|
||||
};
|
||||
|
||||
handlePin = () => {
|
||||
@@ -188,27 +181,11 @@ class HashtagTimeline extends PureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { hasUnread, columnId, multiColumn, tag, intl } = this.props;
|
||||
const { hasUnread, columnId, multiColumn, tag } = this.props;
|
||||
const { id, local } = this.props.params;
|
||||
const pinned = !!columnId;
|
||||
const { signedIn } = this.context.identity;
|
||||
|
||||
let followButton;
|
||||
|
||||
if (tag) {
|
||||
const following = tag.get('following');
|
||||
|
||||
const classes = classNames('column-header__button', {
|
||||
active: following,
|
||||
});
|
||||
|
||||
followButton = (
|
||||
<button className={classes} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
|
||||
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>
|
||||
<ColumnHeader
|
||||
@@ -220,13 +197,14 @@ class HashtagTimeline extends PureComponent {
|
||||
onClick={this.handleHeaderClick}
|
||||
pinned={pinned}
|
||||
multiColumn={multiColumn}
|
||||
extraButton={followButton}
|
||||
showBackButton
|
||||
>
|
||||
{columnId && <ColumnSettingsContainer columnId={columnId} />}
|
||||
</ColumnHeader>
|
||||
|
||||
<StatusListContainer
|
||||
prepend={pinned ? null : <HashtagHeader tag={tag} disabled={!signedIn} onClick={this.handleFollow} />}
|
||||
alwaysPrepend
|
||||
trackScroll={!pinned}
|
||||
scrollKey={`hashtag_timeline-${columnId}`}
|
||||
timelineId={`hashtag:${id}${local ? ':local' : ''}`}
|
||||
@@ -245,4 +223,4 @@ class HashtagTimeline extends PureComponent {
|
||||
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(injectIntl(HashtagTimeline));
|
||||
export default connect(mapStateToProps)(HashtagTimeline);
|
||||
|
||||
@@ -13,7 +13,7 @@ import { openModal, closeModal } from 'mastodon/actions/modal';
|
||||
import api from 'mastodon/api';
|
||||
import Button from 'mastodon/components/button';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { registrationsOpen } from 'mastodon/initial_state';
|
||||
import { registrationsOpen, sso_redirect } from 'mastodon/initial_state';
|
||||
|
||||
const messages = defineMessages({
|
||||
loginPrompt: { id: 'interaction_modal.login.prompt', defaultMessage: 'Domain of your home server, e.g. mastodon.social' },
|
||||
@@ -21,12 +21,16 @@ const messages = defineMessages({
|
||||
|
||||
const mapStateToProps = (state, { accountId }) => ({
|
||||
displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']),
|
||||
signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up',
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
onSignupClick() {
|
||||
dispatch(closeModal());
|
||||
dispatch(openModal('CLOSED_REGISTRATIONS'));
|
||||
dispatch(closeModal({
|
||||
modalType: undefined,
|
||||
ignoreFocus: false,
|
||||
}));
|
||||
dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' }));
|
||||
},
|
||||
});
|
||||
|
||||
@@ -250,6 +254,9 @@ class LoginForm extends React.PureComponent {
|
||||
onFocus={this.handleFocus}
|
||||
onBlur={this.handleBlur}
|
||||
onKeyDown={this.handleKeyDown}
|
||||
autocomplete='off'
|
||||
autocapitalize='off'
|
||||
spellcheck='false'
|
||||
/>
|
||||
|
||||
<Button onClick={this.handleSubmit} disabled={isSubmitting}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
|
||||
@@ -291,6 +298,7 @@ class InteractionModal extends React.PureComponent {
|
||||
url: PropTypes.string,
|
||||
type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']),
|
||||
onSignupClick: PropTypes.func.isRequired,
|
||||
signupUrl: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
handleSignupClick = () => {
|
||||
@@ -298,7 +306,7 @@ class InteractionModal extends React.PureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { url, type, displayNameHtml } = this.props;
|
||||
const { url, type, displayNameHtml, signupUrl } = this.props;
|
||||
|
||||
const name = <bdi dangerouslySetInnerHTML={{ __html: displayNameHtml }} />;
|
||||
|
||||
@@ -329,9 +337,15 @@ class InteractionModal extends React.PureComponent {
|
||||
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
if (sso_redirect) {
|
||||
signupButton = (
|
||||
<a href='/auth/sign_up' className='link-button'>
|
||||
<a href={sso_redirect} data-method='post' className='link-button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
} else if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='link-button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
|
||||
@@ -29,7 +29,7 @@ const mapStateToProps = (state, { columnId }) => {
|
||||
const index = columns.findIndex(c => c.get('uuid') === uuid);
|
||||
const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']);
|
||||
const onlyRemote = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyRemote']) : state.getIn(['settings', 'public', 'other', 'onlyRemote']);
|
||||
const timelineState = state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`]);
|
||||
const timelineState = state.getIn(['timelines', `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`]);
|
||||
|
||||
return {
|
||||
hasUnread: !!timelineState && timelineState.get('unread') > 0,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { PureComponent } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import classnames from 'classnames';
|
||||
import classNames from 'classnames';
|
||||
|
||||
import Immutable from 'immutable';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
@@ -71,6 +71,7 @@ export default class Card extends PureComponent {
|
||||
if (!Immutable.is(this.props.card, nextProps.card)) {
|
||||
this.setState({ embedded: false, previewLoaded: false });
|
||||
}
|
||||
|
||||
if (this.props.sensitive !== nextProps.sensitive) {
|
||||
this.setState({ revealed: !nextProps.sensitive });
|
||||
}
|
||||
@@ -84,35 +85,8 @@ export default class Card extends PureComponent {
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
handlePhotoClick = () => {
|
||||
const { card, onOpenMedia } = this.props;
|
||||
|
||||
onOpenMedia(
|
||||
Immutable.fromJS([
|
||||
{
|
||||
type: 'image',
|
||||
url: card.get('embed_url'),
|
||||
description: card.get('title'),
|
||||
meta: {
|
||||
original: {
|
||||
width: card.get('width'),
|
||||
height: card.get('height'),
|
||||
},
|
||||
},
|
||||
},
|
||||
]),
|
||||
0,
|
||||
);
|
||||
};
|
||||
|
||||
handleEmbedClick = () => {
|
||||
const { card } = this.props;
|
||||
|
||||
if (card.get('type') === 'photo') {
|
||||
this.handlePhotoClick();
|
||||
} else {
|
||||
this.setState({ embedded: true });
|
||||
}
|
||||
this.setState({ embedded: true });
|
||||
};
|
||||
|
||||
setRef = c => {
|
||||
@@ -130,15 +104,15 @@ export default class Card extends PureComponent {
|
||||
};
|
||||
|
||||
renderVideo () {
|
||||
const { card } = this.props;
|
||||
const content = { __html: addAutoPlay(card.get('html')) };
|
||||
const { card } = this.props;
|
||||
const content = { __html: addAutoPlay(card.get('html')) };
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={this.setRef}
|
||||
className='status-card__image status-card-video'
|
||||
dangerouslySetInnerHTML={content}
|
||||
style={{ aspectRatio: `${card.get('width')} / ${card.get('height')}` }}
|
||||
style={{ aspectRatio: '16 / 9' }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -152,30 +126,40 @@ export default class Card extends PureComponent {
|
||||
}
|
||||
|
||||
const provider = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name');
|
||||
const interactive = card.get('type') !== 'link';
|
||||
const interactive = card.get('type') === 'video';
|
||||
const language = card.get('language') || '';
|
||||
const largeImage = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive;
|
||||
|
||||
const description = (
|
||||
<div className='status-card__content'>
|
||||
<span className='status-card__host'>
|
||||
<span lang={language}>{provider}</span>
|
||||
{card.get('published_at') && <> · <RelativeTimestamp timestamp={card.get('published_at')} /></>}
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<strong className='status-card__title' title={card.get('title')} lang={language}>{card.get('title')}</strong>
|
||||
{card.get('author_name').length > 0 && <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span>}
|
||||
|
||||
{card.get('author_name').length > 0 ? <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span> : <span className='status-card__description'>{card.get('description')}</span>}
|
||||
</div>
|
||||
);
|
||||
|
||||
const thumbnailStyle = {
|
||||
visibility: revealed ? null : 'hidden',
|
||||
aspectRatio: `${card.get('width')} / ${card.get('height')}`
|
||||
};
|
||||
|
||||
if (largeImage && card.get('type') === 'video') {
|
||||
thumbnailStyle.aspectRatio = `16 / 9`;
|
||||
} else if (largeImage) {
|
||||
thumbnailStyle.aspectRatio = '1.91 / 1';
|
||||
} else {
|
||||
thumbnailStyle.aspectRatio = 1;
|
||||
}
|
||||
|
||||
let embed;
|
||||
|
||||
let canvas = (
|
||||
<Blurhash
|
||||
className={classnames('status-card__image-preview', {
|
||||
className={classNames('status-card__image-preview', {
|
||||
'status-card__image-preview--hidden': revealed && this.state.previewLoaded,
|
||||
})}
|
||||
hash={card.get('blurhash')}
|
||||
@@ -183,7 +167,8 @@ export default class Card extends PureComponent {
|
||||
/>
|
||||
);
|
||||
|
||||
let thumbnail = <img src={card.get('image')} alt='' style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
const thumbnailDescription = card.get('image_description');
|
||||
const thumbnail = <img src={card.get('image')} alt={thumbnailDescription} title={thumbnailDescription} lang={language} style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
|
||||
let spoilerButton = (
|
||||
<button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
|
||||
@@ -195,7 +180,7 @@ export default class Card extends PureComponent {
|
||||
);
|
||||
|
||||
spoilerButton = (
|
||||
<div className={classnames('spoiler-button', { 'spoiler-button--minified': revealed })}>
|
||||
<div className={classNames('spoiler-button', { 'spoiler-button--minified': revealed })}>
|
||||
{spoilerButton}
|
||||
</div>
|
||||
);
|
||||
@@ -204,33 +189,25 @@ export default class Card extends PureComponent {
|
||||
if (embedded) {
|
||||
embed = this.renderVideo();
|
||||
} else {
|
||||
let iconVariant = 'play';
|
||||
|
||||
if (card.get('type') === 'photo') {
|
||||
iconVariant = 'search-plus';
|
||||
}
|
||||
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
|
||||
{revealed && (
|
||||
<div className='status-card__actions'>
|
||||
{revealed ? (
|
||||
<div className='status-card__actions' onClick={this.handleEmbedClick} role='none'>
|
||||
<div>
|
||||
<button type='button' onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
|
||||
<button type='button' onClick={this.handleEmbedClick}><Icon id='play' /></button>
|
||||
<a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!revealed && spoilerButton}
|
||||
) : spoilerButton}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='status-card' ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}>
|
||||
<div className={classNames('status-card', { expanded: largeImage })} ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}>
|
||||
{embed}
|
||||
<a href={card.get('url')} target='_blank' rel='noopener noreferrer'>{description}</a>
|
||||
</div>
|
||||
@@ -244,14 +221,14 @@ export default class Card extends PureComponent {
|
||||
);
|
||||
} else {
|
||||
embed = (
|
||||
<div className='status-card__image' style={{ aspectRatio: '1.9 / 1' }}>
|
||||
<div className='status-card__image'>
|
||||
<Icon id='file-text' />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<a href={card.get('url')} className='status-card' target='_blank' rel='noopener noreferrer' ref={this.setRef}>
|
||||
<a href={card.get('url')} className={classNames('status-card', { expanded: largeImage })} target='_blank' rel='noopener noreferrer' ref={this.setRef}>
|
||||
{embed}
|
||||
{description}
|
||||
</a>
|
||||
|
||||
@@ -10,6 +10,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
|
||||
import { AnimatedNumber } from 'mastodon/components/animated_number';
|
||||
import EditedTimestamp from 'mastodon/components/edited_timestamp';
|
||||
import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';
|
||||
|
||||
@@ -291,6 +292,9 @@ class DetailedStatus extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);
|
||||
const expanded = !status.get('hidden')
|
||||
|
||||
return (
|
||||
<div style={outerStyle}>
|
||||
<div ref={this.setRef} className={classNames('detailed-status', { compact })}>
|
||||
@@ -310,10 +314,13 @@ class DetailedStatus extends ImmutablePureComponent {
|
||||
expanded={!status.get('hidden')}
|
||||
onExpandedToggle={this.handleExpandedToggle}
|
||||
onTranslate={this.handleTranslate}
|
||||
{...statusContentProps}
|
||||
/>
|
||||
|
||||
{media}
|
||||
|
||||
{expanded && hashtagBar}
|
||||
|
||||
<div className='detailed-status__meta'>
|
||||
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
|
||||
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
|
||||
|
||||
@@ -568,7 +568,7 @@ class Status extends ImmutablePureComponent {
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType='thread'
|
||||
previousId={i > 0 && list.get(i - 1)}
|
||||
previousId={i > 0 ? list.get(i - 1) : undefined}
|
||||
nextId={list.get(i + 1) || (ancestors && statusId)}
|
||||
rootId={statusId}
|
||||
/>
|
||||
|
||||
@@ -434,4 +434,4 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps, null, {
|
||||
forwardRef: true,
|
||||
})(injectIntl(FocalPointModal, { withRef: true }));
|
||||
})(injectIntl(FocalPointModal, { forwardRef: true }));
|
||||
|
||||
@@ -12,7 +12,7 @@ import { fetchServer } from 'mastodon/actions/server';
|
||||
import { Avatar } from 'mastodon/components/avatar';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo';
|
||||
import { registrationsOpen, me } from 'mastodon/initial_state';
|
||||
import { registrationsOpen, me, sso_redirect } from 'mastodon/initial_state';
|
||||
|
||||
const Account = connect(state => ({
|
||||
account: state.getIn(['accounts', me]),
|
||||
@@ -73,28 +73,35 @@ class Header extends PureComponent {
|
||||
</>
|
||||
);
|
||||
} else {
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
if (sso_redirect) {
|
||||
content = (
|
||||
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
|
||||
)
|
||||
} else {
|
||||
signupButton = (
|
||||
<button className='button' onClick={openClosedRegistrationsModal}>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</button>
|
||||
let signupButton;
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button'>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</a>
|
||||
);
|
||||
} else {
|
||||
signupButton = (
|
||||
<button className='button' onClick={openClosedRegistrationsModal}>
|
||||
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
content = (
|
||||
<>
|
||||
{signupButton}
|
||||
<a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
content = (
|
||||
<>
|
||||
{signupButton}
|
||||
<a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -97,14 +97,7 @@ export default class ModalRoot extends PureComponent {
|
||||
|
||||
handleClose = (ignoreFocus = false) => {
|
||||
const { onClose } = this.props;
|
||||
let message = null;
|
||||
try {
|
||||
message = this._modal?.getWrappedInstance?.().getCloseConfirmationMessage?.();
|
||||
} catch (_) {
|
||||
// injectIntl defines `getWrappedInstance` but errors out if `withRef`
|
||||
// isn't set.
|
||||
// This would be much smoother with react-intl 3+ and `forwardRef`.
|
||||
}
|
||||
const message = this._modal?.getCloseConfirmationMessage?.();
|
||||
onClose(message, ignoreFocus);
|
||||
};
|
||||
|
||||
@@ -122,7 +115,10 @@ export default class ModalRoot extends PureComponent {
|
||||
{visible && (
|
||||
<>
|
||||
<BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}>
|
||||
{(SpecificComponent) => <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={this.setModalRef} />}
|
||||
{(SpecificComponent) => {
|
||||
const ref = typeof SpecificComponent !== 'function' ? this.setModalRef : undefined;
|
||||
return <SpecificComponent {...props} onChangeBackgroundColor={this.setBackgroundColor} onClose={this.handleClose} ref={ref} />
|
||||
}}
|
||||
</BundleContainer>
|
||||
|
||||
<Helmet>
|
||||
|
||||
@@ -62,7 +62,7 @@ class ReportModal extends ImmutablePureComponent {
|
||||
dispatch(submitReport({
|
||||
account_id: accountId,
|
||||
status_ids: selectedStatusIds.toArray(),
|
||||
selected_domains: selectedDomains.toArray(),
|
||||
forward_to_domains: selectedDomains.toArray(),
|
||||
comment,
|
||||
forward: selectedDomains.size > 0,
|
||||
category,
|
||||
|
||||
@@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl';
|
||||
|
||||
|
||||
import { openModal } from 'mastodon/actions/modal';
|
||||
import { registrationsOpen } from 'mastodon/initial_state';
|
||||
import { registrationsOpen, sso_redirect } from 'mastodon/initial_state';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
||||
const SignInBanner = () => {
|
||||
@@ -19,6 +19,15 @@ const SignInBanner = () => {
|
||||
|
||||
const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up');
|
||||
|
||||
if (sso_redirect) {
|
||||
return (
|
||||
<div className='sign-in-banner'>
|
||||
<p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p>
|
||||
<a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
if (registrationsOpen) {
|
||||
signupButton = (
|
||||
<a href={signupUrl} className='button button--block'>
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
* @property {boolean} use_blurhash
|
||||
* @property {boolean=} use_pending_items
|
||||
* @property {string} version
|
||||
* @property {string} sso_redirect
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -142,6 +143,7 @@ export const version = getMeta('version');
|
||||
export const languages = initialState?.languages;
|
||||
// @ts-expect-error
|
||||
export const statusPageUrl = getMeta('status_page_url');
|
||||
export const sso_redirect = getMeta('sso_redirect');
|
||||
|
||||
// Glitch-soc-specific settings
|
||||
export const maxChars = (initialState && initialState.max_toot_chars) || 500;
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
"home.column_settings.show_reblogs": "Wys aangestuurde plasings",
|
||||
"interaction_modal.description.reblog": "Met 'n rekening op Mastodon kan jy hierdie plasing aanstuur om dit met jou volgers te deel.",
|
||||
"interaction_modal.description.reply": "Met 'n rekening op Mastodon kan jy op hierdie plasing reageer.",
|
||||
"interaction_modal.preamble": "Omdat Mastodon gedesentraliseer is, hoef jy nie ’n rekening op hierdie bediener te hê nie. Jy kan jy jou bestaande Mastodonrekening gebruik, al word dit op 'n ander Mastodonbediener of versoenbare platform waar ook al gehuisves.",
|
||||
"interaction_modal.title.reblog": "Stuur {name} se plasing aan",
|
||||
"interaction_modal.title.reply": "Reageer op {name} se plasing",
|
||||
"keyboard_shortcuts.back": "Navigeer terug",
|
||||
|
||||
@@ -172,7 +172,6 @@
|
||||
"conversation.open": "Veyer conversación",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiau",
|
||||
"copypaste.copy": "Copiar",
|
||||
"directory.federated": "Dende lo fediverso conoixiu",
|
||||
"directory.local": "Nomás de {domain}",
|
||||
"directory.new_arrivals": "Recientment plegaus",
|
||||
@@ -276,7 +275,6 @@
|
||||
"interaction_modal.description.reply": "Con una cuenta en Mastodon, puetz responder a esta publicación.",
|
||||
"interaction_modal.on_another_server": "En un servidor diferent",
|
||||
"interaction_modal.on_this_server": "En este servidor",
|
||||
"interaction_modal.preamble": "Ya que Mastodon ye descentralizau, puetz usar la tuya cuenta existent alochada en unatro servidor Mastodon u plataforma compatible si no tiens una cuenta en este servidor.",
|
||||
"interaction_modal.title.follow": "Seguir a {name}",
|
||||
"interaction_modal.title.reblog": "Empentar la publicación de {name}",
|
||||
"interaction_modal.title.reply": "Responder a la publicación de {name}",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"about.rules": "قواعد الخادم",
|
||||
"account.account_note_header": "مُلاحظة",
|
||||
"account.add_or_remove_from_list": "الإضافة أو الإزالة من القائمة",
|
||||
"account.badges.bot": "بوت",
|
||||
"account.badges.bot": "آلي",
|
||||
"account.badges.group": "فريق",
|
||||
"account.block": "احجب @{name}",
|
||||
"account.block_domain": "حظر اسم النِّطاق {domain}",
|
||||
@@ -181,6 +181,7 @@
|
||||
"confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.",
|
||||
"confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
|
||||
"confirmations.redraft.confirm": "إزالة وإعادة الصياغة",
|
||||
"confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
|
||||
"confirmations.reply.confirm": "رد",
|
||||
"confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
|
||||
"confirmations.unfollow.confirm": "إلغاء المتابعة",
|
||||
@@ -190,7 +191,6 @@
|
||||
"conversation.open": "اعرض المحادثة",
|
||||
"conversation.with": "مع {names}",
|
||||
"copypaste.copied": "تم نسخه",
|
||||
"copypaste.copy": "انسخ",
|
||||
"copypaste.copy_to_clipboard": "نسخ إلى الحافظة",
|
||||
"directory.federated": "مِن الفديفرس المعروف",
|
||||
"directory.local": "مِن {domain} فقط",
|
||||
@@ -201,6 +201,7 @@
|
||||
"dismissable_banner.community_timeline": "هذه هي أحدث المشاركات العامة من الأشخاص الذين تُستضاف حساباتهم على {domain}.",
|
||||
"dismissable_banner.dismiss": "رفض",
|
||||
"dismissable_banner.explore_links": "هذه القصص الإخبارية يتحدث عنها حاليًا أشخاص على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.",
|
||||
"dismissable_banner.explore_statuses": "هذه هي المنشورات الرائجة على الشبكات الاجتماعيّة اليوم. تظهر المنشورات التي أعيد مشاركتها وحازت على مفضّلات أكثر في مرتبة عليا.",
|
||||
"dismissable_banner.explore_tags": "هذه الوسوم تكتسب جذب اهتمام الناس حاليًا على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.",
|
||||
"dismissable_banner.public_timeline": "هذه هي أحدث المنشورات العامة من الناس على الشبكة الاجتماعية التي يتبعها الناس على {domain}.",
|
||||
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
|
||||
@@ -229,6 +230,8 @@
|
||||
"empty_column.direct": "لم يتم الإشارة إليك بشكل خاص بعد. عندما تتلقى أو ترسل إشارة، سيتم عرضها هنا.",
|
||||
"empty_column.domain_blocks": "ليس هناك نطاقات تم حجبها بعد.",
|
||||
"empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!",
|
||||
"empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.",
|
||||
"empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
|
||||
"empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.",
|
||||
"empty_column.followed_tags": "لم تُتابع أي وسم بعدُ. ستظهر الوسوم هنا حينما تفعل ذلك.",
|
||||
"empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
|
||||
@@ -299,16 +302,22 @@
|
||||
"home.column_settings.basic": "الأساسية",
|
||||
"home.column_settings.show_reblogs": "اعرض الترقيات",
|
||||
"home.column_settings.show_replies": "اعرض الردود",
|
||||
"home.explore_prompt.body": "سوف تحتوي تغذية منزلك على مزيج من المشاركات من الوسوم التي اخترت متابعتها، والأشخاص الذين اخترت متابعتهم، والمشاركات التي قاموا بدعمها. الأمور تبدو هادئة جدا الآن، لذلك ماذا عن:",
|
||||
"home.explore_prompt.body": "سوف يحتوي خيط أخبارك الرئيسي على مزيج من المشاركات من الوسوم التي اخترت متابعتها، والأشخاص الذين اخترت متابعتهم، والمنشورات التي قاموا بدعمها. ومع ذلك، إن كانت تبدو الأمور هادئة جدا، ماذا لو:",
|
||||
"home.explore_prompt.title": "هذا مقرك الرئيسي داخل ماستدون.",
|
||||
"home.hide_announcements": "إخفاء الإعلانات",
|
||||
"home.show_announcements": "إظهار الإعلانات",
|
||||
"interaction_modal.description.favourite": "بفضل حساب على ماستدون، يمكنك إضافة هذا المنشور إلى مفضلتك لإبلاغ الناشر عن تقديرك وكذا للاحتفاظ بالمنشور إلى وقت لاحق.",
|
||||
"interaction_modal.description.follow": "مع حساب في ماستدون، يمكنك متابعة {name} وتلقي منشوراته على خيطك الرئيس.",
|
||||
"interaction_modal.description.reblog": "مع حساب في ماستدون، يمكنك تعزيز هذا المنشور ومشاركته مع مُتابِعيك.",
|
||||
"interaction_modal.description.reply": "مع حساب في ماستدون، يمكنك الرد على هذا المنشور.",
|
||||
"interaction_modal.login.action": "خذني إلى خادمي",
|
||||
"interaction_modal.login.prompt": "نطاق الخادم الخاص بك، على سبيل المثال mastodon.social",
|
||||
"interaction_modal.no_account_yet": "ليست على ماستدون بعد؟",
|
||||
"interaction_modal.on_another_server": "على خادم مختلف",
|
||||
"interaction_modal.on_this_server": "على هذا الخادم",
|
||||
"interaction_modal.preamble": "بما إن ماستدون لامركزي، يمكنك استخدام حسابك الحالي المستضاف بواسطة خادم ماستدون آخر أو منصة متوافقة إذا لم يكن لديك حساب هنا.",
|
||||
"interaction_modal.sign_in": "لم تقم بتسجيل الدخول إلى هذا الخادم. أين هو مستضاف حسابك؟",
|
||||
"interaction_modal.sign_in_hint": "تلميح: هذا هو الموقع الذي سجّلت عن طريقه. إن لم تتذكّر/ين اسم الموقع، يمكنك البحث عن الرسالة الترحيبيّة في بريدك الالكتروني. يمكنك أيضاً استخدام إسم المستخدم/ـة الكامل! (مثلاً: @Mastadon@mastadon.social)",
|
||||
"interaction_modal.title.favourite": "إضافة منشور {name} إلى المفضلة",
|
||||
"interaction_modal.title.follow": "اتبع {name}",
|
||||
"interaction_modal.title.reblog": "مشاركة منشور {name}",
|
||||
"interaction_modal.title.reply": "الرد على منشور {name}",
|
||||
@@ -324,6 +333,8 @@
|
||||
"keyboard_shortcuts.direct": "to open direct messages column",
|
||||
"keyboard_shortcuts.down": "للانتقال إلى أسفل القائمة",
|
||||
"keyboard_shortcuts.enter": "لفتح المنشور",
|
||||
"keyboard_shortcuts.favourite": "لإضافة المنشور إلى المفضلة",
|
||||
"keyboard_shortcuts.favourites": "لفتح قائمة المفضلات",
|
||||
"keyboard_shortcuts.federated": "لفتح الخيط الزمني الفديرالي",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "لفتح الخيط الرئيسي",
|
||||
@@ -354,6 +365,7 @@
|
||||
"lightbox.previous": "العودة",
|
||||
"limited_account_hint.action": "إظهار الملف التعريفي على أي حال",
|
||||
"limited_account_hint.title": "تم إخفاء هذا الملف الشخصي من قبل مشرفي {domain}.",
|
||||
"link_preview.author": "مِن {name}",
|
||||
"lists.account.add": "أضف إلى القائمة",
|
||||
"lists.account.remove": "احذف من القائمة",
|
||||
"lists.delete": "احذف القائمة",
|
||||
@@ -376,6 +388,7 @@
|
||||
"mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟",
|
||||
"mute_modal.indefinite": "إلى أجل غير مسمى",
|
||||
"navigation_bar.about": "عن",
|
||||
"navigation_bar.advanced_interface": "افتحه في واجهة الويب المتقدمة",
|
||||
"navigation_bar.blocks": "الحسابات المحجوبة",
|
||||
"navigation_bar.bookmarks": "الفواصل المرجعية",
|
||||
"navigation_bar.community_timeline": "الخيط المحلي",
|
||||
@@ -385,6 +398,7 @@
|
||||
"navigation_bar.domain_blocks": "النطاقات المحظورة",
|
||||
"navigation_bar.edit_profile": "عدّل الملف التعريفي",
|
||||
"navigation_bar.explore": "استكشف",
|
||||
"navigation_bar.favourites": "المفضلة",
|
||||
"navigation_bar.filters": "الكلمات المكتومة",
|
||||
"navigation_bar.follow_requests": "طلبات المتابعة",
|
||||
"navigation_bar.followed_tags": "الوسوم المتابَعة",
|
||||
@@ -401,6 +415,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "تحتاج إلى تسجيل الدخول للوصول إلى هذا المصدر.",
|
||||
"notification.admin.report": "{name} أبلغ عن {target}",
|
||||
"notification.admin.sign_up": "أنشأ {name} حسابًا",
|
||||
"notification.favourite": "أضاف {name} منشورك إلى مفضلته",
|
||||
"notification.follow": "{name} يتابعك",
|
||||
"notification.follow_request": "لقد طلب {name} متابعتك",
|
||||
"notification.mention": "{name} ذكرك",
|
||||
@@ -414,6 +429,7 @@
|
||||
"notifications.column_settings.admin.report": "التقارير الجديدة:",
|
||||
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
|
||||
"notifications.column_settings.alert": "إشعارات سطح المكتب",
|
||||
"notifications.column_settings.favourite": "المفضلة:",
|
||||
"notifications.column_settings.filter_bar.advanced": "اعرض كافة الفئات",
|
||||
"notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة",
|
||||
"notifications.column_settings.filter_bar.show_bar": "إظهار شريط التصفية",
|
||||
@@ -431,6 +447,7 @@
|
||||
"notifications.column_settings.update": "التعديلات:",
|
||||
"notifications.filter.all": "الكل",
|
||||
"notifications.filter.boosts": "الترقيات",
|
||||
"notifications.filter.favourites": "المفضلة",
|
||||
"notifications.filter.follows": "يتابِع",
|
||||
"notifications.filter.mentions": "الإشارات",
|
||||
"notifications.filter.polls": "نتائج استطلاع الرأي",
|
||||
@@ -581,6 +598,8 @@
|
||||
"server_banner.server_stats": "إحصائيات الخادم:",
|
||||
"sign_in_banner.create_account": "أنشئ حسابًا",
|
||||
"sign_in_banner.sign_in": "تسجيل الدخول",
|
||||
"sign_in_banner.sso_redirect": "تسجيل الدخول أو إنشاء حساب",
|
||||
"sign_in_banner.text": "قم بالولوج بحسابك لمتابعة الصفحات الشخصية أو الوسوم، أو لإضافة المنشورات إلى المفضلة ومشاركتها والرد عليها أو التفاعل بواسطة حسابك المتواجد على خادم مختلف.",
|
||||
"status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
|
||||
"status.admin_domain": "فتح واجهة الإشراف لـ {domain}",
|
||||
"status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
|
||||
@@ -597,6 +616,7 @@
|
||||
"status.edited": "عُدّل في {date}",
|
||||
"status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
|
||||
"status.embed": "إدماج",
|
||||
"status.favourite": "فضّل",
|
||||
"status.filter": "تصفية هذه الرسالة",
|
||||
"status.filtered": "مُصفّى",
|
||||
"status.hide": "إخفاء المنشور",
|
||||
|
||||
@@ -133,7 +133,6 @@
|
||||
"conversation.open": "Ver la conversación",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copióse",
|
||||
"copypaste.copy": "Copiar",
|
||||
"directory.federated": "Del fediversu conocíu",
|
||||
"directory.local": "De «{domain}» namás",
|
||||
"directory.new_arrivals": "Cuentes nueves",
|
||||
@@ -213,6 +212,7 @@
|
||||
"hashtag.column_header.tag_mode.none": "ensin {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "Nun s'atopó nenguna suxerencia",
|
||||
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||
"hashtag.follow": "Siguir a la etiqueta",
|
||||
"hashtag.unfollow": "Dexar de siguir a la etiqueta",
|
||||
"home.column_settings.basic": "Configuración básica",
|
||||
@@ -223,7 +223,6 @@
|
||||
"interaction_modal.description.reply": "Con una cuenta de Mastodon, pues responder a esti artículu.",
|
||||
"interaction_modal.on_another_server": "N'otru sirvidor",
|
||||
"interaction_modal.on_this_server": "Nesti sirvidor",
|
||||
"interaction_modal.preamble": "Darréu que Mastodon ye una rede social descentralizada, pues usar una cuenta agospiada n'otru sirvidor de Mastodon o n'otra plataforma compatible si nun tienes cuenta nesti sirvidor.",
|
||||
"interaction_modal.title.reply": "Rempuesta al artículu de: {name}",
|
||||
"intervals.full.days": "{number, plural, one {# día} other {# díes}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
|
||||
@@ -420,6 +419,7 @@
|
||||
"server_banner.learn_more": "Saber más",
|
||||
"server_banner.server_stats": "Estadístiques del sirvidor:",
|
||||
"sign_in_banner.create_account": "Crear una cuenta",
|
||||
"sign_in_banner.sso_redirect": "Aniciar la sesión o rexistrase",
|
||||
"status.admin_account": "Abrir la interfaz de moderación pa @{name}",
|
||||
"status.admin_domain": "Abrir la interfaz de moderación pa «{domain}»",
|
||||
"status.admin_status": "Abrir esti artículu na interfaz de moderación",
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
"column.direct": "Асабістыя згадванні",
|
||||
"column.directory": "Праглядзець профілі",
|
||||
"column.domain_blocks": "Заблакіраваныя дамены",
|
||||
"column.favourites": "Упадабанае",
|
||||
"column.firehose": "Стужкі",
|
||||
"column.follow_requests": "Запыты на падпіску",
|
||||
"column.home": "Галоўная",
|
||||
@@ -180,6 +181,7 @@
|
||||
"confirmations.mute.explanation": "Гэта схавае допісы ад гэтага карыстальніка і пра яго, але ўсё яшчэ дазволіць яму чытаць вашыя допісы і быць падпісаным на вас.",
|
||||
"confirmations.mute.message": "Вы ўпэўненыя, што хочаце ігнараваць {name}?",
|
||||
"confirmations.redraft.confirm": "Выдаліць і перапісаць",
|
||||
"confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.",
|
||||
"confirmations.reply.confirm": "Адказаць",
|
||||
"confirmations.reply.message": "Калі вы адкажаце зараз, гэта ператрэ паведамленне, якое вы пішаце. Вы ўпэўнены, што хочаце працягнуць?",
|
||||
"confirmations.unfollow.confirm": "Адпісацца",
|
||||
@@ -189,7 +191,6 @@
|
||||
"conversation.open": "Прагледзець размову",
|
||||
"conversation.with": "З {names}",
|
||||
"copypaste.copied": "Скапіравана",
|
||||
"copypaste.copy": "Скапіраваць",
|
||||
"copypaste.copy_to_clipboard": "Капіраваць у буфер абмену",
|
||||
"directory.federated": "З вядомага федэсвету",
|
||||
"directory.local": "Толькі з {domain}",
|
||||
@@ -200,6 +201,7 @@
|
||||
"dismissable_banner.community_timeline": "Гэта самыя апошнія допісы ад людзей, уліковыя запісы якіх размяшчаюцца на {domain}.",
|
||||
"dismissable_banner.dismiss": "Адхіліць",
|
||||
"dismissable_banner.explore_links": "Гэтыя навіны абмяркоўваюцца прама зараз на гэтым і іншых серверах дэцэнтралізаванай сеткі.",
|
||||
"dismissable_banner.explore_statuses": "Допісы з гэтага і іншых сервераў дэцэнтралізаванай сеткі, якія набіраюць папулярнасць прама зараз.",
|
||||
"dismissable_banner.explore_tags": "Гэтыя хэштэгі зараз набіраюць папулярнасць сярод людзей на гэтым і іншых серверах дэцэнтралізаванай сеткі",
|
||||
"dismissable_banner.public_timeline": "Гэта апошнія публічныя допісы людзей з усей сеткі, за якімі сочаць карыстальнікі {domain}.",
|
||||
"embed.instructions": "Убудуйце гэты пост на свой сайт, скапіраваўшы прыведзены ніжэй код",
|
||||
@@ -228,6 +230,8 @@
|
||||
"empty_column.direct": "Пакуль у вас няма асабістых згадак. Калі вы дашляце або атрымаеце штось, яно з'явіцца тут.",
|
||||
"empty_column.domain_blocks": "Заблакіраваных даменаў пакуль няма.",
|
||||
"empty_column.explore_statuses": "Зараз не ў трэндзе. Праверце пазней",
|
||||
"empty_column.favourited_statuses": "Вы яшчэ не ўпадабалі ніводны допіс. Калі гэта адбудзецца, вы ўбачыце яго тут.",
|
||||
"empty_column.favourites": "Ніхто яшчэ не ўпадабаў гэты допіс. Калі гэта адбудзецца, вы ўбачыце гэтых людзей тут.",
|
||||
"empty_column.follow_requests": "У вас яшчэ няма запытаў на падпіскуі. Калі вы атрымаеце запыт, ён з'явяцца тут.",
|
||||
"empty_column.followed_tags": "Вы пакуль не падпісаны ні на адзін хэштэг. Калі падпішацеся, яны з'явяцца тут.",
|
||||
"empty_column.hashtag": "Па гэтаму хэштэгу пакуль што нічога няма.",
|
||||
@@ -291,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Любы",
|
||||
"hashtag.column_settings.tag_mode.none": "Нічога з пералічанага",
|
||||
"hashtag.column_settings.tag_toggle": "Уключыць дадатковыя тэгі для гэтай калонкі",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} удзельнік} few {{counter} удзельніка} many {{counter} удзельнікаў} other {{counter} удзельніка}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}} за сёння",
|
||||
"hashtag.follow": "Падпісацца на хэштэг",
|
||||
"hashtag.unfollow": "Адпісацца ад хэштэга",
|
||||
"home.actions.go_to_explore": "Паглядзіце, што ў трэндзе",
|
||||
@@ -302,12 +309,18 @@
|
||||
"home.explore_prompt.title": "Гэта ваша апорная кропка ў Mastodon.",
|
||||
"home.hide_announcements": "Схаваць аб'явы",
|
||||
"home.show_announcements": "Паказаць аб'явы",
|
||||
"interaction_modal.description.favourite": "Маючы ўліковы запіс Mastodon, вы можаце ўпадабаць гэты допіс, каб паведаміць аўтару, што ён вам падабаецца, і захаваць яго на будучыню.",
|
||||
"interaction_modal.description.follow": "Маючы акаўнт у Mastodon, вы можаце падпісацца на {name}, каб бачыць яго/яе допісы ў сваёй хатняй стужцы.",
|
||||
"interaction_modal.description.reblog": "З уліковым запісам Mastodon, вы можаце пашырыць гэты пост, каб падзяліцца ім са сваімі падпісчыкамі.",
|
||||
"interaction_modal.description.reply": "Маючы акаўнт у Mastodon, вы можаце адказаць на гэты пост.",
|
||||
"interaction_modal.login.action": "Вярніце мяне дадому",
|
||||
"interaction_modal.login.prompt": "Дамен вашага хатняга сервера, напрыклад, mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Яшчэ не ў Mastodon?",
|
||||
"interaction_modal.on_another_server": "На іншым серверы",
|
||||
"interaction_modal.on_this_server": "На гэтым серверы",
|
||||
"interaction_modal.preamble": "Паколькі Mastodon дэцэнтралізаваны, вы можаце выкарыстоўваць існуючы акаўнт, які быў створаны на іншым серверы Mastodon або на сумяшчальнай платформе, калі ў вас пакуль няма акаўнта тут.",
|
||||
"interaction_modal.sign_in": "Вы не выканалі ўваход на гэтым серверы. Дзе размешчаны ваш уліковы запіс?",
|
||||
"interaction_modal.sign_in_hint": "Падказка: гэта сайт, на якім вы зарэгістраваліся. Калі вы не памятаеце, знайдзіце ліст у паштовай скрыні. Вы таксама можаце ўвесці сваё поўнае імя карыстальніка! (напрыклад, @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Упадабаць допіс {name}",
|
||||
"interaction_modal.title.follow": "Падпісацца на {name}",
|
||||
"interaction_modal.title.reblog": "Пашырыць допіс ад {name}",
|
||||
"interaction_modal.title.reply": "Адказаць на допіс {name}",
|
||||
@@ -323,6 +336,8 @@
|
||||
"keyboard_shortcuts.direct": "адкрыць стоўп асабістых згадак",
|
||||
"keyboard_shortcuts.down": "Перамясціцца ўніз па спісе",
|
||||
"keyboard_shortcuts.enter": "Адкрыць допіс",
|
||||
"keyboard_shortcuts.favourite": "Упадабаць допіс",
|
||||
"keyboard_shortcuts.favourites": "Адкрыць спіс упадабанага",
|
||||
"keyboard_shortcuts.federated": "Адкрыць інтэграваную стужку",
|
||||
"keyboard_shortcuts.heading": "Спалучэнні клавіш",
|
||||
"keyboard_shortcuts.home": "Адкрыць хатнюю храналагічную стужку",
|
||||
@@ -353,6 +368,7 @@
|
||||
"lightbox.previous": "Назад",
|
||||
"limited_account_hint.action": "Усе роўна паказваць профіль",
|
||||
"limited_account_hint.title": "Гэты профіль быў схаваны мадэратарамі",
|
||||
"link_preview.author": "Ад {name}",
|
||||
"lists.account.add": "Дадаць да спісу",
|
||||
"lists.account.remove": "Выдаліць са спісу",
|
||||
"lists.delete": "Выдаліць спіс",
|
||||
@@ -375,6 +391,7 @@
|
||||
"mute_modal.hide_notifications": "Схаваць апавяшчэнні ад гэтага карыстальніка?",
|
||||
"mute_modal.indefinite": "Бестэрмінова",
|
||||
"navigation_bar.about": "Пра нас",
|
||||
"navigation_bar.advanced_interface": "Адкрыць у пашыраным вэб-інтэрфейсе",
|
||||
"navigation_bar.blocks": "Заблакаваныя карыстальнікі",
|
||||
"navigation_bar.bookmarks": "Закладкі",
|
||||
"navigation_bar.community_timeline": "Лакальная стужка",
|
||||
@@ -384,6 +401,7 @@
|
||||
"navigation_bar.domain_blocks": "Заблакіраваныя дамены",
|
||||
"navigation_bar.edit_profile": "Рэдагаваць профіль",
|
||||
"navigation_bar.explore": "Агляд",
|
||||
"navigation_bar.favourites": "Упадабанае",
|
||||
"navigation_bar.filters": "Ігнараваныя словы",
|
||||
"navigation_bar.follow_requests": "Запыты на падпіску",
|
||||
"navigation_bar.followed_tags": "Падпіскі",
|
||||
@@ -400,6 +418,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Вам трэба ўвайсці каб атрымаць доступ да гэтага рэсурсу.",
|
||||
"notification.admin.report": "{name} паскардзіўся на {target}",
|
||||
"notification.admin.sign_up": "{name} зарэгістраваўся",
|
||||
"notification.favourite": "Ваш допіс упадабаны {name}",
|
||||
"notification.follow": "{name} падпісаўся на вас",
|
||||
"notification.follow_request": "{name} адправіў запыт на падпіску",
|
||||
"notification.mention": "{name} згадаў вас",
|
||||
@@ -413,6 +432,7 @@
|
||||
"notifications.column_settings.admin.report": "Новыя скаргі:",
|
||||
"notifications.column_settings.admin.sign_up": "Новыя ўваходы:",
|
||||
"notifications.column_settings.alert": "Апавяшчэнні на працоўным стале",
|
||||
"notifications.column_settings.favourite": "Упадабанае:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Паказваць усе катэгорыі",
|
||||
"notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Паказваць панэль фільтрацыі",
|
||||
@@ -430,6 +450,7 @@
|
||||
"notifications.column_settings.update": "Праўкі:",
|
||||
"notifications.filter.all": "Усе",
|
||||
"notifications.filter.boosts": "Пашырэнні",
|
||||
"notifications.filter.favourites": "Упадабанае",
|
||||
"notifications.filter.follows": "Падпісаны на",
|
||||
"notifications.filter.mentions": "Згадванні",
|
||||
"notifications.filter.polls": "Вынікі апытання",
|
||||
@@ -580,6 +601,8 @@
|
||||
"server_banner.server_stats": "Статыстыка сервера:",
|
||||
"sign_in_banner.create_account": "Стварыць уліковы запіс",
|
||||
"sign_in_banner.sign_in": "Увайсці",
|
||||
"sign_in_banner.sso_redirect": "Уваход ці рэгістрацыя",
|
||||
"sign_in_banner.text": "Увайдзіце, каб падпісацца на людзей і тэгі, каб адказваць на допісы, дзяліцца імі і падабаць іх, альбо кантактаваць з вашага ўліковага запісу на іншым серверы.",
|
||||
"status.admin_account": "Адкрыць інтэрфейс мадэратара для @{name}",
|
||||
"status.admin_domain": "Адкрыць інтэрфейс мадэратара для {domain}",
|
||||
"status.admin_status": "Адкрыць гэты допіс у інтэрфейсе мадэрацыі",
|
||||
@@ -596,6 +619,7 @@
|
||||
"status.edited": "Адрэдагавана {date}",
|
||||
"status.edited_x_times": "Рэдагавана {count, plural, one {{count} раз} few {{count} разы} many {{count} разоў} other {{count} разу}}",
|
||||
"status.embed": "Убудаваць",
|
||||
"status.favourite": "Упадабанае",
|
||||
"status.filter": "Фільтраваць гэты допіс",
|
||||
"status.filtered": "Адфільтравана",
|
||||
"status.hide": "Схаваць допіс",
|
||||
|
||||
@@ -189,7 +189,6 @@
|
||||
"conversation.open": "Преглед на разговора",
|
||||
"conversation.with": "С {names}",
|
||||
"copypaste.copied": "Копирано",
|
||||
"copypaste.copy": "Копиране",
|
||||
"copypaste.copy_to_clipboard": "Копиране в буферната памет",
|
||||
"directory.federated": "От позната федивселена",
|
||||
"directory.local": "Само от {domain}",
|
||||
@@ -298,7 +297,6 @@
|
||||
"home.column_settings.basic": "Основно",
|
||||
"home.column_settings.show_reblogs": "Показване на подсилванията",
|
||||
"home.column_settings.show_replies": "Показване на отговорите",
|
||||
"home.explore_prompt.body": "Вашият начален инфоканал ще е смес на публикации от хаштаговете, които сте избрали да следвате, избраните хора за следвате, а и публикациите, които са подсилили. Изглежда доста тихо в момента, така че какво ще кажете за:",
|
||||
"home.explore_prompt.title": "Това е началната ви база с Mastodon.",
|
||||
"home.hide_announcements": "Скриване на оповестяванията",
|
||||
"home.show_announcements": "Показване на оповестяванията",
|
||||
@@ -307,7 +305,6 @@
|
||||
"interaction_modal.description.reply": "С акаунт в Mastodon може да добавите отговор към тази публикация.",
|
||||
"interaction_modal.on_another_server": "На различен сървър",
|
||||
"interaction_modal.on_this_server": "На този сървър",
|
||||
"interaction_modal.preamble": "Откак Mastodon е децентрализиран, може да употребявате съществуващ акаунт, разположен на друг сървър на Mastodon или съвместима платформа, ако нямате акаунт на този сървър.",
|
||||
"interaction_modal.title.follow": "Последване на {name}",
|
||||
"interaction_modal.title.reblog": "Подсилване на публикацията на {name}",
|
||||
"interaction_modal.title.reply": "Отговаряне на публикацията на {name}",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"account.badges.group": "Strollad",
|
||||
"account.block": "Stankañ @{name}",
|
||||
"account.block_domain": "Stankañ an domani {domain}",
|
||||
"account.block_short": "Stankañ",
|
||||
"account.blocked": "Stanket",
|
||||
"account.browse_more_on_origin_server": "Furchal pelloc'h war ar profil orin",
|
||||
"account.cancel_follow_request": "Nullañ ar reked heuliañ",
|
||||
@@ -46,6 +47,8 @@
|
||||
"account.mention": "Menegiñ @{name}",
|
||||
"account.moved_to": "Gant {name} eo bet merket e oa bremañ h·e gont nevez :",
|
||||
"account.mute": "Kuzhat @{name}",
|
||||
"account.mute_notifications_short": "Kuzhat ar c'hemennoù",
|
||||
"account.mute_short": "Kuzhat",
|
||||
"account.muted": "Kuzhet",
|
||||
"account.open_original_page": "Digeriñ ar bajenn orin",
|
||||
"account.posts": "Toudoù",
|
||||
@@ -171,7 +174,6 @@
|
||||
"conversation.open": "Gwelout ar gaozeadenn",
|
||||
"conversation.with": "Gant {names}",
|
||||
"copypaste.copied": "Eilet",
|
||||
"copypaste.copy": "Eilañ",
|
||||
"directory.federated": "Eus ar fedibed anavezet",
|
||||
"directory.local": "Eus {domain} hepken",
|
||||
"directory.new_arrivals": "Degouezhet a-nevez",
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
"admin.impact_report.instance_followers": "Seguidors que els nostres usuaris perdrien",
|
||||
"admin.impact_report.instance_follows": "Seguidors que els seus usuaris perdrien",
|
||||
"admin.impact_report.title": "Resum del impacte",
|
||||
"alert.rate_limited.message": "Si us plau prova-ho després de {retry_time, time, medium}.",
|
||||
"alert.rate_limited.message": "Proveu-ho una altra vegada al cap de {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Límit de freqüència",
|
||||
"alert.unexpected.message": "S'ha produït un error inesperat.",
|
||||
"alert.unexpected.title": "Vaja!",
|
||||
@@ -114,7 +114,7 @@
|
||||
"column.directory": "Navega pels perfils",
|
||||
"column.domain_blocks": "Dominis blocats",
|
||||
"column.favourites": "Favorits",
|
||||
"column.firehose": "Fluxos en directe",
|
||||
"column.firehose": "Tuts en directe",
|
||||
"column.follow_requests": "Peticions de seguir-te",
|
||||
"column.home": "Inici",
|
||||
"column.lists": "Llistes",
|
||||
@@ -138,11 +138,11 @@
|
||||
"compose.published.body": "Tut publicat.",
|
||||
"compose.published.open": "Obre",
|
||||
"compose_form.direct_message_warning_learn_more": "Més informació",
|
||||
"compose_form.encryption_warning": "Els tuts a Mastodon no estant xifrats punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
|
||||
"compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
|
||||
"compose_form.hashtag_warning": "Aquest tut no apareixerà a les llistes d'etiquetes perquè no és públic. Només els tuts públics apareixen a les cerques per etiqueta.",
|
||||
"compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.",
|
||||
"compose_form.lock_disclaimer.lock": "blocat",
|
||||
"compose_form.placeholder": "En què penses?",
|
||||
"compose_form.placeholder": "Què tens al cap?",
|
||||
"compose_form.poll.add_option": "Afegeix una opció",
|
||||
"compose_form.poll.duration": "Durada de l'enquesta",
|
||||
"compose_form.poll.option_placeholder": "Opció {number}",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Mostra la conversa",
|
||||
"conversation.with": "Amb {names}",
|
||||
"copypaste.copied": "Copiat",
|
||||
"copypaste.copy": "Copia",
|
||||
"copypaste.copy_to_clipboard": "Copia al porta-retalls",
|
||||
"directory.federated": "Del fedivers conegut",
|
||||
"directory.local": "Només de {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Qualsevol d’aquests",
|
||||
"hashtag.column_settings.tag_mode.none": "Cap d’aquests",
|
||||
"hashtag.column_settings.tag_toggle": "Inclou etiquetes addicionals per a aquesta columna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} tut} other {{counter} tuts}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} avui",
|
||||
"hashtag.follow": "Segueix l'etiqueta",
|
||||
"hashtag.unfollow": "Deixa de seguir l'etiqueta",
|
||||
"home.actions.go_to_explore": "Mira què és tendència",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Bàsic",
|
||||
"home.column_settings.show_reblogs": "Mostra els impulsos",
|
||||
"home.column_settings.show_replies": "Mostra les respostes",
|
||||
"home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que impulsen. Ara mateix es veu força tranquila, què et sembla si:",
|
||||
"home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que s'impulsen. Ara mateix es veu força tranquil·la, què et sembla si:",
|
||||
"home.explore_prompt.title": "Aquest és la teva base a Mastodon.",
|
||||
"home.hide_announcements": "Amaga els anuncis",
|
||||
"home.show_announcements": "Mostra els anuncis",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.",
|
||||
"interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquest tut per a compartir-lo amb els teus seguidors.",
|
||||
"interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquest tut.",
|
||||
"interaction_modal.login.action": "Torna a l'inici",
|
||||
"interaction_modal.login.prompt": "Domini del teu servidor domèstic, p.ex. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "No a Mastodon?",
|
||||
"interaction_modal.on_another_server": "En un servidor diferent",
|
||||
"interaction_modal.on_this_server": "En aquest servidor",
|
||||
"interaction_modal.other_server_instructions": "Copia i enganxa aquest URL en el camp de cerca de la teva aplicació Mastodon preferida o a la interfície web del teu servidor Mastodon.",
|
||||
"interaction_modal.preamble": "Com que Mastodon és descentralitzat, pots fer servir el teu compte existent en un altre servidor Mastodon o plataforma compatible si no tens compte en aquest.",
|
||||
"interaction_modal.sign_in": "No has iniciat sessió en aquest servidor. On tens el teu compte?",
|
||||
"interaction_modal.sign_in_hint": "Ajuda: Aquesta és la web on vas registrar-te. Si no ho recordes, mira el correu electrònic de benvinguda en la teva safata d'entrada. També pots introduïr el teu nom d'usuari complet! (per ex. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Afavoreix el tut de {name}",
|
||||
"interaction_modal.title.follow": "Segueix {name}",
|
||||
"interaction_modal.title.reblog": "Impulsa el tut de {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Estadístiques del servidor:",
|
||||
"sign_in_banner.create_account": "Crea un compte",
|
||||
"sign_in_banner.sign_in": "Inici de sessió",
|
||||
"sign_in_banner.sso_redirect": "Inici de sessió o Registre",
|
||||
"sign_in_banner.text": "Inicia la sessió per a seguir perfils o etiquetes, afavorir, compartir i respondre tuts. També pots interactuar des del teu compte a un servidor diferent.",
|
||||
"status.admin_account": "Obre la interfície de moderació per a @{name}",
|
||||
"status.admin_domain": "Obre la interfície de moderació per a @{domain}",
|
||||
|
||||
@@ -176,7 +176,6 @@
|
||||
"conversation.open": "نیشاندان گفتوگۆ",
|
||||
"conversation.with": "لەگەڵ{names}",
|
||||
"copypaste.copied": "کۆپی کراوە",
|
||||
"copypaste.copy": "ڕوونووس",
|
||||
"directory.federated": "لە ڕاژەکانی ناسراو",
|
||||
"directory.local": "تەنها لە {domain}",
|
||||
"directory.new_arrivals": "تازە گەیشتنەکان",
|
||||
@@ -284,7 +283,6 @@
|
||||
"interaction_modal.description.reply": "بە هەژمارێک لەسەر ماستدۆن، ئەتوانیت وەڵامی ئەم بڵاوکراوەیە بدەیتەوە.",
|
||||
"interaction_modal.on_another_server": "لەسەر ڕاژەیەکی جیا",
|
||||
"interaction_modal.on_this_server": "لەسەر ئەم ڕاژەیە",
|
||||
"interaction_modal.preamble": "بەو پێیەی ماستۆدۆن لامەرکەزییە، دەتوانیت ئەکاونتی ئێستات بەکاربهێنیت کە لەلایەن سێرڤەرێکی تری ماستۆدۆن یان پلاتفۆرمی گونجاوەوە هۆست کراوە ئەگەر ئەکاونتێکت لەسەر ئەم ئەکاونتە نەبێت.",
|
||||
"interaction_modal.title.follow": "دوای {name} بکەوە",
|
||||
"interaction_modal.title.reblog": "پۆستی {name} زیاد بکە",
|
||||
"interaction_modal.title.reply": "وەڵامی پۆستەکەی {name} بدەرەوە",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Zobrazit konverzaci",
|
||||
"conversation.with": "S {names}",
|
||||
"copypaste.copied": "Zkopírováno",
|
||||
"copypaste.copy": "Zkopírovat",
|
||||
"copypaste.copy_to_clipboard": "Zkopírovat do schránky",
|
||||
"directory.federated": "Ze známého fedivesmíru",
|
||||
"directory.local": "Pouze z {domain}",
|
||||
@@ -202,7 +201,9 @@
|
||||
"dismissable_banner.community_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí, jejichž účty hostuje {domain}.",
|
||||
"dismissable_banner.dismiss": "Zavřít",
|
||||
"dismissable_banner.explore_links": "O těchto zprávách hovoří lidé na tomto a dalších serverech decentralizované sítě právě teď.",
|
||||
"dismissable_banner.explore_statuses": "Toto jsou příspěvky ze sociálních sítí, které dnes získávají na popularitě. Novější příspěvky s větším počtem boostů a oblíbení jsou hodnoceny výše.",
|
||||
"dismissable_banner.explore_tags": "Tyto hashtagy právě teď získávají na popularitě mezi lidmi na tomto a dalších serverech decentralizované sítě.",
|
||||
"dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na sociální síti, které sledují lidé na {domain}.",
|
||||
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
|
||||
"embed.preview": "Takhle to bude vypadat:",
|
||||
"emoji_button.activity": "Aktivita",
|
||||
@@ -229,6 +230,8 @@
|
||||
"empty_column.direct": "Zatím nemáte žádné soukromé zmínky. Až nějakou pošlete nebo dostanete, zobrazí se zde.",
|
||||
"empty_column.domain_blocks": "Ještě nemáte žádné zablokované domény.",
|
||||
"empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!",
|
||||
"empty_column.favourited_statuses": "Zatím nemáte žádné oblíbené příspěvky. Až si nějaký oblíbíte, zobrazí se zde.",
|
||||
"empty_column.favourites": "Tento příspěvek si zatím nikdo neoblíbil. Až to někdo udělá, zobrazí se zde.",
|
||||
"empty_column.follow_requests": "Zatím nemáte žádné žádosti o sledování. Až nějakou obdržíte, zobrazí se zde.",
|
||||
"empty_column.followed_tags": "Zatím jste nesledovali žádné hashtagy. Až to uděláte, objeví se zde.",
|
||||
"empty_column.hashtag": "Pod tímto hashtagem zde zatím nic není.",
|
||||
@@ -294,17 +297,27 @@
|
||||
"hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky",
|
||||
"hashtag.follow": "Sledovat hashtag",
|
||||
"hashtag.unfollow": "Přestat sledovat hashtag",
|
||||
"home.actions.go_to_explore": "Podívejte se, co frčí",
|
||||
"home.actions.go_to_suggestions": "Najít lidi ke sledování",
|
||||
"home.column_settings.basic": "Základní",
|
||||
"home.column_settings.show_reblogs": "Zobrazit boosty",
|
||||
"home.column_settings.show_replies": "Zobrazit odpovědi",
|
||||
"home.explore_prompt.body": "Váš domovský kanál bude obsahovat směs příspěvků z hashtagů, které jste se rozhodli sledovat, lidí, které jste se rozhodli sledovat, a příspěvků, které boostují. Pokud vám to připadá příliš klidné, možná budete chtít:",
|
||||
"home.explore_prompt.title": "Toto je vaše domovská základna uvnitř Mastodonu.",
|
||||
"home.hide_announcements": "Skrýt oznámení",
|
||||
"home.show_announcements": "Zobrazit oznámení",
|
||||
"interaction_modal.description.favourite": "Pokud máte účet na Mastodonu, můžete tento příspěvek označit jako oblíbený a dát tak autorovi najevo, že si ho vážíte, a uložit si ho na později.",
|
||||
"interaction_modal.description.follow": "S účtem na Mastodonu můžete sledovat uživatele {name} a přijímat příspěvky ve vašem domovském kanálu.",
|
||||
"interaction_modal.description.reblog": "S účtem na Mastodonu můžete boostnout tento příspěvek a sdílet jej s vlastními sledujícími.",
|
||||
"interaction_modal.description.reply": "S účtem na Mastodonu můžete odpovědět na tento příspěvek.",
|
||||
"interaction_modal.login.action": "Domů",
|
||||
"interaction_modal.login.prompt": "Doména vašeho domovského serveru, např. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Nejste na Mastodonu?",
|
||||
"interaction_modal.on_another_server": "Na jiném serveru",
|
||||
"interaction_modal.on_this_server": "Na tomto serveru",
|
||||
"interaction_modal.preamble": "Protože Mastodon je decentralizovaný, pokud nemáte účet na tomto serveru, můžete použít svůj existující účet hostovaný jiným Mastodon serverem nebo kompatibilní platformou.",
|
||||
"interaction_modal.sign_in": "Nejste přihlášeni k tomuto serveru. Kde je váš účet hostován?",
|
||||
"interaction_modal.sign_in_hint": "Tip: To je stránka, na které jste se zaregistrovali. Pokud si ji nepamatujete, vyhledejte ve své e-mailové schránce uvítací e-mail. Můžete také zadat své celé uživatelské jméno! (např. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Oblíbit si příspěvek od uživatele {name}",
|
||||
"interaction_modal.title.follow": "Sledovat {name}",
|
||||
"interaction_modal.title.reblog": "Boostnout příspěvek uživatele {name}",
|
||||
"interaction_modal.title.reply": "Odpovědět na příspěvek uživatele {name}",
|
||||
@@ -320,6 +333,8 @@
|
||||
"keyboard_shortcuts.direct": "otevřít sloupec soukromých zmínek",
|
||||
"keyboard_shortcuts.down": "Posunout v seznamu dolů",
|
||||
"keyboard_shortcuts.enter": "Otevřít příspěvek",
|
||||
"keyboard_shortcuts.favourite": "Oblíbit si příspěvek",
|
||||
"keyboard_shortcuts.favourites": "Otevřít seznam oblíbených",
|
||||
"keyboard_shortcuts.federated": "Otevřít federovanou časovou osu",
|
||||
"keyboard_shortcuts.heading": "Klávesové zkratky",
|
||||
"keyboard_shortcuts.home": "Otevřít domovskou časovou osu",
|
||||
@@ -350,11 +365,13 @@
|
||||
"lightbox.previous": "Předchozí",
|
||||
"limited_account_hint.action": "Přesto profil zobrazit",
|
||||
"limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.",
|
||||
"link_preview.author": "Podle {name}",
|
||||
"lists.account.add": "Přidat do seznamu",
|
||||
"lists.account.remove": "Odebrat ze seznamu",
|
||||
"lists.delete": "Smazat seznam",
|
||||
"lists.edit": "Upravit seznam",
|
||||
"lists.edit.submit": "Změnit název",
|
||||
"lists.exclusive": "Skrýt tyto příspěvky z domovské stránky",
|
||||
"lists.new.create": "Přidat seznam",
|
||||
"lists.new.title_placeholder": "Název nového seznamu",
|
||||
"lists.replies_policy.followed": "Sledovaným uživatelům",
|
||||
@@ -371,6 +388,7 @@
|
||||
"mute_modal.hide_notifications": "Skrýt oznámení od tohoto uživatele?",
|
||||
"mute_modal.indefinite": "Neomezeně",
|
||||
"navigation_bar.about": "O aplikaci",
|
||||
"navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní",
|
||||
"navigation_bar.blocks": "Blokovaní uživatelé",
|
||||
"navigation_bar.bookmarks": "Záložky",
|
||||
"navigation_bar.community_timeline": "Místní časová osa",
|
||||
@@ -380,6 +398,7 @@
|
||||
"navigation_bar.domain_blocks": "Blokované domény",
|
||||
"navigation_bar.edit_profile": "Upravit profil",
|
||||
"navigation_bar.explore": "Prozkoumat",
|
||||
"navigation_bar.favourites": "Oblíbené",
|
||||
"navigation_bar.filters": "Skrytá slova",
|
||||
"navigation_bar.follow_requests": "Žádosti o sledování",
|
||||
"navigation_bar.followed_tags": "Sledované hashtagy",
|
||||
@@ -396,6 +415,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Pro přístup k tomuto zdroji se musíte přihlásit.",
|
||||
"notification.admin.report": "Uživatel {name} nahlásil {target}",
|
||||
"notification.admin.sign_up": "Uživatel {name} se zaregistroval",
|
||||
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
|
||||
"notification.follow": "Uživatel {name} vás začal sledovat",
|
||||
"notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
|
||||
"notification.mention": "Uživatel {name} vás zmínil",
|
||||
@@ -409,6 +429,7 @@
|
||||
"notifications.column_settings.admin.report": "Nová hlášení:",
|
||||
"notifications.column_settings.admin.sign_up": "Nové registrace:",
|
||||
"notifications.column_settings.alert": "Oznámení na počítači",
|
||||
"notifications.column_settings.favourite": "Oblíbené:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
|
||||
"notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Zobrazit panel filtrů",
|
||||
@@ -426,6 +447,7 @@
|
||||
"notifications.column_settings.update": "Úpravy:",
|
||||
"notifications.filter.all": "Vše",
|
||||
"notifications.filter.boosts": "Boosty",
|
||||
"notifications.filter.favourites": "Oblíbené",
|
||||
"notifications.filter.follows": "Sledování",
|
||||
"notifications.filter.mentions": "Zmínky",
|
||||
"notifications.filter.polls": "Výsledky anket",
|
||||
@@ -448,10 +470,12 @@
|
||||
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
||||
"onboarding.follows.title": "Populární na Mastodonu",
|
||||
"onboarding.share.lead": "Dejte lidem vědět, jak vás mohou najít na Mastodonu!",
|
||||
"onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}",
|
||||
"onboarding.share.next_steps": "Možné další kroky:",
|
||||
"onboarding.share.title": "Sdílejte svůj profil",
|
||||
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
|
||||
"onboarding.start.skip": "Want to skip right ahead?",
|
||||
"onboarding.start.title": "Dokázali jste to!",
|
||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
||||
"onboarding.steps.publish_status.body": "Řekněte světu Ahoj.",
|
||||
@@ -460,11 +484,16 @@
|
||||
"onboarding.steps.setup_profile.title": "Přizpůsobit svůj profil",
|
||||
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
|
||||
"onboarding.steps.share_profile.title": "Sdílejte svůj profil",
|
||||
"onboarding.tips.2fa": "<strong>Víte, že?</strong> Svůj účet můžete zabezpečit nastavením dvoufaktorového ověřování v nastavení účtu. Funguje s jakoukoli TOTP aplikací podle vašeho výběru, telefonní číslo není nutné!",
|
||||
"onboarding.tips.accounts_from_other_servers": "<strong>Víte, že?</strong> Protože je Mastodon decentralizovaný, některé profily, na které narazíte, budou hostovány na jiných serverech, než je ten váš. A přesto s nimi můžete bezproblémově komunikovat! Jejich server se nachází v druhé polovině uživatelského jména!",
|
||||
"onboarding.tips.migration": "<strong>Víte, že?</strong> Pokud máte pocit, že {domain} pro vás v budoucnu není vhodnou volbou, můžete se přesunout na jiný Mastodon server, aniž byste přišli o své sledující. Můžete dokonce hostovat svůj vlastní server!",
|
||||
"onboarding.tips.verification": "<strong>Víte, že?</strong> Svůj účet můžete ověřit tak, že na své webové stránky umístíte odkaz na váš Mastodon profil a odkaz na stránku přidáte do svého profilu. Nejsou k tomu potřeba žádné poplatky ani dokumenty!",
|
||||
"password_confirmation.exceeds_maxlength": "Potvrzení hesla překračuje maximální délku hesla",
|
||||
"password_confirmation.mismatching": "Zadaná hesla se neshodují",
|
||||
"picture_in_picture.restore": "Vrátit zpět",
|
||||
"poll.closed": "Uzavřeno",
|
||||
"poll.refresh": "Obnovit",
|
||||
"poll.reveal": "Zobrazit výsledky",
|
||||
"poll.total_people": "{count, plural, one {# člověk} few {# lidé} many {# lidí} other {# lidí}}",
|
||||
"poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasů} other {# hlasů}}",
|
||||
"poll.vote": "Hlasovat",
|
||||
@@ -517,6 +546,8 @@
|
||||
"report.placeholder": "Další komentáře",
|
||||
"report.reasons.dislike": "Nelíbí se mi to",
|
||||
"report.reasons.dislike_description": "Není to něco, co chcete vidět",
|
||||
"report.reasons.legal": "Je to nezákonné",
|
||||
"report.reasons.legal_description": "Domníváte se, že to porušuje zákony vaší země nebo země serveru",
|
||||
"report.reasons.other": "Je to něco jiného",
|
||||
"report.reasons.other_description": "Problém neodpovídá ostatním kategoriím",
|
||||
"report.reasons.spam": "Je to spam",
|
||||
@@ -536,6 +567,7 @@
|
||||
"report.unfollow": "Přestat sledovat @{name}",
|
||||
"report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jeho příspěvky ve své domovské časové ose, přestaňte jej sledovat.",
|
||||
"report_notification.attached_statuses": "{count, plural, one {{count} připojený příspěvek} few {{count} připojené příspěvky} many {{count} připojených příspěvků} other {{count} připojených příspěvků}}",
|
||||
"report_notification.categories.legal": "Zákonné",
|
||||
"report_notification.categories.other": "Ostatní",
|
||||
"report_notification.categories.spam": "Spam",
|
||||
"report_notification.categories.violation": "Porušení pravidla",
|
||||
@@ -566,6 +598,8 @@
|
||||
"server_banner.server_stats": "Statistiky serveru:",
|
||||
"sign_in_banner.create_account": "Vytvořit účet",
|
||||
"sign_in_banner.sign_in": "Přihlásit se",
|
||||
"sign_in_banner.sso_redirect": "Přihlášení nebo Registrace",
|
||||
"sign_in_banner.text": "Přihlaste se pro sledování profilů nebo hashtagů, oblíbení, sdílení a odpovídání na příspěvky. Svůj účet můžete také používat k interagování i na jiném serveru.",
|
||||
"status.admin_account": "Otevřít moderátorské rozhraní pro @{name}",
|
||||
"status.admin_domain": "Otevřít moderátorské rozhraní pro {domain}",
|
||||
"status.admin_status": "Otevřít tento příspěvek v moderátorském rozhraní",
|
||||
@@ -582,6 +616,7 @@
|
||||
"status.edited": "Upraveno {date}",
|
||||
"status.edited_x_times": "Upraveno {count, plural, one {{count}krát} few {{count}krát} many {{count}krát} other {{count}krát}}",
|
||||
"status.embed": "Vložit na web",
|
||||
"status.favourite": "Oblíbit",
|
||||
"status.filter": "Filtrovat tento příspěvek",
|
||||
"status.filtered": "Filtrováno",
|
||||
"status.hide": "Skrýt příspěvek",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Gweld sgwrs",
|
||||
"conversation.with": "Gyda {names}",
|
||||
"copypaste.copied": "Wedi ei gopïo",
|
||||
"copypaste.copy": "Copïo",
|
||||
"copypaste.copy_to_clipboard": "Copïo i'r clipfwrdd",
|
||||
"directory.federated": "O'r ffedysawd cyfan",
|
||||
"directory.local": "O {domain} yn unig",
|
||||
@@ -299,22 +298,25 @@
|
||||
"hashtag.follow": "Dilyn hashnod",
|
||||
"hashtag.unfollow": "Dad-ddilyn hashnod",
|
||||
"home.actions.go_to_explore": "Gweld beth sy'n tueddu",
|
||||
"home.actions.go_to_suggestions": "Ffeindio i bobl i'w dilyn",
|
||||
"home.actions.go_to_suggestions": "Ffeindio pobl i'w dilyn",
|
||||
"home.column_settings.basic": "Syml",
|
||||
"home.column_settings.show_reblogs": "Dangos hybiau",
|
||||
"home.column_settings.show_replies": "Dangos atebion",
|
||||
"home.explore_prompt.body": "Bydd eich llif cartref yn cynnwys cymysgedd o bostiadau o'r hashnodau rydych chi wedi dewis eu dilyn, y bobl rydych chi wedi dewis eu dilyn, a'r postiadau maen nhw'n rhoi hwb iddyn nhw. Mae'n edrych yn eithaf tawel ar hyn o bryd, felly beth am:",
|
||||
"home.explore_prompt.title": "Dyma'ch cartref o feewnn Mastodon.",
|
||||
"home.explore_prompt.body": "Bydd eich llif cartref yn cynnwys cymysgedd o bostiadau o'r hashnodau rydych chi wedi dewis eu dilyn, y bobl rydych chi wedi dewis eu dilyn, a'r postiadau maen nhw'n rhoi hwb iddyn nhw. Os yw hynny'n teimlo'n rhy dawel, efallai y byddwch am:",
|
||||
"home.explore_prompt.title": "Dyma'ch cartref o fewn Mastodon.",
|
||||
"home.hide_announcements": "Cuddio cyhoeddiadau",
|
||||
"home.show_announcements": "Dangos cyhoeddiadau",
|
||||
"interaction_modal.description.favourite": "Gyda chyfrif ar Mastodon, gallwch chi hoffi'r postiad hwn er mwyn roi gwybod i'r awdur eich bod chi'n ei werthfawrogi ac yn ei gadw ar gyfer nes ymlaen.",
|
||||
"interaction_modal.description.follow": "Gyda chyfrif ar Mastodon, gallwch ddilyn {name} i dderbyn eu postiadau yn eich llif cartref.",
|
||||
"interaction_modal.description.reblog": "Gyda chyfrif ar Mastodon, gallwch hybu'r postiad hwn i'w rannu â'ch dilynwyr.",
|
||||
"interaction_modal.description.reply": "Gyda chyfrif ar Mastodon, gallwch ymateb i'r postiad hwn.",
|
||||
"interaction_modal.login.action": "Ewch â fi adref",
|
||||
"interaction_modal.login.prompt": "Parth eich gweinydd cartref, e.e. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Dim ar Mastodon?",
|
||||
"interaction_modal.on_another_server": "Ar weinydd gwahanol",
|
||||
"interaction_modal.on_this_server": "Ar y gweinydd hwn",
|
||||
"interaction_modal.other_server_instructions": "Copïwch a gludwch yr URL hwn i faes chwilio eich hoff ap Mastodon neu ryngwyneb gwe eich gweinydd Mastodon.",
|
||||
"interaction_modal.preamble": "Gan fod Mastodon wedi'i ddatganoli, gallwch ddefnyddio'ch cyfrif presennol a gynhelir gan weinydd Mastodon arall neu blatfform cydnaws os nad oes gennych gyfrif ar yr un hwn.",
|
||||
"interaction_modal.sign_in": "Nid ydych wedi mewngofnodi i'r gweinydd hwn. Ble mae eich cyfrif yn cael ei gynnal?",
|
||||
"interaction_modal.sign_in_hint": "Awgrym: Dyna'r wefan lle gwnaethoch gofrestru. Os nad ydych yn cofio, edrychwch am yr e-bost croeso yn eich blwch derbyn. Gallwch hefyd nodi eich enw defnyddiwr llawn! (e.e. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Hoffi postiad {name}",
|
||||
"interaction_modal.title.follow": "Dilyn {name}",
|
||||
"interaction_modal.title.reblog": "Hybu postiad {name}",
|
||||
@@ -363,6 +365,7 @@
|
||||
"lightbox.previous": "Blaenorol",
|
||||
"limited_account_hint.action": "Dangos y proffil beth bynnag",
|
||||
"limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.",
|
||||
"link_preview.author": "Gan {name}",
|
||||
"lists.account.add": "Ychwanegu at restr",
|
||||
"lists.account.remove": "Tynnu o'r rhestr",
|
||||
"lists.delete": "Dileu rhestr",
|
||||
@@ -387,7 +390,7 @@
|
||||
"navigation_bar.about": "Ynghylch",
|
||||
"navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch",
|
||||
"navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
|
||||
"navigation_bar.bookmarks": "Llyfrnodau",
|
||||
"navigation_bar.bookmarks": "Nodau Tudalen",
|
||||
"navigation_bar.community_timeline": "Ffrwd leol",
|
||||
"navigation_bar.compose": "Cyfansoddi post newydd",
|
||||
"navigation_bar.direct": "Crybwylliadau preifat",
|
||||
@@ -456,8 +459,8 @@
|
||||
"notifications.permission_denied_alert": "Nid oes modd galluogi hysbysiadau bwrdd gwaith, gan fod caniatâd porwr wedi'i wrthod o'r blaen",
|
||||
"notifications.permission_required": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd na roddwyd y caniatâd gofynnol.",
|
||||
"notifications_permission_banner.enable": "Galluogi hysbysiadau bwrdd gwaith",
|
||||
"notifications_permission_banner.how_to_control": "I dderbyn hysbysiadau pan nad yw Mastodon ar agor, galluogwch hysbysiadau bwrdd gwaith. Gallwch reoli'n union pa fathau o ryngweithiadau sy'n cynhyrchu hysbysiadau bwrdd gwaith trwy'r botwm {icon} uchod unwaith y byddant wedi'u galluogi.",
|
||||
"notifications_permission_banner.title": "Peidiwch colli dim",
|
||||
"notifications_permission_banner.how_to_control": "I dderbyn hysbysiadau pan nad yw Mastodon ar agor, galluogwch hysbysiadau bwrdd gwaith. Gallwch reoli'n union pa fathau o ryngweithiadau sy'n cynhyrchu hysbysiadau bwrdd gwaith trwy'r botwm {icon} uchod unwaith y byddan nhw wedi'u galluogi.",
|
||||
"notifications_permission_banner.title": "Peidiwch â cholli dim",
|
||||
"onboarding.action.back": "Ewch â fi yn ôl",
|
||||
"onboarding.actions.back": "Ewch â fi yn ôl",
|
||||
"onboarding.actions.go_to_explore": "Gweld beth yw'r tuedd",
|
||||
@@ -501,7 +504,7 @@
|
||||
"privacy.change": "Addasu preifatrwdd y post",
|
||||
"privacy.direct.long": "Dim ond yn weladwy i ddefnyddwyr a grybwyllwyd",
|
||||
"privacy.direct.short": "Dim ond pobl sy wedi'u crybwyll",
|
||||
"privacy.private.long": "Dim ond pobl sy'n ddilynwyrl",
|
||||
"privacy.private.long": "Dim ond pobl sy'n ddilynwyr",
|
||||
"privacy.private.short": "Dilynwyr yn unig",
|
||||
"privacy.public.long": "Gweladwy i bawb",
|
||||
"privacy.public.short": "Cyhoeddus",
|
||||
@@ -510,7 +513,7 @@
|
||||
"privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}",
|
||||
"privacy_policy.title": "Polisi Preifatrwydd",
|
||||
"refresh": "Adnewyddu",
|
||||
"regeneration_indicator.label": "Llwytho…",
|
||||
"regeneration_indicator.label": "Yn llwytho…",
|
||||
"regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "{number, plural, one {# diwrnod} other {# diwrnod}} yn ôl",
|
||||
@@ -590,11 +593,12 @@
|
||||
"server_banner.about_active_users": "Pobl sy'n defnyddio'r gweinydd hwn yn ystod y 30 diwrnod diwethaf (Defnyddwyr Gweithredol Misol)",
|
||||
"server_banner.active_users": "defnyddwyr gweithredol",
|
||||
"server_banner.administered_by": "Gweinyddir gan:",
|
||||
"server_banner.introduction": "Mae {domain} yn rhan o'r rhwydwaith cymdeithasol datganoledig a bwerir gan {mastodon}.",
|
||||
"server_banner.introduction": "Mae {domain} yn rhan o'r rhwydwaith cymdeithasol datganoledig sy'n cael ei bweru gan {mastodon}.",
|
||||
"server_banner.learn_more": "Dysgu mwy",
|
||||
"server_banner.server_stats": "Ystadegau'r gweinydd:",
|
||||
"sign_in_banner.create_account": "Creu cyfrif",
|
||||
"sign_in_banner.sign_in": "Mewngofnodi",
|
||||
"sign_in_banner.sso_redirect": "Mewngofnodi neu Gofrestru",
|
||||
"sign_in_banner.text": "Mewngofnodwch i ddilyn proffiliau neu hashnodau, ffefrynnau, rhannu ac ymateb i bostiadau. Gallwch hefyd ryngweithio o'ch cyfrif ar weinyddion gwahanol.",
|
||||
"status.admin_account": "Agor rhyngwyneb cymedroli ar gyfer @{name}",
|
||||
"status.admin_domain": "Agor rhyngwyneb cymedroli {domain}",
|
||||
@@ -635,7 +639,7 @@
|
||||
"status.reblogged_by": "Hybodd {name}",
|
||||
"status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
|
||||
"status.redraft": "Dileu ac ailddrafftio",
|
||||
"status.remove_bookmark": "Dileu llyfrnod",
|
||||
"status.remove_bookmark": "Tynnu nod tudalen",
|
||||
"status.replied_to": "Wedi ateb {name}",
|
||||
"status.reply": "Ateb",
|
||||
"status.replyAll": "Ateb i edefyn",
|
||||
@@ -678,7 +682,7 @@
|
||||
"units.short.thousand": "{count}mil",
|
||||
"upload_area.title": "Llusgwch a gollwng i lwytho",
|
||||
"upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.",
|
||||
"upload_error.limit": "Wedi pasio'r uchafswm llwytho.",
|
||||
"upload_error.poll": "Nid oes modd llwytho ffeiliau â phleidleisiau.",
|
||||
"upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
|
||||
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Vis samtale",
|
||||
"conversation.with": "Med {names}",
|
||||
"copypaste.copied": "Kopieret",
|
||||
"copypaste.copy": "Kopiér",
|
||||
"copypaste.copy_to_clipboard": "Kopiér til udklipsholder",
|
||||
"directory.federated": "Fra kendt fedivers",
|
||||
"directory.local": "Kun fra {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Nogle af disse",
|
||||
"hashtag.column_settings.tag_mode.none": "Ingen af disse",
|
||||
"hashtag.column_settings.tag_toggle": "Inkludér ekstra tags for denne kolonne",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deltager} other {{counter} deltagere}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
|
||||
"hashtag.follow": "Følg hashtag",
|
||||
"hashtag.unfollow": "Stop med at følge hashtag",
|
||||
"home.actions.go_to_explore": "Se, hvad som trender",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Grundlæggende",
|
||||
"home.column_settings.show_reblogs": "Vis boosts",
|
||||
"home.column_settings.show_replies": "Vis svar",
|
||||
"home.explore_prompt.body": "Dit hjemmefeed vil have en blanding af indlæg fra de hashtags, du har valgt at følge, de personer, du har valgt at følge, og de indlæg, de booster. Her virker temmelig stille lige nu, så hvad med at prøve:",
|
||||
"home.explore_prompt.body": "Hjemmefeedet vil indeholde en blanding af indlæg fra de hashtags og personer, du følger samt de indlæg, de booster. Føles synes for stille, kan du prøve:",
|
||||
"home.explore_prompt.title": "Dette er din hjemmebase i Mastodon.",
|
||||
"home.hide_announcements": "Skjul bekendtgørelser",
|
||||
"home.show_announcements": "Vis bekendtgørelser",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Med en konto på Mastodon kan du følge {name} for at modtage vedkommendes indlæg i dit hjemmefeed.",
|
||||
"interaction_modal.description.reblog": "Med en konto på Mastodon kan dette indlæg fremhæves så det deles med egne følgere.",
|
||||
"interaction_modal.description.reply": "Med en konto på Mastodon kan dette indlæg besvares.",
|
||||
"interaction_modal.login.action": "Gå til hjemmeserver",
|
||||
"interaction_modal.login.prompt": "Hjemmeserverdomænet, f.eks. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Ikke på Mastodon?",
|
||||
"interaction_modal.on_another_server": "På en anden server",
|
||||
"interaction_modal.on_this_server": "På denne server",
|
||||
"interaction_modal.other_server_instructions": "Kopiér og indsæt denne URL i søgefeltet på den foretrukne Mastodon-app eller Mastodon-serverens webgrænseflade.",
|
||||
"interaction_modal.preamble": "Da Mastodon er decentraliseret, kan man bruge sin eksisterende konto hostet af en anden Mastodon-server eller kompatibel platform, såfremt man ikke har en konto på denne.",
|
||||
"interaction_modal.sign_in": "Du er ikke logget ind på denne server. Hvor hostes din konto?",
|
||||
"interaction_modal.sign_in_hint": "Tip: Det er webstedet, hvor du tilmeldte dig. Har du glemt det, så kig efter velkomstmailen i indbakken. Du kan også angive dit fulde brugernavn! (f.eks. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Gør {name}s indlæg til favorit",
|
||||
"interaction_modal.title.follow": "Følg {name}",
|
||||
"interaction_modal.title.reblog": "Boost {name}s indlæg",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Serverstatstik:",
|
||||
"sign_in_banner.create_account": "Opret konto",
|
||||
"sign_in_banner.sign_in": "Log ind",
|
||||
"sign_in_banner.sso_redirect": "Log ind eller Tilmeld",
|
||||
"sign_in_banner.text": "Log ind for at følge profiler eller hashtags, markere som favorit, dele og besvare indlæg eller interagere fra din konto på en anden server.",
|
||||
"status.admin_account": "Åbn modereringsbrugerflade for @{name}",
|
||||
"status.admin_domain": "Åbn modereringsbrugerflade for {domain}",
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
"compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben",
|
||||
"compose_form.poll.switch_to_single": "Nur Einzelauswahl erlauben",
|
||||
"compose_form.publish": "Veröffentlichen",
|
||||
"compose_form.publish_form": "Veröffentlichen",
|
||||
"compose_form.publish_form": "Neuer Beitrag",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "Änderungen speichern",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Mit einer Inhaltswarnung versehen} other {Mit einer Inhaltswarnung versehen}}",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Unterhaltung anzeigen",
|
||||
"conversation.with": "Mit {names}",
|
||||
"copypaste.copied": "Kopiert",
|
||||
"copypaste.copy": "Kopieren",
|
||||
"copypaste.copy_to_clipboard": "In die Zwischenablage kopieren",
|
||||
"directory.federated": "Aus bekanntem Fediverse",
|
||||
"directory.local": "Nur von der Domain {domain}",
|
||||
@@ -202,7 +201,7 @@
|
||||
"dismissable_banner.community_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen, deren Konten von {domain} verwaltet werden.",
|
||||
"dismissable_banner.dismiss": "Ablehnen",
|
||||
"dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Profilen veröffentlicht wurden, werden höher eingestuft.",
|
||||
"dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netz und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.",
|
||||
"dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.",
|
||||
"dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Profilen verwendet werden, werden höher eingestuft.",
|
||||
"dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.",
|
||||
"embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Eines von diesen",
|
||||
"hashtag.column_settings.tag_mode.none": "Keines von diesen",
|
||||
"hashtag.column_settings.tag_toggle": "Zusätzliche Hashtags dieser Spalte hinzufügen",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one{{counter} Beteiligte*r} other{{counter} Beteiligte}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}} heute",
|
||||
"hashtag.follow": "Hashtag folgen",
|
||||
"hashtag.unfollow": "Hashtag entfolgen",
|
||||
"home.actions.go_to_explore": "Trends ansehen",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Einfach",
|
||||
"home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen",
|
||||
"home.column_settings.show_replies": "Antworten anzeigen",
|
||||
"home.explore_prompt.body": "Deine Startseite wird eine Mischung aus Beiträgen mit gefolgten Hashtags und den Profilen, denen du folgst sowie den Beiträgen, die sie teilen, enthalten. Aktuell ist es noch etwas still. Wie wäre es mit:",
|
||||
"home.explore_prompt.body": "Deine Startseite wird eine Mischung aus Beiträgen mit Hashtags und den Profilen, denen du folgst sowie den Beiträgen, die sie teilen, enthalten. Sollte es sich zu still anfühlen:",
|
||||
"home.explore_prompt.title": "Das ist dein Zuhause bei Mastodon.",
|
||||
"home.hide_announcements": "Ankündigungen ausblenden",
|
||||
"home.show_announcements": "Ankündigungen anzeigen",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Mit einem Mastodon-Konto kannst du {name} folgen, um die Beiträge auf deiner Startseite zu sehen.",
|
||||
"interaction_modal.description.reblog": "Mit einem Mastodon-Konto kannst du die Reichweite dieses Beitrags erhöhen, indem du ihn mit deinen Followern teilst.",
|
||||
"interaction_modal.description.reply": "Mit einem Mastodon-Konto kannst du auf diesen Beitrag antworten.",
|
||||
"interaction_modal.login.action": "Zurück zur Startseite",
|
||||
"interaction_modal.login.prompt": "Adresse deines Servers, z. B. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Nicht auf Mastodon?",
|
||||
"interaction_modal.on_another_server": "Auf einem anderen Server",
|
||||
"interaction_modal.on_this_server": "Auf diesem Server",
|
||||
"interaction_modal.other_server_instructions": "Kopiere diese URL und füge sie in das Suchfeld deiner bevorzugten Mastodon-App oder in das Webinterface deines Mastodon-Servers ein.",
|
||||
"interaction_modal.preamble": "Da Mastodon dezentralisiert ist, kannst du dein bestehendes Konto auf einem anderen Mastodon-Server oder einer kompatiblen Plattform nutzen, wenn du kein Konto auf dieser Plattform hast.",
|
||||
"interaction_modal.sign_in": "Du bist auf diesem Server nicht angemeldet. Auf welchem Server wird dein Konto verwaltet?",
|
||||
"interaction_modal.sign_in_hint": "Hinweis: Hierbei handelt es sich um die Website, auf der du dich registriert hast. Wenn du dich nicht mehr daran erinnerst, dann kannst du sie in der Willkommens-E-Mail nachsehen. Du kannst auch deinen vollständigen Profilnamen eingeben! (z. B. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Beitrag von {name} favorisieren",
|
||||
"interaction_modal.title.follow": "Folge {name}",
|
||||
"interaction_modal.title.reblog": "Beitrag von {name} teilen",
|
||||
@@ -471,7 +476,7 @@
|
||||
"onboarding.share.message": "Ich bin {username} auf #Mastodon! Folge mir auf {url}",
|
||||
"onboarding.share.next_steps": "Mögliche nächste Schritte:",
|
||||
"onboarding.share.title": "Teile dein Profil",
|
||||
"onboarding.start.lead": "Du bist nun ein Teil von Mastodon – eine einzigartige, dezentralisierte Social Media-Plattform, bei der du und kein Algorithmus deine eigene Erfahrung gestaltest. Fangen wir an, diese neue soziale Dimension zu erkunden:",
|
||||
"onboarding.start.lead": "Du bist nun ein Teil von Mastodon – eine einzigartige, dezentralisierte Social-Media-Plattform, bei der du und kein Algorithmus deine eigene Erfahrung gestaltest. Fangen wir an, diese neue soziale Dimension zu erkunden:",
|
||||
"onboarding.start.skip": "Du benötigst keine Hilfe für den Einstieg?",
|
||||
"onboarding.start.title": "Du hast es geschafft!",
|
||||
"onboarding.steps.follow_people.body": "Interessanten Profilen zu folgen ist das, was Mastodon ausmacht.",
|
||||
@@ -506,7 +511,7 @@
|
||||
"privacy.private.short": "Nur Follower",
|
||||
"privacy.public.long": "Für alle sichtbar",
|
||||
"privacy.public.short": "Öffentlich",
|
||||
"privacy.unlisted.long": "Sichtbar für alle, aber nicht über Suchfunktion",
|
||||
"privacy.unlisted.long": "Für alle sichtbar, aber nicht über die Suche zu finden",
|
||||
"privacy.unlisted.short": "Nicht gelistet",
|
||||
"privacy_policy.last_updated": "Stand: {date}",
|
||||
"privacy_policy.title": "Datenschutzerklärung",
|
||||
@@ -526,7 +531,7 @@
|
||||
"relative_time.today": "heute",
|
||||
"reply_indicator.cancel": "Abbrechen",
|
||||
"report.block": "Blockieren",
|
||||
"report.block_explanation": "Dir wird es nicht länger möglich sein, die Beiträge dieses Konto zu sehen. Das blockierte Profil wird nicht mehr in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird mitbekommen, dass du ihr Konto blockiert hast.",
|
||||
"report.block_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das blockierte Konto wird deine Beiträge nicht mehr sehen oder dir folgen können. Die Person könnte mitbekommen, dass du sie blockiert hast.",
|
||||
"report.categories.other": "Andere",
|
||||
"report.categories.spam": "Spam",
|
||||
"report.categories.violation": "Der Inhalt verletzt eine oder mehrere Serverregeln",
|
||||
@@ -539,13 +544,13 @@
|
||||
"report.forward": "Meldung zusätzlich an {target} weiterleiten",
|
||||
"report.forward_hint": "Dieses Konto gehört zu einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin gesendet werden?",
|
||||
"report.mute": "Stummschalten",
|
||||
"report.mute_explanation": "Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immer noch folgen, und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stummgeschaltet hast.",
|
||||
"report.mute_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das stummgeschaltete Konto wird dir weiterhin folgen und deine Beiträge sehen können. Die Person wird nicht mitbekommen, dass du sie stummgeschaltet hast.",
|
||||
"report.next": "Weiter",
|
||||
"report.placeholder": "Ergänzende Hinweise",
|
||||
"report.reasons.dislike": "Das gefällt mir nicht",
|
||||
"report.reasons.dislike_description": "Das ist etwas, das du nicht sehen möchtest",
|
||||
"report.reasons.legal": "Das ist illegal",
|
||||
"report.reasons.legal_description": "Du bist davon überzeugt, dass es gegen die Gesetze deines Landes oder des Landes des Servers verstößt",
|
||||
"report.reasons.legal_description": "Du glaubst, dass es gegen die Gesetze deines Landes oder des Landes des Servers verstößt",
|
||||
"report.reasons.other": "Es ist etwas anderes",
|
||||
"report.reasons.other_description": "Der Vorfall passt zu keiner dieser Kategorien",
|
||||
"report.reasons.spam": "Das ist Spam",
|
||||
@@ -555,8 +560,8 @@
|
||||
"report.rules.subtitle": "Wähle alle zutreffenden Inhalte aus",
|
||||
"report.rules.title": "Welche Regeln werden verletzt?",
|
||||
"report.statuses.subtitle": "Wähle alle zutreffenden Inhalte aus",
|
||||
"report.statuses.title": "Gibt es Beiträge, die diesen Bericht untermauern?",
|
||||
"report.submit": "Absenden",
|
||||
"report.statuses.title": "Gibt es Beiträge, die diese Meldung bekräftigen?",
|
||||
"report.submit": "Senden",
|
||||
"report.target": "{target} melden",
|
||||
"report.thanks.take_action": "Das sind deine Möglichkeiten zu bestimmen, was du auf Mastodon sehen möchtest:",
|
||||
"report.thanks.take_action_actionable": "Während wir den Vorfall überprüfen, kannst du gegen @{name} weitere Maßnahmen ergreifen:",
|
||||
@@ -591,11 +596,12 @@
|
||||
"server_banner.about_active_users": "Personen, die diesen Server in den vergangenen 30 Tagen verwendet haben (monatlich aktive Nutzer*innen)",
|
||||
"server_banner.active_users": "aktive Profile",
|
||||
"server_banner.administered_by": "Verwaltet von:",
|
||||
"server_banner.introduction": "{domain} ist ein Teil des dezentralisierten sozialen Netzwerks, angetrieben von {mastodon}.",
|
||||
"server_banner.introduction": "{domain} ist Teil eines dezentralisierten sozialen Netzwerks, angetrieben von {mastodon}.",
|
||||
"server_banner.learn_more": "Mehr erfahren",
|
||||
"server_banner.server_stats": "Serverstatistiken:",
|
||||
"sign_in_banner.create_account": "Konto erstellen",
|
||||
"sign_in_banner.sign_in": "Anmelden",
|
||||
"sign_in_banner.sso_redirect": "Anmelden oder registrieren",
|
||||
"sign_in_banner.text": "Melde dich an, um Profilen oder Hashtags zu folgen, Beiträge zu favorisieren, zu teilen und auf sie zu antworten. Du kannst auch von deinem Konto aus auf einem anderen Server interagieren.",
|
||||
"status.admin_account": "@{name} moderieren",
|
||||
"status.admin_domain": "{domain} moderieren",
|
||||
|
||||
@@ -177,7 +177,6 @@
|
||||
"conversation.open": "Προβολή συνομιλίας",
|
||||
"conversation.with": "Με {names}",
|
||||
"copypaste.copied": "Αντιγράφηκε",
|
||||
"copypaste.copy": "Αντιγραφή",
|
||||
"copypaste.copy_to_clipboard": "Αντιγραφή στο πρόχειρο",
|
||||
"directory.federated": "Από το γνωστό fediverse",
|
||||
"directory.local": "Μόνο από {domain}",
|
||||
@@ -287,7 +286,6 @@
|
||||
"interaction_modal.description.reply": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σε αυτή την ανάρτηση.",
|
||||
"interaction_modal.on_another_server": "Σε διαφορετικό διακομιστή",
|
||||
"interaction_modal.on_this_server": "Σε αυτόν τον διακομιστή",
|
||||
"interaction_modal.preamble": "Δεδομένου ότι το Mastodon είναι αποκεντρωμένο, μπορείς να χρησιμοποιείς τον υπάρχοντα λογαριασμό σου που φιλοξενείται σε άλλον διακομιστή του Mastodon ή σε συμβατή πλατφόρμα, αν δεν έχετε λογαριασμό σε αυτόν.",
|
||||
"interaction_modal.title.follow": "Ακολούθησε {name}",
|
||||
"interaction_modal.title.reblog": "Ενίσχυσε την ανάρτηση του {name}",
|
||||
"interaction_modal.title.reply": "Απάντηση στην ανάρτηση του {name}",
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
"about.rules": "Server rules",
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.bot": "Automated",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Unblock domain {domain}",
|
||||
"account.block_domain": "Block domain {domain}",
|
||||
"account.block_short": "Block",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Withdraw follow request",
|
||||
"account.cancel_follow_request": "Cancel follow",
|
||||
"account.direct": "Privately mention @{name}",
|
||||
"account.disable_notifications": "Stop notifying me when @{name} posts",
|
||||
"account.domain_blocked": "Domain blocked",
|
||||
@@ -150,7 +150,7 @@
|
||||
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
|
||||
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
|
||||
"compose_form.publish": "Publish",
|
||||
"compose_form.publish_form": "Publish",
|
||||
"compose_form.publish_form": "New post",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "Save changes",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "View conversation",
|
||||
"conversation.with": "With {names}",
|
||||
"copypaste.copied": "Copied",
|
||||
"copypaste.copy": "Copy",
|
||||
"copypaste.copy_to_clipboard": "Copy to clipboard",
|
||||
"directory.federated": "From known fediverse",
|
||||
"directory.local": "From {domain} only",
|
||||
@@ -236,7 +235,7 @@
|
||||
"empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
|
||||
"empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.",
|
||||
"empty_column.hashtag": "There is nothing in this hashtag yet.",
|
||||
"empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
|
||||
"empty_column.home": "Your home timeline is empty! Follow more people to fill it up.",
|
||||
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
|
||||
"empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
|
||||
"empty_column.mutes": "You haven't muted any users yet.",
|
||||
@@ -296,6 +295,7 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Any of these",
|
||||
"hashtag.column_settings.tag_mode.none": "None of these",
|
||||
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"hashtag.follow": "Follow hashtag",
|
||||
"hashtag.unfollow": "Unfollow hashtag",
|
||||
"home.actions.go_to_explore": "See what's trending",
|
||||
@@ -303,7 +303,7 @@
|
||||
"home.column_settings.basic": "Basic",
|
||||
"home.column_settings.show_reblogs": "Show boosts",
|
||||
"home.column_settings.show_replies": "Show replies",
|
||||
"home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. It's looking pretty quiet right now, so how about:",
|
||||
"home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:",
|
||||
"home.explore_prompt.title": "This is your home base within Mastodon.",
|
||||
"home.hide_announcements": "Hide announcements",
|
||||
"home.show_announcements": "Show announcements",
|
||||
@@ -311,10 +311,13 @@
|
||||
"interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.",
|
||||
"interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.",
|
||||
"interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.",
|
||||
"interaction_modal.login.action": "Take me home",
|
||||
"interaction_modal.login.prompt": "Domain of your home server, e.g. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Not on Mastodon?",
|
||||
"interaction_modal.on_another_server": "On a different server",
|
||||
"interaction_modal.on_this_server": "On this server",
|
||||
"interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
|
||||
"interaction_modal.preamble": "Since Mastodon is decentralised, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
|
||||
"interaction_modal.sign_in": "You are not logged in to this server. Where is your account hosted?",
|
||||
"interaction_modal.sign_in_hint": "Tip: That's the website where you signed up. If you don't remember, look for the welcome e-mail in your inbox. You can also enter your full username! (e.g. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Favourite {name}'s post",
|
||||
"interaction_modal.title.follow": "Follow {name}",
|
||||
"interaction_modal.title.reblog": "Boost {name}'s post",
|
||||
@@ -335,14 +338,14 @@
|
||||
"keyboard_shortcuts.favourites": "Open favourites list",
|
||||
"keyboard_shortcuts.federated": "to open federated timeline",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "to open home timeline",
|
||||
"keyboard_shortcuts.home": "Open home timeline",
|
||||
"keyboard_shortcuts.hotkey": "Hotkey",
|
||||
"keyboard_shortcuts.legend": "to display this legend",
|
||||
"keyboard_shortcuts.local": "to open local timeline",
|
||||
"keyboard_shortcuts.mention": "to mention author",
|
||||
"keyboard_shortcuts.muted": "to open muted users list",
|
||||
"keyboard_shortcuts.my_profile": "to open your profile",
|
||||
"keyboard_shortcuts.notifications": "to open notifications column",
|
||||
"keyboard_shortcuts.notifications": "Open notifications column",
|
||||
"keyboard_shortcuts.open_media": "to open media",
|
||||
"keyboard_shortcuts.pinned": "to open pinned posts list",
|
||||
"keyboard_shortcuts.profile": "to open author's profile",
|
||||
@@ -352,10 +355,10 @@
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Show/hide media",
|
||||
"keyboard_shortcuts.toot": "to start a brand new post",
|
||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||
"keyboard_shortcuts.up": "to move up in the list",
|
||||
"keyboard_shortcuts.up": "Move up in the list",
|
||||
"lightbox.close": "Close",
|
||||
"lightbox.compress": "Compress image view box",
|
||||
"lightbox.expand": "Expand image view box",
|
||||
@@ -393,7 +396,7 @@
|
||||
"navigation_bar.compose": "Compose new post",
|
||||
"navigation_bar.direct": "Private mentions",
|
||||
"navigation_bar.discover": "Discover",
|
||||
"navigation_bar.domain_blocks": "Hidden domains",
|
||||
"navigation_bar.domain_blocks": "Blocked domains",
|
||||
"navigation_bar.edit_profile": "Edit profile",
|
||||
"navigation_bar.explore": "Explore",
|
||||
"navigation_bar.favourites": "Favourites",
|
||||
@@ -462,26 +465,26 @@
|
||||
"onboarding.action.back": "Take me back",
|
||||
"onboarding.actions.back": "Take me back",
|
||||
"onboarding.actions.go_to_explore": "See what's trending",
|
||||
"onboarding.actions.go_to_home": "Go to your home feed",
|
||||
"onboarding.actions.go_to_home": "Take me to my home feed",
|
||||
"onboarding.compose.template": "Hello #Mastodon!",
|
||||
"onboarding.follows.empty": "Unfortunately, no results can be shown right now. You can try using search or browsing the explore page to find people to follow, or try again later.",
|
||||
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
||||
"onboarding.follows.title": "Popular on Mastodon",
|
||||
"onboarding.follows.title": "Personalize your home feed",
|
||||
"onboarding.share.lead": "Let people know how they can find you on Mastodon!",
|
||||
"onboarding.share.message": "I'm {username} on #Mastodon! Come follow me at {url}",
|
||||
"onboarding.share.next_steps": "Possible next steps:",
|
||||
"onboarding.share.title": "Share your profile",
|
||||
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
|
||||
"onboarding.start.skip": "Want to skip right ahead?",
|
||||
"onboarding.start.lead": "You're now part of Mastodon, a unique, decentralized social media platform where you—not an algorithm—curate your own experience. Let's get you started on this new social frontier:",
|
||||
"onboarding.start.skip": "Don't need help getting started?",
|
||||
"onboarding.start.title": "You've made it!",
|
||||
"onboarding.steps.follow_people.body": "Following interesting people is what Mastodon is all about.",
|
||||
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
||||
"onboarding.steps.publish_status.body": "Say hello to the World.",
|
||||
"onboarding.steps.follow_people.title": "Personalize your home feed",
|
||||
"onboarding.steps.publish_status.body": "Say hello to the world with text, photos, videos, or polls {emoji}",
|
||||
"onboarding.steps.publish_status.title": "Make your first post",
|
||||
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
||||
"onboarding.steps.setup_profile.title": "Customise your profile",
|
||||
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
|
||||
"onboarding.steps.share_profile.title": "Share your profile",
|
||||
"onboarding.steps.share_profile.title": "Share your Mastodon profile",
|
||||
"onboarding.tips.2fa": "<strong>Did you know?</strong> You can secure your account by setting up two-factor authentication in your account settings. It works with any TOTP app of your choice, no phone number necessary!",
|
||||
"onboarding.tips.accounts_from_other_servers": "<strong>Did you know?</strong> Since Mastodon is decentralised, some profiles you come across will be hosted on servers other than yours. And yet you can interact with them seamlessly! Their server is in the second half of their username!",
|
||||
"onboarding.tips.migration": "<strong>Did you know?</strong> If you feel like {domain} is not a great server choice for you in the future, you can move to another Mastodon server without losing your followers. You can even host your own server!",
|
||||
@@ -498,10 +501,10 @@
|
||||
"poll.voted": "You voted for this answer",
|
||||
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
|
||||
"poll_button.add_poll": "Add a poll",
|
||||
"poll_button.remove_poll": "Add a poll",
|
||||
"privacy.change": "Adjust status privacy",
|
||||
"poll_button.remove_poll": "Remove poll",
|
||||
"privacy.change": "Change post privacy",
|
||||
"privacy.direct.long": "Visible for mentioned users only",
|
||||
"privacy.direct.short": "Direct",
|
||||
"privacy.direct.short": "Mentioned people only",
|
||||
"privacy.private.long": "Visible for followers only",
|
||||
"privacy.private.short": "Followers-only",
|
||||
"privacy.public.long": "Visible for all",
|
||||
@@ -541,7 +544,7 @@
|
||||
"report.mute": "Mute",
|
||||
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
|
||||
"report.next": "Next",
|
||||
"report.placeholder": "Type or paste additional comments",
|
||||
"report.placeholder": "Additional comments",
|
||||
"report.reasons.dislike": "I don't like it",
|
||||
"report.reasons.dislike_description": "It is not something you want to see",
|
||||
"report.reasons.legal": "It's illegal",
|
||||
@@ -556,8 +559,8 @@
|
||||
"report.rules.title": "Which rules are being violated?",
|
||||
"report.statuses.subtitle": "Select all that apply",
|
||||
"report.statuses.title": "Are there any posts that back up this report?",
|
||||
"report.submit": "Submit report",
|
||||
"report.target": "Report {target}",
|
||||
"report.submit": "Submit",
|
||||
"report.target": "Reporting {target}",
|
||||
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
|
||||
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
|
||||
"report.thanks.title": "Don't want to see this?",
|
||||
@@ -596,10 +599,11 @@
|
||||
"server_banner.server_stats": "Server stats:",
|
||||
"sign_in_banner.create_account": "Create account",
|
||||
"sign_in_banner.sign_in": "Sign in",
|
||||
"sign_in_banner.sso_redirect": "Login or Register",
|
||||
"sign_in_banner.text": "Login to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_domain": "Open moderation interface for {domain}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.admin_status": "Open this post in the moderation interface",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
@@ -627,7 +631,7 @@
|
||||
"status.more": "More",
|
||||
"status.mute": "Mute @{name}",
|
||||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this status",
|
||||
"status.open": "Expand this post",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.pinned": "Pinned post",
|
||||
"status.read_more": "Read more",
|
||||
@@ -681,13 +685,13 @@
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.audio_description": "Describe for people who are deaf or hard of hearing",
|
||||
"upload_form.description": "Describe for people who are blind or have low vision",
|
||||
"upload_form.description_missing": "No description added",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
|
||||
"upload_modal.analyzing_picture": "Analysing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.applying": "Applying…",
|
||||
@@ -700,7 +704,7 @@
|
||||
"upload_modal.preview_label": "Preview ({ratio})",
|
||||
"upload_progress.label": "Uploading…",
|
||||
"upload_progress.processing": "Processing…",
|
||||
"username.taken": "Username is taken - try another. Carlito77",
|
||||
"username.taken": "That username is taken. Try another",
|
||||
"video.close": "Close video",
|
||||
"video.download": "Download file",
|
||||
"video.exit_fullscreen": "Exit full screen",
|
||||
|
||||
@@ -295,8 +295,12 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Any of these",
|
||||
"hashtag.column_settings.tag_mode.none": "None of these",
|
||||
"hashtag.column_settings.tag_toggle": "Include additional tags for this column",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} posts}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} posts}} today",
|
||||
"hashtag.follow": "Follow hashtag",
|
||||
"hashtag.unfollow": "Unfollow hashtag",
|
||||
"hashtags.and_other": "…and {count, plural, other {# more}}",
|
||||
"home.actions.go_to_explore": "See what's trending",
|
||||
"home.actions.go_to_suggestions": "Find people to follow",
|
||||
"home.column_settings.basic": "Basic",
|
||||
@@ -529,6 +533,7 @@
|
||||
"reply_indicator.cancel": "Cancel",
|
||||
"report.block": "Block",
|
||||
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
|
||||
"report.categories.legal": "Legal",
|
||||
"report.categories.other": "Other",
|
||||
"report.categories.spam": "Spam",
|
||||
"report.categories.violation": "Content violates one or more server rules",
|
||||
@@ -598,6 +603,7 @@
|
||||
"server_banner.server_stats": "Server stats:",
|
||||
"sign_in_banner.create_account": "Create account",
|
||||
"sign_in_banner.sign_in": "Login",
|
||||
"sign_in_banner.sso_redirect": "Login or Register",
|
||||
"sign_in_banner.text": "Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_domain": "Open moderation interface for {domain}",
|
||||
|
||||
@@ -189,7 +189,6 @@
|
||||
"conversation.open": "Vidi konversacion",
|
||||
"conversation.with": "Kun {names}",
|
||||
"copypaste.copied": "Kopiita",
|
||||
"copypaste.copy": "Kopii",
|
||||
"copypaste.copy_to_clipboard": "Kopii al dosierujo",
|
||||
"directory.federated": "El konata fediverso",
|
||||
"directory.local": "Nur de {domain}",
|
||||
@@ -303,7 +302,6 @@
|
||||
"interaction_modal.description.reply": "Kun konto ĉe Mastodon, vi povos respondi al ĉi tiu mesaĝo.",
|
||||
"interaction_modal.on_another_server": "En alia servilo",
|
||||
"interaction_modal.on_this_server": "En ĉi tiu servilo",
|
||||
"interaction_modal.preamble": "Ĉar Mastodon estas malcentrigita, vi povas uzi jam ekzistantan konton gastigatan de alia Mastodona servilo aŭ kongrua substrato, se vi ne havas konton ĉe tiu ĉi.",
|
||||
"interaction_modal.title.follow": "Sekvi {name}",
|
||||
"interaction_modal.title.reblog": "Akceli la afiŝon de {name}",
|
||||
"interaction_modal.title.reply": "Respondi al la afiŝo de {name}",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Ver conversación",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiado",
|
||||
"copypaste.copy": "Copiar",
|
||||
"copypaste.copy_to_clipboard": "Copiar al portapapeles",
|
||||
"directory.federated": "Desde fediverso conocido",
|
||||
"directory.local": "Sólo de {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Cualquiera de estas",
|
||||
"hashtag.column_settings.tag_mode.none": "Ninguna de estas",
|
||||
"hashtag.column_settings.tag_toggle": "Incluir etiquetas adicionales para esta columna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"home.actions.go_to_explore": "Mirá qué está en tendencia",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Básico",
|
||||
"home.column_settings.show_reblogs": "Mostrar adhesiones",
|
||||
"home.column_settings.show_replies": "Mostrar respuestas",
|
||||
"home.explore_prompt.body": "Tu línea temporal principal tendrá una mezcla de mensajes de etiquetas que hayás decidido seguir, cuentas que hayás seguido y mensajes a los que éstas adhieran. Ahora está muy tranquilo por acá, así que, qué te parece:",
|
||||
"home.explore_prompt.body": "Tu línea temporal principal tendrá una mezcla de mensajes de etiquetas que hayás decidido seguir, cuentas que hayás seguido y mensajes a los que éstas adhieran. Si está muy tranquilo por acá, quizás quieras:",
|
||||
"home.explore_prompt.title": "Este es tu inicio en Mastodon.",
|
||||
"home.hide_announcements": "Ocultar anuncios",
|
||||
"home.show_announcements": "Mostrar anuncios",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Con una cuenta en Mastodon, podés seguir a {name} para recibir sus mensajes en tu línea temporal principal.",
|
||||
"interaction_modal.description.reblog": "Con una cuenta en Mastodon, podés adherir a este mensaje para compartirlo con tus propios seguidores.",
|
||||
"interaction_modal.description.reply": "Con una cuenta en Mastodon, podés responder a este mensaje.",
|
||||
"interaction_modal.login.action": "Llevame al comienzo",
|
||||
"interaction_modal.login.prompt": "Dominio de su servidor de inicio, p. ej., mastodon.social",
|
||||
"interaction_modal.no_account_yet": "¿No tenés cuenta en Mastodon?",
|
||||
"interaction_modal.on_another_server": "En un servidor diferente",
|
||||
"interaction_modal.on_this_server": "En este servidor",
|
||||
"interaction_modal.other_server_instructions": "Copiá y pegá esta dirección web en la barra de búsqueda de tu aplicación favorita de Mastodon, o en la interface web de tu servidor de Mastodon.",
|
||||
"interaction_modal.preamble": "Ya que Mastodon es descentralizado, podés usar tu cuenta existente alojada por otro servidor Mastodon (u otra plataforma compatible, si no tenés una cuenta en ésta).",
|
||||
"interaction_modal.sign_in": "No iniciaste sesión en este servidor. ¿Dónde se encuentra alojada tu cuenta?",
|
||||
"interaction_modal.sign_in_hint": "Ayuda: es el sitio web en donde te registraste. Si no te acordás, buscá el correo electrónico de bienvenida en tu cuenta de email. También podés usar tu nombre de usuario entero, p. ej., @tunombredeusuario@mastodon.social.",
|
||||
"interaction_modal.title.favourite": "Marcar como favorito el mensaje de {name}",
|
||||
"interaction_modal.title.follow": "Seguir a {name}",
|
||||
"interaction_modal.title.reblog": "Adherir al mensaje de {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Estadísticas del servidor:",
|
||||
"sign_in_banner.create_account": "Crear cuenta",
|
||||
"sign_in_banner.sign_in": "Iniciar sesión",
|
||||
"sign_in_banner.sso_redirect": "Iniciá sesión o registrate",
|
||||
"sign_in_banner.text": "Iniciá sesión para seguir cuentas o etiquetas, marcar mensajes como favoritos, compartirlos y responderlos. También podés interactuar desde tu cuenta en un servidor diferente.",
|
||||
"status.admin_account": "Abrir interface de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderación para {domain}",
|
||||
@@ -671,7 +677,7 @@
|
||||
"timeline_hint.resources.followers": "Tus seguidores",
|
||||
"timeline_hint.resources.follows": "Las cuentas que seguís",
|
||||
"timeline_hint.resources.statuses": "Mensajes más antiguos",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} en el/los pasado/s {days, plural, one {día} other {{days} días}}",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} en {days, plural, one {el pasado día} other {los pasados {days} días}}",
|
||||
"trends.trending_now": "Tendencia ahora",
|
||||
"ui.beforeunload": "Tu borrador se perderá si abandonás Mastodon.",
|
||||
"units.short.billion": "{count}MM",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Ver conversación",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiado",
|
||||
"copypaste.copy": "Copiar",
|
||||
"copypaste.copy_to_clipboard": "Copiar al portapapeles",
|
||||
"directory.federated": "Desde el fediverso conocido",
|
||||
"directory.local": "Sólo de {domain}",
|
||||
@@ -202,6 +201,7 @@
|
||||
"dismissable_banner.community_timeline": "Estas son las publicaciones públicas más recientes de las personas cuyas cuentas están alojadas en {domain}.",
|
||||
"dismissable_banner.dismiss": "Descartar",
|
||||
"dismissable_banner.explore_links": "Estas noticias están siendo discutidas por personas en este y otros servidores de la red descentralizada en este momento.",
|
||||
"dismissable_banner.explore_statuses": "Estas son las publicaciones que están ganando popularidad en la web social hoy. Las publicaciones recientes con más impulsos y favoritos obtienen más exposición.",
|
||||
"dismissable_banner.explore_tags": "Se trata de hashtags que están ganando adeptos en las redes sociales hoy en día. Los hashtags que son utilizados por más personas diferentes se clasifican mejor.",
|
||||
"dismissable_banner.public_timeline": "Estos son los toots públicos más recientes de personas en la web social a las que sigue la gente en {domain}.",
|
||||
"embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
|
||||
@@ -230,6 +230,8 @@
|
||||
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
||||
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
|
||||
"empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!",
|
||||
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando marques una publicación como favorita, se mostrarán aquí.",
|
||||
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.",
|
||||
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
||||
"empty_column.followed_tags": "No estás siguiendo ningún hashtag todavía. Cuando lo hagas, aparecerá aquí.",
|
||||
"empty_column.hashtag": "No hay nada en este hashtag aún.",
|
||||
@@ -293,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
|
||||
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
|
||||
"hashtag.column_settings.tag_toggle": "Incluye etiquetas adicionales para esta columna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"home.actions.go_to_explore": "Ver tendencias",
|
||||
@@ -300,16 +305,22 @@
|
||||
"home.column_settings.basic": "Básico",
|
||||
"home.column_settings.show_reblogs": "Mostrar retoots",
|
||||
"home.column_settings.show_replies": "Mostrar respuestas",
|
||||
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de etiquetas que hayas decidido seguir, personas que hayas seguido y publicaciones que estas impulsen. Ahora está muy vacía, por qué no:",
|
||||
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, la gente que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:",
|
||||
"home.explore_prompt.title": "Este es tu punto de partida en Mastodon.",
|
||||
"home.hide_announcements": "Ocultar anuncios",
|
||||
"home.show_announcements": "Mostrar anuncios",
|
||||
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
||||
"interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu fuente de inicio.",
|
||||
"interaction_modal.description.reblog": "Con una cuenta en Mastodon, puedes impulsar esta publicación para compartirla con tus propios seguidores.",
|
||||
"interaction_modal.description.reply": "Con una cuenta en Mastodon, puedes responder a esta publicación.",
|
||||
"interaction_modal.login.action": "Ir a Inicio",
|
||||
"interaction_modal.login.prompt": "Dominio de tu servidor, por ejemplo mastodon.social",
|
||||
"interaction_modal.no_account_yet": "¿Aún no tienes cuenta en Mastodon?",
|
||||
"interaction_modal.on_another_server": "En un servidor diferente",
|
||||
"interaction_modal.on_this_server": "En este servidor",
|
||||
"interaction_modal.preamble": "Ya que Mastodon es descentralizado, puedes usar tu cuenta existente alojada en otro servidor Mastodon o plataforma compatible si no tienes una cuenta en este servidor.",
|
||||
"interaction_modal.sign_in": "No estás registrado en este servidor. ¿Dónde tienes tu cuenta?",
|
||||
"interaction_modal.sign_in_hint": "Pista: Ese es el sitio donde te registraste. Si no lo recuerdas, busca el correo electrónico de bienvenida en tu bandeja de entrada. También puedes introducir tu nombre de usuario completo (por ejemplo @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Marcar como favorita la publicación de {name}",
|
||||
"interaction_modal.title.follow": "Seguir a {name}",
|
||||
"interaction_modal.title.reblog": "Impulsar la publicación de {name}",
|
||||
"interaction_modal.title.reply": "Responder la publicación de {name}",
|
||||
@@ -325,6 +336,8 @@
|
||||
"keyboard_shortcuts.direct": "para abrir la columna de menciones privadas",
|
||||
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
|
||||
"keyboard_shortcuts.enter": "abrir estado",
|
||||
"keyboard_shortcuts.favourite": "Marcar como favorita la publicación",
|
||||
"keyboard_shortcuts.favourites": "Abrir lista de favoritos",
|
||||
"keyboard_shortcuts.federated": "abrir el timeline federado",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "abrir el timeline propio",
|
||||
@@ -355,6 +368,7 @@
|
||||
"lightbox.previous": "Anterior",
|
||||
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
||||
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
||||
"link_preview.author": "Por {name}",
|
||||
"lists.account.add": "Añadir a lista",
|
||||
"lists.account.remove": "Quitar de lista",
|
||||
"lists.delete": "Borrar lista",
|
||||
@@ -387,6 +401,7 @@
|
||||
"navigation_bar.domain_blocks": "Dominios ocultos",
|
||||
"navigation_bar.edit_profile": "Editar perfil",
|
||||
"navigation_bar.explore": "Explorar",
|
||||
"navigation_bar.favourites": "Favoritos",
|
||||
"navigation_bar.filters": "Palabras silenciadas",
|
||||
"navigation_bar.follow_requests": "Solicitudes para seguirte",
|
||||
"navigation_bar.followed_tags": "Hashtags seguidos",
|
||||
@@ -403,6 +418,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.",
|
||||
"notification.admin.report": "{name} denunció a {target}",
|
||||
"notification.admin.sign_up": "{name} se unio",
|
||||
"notification.favourite": "{name} marcó como favorita tu publicación",
|
||||
"notification.follow": "{name} te empezó a seguir",
|
||||
"notification.follow_request": "{name} ha solicitado seguirte",
|
||||
"notification.mention": "{name} te ha mencionado",
|
||||
@@ -416,6 +432,7 @@
|
||||
"notifications.column_settings.admin.report": "Nuevas denuncias:",
|
||||
"notifications.column_settings.admin.sign_up": "Registros nuevos:",
|
||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
|
||||
@@ -433,6 +450,7 @@
|
||||
"notifications.column_settings.update": "Ediciones:",
|
||||
"notifications.filter.all": "Todos",
|
||||
"notifications.filter.boosts": "Retoots",
|
||||
"notifications.filter.favourites": "Favoritos",
|
||||
"notifications.filter.follows": "Seguidores",
|
||||
"notifications.filter.mentions": "Menciones",
|
||||
"notifications.filter.polls": "Resultados de la votación",
|
||||
@@ -583,6 +601,8 @@
|
||||
"server_banner.server_stats": "Estadísticas del servidor:",
|
||||
"sign_in_banner.create_account": "Crear cuenta",
|
||||
"sign_in_banner.sign_in": "Iniciar sesión",
|
||||
"sign_in_banner.sso_redirect": "Iniciar sesión o Registrarse",
|
||||
"sign_in_banner.text": "Inicia sesión para seguir perfiles o etiquetas, así como marcar como favoritas, compartir y responder a publicaciones. También puedes interactuar desde tu cuenta en un servidor diferente.",
|
||||
"status.admin_account": "Abrir interfaz de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interfaz de moderación para {domain}",
|
||||
"status.admin_status": "Abrir este estado en la interfaz de moderación",
|
||||
@@ -599,6 +619,7 @@
|
||||
"status.edited": "Editado {date}",
|
||||
"status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}",
|
||||
"status.embed": "Incrustado",
|
||||
"status.favourite": "Favorito",
|
||||
"status.filter": "Filtrar esta publicación",
|
||||
"status.filtered": "Filtrado",
|
||||
"status.hide": "Ocultar toot",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Ver conversación",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiado",
|
||||
"copypaste.copy": "Copiar",
|
||||
"copypaste.copy_to_clipboard": "Copiar al portapapeles",
|
||||
"directory.federated": "Desde el fediverso conocido",
|
||||
"directory.local": "Sólo de {domain}",
|
||||
@@ -202,6 +201,7 @@
|
||||
"dismissable_banner.community_timeline": "Estas son las publicaciones públicas más recientes de personas cuyas cuentas están alojadas en {domain}.",
|
||||
"dismissable_banner.dismiss": "Descartar",
|
||||
"dismissable_banner.explore_links": "Estas son las noticias que están siendo más compartidas hoy en la red. Nuevas noticias publicadas por diferentes personas se puntúan más alto.",
|
||||
"dismissable_banner.explore_statuses": "Estas son las publicaciones que están ganando popularidad en la web social hoy. Las publicaciones recientes con más impulsos y favoritos obtienen más exposición.",
|
||||
"dismissable_banner.explore_tags": "Estas son las etiquetas que están ganando popularidad hoy en la red. Etiquetas que se usan por personas diferentes se puntúan más alto.",
|
||||
"dismissable_banner.public_timeline": "Estas son las publicaciones más recientes de personas en el Fediverso que siguen las personas de {domain}.",
|
||||
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
|
||||
@@ -230,6 +230,8 @@
|
||||
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
||||
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
|
||||
"empty_column.explore_statuses": "Nada está en tendencia en este momento. ¡Revisa más tarde!",
|
||||
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando marques una publicación como favorita, se mostrarán aquí.",
|
||||
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.",
|
||||
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
|
||||
"empty_column.followed_tags": "No has seguido ninguna etiqueta todavía. Cuando lo hagas, se mostrarán aquí.",
|
||||
"empty_column.hashtag": "No hay nada en este hashtag aún.",
|
||||
@@ -293,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
|
||||
"hashtag.column_settings.tag_mode.none": "Ninguno de estos",
|
||||
"hashtag.column_settings.tag_toggle": "Incluir etiquetas adicionales en esta columna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"home.actions.go_to_explore": "Ver tendencias",
|
||||
@@ -300,16 +305,22 @@
|
||||
"home.column_settings.basic": "Básico",
|
||||
"home.column_settings.show_reblogs": "Mostrar impulsos",
|
||||
"home.column_settings.show_replies": "Mostrar respuestas",
|
||||
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de etiquetas que hayas decidido seguir, personas que hayas seguido y publicaciones que estas impulsen. Ahora está muy vacía, por qué no:",
|
||||
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, la gente que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:",
|
||||
"home.explore_prompt.title": "Este es tu punto de partida en Mastodon.",
|
||||
"home.hide_announcements": "Ocultar anuncios",
|
||||
"home.show_announcements": "Mostrar anuncios",
|
||||
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
|
||||
"interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu línea temporal de inicio.",
|
||||
"interaction_modal.description.reblog": "Con una cuenta en Mastodon, puedes impulsar esta publicación para compartirla con tus propios seguidores.",
|
||||
"interaction_modal.description.reply": "Con una cuenta en Mastodon, puedes responder a esta publicación.",
|
||||
"interaction_modal.login.action": "Ir a Inicio",
|
||||
"interaction_modal.login.prompt": "Dominio de tu servidor, por ejemplo mastodon.social",
|
||||
"interaction_modal.no_account_yet": "¿Aún no tienes cuenta en Mastodon?",
|
||||
"interaction_modal.on_another_server": "En un servidor diferente",
|
||||
"interaction_modal.on_this_server": "En este servidor",
|
||||
"interaction_modal.preamble": "Ya que Mastodon es descentralizado, puedes usar tu cuenta existente alojada en otro servidor Mastodon o plataforma compatible si no tienes una cuenta en este servidor.",
|
||||
"interaction_modal.sign_in": "No estás registrado en este servidor. ¿Dónde tienes tu cuenta?",
|
||||
"interaction_modal.sign_in_hint": "Pista: Ese es el sitio donde te registraste. Si no lo recuerdas, busca el correo electrónico de bienvenida en tu bandeja de entrada. También puedes introducir tu nombre de usuario completo (por ejemplo @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Marcar como favorita la publicación de {name}",
|
||||
"interaction_modal.title.follow": "Seguir a {name}",
|
||||
"interaction_modal.title.reblog": "Impulsar la publicación de {name}",
|
||||
"interaction_modal.title.reply": "Responder a la publicación de {name}",
|
||||
@@ -325,6 +336,8 @@
|
||||
"keyboard_shortcuts.direct": "para abrir la columna de menciones privadas",
|
||||
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
|
||||
"keyboard_shortcuts.enter": "Abrir publicación",
|
||||
"keyboard_shortcuts.favourite": "Marcar como favorita la publicación",
|
||||
"keyboard_shortcuts.favourites": "Abrir lista de favoritos",
|
||||
"keyboard_shortcuts.federated": "Abrir la cronología federada",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "Abrir cronología principal",
|
||||
@@ -355,6 +368,7 @@
|
||||
"lightbox.previous": "Anterior",
|
||||
"limited_account_hint.action": "Mostrar perfil de todos modos",
|
||||
"limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.",
|
||||
"link_preview.author": "Por {name}",
|
||||
"lists.account.add": "Añadir a lista",
|
||||
"lists.account.remove": "Quitar de lista",
|
||||
"lists.delete": "Borrar lista",
|
||||
@@ -377,6 +391,7 @@
|
||||
"mute_modal.hide_notifications": "¿Ocultar notificaciones de este usuario?",
|
||||
"mute_modal.indefinite": "Indefinida",
|
||||
"navigation_bar.about": "Acerca de",
|
||||
"navigation_bar.advanced_interface": "Abrir en la interfaz web avanzada",
|
||||
"navigation_bar.blocks": "Usuarios bloqueados",
|
||||
"navigation_bar.bookmarks": "Marcadores",
|
||||
"navigation_bar.community_timeline": "Cronología local",
|
||||
@@ -386,6 +401,7 @@
|
||||
"navigation_bar.domain_blocks": "Dominios ocultos",
|
||||
"navigation_bar.edit_profile": "Editar perfil",
|
||||
"navigation_bar.explore": "Explorar",
|
||||
"navigation_bar.favourites": "Favoritos",
|
||||
"navigation_bar.filters": "Palabras silenciadas",
|
||||
"navigation_bar.follow_requests": "Solicitudes para seguirte",
|
||||
"navigation_bar.followed_tags": "Etiquetas seguidas",
|
||||
@@ -402,6 +418,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.",
|
||||
"notification.admin.report": "{name} informó {target}",
|
||||
"notification.admin.sign_up": "{name} se registró",
|
||||
"notification.favourite": "{name} marcó como favorita tu publicación",
|
||||
"notification.follow": "{name} te empezó a seguir",
|
||||
"notification.follow_request": "{name} ha solicitado seguirte",
|
||||
"notification.mention": "{name} te ha mencionado",
|
||||
@@ -415,6 +432,7 @@
|
||||
"notifications.column_settings.admin.report": "Nuevos informes:",
|
||||
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
|
||||
@@ -432,6 +450,7 @@
|
||||
"notifications.column_settings.update": "Ediciones:",
|
||||
"notifications.filter.all": "Todos",
|
||||
"notifications.filter.boosts": "Impulsos",
|
||||
"notifications.filter.favourites": "Favoritos",
|
||||
"notifications.filter.follows": "Seguidores",
|
||||
"notifications.filter.mentions": "Menciones",
|
||||
"notifications.filter.polls": "Resultados de la votación",
|
||||
@@ -582,6 +601,8 @@
|
||||
"server_banner.server_stats": "Estadísticas del servidor:",
|
||||
"sign_in_banner.create_account": "Crear cuenta",
|
||||
"sign_in_banner.sign_in": "Iniciar sesión",
|
||||
"sign_in_banner.sso_redirect": "Iniciar sesión o Registrarse",
|
||||
"sign_in_banner.text": "Inicia sesión para seguir perfiles o etiquetas, así como marcar como favoritas, compartir y responder a publicaciones. También puedes interactuar desde tu cuenta en un servidor diferente.",
|
||||
"status.admin_account": "Abrir interfaz de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interfaz de moderación para {domain}",
|
||||
"status.admin_status": "Abrir esta publicación en la interfaz de moderación",
|
||||
@@ -598,6 +619,7 @@
|
||||
"status.edited": "Editado {date}",
|
||||
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
||||
"status.embed": "Incrustado",
|
||||
"status.favourite": "Favorito",
|
||||
"status.filter": "Filtrar esta publicación",
|
||||
"status.filtered": "Filtrado",
|
||||
"status.hide": "Ocultar publicación",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Vaata vestlust",
|
||||
"conversation.with": "Koos {names}",
|
||||
"copypaste.copied": "Kopeeritud",
|
||||
"copypaste.copy": "Kopeeri",
|
||||
"copypaste.copy_to_clipboard": "Kopeeri vahemällu",
|
||||
"directory.federated": "Tuntud födiversumist",
|
||||
"directory.local": "Ainult domeenilt {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Mõni neist",
|
||||
"hashtag.column_settings.tag_mode.none": "Mitte ükski neist",
|
||||
"hashtag.column_settings.tag_toggle": "Kaasa lisamärked selle tulba jaoks",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} osalejaga} other {{counter} osalejaga}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} postitusega} other {{counter} postitusega}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postitust} other {{counter} postitust}} täna",
|
||||
"hashtag.follow": "Jälgi silti",
|
||||
"hashtag.unfollow": "Lõpeta sildi jälgimine",
|
||||
"home.actions.go_to_explore": "Vaata, mis on populaarne",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Peamine",
|
||||
"home.column_settings.show_reblogs": "Näita jagamisi",
|
||||
"home.column_settings.show_replies": "Näita vastuseid",
|
||||
"home.explore_prompt.body": "Sinu koduvoos on koos jälgimiseks valitud siltidega postitused, sinu jälgitavate inimeste postitused ja postitused, mida nad jagavad. Praegu paistab siin üsna vaikne olema, et kuidas oleks kui:",
|
||||
"home.explore_prompt.body": "Sinu koduvoos on koos jälgimiseks valitud siltidega postitused, sinu jälgitavate inimeste postitused ja postitused, mida nad jagavad. Kui see tundub liiga vaikne, võid sa soovida:",
|
||||
"home.explore_prompt.title": "See on sinu kodubaas Mastodonis.",
|
||||
"home.hide_announcements": "Peida teadaanded",
|
||||
"home.show_announcements": "Kuva teadaandeid",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Mastodoni kontoga saad jälgida kasutajat {name}, et tema postitusi oma koduvoos näha.",
|
||||
"interaction_modal.description.reblog": "Mastodoni kontoga saad seda postitust levitada, jagades seda oma jälgijatele.",
|
||||
"interaction_modal.description.reply": "Mastodoni kontoga saad sellele postitusele vastata.",
|
||||
"interaction_modal.login.action": "Vii mind avalehele",
|
||||
"interaction_modal.login.prompt": "Sinu koduserveri domeen, näiteks mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Pole Mastodonis?",
|
||||
"interaction_modal.on_another_server": "Teises serveris",
|
||||
"interaction_modal.on_this_server": "Selles serveris",
|
||||
"interaction_modal.other_server_instructions": "Kopeeri ja kleebi see URL oma Mastodoni lemmikäpi või Mastodoni serveri veebiliidese otsinguväljale.",
|
||||
"interaction_modal.preamble": "Kuna Mastodon on detsentraliseeritud, saab kasutada teises Mastodoni serveris olevat kontot või ka ühilduval platvormil, kui siin serveril kontot ei ole.",
|
||||
"interaction_modal.sign_in": "Sa pole sellesse serverisse sisse logitud. Kus sinu konto asub?",
|
||||
"interaction_modal.sign_in_hint": "Vihje: See on veebileht, millel sa registreerusid. Kui see ei meenu, otsi sisendkaustast tervitus-e-kirja. Võid sisestada ka oma täispika kasutajanime! (Näit. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Lisa konto {name} postitus lemmikuks",
|
||||
"interaction_modal.title.follow": "Jälgi kontot {name}",
|
||||
"interaction_modal.title.reblog": "Jaga {name} postitust",
|
||||
@@ -386,6 +391,7 @@
|
||||
"mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
|
||||
"mute_modal.indefinite": "Lõpmatu",
|
||||
"navigation_bar.about": "Teave",
|
||||
"navigation_bar.advanced_interface": "Ava kohandatud veebiliides",
|
||||
"navigation_bar.blocks": "Blokeeritud kasutajad",
|
||||
"navigation_bar.bookmarks": "Järjehoidjad",
|
||||
"navigation_bar.community_timeline": "Kohalik ajajoon",
|
||||
@@ -444,6 +450,7 @@
|
||||
"notifications.column_settings.update": "Muudatused:",
|
||||
"notifications.filter.all": "Kõik",
|
||||
"notifications.filter.boosts": "Jagamised",
|
||||
"notifications.filter.favourites": "Lemmikud",
|
||||
"notifications.filter.follows": "Jälgib",
|
||||
"notifications.filter.mentions": "Mainimised",
|
||||
"notifications.filter.polls": "Küsitluse tulemused",
|
||||
@@ -594,6 +601,7 @@
|
||||
"server_banner.server_stats": "Serveri statistika:",
|
||||
"sign_in_banner.create_account": "Loo konto",
|
||||
"sign_in_banner.sign_in": "Logi sisse",
|
||||
"sign_in_banner.sso_redirect": "Sisene või registreeru",
|
||||
"sign_in_banner.text": "Logi sisse, et jälgida profiile või silte, märkida lemmikuks, jagada ja vastata postitustele. Võid suhelda ka mõne teise serveri konto kaudu.",
|
||||
"status.admin_account": "Ava @{name} moderaatorivaates",
|
||||
"status.admin_domain": "Ava {domain} modeereerimisliides",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Ikusi elkarrizketa",
|
||||
"conversation.with": "Hauekin: {names}",
|
||||
"copypaste.copied": "Kopiatuta",
|
||||
"copypaste.copy": "Kopiatu",
|
||||
"copypaste.copy_to_clipboard": "Kopiatu arbelera",
|
||||
"directory.federated": "Fedibertso ezagunekoak",
|
||||
"directory.local": "{domain} domeinukoak soilik",
|
||||
@@ -293,6 +292,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Hautako edozein",
|
||||
"hashtag.column_settings.tag_mode.none": "Hauetako bat ere ez",
|
||||
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} parte-hartzaile} other {{counter} parte-hartzaile}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}} gaur",
|
||||
"hashtag.follow": "Jarraitu traola",
|
||||
"hashtag.unfollow": "Utzi traola jarraitzeari",
|
||||
"home.actions.go_to_explore": "Ikusi zer dagoen pil-pilean",
|
||||
@@ -300,16 +302,19 @@
|
||||
"home.column_settings.basic": "Oinarrizkoa",
|
||||
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
|
||||
"home.column_settings.show_replies": "Erakutsi erantzunak",
|
||||
"home.explore_prompt.body": "Zure hasierako jarioak jarraitzeko aukeratu dituzun traolen, jarraitzeko aukeratu duzun jendearen eta beraiek bultzatutako argitalpenen nahasketa bat edukiko du. Nahiko isila dirudi oraintxe, beraz, zergatik ez:",
|
||||
"home.explore_prompt.title": "Hau zure hasiera da Mastodonen.",
|
||||
"home.hide_announcements": "Ezkutatu iragarpenak",
|
||||
"home.show_announcements": "Erakutsi iragarpenak",
|
||||
"interaction_modal.description.follow": "Mastodon kontu batekin {name} jarraitu dezakezu bere bidalketak zure hasierako denbora lerroan jasotzeko.",
|
||||
"interaction_modal.description.reblog": "Mastodon kontu batekin bidalketa hau bultzatu dezakezu, zure jarraitzaileekin partekatzeko.",
|
||||
"interaction_modal.description.reply": "Mastodon kontu batekin bidalketa honi erantzun diezaiokezu.",
|
||||
"interaction_modal.login.action": "Itzuli hasierara",
|
||||
"interaction_modal.login.prompt": "Zure zerbitzariko domeinua, adib. mastodon.eus",
|
||||
"interaction_modal.no_account_yet": "Oraindik ez duzu izena eman Mastodonen?",
|
||||
"interaction_modal.on_another_server": "Beste zerbitzari batean",
|
||||
"interaction_modal.on_this_server": "Zerbitzari honetan",
|
||||
"interaction_modal.preamble": "Mastodon deszentralizatua denez, zerbitzari honetan konturik ez badaukazu, beste Mastodon zerbitzari batean edo bateragarria den plataforma batean ostatatutako kontua erabil dezakezu.",
|
||||
"interaction_modal.sign_in": "Ez duzu saioa hasita zerbitzari honetan. Non dago zure kontua ostatatua?",
|
||||
"interaction_modal.sign_in_hint": "Aholkua: Izena eman duzun zerbitzaria da. Ez baduzu gogoratzen, begiratu ongietorri-mezua zure sarrera-ontzian. Baita ere, zure erabiltzaile-izen osoa sar dezakezu! (adib. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.follow": "Jarraitu {name}",
|
||||
"interaction_modal.title.reblog": "Bultzatu {name}(r)en bidalketa",
|
||||
"interaction_modal.title.reply": "Erantzun {name}(r)en bidalketari",
|
||||
@@ -584,6 +589,7 @@
|
||||
"server_banner.server_stats": "Zerbitzariaren estatistikak:",
|
||||
"sign_in_banner.create_account": "Sortu kontua",
|
||||
"sign_in_banner.sign_in": "Hasi saioa",
|
||||
"sign_in_banner.sso_redirect": "Hasi saioa edo izena eman",
|
||||
"status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
|
||||
"status.admin_domain": "{domain}-(r)en moderazio-interfazea ireki",
|
||||
"status.admin_status": "Ireki bidalketa hau moderazio interfazean",
|
||||
|
||||
@@ -190,7 +190,6 @@
|
||||
"conversation.open": "دیدن گفتگو",
|
||||
"conversation.with": "با {names}",
|
||||
"copypaste.copied": "رونوشت شد",
|
||||
"copypaste.copy": "رونوشت",
|
||||
"copypaste.copy_to_clipboard": "رونوشت به تختهگیره",
|
||||
"directory.federated": "از کارسازهای شناختهشده",
|
||||
"directory.local": "تنها از {domain}",
|
||||
@@ -302,7 +301,6 @@
|
||||
"home.column_settings.basic": "پایهای",
|
||||
"home.column_settings.show_reblogs": "نمایش تقویتها",
|
||||
"home.column_settings.show_replies": "نمایش پاسخها",
|
||||
"home.explore_prompt.body": "خوراک خانگیتان ترکیبی از فرستهها از برچسبهایی که برای پیگیری گزیدهاید، افرادی که پی میگیرید و فرستههایی که تقویت میکنند را خواهد داشت. در حال حاضر بسیار ساکت است؛ پس چه طور است:",
|
||||
"home.explore_prompt.title": "این پایگاه خانگیتان در ماستودون است.",
|
||||
"home.hide_announcements": "نهفتن اعلامیهها",
|
||||
"home.show_announcements": "نمایش اعلامیهها",
|
||||
@@ -312,8 +310,6 @@
|
||||
"interaction_modal.description.reply": "با حسابی روی ماستودون میتوانید به این فرسته پاسخ دهید.",
|
||||
"interaction_modal.on_another_server": "روی کارسازی دیگر",
|
||||
"interaction_modal.on_this_server": "روی این کارساز",
|
||||
"interaction_modal.other_server_instructions": "این نشانی را رونویسی و در زمینهٔ جستوجوی کارهٔ دلخواه یا رابط وب کارساز ماستودونتان جایگذاری کنید.",
|
||||
"interaction_modal.preamble": "از آنجا که ماستودون نامتمرکز است، میتوانید در صورت نداشتن حساب روی این کارساز، از حساب موجود خودتان که روی کارساز ماستودون یا بنسازهٔ سازگار دیگری میزبانی میشود استفاده کنید.",
|
||||
"interaction_modal.title.favourite": "فرستههای برگزیدهٔ {name}",
|
||||
"interaction_modal.title.follow": "پیگیری {name}",
|
||||
"interaction_modal.title.reblog": "تقویت فرستهٔ {name}",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
"account.mute_notifications_short": "Mykistä ilmoitukset",
|
||||
"account.mute_short": "Mykistä",
|
||||
"account.muted": "Mykistetty",
|
||||
"account.no_bio": "Ei kuvausta.",
|
||||
"account.no_bio": "Kuvausta ei ole annettu.",
|
||||
"account.open_original_page": "Avaa alkuperäinen sivu",
|
||||
"account.posts": "viesti(t)",
|
||||
"account.posts_with_replies": "Viestit ja vastaukset",
|
||||
@@ -68,7 +68,7 @@
|
||||
"account.unendorse": "Poista suosittelu profiilistasi",
|
||||
"account.unfollow": "Lopeta seuraaminen",
|
||||
"account.unmute": "Poista käyttäjän @{name} mykistys",
|
||||
"account.unmute_notifications_short": "Poista ilmoitusten mykistys",
|
||||
"account.unmute_notifications_short": "Kumoa ilmoitusten mykistys",
|
||||
"account.unmute_short": "Poista mykistys",
|
||||
"account_note.placeholder": "Lisää muistiinpano napsauttamalla",
|
||||
"admin.dashboard.daily_retention": "Käyttäjän säilyminen rekisteröitymisen jälkeiseen päivään mennessä",
|
||||
@@ -81,7 +81,7 @@
|
||||
"admin.impact_report.instance_follows": "Seuraajat, jotka heidän käyttäjänsä menettäisivät",
|
||||
"admin.impact_report.title": "Vaikutusten yhteenveto",
|
||||
"alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.",
|
||||
"alert.rate_limited.title": "Määrää rajoitettu",
|
||||
"alert.rate_limited.title": "Pyyntömäärää rajoitettu",
|
||||
"alert.unexpected.message": "Tapahtui odottamaton virhe.",
|
||||
"alert.unexpected.title": "Hups!",
|
||||
"announcement.announcement": "Ilmoitus",
|
||||
@@ -135,7 +135,7 @@
|
||||
"community.column_settings.remote_only": "Vain etätilit",
|
||||
"compose.language.change": "Vaihda kieli",
|
||||
"compose.language.search": "Hae kieliä...",
|
||||
"compose.published.body": "Julkaisu lähetetty.",
|
||||
"compose.published.body": "Julkaisusi julkaistiin.",
|
||||
"compose.published.open": "Avaa",
|
||||
"compose_form.direct_message_warning_learn_more": "Lisätietoja",
|
||||
"compose_form.encryption_warning": "Mastodonin viestit eivät ole päästä päähän salattuja. Älä jaa arkaluonteisia tietoja Mastodonissa.",
|
||||
@@ -150,7 +150,7 @@
|
||||
"compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi",
|
||||
"compose_form.poll.switch_to_single": "Muuta äänestys sallimaan vain yksi valinta",
|
||||
"compose_form.publish": "Julkaise",
|
||||
"compose_form.publish_form": "Julkaise",
|
||||
"compose_form.publish_form": "Uusi julkaisu",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "Tallenna muutokset",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluontoiseksi} other {Merkitse mediat arkaluontoiseksi}}",
|
||||
@@ -181,7 +181,7 @@
|
||||
"confirmations.mute.explanation": "Tämä toiminto piilottaa heidän julkaisunsa sinulta – mukaan lukien ne, joissa heidät mainitaan – sallien heidän yhä nähdä julkaisusi ja seurata sinua.",
|
||||
"confirmations.mute.message": "Haluatko varmasti mykistää profiilin {name}?",
|
||||
"confirmations.redraft.confirm": "Poista & palauta muokattavaksi",
|
||||
"confirmations.redraft.message": "Haluatko varmasti poistaa viestin ja tehdä siitä uuden luonnoksen? Suosikit ja tehostukset menetään, ja alkuperäisen viestisi vastaukset jäävät orvoiksi.",
|
||||
"confirmations.redraft.message": "Haluatko varmasti poistaa viestin ja tehdä siitä luonnoksen? Suosikiksi lisäykset sekä tehostukset menetään, ja vastaukset alkuperäisviestiisi jäävät orvoiksi.",
|
||||
"confirmations.reply.confirm": "Vastaa",
|
||||
"confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?",
|
||||
"confirmations.unfollow.confirm": "Lopeta seuraaminen",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Näytä keskustelu",
|
||||
"conversation.with": "{names} kanssa",
|
||||
"copypaste.copied": "Kopioitu",
|
||||
"copypaste.copy": "Kopioi",
|
||||
"copypaste.copy_to_clipboard": "Kopioi leikepöydälle",
|
||||
"directory.federated": "Koko tunnettu fediverse",
|
||||
"directory.local": "Vain palvelusta {domain}",
|
||||
@@ -201,10 +200,10 @@
|
||||
"disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.",
|
||||
"dismissable_banner.community_timeline": "Nämä ovat uusimmat julkiset julkaisut käyttäjiltä, joiden tilejä isännöi {domain}.",
|
||||
"dismissable_banner.dismiss": "Hylkää",
|
||||
"dismissable_banner.explore_links": "Näistä uutisista puhuvat ihmiset juuri nyt tällä ja muilla hajautetun verkon palvelimilla.",
|
||||
"dismissable_banner.explore_statuses": "Nämä ovat sosiaalisen verkon viestejä, jotka keräävät huomiota tänään. Uudemmat ja enemmän tehostetut viestit, ja suosikit rankataan korkeammalle.",
|
||||
"dismissable_banner.explore_links": "Näistä uutisista puhutaan juuri nyt tällä ja muilla hajautetun verkon palvelimilla.",
|
||||
"dismissable_banner.explore_statuses": "Nämä ovat tänään huomiota keräävimpiä sosiaalisen verkon julkaisuja. Tuoreimmat, tehostetuimmat sekä suosikeiksi merkityimmät sijoitetaan listauksessa korkeammalle.",
|
||||
"dismissable_banner.explore_tags": "Nämä aihetunnisteet saavat juuri nyt vetovoimaa tällä ja muilla hajautetun verkon palvelimilla olevien ihmisten keskuudessa.",
|
||||
"dismissable_banner.public_timeline": "Nämä ovat viimeisimmät julkiset viestit sosiaalisen verkon ihmisiltä, joita {domain} käyttäjät seuraa.",
|
||||
"dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelussa {domain}.",
|
||||
"embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
|
||||
"embed.preview": "Se tulee näyttämään tältä:",
|
||||
"emoji_button.activity": "Aktiviteetit",
|
||||
@@ -232,11 +231,11 @@
|
||||
"empty_column.domain_blocks": "Palveluita ei ole vielä estetty.",
|
||||
"empty_column.explore_statuses": "Mikään ei trendaa nyt. Tarkista myöhemmin uudelleen!",
|
||||
"empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkiviestiä. Kun lisäät yhden, näkyy se tässä.",
|
||||
"empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä viestiä suosikkeihinsa. Kun joku on lisännyt, näkyy hän tässä.",
|
||||
"empty_column.favourites": "Kukaan ei ole vielä merkinnyt tätä viestiä suosikiksi. Kun joku tekee niin, näkyy asia täällä.",
|
||||
"empty_column.follow_requests": "Et ole vielä vastaanottanut seurauspyyntöjä. Saamasi pyynnöt näytetään täällä.",
|
||||
"empty_column.followed_tags": "Et ole vielä ottanut yhtään aihetunnistetta seurattavaksesi. Jos tai kun sitten teet niin, ne listautuvat tänne.",
|
||||
"empty_column.hashtag": "Tällä aihetunnisteella ei ole vielä mitään.",
|
||||
"empty_column.home": "Kotisi aikajana on tyhjä! Seuraa lisää ihmisiä täyttääksesi sen. {suggestions}",
|
||||
"empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia henkilöjä, niin näet enemmän sisältöä.",
|
||||
"empty_column.list": "Tässä luettelossa ei ole vielä mitään. Kun tämän luettelon jäsenet julkaisevat uusia viestejä, ne näkyvät täällä.",
|
||||
"empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.",
|
||||
"empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
|
||||
@@ -296,26 +295,32 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Mikä tahansa näistä",
|
||||
"hashtag.column_settings.tag_mode.none": "Ei mitään näistä",
|
||||
"hashtag.column_settings.tag_toggle": "Sisällytä lisätunnisteet tähän sarakkeeseen",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} osallistuja} other {{counter} osallistujaa}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one{{counter} julkaisu} other {{counter} julkaisua}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}} tänään",
|
||||
"hashtag.follow": "Seuraa aihetunnistetta",
|
||||
"hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen",
|
||||
"home.actions.go_to_explore": "Näe mitä tapahtuu",
|
||||
"home.actions.go_to_explore": "Katso, mikä on suosittua",
|
||||
"home.actions.go_to_suggestions": "Löydä seurattavia käyttäjiä",
|
||||
"home.column_settings.basic": "Perusasetukset",
|
||||
"home.column_settings.show_reblogs": "Näytä tehostukset",
|
||||
"home.column_settings.show_replies": "Näytä vastaukset",
|
||||
"home.explore_prompt.body": "Kotisyötteesi on sekoitus seuraamistasi aihetunnisteista ja käyttäjistä sekä heidän tehostamistaan viesteistä. Se näyttää tällä hetkellä varsin hiljaiselta, joten mitäpä jos:",
|
||||
"home.explore_prompt.title": "Tämä on kotitukikohtasi Mastodonissa.",
|
||||
"home.explore_prompt.body": "Kotisyötteesi on sekoitus seuraamistasi aihetunnisteista ja käyttäjistä sekä heidän tehostamistaan viesteistä. Jos se näyttää tällä hetkellä turhan hiljaiselta, saatat haluta:",
|
||||
"home.explore_prompt.title": "Tämä on tukikohtasi Mastodonissa.",
|
||||
"home.hide_announcements": "Piilota ilmoitukset",
|
||||
"home.show_announcements": "Näytä ilmoitukset",
|
||||
"interaction_modal.description.favourite": "Mastodon-tilillä voit lisätä viestin suosikkeihisi näyttääksesi sen kirjoittajalle arvostavasi sitä ja tallentaaksesi sen tulevaisuutta varten.",
|
||||
"interaction_modal.description.favourite": "Mastodon-tilisi myötä voit merkitä julkaisuja suosikeiksi, jolloin osoitat julkaisijoille arvostavasi sisältöä, ja tallennat sitä myös helpommin saatavillesi jatkossa.",
|
||||
"interaction_modal.description.follow": "Kun sinulla on Mastodon-tili, voit seurata käyttäjää {name} nähdäksesi hänen viestinsä kotisyötteessäsi.",
|
||||
"interaction_modal.description.reblog": "Kun sinulla on tili Mastodonissa, voit tehostaa viestiä ja jakaa sen omien seuraajiesi kanssa.",
|
||||
"interaction_modal.description.reply": "Kun sinulla on tili Mastodonissa, voit vastata tähän viestiin.",
|
||||
"interaction_modal.login.action": "Palaa aloitussivulle",
|
||||
"interaction_modal.login.prompt": "Kotipalvelimesi verkkotunnus (kuten mastodon.social)",
|
||||
"interaction_modal.no_account_yet": "Etkö ole vielä Mastodonissa?",
|
||||
"interaction_modal.on_another_server": "Toisella palvelimella",
|
||||
"interaction_modal.on_this_server": "Tällä palvelimella",
|
||||
"interaction_modal.other_server_instructions": "Kopioi ja liitä tämä URL-osoite käyttämäsi Mastodon-sovelluksen tai Mastodon-palvelimen verkkosivuston hakukenttään.",
|
||||
"interaction_modal.preamble": "Koska Mastodon on hajautettu, voit käyttää toisen Mastodon-palvelimen tai yhteensopivan alustan ylläpitämää tiliäsi, jos sinulla ei ole tiliä tällä palvelimella.",
|
||||
"interaction_modal.title.favourite": "Lisää käyttäjän {name} viesti suosikkeihin",
|
||||
"interaction_modal.sign_in": "Et ole kirjautunut tälle palvelimelle. Millä palvelimella tilisi sijaitsee?",
|
||||
"interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolla loit tilisi. Jos et muista, etsi tervetuliaissähköpostia saapuneista viesteistäsi. Voit myös syöttää koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Lisää käyttäjän {name} julkaisu suosikkeihin",
|
||||
"interaction_modal.title.follow": "Seuraa {name}",
|
||||
"interaction_modal.title.reblog": "Tehosta käyttäjän {name} viestiä",
|
||||
"interaction_modal.title.reply": "Vastaa käyttäjän {name} viestiin",
|
||||
@@ -331,7 +336,7 @@
|
||||
"keyboard_shortcuts.direct": "avataksesi yksityisten mainintojen sarakkeen",
|
||||
"keyboard_shortcuts.down": "Siirry listassa alaspäin",
|
||||
"keyboard_shortcuts.enter": "Avaa julkaisu",
|
||||
"keyboard_shortcuts.favourite": "Lisää viesti suosikkeihin",
|
||||
"keyboard_shortcuts.favourite": "Lisää julkaisu suosikkeihin",
|
||||
"keyboard_shortcuts.favourites": "Avaa suosikkilista",
|
||||
"keyboard_shortcuts.federated": "Avaa yleinen aikajana",
|
||||
"keyboard_shortcuts.heading": "Pikanäppäimet",
|
||||
@@ -369,7 +374,7 @@
|
||||
"lists.delete": "Poista lista",
|
||||
"lists.edit": "Muokkaa listaa",
|
||||
"lists.edit.submit": "Vaihda otsikko",
|
||||
"lists.exclusive": "Piilota nämä viestit kotoasi",
|
||||
"lists.exclusive": "Piilota nämä julkaisut kotiaikajanaltasi",
|
||||
"lists.new.create": "Lisää lista",
|
||||
"lists.new.title_placeholder": "Uuden listan nimi",
|
||||
"lists.replies_policy.followed": "Jokainen seurattu käyttäjä",
|
||||
@@ -386,7 +391,7 @@
|
||||
"mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?",
|
||||
"mute_modal.indefinite": "Ikuisesti",
|
||||
"navigation_bar.about": "Tietoja",
|
||||
"navigation_bar.advanced_interface": "Avaa edistyneessä käyttöliittymässä",
|
||||
"navigation_bar.advanced_interface": "Avaa edistyneessä selainkäyttöliittymässä",
|
||||
"navigation_bar.blocks": "Estetyt käyttäjät",
|
||||
"navigation_bar.bookmarks": "Kirjanmerkit",
|
||||
"navigation_bar.community_timeline": "Paikallinen aikajana",
|
||||
@@ -413,12 +418,12 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.",
|
||||
"notification.admin.report": "{name} teki ilmoituksen käytäjästä {target}",
|
||||
"notification.admin.sign_up": "{name} rekisteröityi",
|
||||
"notification.favourite": "{name} lisäsi viestisi suosikkeihinsa",
|
||||
"notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa",
|
||||
"notification.follow": "{name} seurasi sinua",
|
||||
"notification.follow_request": "{name} haluaa seurata sinua",
|
||||
"notification.mention": "{name} mainitsi sinut",
|
||||
"notification.own_poll": "Äänestyksesi on päättynyt",
|
||||
"notification.poll": "Kysely, johon osallistuit, on päättynyt",
|
||||
"notification.poll": "Äänestys, johon osallistuit, on päättynyt",
|
||||
"notification.reblog": "{name} tehosti viestiäsi",
|
||||
"notification.status": "{name} julkaisi juuri viestin",
|
||||
"notification.update": "{name} muokkasi viestiä",
|
||||
@@ -461,8 +466,8 @@
|
||||
"notifications_permission_banner.title": "Älä anna minkään mennä ohi",
|
||||
"onboarding.action.back": "Palaa takaisin",
|
||||
"onboarding.actions.back": "Palaa takaisin",
|
||||
"onboarding.actions.go_to_explore": "Katso, mikä on trendikästä",
|
||||
"onboarding.actions.go_to_home": "Siirry kotisyötteeseesi",
|
||||
"onboarding.actions.go_to_explore": "Siirry suosituimpien aiheiden syötteeseen",
|
||||
"onboarding.actions.go_to_home": "Siirry kotisyötteeseen",
|
||||
"onboarding.compose.template": "Tervehdys #Mastodon!",
|
||||
"onboarding.follows.empty": "Valitettavasti tuloksia ei voida näyttää juuri nyt. Voit kokeilla hakua tai selata tutustumissivua löytääksesi seurattavaa, tai yrittää myöhemmin uudelleen.",
|
||||
"onboarding.follows.lead": "Kokoat oman kotisyötteesi itse. Mitä enemmän ihmisiä seuraat, sitä aktiivisempi ja kiinnostavampi syöte on. Nämä profiilit voivat olla alkuun hyvä lähtökohta — voit aina lopettaa niiden seuraamisen myöhemmin!",
|
||||
@@ -471,17 +476,17 @@
|
||||
"onboarding.share.message": "Olen {username} #Mastodon'issa! Seuraa minua osoitteessa {url}",
|
||||
"onboarding.share.next_steps": "Mahdolliset seuraavat vaiheet:",
|
||||
"onboarding.share.title": "Jaa profiilisi",
|
||||
"onboarding.start.lead": "Uusi Mastodon-tilisi on valmiina käyttöön. Näin hyödyt siitä eniten:",
|
||||
"onboarding.start.skip": "Haluatko hypätä suoraan eteenpäin?",
|
||||
"onboarding.start.lead": "Uusi Mastodon-tilisi on nyt valmiina käyttöön. Kyseessä on ainutlaatuinen, hajautettu sosiaalisen median alusta, jolla sinä itse – algoritmin sijaan – määrität käyttökokemuksesi. Näin hyödyt Mastodonista eniten:",
|
||||
"onboarding.start.skip": "Haluatko hypätä suoraan eteenpäin ilman alkuunpääsyohjeistuksia?",
|
||||
"onboarding.start.title": "Olet tehnyt sen!",
|
||||
"onboarding.steps.follow_people.body": "Kokoat oman syötteesi itse. Täytetään se kiinnostavilla henkilöillä.",
|
||||
"onboarding.steps.follow_people.title": "Seurattu {count, plural, one {henkilö} other {# henkilöä}}",
|
||||
"onboarding.steps.publish_status.body": "Sano tervehdys maailmalle.",
|
||||
"onboarding.steps.follow_people.body": "Mastodon perustuu sinua kiinnostavien henkilöjen julkaisujen seuraamiseen.",
|
||||
"onboarding.steps.follow_people.title": "Mukauta kotisyötteesi",
|
||||
"onboarding.steps.publish_status.body": "Tervehdi maailmaa sanoin, kuvin tai äänestyksin {emoji}",
|
||||
"onboarding.steps.publish_status.title": "Laadi ensimmäinen julkaisusi",
|
||||
"onboarding.steps.setup_profile.body": "Kun profiilisi on täytetty, muut ovat helpommin yhteyksissä sinun kanssasi.",
|
||||
"onboarding.steps.setup_profile.title": "Muokkaa profiiliasi",
|
||||
"onboarding.steps.share_profile.body": "Kerro ystävillesi, kuinka sinut löytää Mastodonista!",
|
||||
"onboarding.steps.share_profile.title": "Jaa profiilisi",
|
||||
"onboarding.steps.setup_profile.body": "Täydentämällä profiilisi tietoja tehostat vuorovaikutteisuutta.",
|
||||
"onboarding.steps.setup_profile.title": "Mukauta profiiliasi",
|
||||
"onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista",
|
||||
"onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi",
|
||||
"onboarding.tips.2fa": "<strong>Tiesitkö?</strong> Voit lisäsuojata tiliäsi ottamalla kaksivaiheisen todennuksen käyttöön palvelun tiliasetuksista. Ominaisuus toimii haluamasi TOTP-todennussovelluksen avulla, eikä käyttö edellytä puhelinnumeron antamista!",
|
||||
"onboarding.tips.accounts_from_other_servers": "<strong>Tiesitkö?</strong> Koska Mastodon kuuluu hajautettuun verkkoon, osa kohtaamistasi profiileista sijaitsee muilla palvelimilla kuin sinun. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa ilmaistaan käyttäjänimen perässä!",
|
||||
"onboarding.tips.migration": "<strong>Tiesitkö?</strong> Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!",
|
||||
@@ -544,8 +549,8 @@
|
||||
"report.placeholder": "Lisäkommentit",
|
||||
"report.reasons.dislike": "En pidä siitä",
|
||||
"report.reasons.dislike_description": "Et halua nähdä sitä",
|
||||
"report.reasons.legal": "Se on laiton",
|
||||
"report.reasons.legal_description": "Uskot sen rikkovan oman maasi tai palvelimen maan lakeja",
|
||||
"report.reasons.legal": "Se on laitonta",
|
||||
"report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja",
|
||||
"report.reasons.other": "Jotain muuta",
|
||||
"report.reasons.other_description": "Ongelma ei sovi muihin kategorioihin",
|
||||
"report.reasons.spam": "Se on roskapostia",
|
||||
@@ -596,7 +601,8 @@
|
||||
"server_banner.server_stats": "Palvelimen tilastot:",
|
||||
"sign_in_banner.create_account": "Luo tili",
|
||||
"sign_in_banner.sign_in": "Kirjaudu",
|
||||
"sign_in_banner.text": "Kirjaudu sisään seurataksesi profiileja tai aihetunnisteita, lisätäksesi suosikkeja, jakaaksesi viestejä ja vastataksesi niihin. Voit myös vuorovaikuttaa myös eri palvelimilla olevilta tileiltäsi.",
|
||||
"sign_in_banner.sso_redirect": "Kirjaudu tai rekisteröidy",
|
||||
"sign_in_banner.text": "Kirjaudu sisään seurataksesi profiileja tai aihetunnisteita, merkitäksesi julkaisuja suosikeiksi, julkaistaksesi sekä vastataksesi julkaisuihin. Voit vuorovaikuttaa myös eri palvelimella sijaitsevalta tililtäsi.",
|
||||
"status.admin_account": "Avaa moderaattorinäkymä tilistä @{name}",
|
||||
"status.admin_domain": "Avaa palvelimen {domain} moderointitoiminnot",
|
||||
"status.admin_status": "Avaa viesti moderointinäkymässä",
|
||||
@@ -613,15 +619,15 @@
|
||||
"status.edited": "Muokattu {date}",
|
||||
"status.edited_x_times": "Muokattu {count, plural, one {{count} kerran} other {{count} kertaa}}",
|
||||
"status.embed": "Upota",
|
||||
"status.favourite": "Suosikki",
|
||||
"status.favourite": "Merkitse suosikiksi",
|
||||
"status.filter": "Suodata tämä viesti",
|
||||
"status.filtered": "Suodatettu",
|
||||
"status.hide": "Piilota julkaisu",
|
||||
"status.history.created": "{name} luotu {date}",
|
||||
"status.history.edited": "{name} muokkasi {date}",
|
||||
"status.load_more": "Lataa lisää",
|
||||
"status.media.open": "Avaa napsauttamalla",
|
||||
"status.media.show": "Näytä napsauttamalla",
|
||||
"status.media.open": "Napsauta avataksesi",
|
||||
"status.media.show": "Napsauta näyttääksesi",
|
||||
"status.media_hidden": "Media piilotettu",
|
||||
"status.mention": "Mainitse @{name}",
|
||||
"status.more": "Lisää",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Vís samrøðu",
|
||||
"conversation.with": "Við {names}",
|
||||
"copypaste.copied": "Avritað",
|
||||
"copypaste.copy": "Avrita",
|
||||
"copypaste.copy_to_clipboard": "Avrita til setiborðið",
|
||||
"directory.federated": "Frá tí kenda fediversinum",
|
||||
"directory.local": "Einans frá {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Okkurt av hesum",
|
||||
"hashtag.column_settings.tag_mode.none": "Einki av hesum",
|
||||
"hashtag.column_settings.tag_toggle": "Legg frámerki afturat hesum teigi",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} luttakari} other {{counter} luttakarar}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} postur} other {{counter} postar}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postur} other {{counter} postar}} í dag",
|
||||
"hashtag.follow": "Fylg frámerki",
|
||||
"hashtag.unfollow": "Gevst at fylgja frámerki",
|
||||
"home.actions.go_to_explore": "Sí rákið",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Grundleggjandi",
|
||||
"home.column_settings.show_reblogs": "Vís lyft",
|
||||
"home.column_settings.show_replies": "Vís svar",
|
||||
"home.explore_prompt.body": "Heimarásin fer at hava eitt bland av postum frá frámerkjunum, sum tú hevur valt at fylgja, brúkarunum, tú hevur valt at fylgja, og postunum, sum tey stimbra. Tað sær rættiliga kvirt út í løtuni, so hvat við at:",
|
||||
"home.explore_prompt.body": "Heimarásin fer at hava eitt bland av postum frá frámerkjunum, sum tú hevur valt at fylgja, brúkarunum, tú hevur valt at fylgja, og postunum, sum tey stimbra. Um tað kennist ov friðarligt, so kanst tú:",
|
||||
"home.explore_prompt.title": "Hetta er tín heimastøð í Mastodon.",
|
||||
"home.hide_announcements": "Fjal kunngerðir",
|
||||
"home.show_announcements": "Vís kunngerðir",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Við eini kontu á Mastodon kanst tú fylgja {name} fyri at síggja teirra postar á tíni heimarás.",
|
||||
"interaction_modal.description.reblog": "Við eini kontu á Mastodon kanst tú stimbra hendan postin og soleiðis deila hann við tínar fylgjarar.",
|
||||
"interaction_modal.description.reply": "Við eini kontu á Mastodon, so kanst tú svara hesum posti.",
|
||||
"interaction_modal.login.action": "Tak meg heim",
|
||||
"interaction_modal.login.prompt": "Navnaøki hjá tínum heimaambætara, t.d. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Ikki á Mastodon?",
|
||||
"interaction_modal.on_another_server": "Á øðrum ambætara",
|
||||
"interaction_modal.on_this_server": "Á hesum ambætaranum",
|
||||
"interaction_modal.other_server_instructions": "Kopiera og set hendan URLin inn í leititeigin í tíni yndis-Mastodon-app ella í vev-markamótið á tínum Mastodon-ambætara.",
|
||||
"interaction_modal.preamble": "Av tí at Mastodon er desentraliserað, kanst tú brúka tína kontu frá einum øðrum Mastodon ambætara ella sambærligum palli, um tú ikki hevur eina kontu á hesum ambætaranum.",
|
||||
"interaction_modal.sign_in": "Tú er ikki ritað/ur inn á hesum ambætaranum. Hvar er kontan hjá tær hýst?",
|
||||
"interaction_modal.sign_in_hint": "Góð ráð: tað er heimasíðan, har tú lat teg skráseta. Minnist tú ikki, so kanst tú leita eftir vælkomin-teldubrævinum í innbakkanum hjá tær. Tú kanst eisini innlesa fulla brúkaranavnið hjá tær! (t.d. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Dáma postin hjá {name}",
|
||||
"interaction_modal.title.follow": "Fylg {name}",
|
||||
"interaction_modal.title.reblog": "Stimbra postin hjá {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Ambætarahagtøl:",
|
||||
"sign_in_banner.create_account": "Stovna kontu",
|
||||
"sign_in_banner.sign_in": "Rita inn",
|
||||
"sign_in_banner.sso_redirect": "Rita inn ella Skráset teg",
|
||||
"sign_in_banner.text": "Innrita fyri at fylgja vangum og frámerkjum, dáma, deila og svara postum. Tú kanst eisini brúka kontuna til at samvirka á einum øðrum ambætara.",
|
||||
"status.admin_account": "Lat kjakleiðaramarkamót upp fyri @{name}",
|
||||
"status.admin_domain": "Lat umsjónarmarkamót upp fyri {domain}",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Afficher cette conversation",
|
||||
"conversation.with": "Avec {names}",
|
||||
"copypaste.copied": "Copié",
|
||||
"copypaste.copy": "Copier",
|
||||
"copypaste.copy_to_clipboard": "Copier dans le presse-papiers",
|
||||
"directory.federated": "D'un fediverse connu",
|
||||
"directory.local": "De {domain} seulement",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Au moins un de ceux-ci",
|
||||
"hashtag.column_settings.tag_mode.none": "Aucun de ceux-ci",
|
||||
"hashtag.column_settings.tag_toggle": "Inclure des hashtags additionnels pour cette colonne",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui",
|
||||
"hashtag.follow": "Suivre ce hashtag",
|
||||
"hashtag.unfollow": "Ne plus suivre ce hashtag",
|
||||
"home.actions.go_to_explore": "Voir les tendances",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Basique",
|
||||
"home.column_settings.show_reblogs": "Afficher boosts",
|
||||
"home.column_settings.show_replies": "Afficher réponses",
|
||||
"home.explore_prompt.body": "Votre fil d'actualité aura un mélange de publications depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les publications qu'elles boostent. C'est plutôt calme en ce moment, alors que dites-vous de:",
|
||||
"home.explore_prompt.body": "Votre fil d'actualité aura un mélange de messages depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les messages qu'ils boostent. Si ça vous semble trop calme à votre goût, n’hésitez pas à :",
|
||||
"home.explore_prompt.title": "C'est chez vous dans Mastadon.",
|
||||
"home.hide_announcements": "Masquer les annonces",
|
||||
"home.show_announcements": "Afficher annonces",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Avec un compte Mastodon, vous pouvez suivre {name} et recevoir leurs publications dans votre fil d'accueil.",
|
||||
"interaction_modal.description.reblog": "Avec un compte Mastodon, vous pouvez booster cette publication pour la partager avec vos propres abonné·e·s.",
|
||||
"interaction_modal.description.reply": "Avec un compte sur Mastodon, vous pouvez répondre à cette publication.",
|
||||
"interaction_modal.login.action": "Aller à mon serveur",
|
||||
"interaction_modal.login.prompt": "Domaine de votre serveur, ex. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Pas sur Mastodon ?",
|
||||
"interaction_modal.on_another_server": "Sur un autre serveur",
|
||||
"interaction_modal.on_this_server": "Sur ce serveur",
|
||||
"interaction_modal.other_server_instructions": "Copiez et collez cet URL dans le champ de recherche de votre application Mastodon préférée ou de l'interface web de votre serveur Mastodon.",
|
||||
"interaction_modal.preamble": "Puisque Mastodon est décentralisé, vous pouvez utiliser votre compte existant hébergé par un autre serveur Mastodon ou une plateforme compatible si vous n'avez pas de compte sur celui-ci.",
|
||||
"interaction_modal.sign_in": "Vous n’êtes pas connectés sur ce serveur. Où est hébergé votre compte ?",
|
||||
"interaction_modal.sign_in_hint": "Astuce : c'est le site web sur lequel vous vous êtes inscrit. Si vous ne vous en souvenez pas, cherchez le courriel de bienvenue dans votre boîte de réception. Vous pouvez aussi indiquer votre nom d’utilisateur complet ! (par ex. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Ajouter la publication de {name} aux favoris",
|
||||
"interaction_modal.title.follow": "Suivre {name}",
|
||||
"interaction_modal.title.reblog": "Booster la publication de {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Statistiques du serveur:",
|
||||
"sign_in_banner.create_account": "Créer un compte",
|
||||
"sign_in_banner.sign_in": "Se connecter",
|
||||
"sign_in_banner.sso_redirect": "Se connecter ou s’inscrire",
|
||||
"sign_in_banner.text": "Identifiez-vous pour suivre des profils ou des hashtags, ajouter des favoris, partager et répondre à des publications. Vous pouvez également interagir depuis votre compte sur un autre serveur.",
|
||||
"status.admin_account": "Ouvrir l’interface de modération pour @{name}",
|
||||
"status.admin_domain": "Ouvrir l’interface de modération pour {domain}",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}",
|
||||
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
||||
"account.follows_you": "Vous suit",
|
||||
"account.go_to_profile": "Voir le profil",
|
||||
"account.go_to_profile": "Aller au profil",
|
||||
"account.hide_reblogs": "Masquer les partages de @{name}",
|
||||
"account.in_memoriam": "En mémoire de.",
|
||||
"account.joined_short": "Ici depuis",
|
||||
@@ -50,9 +50,9 @@
|
||||
"account.moved_to": "{name} a indiqué que son nouveau compte est maintenant :",
|
||||
"account.mute": "Masquer @{name}",
|
||||
"account.mute_notifications_short": "Désactiver les alertes",
|
||||
"account.mute_short": "Mettre en sourdine",
|
||||
"account.mute_short": "Masquer",
|
||||
"account.muted": "Masqué·e",
|
||||
"account.no_bio": "Aucune description enregistrée.",
|
||||
"account.no_bio": "Aucune description fournie.",
|
||||
"account.open_original_page": "Ouvrir la page d'origine",
|
||||
"account.posts": "Messages",
|
||||
"account.posts_with_replies": "Messages et réponses",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Afficher la conversation",
|
||||
"conversation.with": "Avec {names}",
|
||||
"copypaste.copied": "Copié",
|
||||
"copypaste.copy": "Copier",
|
||||
"copypaste.copy_to_clipboard": "Copier dans le presse-papiers",
|
||||
"directory.federated": "Du fédiverse connu",
|
||||
"directory.local": "De {domain} seulement",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Au moins un de ces éléments",
|
||||
"hashtag.column_settings.tag_mode.none": "Aucun de ces éléments",
|
||||
"hashtag.column_settings.tag_toggle": "Inclure des hashtags additionnels pour cette colonne",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui",
|
||||
"hashtag.follow": "Suivre le hashtag",
|
||||
"hashtag.unfollow": "Ne plus suivre le hashtag",
|
||||
"home.actions.go_to_explore": "Voir les tendances",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Basique",
|
||||
"home.column_settings.show_reblogs": "Afficher les partages",
|
||||
"home.column_settings.show_replies": "Afficher les réponses",
|
||||
"home.explore_prompt.body": "Votre fil d'actualité aura un mélange de messages depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les messages qu'ils boostent. Cela a l'air assez calme en ce moment, alors comment :",
|
||||
"home.explore_prompt.body": "Votre fil d'actualité aura un mélange de messages depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les messages qu'ils boostent. Si ça vous semble trop calme à votre goût, n’hésitez pas à :",
|
||||
"home.explore_prompt.title": "C'est votre page d'accueil dans Mastodon.",
|
||||
"home.hide_announcements": "Masquer les annonces",
|
||||
"home.show_announcements": "Afficher les annonces",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Avec un compte Mastodon, vous pouvez suivre {name} et recevoir leurs posts dans votre fil d'actualité.",
|
||||
"interaction_modal.description.reblog": "Avec un compte sur Mastodon, vous pouvez partager ce message pour le faire découvrir à vos propres abonné⋅e⋅s.",
|
||||
"interaction_modal.description.reply": "Avec un compte sur Mastodon, vous pouvez répondre à ce message.",
|
||||
"interaction_modal.login.action": "Aller à mon serveur",
|
||||
"interaction_modal.login.prompt": "Domaine de votre serveur, ex. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Pas sur Mastodon ?",
|
||||
"interaction_modal.on_another_server": "Sur un autre serveur",
|
||||
"interaction_modal.on_this_server": "Sur ce serveur",
|
||||
"interaction_modal.other_server_instructions": "Copiez et collez cette URL dans le champ de recherche de votre application Mastodon préférée ou de l'interface web de votre serveur Mastodon.",
|
||||
"interaction_modal.preamble": "Mastodon étant décentralisé, vous pouvez utiliser votre compte existant sur un autre serveur Mastodon, ou sur une autre plateforme compatible, si vous n'avez pas de compte ici.",
|
||||
"interaction_modal.sign_in": "Vous n’êtes pas connectés sur ce serveur. Où est hébergé votre compte ?",
|
||||
"interaction_modal.sign_in_hint": "Astuce : c'est le site web sur lequel vous vous êtes inscrit. Si vous ne vous en souvenez pas, cherchez le courriel de bienvenue dans votre boîte de réception. Vous pouvez aussi indiquer votre nom d’utilisateur complet ! (par ex. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Ajouter le message de {name} aux favoris",
|
||||
"interaction_modal.title.follow": "Suivre {name}",
|
||||
"interaction_modal.title.reblog": "Partager le message de {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Statistiques du serveur :",
|
||||
"sign_in_banner.create_account": "Créer un compte",
|
||||
"sign_in_banner.sign_in": "Se connecter",
|
||||
"sign_in_banner.sso_redirect": "Se connecter ou s’inscrire",
|
||||
"sign_in_banner.text": "Identifiez-vous pour suivre des profils ou des hashtags, ajouter des favoris, partager et répondre à des messages. Vous pouvez également interagir depuis votre compte sur un autre serveur.",
|
||||
"status.admin_account": "Ouvrir l’interface de modération pour @{name}",
|
||||
"status.admin_domain": "Ouvrir l’interface de modération pour {domain}",
|
||||
|
||||
@@ -189,7 +189,6 @@
|
||||
"conversation.open": "Petear toane",
|
||||
"conversation.with": "Mei {names}",
|
||||
"copypaste.copied": "Kopiearre",
|
||||
"copypaste.copy": "Kopiearje",
|
||||
"copypaste.copy_to_clipboard": "Nei klamboerd kopiearje",
|
||||
"directory.federated": "Fediverse (wat bekend is)",
|
||||
"directory.local": "Allinnich fan {domain}",
|
||||
@@ -298,7 +297,6 @@
|
||||
"home.column_settings.basic": "Algemien",
|
||||
"home.column_settings.show_reblogs": "Boosts toane",
|
||||
"home.column_settings.show_replies": "Reaksjes toane",
|
||||
"home.explore_prompt.body": "Jo starttiidline befettet in miks fan berjochten mei hashtags dy’t jo keazen hawwe om te folgjen, fan minsken dy’t jo keazen hawwe om te folgjen en berjochten dy’t se booste. It sjocht der no frij rêstich út, dus wat tinke jo derfan om:",
|
||||
"home.explore_prompt.title": "Dit is jo thúsbasis op Mastodon.",
|
||||
"home.hide_announcements": "Meidielingen ferstopje",
|
||||
"home.show_announcements": "Meidielingen toane",
|
||||
@@ -307,7 +305,6 @@
|
||||
"interaction_modal.description.reply": "Jo kinne mei in Mastodon-account op dit berjocht reagearje.",
|
||||
"interaction_modal.on_another_server": "Op een oare server",
|
||||
"interaction_modal.on_this_server": "Op dizze server",
|
||||
"interaction_modal.preamble": "Mastodon is desintralisearre. Dêrom hawwe jo gjin account op dizze Mastodon-server nedich, wannear’t jo al in account op in oare Mastodon-server of kompatibel platfoarm hawwe.",
|
||||
"interaction_modal.title.follow": "{name} folgje",
|
||||
"interaction_modal.title.reblog": "Berjocht fan {name} booste",
|
||||
"interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
|
||||
|
||||
@@ -170,7 +170,6 @@
|
||||
"conversation.open": "Féach ar comhrá",
|
||||
"conversation.with": "Le {names}",
|
||||
"copypaste.copied": "Cóipeáilte",
|
||||
"copypaste.copy": "Cóipeáil",
|
||||
"directory.federated": "Ó chomhchruinne aitheanta",
|
||||
"directory.local": "Ó {domain} amháin",
|
||||
"directory.new_arrivals": "Daoine atá tar éis teacht",
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
"about.rules": "Riaghailtean an fhrithealaiche",
|
||||
"account.account_note_header": "Nòta",
|
||||
"account.add_or_remove_from_list": "Cuir ris no thoir air falbh o na liostaichean",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.bot": "Fèin-obrachail",
|
||||
"account.badges.group": "Buidheann",
|
||||
"account.block": "Bac @{name}",
|
||||
"account.block_domain": "Bac an àrainn {domain}",
|
||||
"account.block_short": "Bac",
|
||||
"account.blocked": "’Ga bhacadh",
|
||||
"account.browse_more_on_origin_server": "Rùraich barrachd dheth air a’ phròifil thùsail",
|
||||
"account.cancel_follow_request": "Cuir d’ iarrtas leantainn dhan dàrna taobh",
|
||||
"account.cancel_follow_request": "Sguir dhen leantainn",
|
||||
"account.direct": "Thoir iomradh air @{name} gu prìobhaideach",
|
||||
"account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris",
|
||||
"account.domain_blocked": "Chaidh an àrainn a bhacadh",
|
||||
@@ -113,7 +113,8 @@
|
||||
"column.direct": "Iomraidhean prìobhaideach",
|
||||
"column.directory": "Rùraich sna pròifilean",
|
||||
"column.domain_blocks": "Àrainnean bacte",
|
||||
"column.firehose": "Inbhirean beòtha",
|
||||
"column.favourites": "Annsachdan",
|
||||
"column.firehose": "An saoghal poblach",
|
||||
"column.follow_requests": "Iarrtasan leantainn",
|
||||
"column.home": "Dachaigh",
|
||||
"column.lists": "Liostaichean",
|
||||
@@ -134,6 +135,8 @@
|
||||
"community.column_settings.remote_only": "Feadhainn chèin a-mhàin",
|
||||
"compose.language.change": "Atharraich an cànan",
|
||||
"compose.language.search": "Lorg cànan…",
|
||||
"compose.published.body": "Chaidh am post fhoillseachadh.",
|
||||
"compose.published.open": "Fosgail",
|
||||
"compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh",
|
||||
"compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh dìomhair idir le Mastodon.",
|
||||
"compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais o nach eil e poblach. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.",
|
||||
@@ -147,7 +150,7 @@
|
||||
"compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh",
|
||||
"compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh",
|
||||
"compose_form.publish": "Foillsich",
|
||||
"compose_form.publish_form": "Foillsich",
|
||||
"compose_form.publish_form": "Post ùr",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "Sàbhail na h-atharraichean",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}",
|
||||
@@ -178,6 +181,7 @@
|
||||
"confirmations.mute.explanation": "Cuiridh seo na postaichean uapa ’s na postaichean a bheir iomradh orra am falach ach chì iad-san na postaichean agad fhathast is faodaidh iad ’gad leantainn.",
|
||||
"confirmations.mute.message": "A bheil thu cinnteach gu bheil thu airson {name} a mhùchadh?",
|
||||
"confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr",
|
||||
"confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.",
|
||||
"confirmations.reply.confirm": "Freagair",
|
||||
"confirmations.reply.message": "Ma bheir thu freagairt an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
|
||||
"confirmations.unfollow.confirm": "Na lean tuilleadh",
|
||||
@@ -187,7 +191,6 @@
|
||||
"conversation.open": "Seall an còmhradh",
|
||||
"conversation.with": "Còmhla ri {names}",
|
||||
"copypaste.copied": "Chaidh lethbhreac dheth a dhèanamh",
|
||||
"copypaste.copy": "Dèan lethbhreac",
|
||||
"copypaste.copy_to_clipboard": "Cuir lethbhreac dheth air an stòr-bhòrd",
|
||||
"directory.federated": "On cho-shaoghal aithnichte",
|
||||
"directory.local": "O {domain} a-mhàin",
|
||||
@@ -197,8 +200,9 @@
|
||||
"disabled_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas aig an àm seo.",
|
||||
"dismissable_banner.community_timeline": "Seo na postaichean poblach as ùire o dhaoine aig a bheil cunntas air {domain}.",
|
||||
"dismissable_banner.dismiss": "Leig seachad",
|
||||
"dismissable_banner.explore_links": "Seo na naidheachdan air a bhithear a’ bruidhinn an-dràsta fhèin air an fhrithealaiche seo is frithealaichean eile dhen lìonra sgaoilte.",
|
||||
"dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs an-dràsta fhèin air an fhrithealaich seo is frithealaichean eile dhen lìonra sgaoilte.",
|
||||
"dismissable_banner.explore_links": "Seo na cinn-naidheachd a tha ’gan co-roinneadh as trice thar an lìona shòisealta an-diugh. Gheibh naidheachdan nas ùire a tha ’gan co-roinneadh le daoine eadar-dhealaichte rangachadh nas àirde.",
|
||||
"dismissable_banner.explore_statuses": "Tha fèill air na postaichean seo a’ fàs thar an lìona shòisealta an-diugh. Gheibh postaichean nas ùire le barrachd brosnaichean is annsachdan rangachadh nas àirde.",
|
||||
"dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs air an fhrithealaiche seo is frithealaichean eile dhen lìonra sgaoilte an-diugh. Gheibh tagaichean hais a tha ’gan cleachdadh le daoine eadar-dhealaichte rangachadh nas àirde.",
|
||||
"dismissable_banner.public_timeline": "Seo na postaichean poblach as ùire o dhaoine air an lìonra sòisealta tha ’gan leantainn le daoine air {domain}.",
|
||||
"embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.",
|
||||
"embed.preview": "Seo an coltas a bhios air:",
|
||||
@@ -226,10 +230,12 @@
|
||||
"empty_column.direct": "Chan eil iomradh prìobhaideach agad fhathast. Nuair a chuireas no a gheibh thu tè, nochdaidh i an-seo.",
|
||||
"empty_column.domain_blocks": "Cha deach àrainn sam bith a bhacadh fhathast.",
|
||||
"empty_column.explore_statuses": "Chan eil dad a’ treandadh an-dràsta fhèin. Thoir sùil a-rithist an ceann greis!",
|
||||
"empty_column.favourited_statuses": "Chan eil annsachd air post agad fhathast. Nuair a nì thu annsachd de dh’fhear, nochdaidh e an-seo.",
|
||||
"empty_column.favourites": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.",
|
||||
"empty_column.follow_requests": "Chan eil iarrtas leantainn agad fhathast. Nuair a gheibh thu fear, nochdaidh e an-seo.",
|
||||
"empty_column.followed_tags": "Cha do lean thu taga hais sam bith fhathast. Nuair a leanas tu, nochdaidh iad an-seo.",
|
||||
"empty_column.hashtag": "Chan eil dad san taga hais seo fhathast.",
|
||||
"empty_column.home": "Tha loidhne-ama na dachaigh agad falamh! Lean barrachd dhaoine gus a lìonadh. {suggestions}",
|
||||
"empty_column.home": "Tha loidhne-ama na dachaigh agad falamh! Lean barrachd dhaoine gus a lìonadh.",
|
||||
"empty_column.list": "Chan eil dad air an liosta seo fhathast. Nuair a phostaicheas buill a tha air an liosta seo postaichean ùra, nochdaidh iad an-seo.",
|
||||
"empty_column.lists": "Chan eil liosta agad fhathast. Nuair chruthaicheas tu tè, nochdaidh i an-seo.",
|
||||
"empty_column.mutes": "Cha do mhùch thu cleachdaiche sam bith fhathast.",
|
||||
@@ -289,23 +295,32 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Gin sam bith dhiubh",
|
||||
"hashtag.column_settings.tag_mode.none": "Às aonais gin sam bith dhiubh",
|
||||
"hashtag.column_settings.tag_toggle": "Gabh a-steach barrachd tagaichean sa cholbh seo",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} chom-pàirtiche} two {{counter} chom-pàirtiche} few {{counter} com-pàirtiche} other {{counter} com-pàirtiche}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} phost} two {{counter} phost} few { postaichean} other { post}} an-diugh",
|
||||
"hashtag.follow": "Lean an taga hais",
|
||||
"hashtag.unfollow": "Na lean an taga hais tuilleadh",
|
||||
"home.actions.go_to_explore": "Faic na tha a’ treandadh",
|
||||
"home.actions.go_to_suggestions": "Lorg daoine a leanas tu",
|
||||
"home.actions.go_to_suggestions": "Lorg daoine gus an leantainn",
|
||||
"home.column_settings.basic": "Bunasach",
|
||||
"home.column_settings.show_reblogs": "Seall na brosnachaidhean",
|
||||
"home.column_settings.show_replies": "Seall na freagairtean",
|
||||
"home.explore_prompt.body": "Bidh measgachadh de phostaichean o na tagaichean hais a leanas tu, na daoine a leanas tu is na postaichean a bhrosnaicheas iad air do dhachaigh. Tha cùisean caran sàmhach an-dràsta, mar sin dheth seo moladh no dhà dhut:",
|
||||
"home.explore_prompt.body": "Bidh measgachadh de phostaichean o na tagaichean hais a leanas tu, na daoine a leanas tu is na postaichean a bhrosnaicheas iad air do dhachaigh. Ma tha cùisean ro shàmhach dhut, seo nas urrainn dhut a dhèanamh:",
|
||||
"home.explore_prompt.title": "Seo do dhachaigh am broinn Mastodon.",
|
||||
"home.hide_announcements": "Falaich na brathan-fios",
|
||||
"home.show_announcements": "Seall na brathan-fios",
|
||||
"interaction_modal.description.favourite": "Le cunntas air Mastodon, ’s urrainn dhut am post seo a chur ris na h-annsachdan airson innse dhan ùghdar gu bheil e a’ còrdadh dhut ’s a shàbhaladh do uaireigin eile.",
|
||||
"interaction_modal.description.follow": "Le cunntas air Mastodon, ’s urrainn dhut {name} a leantainn ach am faigh thu na postaichean aca nad dhachaigh.",
|
||||
"interaction_modal.description.reblog": "Le cunntas air Mastodon, ’s urrainn dhut am post seo a bhrosnachadh gus a cho-roinneadh leis an luchd-leantainn agad fhèin.",
|
||||
"interaction_modal.description.reply": "Le cunntas air Mastodon, ’s urrainn dhut freagairt a chur dhan phost seo.",
|
||||
"interaction_modal.login.action": "Thoir dhachaigh mi",
|
||||
"interaction_modal.login.prompt": "Àrainn-lìn an fhrithealaiche dachaigh agad, can ailbhean.co-shaoghal.net",
|
||||
"interaction_modal.no_account_yet": "Nach eil thu air Mastodon?",
|
||||
"interaction_modal.on_another_server": "Air frithealaiche eile",
|
||||
"interaction_modal.on_this_server": "Air an frithealaiche seo",
|
||||
"interaction_modal.preamble": "Air sgàth ’s gu bheil Mastodon sgaoilte, ’s urrainn dhut cunntas a chleachdadh a tha ’ga òstadh le frithealaiche Mastodon no le ùrlar co-chòrdail eile mur eil cunntas agad air an fhear seo.",
|
||||
"interaction_modal.sign_in": "Cha deach do chlàradh a-steach air an fhrithealaiche seo. Càit a bheil an cunntas agad ’ga òstadh?",
|
||||
"interaction_modal.sign_in_hint": "Gliocas: Seo an làrach-lìn far an do chlàraich thu. Mur eil cuimhne agad dè bh’ ann, thoir sùil air a’ phost-d fàilteachaidh sa bhogsa a-steach agad. ’S urrainn dhut an t-ainm-cleachdaiche slàn agad a chur a-steach cuideachd! (can @mise@ ailbhean.co-shaoghal.net)",
|
||||
"interaction_modal.title.favourite": "Cuir am post aig {name} ris na h-annsachdan",
|
||||
"interaction_modal.title.follow": "Lean {name}",
|
||||
"interaction_modal.title.reblog": "Brosnaich am post aig {name}",
|
||||
"interaction_modal.title.reply": "Freagair dhan phost aig {name}",
|
||||
@@ -318,9 +333,11 @@
|
||||
"keyboard_shortcuts.column": "Cuir am fòcas air colbh",
|
||||
"keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh",
|
||||
"keyboard_shortcuts.description": "Tuairisgeul",
|
||||
"keyboard_shortcuts.direct": "to open direct messages column",
|
||||
"keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan iomraidhean prìobhaideach",
|
||||
"keyboard_shortcuts.down": "Gluais sìos air an liosta",
|
||||
"keyboard_shortcuts.enter": "Fosgail post",
|
||||
"keyboard_shortcuts.favourite": "Cuir am post ris na h-annsachdan",
|
||||
"keyboard_shortcuts.favourites": "Fosgail liosta nan annsachdan",
|
||||
"keyboard_shortcuts.federated": "Fosgail an loidhne-ama cho-naisgte",
|
||||
"keyboard_shortcuts.heading": "Ath-ghoiridean a’ mheur-chlàir",
|
||||
"keyboard_shortcuts.home": "Fosgail loidhne-ama na dachaigh",
|
||||
@@ -351,6 +368,7 @@
|
||||
"lightbox.previous": "Air ais",
|
||||
"limited_account_hint.action": "Seall a’ phròifil co-dhiù",
|
||||
"limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.",
|
||||
"link_preview.author": "Le {name}",
|
||||
"lists.account.add": "Cuir ris an liosta",
|
||||
"lists.account.remove": "Thoir air falbh on liosta",
|
||||
"lists.delete": "Sguab às an liosta",
|
||||
@@ -362,7 +380,7 @@
|
||||
"lists.replies_policy.followed": "Cleachdaiche sam bith a leanas mi",
|
||||
"lists.replies_policy.list": "Buill na liosta",
|
||||
"lists.replies_policy.none": "Na seall idir",
|
||||
"lists.replies_policy.title": "Seall na freagairtean gu:",
|
||||
"lists.replies_policy.title": "Seall freagairtean do:",
|
||||
"lists.search": "Lorg am measg nan daoine a leanas tu",
|
||||
"lists.subheading": "Na liostaichean agad",
|
||||
"load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}",
|
||||
@@ -373,6 +391,7 @@
|
||||
"mute_modal.hide_notifications": "A bheil thu airson na brathan fhalach on chleachdaiche seo?",
|
||||
"mute_modal.indefinite": "Gun chrìoch",
|
||||
"navigation_bar.about": "Mu dhèidhinn",
|
||||
"navigation_bar.advanced_interface": "Fosgail san eadar-aghaidh-lìn adhartach",
|
||||
"navigation_bar.blocks": "Cleachdaichean bacte",
|
||||
"navigation_bar.bookmarks": "Comharran-lìn",
|
||||
"navigation_bar.community_timeline": "Loidhne-ama ionadail",
|
||||
@@ -382,6 +401,7 @@
|
||||
"navigation_bar.domain_blocks": "Àrainnean bacte",
|
||||
"navigation_bar.edit_profile": "Deasaich a’ phròifil",
|
||||
"navigation_bar.explore": "Rùraich",
|
||||
"navigation_bar.favourites": "Annsachdan",
|
||||
"navigation_bar.filters": "Faclan mùchte",
|
||||
"navigation_bar.follow_requests": "Iarrtasan leantainn",
|
||||
"navigation_bar.followed_tags": "Tagaichean hais ’gan leantainn",
|
||||
@@ -398,6 +418,7 @@
|
||||
"not_signed_in_indicator.not_signed_in": "Feumaidh tu clàradh a-steach mus fhaigh thu cothrom air a’ ghoireas seo.",
|
||||
"notification.admin.report": "Rinn {name} gearan mu {target}",
|
||||
"notification.admin.sign_up": "Chlàraich {name}",
|
||||
"notification.favourite": "Is annsa le {name} am post agad",
|
||||
"notification.follow": "Tha {name} ’gad leantainn a-nis",
|
||||
"notification.follow_request": "Dh’iarr {name} ’gad leantainn",
|
||||
"notification.mention": "Thug {name} iomradh ort",
|
||||
@@ -411,6 +432,7 @@
|
||||
"notifications.column_settings.admin.report": "Gearanan ùra:",
|
||||
"notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
|
||||
"notifications.column_settings.alert": "Brathan deasga",
|
||||
"notifications.column_settings.favourite": "Annsachdan:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
|
||||
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Seall am bàr-criathraidh",
|
||||
@@ -428,6 +450,7 @@
|
||||
"notifications.column_settings.update": "Deasachaidhean:",
|
||||
"notifications.filter.all": "Na h-uile",
|
||||
"notifications.filter.boosts": "Brosnachaidhean",
|
||||
"notifications.filter.favourites": "Annsachdan",
|
||||
"notifications.filter.follows": "A’ leantainn",
|
||||
"notifications.filter.mentions": "Iomraidhean",
|
||||
"notifications.filter.polls": "Toraidhean cunntais-bheachd",
|
||||
@@ -443,12 +466,12 @@
|
||||
"notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh",
|
||||
"onboarding.action.back": "Air ais leam",
|
||||
"onboarding.actions.back": "Air ais leam",
|
||||
"onboarding.actions.go_to_explore": "See what's trending",
|
||||
"onboarding.actions.go_to_home": "Go to your home feed",
|
||||
"onboarding.actions.go_to_explore": "Thoir dha na treandaichean mi",
|
||||
"onboarding.actions.go_to_home": "Thoir dhachaigh mi",
|
||||
"onboarding.compose.template": "Shin thu, a #Mhastodon!",
|
||||
"onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.",
|
||||
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
|
||||
"onboarding.follows.title": "Popular on Mastodon",
|
||||
"onboarding.follows.title": "Cuir dreach pearsanta air do dhachaigh",
|
||||
"onboarding.share.lead": "Innis do dhaoine mar a gheibh iad grèim ort air Mastodon!",
|
||||
"onboarding.share.message": "Is mise {username} air #Mastodon! Thig ’gam leantainn air {url}",
|
||||
"onboarding.share.next_steps": "Ceuman eile as urrainn dhut gabhail:",
|
||||
@@ -457,13 +480,13 @@
|
||||
"onboarding.start.skip": "Want to skip right ahead?",
|
||||
"onboarding.start.title": "Rinn thu a’ chùis air!",
|
||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
|
||||
"onboarding.steps.follow_people.title": "Cuir dreach pearsanta air do dhachaigh",
|
||||
"onboarding.steps.publish_status.body": "Say hello to the world.",
|
||||
"onboarding.steps.publish_status.title": "Dèan a’ chiad phost agad",
|
||||
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
|
||||
"onboarding.steps.setup_profile.title": "Customize your profile",
|
||||
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
|
||||
"onboarding.steps.share_profile.title": "Share your profile",
|
||||
"onboarding.steps.setup_profile.title": "Gnàthaich a’ phròifil agad",
|
||||
"onboarding.steps.share_profile.body": "Leig fios dha do charaidean mar a gheibh iad lorg ort air Mastodon",
|
||||
"onboarding.steps.share_profile.title": "Co-roinn a’ phròifil Mastodon agad",
|
||||
"onboarding.tips.2fa": "<strong>An robh fios agad?</strong> ’S urrainn dhut an cunntas agad a dhìon is tu a’ suidheachadh dearbhadh dà-cheumnach ann an roghainnean a’ chunntais agad. Obraichidh e le aplacaid dearbhaidh dhà-cheumnaich sam bith a thogras tu gun fheum air àireamh fòn!",
|
||||
"onboarding.tips.accounts_from_other_servers": "<strong>An robh fios agad?</strong> On a tha Mastodon sgaoilte, tachraidh tu air pròifilean a tha ’gan òstadh air frithealaichean eile. ’S urrainn dhut bruidhinn riutha gun chnap-starra co-dhiù! ’S e ainm an fhrithealaiche a tha san dàrna leth dhen ainm-chleachdaiche aca!",
|
||||
"onboarding.tips.migration": "<strong>An robh fios agad?</strong> Ma thig an latha nach eil thu toilichte le {domain} mar an fhrithealaiche agad tuilleadh, ’s urrainn dhut imrich gu frithealaiche Mastodon eile gun a bhith a’ call an luchd-leantainn agad. ’S urrainn dhut fiù frithealaiche agad fhèin òstadh!",
|
||||
@@ -578,6 +601,8 @@
|
||||
"server_banner.server_stats": "Stadastaireachd an fhrithealaiche:",
|
||||
"sign_in_banner.create_account": "Cruthaich cunntas",
|
||||
"sign_in_banner.sign_in": "Clàraich a-steach",
|
||||
"sign_in_banner.sso_redirect": "Clàraich a-steach no clàraich leinn",
|
||||
"sign_in_banner.text": "Clàraich a-steach a leantainn phròifilean no thagaichean hais, a’ cur postaichean ris na h-annsachdan ’s ’gan co-roinneadh is freagairt dhaibh. ’S urrainn dhut gnìomh a ghabhail le cunntas o fhrithealaiche eile cuideachd.",
|
||||
"status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}",
|
||||
"status.admin_domain": "Fosgail eadar-aghaidh na maorsainneachd dha {domain}",
|
||||
"status.admin_status": "Fosgail am post seo ann an eadar-aghaidh na maorsainneachd",
|
||||
@@ -594,12 +619,15 @@
|
||||
"status.edited": "Air a dheasachadh {date}",
|
||||
"status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}",
|
||||
"status.embed": "Leabaich",
|
||||
"status.favourite": "Cuir ris na h-annsachdan",
|
||||
"status.filter": "Criathraich am post seo",
|
||||
"status.filtered": "Criathraichte",
|
||||
"status.hide": "Falaich am post",
|
||||
"status.history.created": "Chruthaich {name} {date} e",
|
||||
"status.history.edited": "Dheasaich {name} {date} e",
|
||||
"status.load_more": "Luchdaich barrachd dheth",
|
||||
"status.media.open": "Dèan briogadh gus fhosgladh",
|
||||
"status.media.show": "Dèan briogadh gus a shealltainn",
|
||||
"status.media_hidden": "Meadhan falaichte",
|
||||
"status.mention": "Thoir iomradh air @{name}",
|
||||
"status.more": "Barrachd",
|
||||
@@ -627,9 +655,10 @@
|
||||
"status.show_more": "Seall barrachd dheth",
|
||||
"status.show_more_all": "Seall barrachd dhen a h-uile",
|
||||
"status.show_original": "Seall an tionndadh tùsail",
|
||||
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
|
||||
"status.title.with_attachments": "Phostaich {user} {attachmentCount, plural, one {{attachmentCount} cheanglachan} two {{attachmentCount} cheanglachan} few {{attachmentCount} ceanglachain} other {{attachmentCount} ceanglachan}}",
|
||||
"status.translate": "Eadar-theangaich",
|
||||
"status.translated_from_with": "Air eadar-theangachadh o {lang} le {provider}",
|
||||
"status.uncached_media_warning": "Chan eil ro-shealladh ri fhaighinn",
|
||||
"status.unmute_conversation": "Dì-mhùch an còmhradh",
|
||||
"status.unpin": "Dì-phrìnich on phròifil",
|
||||
"subscribed_languages.lead": "Cha nochd ach na postaichean sna cànanan a thagh thu air loidhnichean-ama na dachaigh ’s nan liostaichean às dèidh an atharrachaidh seo. Na tagh gin ma tha thu airson na postaichean uile fhaighinn ge b’ e dè an cànan.",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Ver conversa",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiado",
|
||||
"copypaste.copy": "Copiar",
|
||||
"copypaste.copy_to_clipboard": "Copiar ao portapapeis",
|
||||
"directory.federated": "Do fediverso coñecido",
|
||||
"directory.local": "Só de {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Calquera destes",
|
||||
"hashtag.column_settings.tag_mode.none": "Ningún destes",
|
||||
"hashtag.column_settings.tag_toggle": "Incluír cancelos adicionais para esta columna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicacións}} hoxe",
|
||||
"hashtag.follow": "Seguir cancelo",
|
||||
"hashtag.unfollow": "Deixar de seguir cancelo",
|
||||
"home.actions.go_to_explore": "Mira do que se está a falar",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Básico",
|
||||
"home.column_settings.show_reblogs": "Amosar compartidos",
|
||||
"home.column_settings.show_replies": "Amosar respostas",
|
||||
"home.explore_prompt.body": "A túa cronoloxía de inicio vai ter unha mistura de publicacións procedentes dos cancelos que segues, das persoas que elexiches seguir e das publicacións que elas promoven. Hai poucas cousas polo de agora, que che parece se:",
|
||||
"home.explore_prompt.body": "A túa cronoloxía de inicio vai ter unha mistura de publicacións procedentes dos cancelos que segues, das persoas que elexiches seguir e das publicacións que elas promoven. Se non tes moito que ler, podes probar a:",
|
||||
"home.explore_prompt.title": "Iste é o teu fogar en Mastodon.",
|
||||
"home.hide_announcements": "Agochar anuncios",
|
||||
"home.show_announcements": "Amosar anuncios",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Cunha conta en Mastodon, poderás seguir a {name} e recibir as súas publicacións na túa cronoloxía de inicio.",
|
||||
"interaction_modal.description.reblog": "Cunha conta en Mastodon, poderás promover esta publicación para compartila con quen te siga.",
|
||||
"interaction_modal.description.reply": "Cunha conta en Mastodon, poderás responder a esta publicación.",
|
||||
"interaction_modal.login.action": "Lévame ao inicio",
|
||||
"interaction_modal.login.prompt": "Dominio do teu servidor de inicio, ex. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Aínda non tes unha conta?",
|
||||
"interaction_modal.on_another_server": "Nun servidor diferente",
|
||||
"interaction_modal.on_this_server": "Neste servidor",
|
||||
"interaction_modal.other_server_instructions": "Copia e pega este URL na barra de busca da túa app Mastodon favorita ou na interface web do servidor Mastodon.",
|
||||
"interaction_modal.preamble": "Como Mastodon é descentralizado, é posible usar unha conta existente noutro servidor Mastodon, ou nunha plataforma compatible, se non dispós dunha conta neste servidor.",
|
||||
"interaction_modal.sign_in": "Non iniciaches sesión neste servidor. Onde creaches a túa conta?",
|
||||
"interaction_modal.sign_in_hint": "Axuda: trátase da web na que te rexistraches. Se non a lembras, busca na caixa de correo a mensaxe de benvida. Tamén podes escribir o teu identificador completo! (ex. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Marcar coma favorita a publicación de {name}",
|
||||
"interaction_modal.title.follow": "Seguir a {name}",
|
||||
"interaction_modal.title.reblog": "Promover a publicación de {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Estatísticas do servidor:",
|
||||
"sign_in_banner.create_account": "Crear conta",
|
||||
"sign_in_banner.sign_in": "Iniciar sesión",
|
||||
"sign_in_banner.sso_redirect": "Acceder ou Crear conta",
|
||||
"sign_in_banner.text": "Inicia sesión para seguir perfís ou cancelos, marcar como favorita e responder a publicacións. Tamén podes interactuar coa túa conta noutro servidor.",
|
||||
"status.admin_account": "Abrir interface de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderación para {domain}",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "צפו בשיחה",
|
||||
"conversation.with": "עם {names}",
|
||||
"copypaste.copied": "הועתק",
|
||||
"copypaste.copy": "העתקה",
|
||||
"copypaste.copy_to_clipboard": "העתקה ללוח הגזירים",
|
||||
"directory.federated": "מהפדרציה הידועה",
|
||||
"directory.local": "מ- {domain} בלבד",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "לפחות אחד מאלה",
|
||||
"hashtag.column_settings.tag_mode.none": "אף אחד מאלה",
|
||||
"hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה",
|
||||
"hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{count} משתתפיםות}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}} היום",
|
||||
"hashtag.follow": "מעקב אחר תגית",
|
||||
"hashtag.unfollow": "ביטול מעקב אחר תגית",
|
||||
"home.actions.go_to_explore": "הצגת מגמות",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "למתחילים",
|
||||
"home.column_settings.show_reblogs": "הצגת הדהודים",
|
||||
"home.column_settings.show_replies": "הצגת תגובות",
|
||||
"home.explore_prompt.body": "פיד הנעקבים שלך יכיל תערובת של הודעות מהתגיות והאנשים שבחרת לעקיבה, וההודעות שהנעקבים בוחרים להדהד. נראה שדי שקט כאן כרגע אז מה לגבי:",
|
||||
"home.explore_prompt.body": "זרם הבית שלך יכיל תערובת של הודעות מהתגיות והאנשים שבחרת לעקיבה, וההודעות שהנעקבים בוחרים להדהד. אם זה נראה שקט מדי כרגע אז מה לגבי:",
|
||||
"home.explore_prompt.title": "זהו בסיס הבית שלך בתוך מסטודון.",
|
||||
"home.hide_announcements": "הסתר הכרזות",
|
||||
"home.show_announcements": "הצג הכרזות",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "עם חשבון מסטודון, ניתן לעקוב אחרי {name} כדי לקבל את הםוסטים שלו/ה בפיד הבית.",
|
||||
"interaction_modal.description.reblog": "עם חשבון מסטודון, ניתן להדהד את החצרוץ ולשתף עם עוקבים.",
|
||||
"interaction_modal.description.reply": "עם חשבון מסטודון, ניתן לענות לחצרוץ.",
|
||||
"interaction_modal.login.action": "קח אותי לדף הבית",
|
||||
"interaction_modal.login.prompt": "שם השרת שלך, למשל mastodon.social",
|
||||
"interaction_modal.no_account_yet": "עדיין לא במסטודון?",
|
||||
"interaction_modal.on_another_server": "על שרת אחר",
|
||||
"interaction_modal.on_this_server": "על שרת זה",
|
||||
"interaction_modal.other_server_instructions": "ניתן להעתיק ולהדביק קישור זה לתוך שדה החיפוש באפליקציית מסטודון שבשימוש אצלך או בממשק הדפדפן של שרת המסטודון.",
|
||||
"interaction_modal.preamble": "כיוון שמסטודון מבוזרת, תוכל/י להשתמש בחשבון שלך משרתי מסטודון או רשתות תואמות אחרות אם אין לך חשבון על שרת זה.",
|
||||
"interaction_modal.sign_in": "אינך מחובר.ת לשרת זה. היכן מתאכסן החשבון שלך?",
|
||||
"interaction_modal.sign_in_hint": "רמז: זהו האתר שבו נרשמת. אם שכחת, יש לך הודעת \"ברוכים הבאים\" בתיבת הדוא\"ל. ניתן גם לכתוב את שם המשתמש המלא (למשל @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "חיבוב החצרוץ של {name}",
|
||||
"interaction_modal.title.follow": "לעקוב אחרי {name}",
|
||||
"interaction_modal.title.reblog": "להדהד את החצרוץ של {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "סטטיסטיקות שרת:",
|
||||
"sign_in_banner.create_account": "יצירת חשבון",
|
||||
"sign_in_banner.sign_in": "התחברות",
|
||||
"sign_in_banner.sso_redirect": "התחברות/הרשמה",
|
||||
"sign_in_banner.text": "יש להתחבר כדי לעקוב אחרי משתמשים או תגיות, לחבב, לשתף ולענות להודעות. ניתן גם לתקשר מהחשבון שלך עם שרת אחר.",
|
||||
"status.admin_account": "פתח/י ממשק ניהול עבור @{name}",
|
||||
"status.admin_domain": "פתיחת ממשק ניהול עבור {domain}",
|
||||
|
||||
@@ -176,7 +176,6 @@
|
||||
"conversation.open": "वार्तालाप देखें",
|
||||
"conversation.with": "{names} के साथ",
|
||||
"copypaste.copied": "कॉपी किआ जा चूका है",
|
||||
"copypaste.copy": "कॉपी",
|
||||
"directory.federated": "ज्ञात फेडीवर्स से",
|
||||
"directory.local": "केवल {domain} से",
|
||||
"directory.new_arrivals": "नए आगंतुक",
|
||||
@@ -285,7 +284,6 @@
|
||||
"interaction_modal.description.reply": "मास्टोडन पर एक अकाउंट के साथ, आप इस पोस्ट का जवाब दे सकते हैं।",
|
||||
"interaction_modal.on_another_server": "एक अलग सर्वर पर",
|
||||
"interaction_modal.on_this_server": "इस सर्वर पे",
|
||||
"interaction_modal.preamble": "चूंकि मास्टोडन डेसेंट्रलीसेड है, यदि आपके पास इस पर कोई अकाउंट नहीं है, तो आप किसी अन्य मास्टोडन सर्वर या संगत प्लेटफ़ॉर्म द्वारा होस्ट किए गए अपने मौजूदा अकाउंट का उपयोग कर सकते हैं।",
|
||||
"interaction_modal.title.follow": "फॉलो {name}",
|
||||
"interaction_modal.title.reblog": "बूस्ट {name} की पोस्ट",
|
||||
"interaction_modal.title.reply": "{name} की पोस्ट पे रिप्लाई करें",
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
"column.directory": "Profilok böngészése",
|
||||
"column.domain_blocks": "Letiltott tartománynevek",
|
||||
"column.favourites": "Kedvencek",
|
||||
"column.firehose": "Élő hírfolyamok",
|
||||
"column.firehose": "Hírfolyamok",
|
||||
"column.follow_requests": "Követési kérelmek",
|
||||
"column.home": "Kezdőlap",
|
||||
"column.lists": "Listák",
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Beszélgetés megtekintése",
|
||||
"conversation.with": "Velük: {names}",
|
||||
"copypaste.copied": "Másolva",
|
||||
"copypaste.copy": "Másolás",
|
||||
"copypaste.copy_to_clipboard": "Másolás vágólapra",
|
||||
"directory.federated": "Az ismert fediverzumból",
|
||||
"directory.local": "Csak {domain} tartományból",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Bármelyik",
|
||||
"hashtag.column_settings.tag_mode.none": "Egyik sem",
|
||||
"hashtag.column_settings.tag_toggle": "További címkék felvétele ehhez az oszlophoz",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} résztvevő} other {{counter} résztvevő}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}} ma",
|
||||
"hashtag.follow": "Hashtag követése",
|
||||
"hashtag.unfollow": "Hashtag követésének megszüntetése",
|
||||
"home.actions.go_to_explore": "Felkapottak megtekintése",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Általános",
|
||||
"home.column_settings.show_reblogs": "Megtolások megjelenítése",
|
||||
"home.column_settings.show_replies": "Válaszok megjelenítése",
|
||||
"home.explore_prompt.body": "A saját hírfolyam a követésre kiválasztott hashtagek, a követésre kiválasztott személyek és az általuk népszerűsített bejegyzések keverékét tartalmazza. Ez most elég csendesnek tűnik, szóval mit szólnál ehhez:",
|
||||
"home.explore_prompt.body": "A saját hírfolyam a követésre kiválasztott hashtagek, a követésre kiválasztott személyek és az általuk népszerűsített bejegyzések keverékét tartalmazza. Ha csendesnek tűnik, akkor megpróbálhatod ezeket:",
|
||||
"home.explore_prompt.title": "Ez a kezdőpontod a Mastodonon belül.",
|
||||
"home.hide_announcements": "Közlemények elrejtése",
|
||||
"home.show_announcements": "Közlemények megjelenítése",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Egy Mastodon fiókkal bekövetheted {name} fiókot, hogy lásd a bejegyzéseit a saját hírfolyamodban.",
|
||||
"interaction_modal.description.reblog": "Egy Mastodon fiókkal megtolhatod ezt a bejegyzést, hogy megoszd a saját követőiddel.",
|
||||
"interaction_modal.description.reply": "Egy Mastodon fiókkal válaszolhatsz erre a bejegyzésre.",
|
||||
"interaction_modal.login.action": "Vigyen haza",
|
||||
"interaction_modal.login.prompt": "A saját kiszolgálód tartományneve, pl.: mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Nem vagy Mastodonon?",
|
||||
"interaction_modal.on_another_server": "Másik kiszolgálón",
|
||||
"interaction_modal.on_this_server": "Ezen a kiszolgálón",
|
||||
"interaction_modal.other_server_instructions": "Másold és illeszd be ezt a webcímet a kedvenc Mastodon alkalmazásod vagy a Mastodon-kiszolgálód webes felületének keresőmezőjébe.",
|
||||
"interaction_modal.preamble": "Mivel a Mastodon decentralizált, használhatod egy másik Mastodon kiszolgálón, vagy kompatibilis szolgáltatáson lévő fiókodat, ha ezen a kiszolgálón nincs fiókod.",
|
||||
"interaction_modal.sign_in": "Nem vagy bejelentkezve ezen a kiszolgálón. Hol van a fiókod hosztolva?",
|
||||
"interaction_modal.sign_in_hint": "Tip: Ez az a weboldal, ahol regisztráltál. Ha nem emlékszel, keresd meg az üdvözlőlevelet a bejövő leveleid között. Beírhatod a teljes felhasználónevedet is! (pl.: @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "{name} bejegyzésének megjelölése kedvencként",
|
||||
"interaction_modal.title.follow": "{name} követése",
|
||||
"interaction_modal.title.reblog": "{name} bejegyzésének megtolása",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Kiszolgálóstatisztika:",
|
||||
"sign_in_banner.create_account": "Fiók létrehozása",
|
||||
"sign_in_banner.sign_in": "Bejelentkezés",
|
||||
"sign_in_banner.sso_redirect": "Bejelentkezés vagy regisztráció",
|
||||
"sign_in_banner.text": "Jelentkezz be profilok vagy hashtagek követéséhez, kedvencnek jelöléséhez, bejegyzések megosztásához, megválaszolásához. A fiókodból más kiszolgálókon is kommunikálhatsz.",
|
||||
"status.admin_account": "Moderációs felület megnyitása @{name} fiókhoz",
|
||||
"status.admin_domain": "Moderációs felület megnyitása {domain} esetében",
|
||||
|
||||
@@ -157,7 +157,6 @@
|
||||
"conversation.open": "Դիտել խօսակցութիւնը",
|
||||
"conversation.with": "{names}-ի հետ",
|
||||
"copypaste.copied": "Պատճէնուած է",
|
||||
"copypaste.copy": "Պատճէնել",
|
||||
"directory.federated": "Յայտնի դաշնեզերքից",
|
||||
"directory.local": "{domain} տիրոյթից միայն",
|
||||
"directory.new_arrivals": "Նորեկներ",
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
"conversation.open": "Lihat percakapan",
|
||||
"conversation.with": "Dengan {names}",
|
||||
"copypaste.copied": "Disalin",
|
||||
"copypaste.copy": "Salin",
|
||||
"copypaste.copy_to_clipboard": "Salin ke clipboard",
|
||||
"directory.federated": "Dari fediverse yang dikenal",
|
||||
"directory.local": "Dari {domain} saja",
|
||||
@@ -295,7 +294,6 @@
|
||||
"interaction_modal.description.reply": "Dengan sebuah akun di Mastodon, Anda bisa menanggapi kiriman ini.",
|
||||
"interaction_modal.on_another_server": "Di server lain",
|
||||
"interaction_modal.on_this_server": "Di server ini",
|
||||
"interaction_modal.preamble": "Karena Mastodon itu terdesentralisasi, Anda dapat menggunakan akun Anda yang sudah ada yang berada di server Mastodon lain atau platform yang kompatibel jika Anda tidak memiliki sebuah akun di sini.",
|
||||
"interaction_modal.title.follow": "Ikuti {name}",
|
||||
"interaction_modal.title.reblog": "Boost kiriman {name}",
|
||||
"interaction_modal.title.reply": "Balas ke kiriman {name}",
|
||||
|
||||
@@ -160,7 +160,6 @@
|
||||
"conversation.open": "Videz konverso",
|
||||
"conversation.with": "Kun {names}",
|
||||
"copypaste.copied": "Kopiesis",
|
||||
"copypaste.copy": "Kopiez",
|
||||
"directory.federated": "De savita fediverso",
|
||||
"directory.local": "De {domain} nur",
|
||||
"directory.new_arrivals": "Nova venanti",
|
||||
@@ -252,7 +251,6 @@
|
||||
"interaction_modal.description.reply": "Per konto che Mastodon, vu povas respondar ca posto.",
|
||||
"interaction_modal.on_another_server": "Che diferanta servilo",
|
||||
"interaction_modal.on_this_server": "Che ca servilo",
|
||||
"interaction_modal.preamble": "Pro ke Mastodon esas necentraligita, on povas uzar vua havata konto quo hostigesas altra servilo di Mastodon o konciliebla metodo se on ne havas konto hike.",
|
||||
"interaction_modal.title.follow": "Sequez {name}",
|
||||
"interaction_modal.title.reblog": "Bustizez posto di {name}",
|
||||
"interaction_modal.title.reply": "Respondez posto di {name}",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Skoða samtal",
|
||||
"conversation.with": "Við {names}",
|
||||
"copypaste.copied": "Afritað",
|
||||
"copypaste.copy": "Afrita",
|
||||
"copypaste.copy_to_clipboard": "Afrita á klippispjald",
|
||||
"directory.federated": "Frá samtengdum vefþjónum",
|
||||
"directory.local": "Einungis frá {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Hvað sem er af þessu",
|
||||
"hashtag.column_settings.tag_mode.none": "Ekkert af þessu",
|
||||
"hashtag.column_settings.tag_toggle": "Taka með viðbótarmerki fyrir þennan dálk",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} þátttakandi} other {{counter} þátttakendur}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} færsla} other {{counter} færslur}} í dag",
|
||||
"hashtag.follow": "Fylgjast með myllumerki",
|
||||
"hashtag.unfollow": "Hætta að fylgjast með myllumerki",
|
||||
"home.actions.go_to_explore": "Sjáðu hvað er í umræðunni",
|
||||
@@ -303,7 +305,7 @@
|
||||
"home.column_settings.basic": "Einfalt",
|
||||
"home.column_settings.show_reblogs": "Sýna endurbirtingar",
|
||||
"home.column_settings.show_replies": "Birta svör",
|
||||
"home.explore_prompt.body": "Heimastreymið inniheldur blöndu af færslum frá þeim myllumerkjum sem þú hefur valið að fylgjast með, fólki sem þú hefur valið að fylgja, og færslunum sem þau endurbirta. Það lítur út fyrir að vera lítið að ske í augnablikinu, svo hvað með að:",
|
||||
"home.explore_prompt.body": "Heimastreymið þitt verður með blöndu af færslum úr myllumerkjunum sem þú hefur valið að fylgja, færslum frá fólki sem þú hefur valið að fylgja og færslum sem þau endurbirta. Ef þér finnst þetta allt of kyrrlátt, gætirðu viljað:",
|
||||
"home.explore_prompt.title": "Þetta er bækistöð þín innan Loðfílsins.",
|
||||
"home.hide_announcements": "Fela auglýsingar",
|
||||
"home.show_announcements": "Birta auglýsingar",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Með notandaaðgangi á Mastodon geturðu fylgst með {name} og fengið færslur frá viðkomandi í heimastreymið þitt.",
|
||||
"interaction_modal.description.reblog": "Með notandaaðgangi á Mastodon geturðu endurbirt þessa færslu til að deila henni með þeim sem fylgjast með þér.",
|
||||
"interaction_modal.description.reply": "Með notandaaðgangi á Mastodon geturðu svarað þessari færslu.",
|
||||
"interaction_modal.login.action": "Fara á heimastreymið mitt",
|
||||
"interaction_modal.login.prompt": "Lén heimanetþjónsins þíns, t.d. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Ekki á Mastodon?",
|
||||
"interaction_modal.on_another_server": "Á öðrum netþjóni",
|
||||
"interaction_modal.on_this_server": "Á þessum netþjóni",
|
||||
"interaction_modal.other_server_instructions": "Afritaðu og límdu þessa slóð inn í leitarreit Mastodon-forrits þess sem þú vilt nota eða í vefviðmóti Mastodon-netþjónsins þíns.",
|
||||
"interaction_modal.preamble": "Þar sem Mastodon er dreifhýst kerfi, þá geturðu notað aðgang sem er hýstur á öðrum Mastodon-þjóni eða öðru samhæfðu kerfi, ef þú ert ekki með notandaaðgang á þessum hér.",
|
||||
"interaction_modal.sign_in": "Þú ert ekki skráð/ur inn á þennan netþjón. Hvar er aðgangurinn þinn hýstur?",
|
||||
"interaction_modal.sign_in_hint": "Ábending: Það er vefsvæðið þar sem þú skráðir þig. Ef þú manst ekki hvar, geturðu leitað að kynningarpóstinum í pósthólfinu þínu. Þú getur líka sett inn fullt notandanafn þitt (t.d. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Setja færsluna frá {name} í eftirlæti",
|
||||
"interaction_modal.title.follow": "Fylgjast með {name}",
|
||||
"interaction_modal.title.reblog": "Endurbirta færsluna frá {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Tölfræði þjóns:",
|
||||
"sign_in_banner.create_account": "Búa til notandaaðgang",
|
||||
"sign_in_banner.sign_in": "Skrá inn",
|
||||
"sign_in_banner.sso_redirect": "Skrá inn eða nýskrá",
|
||||
"sign_in_banner.text": "Skráðu þig inn til að fylgjast með notendum eða myllumerkjum, svara færslum, deila þeim eða setja í eftirlæti. Þú getur einnig átt í samskiptum á aðgangnum þínum á öðrum netþjónum.",
|
||||
"status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
|
||||
"status.admin_domain": "Opna umsjónarviðmót fyrir @{domain}",
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
"conversation.open": "Visualizza conversazione",
|
||||
"conversation.with": "Con {names}",
|
||||
"copypaste.copied": "Copiato",
|
||||
"copypaste.copy": "Copia",
|
||||
"copypaste.copy_to_clipboard": "Copia negli Appunti",
|
||||
"directory.federated": "Da un fediverse noto",
|
||||
"directory.local": "Solo da {domain}",
|
||||
@@ -296,6 +295,9 @@
|
||||
"hashtag.column_settings.tag_mode.any": "Uno o più di questi",
|
||||
"hashtag.column_settings.tag_mode.none": "Nessuno di questi",
|
||||
"hashtag.column_settings.tag_toggle": "Includi i tag aggiuntivi per questa colonna",
|
||||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} partecipante} other {{counter} partecipanti}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} post}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} post}} oggi",
|
||||
"hashtag.follow": "Segui l'hashtag",
|
||||
"hashtag.unfollow": "Smetti di seguire l'hashtag",
|
||||
"home.actions.go_to_explore": "Scopri cosa sia di tendenza",
|
||||
@@ -311,10 +313,13 @@
|
||||
"interaction_modal.description.follow": "Con un profilo di Mastodon, puoi seguire {name} per ricevere i suoi post nel feed della tua home.",
|
||||
"interaction_modal.description.reblog": "Con un profilo di Mastodon, puoi rebloggare questo post per condividerlo con i tuoi seguaci.",
|
||||
"interaction_modal.description.reply": "Con un profilo di Mastodon, puoi rispondere a questo post.",
|
||||
"interaction_modal.login.action": "Torna all’inizio",
|
||||
"interaction_modal.login.prompt": "Dominio del tuo server principale, ad esempio mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Non su Mastodon?",
|
||||
"interaction_modal.on_another_server": "Su un altro server",
|
||||
"interaction_modal.on_this_server": "Su questo server",
|
||||
"interaction_modal.other_server_instructions": "Copia e incolla questo URL nel campo di ricerca della tua app Mastodon preferita o nell'interfaccia web del tuo server Mastodon.",
|
||||
"interaction_modal.preamble": "Poiché Mastodon è decentralizzato, puoi utilizzare il tuo profilo esistente ospitato da un altro server di Mastodon on piattaforma compatibile, se non hai un profilo su questo.",
|
||||
"interaction_modal.sign_in": "Non sei connesso a questo server. Dove è ospitato il tuo account?",
|
||||
"interaction_modal.sign_in_hint": "Suggerimento: questo è il sito in cui ti sei registrato. Se non ti ricordi, cerca l'e-mail di benvenuto nella tua casella di posta. Puoi anche inserire il tuo nome utente completo! (es. @Mastodon@mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Contrassegna il post di {name} come preferito",
|
||||
"interaction_modal.title.follow": "Segui {name}",
|
||||
"interaction_modal.title.reblog": "Reblogga il post di {name}",
|
||||
@@ -596,6 +601,7 @@
|
||||
"server_banner.server_stats": "Statistiche del server:",
|
||||
"sign_in_banner.create_account": "Crea un profilo",
|
||||
"sign_in_banner.sign_in": "Accedi",
|
||||
"sign_in_banner.sso_redirect": "Accedi o Registrati",
|
||||
"sign_in_banner.text": "Accedi per seguire profili o hashtag, condividere, rispondere e aggiungere post ai preferiti. Puoi anche interagire dal tuo account su un server diverso.",
|
||||
"status.admin_account": "Apri interfaccia di moderazione per @{name}",
|
||||
"status.admin_domain": "Apri l'interfaccia di moderazione per {domain}",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user