Merge git://github.com/tootsuite/mastodon into tootsuite-master

main
Ondřej Hruška 7 years ago
commit 7e5691804d

@ -4,3 +4,4 @@ ffmpeg
libxdamage1
libxfixes3
libicu-dev
libidn11-dev

@ -2,7 +2,7 @@
"name": "Mastodon",
"description": "A GNU Social-compatible microblogging server",
"repository": "https://github.com/tootsuite/mastodon",
"logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png",
"logo": "https://github.com/tootsuite/mastodon/raw/master/app/javascript/images/logo.svg",
"env": {
"HEROKU": {
"description": "Leave this as true",

@ -20,9 +20,7 @@ class Api::V1::FavouritesController < Api::BaseController
def cached_favourites
cache_collection(
Status.where(
id: results.map(&:status_id)
),
Status.reorder(nil).joins(:favourites).merge(results),
Status
)
end

@ -6,8 +6,8 @@ class Api::Web::PushSubscriptionsController < Api::BaseController
before_action :require_user!
def create
params.require(:data).require(:endpoint)
params.require(:data).require(:keys).require([:auth, :p256dh])
params.require(:subscription).require(:endpoint)
params.require(:subscription).require(:keys).require([:auth, :p256dh])
active_session = current_session
@ -16,10 +16,23 @@ class Api::Web::PushSubscriptionsController < Api::BaseController
active_session.update!(web_push_subscription: nil)
end
# Mobile devices do not support regular notifications, so we enable push notifications by default
alerts_enabled = active_session.detection.device.mobile? || active_session.detection.device.tablet?
data = {
alerts: {
follow: alerts_enabled,
favourite: alerts_enabled,
reblog: alerts_enabled,
mention: alerts_enabled,
},
}
web_subscription = ::Web::PushSubscription.create!(
endpoint: params[:data][:endpoint],
key_p256dh: params[:data][:keys][:p256dh],
key_auth: params[:data][:keys][:auth]
endpoint: params[:subscription][:endpoint],
key_p256dh: params[:subscription][:keys][:p256dh],
key_auth: params[:subscription][:keys][:auth],
data: data
)
active_session.update!(web_push_subscription: web_subscription)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" height="1000" width="1000"><path d="M500 0a500 500 0 0 0-353.553 146.447 500 500 0 1 0 707.106 707.106A500 500 0 0 0 500 0zm-.059 280.05h107.12c-19.071 13.424-26.187 51.016-27.12 73.843V562.05c0 44.32-35.68 80-80 80s-80-35.68-80-80v-202c0-44.32 35.68-80 80-80zm-.441 52c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zm-279.059 7.9c44.32 0 80 35.68 80 80v206.157c.933 22.827 8.049 60.42 27.12 73.842H220.44c-44.32 0-80-35.68-80-80v-200c0-44.32 35.68-80 80-80zm559.12 0c44.32 0 80 35.68 80 80v200c0 44.32-35.68 80-80 80H672.44c19.071-13.424 26.187-51.016 27.12-73.843V419.95c0-44.32 35.68-80 80-80zM220 392c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm560 0c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm-280.5 40.05c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zM220 491.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zM499.5 532c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zM220 591.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28z" fill="#fff"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="61.076954mm" height="65.47831mm" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="61.077141mm" height="65.47831mm" viewBox="0 0 216.41507 232.00976"><path d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" fill="#3088d4"/><path d="M65.68743 96.45938c0 9.01375-7.3075 16.32125-16.3225 16.32125-9.01375 0-16.32-7.3075-16.32-16.32125 0-9.01375 7.30625-16.3225 16.32-16.3225 9.015 0 16.3225 7.30875 16.3225 16.3225M124.52893 96.45938c0 9.01375-7.30875 16.32125-16.3225 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.3225 7.30875 16.3225 16.3225M183.36933 96.45938c0 9.01375-7.3075 16.32125-16.32125 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.32125 7.30875 16.32125 16.3225" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

@ -1,5 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import detectPassiveEvents from 'detect-passive-events';
import scrollTop from '../scroll';
export default class Column extends React.PureComponent {
@ -30,16 +31,19 @@ export default class Column extends React.PureComponent {
this.node = c;
}
componentDidMount () {
this.node.addEventListener('wheel', this.handleWheel, detectPassiveEvents ? { passive: true } : false);
}
componentWillUnmount () {
this.node.removeEventListener('wheel', this.handleWheel);
}
render () {
const { children } = this.props;
return (
<div
role='region'
className='column'
ref={this.setRef}
onWheel={this.handleWheel}
>
<div role='region' className='column' ref={this.setRef}>
{children}
</div>
);

@ -3,6 +3,7 @@ import { FormattedMessage } from 'react-intl';
const LoadingIndicator = () => (
<div className='loading-indicator'>
<div className='loading-indicator__figure' />
<FormattedMessage id='loading_indicator.label' defaultMessage='Loading...' />
</div>
);

@ -15,6 +15,7 @@ const messages = defineMessages({
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
block: { id: 'account.block', defaultMessage: 'Block @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' },
share: { id: 'status.share', defaultMessage: 'Share' },
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
@ -60,6 +61,13 @@ export default class StatusActionBar extends ImmutablePureComponent {
this.props.onReply(this.props.status, this.context.router.history);
}
handleShareClick = () => {
navigator.share({
text: this.props.status.get('search_index'),
url: this.props.status.get('url'),
});
}
handleFavouriteClick = () => {
this.props.onFavourite(this.props.status);
}
@ -139,11 +147,16 @@ export default class StatusActionBar extends ImmutablePureComponent {
replyTitle = intl.formatMessage(messages.replyAll);
}
const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
<IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
);
return (
<div className='status__action-bar'>
<IconButton className='status__action-bar-button' disabled={anonymousAccess} title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} />
<IconButton className='status__action-bar-button' disabled={anonymousAccess || reblogDisabled} active={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
<IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
{shareButton}
<div className='status__action-bar-dropdown'>
<DropdownMenu disabled={anonymousAccess} items={menu} icon='ellipsis-h' size={18} direction='right' ariaLabel='More' />

@ -31,16 +31,18 @@ export default class StatusList extends ImmutablePureComponent {
intersectionObserverWrapper = new IntersectionObserverWrapper();
handleScroll = debounce(() => {
const { scrollTop, scrollHeight, clientHeight } = this.node;
const offset = scrollHeight - scrollTop - clientHeight;
this._oldScrollPosition = scrollHeight - scrollTop;
if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) {
this.props.onScrollToBottom();
} else if (scrollTop < 100 && this.props.onScrollToTop) {
this.props.onScrollToTop();
} else if (this.props.onScroll) {
this.props.onScroll();
if (this.node) {
const { scrollTop, scrollHeight, clientHeight } = this.node;
const offset = scrollHeight - scrollTop - clientHeight;
this._oldScrollPosition = scrollHeight - scrollTop;
if (250 > offset && this.props.onScrollToBottom && !this.props.isLoading) {
this.props.onScrollToBottom();
} else if (scrollTop < 100 && this.props.onScrollToTop) {
this.props.onScrollToTop();
} else if (this.props.onScroll) {
this.props.onScroll();
}
}
}, 200, {
trailing: true,

@ -16,7 +16,6 @@ const messages = defineMessages({
follow: { id: 'account.follow', defaultMessage: 'Follow' },
report: { id: 'account.report', defaultMessage: 'Report @{name}' },
media: { id: 'account.media', defaultMessage: 'Media' },
disclaimer: { id: 'account.disclaimer', defaultMessage: 'This user is from another instance. This number may be larger.' },
blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
});
@ -68,7 +67,19 @@ export default class ActionBar extends React.PureComponent {
if (account.get('acct') !== account.get('username')) {
const domain = account.get('acct').split('@')[1];
extraInfo = <abbr title={intl.formatMessage(messages.disclaimer)}>*</abbr>;
extraInfo = (
<div className='account__disclaimer'>
<FormattedMessage
id='account.disclaimer_full'
defaultMessage="Information below may reflect the user's profile incompletely."
/>
{' '}
<a target='_blank' rel='noopener' href={account.get('url')}>
<FormattedMessage id='account.view_full_profile' defaultMessage='View full profile' />
</a>
</div>
);
menu.push(null);
@ -80,26 +91,30 @@ export default class ActionBar extends React.PureComponent {
}
return (
<div className='account__action-bar'>
<div className='account__action-bar-dropdown'>
<DropdownMenu items={menu} icon='bars' size={24} direction='right' />
</div>
<div className='account__action-bar-links'>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
<span><FormattedMessage id='account.posts' defaultMessage='Posts' /></span>
<strong><FormattedNumber value={account.get('statuses_count')} /> {extraInfo}</strong>
</Link>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
<span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span>
<strong><FormattedNumber value={account.get('following_count')} /> {extraInfo}</strong>
</Link>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
<span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span>
<strong><FormattedNumber value={account.get('followers_count')} /> {extraInfo}</strong>
</Link>
<div>
{extraInfo}
<div className='account__action-bar'>
<div className='account__action-bar-dropdown'>
<DropdownMenu items={menu} icon='bars' size={24} direction='right' />
</div>
<div className='account__action-bar-links'>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
<span><FormattedMessage id='account.posts' defaultMessage='Posts' /></span>
<strong><FormattedNumber value={account.get('statuses_count')} /></strong>
</Link>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
<span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span>
<strong><FormattedNumber value={account.get('following_count')} /></strong>
</Link>
<Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
<span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span>
<strong><FormattedNumber value={account.get('followers_count')} /></strong>
</Link>
</div>
</div>
</div>
);

@ -16,13 +16,14 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container';
import EmojiPickerDropdown from './emoji_picker_dropdown';
import UploadFormContainer from '../containers/upload_form_container';
import WarningContainer from '../containers/warning_container';
import { isMobile } from '../../../is_mobile';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { length } from 'stringz';
import { isMobile } from '../../../is_mobile';
const messages = defineMessages({
placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' },
spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Content warning' },
spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },
publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },
publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },
});

@ -52,14 +52,8 @@ class Bundle extends React.Component {
load = (props) => {
const { fetchComponent, onFetch, onFetchSuccess, onFetchFail, renderDelay } = props || this.props;
this.setState({ mod: undefined });
onFetch();
if (renderDelay !== 0) {
this.timestamp = new Date();
this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay);
}
if (Bundle.cache[fetchComponent.name]) {
const mod = Bundle.cache[fetchComponent.name];
@ -68,6 +62,13 @@ class Bundle extends React.Component {
return Promise.resolve();
}
this.setState({ mod: undefined });
if (renderDelay !== 0) {
this.timestamp = new Date();
this.timeout = setTimeout(() => this.setState({ forceRender: true }), renderDelay);
}
return fetchComponent()
.then((mod) => {
Bundle.cache[fetchComponent.name] = mod;

@ -1,5 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
@ -21,6 +22,7 @@ const componentMap = {
'FAVOURITES': FavouritedStatuses,
};
@injectIntl
export default class ColumnsArea extends ImmutablePureComponent {
static contextTypes = {
@ -28,6 +30,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
};
static propTypes = {
intl: PropTypes.object.isRequired,
columns: ImmutablePropTypes.list.isRequired,
singleColumn: PropTypes.bool,
children: PropTypes.node,
@ -64,8 +67,8 @@ export default class ColumnsArea extends ImmutablePureComponent {
renderView = (link, index) => {
const columnIndex = getIndex(this.context.router.history.location.pathname);
const title = link.props.children[1] && React.cloneElement(link.props.children[1]);
const icon = (link.props.children[0] || link.props.children).props.className.split(' ')[2].split('-')[1];
const title = this.props.intl.formatMessage({ id: link.props['data-preview-title-id'] });
const icon = link.props['data-preview-icon'];
const view = (index === columnIndex) ?
React.cloneElement(this.props.children) :

@ -3,14 +3,14 @@ import NavLink from 'react-router-dom/NavLink';
import { FormattedMessage } from 'react-intl';
export const links = [
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/statuses/new'><i className='fa fa-fw fa-pencil' /><FormattedMessage id='tabs_bar.compose' defaultMessage='Compose' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/timelines/home'><i className='fa fa-fw fa-home' /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/notifications'><i className='fa fa-fw fa-bell' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/statuses/new' data-preview-title-id='tabs_bar.compose' data-preview-icon='pencil' ><i className='fa fa-fw fa-pencil' /><FormattedMessage id='tabs_bar.compose' defaultMessage='Compose' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/timelines/home' data-preview-title-id='column.home' data-preview-icon='home' ><i className='fa fa-fw fa-home' /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><i className='fa fa-fw fa-bell' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>,
<NavLink className='tabs-bar__link secondary' activeClassName='active' to='/timelines/public/local'><i className='fa fa-fw fa-users' /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
<NavLink className='tabs-bar__link secondary' activeClassName='active' exact to='/timelines/public'><i className='fa fa-fw fa-globe' /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
<NavLink className='tabs-bar__link secondary' activeClassName='active' to='/timelines/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><i className='fa fa-fw fa-users' /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>,
<NavLink className='tabs-bar__link secondary' activeClassName='active' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><i className='fa fa-fw fa-globe' /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started'><i className='fa fa-fw fa-asterisk' /></NavLink>,
<NavLink className='tabs-bar__link primary' activeClassName='active' style={{ flexGrow: '0', flexBasis: '30px' }} to='/getting-started' data-preview-title-id='tabs_bar.federated_timeline' data-preview-icon='asterisk' ><i className='fa fa-fw fa-asterisk' /></NavLink>,
];
export function getIndex (path) {

@ -1,7 +1,7 @@
{
"account.block": "حظر @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "هذا المستخدم من مثيل خادم آخر. قد يكون هذا الرقم أكبر.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "تعديل الملف الشخصي",
"account.follow": "تابِع",
"account.followers": "المتابعون",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "إلغاء المتابعة",
"account.unmute": "إلغاء الكتم عن @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه في المرّة القادمة",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Блокирай",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Редактирай профила си",
"account.follow": "Последвай",
"account.followers": "Последователи",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Не следвай",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Bloquejar @{name}",
"account.block_domain": "Amagar tot de {domain}",
"account.disclaimer": "Aquest usuari és d'un altra instància. Aquest número podria ser més gran.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Editar perfil",
"account.follow": "Seguir",
"account.followers": "Seguidors",
@ -17,6 +17,7 @@
"account.unblock_domain": "Mostra {domain}",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Treure silenci de @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "@{name} blocken",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Dieser Benutzer ist von einer anderen Instanz. Diese Zahl könnte größer sein.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Profil bearbeiten",
"account.follow": "Folgen",
"account.followers": "Folgende",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Entfolgen",
"account.unmute": "@{name} nicht mehr stummschalten",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Du kannst {combo} drücken, um dies beim nächsten Mal zu überspringen",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -358,10 +358,6 @@
"defaultMessage": "Media",
"id": "account.media"
},
{
"defaultMessage": "This user is from another instance. This number may be larger.",
"id": "account.disclaimer"
},
{
"defaultMessage": "Hide everything from {domain}",
"id": "account.block_domain"
@ -370,6 +366,14 @@
"defaultMessage": "Unhide {domain}",
"id": "account.unblock_domain"
},
{
"defaultMessage": "Information below may reflect the user's profile incompletely.",
"id": "account.disclaimer_full"
},
{
"defaultMessage": "View full profile",
"id": "account.view_full_profile"
},
{
"defaultMessage": "Posts",
"id": "account.posts"
@ -452,7 +456,7 @@
"id": "compose_form.placeholder"
},
{
"defaultMessage": "Content warning",
"defaultMessage": "Write your warning here",
"id": "compose_form.spoiler_placeholder"
},
{

@ -1,7 +1,7 @@
{
"account.block": "Block @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Edit profile",
"account.follow": "Follow",
"account.followers": "Followers",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
@ -45,7 +46,7 @@
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Mark media as sensitive",
"compose_form.spoiler": "Hide text behind warning",
"compose_form.spoiler_placeholder": "Content warning",
"compose_form.spoiler_placeholder": "Write your warning here",
"confirmation_modal.cancel": "Cancel",
"confirmations.block.confirm": "Block",
"confirmations.block.message": "Are you sure you want to block {name}?",

@ -1,7 +1,7 @@
{
"account.block": "Bloki @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Redakti la profilon",
"account.follow": "Sekvi",
"account.followers": "Sekvantoj",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Malsekvi",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Bloquear",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Editar perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "مسدودسازی @{name}",
"account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
"account.disclaimer": "این کاربر عضو سرور متفاوتی است. شاید عدد واقعی بیشتر از این باشد.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "ویرایش نمایه",
"account.follow": "پی بگیرید",
"account.followers": "پیگیران",
@ -17,6 +17,7 @@
"account.unblock_domain": "رفع پنهان‌سازی از {domain}",
"account.unfollow": "پایان پیگیری",
"account.unmute": "باصدا کردن @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Estä @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Muokkaa",
"account.follow": "Seuraa",
"account.followers": "Seuraajia",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Lopeta seuraaminen",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Bloquer",
"account.block_domain": "Tout masquer de {domain}",
"account.disclaimer": "Ce compte est situé sur une autre instance. Les nombres peuvent être plus grands.",
"account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.",
"account.edit_profile": "Modifier le profil",
"account.follow": "Suivre",
"account.followers": "Abonné⋅e⋅s",
@ -17,6 +17,7 @@
"account.unblock_domain": "Ne plus masquer {domain}",
"account.unfollow": "Ne plus suivre",
"account.unmute": "Ne plus masquer",
"account.view_full_profile": "Afficher le profil complet",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois",
"bundle_column_error.body": "Une erreur s'est produite lors du chargement de ce composant.",
"bundle_column_error.retry": "Réessayer",
@ -41,11 +42,11 @@
"compose_form.lock_disclaimer.lock": "verrouillé",
"compose_form.placeholder": "Quavez-vous en tête?",
"compose_form.privacy_disclaimer": "Votre statut privé va être transmis aux personnes mentionnées sur {domains}. Avez-vous confiance en {domainsCount, plural, one {ce serveur} other {ces serveurs}} pour ne pas divulguer votre statut? Les statuts privés ne fonctionnent que sur les instances de Mastodon. Si {domains} {domainsCount, plural, one {nest pas une instance de Mastodon} other {ne sont pas des instances de Mastodon}}, il ny aura aucune indication que votre statut est privé, et il pourrait être partagé ou rendu visible dune autre manière à dautres personnes imprévues.",
"compose_form.publish": "Pouet ",
"compose_form.publish": "Pouet ",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marquer le média comme délicat",
"compose_form.sensitive": "Marquer le média comme sensible",
"compose_form.spoiler": "Masquer le texte derrière un avertissement",
"compose_form.spoiler_placeholder": "Avertissement",
"compose_form.spoiler_placeholder": "Écrivez ici votre avertissement",
"confirmation_modal.cancel": "Annuler",
"confirmations.block.confirm": "Bloquer",
"confirmations.block.message": "Confirmez vous le blocage de {name}?",
@ -68,13 +69,13 @@
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Lieux et voyages",
"empty_column.community": "Le fil public local est vide. Écrivez-donc quelque chose pour le remplir!",
"empty_column.hashtag": "Il ny a encore aucun contenu relatif à ce hashtag",
"empty_column.hashtag": "Il ny a encore aucun contenu associé à ce hashtag",
"empty_column.home": "Vous ne suivez encore personne. Visitez {public} ou bien utilisez la recherche pour vous connecter à dautres utilisateur⋅ice⋅s.",
"empty_column.home.inactivity": "Votre accueil est vide. Si vous ne vous êtes pas connecté⋅e depuis un moment, il se remplira automatiquement très bientôt.",
"empty_column.home.public_timeline": "le fil public",
"empty_column.notifications": "Vous navez pas encore de notification. Interagissez avec dautres utilisateur⋅ice⋅s pour débuter la conversation.",
"empty_column.public": "Il ny a rien ici! Écrivez quelque chose publiquement, ou bien suivez manuellement des utilisateur⋅ice⋅s dautres instances pour remplir le fil public.",
"follow_request.authorize": "Autoriser",
"follow_request.authorize": "Accepter",
"follow_request.reject": "Rejeter",
"getting_started.appsshort": "Applications",
"getting_started.faq": "FAQ",
@ -126,8 +127,8 @@
"onboarding.page_one.welcome": "Bienvenue sur Mastodon!",
"onboarding.page_six.admin": "Ladministrateur⋅trice de votre instance est {admin}",
"onboarding.page_six.almost_done": "Nous y sommes presque…",
"onboarding.page_six.appetoot": "Bon Appetoot!",
"onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appetoot!",
"onboarding.page_six.appetoot": "Bon Appétoot!",
"onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon Appétoot!",
"onboarding.page_six.github": "Mastodon est un logiciel libre, gratuit et open-source. Vous pouvez rapporter des bogues, suggérer des fonctionnalités, ou contribuer à son développement sur {github}.",
"onboarding.page_six.guidelines": "règles de la communauté",
"onboarding.page_six.read_guidelines": "Sil vous plaît, noubliez pas de lire les {guidelines}!",
@ -151,7 +152,7 @@
"report.target": "Signalement",
"search.placeholder": "Rechercher",
"search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
"standalone.public_title": "Coup d'oeil",
"standalone.public_title": "Coup d'œil",
"status.cannot_reblog": "Cette publication ne peut être boostée",
"status.delete": "Effacer",
"status.favourite": "Ajouter aux favoris",
@ -165,8 +166,8 @@
"status.reply": "Répondre",
"status.replyAll": "Répondre au fil",
"status.report": "Signaler @{name}",
"status.sensitive_toggle": "Cliquer pour dévoiler",
"status.sensitive_warning": "Contenu délicat",
"status.sensitive_toggle": "Cliquer pour afficher",
"status.sensitive_warning": "Contenu sensible",
"status.show_less": "Replier",
"status.show_more": "Déplier",
"status.unmute_conversation": "Ne plus masquer la conversation",
@ -180,7 +181,7 @@
"upload_form.undo": "Annuler",
"upload_progress.label": "Envoi en cours…",
"video_player.expand": "Agrandir la vidéo",
"video_player.toggle_sound": "Mettre/Couper le son",
"video_player.toggle_sound": "Activer/Désactiver le son",
"video_player.toggle_visible": "Afficher/Cacher la vidéo",
"video_player.video_error": "Erreur lors de la lecture de la vidéo"
}

@ -1,7 +1,7 @@
{
"account.block": "חסימת @{name}",
"account.block_domain": "להסתיר הכל מהקהילה {domain}",
"account.disclaimer": "משתמש זה מגיע מקהילה אחרת. המספר הזה עשוי להיות גדול יותר.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "עריכת פרופיל",
"account.follow": "מעקב",
"account.followers": "עוקבים",
@ -17,6 +17,7 @@
"account.unblock_domain": "הסר חסימה מקהילת {domain}",
"account.unfollow": "הפסקת מעקב",
"account.unmute": "הפסקת השתקת @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blokiraj @{name}",
"account.block_domain": "Sakrij sve sa {domain}",
"account.disclaimer": "Ovaj korisnik je sa druge instance. Ovaj broj bi mogao biti veći.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Uredi profil",
"account.follow": "Slijedi",
"account.followers": "Sljedbenici",
@ -17,6 +17,7 @@
"account.unblock_domain": "Otkrij {domain}",
"account.unfollow": "Prestani slijediti",
"account.unmute": "Poništi utišavanje @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Možeš pritisnuti {combo} kako bi ovo preskočio sljedeći put",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blokkolás",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Profil szerkesztése",
"account.follow": "Követés",
"account.followers": "Követők",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Követés abbahagyása",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blokir @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Pengguna ini berasal dari server lain. Angka berikut mungkin lebih besar.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Ubah profil",
"account.follow": "Ikuti",
"account.followers": "Pengikut",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Berhenti mengikuti",
"account.unmute": "Berhenti membisukan @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blokusar @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Ca uzero esas de altra instaluro. Ca nombro forsan esas plu granda.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Modifikar profilo",
"account.follow": "Sequar",
"account.followers": "Sequanti",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Ne plus sequar",
"account.unmute": "Ne plus celar @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blocca @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Questo utente si trova su un altro server. Questo numero potrebbe essere maggiore.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Modifica profilo",
"account.follow": "Segui",
"account.followers": "Seguaci",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Non seguire",
"account.unmute": "Non silenziare @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "ブロック",
"account.block_domain": "{domain}全体を非表示",
"account.disclaimer": "このユーザーは他のインスタンスに所属しているため、数字が正確で無い場合があります。",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "プロフィールを編集",
"account.follow": "フォロー",
"account.followers": "フォロワー",
@ -17,6 +17,7 @@
"account.unblock_domain": "{domain}を表示",
"account.unfollow": "フォロー解除",
"account.unmute": "ミュート解除",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "次からは{combo}を押せば、これをスキップできます。",
"bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。",
"bundle_column_error.retry": "再試行",
@ -45,7 +46,7 @@
"compose_form.publish_loud": "{publish}",
"compose_form.sensitive": "メディアを閲覧注意としてマークする",
"compose_form.spoiler": "テキストを隠す",
"compose_form.spoiler_placeholder": "警告",
"compose_form.spoiler_placeholder": "ここに警告を書いてください",
"confirmation_modal.cancel": "キャンセル",
"confirmations.block.confirm": "ブロック",
"confirmations.block.message": "本当に{name}をブロックしますか?",

@ -1,7 +1,7 @@
{
"account.block": "차단",
"account.block_domain": "{domain} 전체를 숨김",
"account.disclaimer": "이 사용자는 다른 인스턴스에 소속되어 있으므로, 수치가 정확하지 않을 수도 있습니다.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "프로필 편집",
"account.follow": "팔로우",
"account.followers": "팔로워",
@ -17,6 +17,7 @@
"account.unblock_domain": "{domain} 숨김 해제",
"account.unfollow": "팔로우 해제",
"account.unmute": "뮤트 해제",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "다음부터 {combo}를 누르면 이 과정을 건너뛸 수 있습니다.",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blokkeer @{name}",
"account.block_domain": "Negeer alles van {domain}",
"account.disclaimer": "Deze gebruiker zit op een andere server. Dit getal kan hoger zijn.",
"account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.",
"account.edit_profile": "Profiel bewerken",
"account.follow": "Volgen",
"account.followers": "Volgers",
@ -17,13 +17,14 @@
"account.unblock_domain": "{domain} niet meer negeren",
"account.unfollow": "Ontvolgen",
"account.unmute": "@{name} niet meer negeren",
"account.view_full_profile": "Volledig profiel tonen",
"boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
"bundle_column_error.title": "Network error",
"bundle_modal_error.close": "Close",
"bundle_modal_error.message": "Something went wrong while loading this component.",
"bundle_modal_error.retry": "Try again",
"bundle_column_error.body": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
"bundle_column_error.retry": "Opnieuw proberen",
"bundle_column_error.title": "Netwerkfout",
"bundle_modal_error.close": "Sluiten",
"bundle_modal_error.message": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
"bundle_modal_error.retry": "Opnieuw proberen",
"column.blocks": "Geblokkeerde gebruikers",
"column.community": "Lokale tijdlijn",
"column.favourites": "Favorieten",
@ -43,20 +44,20 @@
"compose_form.privacy_disclaimer": "Jouw privétoot wordt afgeleverd aan de vermelde gebruikers op {domains}. Vertrouw jij {domainsCount, plural, one {die server} other {die servers}}? Het privé plaatsen van toots werkt alleen op Mastodon-servers. Wanneer {domains} {domainsCount, plural, one {geen Mastodon-server is} other {geen Mastodon-servers zijn}}, dan wordt er niet aangegeven dat de toot privé is, waardoor het kan worden geboost of op een andere manier zichtbaar wordt gemaakt voor mensen waarvoor het niet was bedoeld.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Media als gevoelig markeren",
"compose_form.sensitive": "Media als gevoelig markeren (nsfw)",
"compose_form.spoiler": "Tekst achter waarschuwing verbergen",
"compose_form.spoiler_placeholder": "Waarschuwingstekst",
"confirmation_modal.cancel": "Annuleren",
"confirmations.block.confirm": "Blokkeren",
"confirmations.block.message": "Weet je zeker dat je {name} wilt blokkeren?",
"confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?",
"confirmations.delete.confirm": "Verwijderen",
"confirmations.delete.message": "Weet je zeker dat je deze toot wilt verwijderen?",
"confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?",
"confirmations.domain_block.confirm": "Negeer alles van deze server",
"confirmations.domain_block.message": "Weet je het echt, echt zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gewenst.",
"confirmations.mute.confirm": "Negeren",
"confirmations.mute.message": "Weet je zeker dat je {name} wilt negeren?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
"confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
"emoji_button.activity": "Activiteiten",
"emoji_button.flags": "Vlaggen",
"emoji_button.food": "Eten en drinken",
@ -67,7 +68,7 @@
"emoji_button.search": "Zoeken...",
"emoji_button.symbols": "Symbolen",
"emoji_button.travel": "Reizen en plekken",
"empty_column.community": "De lokale tijdlijn is leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
"empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
"empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
"empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.",
"empty_column.home.inactivity": "Deze tijdlijn is leeg. Wanneer je een tijdje inactief bent geweest wordt deze snel opnieuw aangemaakt.",
@ -106,13 +107,13 @@
"notification.mention": "{name} vermeldde jou",
"notification.reblog": "{name} boostte jouw toot",
"notifications.clear": "Meldingen verwijderen",
"notifications.clear_confirmation": "Weet je zeker dat je al jouw meldingen wilt verwijderen?",
"notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
"notifications.column_settings.alert": "Desktopmeldingen",
"notifications.column_settings.favourite": "Favorieten:",
"notifications.column_settings.follow": "Nieuwe volgers:",
"notifications.column_settings.mention": "Vermeldingen:",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.push": "Pushmeldingen",
"notifications.column_settings.push_meta": "Dit apparaat",
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen",
@ -146,12 +147,12 @@
"privacy.unlisted.long": "Niet op openbare tijdlijnen tonen",
"privacy.unlisted.short": "Minder openbaar",
"reply_indicator.cancel": "Annuleren",
"report.heading": "Rapporteren",
"report.placeholder": "Extra opmerkingen",
"report.submit": "Verzenden",
"report.target": "Rapporteren van",
"search.placeholder": "Zoeken",
"search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
"standalone.public_title": "A look inside...",
"status.cannot_reblog": "Deze toot kan niet geboost worden",
"status.delete": "Verwijderen",
"status.favourite": "Favoriet",

@ -1,7 +1,7 @@
{
"account.block": "Blokkér @{name}",
"account.block_domain": "Skjul alt fra {domain}",
"account.disclaimer": "Denne brukeren er fra en annen instans. Dette tallet kan være høyere.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Rediger profil",
"account.follow": "Følg",
"account.followers": "Følgere",
@ -17,6 +17,7 @@
"account.unblock_domain": "Vis {domain}",
"account.unfollow": "Avfølg",
"account.unmute": "Avdemp @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Blocar @{name}",
"account.block_domain": "Tot amagar del domeni {domain}",
"account.disclaimer": "Aqueste compte es sus una autra instància. Los nombres pòdon èsser mai grandes.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Modificar lo perfil",
"account.follow": "Sègre",
"account.followers": "Seguidors",
@ -17,19 +17,20 @@
"account.unblock_domain": "Desblocar {domain}",
"account.unfollow": "Quitar de sègre",
"account.unmute": "Quitar de rescondre @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
"bundle_column_error.title": "Network error",
"bundle_modal_error.close": "Close",
"bundle_modal_error.message": "Something went wrong while loading this component.",
"bundle_modal_error.retry": "Try again",
"bundle_column_error.body": "Quicòm a fach meuca pendent lo cargament daqueste compausant.",
"bundle_column_error.retry": "Tornar ensejar",
"bundle_column_error.title": "Error de ret",
"bundle_modal_error.close": "Tampar",
"bundle_modal_error.message": "Quicòm a fach meuca pendent lo cargament daqueste compausant.",
"bundle_modal_error.retry": "Tornar ensejar",
"column.blocks": "Personas blocadas",
"column.community": "Flux dactualitat public local",
"column.community": "Flux public local",
"column.favourites": "Favorits",
"column.follow_requests": "Demandas dabonament",
"column.home": "Acuèlh",
"column.mutes": "Personas mesas en silenci",
"column.mutes": "Personas en silenci",
"column.notifications": "Notificacions",
"column.public": "Flux public global",
"column_back_button.label": "Tornar",
@ -55,8 +56,8 @@
"confirmations.domain_block.message": "Sètz segur segur de voler blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.",
"confirmations.mute.confirm": "Metre en silenci",
"confirmations.mute.message": "Sètz segur de voler metre en silenci {name} ?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"confirmations.unfollow.confirm": "Quitar de sègre",
"confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?",
"emoji_button.activity": "Activitat",
"emoji_button.flags": "Drapèus",
"emoji_button.food": "Beure e manjar",
@ -69,7 +70,7 @@
"emoji_button.travel": "Viatges & lòcs",
"empty_column.community": "Lo flux public local es void. Escribètz quicòm per lo garnir !",
"empty_column.hashtag": "I a pas encara de contengut ligat a aqueste hashtag",
"empty_column.home": "Pel moment segètz pas segun. Visitatz {public} o utilizatz la recèrca per vos connectar a dautras personas.",
"empty_column.home": "Pel moment segètz pas degun. Visitatz {public} o utilizatz la recèrca per vos connectar a dautras personas.",
"empty_column.home.inactivity": "Vòstra pagina dacuèlh es voida. Se sètz estat inactiu per un moment, serà tornada generar per vos dins una estona.",
"empty_column.home.public_timeline": "lo flux public",
"empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualquun per començar una conversacion.",
@ -111,8 +112,8 @@
"notifications.column_settings.favourite": "Favorits :",
"notifications.column_settings.follow": "Nòus seguidors :",
"notifications.column_settings.mention": "Mencions :",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.push": "Notificacions",
"notifications.column_settings.push_meta": "Aqueste periferic",
"notifications.column_settings.reblog": "Partatges :",
"notifications.column_settings.show": "Mostrar dins la colomna",
"notifications.column_settings.sound": "Emetre un son",
@ -125,7 +126,7 @@
"onboarding.page_one.handle": "Sètz sus {domain}, doncas vòstre identificant complet es {handle}",
"onboarding.page_one.welcome": "Benvengut a Mastodon !",
"onboarding.page_six.admin": "Vòstre administrator dinstància es {admin}.",
"onboarding.page_six.almost_done": "Gaireben acabat...",
"onboarding.page_six.almost_done": "Gaireben acabat",
"onboarding.page_six.appetoot": "Bon Appetoot!",
"onboarding.page_six.apps_available": "I a daplicacions per mobil per iOS, Android e mai.",
"onboarding.page_six.github": "Mastodon es un logicial liure e open-source. Podètz senhalar de bugs, demandar de foncionalitats e contribuir al còdi sus {github}.",
@ -151,14 +152,14 @@
"report.target": "Senhalar {target}",
"search.placeholder": "Recercar",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"standalone.public_title": "A look inside...",
"standalone.public_title": "Una ulhada dedins…",
"status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
"status.delete": "Escafar",
"status.favourite": "Apondre als favorits",
"status.load_more": "Cargar mai",
"status.media_hidden": "Mèdia rescondut",
"status.mention": "Mencionar",
"status.mute_conversation": "Mute conversation",
"status.mute_conversation": "Rescondre la conversacion",
"status.open": "Desplegar aqueste estatut",
"status.reblog": "Partejar",
"status.reblogged_by": "{name} a partejat :",

@ -1,7 +1,7 @@
{
"account.block": "Blokuj @{name}",
"account.block_domain": "Blokuj wszystko z {domain}",
"account.disclaimer": "Ten użytkownik pochodzi z innej instancji. Ta liczba może być większa.",
"account.disclaimer_full": "Poniższe informacje mogą nie odwzorowywać bezbłędnie profilu użytkownika.",
"account.edit_profile": "Edytuj profil",
"account.follow": "Śledź",
"account.followers": "Śledzący",
@ -17,6 +17,7 @@
"account.unblock_domain": "Odblokuj domenę {domain}",
"account.unfollow": "Przestań śledzić",
"account.unmute": "Cofnij wyciszenie @{name}",
"account.view_full_profile": "Wyświetl pełny profil",
"boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
"bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.",
"bundle_column_error.retry": "Spróbuj ponownie",
@ -45,7 +46,7 @@
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Oznacz treści jako wrażliwe",
"compose_form.spoiler": "Ukryj tekst za ostrzeżeniem",
"compose_form.spoiler_placeholder": "Ostrzeżenie o zawartości",
"compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości",
"confirmation_modal.cancel": "Anuluj",
"confirmations.block.confirm": "Zablokuj",
"confirmations.block.message": "Czy na pewno chcesz zablokować {name}?",

@ -1,7 +1,7 @@
{
"account.block": "Bloquear @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Editar perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Não silenciar @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Bloquear @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Essa conta está localizado em outra instância. Os nomes podem ser maiores.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Editar perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Não silenciar @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Блокировать",
"account.block_domain": "Блокировать все с {domain}",
"account.disclaimer": "Это пользователь с другого узла. Число может быть больше.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Изменить профиль",
"account.follow": "Подписаться",
"account.followers": "Подписаны",
@ -17,6 +17,7 @@
"account.unblock_domain": "Разблокировать {domain}",
"account.unfollow": "Отписаться",
"account.unmute": "Снять глушение",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Нажмите {combo}, чтобы пропустить это в следующий раз",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",
@ -45,7 +46,7 @@
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Отметить как чувствительный контент",
"compose_form.spoiler": "Скрыть текст за предупреждением",
"compose_form.spoiler_placeholder": "Предупреждение о скрытом тексте",
"compose_form.spoiler_placeholder": "Напишите свое предупреждение здесь",
"confirmation_modal.cancel": "Отмена",
"confirmations.block.confirm": "Заблокировать",
"confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",

@ -1,7 +1,7 @@
{
"account.block": "Block @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "This user is from another instance. This number may be larger.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Edit profile",
"account.follow": "Follow",
"account.followers": "Followers",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Unfollow",
"account.unmute": "Unmute @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Engelle @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "Bu kullanıcının hesabı farklı sunucuda bulunduğu için bu sayı daha fazla olabilir.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Profili düzenle",
"account.follow": "Takip et",
"account.followers": "Takipçiler",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "Takipten vazgeç",
"account.unmute": "Sesi aç @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Bir dahaki sefere {combo} tuşuna basabilirsiniz",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "Заблокувати",
"account.block_domain": "Заглушити {domain}",
"account.disclaimer": "Це користувач з іншої інстанції. Число може бути більше.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "Налаштування профілю",
"account.follow": "Підписатися",
"account.followers": "Підписники",
@ -17,6 +17,7 @@
"account.unblock_domain": "Розблокувати {domain}",
"account.unfollow": "Відписатися",
"account.unmute": "Зняти глушення",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "屏蔽 @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "由于这个账户处于另一个服务器实例上,实际数字会比这个更多。",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "修改个人资料",
"account.follow": "关注",
"account.followers": "关注者",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "取消关注",
"account.unmute": "取消 @{name} 的静音",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "如你想在下次路过时显示,请按{combo}",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "封鎖 @{name}",
"account.block_domain": "Hide everything from {domain}",
"account.disclaimer": "由於這個用戶在另一個服務站,實際數字會比這個更多。",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "修改個人資料",
"account.follow": "關注",
"account.followers": "關注的人",
@ -17,6 +17,7 @@
"account.unblock_domain": "Unhide {domain}",
"account.unfollow": "取消關注",
"account.unmute": "取消 @{name} 的靜音",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "如你想在下次路過這顯示,請按{combo}",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -1,7 +1,7 @@
{
"account.block": "封鎖 @{name}",
"account.block_domain": "隱藏來自 {domain} 的一切",
"account.disclaimer": "這使用者來自其他副本,實際數字可能更大。",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
"account.edit_profile": "編輯用戶資訊",
"account.follow": "關注",
"account.followers": "專注者",
@ -17,6 +17,7 @@
"account.unblock_domain": "不再隱藏 {domain}",
"account.unfollow": "取消關注",
"account.unmute": "不再消音 @{name}",
"account.view_full_profile": "View full profile",
"boost_modal.combo": "下次你可以按 {combo} 來跳過",
"bundle_column_error.body": "Something went wrong while loading this component.",
"bundle_column_error.retry": "Try again",

@ -37,7 +37,7 @@ const unsubscribe = ({ registration, subscription }) =>
const sendSubscriptionToBackend = (subscription) =>
axios.post('/api/web/push_subscriptions', {
data: subscription,
subscription,
}).then(response => response.data);
// Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload

@ -120,18 +120,55 @@
}
.information-board {
margin: 20px 0;
display: flex;
justify-content: space-between;
border-top: 1px solid lighten($ui-base-color, 10%);
border-bottom: 1px solid lighten($ui-base-color, 10%);
padding-right: 14px;
background: darken($ui-base-color, 4%);
padding: 40px 0;
.panel {
position: absolute;
width: 280px;
box-sizing: border-box;
background: darken($ui-base-color, 8%);
padding: 20px;
padding-top: 10px;
border-radius: 4px 4px 0 0;
right: 0;
bottom: -40px;
.panel-header {
font-family: 'mastodon-font-display', sans-serif;
font-size: 14px;
line-height: 24px;
font-weight: 500;
color: $ui-base-lighter-color;
padding-bottom: 5px;
margin-bottom: 15px;
border-bottom: 1px solid lighten($ui-base-color, 4%);
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
span {
font-weight: 400;
color: lighten($ui-base-color, 34%);
}
}
}
.container {
position: relative;
padding-right: 280px + 15px;
}
.information-board-sections {
display: flex;
justify-content: space-between;
}
.section {
flex: 1 0 0;
padding: 14px;
text-align: right;
font: 16px/28px 'mastodon-font-sans-serif', sans-serif;
text-align: right;
padding: 0 15px;
span,
strong {
@ -143,7 +180,6 @@
&:last-child {
color: $ui-secondary-color;
font-size: 14px;
}
}
@ -201,100 +237,6 @@
}
}
.contact-email {
text-align: center;
margin: 40px 0;
strong {
display: block;
color: $primary-text-color;
word-break: break-word;
}
}
.sidebar-layout {
display: flex;
.main {
flex: 1 1 auto;
padding: 14px 0;
.panel {
padding-right: 14px;
}
}
.sidebar {
border-left: 1px solid lighten($ui-base-color, 10%);
width: 200px;
flex: 0 0 auto;
}
.panel {
.panel-header {
background: lighten($ui-base-color, 10%);
padding: 7px 14px;
text-transform: uppercase;
font-size: 12px;
font-weight: 500;
}
.panel-body {
padding: 14px;
}
.panel-list {
ul {
list-style: none;
margin: 0;
li {
margin: 0;
font-family: inherit;
font-size: 13px;
line-height: 18px;
a {
display: block;
padding: 7px 14px;
color: rgba($primary-text-color, 0.7);
text-decoration: none;
transition: all 200ms linear;
i.fa {
margin-right: 5px;
}
&:hover {
color: $primary-text-color;
background-color: darken($ui-base-color, 5%);
transition: all 100ms linear;
}
&.selected {
color: $primary-text-color;
background-color: $ui-highlight-color;
&:hover {
background-color: lighten($ui-highlight-color, 5%);
}
}
}
}
}
}
}
@media screen and (max-width: 625px) {
flex-direction: column;
.sidebar {
border: 1px solid lighten($ui-base-color, 10%);
width: auto;
}
}
}
.features-list__row {
display: flex;
padding: 10px 0;
@ -320,7 +262,7 @@
.text {
font-size: 16px;
line-height: 30px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
h6 {
font-weight: 500;
@ -336,6 +278,15 @@
background: linear-gradient(150deg, lighten($ui-base-color, 8%), $ui-base-color);
position: relative;
&.compact {
background: $ui-base-color;
padding-bottom: 15px;
.hero .heading {
padding-bottom: 30px;
}
}
.mascot-container {
max-width: 800px;
margin: 0 auto;
@ -388,10 +339,9 @@
position: absolute;
transition: all 0.1s linear;
animation-name: floating;
animation-duration: 1.7s;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: linear;
animation-timing-function: ease-in-out;
z-index: 2;
}
@ -400,7 +350,8 @@
height: 170px;
right: -120px;
bottom: 0;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 447.1875 234.375" height="170" width="324"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M21.69 233.366c-6.45-1.268-13.347-5.63-16.704-10.564-10.705-15.734-1.513-37.724 18.632-44.57l4.8-1.632.173-17.753c.146-14.77.515-19.063 2.2-25.55 6.736-25.944 24.46-46.032 47.766-54.137 11.913-4.143 19.558-5.366 34.178-5.47l13.828-.096V71.12c0-4.755 2.853-17.457 5.238-23.327 8.588-21.137 26.735-35.957 52.153-42.593 23.248-6.07 50.153-6.415 71.863-.923 11.14 2.82 25.686 9.957 33.857 16.615 19.335 15.756 31.82 41.05 35.183 71.275.59 5.305.672 5.435 3.11 4.926 11.833-2.474 30.4-3.132 40.065-1.42 24.388 4.32 40.568 19.076 47.214 43.058 2.16 7.8 3.953 23.894 3.59 32.237l-.24 5.498 5.156 1.317c6.392 1.633 14.55 7.098 18.003 12.062 1.435 2.062 3.305 6.597 4.156 10.078 1.428 5.84 1.43 6.8.04 12.44-1.807 7.318-5.672 13.252-10.872 16.694-8.508 5.63 3.756 5.33-211.916 5.216-108.56-.056-199.22-.464-201.47-.906z"/></svg>');
animation-duration: 3s;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 447.1875 234.375" height="170" width="324"><path fill="#{hex-color($ui-base-lighter-color)}" d="M21.69 233.366c-6.45-1.268-13.347-5.63-16.704-10.564-10.705-15.734-1.513-37.724 18.632-44.57l4.8-1.632.173-17.753c.146-14.77.515-19.063 2.2-25.55 6.736-25.944 24.46-46.032 47.766-54.137 11.913-4.143 19.558-5.366 34.178-5.47l13.828-.096V71.12c0-4.755 2.853-17.457 5.238-23.327 8.588-21.137 26.735-35.957 52.153-42.593 23.248-6.07 50.153-6.415 71.863-.923 11.14 2.82 25.686 9.957 33.857 16.615 19.335 15.756 31.82 41.05 35.183 71.275.59 5.305.672 5.435 3.11 4.926 11.833-2.474 30.4-3.132 40.065-1.42 24.388 4.32 40.568 19.076 47.214 43.058 2.16 7.8 3.953 23.894 3.59 32.237l-.24 5.498 5.156 1.317c6.392 1.633 14.55 7.098 18.003 12.062 1.435 2.062 3.305 6.597 4.156 10.078 1.428 5.84 1.43 6.8.04 12.44-1.807 7.318-5.672 13.252-10.872 16.694-8.508 5.63 3.756 5.33-211.916 5.216-108.56-.056-199.22-.464-201.47-.906z"/></svg>');
}
.float-2 {
@ -408,8 +359,9 @@
height: 100px;
right: 210px;
bottom: 0;
animation-duration: 3.5s;
animation-delay: 0.2s;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 536.25 222.1875" height="100" width="241"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M42.626 221.23c-14.104-1.174-26.442-5.133-32.825-10.534-4.194-3.548-7.684-10.66-8.868-18.075-1.934-12.102.633-22.265 7.528-29.81 7.61-8.328 19.998-12.76 39.855-14.257l8.47-.638-2.08-6.223c-4.826-14.422-6.357-24.813-6.37-43.255-.012-14.923.28-18.513 2.1-25.724 2.283-9.048 8.483-23.034 13.345-30.1 14.76-21.45 43.505-38.425 70.535-41.65 30.628-3.655 64.47 12.073 89.668 41.673l5.955 6.995 2.765-4.174c1.52-2.296 5.74-6.93 9.376-10.295 18.382-17.02 43.436-20.676 73.352-10.705 12.158 4.052 21.315 9.53 29.64 17.733 12.752 12.562 18.16 25.718 18.19 44.26l.02 10.98 2.312-3.01c15.64-20.365 42.29-20.485 62.438-.28 3.644 3.653 7.558 8.593 8.697 10.976 4.895 10.24 5.932 25.688 2.486 37.046-.76 2.507-1.388 4.816-1.393 5.13-.006.316 6.845.87 15.224 1.234 53.06 2.297 76.356 12.98 81.817 37.526 3.554 15.973-3.71 28.604-19.566 34.02-4.554 1.555-17.922 1.655-234.517 1.757-126.327.06-233.497-.21-238.154-.597z"/></svg>');
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 536.25 222.1875" height="100" width="241"><path fill="#{hex-color($ui-base-lighter-color)}" d="M42.626 221.23c-14.104-1.174-26.442-5.133-32.825-10.534-4.194-3.548-7.684-10.66-8.868-18.075-1.934-12.102.633-22.265 7.528-29.81 7.61-8.328 19.998-12.76 39.855-14.257l8.47-.638-2.08-6.223c-4.826-14.422-6.357-24.813-6.37-43.255-.012-14.923.28-18.513 2.1-25.724 2.283-9.048 8.483-23.034 13.345-30.1 14.76-21.45 43.505-38.425 70.535-41.65 30.628-3.655 64.47 12.073 89.668 41.673l5.955 6.995 2.765-4.174c1.52-2.296 5.74-6.93 9.376-10.295 18.382-17.02 43.436-20.676 73.352-10.705 12.158 4.052 21.315 9.53 29.64 17.733 12.752 12.562 18.16 25.718 18.19 44.26l.02 10.98 2.312-3.01c15.64-20.365 42.29-20.485 62.438-.28 3.644 3.653 7.558 8.593 8.697 10.976 4.895 10.24 5.932 25.688 2.486 37.046-.76 2.507-1.388 4.816-1.393 5.13-.006.316 6.845.87 15.224 1.234 53.06 2.297 76.356 12.98 81.817 37.526 3.554 15.973-3.71 28.604-19.566 34.02-4.554 1.555-17.922 1.655-234.517 1.757-126.327.06-233.497-.21-238.154-.597z"/></svg>');
}
.float-3 {
@ -417,8 +369,9 @@
height: 140px;
right: 110px;
top: -30px;
animation-delay: 0.1s;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 388.125 202.5" height="140" width="267"><path fill="#{hex-color(lighten($ui-base-color, 26%))}" d="M181.37 201.458c-17.184-1.81-36.762-8.944-49.523-18.05l-5.774-4.12-8.074 2.63c-11.468 3.738-21.382 4.962-35.815 4.422-14.79-.554-24.577-2.845-36.716-8.594-15.483-7.332-28.498-19.98-35.985-34.968C2.44 128.675-.94 108.435.9 91.356c3.362-31.234 18.197-53.698 43.63-66.074 12.803-6.23 22.384-8.55 37.655-9.122 14.433-.54 24.347.684 35.814 4.42l8.073 2.633 5.635-4.01c24.81-17.656 60.007-23.332 92.914-14.985 10.11 2.565 25.498 9.62 33.102 15.178l5.068 3.704 7.632-2.564c10.89-3.66 21.086-4.916 35.516-4.376 45.816 1.716 76.422 30.03 81.285 75.196 1.84 17.08-1.54 37.32-8.585 51.422-7.487 14.99-20.502 27.636-35.984 34.968-12.14 5.75-21.926 8.04-36.716 8.593-14.43.54-24.626-.716-35.516-4.376l-7.632-2.564-5.068 3.704c-12.844 9.387-32.714 16.488-51.545 18.42-10.607 1.09-13.916 1.08-24.81-.066z"/></svg>');
animation-duration: 4s;
animation-delay: 0.5s;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 388.125 202.5" height="140" width="267"><path fill="#{hex-color($ui-base-lighter-color)}" d="M181.37 201.458c-17.184-1.81-36.762-8.944-49.523-18.05l-5.774-4.12-8.074 2.63c-11.468 3.738-21.382 4.962-35.815 4.422-14.79-.554-24.577-2.845-36.716-8.594-15.483-7.332-28.498-19.98-35.985-34.968C2.44 128.675-.94 108.435.9 91.356c3.362-31.234 18.197-53.698 43.63-66.074 12.803-6.23 22.384-8.55 37.655-9.122 14.433-.54 24.347.684 35.814 4.42l8.073 2.633 5.635-4.01c24.81-17.656 60.007-23.332 92.914-14.985 10.11 2.565 25.498 9.62 33.102 15.178l5.068 3.704 7.632-2.564c10.89-3.66 21.086-4.916 35.516-4.376 45.816 1.716 76.422 30.03 81.285 75.196 1.84 17.08-1.54 37.32-8.585 51.422-7.487 14.99-20.502 27.636-35.984 34.968-12.14 5.75-21.926 8.04-36.716 8.593-14.43.54-24.626-.716-35.516-4.376l-7.632-2.564-5.068 3.704c-12.844 9.387-32.714 16.488-51.545 18.42-10.607 1.09-13.916 1.08-24.81-.066z"/></svg>');
}
}
@ -500,13 +453,15 @@
.brand {
a {
padding-left: 0;
padding-right: 0;
color: $white;
}
img {
width: 32px;
height: 32px;
margin-right: 10px;
position: relative;
top: 4px;
left: -10px;
}
}
}
@ -530,6 +485,42 @@
padding: 50px 0;
}
.extended-description {
padding: 50px 0;
ul,
ol {
list-style: inherit;
margin-left: 20px;
&[type='a'] {
list-style-type: lower-alpha;
}
&[type='i'] {
list-style-type: lower-roman;
}
}
li > ol,
li > ul {
margin-top: 20px;
}
p,
li {
font: 16px/28px 'mastodon-font-sans-serif', sans-serif;
font-weight: 400;
margin-bottom: 12px;
color: $ui-base-lighter-color;
a {
color: $ui-highlight-color;
text-decoration: underline;
}
}
}
h3 {
font-family: 'mastodon-font-display', sans-serif;
font-size: 16px;
@ -542,7 +533,7 @@
p {
font-size: 16px;
line-height: 30px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
.features {
@ -584,6 +575,11 @@
line-height: inherit;
font-weight: inherit;
color: $primary-text-color;
margin-bottom: 20px;
&:last-child {
margin-bottom: 0;
}
a {
color: $ui-secondary-color;
@ -629,14 +625,14 @@
display: block;
font-size: 18px;
font-weight: 400;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
}
.footer-links {
padding-bottom: 50px;
text-align: right;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
p {
font-size: 14px;
@ -653,6 +649,29 @@
padding: 0 20px;
}
.information-board {
padding-bottom: 20px;
}
.information-board .container {
padding-right: 20px;
.panel {
position: static;
margin-top: 30px;
width: 100%;
border-radius: 4px;
.panel-header {
text-align: center;
}
}
}
.information-board .section {
text-align: center;
}
.header-wrapper .mascot {
left: 20px;
}
@ -700,10 +719,25 @@
text-align: center;
}
.nav {
display: flex;
flex-flow: row wrap;
justify-content: space-around;
}
.links a {
padding: 12px 8px;
}
.heading h1 {
padding: 30px 0;
}
.links .brand img {
left: 0;
top: 0;
}
.hero {
.simple_form,
.closed-registrations-message {

File diff suppressed because one or more lines are too long

@ -107,7 +107,7 @@
.icon-button {
display: inline-block;
padding: 0;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
border: none;
background: transparent;
cursor: pointer;
@ -145,7 +145,7 @@
&:hover,
&:active,
&:focus {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
&.active {
@ -185,7 +185,7 @@
&:hover,
&:active,
&:focus {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
transition: color 200ms ease-out;
}
@ -807,7 +807,7 @@
margin-left: auto;
padding-left: 18px;
width: 120px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
font-size: 14px;
text-align: right;
white-space: nowrap;
@ -816,7 +816,7 @@
}
.status__display-name {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
.status__info .status__display-name {
@ -865,13 +865,13 @@
.status__prepend {
margin: -10px 0 10px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
padding: 8px 0 2px;
font-size: 14px;
position: relative;
.status__display-name strong {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
}
@ -963,7 +963,7 @@
.detailed-status__meta {
margin-top: 15px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
font-size: 14px;
line-height: 18px;
}
@ -1096,6 +1096,28 @@
}
}
.account__disclaimer {
padding: 10px;
border-top: 1px solid lighten($ui-base-color, 8%);
color: $ui-base-lighter-color;
strong {
font-weight: 500;
}
a {
font-weight: 500;
color: inherit;
text-decoration: underline;
&:hover,
&:focus,
&:active {
text-decoration: none;
}
}
}
.account__header__content {
color: $ui-primary-color;
font-size: 14px;
@ -1238,7 +1260,7 @@
}
abbr {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
}
@ -1332,11 +1354,11 @@
.muted {
.status__content p,
.status__content a {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
.status__display-name strong {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
.status__avatar, .emojione {
@ -1344,7 +1366,7 @@
}
a.status__content__spoiler-link {
background: lighten($ui-base-color, 26%);
background: $ui-base-lighter-color;
color: lighten($ui-base-color, 4%);
&:hover {
@ -1560,7 +1582,7 @@
.static-content {
padding: 10px;
padding-top: 20px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
h1 {
font-size: 16px;
@ -2041,7 +2063,7 @@
.column-subheading {
background: $ui-base-color;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
padding: 8px 20px;
font-size: 12px;
font-weight: 500;
@ -2161,7 +2183,7 @@
.getting-started__wrapper {
position: relative;
flex: 0 0 auto;
overflow-y: auto;
}
.getting-started__footer {
@ -2180,7 +2202,7 @@
}
a {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
}
}
@ -2244,7 +2266,7 @@ button.icon-button.active i.fa-retweet {
font-size: 14px;
border: 1px solid lighten($ui-base-color, 8%);
border-radius: 4px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
margin-top: 14px;
text-decoration: none;
overflow: hidden;
@ -2339,7 +2361,7 @@ button.icon-button.active i.fa-retweet {
.load-more {
display: block;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
background-color: transparent;
border: 0;
font-size: inherit;
@ -2529,11 +2551,72 @@ button.icon-button.active i.fa-retweet {
}
.loading-indicator {
color: $ui-secondary-color;
font-size: 16px;
font-weight: 500;
padding-top: 120px;
text-align: center;
color: lighten($ui-base-color, 26%);
font-size: 12px;
font-weight: 400;
text-transform: uppercase;
overflow: visible;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
span {
display: block;
float: left;
margin-left: 50%;
transform: translateX(-50%);
margin: 82px 0 0 50%;
white-space: nowrap;
animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
}
}
.loading-indicator__figure {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 0;
height: 0;
box-sizing: border-box;
border: 0 solid lighten($ui-base-color, 26%);
border-radius: 50%;
animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
}
@keyframes loader-figure {
0% {
width: 0;
height: 0;
background-color: lighten($ui-base-color, 26%);
}
29% {
background-color: lighten($ui-base-color, 26%);
}
30% {
width: 42px;
height: 42px;
background-color: transparent;
border-width: 21px;
opacity: 1;
}
100% {
width: 42px;
height: 42px;
border-width: 0;
opacity: 0;
background-color: transparent;
}
}
@keyframes loader-label {
0% { opacity: 0.25; }
30% { opacity: 1; }
100% { opacity: 0.25; }
}
.video-error-cover {
@ -2987,13 +3070,13 @@ button.icon-button.active i.fa-retweet {
color: $ui-secondary-color;
font-size: 18px;
font-weight: 500;
border: 2px dashed lighten($ui-base-color, 26%);
border: 2px dashed $ui-base-lighter-color;
border-radius: 4px;
}
.upload-progress {
padding: 10px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
overflow: hidden;
display: flex;
@ -3018,7 +3101,7 @@ button.icon-button.active i.fa-retweet {
width: 100%;
height: 6px;
border-radius: 6px;
background: lighten($ui-base-color, 26%);
background: $ui-base-lighter-color;
position: relative;
margin-top: 5px;
}
@ -3303,7 +3386,7 @@ button.icon-button.active i.fa-retweet {
}
.search-results__header {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
background: lighten($ui-base-color, 2%);
border-bottom: 1px solid darken($ui-base-color, 4%);
padding: 15px 10px;
@ -3399,6 +3482,10 @@ button.icon-button.active i.fa-retweet {
}
}
.media-modal__content {
background: $base-overlay-background;
}
.media-modal__close {
position: absolute;
right: 4px;
@ -3897,7 +3984,7 @@ button.icon-button.active i.fa-retweet {
.attachment-list__icon {
flex: 0 0 auto;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
padding: 8px 18px;
cursor: default;
border-right: 1px solid lighten($ui-base-color, 8%);
@ -3927,7 +4014,7 @@ button.icon-button.active i.fa-retweet {
a {
text-decoration: none;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
font-weight: 500;
&:hover {
@ -4124,7 +4211,7 @@ button.icon-button.active i.fa-retweet {
}
.account-section-headline {
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
background: lighten($ui-base-color, 2%);
border-bottom: 1px solid lighten($ui-base-color, 4%);
padding: 15px 10px;
@ -4160,12 +4247,26 @@ button.icon-button.active i.fa-retweet {
noscript {
text-align: center;
img {
width: 200px;
opacity: 0.5;
animation: flicker 4s infinite;
}
div {
font-size: 20px;
margin: 20px 0;
font-size: 14px;
margin: 30px auto;
color: $ui-secondary-color;
max-width: 400px;
}
}
@keyframes flicker {
0% { opacity: 1; }
30% { opacity: 0.75; }
100% { opacity: 1; }
}
@media screen and (max-width: 1024px) and (max-height: 400px) {
$duration: 400ms;
$delay: 100ms;

@ -23,8 +23,7 @@
align-items: center;
img {
width: 32px;
height: 32px;
height: 42px;
margin-right: 10px;
}

@ -32,7 +32,7 @@ code {
line-height: 18px;
margin-top: 15px;
margin-bottom: 0;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
a {
color: $ui-primary-color;
@ -308,7 +308,7 @@ code {
padding: 7px 4px;
padding-bottom: 9px;
font-size: 16px;
color: lighten($ui-base-color, 26%);
color: $ui-base-lighter-color;
font-family: inherit;
pointer-events: none;
cursor: default;

@ -36,6 +36,18 @@
}
}
&.with-header {
.entry {
&:first-child {
&,
.detailed-status.light,
.status.light {
border-radius: 0;
}
}
}
}
.status.light {
padding: 14px 14px 14px (48px + 14px * 2);
position: relative;
@ -247,7 +259,9 @@
border: medium none;
display: block;
flex: 1 1 auto;
width: 100%;
height: 100%;
overflow: hidden;
margin-right: 2px;
&:last-child {

@ -22,10 +22,11 @@ $valid-value-color: $success-green !default;
$error-value-color: $error-red !default;
// Tell UI to use selected colors
$ui-base-color: $classic-base-color !default; // Darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default; // Vibrant
$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default; // Vibrant
// Avatar border size (8% default, 100% for rounded avatars)
$ui-avatar-border-size: 8%;

@ -12,7 +12,7 @@
#
class DomainBlock < ApplicationRecord
enum severity: [:silence, :suspend]
enum severity: [:silence, :suspend, :noop]
attr_accessor :retroactive

@ -53,6 +53,7 @@ class User < ApplicationRecord
scope :admins, -> { where(admin: true) }
scope :confirmed, -> { where.not(confirmed_at: nil) }
scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) }
scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended: false }) }
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
scope :with_recent_ip_address, ->(value) { where(arel_table[:current_sign_in_ip].eq(value).or(arel_table[:last_sign_in_ip].eq(value))) }

@ -11,16 +11,16 @@ class BlockDomainService < BaseService
private
def process_domain_block
clear_media! if domain_block.reject_media?
if domain_block.silence?
silence_accounts!
else
elsif domain_block.suspend?
suspend_accounts!
end
end
def silence_accounts!
blocked_domain_accounts.in_batches.update_all(silenced: true)
clear_media! if domain_block.reject_media?
end
def clear_media!

@ -10,7 +10,7 @@ class UnblockDomainService < BaseService
end
def process_retroactive_updates
blocked_accounts.in_batches.update_all(update_options)
blocked_accounts.in_batches.update_all(update_options) unless domain_block.noop?
end
def blocked_accounts

@ -1,5 +1,8 @@
.panel
.panel-header= t 'about.contact'
.panel-header
= succeed ':' do
= t 'about.contact'
%span{ title: contact.site_contact_email.presence }= contact.site_contact_email.presence
.panel-body
- if contact.contact_account
.owner
@ -8,8 +11,9 @@
= link_to TagManager.instance.url_for(contact.contact_account) do
%span.display_name.emojify= display_name(contact.contact_account)
%span.username @#{contact.contact_account.acct}
- unless contact.site_contact_email.blank?
.contact-email
= t 'about.business_email'
%strong= contact.site_contact_email
- else
.owner
.avatar= image_tag full_asset_url('avatars/original/missing.png', skip_pipeline: true)
.name
%span.display_name= t 'about.contact_missing'
%span.username= t 'about.contact_unavailable'

@ -1,12 +0,0 @@
.panel
.panel-header= t 'about.links'
.panel-list
%ul
- if user_signed_in?
%li= link_to t('about.get_started'), root_path
- else
- if instance.open_registrations
%li= link_to t('about.get_started'), new_user_registration_path
%li= link_to t('auth.login'), new_user_session_path
%li= link_to t('about.terms'), terms_path
%li= link_to t('about.source_code'), 'https://github.com/chronister/mastodon'

@ -1,9 +0,0 @@
.panel
.panel-header= t 'about.version'
.panel-body
- if @instance_presenter.commit_hash == ""
%strong= version.version_number
- else
%strong= version.version_number
%strong= "#{@instance_presenter.commit_hash}"

@ -1,16 +1,44 @@
- content_for :page_title do
= site_hostname
.wrapper.thicc
.sidebar-layout
.main
.panel
%h2= site_hostname
- content_for :header_tags do
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
- unless @instance_presenter.site_description.blank?
%p!= @instance_presenter.site_description
%meta{ property: 'og:site_name', content: site_title }/
%meta{ property: 'og:url', content: about_url }/
%meta{ property: 'og:type', content: 'website' }/
%meta{ property: 'og:title', content: site_hostname }/
%meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/
%meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
%meta{ property: 'og:image:width', content: '400' }/
%meta{ property: 'og:image:height', content: '400' }/
%meta{ property: 'twitter:card', content: 'summary' }/
.information-board
.landing-page
.header-wrapper.compact
.header
.container.links
.brand
= link_to root_url do
= image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
%ul.nav
%li
- if user_signed_in?
= link_to t('settings.back'), root_url, class: 'webapp-btn'
- else
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
%li= link_to t('about.about_this'), about_more_path
%li= link_to t('about.other_instances'), 'https://joinmastodon.org/'
.container.hero
.heading
%h3= t('about.description_headline', domain: site_hostname)
%p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
.information-board
.container
.information-board-sections
.section
%span= t 'about.user_count_before'
%strong= number_with_delimiter @instance_presenter.user_count
@ -23,11 +51,14 @@
%span= t 'about.domain_count_before'
%strong= number_with_delimiter @instance_presenter.domain_count
%span= t 'about.domain_count_after'
= render 'contact', contact: @instance_presenter
- unless @instance_presenter.site_extended_description.blank?
.panel!= @instance_presenter.site_extended_description
.extended-description
.container
= @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html')
.sidebar
= render 'contact', contact: @instance_presenter
= render 'links', instance: @instance_presenter
= render 'version', version: @instance_presenter
.footer-links
.container
%p
= link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
= " (#{@instance_presenter.version_number})"

@ -24,8 +24,7 @@
.container.links
.brand
= link_to root_url do
= image_tag asset_pack_path('logo.svg'), alt: '', role: 'presentation'
Mastodon
= image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
%ul.nav
%li

@ -1,8 +1,23 @@
- content_for :page_title do
= t('terms.title', instance: site_hostname)
.wrapper
- if @instance_presenter.site_terms.present?
= raw @instance_presenter.site_terms
- else
= t('terms.body_html')
.landing-page
.header-wrapper.compact
.header
.container.links
.brand
= link_to root_url do
= image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
%ul.nav
%li
- if user_signed_in?
= link_to t('settings.back'), root_url, class: 'webapp-btn'
- else
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
%li= link_to t('about.about_this'), about_more_path
%li= link_to t('about.other_instances'), 'https://joinmastodon.org/'
.extended-description
.container
= @instance_presenter.site_terms.html_safe.presence || t('terms.body_html')

@ -23,9 +23,9 @@
.accounts-grid
= render 'nothing_here'
- else
.activity-stream
.activity-stream.with-header
= render partial: 'stream_entries/status', collection: @statuses, as: :status
.pagination
- if @statuses.size == 20
- if @statuses.size == 20
.pagination
= link_to safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), short_account_url(@account, max_id: @statuses.last.id), class: 'next', rel: 'next'

@ -3,13 +3,18 @@
= simple_form_for @domain_block, url: admin_domain_block_path(@domain_block), method: :delete do |f|
= f.input :retroactive,
as: :boolean,
wrapper: :with_label,
label: t(".retroactive.#{@domain_block.severity}"),
hint: t(:affected_accounts,
scope: [:admin, :domain_blocks, :show],
count: @domain_block.accounts_count)
- if (@domain_block.noop?)
= f.input :retroactive,
as: :hidden,
input_html: { :value => "0" }
- else
= f.input :retroactive,
as: :boolean,
wrapper: :with_label,
label: t(".retroactive.#{@domain_block.severity}"),
hint: t(:affected_accounts,
scope: [:admin, :domain_blocks, :show],
count: @domain_block.accounts_count)
.actions
= f.button :button, t('.undo'), type: :submit

@ -7,6 +7,7 @@
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
%noscript
= image_tag asset_pack_path('logo.png')
= image_tag asset_pack_path('logo.svg'), alt: 'Mastodon'
%div
= t('errors.noscript')

@ -6,7 +6,7 @@
.sidebar-wrapper
.sidebar
= link_to root_path do
= image_tag asset_pack_path('logo.png'), class: 'logo'
= image_tag asset_pack_path('logo.svg'), class: 'logo', alt: 'Mastodon'
= render_navigation
.content-wrapper

@ -6,8 +6,7 @@
.logo-container
%h1
= link_to root_path do
= image_tag asset_pack_path('logo.svg')
Mastodon
= image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
.form-container
= render 'flashes'

@ -2,7 +2,7 @@ object false
node(:name) { Setting.site_title }
node(:short_name) { Setting.site_title }
node(:description) { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon')) }
node(:description) { strip_tags(Setting.site_description.presence || I18n.t('about.about_mastodon_html')) }
node(:icons) { [{ src: '/android-chrome-192x192.png', sizes: '192x192', type: 'image/png' }] }
node(:theme_color) { '#282c37' }
node(:background_color) { '#d9e1e8' }

@ -8,7 +8,7 @@ end
node(:links) do
[
{ rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: account_url(@account) },
{ rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account) },
{ rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom') },
{ rel: 'self', type: 'application/activity+json', href: account_url(@account) },
{ rel: 'salmon', href: api_salmon_url(@account.id) },

@ -3,7 +3,7 @@ Nokogiri::XML::Builder.new do |xml|
xml.Subject @canonical_account_uri
xml.Alias short_account_url(@account)
xml.Alias account_url(@account)
xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: TagManager.instance.url_for(@account))
xml.Link(rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: short_account_url(@account))
xml.Link(rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom'))
xml.Link(rel: 'self', type: 'application/activity+json', href: account_url(@account))
xml.Link(rel: 'salmon', href: api_salmon_url(@account.id))

@ -0,0 +1,13 @@
# frozen_string_literal: true
require 'sidekiq-scheduler'
class Scheduler::UserCleanupScheduler
include Sidekiq::Worker
def perform
User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
Account.where(id: batch.map(&:account_id)).delete_all
User.where(id: batch.map(&:id)).delete_all
end
end
end

@ -1,6 +1,6 @@
# frozen_string_literal: true
lock '3.8.1'
lock '3.8.2'
set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git')
set :branch, ENV.fetch('BRANCH', 'master')

@ -0,0 +1,12 @@
nl:
activerecord:
errors:
models:
account:
attributes:
username:
invalid: alleen letters, nummers en underscores
status:
attributes:
reblog:
taken: van toot bestaat al

@ -1,21 +1,17 @@
---
ar:
about:
about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
about_mastodon_html: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
about_this: عن مثيل الخادوم هذا
business_email: 'البريد الإلكتروني المهني :'
closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
contact: للتواصل معنا
description_headline: ما هو %{domain}?
domain_count_after: خوادم أخرى
domain_count_before: متصل بـ
get_started: إبدأ الآن
links: الروابط
other_instances: خوادم أخرى
source_code: الشفرة المصدرية
status_count_after: منشورا
status_count_before: نشروا
terms: شروط الاستعمال
user_count_after: مستخدم
user_count_before: يستضيف
accounts:

@ -1,21 +1,17 @@
---
bg:
about:
about_mastodon: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
about_mastodon_html: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
about_this: За тази инстанция
business_email: 'Служебен e-mail:'
closed_registrations: В момента регистрациите за тази инстанция са затворени.
contact: За контакти
description_headline: Какво е %{domain}?
domain_count_after: други инстанции
domain_count_before: Свързани към
get_started: Първи стъпки
links: Връзки
other_instances: Други инстанции
source_code: Програмен код
status_count_after: публикации
status_count_before: Написали
terms: Условия
user_count_after: потребители
user_count_before: Дом на
accounts:

@ -1,24 +1,19 @@
---
ca:
about:
about_mastodon: Mastodon és un servidor de xarxa social <em>lliure i de codi obert</em>. Una alternativa <em>descentralitzada</em> a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la <em>xarxa social</em>.
about_mastodon_html: Mastodon és un servidor de xarxa social <em>lliure i de codi obert</em>. Una alternativa <em>descentralitzada</em> a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la <em>xarxa social</em>.
about_this: Sobre aquesta instància
business_email: 'Adreça de contacte:'
closed_registrations: Els registres estan actualment tancats en aquesta instància.
contact: Contacte
description_headline: Què es %{domain}?
domain_count_after: altres instàncies
domain_count_before: Connectat a
get_started: Començar
links: Vincles
other_instances: Altres instàncies
source_code: Codi font
status_count_after: estats
status_count_before: Que han escrit
terms: Termes
user_count_after: usuaris registrats
user_count_before: Tenim
version: Versió
accounts:
follow: Seguir
followers: Seguidors

@ -1,24 +1,19 @@
---
de:
about:
about_mastodon: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
about_mastodon_html: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
about_this: Über diese Instanz
business_email: 'Geschäftliche E-Mail:'
closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen.
contact: Kontakt
description_headline: Was ist %{domain}?
domain_count_after: andere Instanzen
domain_count_before: Verbunden mit
get_started: Erste Schritte
links: Links
other_instances: Andere Instanzen
source_code: Quellcode
status_count_after: Beiträge verfassten
status_count_before: die
terms: AGB
user_count_after: Benutzer
user_count_before: Heimat für
version: Version
accounts:
follow: Folgen
followers: Folgende

@ -2,7 +2,7 @@
nl:
devise:
confirmations:
confirmed: Je account is bevestigd.
confirmed: Jouw account is bevestigd.
send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
failure:
@ -10,8 +10,8 @@ nl:
inactive: Jouw account is nog niet geactiveerd.
invalid: Ongeldig e-mailadres of wachtwoord.
invalid_token: Ongeldige bevestigingscode.
last_attempt: Je hebt nog één poging over voordat jouw account geblokkeerd wordt.
locked: Jouw account is geblokkeerd.
last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort.
locked: Jouw account is opgeschort.
not_found_in_database: Ongeldig e-mailadres of wachtwoord.
timeout: Jouw sessie is verlopen, log opnieuw in.
unauthenticated: Je dient in te loggen of te registreren.
@ -24,21 +24,21 @@ nl:
reset_password_instructions:
subject: 'Mastodon: Wachtwoord opnieuw instellen'
unlock_instructions:
subject: 'Mastodon: Instructies om account te deblokkeren'
subject: 'Mastodon: Instructies om opschorten account ongedaan te maken'
omniauth_callbacks:
failure: Kon je niet aanmelden met jouw %{kind} account, omdat "%{reason}".
success: Successvol aangemeld met jouw %{kind} account.
passwords:
no_token: Je kunt deze pagina niet benaderen zonder dat je een e-mail om je wachtwoord opnieuw in te stellen hebt ontvangen.
send_instructions: Je ontvangt via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen.
send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw moet instellen. Kijk tussen je spam wanneer niks werd ontvangen.
send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw wachtwoord opnieuw kunt instellen. Kijk tussen je spam wanneer niks werd ontvangen.
updated: Jouw wachtwoord is gewijzigd. Je bent nu ingelogd.
updated_not_active: Jouw wachtwoord is gewijzigd.
registrations:
destroyed: Jouw account is verwijderd. Wellicht tot ziens!
signed_up: Je bent geregistreerd.
signed_up_but_inactive: Je bent geregistreerd. Je kon alleen niet automatisch ingelogd worden omdat jouw account nog niet geactiveerd is.
signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account geblokkeerd is.
signed_up_but_locked: Je bent ingeschreven. Je kon alleen niet automatisch ingelogd worden omdat jouw account is opgeschort.
signed_up_but_unconfirmed: Je ontvangt via e-mail instructies hoe je jouw account kunt activeren. Kijk tussen je spam wanneer niks werd ontvangen.
update_needs_confirmation: Je hebt je e-mailadres succesvol gewijzigd, maar we moeten je nieuwe mailadres nog bevestigen. Controleer jouw e-mail en klik op de link in de mail om jouw e-mailadres te bevestigen. Kijk tussen je spam wanneer niks werd ontvangen.
updated: Jouw accountgegevens zijn opgeslagen.
@ -46,16 +46,16 @@ nl:
signed_in: Je bent succesvol ingelogd.
signed_out: Je bent succesvol uitgelogd.
unlocks:
send_instructions: Je ontvangt via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen.
send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je jouw account kunt deblokkeren. Kijk tussen je spam wanneer niks werd ontvangen.
unlocked: Jouw account is gedeblokkeerd. Je kunt nu weer inloggen.
send_instructions: Je ontvangt via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen.
send_paranoid_instructions: Als jouw e-mailadres in de database staat, ontvang je via e-mail instructies hoe je het opschorten van jouw account ongedaan kunt maken. Kijk tussen je spam wanneer niks werd ontvangen.
unlocked: Jouw account is niet meer opgeschort. Je kunt nu weer inloggen.
errors:
messages:
already_confirmed: is reeds bevestigd
confirmation_period_expired: moet worden bevestigd binnen %{period}, probeer het nog een keer
expired: is verlopen, vraag een nieuwe aan
not_found: niet gevonden
not_locked: is niet geblokkeerd
not_locked: is niet opgeschort
not_saved:
one: '1 fout verhinderde het opslaan van deze %{resource}:'
other: "%{count} fouten verhinderden het opslaan van deze %{resource}:"

@ -109,6 +109,6 @@ nl:
application:
title: OAuth-autorisatie vereist
scopes:
follow: volg, blokkeer, deblokkeer en stop het volgen van accounts
read: lees jouw accountgegevens
write: namens jou plaatsen
follow: accounts te volgen, te negeren en te blokkeren.
read: jouw accountgegevens te lezen
write: namens jou berichten te plaatsen

@ -3,12 +3,16 @@ en:
about:
about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail.
about_this: About
business_email: 'Business e-mail:'
closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there.
contact: Contact
contact_missing: Not set
contact_unavailable: N/A
description_headline: What is %{domain}?
domain_count_after: other instances
domain_count_before: Connected to
extended_description_html: |
<h3>A good place for rules</h3>
<p>The extended description has not been set up yet.</p>
features:
humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media.
humane_approach_title: A more humane approach
@ -20,18 +24,14 @@ en:
within_reach_title: Always within reach
find_another_instance: Find another instance
generic_description: "%{domain} is one server in the network"
get_started: Get started
hosted_on: Mastodon hosted on %{domain}
learn_more: Learn more
links: Links
other_instances: Instance list
source_code: Source code
status_count_after: statuses
status_count_before: Who authored
terms: Terms
user_count_after: users
user_count_before: Home to
version: Version
what_is_mastodon: What is Mastodon?
accounts:
follow: Follow
@ -108,13 +108,15 @@ en:
create: Create block
hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts.
severity:
desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data."
desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data. Use <strong>None</strong> if you just want to reject media files."
noop: None
silence: Silence
suspend: Suspend
title: New domain block
reject_media: Reject media files
reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions
severities:
noop: None
silence: Silence
suspend: Suspend
severity: Severity
@ -198,8 +200,8 @@ en:
show: Show media
title: Media
no_media: No media
with_media: With media
title: Account statuses
with_media: With media
subscriptions:
callback_url: Callback URL
confirmed: Confirmed
@ -272,7 +274,7 @@ en:
content: Security verification failed. Are you blocking cookies?
title: Security verification failed
'429': Throttled
noscript: To use Mastodon, please enable JavaScript.
noscript: To use the Mastodon web application, please enable JavaScript. Alternatively, find a native app for Mastodon for your platform.
exports:
blocks: You block
csv: CSV
@ -347,15 +349,15 @@ en:
follow:
title: "%{name} is now following you"
mention:
action_boost: 'Boost'
action_expand: 'Show more'
action_favourite: 'Favourite'
action_boost: Boost
action_expand: Show more
action_favourite: Favourite
title: "%{name} mentioned you"
reblog:
title: "%{name} boosted your status"
subscribed:
body: "You can now receive push notifications."
title: "Subscription registered!"
body: You can now receive push notifications.
title: Subscription registered!
remote_follow:
acct: Enter your username@domain you want to follow from
missing_resource: Could not find the required redirect URL for your account

@ -1,20 +1,16 @@
---
eo:
about:
about_mastodon: Mastodon estas <em>senpaga, malfermitkoda</em> socia reto. Ĝi estas <em>sencentra</em> alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la <em>socia reto</em> tute glate.
about_mastodon_html: Mastodon estas <em>senpaga, malfermitkoda</em> socia reto. Ĝi estas <em>sencentra</em> alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la <em>socia reto</em> tute glate.
about_this: Pri tiu aperaĵo
business_email: 'Profesia retpoŝt-adreso:'
contact: Kontakti
description_headline: Kio estas %{domain}?
domain_count_after: aliaj aperaĵoj
domain_count_before: Konektita al
get_started: Komenci
links: Ligiloj
other_instances: Aliaj aperaĵoj
source_code: Fontkodo
status_count_after: mesaĝoj
status_count_before: Kiu publikigis
terms: Terms
user_count_after: uzantoj
user_count_before: Hejmo de
accounts:

@ -1,21 +1,17 @@
---
es:
about:
about_mastodon: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
about_mastodon_html: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
about_this: Acerca de esta instancia
business_email: 'Correo de negocios:'
closed_registrations: Los registros están actualmente cerrados en esta instancia.
contact: Contacto
description_headline: "¿Qué es %{domain}?"
domain_count_after: otras instancias
domain_count_before: Conectado a
get_started: Comenzar
links: Enlaces
other_instances: Otras instancias
source_code: Código fuente
status_count_after: estados
status_count_before: Que han escrito
terms: Términos
user_count_after: usuarios registrados
user_count_before: Tenemos
accounts:

@ -1,24 +1,19 @@
---
fa:
about:
about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
about_this: دربارهٔ این سرور
business_email: 'ایمیل کاری:'
closed_registrations: امکان ثبت نام روی این سرور هم‌اینک فعال نیست.
contact: تماس
description_headline: "%{domain} چیست؟"
domain_count_after: سرور دیگر
domain_count_before: متصل به
get_started: آغاز کنید
links: پیوندها
other_instances: سرورهای دیگر
source_code: کدهای منبع
status_count_after: چیز نوشته‌اند
status_count_before: که جمعاً
terms: شرایط استفاده
user_count_after: کاربر
user_count_before: دارای
version: نسخه
accounts:
follow: پی بگیرید
followers: پیگیران

@ -1,20 +1,16 @@
---
fi:
about:
about_mastodon: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
about_mastodon_html: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat &mdash; minkä tahansa valitset, voit vuorovaikuttaa muiden kanssa. Kuka tahansa voi luoda Mastodon palvelimen ja ottaa osaa <em>sosiaaliseen verkkoon</em> saumattomasti.
about_this: Tietoja tästä palvelimesta
business_email: 'Business e-mail:'
contact: Ota yhteyttä
description_headline: Mikä on %{domain}?
domain_count_after: muuhun palvelimeen
domain_count_before: Yhdistyneenä
get_started: Aloita käyttö
links: Linkit
other_instances: Muut palvelimet
source_code: Lähdekoodi
status_count_after: statusta
status_count_before: Ovat luoneet
terms: Ehdot
user_count_after: käyttäjälle
user_count_before: Koti
accounts:

File diff suppressed because one or more lines are too long

@ -1,24 +1,19 @@
---
he:
about:
about_mastodon: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
about_mastodon_html: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
about_this: אודות שרת זה
business_email: 'דוא"ל עסקי:'
closed_registrations: הרשמות סגורות לשרת זה לעת עתה.
contact: צור קשר
description_headline: מהו %{domain}?
domain_count_after: שרתים אחרים
domain_count_before: מחובר אל
get_started: בואו נתחיל
links: קישורים
other_instances: שרתים אחרים
source_code: קוד מקור
status_count_after: הודעות
status_count_before: שכתבו
terms: תנאים
user_count_after: משתמשים
user_count_before: ביתם של
version: גרסה
accounts:
follow: לעקוב
followers: עוקבים

@ -1,21 +1,17 @@
---
hr:
about:
about_mastodon: Mastodon je <em>besplatna, open-source</em> socijalna mreža. <em>Decentralizirana</em> alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati &mdash; koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u <em>socijalnoj mreži</em> bez problema.
about_mastodon_html: Mastodon je <em>besplatna, open-source</em> socijalna mreža. <em>Decentralizirana</em> alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati &mdash; koji god odabrali, moći ćete komunicirati sa svima ostalima. Bilo tko može imati svoju vlastitu Mastodon instancu i sudjelovati u <em>socijalnoj mreži</em> bez problema.
about_this: O ovoj instanci
business_email: 'Poslovni e-mail:'
closed_registrations: Registracije na ovoj instanci su trenutno zatvorene.
contact: Kontakt
description_headline: Što je %{domain}?
domain_count_after: druge instance
domain_count_before: Spojen na
get_started: Započni
links: Linkovi
other_instances: Druge instance
source_code: Izvorni kod
status_count_after: statusi
status_count_before: Tko je autor
terms: Uvjeti
user_count_after: korisnici
user_count_before: Home to
accounts:

@ -1,10 +1,8 @@
---
hu:
about:
about_mastodon: Mastodon egy <em>szabad, nyílt forráskódú</em> szociális hálózati kiszolgálo. Egy <em>központosítatlan</em> alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a <em>szociális hálózatban</em>.
get_started: Első lépések
about_mastodon_html: Mastodon egy <em>szabad, nyílt forráskódú</em> szociális hálózati kiszolgálo. Egy <em>központosítatlan</em> alternatíva a kereskedelmi platformokra, elkerüli a kommunikációd monopolizációját veszélyét. Bárki futtathatja a Mastodon-t és részt vehet a <em>szociális hálózatban</em>.
source_code: Forráskód
terms: Feltételek
accounts:
follow: Követés
followers: Követők
@ -32,7 +30,7 @@ hu:
validation_errors:
one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant
other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant.
landing_strip_html: <strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse.
landing_strip_html: "<strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse."
landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
notification_mailer:
favourite:

@ -1,24 +1,19 @@
---
id:
about:
about_mastodon: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai &mdash; apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah.
about_mastodon_html: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai &mdash; apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah.
about_this: Tentang server ini
business_email: 'E-mail bisnis:'
closed_registrations: Pendaftaran untuk server ini sedang ditutup.
contact: Kontak
description_headline: Apa itu %{domain}?
domain_count_after: server lain
domain_count_before: Terhubung dengan
get_started: Mulai
links: Link
other_instances: Server lain
source_code: Kode sumber
status_count_after: status
status_count_before: Yang telah menulis
terms: Ketentuan
user_count_after: pengguna
user_count_before: Tempat bernaung bagi
version: Versi
accounts:
follow: Ikuti
followers: Pengikut

@ -1,21 +1,17 @@
---
io:
about:
about_mastodon: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
about_mastodon_html: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
about_this: Pri ta instaluro
business_email: 'Profesionala retpost-adreso:'
closed_registrations: Membresko ne nun esas posible en ta instaluro.
contact: Kontaktar
description_headline: Quo esas %{domain}?
domain_count_after: altra instaluri
domain_count_before: Konektita ad
get_started: Komencar
links: Ligili
other_instances: Altra instaluri
source_code: Fontkodexo
status_count_after: mesaji
status_count_before: Qua publikigis
terms: Terms
user_count_after: uzeri
user_count_before: Hemo di
accounts:

@ -1,21 +1,17 @@
---
it:
about:
about_mastodon: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
about_mastodon_html: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
about_this: A proposito di questo server
business_email: 'Email di lavoro:'
closed_registrations: Al momento le iscrizioni a questo server sono chiuse.
contact: Contatti
description_headline: Cos'è %{domain}?
domain_count_after: altri server
domain_count_before: Connesso a
get_started: Inizia
links: Links
other_instances: Altri server
source_code: Codice sorgente
status_count_after: status
status_count_before: Che hanno pubblicato
terms: Termini di Utilizzo
user_count_after: utenti
user_count_before: Casa di
accounts:

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

Loading…
Cancel
Save