Redesign the landing page, mount public timeline on it (#4122)

* Redesign the landing page, mount public timeline on it

* Adjust the standalone mounted component to the lacking of router

* Adjust auth layout pages to new design

* Fix tests

* Standalone public timeline polling every 5 seconds

* Remove now obsolete translations

* Add responsive design for new landing page

* Address reviews

* Add floating clouds behind frontpage form

* Use access token from public page when available

* Fix mentions and hashtags links, cursor on status content in standalone mode

* Add footer link to source code

* Fix errors on pages that don't embed the component, use classnames

* Fix tests

* Change anonymous autoPlayGif default to false

* When gif autoplay is disabled, hover to play

* Add option to hide the timeline preview

* Slightly improve alt layout

* Add elephant friend to new frontpage

* Display "back to mastodon" in place of "login" when logged in on frontpage

* Change polling time to 3s
This commit is contained in:
Eugen Rochko 2017-07-11 15:27:59 +02:00 committed by GitHub
parent 8784bd79d0
commit e19eefe219
68 changed files with 959 additions and 658 deletions

View File

@ -4,7 +4,10 @@ class AboutController < ApplicationController
before_action :set_body_classes before_action :set_body_classes
before_action :set_instance_presenter, only: [:show, :more, :terms] before_action :set_instance_presenter, only: [:show, :more, :terms]
def show; end def show
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer)
@initial_state_json = serializable_resource.to_json
end
def more; end def more; end
@ -15,6 +18,7 @@ class AboutController < ApplicationController
def new_user def new_user
User.new.tap(&:build_account) User.new.tap(&:build_account)
end end
helper_method :new_user helper_method :new_user
def set_instance_presenter def set_instance_presenter
@ -24,4 +28,11 @@ class AboutController < ApplicationController
def set_body_classes def set_body_classes
@body_classes = 'about-body' @body_classes = 'about-body'
end end
def initial_state_params
{
settings: {},
token: current_session&.token,
}
end
end end

View File

@ -11,8 +11,15 @@ module Admin
site_terms site_terms
open_registrations open_registrations
closed_registrations_message closed_registrations_message
open_deletion
timeline_preview
).freeze
BOOLEAN_SETTINGS = %w(
open_registrations
open_deletion
timeline_preview
).freeze ).freeze
BOOLEAN_SETTINGS = %w(open_registrations).freeze
def edit def edit
@settings = Setting.all_as_records @settings = Setting.all_as_records

View File

@ -15,12 +15,16 @@ class HomeController < ApplicationController
end end
def set_initial_state_json def set_initial_state_json
state = InitialStatePresenter.new(settings: Web::Setting.find_by(user: current_user)&.data || {}, serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer)
current_account: current_account,
token: current_session.token,
admin: Account.find_local(Setting.site_contact_username))
serializable_resource = ActiveModelSerializers::SerializableResource.new(state, serializer: InitialStateSerializer)
@initial_state_json = serializable_resource.to_json @initial_state_json = serializable_resource.to_json
end end
def initial_state_params
{
settings: Web::Setting.find_by(user: current_user)&.data || {},
current_account: current_account,
token: current_session.token,
admin: Account.find_local(Setting.site_contact_username),
}
end
end end

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -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="#189efc"/></svg> <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>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -14,6 +14,7 @@ export default class DropdownMenu extends React.PureComponent {
size: PropTypes.number.isRequired, size: PropTypes.number.isRequired,
direction: PropTypes.string, direction: PropTypes.string,
ariaLabel: PropTypes.string, ariaLabel: PropTypes.string,
disabled: PropTypes.bool,
}; };
static defaultProps = { static defaultProps = {
@ -68,9 +69,19 @@ export default class DropdownMenu extends React.PureComponent {
} }
render () { render () {
const { icon, items, size, direction, ariaLabel } = this.props; const { icon, items, size, direction, ariaLabel, disabled } = this.props;
const { expanded } = this.state; const { expanded } = this.state;
const directionClass = (direction === 'left') ? 'dropdown__left' : 'dropdown__right'; const directionClass = (direction === 'left') ? 'dropdown__left' : 'dropdown__right';
const iconStyle = { fontSize: `${size}px`, width: `${size}px`, lineHeight: `${size}px` };
const iconClassname = `fa fa-fw fa-${icon} dropdown__icon`;
if (disabled) {
return (
<div className='icon-button disabled' style={iconStyle} aria-label={ariaLabel}>
<i className={iconClassname} aria-hidden />
</div>
);
}
const dropdownItems = expanded && ( const dropdownItems = expanded && (
<ul className='dropdown__content-list'> <ul className='dropdown__content-list'>
@ -80,8 +91,8 @@ export default class DropdownMenu extends React.PureComponent {
return ( return (
<Dropdown ref={this.setRef} onShow={this.handleShow} onHide={this.handleHide}> <Dropdown ref={this.setRef} onShow={this.handleShow} onHide={this.handleHide}>
<DropdownTrigger className='icon-button' style={{ fontSize: `${size}px`, width: `${size}px`, lineHeight: `${size}px` }} aria-label={ariaLabel}> <DropdownTrigger className='icon-button' style={iconStyle} aria-label={ariaLabel}>
<i className={`fa fa-fw fa-${icon} dropdown__icon`} aria-hidden /> <i className={iconClassname} aria-hidden />
</DropdownTrigger> </DropdownTrigger>
<DropdownContent className={directionClass}> <DropdownContent className={directionClass}>

View File

@ -11,18 +11,44 @@ const messages = defineMessages({
class Item extends React.PureComponent { class Item extends React.PureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = { static propTypes = {
attachment: ImmutablePropTypes.map.isRequired, attachment: ImmutablePropTypes.map.isRequired,
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,
size: PropTypes.number.isRequired, size: PropTypes.number.isRequired,
onClick: PropTypes.func.isRequired, onClick: PropTypes.func.isRequired,
autoPlayGif: PropTypes.bool.isRequired, autoPlayGif: PropTypes.bool,
}; };
static defaultProps = {
autoPlayGif: false,
};
handleMouseEnter = (e) => {
if (this.hoverToPlay()) {
e.target.play();
}
}
handleMouseLeave = (e) => {
if (this.hoverToPlay()) {
e.target.pause();
e.target.currentTime = 0;
}
}
hoverToPlay () {
const { attachment, autoPlayGif } = this.props;
return !autoPlayGif && attachment.get('type') === 'gifv';
}
handleClick = (e) => { handleClick = (e) => {
const { index, onClick } = this.props; const { index, onClick } = this.props;
if (e.button === 0) { if (this.context.router && e.button === 0) {
e.preventDefault(); e.preventDefault();
onClick(index); onClick(index);
} }
@ -116,6 +142,8 @@ class Item extends React.PureComponent {
role='application' role='application'
src={attachment.get('url')} src={attachment.get('url')}
onClick={this.handleClick} onClick={this.handleClick}
onMouseEnter={this.handleMouseEnter}
onMouseLeave={this.handleMouseLeave}
autoPlay={autoPlay} autoPlay={autoPlay}
loop loop
muted muted
@ -144,7 +172,11 @@ export default class MediaGallery extends React.PureComponent {
height: PropTypes.number.isRequired, height: PropTypes.number.isRequired,
onOpenMedia: PropTypes.func.isRequired, onOpenMedia: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
autoPlayGif: PropTypes.bool.isRequired, autoPlayGif: PropTypes.bool,
};
static defaultProps = {
autoPlayGif: false,
}; };
state = { state = {

View File

@ -15,7 +15,7 @@ export default class Permalink extends React.PureComponent {
}; };
handleClick = (e) => { handleClick = (e) => {
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault(); e.preventDefault();
this.context.router.history.push(this.props.to); this.context.router.history.push(this.props.to);
} }
@ -25,7 +25,7 @@ export default class Permalink extends React.PureComponent {
const { href, children, className, ...other } = this.props; const { href, children, className, ...other } = this.props;
return ( return (
<a href={href} onClick={this.handleClick} {...other} className={`permalink${className ? ' ' + className : ''}`}> <a target='_blank' href={href} onClick={this.handleClick} {...other} className={`permalink${className ? ' ' + className : ''}`}>
{children} {children}
</a> </a>
); );

View File

@ -140,12 +140,16 @@ export default class Status extends ImmutablePureComponent {
} }
handleClick = () => { handleClick = () => {
if (!this.context.router) {
return;
}
const { status } = this.props; const { status } = this.props;
this.context.router.history.push(`/statuses/${status.getIn(['reblog', 'id'], status.get('id'))}`); this.context.router.history.push(`/statuses/${status.getIn(['reblog', 'id'], status.get('id'))}`);
} }
handleAccountClick = (e) => { handleAccountClick = (e) => {
if (e.button === 0) { if (this.context.router && e.button === 0) {
const id = Number(e.currentTarget.getAttribute('data-id')); const id = Number(e.currentTarget.getAttribute('data-id'));
e.preventDefault(); e.preventDefault();
this.context.router.history.push(`/accounts/${id}`); this.context.router.history.push(`/accounts/${id}`);
@ -236,7 +240,7 @@ export default class Status extends ImmutablePureComponent {
<div className='status__info'> <div className='status__info'>
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a> <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
<a onClick={this.handleAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} className='status__display-name'> <a onClick={this.handleAccountClick} target='_blank' data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} className='status__display-name'>
<div className='status__avatar'> <div className='status__avatar'>
{statusAvatar} {statusAvatar}
</div> </div>

View File

@ -40,7 +40,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
onBlock: PropTypes.func, onBlock: PropTypes.func,
onReport: PropTypes.func, onReport: PropTypes.func,
onMuteConversation: PropTypes.func, onMuteConversation: PropTypes.func,
me: PropTypes.number.isRequired, me: PropTypes.number,
withDismiss: PropTypes.bool, withDismiss: PropTypes.bool,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
}; };
@ -97,6 +97,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
const { status, me, intl, withDismiss } = this.props; const { status, me, intl, withDismiss } = this.props;
const reblogDisabled = status.get('visibility') === 'private' || status.get('visibility') === 'direct'; const reblogDisabled = status.get('visibility') === 'private' || status.get('visibility') === 'direct';
const mutingConversation = status.get('muted'); const mutingConversation = status.get('muted');
const anonymousAccess = !me;
let menu = []; let menu = [];
let reblogIcon = 'retweet'; let reblogIcon = 'retweet';
@ -137,12 +138,12 @@ export default class StatusActionBar extends ImmutablePureComponent {
return ( return (
<div className='status__action-bar'> <div className='status__action-bar'>
<IconButton className='status__action-bar-button' title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} /> <IconButton className='status__action-bar-button' disabled={anonymousAccess} title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} />
<IconButton className='status__action-bar-button' disabled={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' 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' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> <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} />
<div className='status__action-bar-dropdown'> <div className='status__action-bar-dropdown'>
<DropdownMenu items={menu} icon='ellipsis-h' size={18} direction='right' ariaLabel='More' /> <DropdownMenu disabled={anonymousAccess} items={menu} icon='ellipsis-h' size={18} direction='right' ariaLabel='More' />
</div> </div>
</div> </div>
); );

View File

@ -6,6 +6,7 @@ import emojify from '../emoji';
import { isRtl } from '../rtl'; import { isRtl } from '../rtl';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import Permalink from './permalink'; import Permalink from './permalink';
import classnames from 'classnames';
export default class StatusContent extends React.PureComponent { export default class StatusContent extends React.PureComponent {
@ -43,10 +44,11 @@ export default class StatusContent extends React.PureComponent {
} else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) { } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false); link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
} else { } else {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener');
link.setAttribute('title', link.href); link.setAttribute('title', link.href);
} }
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener');
} }
} }
@ -59,7 +61,7 @@ export default class StatusContent extends React.PureComponent {
} }
onMentionClick = (mention, e) => { onMentionClick = (mention, e) => {
if (e.button === 0) { if (this.context.router && e.button === 0) {
e.preventDefault(); e.preventDefault();
this.context.router.history.push(`/accounts/${mention.get('id')}`); this.context.router.history.push(`/accounts/${mention.get('id')}`);
} }
@ -68,7 +70,7 @@ export default class StatusContent extends React.PureComponent {
onHashtagClick = (hashtag, e) => { onHashtagClick = (hashtag, e) => {
hashtag = hashtag.replace(/^#/, '').toLowerCase(); hashtag = hashtag.replace(/^#/, '').toLowerCase();
if (e.button === 0) { if (this.context.router && e.button === 0) {
e.preventDefault(); e.preventDefault();
this.context.router.history.push(`/timelines/tag/${hashtag}`); this.context.router.history.push(`/timelines/tag/${hashtag}`);
} }
@ -120,6 +122,9 @@ export default class StatusContent extends React.PureComponent {
const content = { __html: emojify(status.get('content')) }; const content = { __html: emojify(status.get('content')) };
const spoilerContent = { __html: emojify(escapeTextContentForBrowser(status.get('spoiler_text', ''))) }; const spoilerContent = { __html: emojify(escapeTextContentForBrowser(status.get('spoiler_text', ''))) };
const directionStyle = { direction: 'ltr' }; const directionStyle = { direction: 'ltr' };
const classNames = classnames('status__content', {
'status__content--with-action': this.props.onClick && this.context.router,
});
if (isRtl(status.get('search_index'))) { if (isRtl(status.get('search_index'))) {
directionStyle.direction = 'rtl'; directionStyle.direction = 'rtl';
@ -141,7 +146,7 @@ export default class StatusContent extends React.PureComponent {
} }
return ( return (
<div className='status__content status__content--with-action' ref={this.setRef} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}> <div className={classNames} ref={this.setRef} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
<p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}> <p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}>
<span dangerouslySetInnerHTML={spoilerContent} /> <span dangerouslySetInnerHTML={spoilerContent} />
{' '} {' '}
@ -157,7 +162,7 @@ export default class StatusContent extends React.PureComponent {
return ( return (
<div <div
ref={this.setRef} ref={this.setRef}
className='status__content status__content--with-action' className={classNames}
style={directionStyle} style={directionStyle}
onMouseDown={this.handleMouseDown} onMouseDown={this.handleMouseDown}
onMouseUp={this.handleMouseUp} onMouseUp={this.handleMouseUp}

View File

@ -14,6 +14,10 @@ const messages = defineMessages({
@injectIntl @injectIntl
export default class VideoPlayer extends React.PureComponent { export default class VideoPlayer extends React.PureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = { static propTypes = {
media: ImmutablePropTypes.map.isRequired, media: ImmutablePropTypes.map.isRequired,
width: PropTypes.number, width: PropTypes.number,
@ -119,11 +123,15 @@ export default class VideoPlayer extends React.PureComponent {
</div> </div>
); );
let expandButton = ( let expandButton = '';
<div className='status__video-player-expand'>
<IconButton overlay title={intl.formatMessage(messages.expand_video)} icon='expand' onClick={this.handleExpand} /> if (this.context.router) {
</div> expandButton = (
); <div className='status__video-player-expand'>
<IconButton overlay title={intl.formatMessage(messages.expand_video)} icon='expand' onClick={this.handleExpand} />
</div>
);
}
let muteButton = ''; let muteButton = '';
@ -138,7 +146,7 @@ export default class VideoPlayer extends React.PureComponent {
if (!this.state.visible) { if (!this.state.visible) {
if (sensitive) { if (sensitive) {
return ( return (
<div role='button' tabIndex='0' style={{ width: `${width}px`, height: `${height}px` }} className='media-spoiler' onClick={this.handleVisibility}> <div role='button' tabIndex='0' style={{ width: `${width}px`, height: `${height}px`, marginTop: '8px' }} className='media-spoiler' onClick={this.handleVisibility}>
{spoilerButton} {spoilerButton}
<span className='media-spoiler__warning'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span> <span className='media-spoiler__warning'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span>
<span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span> <span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span>
@ -146,7 +154,7 @@ export default class VideoPlayer extends React.PureComponent {
); );
} else { } else {
return ( return (
<div role='button' tabIndex='0' style={{ width: `${width}px`, height: `${height}px` }} className='media-spoiler' onClick={this.handleVisibility}> <div role='button' tabIndex='0' style={{ width: `${width}px`, height: `${height}px`, marginTop: '8px' }} className='media-spoiler' onClick={this.handleVisibility}>
{spoilerButton} {spoilerButton}
<span className='media-spoiler__warning'><FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' /></span> <span className='media-spoiler__warning'><FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' /></span>
<span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span> <span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span>

View File

@ -0,0 +1,39 @@
import React from 'react';
import { Provider } from 'react-redux';
import PropTypes from 'prop-types';
import configureStore from '../store/configureStore';
import { hydrateStore } from '../actions/store';
import { IntlProvider, addLocaleData } from 'react-intl';
import { getLocale } from '../locales';
import PublicTimeline from '../features/standalone/public_timeline';
const { localeData, messages } = getLocale();
addLocaleData(localeData);
const store = configureStore();
const initialStateContainer = document.getElementById('initial-state');
if (initialStateContainer !== null) {
const initialState = JSON.parse(initialStateContainer.textContent);
store.dispatch(hydrateStore(initialState));
}
export default class TimelineContainer extends React.PureComponent {
static propTypes = {
locale: PropTypes.string.isRequired,
};
render () {
const { locale } = this.props;
return (
<IntlProvider locale={locale} messages={messages}>
<Provider store={store}>
<PublicTimeline />
</Provider>
</IntlProvider>
);
}
}

View File

@ -0,0 +1,76 @@
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import StatusListContainer from '../../ui/containers/status_list_container';
import {
refreshPublicTimeline,
expandPublicTimeline,
} from '../../../actions/timelines';
import Column from '../../../components/column';
import ColumnHeader from '../../../components/column_header';
import { defineMessages, injectIntl } from 'react-intl';
const messages = defineMessages({
title: { id: 'standalone.public_title', defaultMessage: 'A look inside...' },
});
@connect()
@injectIntl
export default class PublicTimeline extends React.PureComponent {
static propTypes = {
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
};
handleHeaderClick = () => {
this.column.scrollTop();
}
setRef = c => {
this.column = c;
}
componentDidMount () {
const { dispatch } = this.props;
dispatch(refreshPublicTimeline());
this.polling = setInterval(() => {
dispatch(refreshPublicTimeline());
}, 3000);
}
componentWillUnmount () {
if (typeof this.polling !== 'undefined') {
clearInterval(this.polling);
this.polling = null;
}
}
handleLoadMore = () => {
this.props.dispatch(expandPublicTimeline());
}
render () {
const { intl } = this.props;
return (
<Column ref={this.setRef}>
<ColumnHeader
icon='globe'
title={intl.formatMessage(messages.title)}
onClick={this.handleHeaderClick}
/>
<StatusListContainer
timelineId='public'
loadMore={this.handleLoadMore}
scrollKey='standalone_public_timeline'
trackScroll={false}
/>
</Column>
);
}
}

View File

@ -4,6 +4,9 @@ import { delegate } from 'rails-ujs';
import emojify from '../mastodon/emoji'; import emojify from '../mastodon/emoji';
import { getLocale } from '../mastodon/locales'; import { getLocale } from '../mastodon/locales';
import loadPolyfills from '../mastodon/load_polyfills'; import loadPolyfills from '../mastodon/load_polyfills';
import TimelineContainer from '../mastodon/containers/timeline_container';
import React from 'react';
import ReactDOM from 'react-dom';
require.context('../images/', true); require.context('../images/', true);
@ -36,6 +39,13 @@ function loaded() {
const datetime = new Date(content.getAttribute('datetime')); const datetime = new Date(content.getAttribute('datetime'));
content.textContent = relativeFormat.format(datetime);; content.textContent = relativeFormat.format(datetime);;
}); });
const mountNode = document.getElementById('mastodon-timeline');
if (mountNode !== null) {
const props = JSON.parse(mountNode.getAttribute('data-props'));
ReactDOM.render(<TimelineContainer {...props} />, mountNode);
}
} }
function main() { function main() {

View File

@ -116,10 +116,6 @@
.wrapper { .wrapper {
padding: 20px; padding: 20px;
} }
.features-list {
display: block;
}
} }
} }
@ -301,80 +297,438 @@
} }
} }
.features-list { .features-list__row {
display: flex; display: flex;
margin-bottom: 20px; padding: 10px 0;
justify-content: space-between;
.features-list__column { &:first-child {
flex: 1 1 0; padding-top: 0;
}
ul { .visual {
list-style: none; flex: 0 0 auto;
display: flex;
align-items: center;
margin-left: 15px;
.fa {
display: block;
color: $ui-primary-color;
font-size: 48px;
} }
}
li { .text {
margin: 0; font-size: 16px;
line-height: 30px;
color: lighten($ui-base-color, 26%);
h6 {
font-weight: 500;
color: $ui-primary-color;
} }
} }
} }
.screenshot-with-signup { .landing-page {
display: flex; .header-wrapper {
margin-bottom: 20px; padding-top: 15px;
background: $ui-base-color;
background: linear-gradient(150deg, lighten($ui-base-color, 8%), $ui-base-color);
position: relative;
.mascot { .mascot-container {
flex: 1 1 auto; max-width: 800px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
img {
display: block;
margin: 0 auto; margin: 0 auto;
max-width: 100%; position: absolute;
top: 0;
left: 0;
right: 0;
height: 100%;
}
.mascot {
position: absolute;
bottom: -14px;
width: auto;
height: auto; height: auto;
left: 60px;
z-index: 3;
} }
} }
.simple_form, p,
.closed-registrations-message { li {
width: 300px; font: inherit;
flex: 0 0 auto; font-weight: inherit;
background: rgba(darken($ui-base-color, 7%), 0.5); margin-bottom: 0;
padding: 14px; }
border-radius: 4px;
box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);
.actions { .header {
margin-bottom: 0; line-height: 30px;
overflow: hidden;
.container {
display: flex;
justify-content: space-between;
} }
.info { .hero {
text-align: center; margin-top: 50px;
align-items: center;
position: relative;
.floats {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
img {
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;
z-index: 2;
}
.float-1 {
height: 170px;
right: -120px;
bottom: 0;
}
.float-2 {
height: 100px;
right: 210px;
bottom: 0;
animation-delay: 0.2s;
}
.float-3 {
height: 140px;
right: 110px;
top: -30px;
animation-delay: 0.1s;
}
}
.simple_form,
.closed-registrations-message {
background: darken($ui-base-color, 4%);
width: 280px;
padding: 15px 20px;
border-radius: 4px 4px 0 0;
line-height: initial;
position: relative;
z-index: 4;
.actions {
margin-bottom: 0;
button,
.button,
.block-button {
margin-bottom: 0;
}
}
}
.heading {
position: relative;
z-index: 4;
padding-bottom: 150px;
}
.closed-registrations-message {
min-height: 330px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
ul {
list-style: none;
margin: 0;
li {
display: inline-block;
vertical-align: bottom;
margin: 0;
&:first-child a {
padding-left: 0;
}
&:last-child a {
padding-right: 0;
}
}
}
.links {
position: relative;
z-index: 4;
a { a {
color: $ui-secondary-color; display: flex;
justify-content: center;
align-items: center;
color: $ui-primary-color;
text-decoration: none;
padding: 12px 16px;
line-height: 32px;
font-family: 'mastodon-font-display', sans-serif;
font-weight: 500;
font-size: 14px;
&:hover {
color: $ui-secondary-color;
}
}
.brand {
a {
padding-left: 0;
color: $white;
}
img {
width: 32px;
height: 32px;
margin-right: 10px;
}
} }
} }
} }
@media screen and (max-width: 625px) { .container {
.mascot { width: 100%;
display: none; box-sizing: border-box;
max-width: 800px;
margin: 0 auto;
}
.wrapper {
max-width: 800px;
margin: 0 auto;
padding: 0;
}
.learn-more-cta {
background: darken($ui-base-color, 4%);
padding: 50px 0;
}
h3 {
font-family: 'mastodon-font-display', sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 500;
margin-bottom: 20px;
color: $ui-primary-color;
}
p {
font-size: 16px;
line-height: 30px;
color: lighten($ui-base-color, 26%);
}
.features {
padding: 50px 0;
.container {
display: flex;
}
}
#mastodon-timeline {
-webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar;
font-family: 'mastodon-font-sans-serif', sans-serif;
font-size: 13px;
line-height: 18px;
font-weight: 400;
color: $primary-text-color;
width: 330px;
margin-right: 30px;
flex: 0 0 auto;
background: $ui-base-color;
overflow: hidden;
box-shadow: 0 0 6px rgba($black, 0.1);
.column {
padding: 0;
border-radius: 4px;
overflow: hidden;
height: 100%;
} }
.simple_form, .scrollable {
.closed-registrations-message { height: 400px;
flex: auto; }
p {
font-size: inherit;
line-height: inherit;
font-weight: inherit;
color: $primary-text-color;
a {
color: $ui-secondary-color;
text-decoration: none;
}
}
}
.about-mastodon {
max-width: 675px;
p {
margin-bottom: 20px;
}
.features-list {
margin-top: 20px;
}
}
em {
display: inline;
margin: 0;
padding: 0;
font-weight: 500;
background: transparent;
font-family: inherit;
font-size: inherit;
line-height: inherit;
color: $ui-primary-color;
}
h1 {
font-family: 'mastodon-font-display', sans-serif;
font-size: 26px;
line-height: 30px;
margin-bottom: 0;
font-weight: 500;
color: $ui-secondary-color;
small {
font-family: 'mastodon-font-sans-serif', sans-serif;
display: block;
font-size: 18px;
font-weight: 400;
color: lighten($ui-base-color, 26%);
}
}
.footer-links {
padding-bottom: 50px;
text-align: right;
color: lighten($ui-base-color, 26%);
p {
font-size: 14px;
}
a {
color: inherit;
text-decoration: underline;
}
}
@media screen and (max-width: 800px) {
.container {
padding: 0 20px;
}
.header-wrapper .mascot {
left: 20px;
}
}
@media screen and (max-width: 689px) {
.header-wrapper .mascot {
display: none;
}
}
@media screen and (max-width: 675px) {
.header-wrapper {
padding-top: 0;
}
.header .container,
.features .container {
display: block;
}
.links {
padding-top: 15px;
background: darken($ui-base-color, 4%);
}
.header {
padding-top: 0;
.hero {
margin-top: 30px;
padding: 0;
.heading {
padding-bottom: 20px;
}
}
.floats {
display: none;
}
.heading,
.nav {
text-align: center;
}
.heading h1 {
padding: 30px 0;
}
.hero {
.simple_form,
.closed-registrations-message {
background: darken($ui-base-color, 8%);
width: 100%;
border-radius: 0;
box-sizing: border-box;
}
}
}
#mastodon-timeline {
height: 70vh;
width: 100%;
margin-bottom: 50px;
} }
} }
} }
.closed-registrations-message { @keyframes floating {
display: flex; from {
flex-direction: column; transform: translate(0, 0);
align-items: center; }
justify-content: center;
text-align: center; 65% {
transform: translate(0, 4px);
}
to {
transform: translate(0, -0);
}
} }

View File

@ -1,6 +1,6 @@
body { body {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: 'mastodon-font-sans-serif', sans-serif;
background: $ui-base-color url('../images/background-photo.jpg'); background: $ui-base-color;
background-size: cover; background-size: cover;
background-attachment: fixed; background-attachment: fixed;
font-size: 13px; font-size: 13px;
@ -22,6 +22,11 @@ body {
background: $ui-base-color; background: $ui-base-color;
} }
&.about-body {
background: darken($ui-base-color, 8%);
padding-bottom: 0;
}
&.embed { &.embed {
background: transparent; background: transparent;
margin: 0; margin: 0;

File diff suppressed because one or more lines are too long

View File

@ -42,8 +42,38 @@
cursor: default; cursor: default;
} }
&.button-alternative {
font-size: 16px;
line-height: 36px;
height: auto;
color: $ui-base-color;
background: $ui-primary-color;
text-transform: none;
padding: 4px 16px;
&:active,
&:focus,
&:hover {
background-color: lighten($ui-primary-color, 4%);
}
}
&.button-secondary { &.button-secondary {
// font-size: 16px;
line-height: 36px;
height: auto;
color: $ui-primary-color;
text-transform: none;
background: transparent;
padding: 3px 15px;
border: 1px solid $ui-primary-color;
&:active,
&:focus,
&:hover {
border-color: lighten($ui-primary-color, 4%);
color: lighten($ui-primary-color, 4%);
}
} }
&.button--block { &.button--block {

View File

@ -10,52 +10,36 @@
} }
.logo-container { .logo-container {
max-width: 400px;
margin: 100px auto; margin: 100px auto;
margin-bottom: 0; margin-bottom: 50px;
cursor: default;
@media screen and (max-width: 360px) { @media screen and (max-width: 360px) {
margin: 30px auto; margin: 30px auto;
} }
h1 { h1 {
display: block; display: flex;
text-align: center; justify-content: center;
color: $primary-text-color; align-items: center;
font-size: 48px;
font-weight: 500;
img { img {
display: block; width: 32px;
margin: 20px auto; height: 32px;
width: 180px; margin-right: 10px;
height: 180px;
} }
a { a {
color: inherit; display: flex;
justify-content: center;
align-items: center;
color: $primary-text-color;
text-decoration: none; text-decoration: none;
outline: 0; outline: 0;
padding: 12px 16px;
img { line-height: 32px;
opacity: 0.8; font-family: 'mastodon-font-display', sans-serif;
transition: opacity 0.8s ease; font-weight: 500;
} font-size: 14px;
&:hover {
img {
opacity: 1;
transition-duration: 0.2s;
}
}
}
small {
display: block;
font-size: 12px;
font-weight: 400;
font-family: 'mastodon-font-monospace', monospace;
} }
} }
} }

View File

@ -7,3 +7,11 @@
font-weight: 400; font-weight: 400;
font-style: normal; font-style: normal;
} }
@font-face {
font-family: 'mastodon-font-display';
src: local('Montserrat'),
url('../fonts/montserrat/Montserrat-Medium.ttf') format('truetype');
font-weight: 500;
font-style: normal;
}

View File

@ -24,6 +24,20 @@ code {
p.hint { p.hint {
margin-bottom: 15px; margin-bottom: 15px;
color: lighten($ui-base-color, 32%);
&.subtle-hint {
text-align: center;
font-size: 12px;
line-height: 18px;
margin-top: 15px;
margin-bottom: 0;
color: lighten($ui-base-color, 26%);
a {
color: $ui-primary-color;
}
}
} }
strong { strong {
@ -197,8 +211,6 @@ code {
&:active, &:active,
&:focus { &:focus {
position: relative;
top: 1px;
background-color: darken($ui-highlight-color, 5%); background-color: darken($ui-highlight-color, 5%);
} }
@ -219,6 +231,27 @@ code {
select { select {
font-size: 16px; font-size: 16px;
} }
.input-with-append {
position: relative;
.input input {
padding-right: 127px;
}
.append {
position: absolute;
right: 0;
top: 0;
padding: 7px 4px;
padding-bottom: 9px;
font-size: 16px;
color: lighten($ui-base-color, 26%);
font-family: inherit;
pointer-events: none;
cursor: default;
}
}
} }
.flash-message { .flash-message {
@ -240,7 +273,7 @@ code {
text-align: center; text-align: center;
a { a {
color: $primary-text-color; color: $ui-primary-color;
text-decoration: none; text-decoration: none;
&:hover { &:hover {

View File

@ -5,6 +5,7 @@ class InstancePresenter
:closed_registrations_message, :closed_registrations_message,
:site_contact_email, :site_contact_email,
:open_registrations, :open_registrations,
:site_title,
:site_description, :site_description,
:site_extended_description, :site_extended_description,
:site_terms, :site_terms,

View File

@ -5,32 +5,41 @@ class InitialStateSerializer < ActiveModel::Serializer
:media_attachments, :settings :media_attachments, :settings
def meta def meta
{ store = {
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
access_token: object.token, access_token: object.token,
locale: I18n.locale, locale: I18n.locale,
domain: Rails.configuration.x.local_domain, domain: Rails.configuration.x.local_domain,
me: object.current_account.id,
admin: object.admin&.id, admin: object.admin&.id,
boost_modal: object.current_account.user.setting_boost_modal,
delete_modal: object.current_account.user.setting_delete_modal,
auto_play_gif: object.current_account.user.setting_auto_play_gif,
system_font_ui: object.current_account.user.setting_system_font_ui,
} }
if object.current_account
store[:me] = object.current_account.id
store[:boost_modal] = object.current_account.user.setting_boost_modal
store[:delete_modal] = object.current_account.user.setting_delete_modal
store[:auto_play_gif] = object.current_account.user.setting_auto_play_gif
store[:system_font_ui] = object.current_account.user.setting_system_font_ui
end
store
end end
def compose def compose
{ store = {}
me: object.current_account.id,
default_privacy: object.current_account.user.setting_default_privacy, if object.current_account
default_sensitive: object.current_account.user.setting_default_sensitive, store[:me] = object.current_account.id
} store[:default_privacy] = object.current_account.user.setting_default_privacy
store[:default_sensitive] = object.current_account.user.setting_default_sensitive
end
store
end end
def accounts def accounts
store = {} store = {}
store[object.current_account.id] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) store[object.current_account.id] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) if object.current_account
store[object.admin.id] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) unless object.admin.nil? store[object.admin.id] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) if object.admin
store store
end end

View File

@ -0,0 +1,25 @@
.features-list
.features-list__row
.text
%h6= t 'about.features.real_conversation_title'
= t 'about.features.real_conversation_body'
.visual
= fa_icon 'fw comments'
.features-list__row
.text
%h6= t 'about.features.not_a_product_title'
= t 'about.features.not_a_product_body'
.visual
= fa_icon 'fw users'
.features-list__row
.text
%h6= t 'about.features.within_reach_title'
= t 'about.features.within_reach_body'
.visual
= fa_icon 'fw mobile'
.features-list__row
.text
%h6= t 'about.features.humane_approach_title'
= t 'about.features.humane_approach_body'
.visual
= fa_icon 'fw leaf'

View File

@ -1,10 +1,13 @@
= simple_form_for(new_user, url: user_registration_path) do |f| = simple_form_for(new_user, url: user_registration_path) do |f|
= f.simple_fields_for :account do |account_fields| = f.simple_fields_for :account do |account_fields|
= account_fields.input :username, .input-with-append
autofocus: true, = account_fields.input :username,
placeholder: t('simple_form.labels.defaults.username'), autofocus: true,
required: true, placeholder: t('simple_form.labels.defaults.username'),
input_html: { 'aria-label' => t('simple_form.labels.defaults.username') } required: true,
input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
.append
= "@#{site_hostname}"
= f.input :email, = f.input :email,
placeholder: t('simple_form.labels.defaults.email'), placeholder: t('simple_form.labels.defaults.email'),
@ -22,9 +25,6 @@
input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password') } input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password') }
.actions .actions
= f.button :button, t('about.get_started'), type: :submit = f.button :button, t('auth.register'), type: :submit, class: 'button button-alternative'
.info %p.hint.subtle-hint=t('auth.agreement_html', rules_path: about_more_path, terms_path: terms_path)
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
·
= link_to t('about.about_this'), about_more_path

View File

@ -1,4 +1,5 @@
- content_for :header_tags do - content_for :header_tags do
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
- content_for :page_title do - content_for :page_title do
@ -9,79 +10,70 @@
%meta{ property: 'og:url', content: about_url }/ %meta{ property: 'og:url', content: about_url }/
%meta{ property: 'og:type', content: 'website' }/ %meta{ property: 'og:type', content: 'website' }/
%meta{ property: 'og:title', content: site_hostname }/ %meta{ property: 'og:title', content: site_hostname }/
%meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon')) }/ %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', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
%meta{ property: 'og:image:width', content: '400' }/ %meta{ property: 'og:image:width', content: '400' }/
%meta{ property: 'og:image:height', content: '400' }/ %meta{ property: 'og:image:height', content: '400' }/
%meta{ property: 'twitter:card', content: 'summary' }/ %meta{ property: 'twitter:card', content: 'summary' }/
.wrapper .landing-page
%h1 .header-wrapper
= image_tag asset_pack_path('logo.png') .mascot-container
= Setting.site_title = image_tag asset_pack_path('elephant-fren.png'), class: 'mascot'
%p!= t('about.about_mastodon') .header
.container.links
.brand
= link_to root_url do
= image_tag asset_pack_path('logo.svg')
Mastodon
.screenshot-with-signup %ul.nav
.mascot= image_tag asset_pack_path('fluffy-elephant-friend.png') %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/'
- if @instance_presenter.open_registrations .container.hero
= render 'registration' .floats
- else = image_tag asset_pack_path('cloud2.png'), class: 'float-1'
.closed-registrations-message = image_tag asset_pack_path('cloud3.png'), class: 'float-2'
- if @instance_presenter.closed_registrations_message.blank? = image_tag asset_pack_path('cloud4.png'), class: 'float-3'
%p= t('about.closed_registrations') .heading
%h1
= @instance_presenter.site_title
%small= t 'about.hosted_on', domain: site_hostname
- if @instance_presenter.open_registrations
= render 'registration'
- else - else
!= @instance_presenter.closed_registrations_message .closed-registrations-message
.info %div
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn' - if @instance_presenter.closed_registrations_message.blank?
· %p= t('about.closed_registrations')
= link_to t('about.other_instances'), 'https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/List-of-Mastodon-instances.md' - else
· = @instance_presenter.closed_registrations_message.html_safe
= link_to t('about.about_this'), about_more_path = link_to t('about.find_another_instance'), 'https://joinmastodon.org', class: 'button button-alternative button--block'
%h3= t('about.features_headline') .learn-more-cta
.container
%h3= t('about.description_headline', domain: site_hostname)
%p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
.features-list .features
.features-list__column .container
%ul.fa-ul - if Setting.timeline_preview
%li #mastodon-timeline{ data: { props: Oj.dump(default_props) } }
= fa_icon('li check-square')
= t 'about.features.chronology'
%li
= fa_icon('li check-square')
= t 'about.features.public'
%li
= fa_icon('li check-square')
= t 'about.features.characters'
%li
= fa_icon('li check-square')
= t 'about.features.gifv'
.features-list__column
%ul.fa-ul
%li
= fa_icon('li check-square')
= t 'about.features.privacy'
%li
= fa_icon('li check-square')
= t 'about.features.blocks'
%li
= fa_icon('li check-square')
= t 'about.features.ethics'
%li
= fa_icon('li check-square')
= t 'about.features.api'
- unless @instance_presenter.site_description.blank? .about-mastodon
%h3= t('about.description_headline', domain: site_hostname) %h3= t 'about.what_is_mastodon'
%p!= @instance_presenter.site_description %p= t 'about.about_mastodon_html'
%a.button.button-secondary{ href: 'https://joinmastodon.org' }= t 'about.learn_more'
.actions = render 'features'
.info .footer-links
= link_to t('about.terms'), terms_path .container
· %p
= link_to t('about.apps'), 'https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' = link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
· = " (#{@instance_presenter.version_number})"
= link_to t('about.source_code'), 'https://github.com/tootsuite/mastodon'
·
= link_to t('about.other_instances'), 'https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/List-of-Mastodon-instances.md'

View File

@ -12,54 +12,53 @@
%tr %tr
%td %td
%strong= t('admin.settings.contact_information.label') %strong= t('admin.settings.contact_information.label')
%td= text_field_tag :site_contact_username, %td= text_field_tag :site_contact_username, @settings['site_contact_username'].value, place_holder: t('admin.settings.contact_information.username')
@settings['site_contact_username'].value,
place_holder: t('admin.settings.contact_information.username')
%tr %tr
%td %td
%strong= t('admin.accounts.email') %strong= t('admin.accounts.email')
%td= text_field_tag :site_contact_email, %td= text_field_tag :site_contact_email, @settings['site_contact_email'].value, place_holder: t('admin.settings.contact_information.email')
@settings['site_contact_email'].value,
place_holder: t('admin.settings.contact_information.email')
%tr %tr
%td %td
%strong= t('admin.settings.site_title') %strong= t('admin.settings.site_title')
%td= text_field_tag :site_title, %td= text_field_tag :site_title, @settings['site_title'].value
@settings['site_title'].value
%tr %tr
%td %td
%strong= t('admin.settings.site_description.title') %strong= t('admin.settings.site_description.title')
%p= t('admin.settings.site_description.desc_html') %p= t('admin.settings.site_description.desc_html')
%td= text_area_tag :site_description, %td= text_area_tag :site_description, @settings['site_description'].value, rows: 8
@settings['site_description'].value,
rows: 8
%tr %tr
%td %td
%strong= t('admin.settings.site_description_extended.title') %strong= t('admin.settings.site_description_extended.title')
%p= t('admin.settings.site_description_extended.desc_html') %p= t('admin.settings.site_description_extended.desc_html')
%td= text_area_tag :site_extended_description, %td= text_area_tag :site_extended_description, @settings['site_extended_description'].value, rows: 8
@settings['site_extended_description'].value,
rows: 8
%tr %tr
%td %td
%strong= t('admin.settings.site_terms.title') %strong= t('admin.settings.site_terms.title')
%p= t('admin.settings.site_terms.desc_html') %p= t('admin.settings.site_terms.desc_html')
%td= text_area_tag :site_terms, %td= text_area_tag :site_terms, @settings['site_terms'].value, rows: 8
@settings['site_terms'].value,
rows: 8
%tr %tr
%td %td
%strong= t('admin.settings.registrations.open.title') %strong= t('admin.settings.registrations.open.title')
%p= t('admin.settings.registrations.open.desc_html')
%td %td
= select_tag :open_registrations, = select_tag :open_registrations, options_for_select({ t('simple_form.no') => false, t('simple_form.yes') => true }, @settings['open_registrations'].value)
options_for_select({ t('admin.settings.registrations.open.disabled') => false, t('admin.settings.registrations.open.enabled') => true }, @settings['open_registrations'].value)
%tr %tr
%td %td
%strong= t('admin.settings.registrations.closed_message.title') %strong= t('admin.settings.registrations.closed_message.title')
%p= t('admin.settings.registrations.closed_message.desc_html') %p= t('admin.settings.registrations.closed_message.desc_html')
%td= text_area_tag :closed_registrations_message, %td= text_area_tag :closed_registrations_message, @settings['closed_registrations_message'].value, rows: 8
@settings['closed_registrations_message'].value, %tr
rows: 8 %td
%strong= t('admin.settings.registrations.deletion.title')
%p= t('admin.settings.registrations.deletion.desc_html')
%td
= select_tag :open_deletion, options_for_select({ t('simple_form.no') => false, t('simple_form.yes') => true }, @settings['open_deletion'].value)
%tr
%td
%strong= t('admin.settings.timeline_preview.title')
%p= t('admin.settings.timeline_preview.desc_html')
%td
= select_tag :timeline_preview, options_for_select({ t('simple_form.no') => false, t('simple_form.yes') => true }, @settings['timeline_preview'].value)
.simple_form.actions .simple_form.actions
= button_tag t('generic.save_changes'), type: :submit, class: :btn = button_tag t('generic.save_changes'), type: :submit, class: :btn

View File

@ -5,7 +5,10 @@
= render 'shared/error_messages', object: resource = render 'shared/error_messages', object: resource
= f.simple_fields_for :account do |ff| = f.simple_fields_for :account do |ff|
= ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') } .input-with-append
= ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
.append
= "@#{site_hostname}"
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
= f.input :password, autocomplete: 'off', placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password') } = f.input :password, autocomplete: 'off', placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password') }
@ -14,4 +17,5 @@
.actions .actions
= f.button :button, t('auth.register'), type: :submit = f.button :button, t('auth.register'), type: :submit
%p.hint.subtle-hint=t('auth.agreement_html', rules_path: about_more_path, terms_path: terms_path)
.form-footer= render 'auth/shared/links' .form-footer= render 'auth/shared/links'

View File

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

View File

@ -3,23 +3,12 @@ ar:
about: about:
about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية. about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
about_this: عن مثيل الخادوم هذا about_this: عن مثيل الخادوم هذا
apps: التطبيقات
business_email: 'البريد الإلكتروني المهني :' business_email: 'البريد الإلكتروني المهني :'
closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا. closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
contact: للتواصل معنا contact: للتواصل معنا
description_headline: ما هو %{domain}? description_headline: ما هو %{domain}?
domain_count_after: خوادم أخرى domain_count_after: خوادم أخرى
domain_count_before: متصل بـ domain_count_before: متصل بـ
features:
api: واجهة برمجة مفتوحة للتطبيقات والخدمات
blocks: نص منسق وأدوات كتم
characters: 500 حرف في كل رسالة
chronology: خيوط متسلسلة زمنيا
ethics: 'تصميم أخلاقي : لا إعلانات و لا تعقُّب'
gifv: مجموعات صور GIFV وأشرطة فيديو قصيرة
privacy: إعدادات مدققة لخصوصية كل منشور
public: الخيوط الزمنية العمومية
features_headline: ما الذي يجعل ماستدون فريدًا ؟
get_started: إبدأ الآن get_started: إبدأ الآن
links: الروابط links: الروابط
other_instances: خوادم أخرى other_instances: خوادم أخرى
@ -93,7 +82,7 @@ ar:
blocking: قائمة المحظورين blocking: قائمة المحظورين
following: قائمة المستخدمين المتبوعين following: قائمة المستخدمين المتبوعين
upload: تحميل upload: تحميل
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>. landing_strip_signup_html: If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
media_attachments: media_attachments:
validations: validations:

View File

@ -3,23 +3,12 @@ bg:
about: about:
about_mastodon: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>. about_mastodon: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
about_this: За тази инстанция about_this: За тази инстанция
apps: Приложения
business_email: 'Служебен e-mail:' business_email: 'Служебен e-mail:'
closed_registrations: В момента регистрациите за тази инстанция са затворени. closed_registrations: В момента регистрациите за тази инстанция са затворени.
contact: За контакти contact: За контакти
description_headline: Какво е %{domain}? description_headline: Какво е %{domain}?
domain_count_after: други инстанции domain_count_after: други инстанции
domain_count_before: Свързани към domain_count_before: Свързани към
features:
api: Отворено API за приложения и услуги
blocks: Богат на инструменти за блокиране и заглушаване
characters: Публикации от 500 символа
chronology: Публикациите се показват хронологично
ethics: 'Етичен дизайн: без реклами и проследяване'
gifv: GIFV комплекти и кратки видео клипове
privacy: Настройване на поверителността за всяка публикация
public: Публични канали
features_headline: Какво откроява Mastodon
get_started: Първи стъпки get_started: Първи стъпки
links: Връзки links: Връзки
other_instances: Други инстанции other_instances: Други инстанции
@ -93,7 +82,7 @@ bg:
blocking: Списък на блокираните blocking: Списък на блокираните
following: Списък на последователите following: Списък на последователите
upload: Качване upload: Качване
landing_strip_html: <strong>%{name}</strong> е потребител от %{link_to_root_path}. Можеш да ги следваш, или да контактуваш с тях, ако имаш акаунт където и да е из федерираната вселена на Mastodon. landing_strip_html: "<strong>%{name}</strong> е потребител от %{link_to_root_path}. Можеш да ги следваш, или да контактуваш с тях, ако имаш акаунт където и да е из федерираната вселена на Mastodon."
landing_strip_signup_html: Ако нямаш акаунт, можеш да си <a href="%{sign_up_path}">създадеш ето тук</a>. landing_strip_signup_html: Ако нямаш акаунт, можеш да си <a href="%{sign_up_path}">създадеш ето тук</a>.
media_attachments: media_attachments:
validations: validations:

View File

@ -3,23 +3,12 @@ ca:
about: 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: 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 about_this: Sobre aquesta instància
apps: Apps
business_email: 'Adreça de contacte:' business_email: 'Adreça de contacte:'
closed_registrations: Els registres estan actualment tancats en aquesta instància. closed_registrations: Els registres estan actualment tancats en aquesta instància.
contact: Contacte contact: Contacte
description_headline: Què es %{domain}? description_headline: Què es %{domain}?
domain_count_after: altres instàncies domain_count_after: altres instàncies
domain_count_before: Connectat a domain_count_before: Connectat a
features:
api: API pública per a aplicacions i serveis
blocks: Moderació de contingut
characters: 500 caràcters per publicació
chronology: Les histories son cronològiques
ethics: 'Disseny ètic: sense anuncis, sense rastrejos'
gifv: Vídeos curts i GIFV
privacy: Configuracions de privacitat ajustables
public: Història federada
features_headline: El que distingeix a Mastodon
get_started: Començar get_started: Començar
links: Vincles links: Vincles
other_instances: Altres instàncies other_instances: Altres instàncies
@ -173,8 +162,6 @@ ca:
desc_html: Apareix en la primera pàgina quan es tanquen els registres<br>Pot utilitzar etiquetes HTML desc_html: Apareix en la primera pàgina quan es tanquen els registres<br>Pot utilitzar etiquetes HTML
title: Missatge de registre tancat title: Missatge de registre tancat
open: open:
disabled: Desactivat
enabled: Activat
title: Registre obert title: Registre obert
setting: Ajust setting: Ajust
site_description: site_description:
@ -203,8 +190,8 @@ ca:
change_password: Canviar contrasenya change_password: Canviar contrasenya
delete_account: Esborrar el compte delete_account: Esborrar el compte
delete_account_html: Si vols esborrar el teu compte pots <a href="%{path}">fer-ho aquí</a>. S'et demanarà confirmació. delete_account_html: Si vols esborrar el teu compte pots <a href="%{path}">fer-ho aquí</a>. S'et demanarà confirmació.
didnt_get_confirmation: "No vas rebre el correu de confirmació?" didnt_get_confirmation: No vas rebre el correu de confirmació?
forgot_password: "Has oblidat la contrasenya?" forgot_password: Has oblidat la contrasenya?
login: Iniciar sessió login: Iniciar sessió
logout: Tancar sessió logout: Tancar sessió
register: Enregistrarse register: Enregistrarse

View File

@ -3,23 +3,12 @@ de:
about: 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: 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 about_this: Über diese Instanz
apps: Apps
business_email: 'Geschäftliche E-Mail:' business_email: 'Geschäftliche E-Mail:'
closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen. closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen.
contact: Kontakt contact: Kontakt
description_headline: Was ist %{domain}? description_headline: Was ist %{domain}?
domain_count_after: andere Instanzen domain_count_after: andere Instanzen
domain_count_before: Verbunden mit domain_count_before: Verbunden mit
features:
api: Offene API für Apps und Dienste
blocks: Mächtige Block- und Stummschaltungswerkzeuge
characters: 500 Zeichen pro Beitrag
chronology: Zeitleisten sind chronologisch
ethics: 'Ethisches Design: keine Werbung, kein Tracking'
gifv: GIFV-Sets und kurze Videos
privacy: Granulare Privatsphäre-Einstellungen für jeden Beitrag
public: Öffentliche Zeitleisten
features_headline: Was Mastodon einzigartig macht
get_started: Erste Schritte get_started: Erste Schritte
links: Links links: Links
other_instances: Andere Instanzen other_instances: Andere Instanzen
@ -147,8 +136,6 @@ de:
desc_html: Wird auf der Frontseite angezeigt, wenn die Registrierung geschlossen ist<br>Du kannst HTML-Tags benutzen desc_html: Wird auf der Frontseite angezeigt, wenn die Registrierung geschlossen ist<br>Du kannst HTML-Tags benutzen
title: Nachricht über geschlossene Registrierung title: Nachricht über geschlossene Registrierung
open: open:
disabled: Deaktiviert
enabled: Aktiviert
title: Offene Registrierung title: Offene Registrierung
setting: Einstellung setting: Einstellung
site_description: site_description:

View File

@ -1,28 +1,30 @@
--- ---
en: en:
about: about:
about_mastodon: Mastodon is a <em>free, open-source</em> social network. A <em>decentralized</em> alternative to commercial platforms, it avoids the risks of a single company monopolizing your communication. Pick a server that you trust &mdash; whichever you choose, you can interact with everyone else. Anyone can run their own Mastodon instance and participate in the <em>social network</em> seamlessly. 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 this instance about_this: About
apps: Apps
business_email: 'Business e-mail:' business_email: 'Business e-mail:'
closed_registrations: Registrations are currently closed on this instance. 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: Contact
description_headline: What is %{domain}? description_headline: What is %{domain}?
domain_count_after: other instances domain_count_after: other instances
domain_count_before: Connected to domain_count_before: Connected to
features: features:
api: Open API for apps and services humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media.
blocks: Rich block and muting tools humane_approach_title: A more humane approach
characters: 500 characters per post not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority.
chronology: Timelines are chronological not_a_product_title: Youre a person, not a product
ethics: 'Ethical design: no ads, no tracking' real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to.
gifv: GIFV sets and short videos real_conversation_title: Built for real conversation
privacy: Granular, per-post privacy settings within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere.
public: Public timelines within_reach_title: Always within reach
features_headline: What sets Mastodon apart find_another_instance: Find another instance
generic_description: "%{domain} is one server in the network"
get_started: Get started get_started: Get started
hosted_on: Mastodon hosted on %{domain}
learn_more: Learn more
links: Links links: Links
other_instances: Other instances other_instances: Instance list
source_code: Source code source_code: Source code
status_count_after: statuses status_count_after: statuses
status_count_before: Who authored status_count_before: Who authored
@ -30,6 +32,7 @@ en:
user_count_after: users user_count_after: users
user_count_before: Home to user_count_before: Home to
version: Version version: Version
what_is_mastodon: What is Mastodon?
accounts: accounts:
follow: Follow follow: Follow
followers: Followers followers: Followers
@ -173,9 +176,14 @@ en:
desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags
title: Closed registration message title: Closed registration message
open: open:
disabled: Disabled desc_html: Allow anyone to create an account
enabled: Enabled
title: Open registration title: Open registration
deletion:
desc_html: Allow anyone to delete their account
title: Open deletion
timeline_preview:
desc_html: Display public timeline on landing page
title: Timeline preview
setting: Setting setting: Setting
site_description: site_description:
desc_html: Displayed as a paragraph on the frontpage and used as a meta tag.<br>You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>. desc_html: Displayed as a paragraph on the frontpage and used as a meta tag.<br>You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
@ -185,7 +193,7 @@ en:
title: Extended site description title: Extended site description
site_terms: site_terms:
desc_html: Displayed on terms page<br>You can use HTML tags desc_html: Displayed on terms page<br>You can use HTML tags
title: Site Privacy Policy title: Privacy policy
site_title: Site title site_title: Site title
title: Site Settings title: Site Settings
subscriptions: subscriptions:
@ -207,6 +215,7 @@ en:
applications: applications:
invalid_url: The provided URL is invalid invalid_url: The provided URL is invalid
auth: auth:
agreement_html: By signing up you agree to <a href="%{rules_path}">our terms of service</a> and <a href="%{terms_path}">privacy policy</a>.
change_password: Security change_password: Security
delete_account: Delete account delete_account: Delete account
delete_account_html: If you wish to delete your account, you can <a href="%{path}">proceed here</a>. You will be asked for confirmation. delete_account_html: If you wish to delete your account, you can <a href="%{path}">proceed here</a>. You will be asked for confirmation.

View File

@ -3,22 +3,11 @@ eo:
about: 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: 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 about_this: Pri tiu aperaĵo
apps: Aplikaĵoj
business_email: 'Profesia retpoŝt-adreso:' business_email: 'Profesia retpoŝt-adreso:'
contact: Kontakti contact: Kontakti
description_headline: Kio estas %{domain}? description_headline: Kio estas %{domain}?
domain_count_after: aliaj aperaĵoj domain_count_after: aliaj aperaĵoj
domain_count_before: Konektita al domain_count_before: Konektita al
features:
api: Malfermita API por aplikaĵoj kaj servoj
blocks: Kompletaj iloj por bloki kaj kaŝi
characters: Po 500 signoj por ĉiu mesaĝo
chronology: Tempolinioj laŭtempaj
ethics: 'Etike kreita: neniu reklamo, neniu ŝpurado'
gifv: Eblo diskonigi etajn videojn kaj GIFV
privacy: Videbleco agordita laŭ la mesaĝo
public: Publikaj tempolinioj
features_headline: Kiel Mastodon estas malsimila
get_started: Komenci get_started: Komenci
links: Ligiloj links: Ligiloj
other_instances: Aliaj aperaĵoj other_instances: Aliaj aperaĵoj
@ -92,7 +81,7 @@ eo:
blocking: Listo de blokitoj blocking: Listo de blokitoj
following: Listo de sekvatoj following: Listo de sekvatoj
upload: Alporti upload: Alporti
landing_strip_html: <strong>%{name}</strong> estas uzanto en %{link_to_root_path}. Vi povas sekvi tiun aŭ interagi kun tiu, se vi havas konton ie ajn en la Fediverse. landing_strip_html: "<strong>%{name}</strong> estas uzanto en %{link_to_root_path}. Vi povas sekvi tiun aŭ interagi kun tiu, se vi havas konton ie ajn en la Fediverse."
landing_strip_signup_html: Se vi ne havas, vi povas <a href="%{sign_up_path}">membriĝi ĉi tie.</a>. landing_strip_signup_html: Se vi ne havas, vi povas <a href="%{sign_up_path}">membriĝi ĉi tie.</a>.
notification_mailer: notification_mailer:
digest: digest:
@ -105,19 +94,19 @@ eo:
one: "1 nova sciigo ekde via lasta vizito \U0001F418" one: "1 nova sciigo ekde via lasta vizito \U0001F418"
other: "%{count} novaj sciigoj ekde via lasta vizito \U0001F418" other: "%{count} novaj sciigoj ekde via lasta vizito \U0001F418"
favourite: favourite:
body: '%{name} favoris vian mesaĝon:' body: "%{name} favoris vian mesaĝon:"
subject: "%{name} favoris vian mesaĝon" subject: "%{name} favoris vian mesaĝon"
follow: follow:
body: "%{name} eksekvis vin:" body: "%{name} eksekvis vin:"
subject: "%{name} eksekvis vin" subject: "%{name} eksekvis vin"
follow_request: follow_request:
body: "%{name} petis sekvi vin:" body: "%{name} petis sekvi vin:"
subject: '%{name} petis sekvi vin' subject: "%{name} petis sekvi vin"
mention: mention:
body: '%{name} menciis vin en:' body: "%{name} menciis vin en:"
subject: '%{name} menciis vin' subject: "%{name} menciis vin"
reblog: reblog:
body: '%{name} diskonigis vian mesaĝon:' body: "%{name} diskonigis vian mesaĝon:"
subject: "%{name} diskonigis vian mesaĝon" subject: "%{name} diskonigis vian mesaĝon"
pagination: pagination:
next: Sekva next: Sekva

View File

@ -3,23 +3,12 @@ es:
about: 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: 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 about_this: Acerca de esta instancia
apps: Apps
business_email: 'Correo de negocios:' business_email: 'Correo de negocios:'
closed_registrations: Los registros están actualmente cerrados en esta instancia. closed_registrations: Los registros están actualmente cerrados en esta instancia.
contact: Contacto contact: Contacto
description_headline: "¿Qué es %{domain}?" description_headline: "¿Qué es %{domain}?"
domain_count_after: otras instancias domain_count_after: otras instancias
domain_count_before: Conectado a domain_count_before: Conectado a
features:
api: API pública para aplicaciones y servicios
blocks: Moderación de contenido
characters: 500 caracteres por publicación
chronology: Las historias son cronológicas
ethics: 'Diseño etico: sin anuncios, sin rastreos'
gifv: Videos cortos y GIFV
privacy: Configuraciones de privacidad ajustables
public: Historia federada
features_headline: Lo que distingue a Mastodon
get_started: Comenzar get_started: Comenzar
links: Enlaces links: Enlaces
other_instances: Otras instancias other_instances: Otras instancias
@ -93,7 +82,7 @@ es:
blocking: Lista de bloqueados blocking: Lista de bloqueados
following: Lista de seguidos following: Lista de seguidos
upload: Cargar upload: Cargar
landing_strip_html: <strong>%{name}</strong> es un usuario en %{link_to_root_path}. Puedes seguirlo(a) o interactuar con el o ella si tienes una cuenta en cualquier parte del fediverse. landing_strip_html: "<strong>%{name}</strong> es un usuario en %{link_to_root_path}. Puedes seguirlo(a) o interactuar con el o ella si tienes una cuenta en cualquier parte del fediverse."
landing_strip_signup_html: Si no tienes una, puedes <a href="%{sign_up_path}">registrar aquí</a>. landing_strip_signup_html: Si no tienes una, puedes <a href="%{sign_up_path}">registrar aquí</a>.
media_attachments: media_attachments:
validations: validations:

View File

@ -3,23 +3,12 @@ fa:
about: about:
about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود. about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکه‌های تجاری، که نمی‌گذارد ارتباط‌های شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید &mdash; هر سروری که باشد، همچنان می‌توانید با سرورهای دیگر ارتباط داشته باشید. هر کسی می‌تواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
about_this: دربارهٔ این سرور about_this: دربارهٔ این سرور
apps: برنامه‌ها
business_email: 'ایمیل کاری:' business_email: 'ایمیل کاری:'
closed_registrations: امکان ثبت نام روی این سرور هم‌اینک فعال نیست. closed_registrations: امکان ثبت نام روی این سرور هم‌اینک فعال نیست.
contact: تماس contact: تماس
description_headline: "%{domain} چیست؟" description_headline: "%{domain} چیست؟"
domain_count_after: سرور دیگر domain_count_after: سرور دیگر
domain_count_before: متصل به domain_count_before: متصل به
features:
api: رابط برنامه‌نویسی برای برنامه‌ها و سرویس‌های دیگر
blocks: ابزارهای قدرتمند برای مسدود یا بی‌صدا کردن دیگران
characters: ۵۰۰ حرف برای هر نوشته
chronology: نمایش نوشته‌های دیگران به ترتیب زمانی
ethics: 'اخلاق‌مدار: بدون تبلیغات، بدون ردگیری'
gifv: تصاویر متحرک و ویدیوهای کوتاه
privacy: تنظیمات حریم خصوصی جداگانه برای هر نوشته
public: نمایش نوشته‌های عمومی دیگران از همه‌جا
features_headline: برگ‌های برندهٔ ماستدون
get_started: آغاز کنید get_started: آغاز کنید
links: پیوندها links: پیوندها
other_instances: سرورهای دیگر other_instances: سرورهای دیگر
@ -159,8 +148,6 @@ fa:
desc_html: وقتی امکان ثبت نام روی سرور فعال نباشد در صفحهٔ اصلی نمایش می‌یابد<br>می‌توانید HTML بنویسید desc_html: وقتی امکان ثبت نام روی سرور فعال نباشد در صفحهٔ اصلی نمایش می‌یابد<br>می‌توانید HTML بنویسید
title: پیغام برای فعال‌نبودن ثبت نام title: پیغام برای فعال‌نبودن ثبت نام
open: open:
disabled: غیرفعال
enabled: فعال
title: امکان ثبت نام title: امکان ثبت نام
setting: تنظیمات setting: تنظیمات
site_description: site_description:

View File

@ -3,22 +3,11 @@ fi:
about: 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: 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 about_this: Tietoja tästä palvelimesta
apps: Ohjelmat
business_email: 'Business e-mail:' business_email: 'Business e-mail:'
contact: Ota yhteyttä contact: Ota yhteyttä
description_headline: Mikä on %{domain}? description_headline: Mikä on %{domain}?
domain_count_after: muuhun palvelimeen domain_count_after: muuhun palvelimeen
domain_count_before: Yhdistyneenä domain_count_before: Yhdistyneenä
features:
api: Avoin API ohjelmille ja palveluille
blocks: Rikkaat esto- ja hiljennystyökalut
characters: 500 kirjainta per viesti
chronology: Aikajana on kronologisessa järjestyksessä
ethics: 'Eettinen suunnittelu: ei mainoksia, ei seurantaa'
gifv: GIFV settejä ja lyhyitä videoita
privacy: Julkaisukohtainen yksityisyysasetus
public: Julkiset aikajanat
features_headline: Mikä erottaa Mastodonin muista
get_started: Aloita käyttö get_started: Aloita käyttö
links: Linkit links: Linkit
other_instances: Muut palvelimet other_instances: Muut palvelimet
@ -92,7 +81,7 @@ fi:
blocking: Estetyt lista blocking: Estetyt lista
following: Seuratut lista following: Seuratut lista
upload: Lähetä upload: Lähetä
landing_strip_html: <strong>%{name}</strong> on käyttäjä domainilla %{link_to_root_path}. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa. landing_strip_html: "<strong>%{name}</strong> on käyttäjä domainilla %{link_to_root_path}. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa."
landing_strip_signup_html: Jos sinulla ei ole tiliä, voit <a href="%{sign_up_path}">rekisteröityä täällä</a>. landing_strip_signup_html: Jos sinulla ei ole tiliä, voit <a href="%{sign_up_path}">rekisteröityä täällä</a>.
notification_mailer: notification_mailer:
digest: digest:

View File

@ -3,23 +3,12 @@ fr:
about: about:
about_mastodon: Mastodon est un serveur <em>libre</em> de réseautage social. Alternative <em>décentralisée</em> aux plateformes commerciales, la monopolisation de vos communications par une entreprise unique est évitée. Tout un chacun peut faire tourner Mastodon et participer au <em>réseau social</em> de manière transparente. about_mastodon: Mastodon est un serveur <em>libre</em> de réseautage social. Alternative <em>décentralisée</em> aux plateformes commerciales, la monopolisation de vos communications par une entreprise unique est évitée. Tout un chacun peut faire tourner Mastodon et participer au <em>réseau social</em> de manière transparente.
about_this: À propos de cette instance about_this: À propos de cette instance
apps: Applications
business_email: Courriel professionnel business_email: Courriel professionnel
closed_registrations: Les inscriptions sont actuellement fermées sur cette instance. closed_registrations: Les inscriptions sont actuellement fermées sur cette instance.
contact: Contact contact: Contact
description_headline: Quest-ce que %{domain}? description_headline: Quest-ce que %{domain}?
domain_count_after: autres instances domain_count_after: autres instances
domain_count_before: Connectés à domain_count_before: Connectés à
features:
api: API ouverte aux apps et services
blocks: Outils complets de bloquage et masquage
characters: 500 caractères par post
chronology: Fil chronologique
ethics: Pas de pubs, pas de pistage
gifv: Partage de vidéos et de GIFs
privacy: Réglages de confidentialité au niveau des posts
public: Fils publics
features_headline: Ce qui rend Mastodon différent
get_started: Rejoindre le réseau get_started: Rejoindre le réseau
links: Liens links: Liens
other_instances: Autres instances other_instances: Autres instances
@ -48,7 +37,7 @@ fr:
create: create:
name: "%{account_name} a créé une note." name: "%{account_name} a créé une note."
outbox: outbox:
name: "Boîte denvoi de %{account_name}" name: Boîte denvoi de %{account_name}
summary: Liste dactivités de %{account_name} summary: Liste dactivités de %{account_name}
admin: admin:
accounts: accounts:
@ -173,8 +162,6 @@ fr:
desc_html: Affiché sur la page daccueil lorsque les inscriptions sont fermées<br>Vous pouvez utiliser des balises HTML desc_html: Affiché sur la page daccueil lorsque les inscriptions sont fermées<br>Vous pouvez utiliser des balises HTML
title: Message de fermeture des inscriptions title: Message de fermeture des inscriptions
open: open:
disabled: Désactivées
enabled: Activées
title: Inscriptions title: Inscriptions
setting: Paramètre setting: Paramètre
site_description: site_description:

View File

@ -3,23 +3,12 @@ he:
about: about:
about_mastodon: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק. about_mastodon: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
about_this: אודות שרת זה about_this: אודות שרת זה
apps: ישומים
business_email: 'דוא"ל עסקי:' business_email: 'דוא"ל עסקי:'
closed_registrations: הרשמות סגורות לשרת זה לעת עתה. closed_registrations: הרשמות סגורות לשרת זה לעת עתה.
contact: צור קשר contact: צור קשר
description_headline: מהו %{domain}? description_headline: מהו %{domain}?
domain_count_after: שרתים אחרים domain_count_after: שרתים אחרים
domain_count_before: מחובר אל domain_count_before: מחובר אל
features:
api: API פתוח לישומים ושירותים
blocks: כלי חסימה והשתקה חזקים
characters: 500 תווים להודעה
chronology: הטורים כרונולוגיים
ethics: 'תכנון מוסרי: אין פרסומות, אין מעקב'
gifv: GIFV וסרטונים קצרים
privacy: אפשרויות פרטיוּת נפרדות לכל הודעה
public: טורים פומביים
features_headline: מה מייחד קהילות מבוססות מסטודון
get_started: בואו נתחיל get_started: בואו נתחיל
links: קישורים links: קישורים
other_instances: שרתים אחרים other_instances: שרתים אחרים
@ -167,8 +156,6 @@ he:
desc_html: מוצג על הדף הראשי כאשר ההרשמות סגורות<br>ניתן להשתמש בתגיות HTML desc_html: מוצג על הדף הראשי כאשר ההרשמות סגורות<br>ניתן להשתמש בתגיות HTML
title: מסר סגירת הרשמות title: מסר סגירת הרשמות
open: open:
disabled: מבוטל
enabled: מופעל
title: הרשמה פתוחה title: הרשמה פתוחה
setting: הגדרה setting: הגדרה
site_description: site_description:

View File

@ -3,23 +3,12 @@ hr:
about: 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: 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 about_this: O ovoj instanci
apps: Aplikacije
business_email: 'Poslovni e-mail:' business_email: 'Poslovni e-mail:'
closed_registrations: Registracije na ovoj instanci su trenutno zatvorene. closed_registrations: Registracije na ovoj instanci su trenutno zatvorene.
contact: Kontakt contact: Kontakt
description_headline: Što je %{domain}? description_headline: Što je %{domain}?
domain_count_after: druge instance domain_count_after: druge instance
domain_count_before: Spojen na domain_count_before: Spojen na
features:
api: Otvoren API za aplikacije i servise
blocks: Bogati alati za blokiranje i ušutkivanje
characters: 500 znakova po postu
chronology: Timelines su kronološke
ethics: 'Etički dizajn: bez oglasa, bez praćenja'
gifv: GIFV setovi i kratki videi
privacy: Granularne postavke privatnosti, po postu
public: Javne timelines
features_headline: Po čemu se Mastodon razlikuje
get_started: Započni get_started: Započni
links: Linkovi links: Linkovi
other_instances: Druge instance other_instances: Druge instance
@ -94,7 +83,7 @@ hr:
following: Lista onih koje slijedim following: Lista onih koje slijedim
muting: Lista utišanih muting: Lista utišanih
upload: Upload upload: Upload
landing_strip_html: <strong>%{name}</strong> je korisnik na %{link_to_root_path}. Možeš ih slijediti ili komunicirati s njima ako imaš račun igdje u fediversu. landing_strip_html: "<strong>%{name}</strong> je korisnik na %{link_to_root_path}. Možeš ih slijediti ili komunicirati s njima ako imaš račun igdje u fediversu."
landing_strip_signup_html: Ako nemaš, možeš se <a href="%{sign_up_path}">registrirati ovdje</a>. landing_strip_signup_html: Ako nemaš, možeš se <a href="%{sign_up_path}">registrirati ovdje</a>.
notification_mailer: notification_mailer:
digest: digest:

View File

@ -3,23 +3,12 @@ id:
about: 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: 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 about_this: Tentang server ini
apps: Apl
business_email: 'E-mail bisnis:' business_email: 'E-mail bisnis:'
closed_registrations: Pendaftaran untuk server ini sedang ditutup. closed_registrations: Pendaftaran untuk server ini sedang ditutup.
contact: Kontak contact: Kontak
description_headline: Apa itu %{domain}? description_headline: Apa itu %{domain}?
domain_count_after: server lain domain_count_after: server lain
domain_count_before: Terhubung dengan domain_count_before: Terhubung dengan
features:
api: API terbuka untuk aplikasi dan layanan lain
blocks: Aneka ragam fitur blokir dan pembisuan
characters: 500 karakter per posting
chronology: Linimasa berurutan
ethics: 'Desain etis: tanpa iklan, tidak ada pelacakan'
gifv: Fitur GIFV dan video pendek
privacy: Terperinci, pengaturan privasi per postingan
public: Linimasa publik
features_headline: Yang berbeda dari Mastodon
get_started: Mulai get_started: Mulai
links: Link links: Link
other_instances: Server lain other_instances: Server lain
@ -158,8 +147,6 @@ id:
desc_html: Ditampilkan pada halaman depan saat pendaftaran ditutup<br>Anda bisa menggunakan tag HTML desc_html: Ditampilkan pada halaman depan saat pendaftaran ditutup<br>Anda bisa menggunakan tag HTML
title: Pesan penutupan pendaftaran title: Pesan penutupan pendaftaran
open: open:
disabled: Dinonaktifkan
enabled: Diaktifkan
title: Pendaftaran terbuka title: Pendaftaran terbuka
setting: Pengaturan setting: Pengaturan
site_description: site_description:

View File

@ -3,23 +3,12 @@ io:
about: 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: 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 about_this: Pri ta instaluro
apps: Apliki
business_email: 'Profesionala retpost-adreso:' business_email: 'Profesionala retpost-adreso:'
closed_registrations: Membresko ne nun esas posible en ta instaluro. closed_registrations: Membresko ne nun esas posible en ta instaluro.
contact: Kontaktar contact: Kontaktar
description_headline: Quo esas %{domain}? description_headline: Quo esas %{domain}?
domain_count_after: altra instaluri domain_count_after: altra instaluri
domain_count_before: Konektita ad domain_count_before: Konektita ad
features:
api: Apertita API por apliki e servadi
blocks: Kompleta utensili por blokusar e celar
characters: Til 500 signi por singla mesajo
chronology: Tempolinei seguntempa
ethics: 'Etike kreita: nula anunco, nula trakado'
gifv: Posibleso diskononigar mikra videi e GIFV
privacy: Videbleso ajustita segun la mesajo
public: Publika tempolinei
features_headline: Quale Mastodon esas diferanta
get_started: Komencar get_started: Komencar
links: Ligili links: Ligili
other_instances: Altra instaluri other_instances: Altra instaluri
@ -146,8 +135,6 @@ io:
desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags
title: Closed registration message title: Closed registration message
open: open:
disabled: Disabled
enabled: Enabled
title: Open registration title: Open registration
setting: Setting setting: Setting
site_description: site_description:

View File

@ -3,23 +3,12 @@ it:
about: 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: 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 about_this: A proposito di questo server
apps: Applicazioni
business_email: 'Email di lavoro:' business_email: 'Email di lavoro:'
closed_registrations: Al momento le iscrizioni a questo server sono chiuse. closed_registrations: Al momento le iscrizioni a questo server sono chiuse.
contact: Contatti contact: Contatti
description_headline: Cos'è %{domain}? description_headline: Cos'è %{domain}?
domain_count_after: altri server domain_count_after: altri server
domain_count_before: Connesso a domain_count_before: Connesso a
features:
api: API aperto per applicazioni e servizi
blocks: Potenti strumenti di blocco e silenziamento
characters: 500 caratteri per status
chronology: Le timeline sono cronologiche
ethics: 'Design etico: niente pubblicità, niente tracking'
gifv: Set di GIFV e brevi video
privacy: Opzioni di privacy mirate per-post
public: Timeline pubbliche
features_headline: Cosa rende Mastodon migliore
get_started: Inizia get_started: Inizia
links: Links links: Links
other_instances: Altri server other_instances: Altri server
@ -93,7 +82,7 @@ it:
blocking: Lista dei bloccati blocking: Lista dei bloccati
following: Lista dei seguaci following: Lista dei seguaci
upload: Carica upload: Carica
landing_strip_html: <strong>%{name}</strong> è un utente su %{link_to_root_path}. Puoi seguirlo o interagire con lui se possiedi un account ovunque nel fediverse. landing_strip_html: "<strong>%{name}</strong> è un utente su %{link_to_root_path}. Puoi seguirlo o interagire con lui se possiedi un account ovunque nel fediverse."
landing_strip_signup_html: Se non possiedi un account, puoi <a href="%{sign_up_path}">iscriverti qui</a>. landing_strip_signup_html: Se non possiedi un account, puoi <a href="%{sign_up_path}">iscriverti qui</a>.
media_attachments: media_attachments:
validations: validations:

View File

@ -3,23 +3,12 @@ ja:
about: about:
about_mastodon: Mastodon は<em>自由でオープンソース</em>なソーシャルネットワークです。商用プラットフォームの代替となる<em>分散型</em>を採用し、あなたのやりとりが一つの会社によって独占されるのを防ぎます。信頼できるインスタンスを選択してください &mdash; どのインスタンスを選んでも、誰とでもやりとりすることができます。 だれでも自分の Mastodon インスタンスを作ることができ、シームレスに<em>ソーシャルネットワーク</em>に参加できます。 about_mastodon: Mastodon は<em>自由でオープンソース</em>なソーシャルネットワークです。商用プラットフォームの代替となる<em>分散型</em>を採用し、あなたのやりとりが一つの会社によって独占されるのを防ぎます。信頼できるインスタンスを選択してください &mdash; どのインスタンスを選んでも、誰とでもやりとりすることができます。 だれでも自分の Mastodon インスタンスを作ることができ、シームレスに<em>ソーシャルネットワーク</em>に参加できます。
about_this: このインスタンスについて about_this: このインスタンスについて
apps: アプリ
business_email: 'ビジネスメールアドレス:' business_email: 'ビジネスメールアドレス:'
closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。 closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。
contact: 連絡先 contact: 連絡先
description_headline: "%{domain} とは?" description_headline: "%{domain} とは?"
domain_count_after: 個のインスタンス domain_count_after: 個のインスタンス
domain_count_before: 接続中 domain_count_before: 接続中
features:
api: アプリやその他サービスにAPIを公開
blocks: 豊富なブロックやミュート機能
characters: 1つの投稿は500文字まで利用可能
chronology: 時系列順のタイムライン
ethics: 広告もトラッキングもありません
gifv: GIFVや短い動画にも対応
privacy: 投稿ごとに公開範囲を細かく設定可能
public: 公開タイムライン
features_headline: Mastodon の特徴
get_started: 参加する get_started: 参加する
links: リンク links: リンク
other_instances: 他のインスタンス other_instances: 他のインスタンス
@ -173,8 +162,6 @@ ja:
desc_html: 新規登録を停止しているときにフロントページに表示されます。<br>HTMLタグが利用可能です。 desc_html: 新規登録を停止しているときにフロントページに表示されます。<br>HTMLタグが利用可能です。
title: 新規登録停止時のメッセージ title: 新規登録停止時のメッセージ
open: open:
disabled: 無効
enabled: 有効
title: 新規登録を受け付ける title: 新規登録を受け付ける
setting: 設定 setting: 設定
site_description: site_description:

View File

@ -3,23 +3,12 @@ ko:
about: about:
about_mastodon: Mastodon 은<em>자유로운 오픈 소스</em>소셜 네트워크입니다. 상용 플랫폼의 대체로써 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 &mdash; 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 <em>소셜 네트워크</em>에 참가할 수 있습니다. about_mastodon: Mastodon 은<em>자유로운 오픈 소스</em>소셜 네트워크입니다. 상용 플랫폼의 대체로써 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 &mdash; 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 <em>소셜 네트워크</em>에 참가할 수 있습니다.
about_this: 이 인스턴스에 대해서 about_this: 이 인스턴스에 대해서
apps: 어플리케이션
business_email: '비즈니스 메일 주소:' business_email: '비즈니스 메일 주소:'
closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다. closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다.
contact: 연락처 contact: 연락처
description_headline: "%{domain} 는 무엇인가요?" description_headline: "%{domain} 는 무엇인가요?"
domain_count_after: 개의 인스턴스 domain_count_after: 개의 인스턴스
domain_count_before: 연결됨 domain_count_before: 연결됨
features:
api: 어플리케이션이나 그 외 서비스에 API를 공개
blocks: 강력한 차단 및 뮤트 기능
characters: 한번에 500자까지 포스팅 가능
chronology: 시간 순서의 타임라인
ethics: 광고도 트래킹도 없습니다
gifv: GIFV나 짧은 동영상도 지원
privacy: 각 포스팅마다 공개 범위를 상세히 설정 가능
public: 공개 타임라인
features_headline: Mastodon 의 특징
get_started: 참가하기 get_started: 참가하기
links: 링크 links: 링크
other_instances: 다른 인스턴스 other_instances: 다른 인스턴스
@ -151,7 +140,7 @@ ko:
nsfw: nsfw:
'false': NSFW 꺼짐 'false': NSFW 꺼짐
'true': NSFW 켜짐 'true': NSFW 켜짐
report: "신고 #%{id}" report: '신고 #%{id}'
report_contents: 내용 report_contents: 내용
reported_account: 신고 대상 계정 reported_account: 신고 대상 계정
reported_by: 신고자 reported_by: 신고자
@ -173,8 +162,6 @@ ko:
desc_html: 신규 등록을 받지 않을 때 프론트 페이지에 표시됩니다. <br>HTML 태그를 사용할 수 있습니다. desc_html: 신규 등록을 받지 않을 때 프론트 페이지에 표시됩니다. <br>HTML 태그를 사용할 수 있습니다.
title: 신규 등록 정지 시 메시지 title: 신규 등록 정지 시 메시지
open: open:
disabled: 꺼짐
enabled: 켜짐
title: 신규 등록을 받음 title: 신규 등록을 받음
setting: 설정 setting: 설정
site_description: site_description:
@ -301,7 +288,7 @@ ko:
one: "1건의 새로운 알림 \U0001F418" one: "1건의 새로운 알림 \U0001F418"
other: "%{count}건의 새로운 알림 \U0001F418" other: "%{count}건의 새로운 알림 \U0001F418"
favourite: favourite:
body: '%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다.' body: "%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다."
subject: "%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다" subject: "%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다"
follow: follow:
body: "%{name} 님이 나를 팔로우 했습니다" body: "%{name} 님이 나를 팔로우 했습니다"
@ -323,7 +310,7 @@ ko:
acct: 아이디@도메인을 입력해 주십시오 acct: 아이디@도메인을 입력해 주십시오
missing_resource: 리디렉션 대상을 찾을 수 없습니다 missing_resource: 리디렉션 대상을 찾을 수 없습니다
proceed: 팔로우 하기 proceed: 팔로우 하기
prompt: '팔로우 하려 하고 있습니다' prompt: 팔로우 하려 하고 있습니다
sessions: sessions:
activity: 마지막 활동 activity: 마지막 활동
browser: 브라우저 browser: 브라우저

View File

@ -3,23 +3,12 @@ nl:
about: about:
about_mastodon: Mastodon is een <em>vrij, gratis en open-source</em> sociaal netwerk. Een <em>gedecentraliseerd</em> alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt &mdash; welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het <em>sociale netwerk</em>. about_mastodon: Mastodon is een <em>vrij, gratis en open-source</em> sociaal netwerk. Een <em>gedecentraliseerd</em> alternatief voor commerciële platforms. Het voorkomt de risico's van een enkel bedrijf dat jouw communicatie monopoliseert. Kies een server die je vertrouwt &mdash; welke je ook kiest, je kunt met elke andere server communiceren. Iedereen kan een eigen Mastodon-server draaien en naadloos deelnemen in het <em>sociale netwerk</em>.
about_this: Over deze server about_this: Over deze server
apps: Apps
business_email: 'E-mailadres:' business_email: 'E-mailadres:'
closed_registrations: Registreren op deze server is momenteel uitgeschakeld. closed_registrations: Registreren op deze server is momenteel uitgeschakeld.
contact: Contact contact: Contact
description_headline: Wat is %{domain}? description_headline: Wat is %{domain}?
domain_count_after: andere servers domain_count_after: andere servers
domain_count_before: Verbonden met domain_count_before: Verbonden met
features:
api: Open API voor apps en diensten
blocks: Uitgebreide blokkeer- en negeerhulpmiddelen
characters: 500 tekens per bericht
chronology: Tijdlijnen zijn chronologisch
ethics: 'Ethisch design: geen advertenties, geen spionage'
gifv: GIFV-sets en korte video's
privacy: Nauwkeurige privacyinstellingen per toot (bericht)
public: Openbare tijdlijnen
features_headline: Wat maakt Mastodon anders
get_started: Beginnen get_started: Beginnen
links: Links links: Links
other_instances: Andere servers other_instances: Andere servers
@ -73,8 +62,6 @@ nl:
desc_html: Wordt op de voorpagina weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld<br>En ook hier kan je HTML gebruiken desc_html: Wordt op de voorpagina weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld<br>En ook hier kan je HTML gebruiken
title: Bericht wanneer registratie is uitgeschakeld title: Bericht wanneer registratie is uitgeschakeld
open: open:
disabled: Uitgeschakeld
enabled: Ingeschakeld
title: Open registratie title: Open registratie
setting: Instelling setting: Instelling
site_description: site_description:
@ -177,7 +164,7 @@ nl:
following: Volglijst following: Volglijst
muting: Negeerlijst muting: Negeerlijst
upload: Uploaden upload: Uploaden
landing_strip_html: <strong>%{name}</strong> is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt. landing_strip_html: "<strong>%{name}</strong> is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je ergens in deze fediverse een account hebt."
landing_strip_signup_html: Als je dat niet hebt, kun je je <a href="%{sign_up_path}">hier registreren</a>. landing_strip_signup_html: Als je dat niet hebt, kun je je <a href="%{sign_up_path}">hier registreren</a>.
notification_mailer: notification_mailer:
digest: digest:
@ -286,7 +273,7 @@ nl:
generate_recovery_codes: Herstelcodes genereren generate_recovery_codes: Herstelcodes genereren
instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het aanmelden moet invoeren." instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het aanmelden moet invoeren."
lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig. lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig.
manual_instructions: 'Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.' manual_instructions: Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren.
recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd
recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.) recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.)
setup: Instellen setup: Instellen

View File

@ -3,23 +3,12 @@
about: about:
about_mastodon: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket. about_mastodon: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
about_this: Om denne instansen about_this: Om denne instansen
apps: Applikasjoner
business_email: 'Bedriftsepost:' business_email: 'Bedriftsepost:'
closed_registrations: Registreringer er for øyeblikket lukket på denne instansen. closed_registrations: Registreringer er for øyeblikket lukket på denne instansen.
contact: Kontakt contact: Kontakt
description_headline: Hva er %{domain}? description_headline: Hva er %{domain}?
domain_count_after: andre instanser domain_count_after: andre instanser
domain_count_before: Koblet til domain_count_before: Koblet til
features:
api: Åpent API for applikasjoner og tjenester
blocks: Rikholdige blokkeringsverktøy
characters: 500 tegn per status
chronology: Tidslinjer er kronologiske
ethics: 'Etisk design: Ingen reklame, ingen sporing'
gifv: Støtte for GIFV og korte videoer
privacy: Finmaskede personvernsinnstillinger
public: Felles tidslinjer
features_headline: Hva skiller Mastodon fra andre sosiale nettverk
get_started: Kom i gang get_started: Kom i gang
links: Lenker links: Lenker
other_instances: Andre instanser other_instances: Andre instanser
@ -160,8 +149,6 @@
desc_html: Vises på forsiden når registreringer er lukket<br>Du kan bruke HTML-tagger desc_html: Vises på forsiden når registreringer er lukket<br>Du kan bruke HTML-tagger
title: Melding for lukket registrering title: Melding for lukket registrering
open: open:
disabled:
enabled: Av
title: Åpen registrering title: Åpen registrering
setting: Innstilling setting: Innstilling
site_description: site_description:

View File

@ -3,23 +3,12 @@ oc:
about: about:
about_mastodon: Mastodon es un malhum social <em>liure e open-source</em>. Una alternativa <em>decentralizada</em> a las platformas comercialas, aquò evita quuna sola companiá monopolize vòstra comunicacion. Causissètz une servidor que vos fisatz, quina que siague vòstra causida, podètz interagir amb tot lo mond. Qual que siague pòt aver son instància Mastodon e participar al <em>malhum social</em> sens cap de problèmas. about_mastodon: Mastodon es un malhum social <em>liure e open-source</em>. Una alternativa <em>decentralizada</em> a las platformas comercialas, aquò evita quuna sola companiá monopolize vòstra comunicacion. Causissètz une servidor que vos fisatz, quina que siague vòstra causida, podètz interagir amb tot lo mond. Qual que siague pòt aver son instància Mastodon e participar al <em>malhum social</em> sens cap de problèmas.
about_this: A prepaus daquesta instància about_this: A prepaus daquesta instància
apps: Aplicacions
business_email: 'Corrièl professional :' business_email: 'Corrièl professional :'
closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància. closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància.
contact: Contacte contact: Contacte
description_headline: Qué es %{domain} ? description_headline: Qué es %{domain} ?
domain_count_after: autras instàncias domain_count_after: autras instàncias
domain_count_before: Connectat a domain_count_before: Connectat a
features:
api: API dubèrta per las aplicacions e servicis
blocks: Aisinas complètas per blocar e rescondre
characters: 500 caractèrs per publicacion
chronology: Flux dactualitat cronologic
ethics: 'Ethical design: pas cap de reclama o traçador'
gifv: Partatge de GIFs e vidèos cortas
privacy: Nivèl de confidencialitat configurable per cada publicacion
public: Fluxes dactualitat publics
features_headline: Çò que fa que Mastodon es diferent
get_started: Venètz al malhum get_started: Venètz al malhum
links: Ligams links: Ligams
other_instances: Autras instàncias other_instances: Autras instàncias
@ -167,8 +156,6 @@ oc:
desc_html: Afichat sus las pagina dacuèlh quand las inscripcions son tampadas.<br>Podètz utilizar de balisas HTML desc_html: Afichat sus las pagina dacuèlh quand las inscripcions son tampadas.<br>Podètz utilizar de balisas HTML
title: Messatge de barradura de las inscripcions title: Messatge de barradura de las inscripcions
open: open:
disabled: Desactivadas
enabled: Activadas
title: Inscripcions title: Inscripcions
setting: Paramètre setting: Paramètre
site_description: site_description:

View File

@ -3,23 +3,12 @@ pl:
about: about:
about_mastodon: Mastodon jest <em>wolną i otwartą</em> siecią społecznościową, <em>zdecentralizowaną</em> alternatywą dla zamkniętych, komercyjnych platform. Pozwala uniknąć ryzyka monopolizacji Twojej komunikacji przez jedną korporację. Wybierz serwer, któremu ufasz &mdash; nie ograniczy to Twoich możliwości komunikacji z innymi osobami w sieci. Każdy może też uruchomić własną instancję Mastodona i dołączyć do reszty tej <em>sieci społecznościowej</em>. about_mastodon: Mastodon jest <em>wolną i otwartą</em> siecią społecznościową, <em>zdecentralizowaną</em> alternatywą dla zamkniętych, komercyjnych platform. Pozwala uniknąć ryzyka monopolizacji Twojej komunikacji przez jedną korporację. Wybierz serwer, któremu ufasz &mdash; nie ograniczy to Twoich możliwości komunikacji z innymi osobami w sieci. Każdy może też uruchomić własną instancję Mastodona i dołączyć do reszty tej <em>sieci społecznościowej</em>.
about_this: O tej instancji about_this: O tej instancji
apps: Aplikacje
business_email: 'Służbowy adres e-mail:' business_email: 'Służbowy adres e-mail:'
closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta.
contact: Kontakt contact: Kontakt
description_headline: Czym jest %{domain}? description_headline: Czym jest %{domain}?
domain_count_after: instancji domain_count_after: instancji
domain_count_before: Serwer połączony z domain_count_before: Serwer połączony z
features:
api: Otwarte API dla aplikacji i usług
blocks: Rozbudowane narzędzia blokowania i ukrywania
characters: 500 znaków na wpis
chronology: Chronologiczny porządek wyświetlania
ethics: 'Etyczne założenia: nie śledzimy, bez reklam'
gifv: obsługa GIFV i krótkich wideo
privacy: Precyzyjne ustawienia widoczności poszczególnych postów
public: Publiczne osie czasu
features_headline: Co wyróżnia Mastodona
get_started: Rozpocznijmy! get_started: Rozpocznijmy!
links: Odnośniki links: Odnośniki
other_instances: Inne instancje other_instances: Inne instancje
@ -48,7 +37,7 @@ pl:
create: create:
name: "%{account_name} utworzył(a) wpis." name: "%{account_name} utworzył(a) wpis."
outbox: outbox:
name: "Skrzynka %{account_name}" name: Skrzynka %{account_name}
summary: Zbiór aktywności użytkownika %{account_name}. summary: Zbiór aktywności użytkownika %{account_name}.
admin: admin:
accounts: accounts:
@ -173,8 +162,6 @@ pl:
desc_html: Wyświetlana na stronie głównej, gdy możliwość otwarej rejestracji<br>nie jest dostępna. Możesz korzystać z tagów HTML desc_html: Wyświetlana na stronie głównej, gdy możliwość otwarej rejestracji<br>nie jest dostępna. Możesz korzystać z tagów HTML
title: Wiadomość o nieaktywnej rejestracji title: Wiadomość o nieaktywnej rejestracji
open: open:
disabled: Nieaktywna
enabled: Aktywna
title: Otwarta rejestracja title: Otwarta rejestracja
setting: Ustawienie setting: Ustawienie
site_description: site_description:
@ -198,7 +185,7 @@ pl:
title: Administracja title: Administracja
admin_mailer: admin_mailer:
new_report: new_report:
body: "Użytkownik %{reporter} zgłosił %{target}" body: Użytkownik %{reporter} zgłosił %{target}
subject: Nowe zgłoszenie na %{instance} (#%{id}) subject: Nowe zgłoszenie na %{instance} (#%{id})
application_mailer: application_mailer:
settings: 'Zmień ustawienia powiadamiania: %{link}' settings: 'Zmień ustawienia powiadamiania: %{link}'
@ -469,7 +456,7 @@ pl:
<p>Dokument jest dostępny na licencji CC-BY-SA. Ostatnio modyfikowany 31 maja 2013, przetłumaczony 4 lipca 2017. Tłumaczenie (mimo dołożenia wszelkich starań) może nie być w pełni poprawne.</p> <p>Dokument jest dostępny na licencji CC-BY-SA. Ostatnio modyfikowany 31 maja 2013, przetłumaczony 4 lipca 2017. Tłumaczenie (mimo dołożenia wszelkich starań) może nie być w pełni poprawne.</p>
<p>Tekst bazuje na <a href="https://github.com/discourse/discourse">polityce prywatności Discourse</a>. <p>Tekst bazuje na <a href="https://github.com/discourse/discourse">polityce prywatności Discourse</a>.
title: "Zasady korzystania i polityka prywatności %{instance}" title: Zasady korzystania i polityka prywatności %{instance}
time: time:
formats: formats:
default: "%b %d, %Y, %H:%M" default: "%b %d, %Y, %H:%M"

View File

@ -3,23 +3,12 @@ pt-BR:
about: about:
about_mastodon: Mastodon é um servidor de rede social <em>grátis, e open-source</em>. Uma alternativa <em>descentralizada</em> ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie &mdash; qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na <em>rede social federada</em> sem problemas. about_mastodon: Mastodon é um servidor de rede social <em>grátis, e open-source</em>. Uma alternativa <em>descentralizada</em> ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie &mdash; qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na <em>rede social federada</em> sem problemas.
about_this: Sobre essa instância about_this: Sobre essa instância
apps: Aplicações
business_email: 'Email comercial:' business_email: 'Email comercial:'
closed_registrations: Registros estão fechadas para essa instância. closed_registrations: Registros estão fechadas para essa instância.
contact: Contato contact: Contato
description_headline: O que é %{domain}? description_headline: O que é %{domain}?
domain_count_after: outras instâncias domain_count_after: outras instâncias
domain_count_before: Conectado a domain_count_before: Conectado a
features:
api: Aberto para API de aplicações e serviços
blocks: Bloqueos e ferramentas para mudar
characters: 500 caracteres por post
chronology: Timeline são cronologicas
ethics: 'Design ético: sem propaganda, sem tracking'
gifv: GIFV e vídeos curtos
privacy: Granular, privacidade setada por post
public: Timelines públicas
features_headline: O que torna Mastodon diferente
get_started: Comece aqui get_started: Comece aqui
links: Links links: Links
other_instances: Outras instâncias other_instances: Outras instâncias
@ -159,8 +148,6 @@ pt-BR:
desc_html: Mostrar na página inicial quando registros estão fecados<br/>Você pode usar tags HTML desc_html: Mostrar na página inicial quando registros estão fecados<br/>Você pode usar tags HTML
title: Mensagem de registro fechados title: Mensagem de registro fechados
open: open:
disabled: Desabilitado
enabled: Habilitado
title: Aberto para registro title: Aberto para registro
setting: Preferências setting: Preferências
site_description: site_description:

View File

@ -3,23 +3,12 @@ pt:
about: about:
about_mastodon: Mastodon é uma rede social <em>grátis e em código aberto</em>. Uma alternativa <em>descentralizada</em> às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta <em>rede social</em>. about_mastodon: Mastodon é uma rede social <em>grátis e em código aberto</em>. Uma alternativa <em>descentralizada</em> às plataformas comerciais, que evita o risco de uma única empresa monopolizar a tua comunicação. Escolhe um servidor que confies, não importa qual, pois vais poder comunicar com todos os outros. Qualquer um pode criar uma instância Mastodon e participar nesta <em>rede social</em>.
about_this: Sobre esta instância about_this: Sobre esta instância
apps: Aplicações
business_email: 'Email comercial:' business_email: 'Email comercial:'
closed_registrations: Novos registos estão fechados nesta instância. closed_registrations: Novos registos estão fechados nesta instância.
contact: Contacto contact: Contacto
description_headline: O que é o %{domain}? description_headline: O que é o %{domain}?
domain_count_after: outras instâncias domain_count_after: outras instâncias
domain_count_before: Ligado a domain_count_before: Ligado a
features:
api: API aberta para aplicações e serviços
blocks: Ferramentas para silenciar e bloquear
characters: 500 caracteres por post
chronology: Timelines cronológicas
ethics: 'Design ético: sem públicidade ou tracking'
gifv: GIFV e pequenos vídeos
privacy: Privacidade granular por post
public: Timelines públicas
features_headline: O que torna Mastodon diferente
get_started: Começar get_started: Começar
links: Links links: Links
other_instances: Outras instâncias other_instances: Outras instâncias
@ -154,8 +143,6 @@ pt:
desc_html: Mostrar na página inicial quando registos estão encerrados<br/>Podes usar tags HTML desc_html: Mostrar na página inicial quando registos estão encerrados<br/>Podes usar tags HTML
title: Mensagem de registos encerrados title: Mensagem de registos encerrados
open: open:
disabled: Desabilitado
enabled: Habilitado
title: Aceitar novos registos title: Aceitar novos registos
setting: Preferências setting: Preferências
site_description: site_description:

View File

@ -3,23 +3,12 @@ ru:
about: about:
about_mastodon: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете &mdash; что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно. about_mastodon: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете &mdash; что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно.
about_this: Об этом узле about_this: Об этом узле
apps: Приложения
business_email: 'Деловой e-mail:' business_email: 'Деловой e-mail:'
closed_registrations: В данный момент регистрация на этом узле закрыта. closed_registrations: В данный момент регистрация на этом узле закрыта.
contact: Связаться contact: Связаться
description_headline: Что такое %{domain}? description_headline: Что такое %{domain}?
domain_count_after: другими узлами domain_count_after: другими узлами
domain_count_before: Связан с domain_count_before: Связан с
features:
api: Открытый API для приложений и сервисов
blocks: Продвинутые инструменты блокирования и глушения
characters: 500 символов на пост
chronology: Хронологические ленты
ethics: 'Этичный дизайн: нет рекламы, нет слежения'
gifv: GIFV и короткие видео
privacy: Тонкие настройки приватности для каждого поста
public: Публичные ленты
features_headline: Что выделяет Mastodon
get_started: Начать get_started: Начать
links: Ссылки links: Ссылки
other_instances: Другие узлы other_instances: Другие узлы
@ -141,8 +130,6 @@ ru:
desc_html: Отображается на титульной странице, когда закрыта регистрация<br>Можно использовать HTML-теги desc_html: Отображается на титульной странице, когда закрыта регистрация<br>Можно использовать HTML-теги
title: Сообщение о закрытой регистрации title: Сообщение о закрытой регистрации
open: open:
disabled: Закрыта
enabled: Открыта
title: Открыть регистрацию title: Открыть регистрацию
setting: Настройка setting: Настройка
site_description: site_description:

View File

@ -3,23 +3,12 @@ th:
about: about:
about_mastodon: แมสโทดอน เป็น <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค. เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ &mdash; ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น. about_mastodon: แมสโทดอน เป็น <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค. เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ &mdash; ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น.
about_this: เกี่ยวกับอินซะแตนซ์นี้ about_this: เกี่ยวกับอินซะแตนซ์นี้
apps: แอ๊ฟ
business_email: 'อีเมล์ธุรกิจ:' business_email: 'อีเมล์ธุรกิจ:'
closed_registrations: อินซะแตนซ์นี้ปิดรับลงทะเบียนแล้ว. closed_registrations: อินซะแตนซ์นี้ปิดรับลงทะเบียนแล้ว.
contact: ติดต่อ contact: ติดต่อ
description_headline: โดเมนคือ %{domain} ? description_headline: โดเมนคือ %{domain} ?
domain_count_after: อินซะแตนซ์อื่นๆ domain_count_after: อินซะแตนซ์อื่นๆ
domain_count_before: เชื่อมต่อกับ domain_count_before: เชื่อมต่อกับ
features:
api: API เปิดสำหรับ Apps และ Services
blocks: มีเครื่องมือสำหรับ Block และ Mute
characters: เขียนได้ 500 ตัวอักษรต่อโพสต์
chronology: Timelines are chronological
ethics: 'ออกแบบด้วยจรรยาบรรณ: ไม่มีโฆษณา, ไม่มีการแทรค'
gifv: รองรับภาพ GIFV และ วีดีโอสั้น
privacy: Granular, per-post privacy settings
public: ไทม์ไลน์สาธารณะ
features_headline: What sets Mastodon apart
get_started: เริ่มกันเลย get_started: เริ่มกันเลย
links: ลิงก์ links: ลิงก์
other_instances: อินซะแตนซ์อื่นๆ other_instances: อินซะแตนซ์อื่นๆ
@ -160,8 +149,6 @@ th:
desc_html: Displayed on frontpage when registrations are closed<br> ใช้ HTML tags ได้ desc_html: Displayed on frontpage when registrations are closed<br> ใช้ HTML tags ได้
title: ปิดข้อความลงทะเบียน title: ปิดข้อความลงทะเบียน
open: open:
disabled: ปิดการใช้งาน
enabled: ปิดใช้งาน
title: เปิดรับลงทะเบียน title: เปิดรับลงทะเบียน
setting: ตั้งค่า setting: ตั้งค่า
site_description: site_description:

View File

@ -3,23 +3,12 @@ tr:
about: about:
about_mastodon: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal ağdır. <em>Merkezileştirilmemiş</em> yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon <em>sosyal ağına</em> dahil edebilir. about_mastodon: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal ağdır. <em>Merkezileştirilmemiş</em> yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon <em>sosyal ağına</em> dahil edebilir.
about_this: Bu sunucu hakkında about_this: Bu sunucu hakkında
apps: Uygulamalar
business_email: 'İş e-postası:' business_email: 'İş e-postası:'
closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır. closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır.
contact: İletişim contact: İletişim
description_headline: Peki %{domain} nedir? description_headline: Peki %{domain} nedir?
domain_count_after: sunucu var. domain_count_after: sunucu var.
domain_count_before: Bağlı olduğu domain_count_before: Bağlı olduğu
features:
api: Uygulama ve servisler için açık API
blocks: Zengin blok ve iletişim araçları
characters: 500 karakterlik gönderiler
chronology: Kronolojik zaman tüneli
ethics: 'Etik tasarım: reklam ve izleme yok'
gifv: GIFV ve diğer video türleri
privacy: Gönderi bazlı gizlilik
public: Herkese açık zaman tünelleri
features_headline: Mastodon'ı diğerlerinden ayıran nedir?
get_started: Kayıt ol get_started: Kayıt ol
links: Bağlantılar links: Bağlantılar
other_instances: Diğer sunucular other_instances: Diğer sunucular
@ -159,8 +148,6 @@ tr:
desc_html: Kayıt alımları kapatıldığında ana sayfada görüntülenecek mesajdır. <br> HTML etiketleri kullanabilirsiniz. desc_html: Kayıt alımları kapatıldığında ana sayfada görüntülenecek mesajdır. <br> HTML etiketleri kullanabilirsiniz.
title: Kayıt alımları kapatılma mesajı title: Kayıt alımları kapatılma mesajı
open: open:
disabled: Kapalı
enabled: ık
title: Kayıt alımları title: Kayıt alımları
setting: Ayar adı setting: Ayar adı
site_description: site_description:

View File

@ -3,23 +3,12 @@ uk:
about: about:
about_mastodon: Mastodon - це <em>вільна</em> соціальна мережа з <em>відкритим вихідним кодом</em>. Вона є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте &mdash; що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в <em>соціальній мережі</em>. about_mastodon: Mastodon - це <em>вільна</em> соціальна мережа з <em>відкритим вихідним кодом</em>. Вона є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте &mdash; що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в <em>соціальній мережі</em>.
about_this: Про цю інстанцію about_this: Про цю інстанцію
apps: Додатки
business_email: 'Діловий email:' business_email: 'Діловий email:'
closed_registrations: На даний момент реєстрація на цій інстанції закрита. closed_registrations: На даний момент реєстрація на цій інстанції закрита.
contact: Зв'язатися contact: Зв'язатися
description_headline: Що таке %{domain}? description_headline: Що таке %{domain}?
domain_count_after: іншими інстанціями domain_count_after: іншими інстанціями
domain_count_before: Зв'язаний з domain_count_before: Зв'язаний з
features:
api: Відкритий API для додаків та сервісів
blocks: Продвинуті інструменти самомодерації
characters: 500 символів на пост
chronology: Хронологічні стрічки
ethics: 'Этичний дизайн: немає реклами, немає стеження'
gifv: GIFV та короткі відео
privacy: Тонкі налаштування приватності для кожного поста
public: Публічні стрічки
features_headline: Що виділяє Mastodon
get_started: Почати get_started: Почати
links: Посилання links: Посилання
other_instances: Інші інстанції other_instances: Інші інстанції
@ -141,8 +130,6 @@ uk:
desc_html: Відображається на титульній сторінці, коли реєстрація закрита <br>Можна використовувати HTML-теги desc_html: Відображається на титульній сторінці, коли реєстрація закрита <br>Можна використовувати HTML-теги
title: Повідомлення про закриту реєстрацію title: Повідомлення про закриту реєстрацію
open: open:
disabled: Закрита
enabled: Відкрита
title: Відкрити реєстрацію title: Відкрити реєстрацію
setting: Налаштування setting: Налаштування
site_description: site_description:

View File

@ -3,23 +3,12 @@ zh-CN:
about: about:
about_mastodon: Mastodon长毛象是一个<em>自由、开放源码</em>的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的<em>社交</em>交流。 about_mastodon: Mastodon长毛象是一个<em>自由、开放源码</em>的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的<em>社交</em>交流。
about_this: 关于本实例 about_this: 关于本实例
apps: 应用程序
business_email: 商业电邮︰ business_email: 商业电邮︰
closed_registrations: 这个实例目前不开放注册 _(:3」∠)_ closed_registrations: 这个实例目前不开放注册 _(:3」∠)_
contact: 联络 contact: 联络
description_headline: 关于 %{domain} description_headline: 关于 %{domain}
domain_count_after: 个其它实例 domain_count_after: 个其它实例
domain_count_before: 现已接入 domain_count_before: 现已接入
features:
api: 开放 API供各式应用程序及服务接入
blocks: 完善的封锁用户、静音功能
characters: 每篇嘟文最多 500 字
chronology: 纯粹按时间排序,不作多余处理
ethics: 良心设计︰没有广告,不追踪你的使用行为
gifv: 支持显示 GIFV 动图小视频
privacy: 可逐篇嘟文设置隐私
public: 提供公共时间轴
features_headline: 是什么让 Mastodon 与众不同
get_started: 上手使用 get_started: 上手使用
links: 链接 links: 链接
other_instances: 其它实例 other_instances: 其它实例
@ -166,8 +155,6 @@ zh-CN:
desc_html: 当本站暂停接受注册时,会显示这个消息。<br/> 可使用 HTML desc_html: 当本站暂停接受注册时,会显示这个消息。<br/> 可使用 HTML
title: 暂停注册消息 title: 暂停注册消息
open: open:
disabled: 停用
enabled: 启用
title: 开放注册 title: 开放注册
setting: 设置 setting: 设置
site_description: site_description:

View File

@ -3,23 +3,12 @@ zh-HK:
about: about:
about_mastodon: Mastodon萬象是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。 about_mastodon: Mastodon萬象是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
about_this: 關於本服務站 about_this: 關於本服務站
apps: 應用程式
business_email: 聯絡網站管理者︰ business_email: 聯絡網站管理者︰
closed_registrations: 本服務站暫時停止接受登記。 closed_registrations: 本服務站暫時停止接受登記。
contact: 聯絡 contact: 聯絡
description_headline: 關於 %{domain} description_headline: 關於 %{domain}
domain_count_after: 個其他服務站 domain_count_after: 個其他服務站
domain_count_before: 已連接至 domain_count_before: 已連接至
features:
api: 開放 API供各式應用程式及服務連入
blocks: 完善的封鎖用戶、靜音功能
characters: 每篇文章最多 500 字
chronology: 時間軸忠實按時排序,不多餘處理
ethics: 良心設計︰無廣告,不追蹤用戶
gifv: 支援顯示 GIFV 短片圖組
privacy: 可逐篇文章設定私隱度
public: 公共時間軸
features_headline: 甚麼讓 Mastodon 與眾不同
get_started: 立即登記 get_started: 立即登記
links: 連結 links: 連結
other_instances: 其他服務站 other_instances: 其他服務站
@ -159,8 +148,6 @@ zh-HK:
desc_html: 當本站暫停接受註冊時,會顯示這個訊息。<br/> 可使用 HTML desc_html: 當本站暫停接受註冊時,會顯示這個訊息。<br/> 可使用 HTML
title: 暫停註冊訊息 title: 暫停註冊訊息
open: open:
disabled: 停用
enabled: 啟用
title: 開放註冊 title: 開放註冊
setting: 設定 setting: 設定
site_description: site_description:

View File

@ -3,23 +3,12 @@ zh-TW:
about: about:
about_mastodon: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的<em>社群網路</em>交流。 about_mastodon: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的<em>社群網路</em>交流。
about_this: 關於本服務站 about_this: 關於本服務站
apps: 應用程式
business_email: 商務信箱︰ business_email: 商務信箱︰
closed_registrations: 本服務站暫時停止接受註冊。 closed_registrations: 本服務站暫時停止接受註冊。
contact: 聯絡我們 contact: 聯絡我們
description_headline: 關於 %{domain} description_headline: 關於 %{domain}
domain_count_after: 個服務站相連 domain_count_after: 個服務站相連
domain_count_before: 與其他 domain_count_before: 與其他
features:
api: 開放 API供各式應用程式及服務串接
blocks: 完善的封鎖使用者、靜音功能
characters: 每篇文章最多 500 字
chronology: 時間軸按時序顯示文章,不作多餘處理
ethics: 良心設計︰沒有廣告,不追蹤您的使用行為
gifv: 支援顯示 GIFV 短片
privacy: 可逐篇文章調整隱私設定
public: 公開時間軸
features_headline: Mastodon 與眾不同之處
get_started: 立即註冊 get_started: 立即註冊
links: 連結 links: 連結
other_instances: 其他服務站 other_instances: 其他服務站
@ -120,8 +109,6 @@ zh-TW:
desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤。 desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤。
title: 關閉註冊訊息 title: 關閉註冊訊息
open: open:
disabled: 停用
enabled: 啟用
title: 開放註冊 title: 開放註冊
setting: 設定 setting: 設定
site_description: site_description:

View File

@ -16,6 +16,7 @@ defaults: &defaults
open_registrations: true open_registrations: true
closed_registrations_message: '' closed_registrations_message: ''
open_deletion: true open_deletion: true
timeline_preview: true
boost_modal: false boost_modal: false
auto_play_gif: false auto_play_gif: false
delete_modal: true delete_modal: true

View File

@ -161,16 +161,12 @@ namespace :mastodon do
namespace :settings do namespace :settings do
desc 'Open registrations on this instance' desc 'Open registrations on this instance'
task open_registrations: :environment do task open_registrations: :environment do
setting = Setting.where(var: 'open_registrations').first Setting.open_registrations = true
setting.value = true
setting.save
end end
desc 'Close registrations on this instance' desc 'Close registrations on this instance'
task close_registrations: :environment do task close_registrations: :environment do
setting = Setting.where(var: 'open_registrations').first Setting.open_registrations = false
setting.value = false
setting.save
end end
end end

View File

@ -12,7 +12,7 @@ describe 'Localization' do
get "/about", headers: headers get "/about", headers: headers
expect(response.body).to include( expect(response.body).to include(
I18n.t('about.about_mastodon', locale: 'zh-HK') I18n.t('about.about_mastodon_html', locale: 'zh-HK')
) )
end end
@ -21,7 +21,7 @@ describe 'Localization' do
get "/about", headers: headers get "/about", headers: headers
expect(response.body).to include( expect(response.body).to include(
I18n.t('about.about_mastodon', locale: 'es') I18n.t('about.about_mastodon_html', locale: 'es')
) )
end end
it 'falls back to english when locale is missing' do it 'falls back to english when locale is missing' do
@ -29,7 +29,7 @@ describe 'Localization' do
get "/about", headers: headers get "/about", headers: headers
expect(response.body).to include( expect(response.body).to include(
I18n.t('about.about_mastodon', locale: 'en') I18n.t('about.about_mastodon_html', locale: 'en')
) )
end end
end end

View File

@ -10,10 +10,11 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do
it 'has valid open graph tags' do it 'has valid open graph tags' do
instance_presenter = double(:instance_presenter, instance_presenter = double(:instance_presenter,
site_description: 'something', site_title: 'something',
open_registrations: false, site_description: 'something',
closed_registrations_message: 'yes', version_number: '1.0',
) open_registrations: false,
closed_registrations_message: 'yes')
assign(:instance_presenter, instance_presenter) assign(:instance_presenter, instance_presenter)
render render