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:
parent
8784bd79d0
commit
e19eefe219
@ -4,7 +4,10 @@ class AboutController < ApplicationController
|
||||
before_action :set_body_classes
|
||||
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
|
||||
|
||||
@ -15,6 +18,7 @@ class AboutController < ApplicationController
|
||||
def new_user
|
||||
User.new.tap(&:build_account)
|
||||
end
|
||||
|
||||
helper_method :new_user
|
||||
|
||||
def set_instance_presenter
|
||||
@ -24,4 +28,11 @@ class AboutController < ApplicationController
|
||||
def set_body_classes
|
||||
@body_classes = 'about-body'
|
||||
end
|
||||
|
||||
def initial_state_params
|
||||
{
|
||||
settings: {},
|
||||
token: current_session&.token,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
@ -11,8 +11,15 @@ module Admin
|
||||
site_terms
|
||||
open_registrations
|
||||
closed_registrations_message
|
||||
open_deletion
|
||||
timeline_preview
|
||||
).freeze
|
||||
|
||||
BOOLEAN_SETTINGS = %w(
|
||||
open_registrations
|
||||
open_deletion
|
||||
timeline_preview
|
||||
).freeze
|
||||
BOOLEAN_SETTINGS = %w(open_registrations).freeze
|
||||
|
||||
def edit
|
||||
@settings = Setting.all_as_records
|
||||
|
@ -15,12 +15,16 @@ class HomeController < ApplicationController
|
||||
end
|
||||
|
||||
def set_initial_state_json
|
||||
state = InitialStatePresenter.new(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))
|
||||
|
||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(state, serializer: InitialStateSerializer)
|
||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer)
|
||||
@initial_state_json = serializable_resource.to_json
|
||||
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
|
||||
|
BIN
app/javascript/fonts/montserrat/Montserrat-Medium.ttf
Normal file
BIN
app/javascript/fonts/montserrat/Montserrat-Medium.ttf
Normal file
Binary file not shown.
BIN
app/javascript/images/cloud2.png
Normal file
BIN
app/javascript/images/cloud2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
BIN
app/javascript/images/cloud3.png
Normal file
BIN
app/javascript/images/cloud3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.7 KiB |
BIN
app/javascript/images/cloud4.png
Normal file
BIN
app/javascript/images/cloud4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.1 KiB |
BIN
app/javascript/images/elephant-fren.png
Normal file
BIN
app/javascript/images/elephant-fren.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" height="1000" width="1000"><path d="M500 0a500 500 0 0 0-353.553 146.447 500 500 0 1 0 707.106 707.106A500 500 0 0 0 500 0zm-.059 280.05h107.12c-19.071 13.424-26.187 51.016-27.12 73.843V562.05c0 44.32-35.68 80-80 80s-80-35.68-80-80v-202c0-44.32 35.68-80 80-80zm-.441 52c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zm-279.059 7.9c44.32 0 80 35.68 80 80v206.157c.933 22.827 8.049 60.42 27.12 73.842H220.44c-44.32 0-80-35.68-80-80v-200c0-44.32 35.68-80 80-80zm559.12 0c44.32 0 80 35.68 80 80v200c0 44.32-35.68 80-80 80H672.44c19.071-13.424 26.187-51.016 27.12-73.843V419.95c0-44.32 35.68-80 80-80zM220 392c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm560 0c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm-280.5 40.05c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zM220 491.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zM499.5 532c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zM220 591.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28z" fill="#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 |
@ -14,6 +14,7 @@ export default class DropdownMenu extends React.PureComponent {
|
||||
size: PropTypes.number.isRequired,
|
||||
direction: PropTypes.string,
|
||||
ariaLabel: PropTypes.string,
|
||||
disabled: PropTypes.bool,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
@ -68,9 +69,19 @@ export default class DropdownMenu extends React.PureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { icon, items, size, direction, ariaLabel } = this.props;
|
||||
const { icon, items, size, direction, ariaLabel, disabled } = this.props;
|
||||
const { expanded } = this.state;
|
||||
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 && (
|
||||
<ul className='dropdown__content-list'>
|
||||
@ -80,8 +91,8 @@ export default class DropdownMenu extends React.PureComponent {
|
||||
|
||||
return (
|
||||
<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}>
|
||||
<i className={`fa fa-fw fa-${icon} dropdown__icon`} aria-hidden />
|
||||
<DropdownTrigger className='icon-button' style={iconStyle} aria-label={ariaLabel}>
|
||||
<i className={iconClassname} aria-hidden />
|
||||
</DropdownTrigger>
|
||||
|
||||
<DropdownContent className={directionClass}>
|
||||
|
@ -11,18 +11,44 @@ const messages = defineMessages({
|
||||
|
||||
class Item extends React.PureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
};
|
||||
|
||||
static propTypes = {
|
||||
attachment: ImmutablePropTypes.map.isRequired,
|
||||
index: PropTypes.number.isRequired,
|
||||
size: PropTypes.number.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) => {
|
||||
const { index, onClick } = this.props;
|
||||
|
||||
if (e.button === 0) {
|
||||
if (this.context.router && e.button === 0) {
|
||||
e.preventDefault();
|
||||
onClick(index);
|
||||
}
|
||||
@ -116,6 +142,8 @@ class Item extends React.PureComponent {
|
||||
role='application'
|
||||
src={attachment.get('url')}
|
||||
onClick={this.handleClick}
|
||||
onMouseEnter={this.handleMouseEnter}
|
||||
onMouseLeave={this.handleMouseLeave}
|
||||
autoPlay={autoPlay}
|
||||
loop
|
||||
muted
|
||||
@ -144,7 +172,11 @@ export default class MediaGallery extends React.PureComponent {
|
||||
height: PropTypes.number.isRequired,
|
||||
onOpenMedia: PropTypes.func.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
autoPlayGif: PropTypes.bool.isRequired,
|
||||
autoPlayGif: PropTypes.bool,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
autoPlayGif: false,
|
||||
};
|
||||
|
||||
state = {
|
||||
|
@ -15,7 +15,7 @@ export default class Permalink extends React.PureComponent {
|
||||
};
|
||||
|
||||
handleClick = (e) => {
|
||||
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||
if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||
e.preventDefault();
|
||||
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;
|
||||
|
||||
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}
|
||||
</a>
|
||||
);
|
||||
|
@ -140,12 +140,16 @@ export default class Status extends ImmutablePureComponent {
|
||||
}
|
||||
|
||||
handleClick = () => {
|
||||
if (!this.context.router) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { status } = this.props;
|
||||
this.context.router.history.push(`/statuses/${status.getIn(['reblog', 'id'], status.get('id'))}`);
|
||||
}
|
||||
|
||||
handleAccountClick = (e) => {
|
||||
if (e.button === 0) {
|
||||
if (this.context.router && e.button === 0) {
|
||||
const id = Number(e.currentTarget.getAttribute('data-id'));
|
||||
e.preventDefault();
|
||||
this.context.router.history.push(`/accounts/${id}`);
|
||||
@ -236,7 +240,7 @@ export default class Status extends ImmutablePureComponent {
|
||||
<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 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'>
|
||||
{statusAvatar}
|
||||
</div>
|
||||
|
@ -40,7 +40,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
|
||||
onBlock: PropTypes.func,
|
||||
onReport: PropTypes.func,
|
||||
onMuteConversation: PropTypes.func,
|
||||
me: PropTypes.number.isRequired,
|
||||
me: PropTypes.number,
|
||||
withDismiss: PropTypes.bool,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
@ -97,6 +97,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
|
||||
const { status, me, intl, withDismiss } = this.props;
|
||||
const reblogDisabled = status.get('visibility') === 'private' || status.get('visibility') === 'direct';
|
||||
const mutingConversation = status.get('muted');
|
||||
const anonymousAccess = !me;
|
||||
|
||||
let menu = [];
|
||||
let reblogIcon = 'retweet';
|
||||
@ -137,12 +138,12 @@ export default class StatusActionBar extends ImmutablePureComponent {
|
||||
|
||||
return (
|
||||
<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={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' disabled={anonymousAccess} title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} />
|
||||
<IconButton className='status__action-bar-button' disabled={anonymousAccess || reblogDisabled} active={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
|
||||
<IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
|
||||
|
||||
<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>
|
||||
);
|
||||
|
@ -6,6 +6,7 @@ import emojify from '../emoji';
|
||||
import { isRtl } from '../rtl';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import Permalink from './permalink';
|
||||
import classnames from 'classnames';
|
||||
|
||||
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] === '#')) {
|
||||
link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
|
||||
} else {
|
||||
link.setAttribute('target', '_blank');
|
||||
link.setAttribute('rel', 'noopener');
|
||||
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) => {
|
||||
if (e.button === 0) {
|
||||
if (this.context.router && e.button === 0) {
|
||||
e.preventDefault();
|
||||
this.context.router.history.push(`/accounts/${mention.get('id')}`);
|
||||
}
|
||||
@ -68,7 +70,7 @@ export default class StatusContent extends React.PureComponent {
|
||||
onHashtagClick = (hashtag, e) => {
|
||||
hashtag = hashtag.replace(/^#/, '').toLowerCase();
|
||||
|
||||
if (e.button === 0) {
|
||||
if (this.context.router && e.button === 0) {
|
||||
e.preventDefault();
|
||||
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 spoilerContent = { __html: emojify(escapeTextContentForBrowser(status.get('spoiler_text', ''))) };
|
||||
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'))) {
|
||||
directionStyle.direction = 'rtl';
|
||||
@ -141,7 +146,7 @@ export default class StatusContent extends React.PureComponent {
|
||||
}
|
||||
|
||||
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 }}>
|
||||
<span dangerouslySetInnerHTML={spoilerContent} />
|
||||
{' '}
|
||||
@ -157,7 +162,7 @@ export default class StatusContent extends React.PureComponent {
|
||||
return (
|
||||
<div
|
||||
ref={this.setRef}
|
||||
className='status__content status__content--with-action'
|
||||
className={classNames}
|
||||
style={directionStyle}
|
||||
onMouseDown={this.handleMouseDown}
|
||||
onMouseUp={this.handleMouseUp}
|
||||
|
@ -14,6 +14,10 @@ const messages = defineMessages({
|
||||
@injectIntl
|
||||
export default class VideoPlayer extends React.PureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
};
|
||||
|
||||
static propTypes = {
|
||||
media: ImmutablePropTypes.map.isRequired,
|
||||
width: PropTypes.number,
|
||||
@ -119,11 +123,15 @@ export default class VideoPlayer extends React.PureComponent {
|
||||
</div>
|
||||
);
|
||||
|
||||
let expandButton = (
|
||||
let expandButton = '';
|
||||
|
||||
if (this.context.router) {
|
||||
expandButton = (
|
||||
<div className='status__video-player-expand'>
|
||||
<IconButton overlay title={intl.formatMessage(messages.expand_video)} icon='expand' onClick={this.handleExpand} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
let muteButton = '';
|
||||
|
||||
@ -138,7 +146,7 @@ export default class VideoPlayer extends React.PureComponent {
|
||||
if (!this.state.visible) {
|
||||
if (sensitive) {
|
||||
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}
|
||||
<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>
|
||||
@ -146,7 +154,7 @@ export default class VideoPlayer extends React.PureComponent {
|
||||
);
|
||||
} else {
|
||||
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}
|
||||
<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>
|
||||
|
39
app/javascript/mastodon/containers/timeline_container.js
Normal file
39
app/javascript/mastodon/containers/timeline_container.js
Normal 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>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -4,6 +4,9 @@ import { delegate } from 'rails-ujs';
|
||||
import emojify from '../mastodon/emoji';
|
||||
import { getLocale } from '../mastodon/locales';
|
||||
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);
|
||||
|
||||
@ -36,6 +39,13 @@ function loaded() {
|
||||
const datetime = new Date(content.getAttribute('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() {
|
||||
|
@ -116,10 +116,6 @@
|
||||
.wrapper {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.features-list {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -301,80 +297,438 @@
|
||||
}
|
||||
}
|
||||
|
||||
.features-list {
|
||||
.features-list__row {
|
||||
display: flex;
|
||||
margin-bottom: 20px;
|
||||
padding: 10px 0;
|
||||
justify-content: space-between;
|
||||
|
||||
.features-list__column {
|
||||
flex: 1 1 0;
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
&:first-child {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0;
|
||||
.visual {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 15px;
|
||||
|
||||
.fa {
|
||||
display: block;
|
||||
color: $ui-primary-color;
|
||||
font-size: 48px;
|
||||
}
|
||||
}
|
||||
|
||||
.text {
|
||||
font-size: 16px;
|
||||
line-height: 30px;
|
||||
color: lighten($ui-base-color, 26%);
|
||||
|
||||
h6 {
|
||||
font-weight: 500;
|
||||
color: $ui-primary-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.screenshot-with-signup {
|
||||
display: flex;
|
||||
margin-bottom: 20px;
|
||||
.landing-page {
|
||||
.header-wrapper {
|
||||
padding-top: 15px;
|
||||
background: $ui-base-color;
|
||||
background: linear-gradient(150deg, lighten($ui-base-color, 8%), $ui-base-color);
|
||||
position: relative;
|
||||
|
||||
.mascot-container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.mascot {
|
||||
flex: 1 1 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
max-width: 100%;
|
||||
position: absolute;
|
||||
bottom: -14px;
|
||||
width: auto;
|
||||
height: auto;
|
||||
left: 60px;
|
||||
z-index: 3;
|
||||
}
|
||||
}
|
||||
|
||||
.simple_form,
|
||||
.closed-registrations-message {
|
||||
width: 300px;
|
||||
flex: 0 0 auto;
|
||||
background: rgba(darken($ui-base-color, 7%), 0.5);
|
||||
padding: 14px;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);
|
||||
|
||||
.actions {
|
||||
p,
|
||||
li {
|
||||
font: inherit;
|
||||
font-weight: inherit;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.info {
|
||||
text-align: center;
|
||||
.header {
|
||||
line-height: 30px;
|
||||
overflow: hidden;
|
||||
|
||||
a {
|
||||
color: $ui-secondary-color;
|
||||
}
|
||||
}
|
||||
.container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 625px) {
|
||||
.mascot {
|
||||
display: none;
|
||||
.hero {
|
||||
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 {
|
||||
flex: auto;
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
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%;
|
||||
}
|
||||
|
||||
.scrollable {
|
||||
height: 400px;
|
||||
}
|
||||
|
||||
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 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
@keyframes floating {
|
||||
from {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
|
||||
65% {
|
||||
transform: translate(0, 4px);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: translate(0, -0);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
body {
|
||||
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-attachment: fixed;
|
||||
font-size: 13px;
|
||||
@ -22,6 +22,11 @@ body {
|
||||
background: $ui-base-color;
|
||||
}
|
||||
|
||||
&.about-body {
|
||||
background: darken($ui-base-color, 8%);
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
&.embed {
|
||||
background: transparent;
|
||||
margin: 0;
|
||||
|
File diff suppressed because one or more lines are too long
@ -42,8 +42,38 @@
|
||||
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 {
|
||||
//
|
||||
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 {
|
||||
|
@ -10,52 +10,36 @@
|
||||
}
|
||||
|
||||
.logo-container {
|
||||
max-width: 400px;
|
||||
margin: 100px auto;
|
||||
margin-bottom: 0;
|
||||
cursor: default;
|
||||
margin-bottom: 50px;
|
||||
|
||||
@media screen and (max-width: 360px) {
|
||||
margin: 30px auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
display: block;
|
||||
text-align: center;
|
||||
color: $primary-text-color;
|
||||
font-size: 48px;
|
||||
font-weight: 500;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin: 20px auto;
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: $primary-text-color;
|
||||
text-decoration: none;
|
||||
outline: 0;
|
||||
|
||||
img {
|
||||
opacity: 0.8;
|
||||
transition: opacity 0.8s ease;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
img {
|
||||
opacity: 1;
|
||||
transition-duration: 0.2s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
small {
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
font-family: 'mastodon-font-monospace', monospace;
|
||||
padding: 12px 16px;
|
||||
line-height: 32px;
|
||||
font-family: 'mastodon-font-display', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,3 +7,11 @@
|
||||
font-weight: 400;
|
||||
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;
|
||||
}
|
||||
|
@ -24,6 +24,20 @@ code {
|
||||
|
||||
p.hint {
|
||||
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 {
|
||||
@ -197,8 +211,6 @@ code {
|
||||
|
||||
&:active,
|
||||
&:focus {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
background-color: darken($ui-highlight-color, 5%);
|
||||
}
|
||||
|
||||
@ -219,6 +231,27 @@ code {
|
||||
select {
|
||||
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 {
|
||||
@ -240,7 +273,7 @@ code {
|
||||
text-align: center;
|
||||
|
||||
a {
|
||||
color: $primary-text-color;
|
||||
color: $ui-primary-color;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
|
@ -5,6 +5,7 @@ class InstancePresenter
|
||||
:closed_registrations_message,
|
||||
:site_contact_email,
|
||||
:open_registrations,
|
||||
:site_title,
|
||||
:site_description,
|
||||
:site_extended_description,
|
||||
:site_terms,
|
||||
|
@ -5,32 +5,41 @@ class InitialStateSerializer < ActiveModel::Serializer
|
||||
:media_attachments, :settings
|
||||
|
||||
def meta
|
||||
{
|
||||
store = {
|
||||
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
|
||||
access_token: object.token,
|
||||
locale: I18n.locale,
|
||||
domain: Rails.configuration.x.local_domain,
|
||||
me: object.current_account.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
|
||||
|
||||
def compose
|
||||
{
|
||||
me: object.current_account.id,
|
||||
default_privacy: object.current_account.user.setting_default_privacy,
|
||||
default_sensitive: object.current_account.user.setting_default_sensitive,
|
||||
}
|
||||
store = {}
|
||||
|
||||
if object.current_account
|
||||
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
|
||||
|
||||
def accounts
|
||||
store = {}
|
||||
store[object.current_account.id] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer)
|
||||
store[object.admin.id] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) unless object.admin.nil?
|
||||
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) if object.admin
|
||||
store
|
||||
end
|
||||
|
||||
|
25
app/views/about/_features.html.haml
Normal file
25
app/views/about/_features.html.haml
Normal 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'
|
@ -1,10 +1,13 @@
|
||||
= simple_form_for(new_user, url: user_registration_path) do |f|
|
||||
= f.simple_fields_for :account do |account_fields|
|
||||
.input-with-append
|
||||
= account_fields.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'),
|
||||
@ -22,9 +25,6 @@
|
||||
input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password') }
|
||||
|
||||
.actions
|
||||
= f.button :button, t('about.get_started'), type: :submit
|
||||
= f.button :button, t('auth.register'), type: :submit, class: 'button button-alternative'
|
||||
|
||||
.info
|
||||
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
||||
·
|
||||
= link_to t('about.about_this'), about_more_path
|
||||
%p.hint.subtle-hint=t('auth.agreement_html', rules_path: about_more_path, terms_path: terms_path)
|
||||
|
@ -1,4 +1,5 @@
|
||||
- content_for :header_tags do
|
||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
|
||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
|
||||
|
||||
- content_for :page_title do
|
||||
@ -9,79 +10,70 @@
|
||||
%meta{ property: 'og:url', content: about_url }/
|
||||
%meta{ property: 'og:type', content: 'website' }/
|
||||
%meta{ property: 'og:title', content: site_hostname }/
|
||||
%meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon')) }/
|
||||
%meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/
|
||||
%meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
|
||||
%meta{ property: 'og:image:width', content: '400' }/
|
||||
%meta{ property: 'og:image:height', content: '400' }/
|
||||
%meta{ property: 'twitter:card', content: 'summary' }/
|
||||
|
||||
.wrapper
|
||||
.landing-page
|
||||
.header-wrapper
|
||||
.mascot-container
|
||||
= image_tag asset_pack_path('elephant-fren.png'), class: 'mascot'
|
||||
|
||||
.header
|
||||
.container.links
|
||||
.brand
|
||||
= link_to root_url do
|
||||
= image_tag asset_pack_path('logo.svg')
|
||||
Mastodon
|
||||
|
||||
%ul.nav
|
||||
%li
|
||||
- if user_signed_in?
|
||||
= link_to t('settings.back'), root_url, class: 'webapp-btn'
|
||||
- else
|
||||
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
||||
%li= link_to t('about.about_this'), about_more_path
|
||||
%li= link_to t('about.other_instances'), 'https://joinmastodon.org/'
|
||||
|
||||
.container.hero
|
||||
.floats
|
||||
= image_tag asset_pack_path('cloud2.png'), class: 'float-1'
|
||||
= image_tag asset_pack_path('cloud3.png'), class: 'float-2'
|
||||
= image_tag asset_pack_path('cloud4.png'), class: 'float-3'
|
||||
.heading
|
||||
%h1
|
||||
= image_tag asset_pack_path('logo.png')
|
||||
= Setting.site_title
|
||||
|
||||
%p!= t('about.about_mastodon')
|
||||
|
||||
.screenshot-with-signup
|
||||
.mascot= image_tag asset_pack_path('fluffy-elephant-friend.png')
|
||||
|
||||
= @instance_presenter.site_title
|
||||
%small= t 'about.hosted_on', domain: site_hostname
|
||||
- if @instance_presenter.open_registrations
|
||||
= render 'registration'
|
||||
- else
|
||||
.closed-registrations-message
|
||||
%div
|
||||
- if @instance_presenter.closed_registrations_message.blank?
|
||||
%p= t('about.closed_registrations')
|
||||
- else
|
||||
!= @instance_presenter.closed_registrations_message
|
||||
.info
|
||||
= link_to t('auth.login'), new_user_session_path, class: 'webapp-btn'
|
||||
·
|
||||
= link_to t('about.other_instances'), 'https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/List-of-Mastodon-instances.md'
|
||||
·
|
||||
= link_to t('about.about_this'), about_more_path
|
||||
= @instance_presenter.closed_registrations_message.html_safe
|
||||
= link_to t('about.find_another_instance'), 'https://joinmastodon.org', class: 'button button-alternative button--block'
|
||||
|
||||
%h3= t('about.features_headline')
|
||||
|
||||
.features-list
|
||||
.features-list__column
|
||||
%ul.fa-ul
|
||||
%li
|
||||
= 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?
|
||||
.learn-more-cta
|
||||
.container
|
||||
%h3= t('about.description_headline', domain: site_hostname)
|
||||
%p!= @instance_presenter.site_description
|
||||
%p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname)
|
||||
|
||||
.actions
|
||||
.info
|
||||
= link_to t('about.terms'), terms_path
|
||||
·
|
||||
= link_to t('about.apps'), 'https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md'
|
||||
·
|
||||
.features
|
||||
.container
|
||||
- if Setting.timeline_preview
|
||||
#mastodon-timeline{ data: { props: Oj.dump(default_props) } }
|
||||
|
||||
.about-mastodon
|
||||
%h3= t 'about.what_is_mastodon'
|
||||
%p= t 'about.about_mastodon_html'
|
||||
%a.button.button-secondary{ href: 'https://joinmastodon.org' }= t 'about.learn_more'
|
||||
= render 'features'
|
||||
.footer-links
|
||||
.container
|
||||
%p
|
||||
= 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'
|
||||
= " (#{@instance_presenter.version_number})"
|
||||
|
@ -12,54 +12,53 @@
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.contact_information.label')
|
||||
%td= text_field_tag :site_contact_username,
|
||||
@settings['site_contact_username'].value,
|
||||
place_holder: t('admin.settings.contact_information.username')
|
||||
%td= text_field_tag :site_contact_username, @settings['site_contact_username'].value, place_holder: t('admin.settings.contact_information.username')
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.accounts.email')
|
||||
%td= text_field_tag :site_contact_email,
|
||||
@settings['site_contact_email'].value,
|
||||
place_holder: t('admin.settings.contact_information.email')
|
||||
%td= text_field_tag :site_contact_email, @settings['site_contact_email'].value, place_holder: t('admin.settings.contact_information.email')
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.site_title')
|
||||
%td= text_field_tag :site_title,
|
||||
@settings['site_title'].value
|
||||
%td= text_field_tag :site_title, @settings['site_title'].value
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.site_description.title')
|
||||
%p= t('admin.settings.site_description.desc_html')
|
||||
%td= text_area_tag :site_description,
|
||||
@settings['site_description'].value,
|
||||
rows: 8
|
||||
%td= text_area_tag :site_description, @settings['site_description'].value, rows: 8
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.site_description_extended.title')
|
||||
%p= t('admin.settings.site_description_extended.desc_html')
|
||||
%td= text_area_tag :site_extended_description,
|
||||
@settings['site_extended_description'].value,
|
||||
rows: 8
|
||||
%td= text_area_tag :site_extended_description, @settings['site_extended_description'].value, rows: 8
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.site_terms.title')
|
||||
%p= t('admin.settings.site_terms.desc_html')
|
||||
%td= text_area_tag :site_terms,
|
||||
@settings['site_terms'].value,
|
||||
rows: 8
|
||||
%td= text_area_tag :site_terms, @settings['site_terms'].value, rows: 8
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.registrations.open.title')
|
||||
%p= t('admin.settings.registrations.open.desc_html')
|
||||
%td
|
||||
= select_tag :open_registrations,
|
||||
options_for_select({ t('admin.settings.registrations.open.disabled') => false, t('admin.settings.registrations.open.enabled') => true }, @settings['open_registrations'].value)
|
||||
= select_tag :open_registrations, options_for_select({ t('simple_form.no') => false, t('simple_form.yes') => true }, @settings['open_registrations'].value)
|
||||
%tr
|
||||
%td
|
||||
%strong= t('admin.settings.registrations.closed_message.title')
|
||||
%p= t('admin.settings.registrations.closed_message.desc_html')
|
||||
%td= text_area_tag :closed_registrations_message,
|
||||
@settings['closed_registrations_message'].value,
|
||||
rows: 8
|
||||
%td= text_area_tag :closed_registrations_message, @settings['closed_registrations_message'].value, rows: 8
|
||||
%tr
|
||||
%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
|
||||
= button_tag t('generic.save_changes'), type: :submit, class: :btn
|
||||
|
@ -5,7 +5,10 @@
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
= f.simple_fields_for :account do |ff|
|
||||
.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 :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
|
||||
= 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'
|
||||
|
@ -6,7 +6,8 @@
|
||||
.logo-container
|
||||
%h1
|
||||
= link_to root_path do
|
||||
= image_tag asset_pack_path('logo.png')
|
||||
= image_tag asset_pack_path('logo.svg')
|
||||
Mastodon
|
||||
|
||||
.form-container
|
||||
= render 'flashes'
|
||||
|
@ -3,23 +3,12 @@ ar:
|
||||
about:
|
||||
about_mastodon: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
|
||||
about_this: عن مثيل الخادوم هذا
|
||||
apps: التطبيقات
|
||||
business_email: 'البريد الإلكتروني المهني :'
|
||||
closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
|
||||
contact: للتواصل معنا
|
||||
description_headline: ما هو %{domain}?
|
||||
domain_count_after: خوادم أخرى
|
||||
domain_count_before: متصل بـ
|
||||
features:
|
||||
api: واجهة برمجة مفتوحة للتطبيقات والخدمات
|
||||
blocks: نص منسق وأدوات كتم
|
||||
characters: 500 حرف في كل رسالة
|
||||
chronology: خيوط متسلسلة زمنيا
|
||||
ethics: 'تصميم أخلاقي : لا إعلانات و لا تعقُّب'
|
||||
gifv: مجموعات صور GIFV وأشرطة فيديو قصيرة
|
||||
privacy: إعدادات مدققة لخصوصية كل منشور
|
||||
public: الخيوط الزمنية العمومية
|
||||
features_headline: ما الذي يجعل ماستدون فريدًا ؟
|
||||
get_started: إبدأ الآن
|
||||
links: الروابط
|
||||
other_instances: خوادم أخرى
|
||||
@ -93,7 +82,7 @@ ar:
|
||||
blocking: قائمة المحظورين
|
||||
following: قائمة المستخدمين المتبوعين
|
||||
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>.
|
||||
media_attachments:
|
||||
validations:
|
||||
|
@ -3,23 +3,12 @@ bg:
|
||||
about:
|
||||
about_mastodon: Mastodon е <em>безплатен</em> сървър с <em>отворен код</em> за социални мрежи. Като <em>децентрализирана</em> алтернатива на комерсиалните платформи, той позволява избягването на риска от монополизация на твоята комуникация от единични компании. Изберете си сървър, на който се доверявате, и ще можете да контактувате с всички останали. Всеки може да пусне Mastodon и лесно да вземе участие в <em>социалната мрежа</em>.
|
||||
about_this: За тази инстанция
|
||||
apps: Приложения
|
||||
business_email: 'Служебен e-mail:'
|
||||
closed_registrations: В момента регистрациите за тази инстанция са затворени.
|
||||
contact: За контакти
|
||||
description_headline: Какво е %{domain}?
|
||||
domain_count_after: други инстанции
|
||||
domain_count_before: Свързани към
|
||||
features:
|
||||
api: Отворено API за приложения и услуги
|
||||
blocks: Богат на инструменти за блокиране и заглушаване
|
||||
characters: Публикации от 500 символа
|
||||
chronology: Публикациите се показват хронологично
|
||||
ethics: 'Етичен дизайн: без реклами и проследяване'
|
||||
gifv: GIFV комплекти и кратки видео клипове
|
||||
privacy: Настройване на поверителността за всяка публикация
|
||||
public: Публични канали
|
||||
features_headline: Какво откроява Mastodon
|
||||
get_started: Първи стъпки
|
||||
links: Връзки
|
||||
other_instances: Други инстанции
|
||||
@ -93,7 +82,7 @@ bg:
|
||||
blocking: Списък на блокираните
|
||||
following: Списък на последователите
|
||||
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>.
|
||||
media_attachments:
|
||||
validations:
|
||||
|
@ -3,23 +3,12 @@ ca:
|
||||
about:
|
||||
about_mastodon: Mastodon és un servidor de xarxa social <em>lliure i de codi obert</em>. Una alternativa <em>descentralitzada</em> a plataformes comercials, que evita el risc que una única companyia monopolitzi la teva comunicació. Qualsevol pot executar Mastodon i participar sense problemes en la <em>xarxa social</em>.
|
||||
about_this: Sobre aquesta instància
|
||||
apps: Apps
|
||||
business_email: 'Adreça de contacte:'
|
||||
closed_registrations: Els registres estan actualment tancats en aquesta instància.
|
||||
contact: Contacte
|
||||
description_headline: Què es %{domain}?
|
||||
domain_count_after: altres instàncies
|
||||
domain_count_before: Connectat a
|
||||
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
|
||||
links: Vincles
|
||||
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
|
||||
title: Missatge de registre tancat
|
||||
open:
|
||||
disabled: Desactivat
|
||||
enabled: Activat
|
||||
title: Registre obert
|
||||
setting: Ajust
|
||||
site_description:
|
||||
@ -203,8 +190,8 @@ ca:
|
||||
change_password: Canviar contrasenya
|
||||
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ó.
|
||||
didnt_get_confirmation: "No vas rebre el correu de confirmació?"
|
||||
forgot_password: "Has oblidat la contrasenya?"
|
||||
didnt_get_confirmation: No vas rebre el correu de confirmació?
|
||||
forgot_password: Has oblidat la contrasenya?
|
||||
login: Iniciar sessió
|
||||
logout: Tancar sessió
|
||||
register: Enregistrarse
|
||||
|
@ -3,23 +3,12 @@ de:
|
||||
about:
|
||||
about_mastodon: Mastodon ist ein <em>freier, quelloffener</em> sozialer Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
|
||||
about_this: Über diese Instanz
|
||||
apps: Apps
|
||||
business_email: 'Geschäftliche E-Mail:'
|
||||
closed_registrations: Die Registrierung ist auf dieser Instanz momentan geschlossen.
|
||||
contact: Kontakt
|
||||
description_headline: Was ist %{domain}?
|
||||
domain_count_after: andere Instanzen
|
||||
domain_count_before: Verbunden mit
|
||||
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
|
||||
links: Links
|
||||
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
|
||||
title: Nachricht über geschlossene Registrierung
|
||||
open:
|
||||
disabled: Deaktiviert
|
||||
enabled: Aktiviert
|
||||
title: Offene Registrierung
|
||||
setting: Einstellung
|
||||
site_description:
|
||||
|
@ -1,28 +1,30 @@
|
||||
---
|
||||
en:
|
||||
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 — 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_this: About this instance
|
||||
apps: Apps
|
||||
about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail.
|
||||
about_this: About
|
||||
business_email: 'Business e-mail:'
|
||||
closed_registrations: Registrations are currently closed on this instance.
|
||||
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
|
||||
description_headline: What is %{domain}?
|
||||
domain_count_after: other instances
|
||||
domain_count_before: Connected to
|
||||
features:
|
||||
api: Open API for apps and services
|
||||
blocks: Rich block and muting tools
|
||||
characters: 500 characters per post
|
||||
chronology: Timelines are chronological
|
||||
ethics: 'Ethical design: no ads, no tracking'
|
||||
gifv: GIFV sets and short videos
|
||||
privacy: Granular, per-post privacy settings
|
||||
public: Public timelines
|
||||
features_headline: What sets Mastodon apart
|
||||
humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media.
|
||||
humane_approach_title: A more humane approach
|
||||
not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority.
|
||||
not_a_product_title: You’re a person, not a product
|
||||
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.
|
||||
real_conversation_title: Built for real conversation
|
||||
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.
|
||||
within_reach_title: Always within reach
|
||||
find_another_instance: Find another instance
|
||||
generic_description: "%{domain} is one server in the network"
|
||||
get_started: Get started
|
||||
hosted_on: Mastodon hosted on %{domain}
|
||||
learn_more: Learn more
|
||||
links: Links
|
||||
other_instances: Other instances
|
||||
other_instances: Instance list
|
||||
source_code: Source code
|
||||
status_count_after: statuses
|
||||
status_count_before: Who authored
|
||||
@ -30,6 +32,7 @@ en:
|
||||
user_count_after: users
|
||||
user_count_before: Home to
|
||||
version: Version
|
||||
what_is_mastodon: What is Mastodon?
|
||||
accounts:
|
||||
follow: Follow
|
||||
followers: Followers
|
||||
@ -173,9 +176,14 @@ en:
|
||||
desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags
|
||||
title: Closed registration message
|
||||
open:
|
||||
disabled: Disabled
|
||||
enabled: Enabled
|
||||
desc_html: Allow anyone to create an account
|
||||
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
|
||||
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><a></code> and <code><em></code>.
|
||||
@ -185,7 +193,7 @@ en:
|
||||
title: Extended site description
|
||||
site_terms:
|
||||
desc_html: Displayed on terms page<br>You can use HTML tags
|
||||
title: Site Privacy Policy
|
||||
title: Privacy policy
|
||||
site_title: Site title
|
||||
title: Site Settings
|
||||
subscriptions:
|
||||
@ -207,6 +215,7 @@ en:
|
||||
applications:
|
||||
invalid_url: The provided URL is invalid
|
||||
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
|
||||
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.
|
||||
|
@ -3,22 +3,11 @@ eo:
|
||||
about:
|
||||
about_mastodon: Mastodon estas <em>senpaga, malfermitkoda</em> socia reto. Ĝi estas <em>sencentra</em> alia eblo al komercaj servoj. Ĝi evitigas, ke unusola firmao regu vian tutan komunikadon. Elektu servilon, kiun vi fidas. Kiu ajn estas via elekto, vi povas interagi kun ĉiuj aliaj uzantoj. Iu ajn povas krei sian propran aperaĵon de Mastodon en sia servilo, kaj partopreni en la <em>socia reto</em> tute glate.
|
||||
about_this: Pri tiu aperaĵo
|
||||
apps: Aplikaĵoj
|
||||
business_email: 'Profesia retpoŝt-adreso:'
|
||||
contact: Kontakti
|
||||
description_headline: Kio estas %{domain}?
|
||||
domain_count_after: aliaj aperaĵoj
|
||||
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
|
||||
links: Ligiloj
|
||||
other_instances: Aliaj aperaĵoj
|
||||
@ -92,7 +81,7 @@ eo:
|
||||
blocking: Listo de blokitoj
|
||||
following: Listo de sekvatoj
|
||||
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>.
|
||||
notification_mailer:
|
||||
digest:
|
||||
@ -105,19 +94,19 @@ eo:
|
||||
one: "1 nova sciigo ekde via lasta vizito \U0001F418"
|
||||
other: "%{count} novaj sciigoj ekde via lasta vizito \U0001F418"
|
||||
favourite:
|
||||
body: '%{name} favoris vian mesaĝon:'
|
||||
body: "%{name} favoris vian mesaĝon:"
|
||||
subject: "%{name} favoris vian mesaĝon"
|
||||
follow:
|
||||
body: "%{name} eksekvis vin:"
|
||||
subject: "%{name} eksekvis vin"
|
||||
follow_request:
|
||||
body: "%{name} petis sekvi vin:"
|
||||
subject: '%{name} petis sekvi vin'
|
||||
subject: "%{name} petis sekvi vin"
|
||||
mention:
|
||||
body: '%{name} menciis vin en:'
|
||||
subject: '%{name} menciis vin'
|
||||
body: "%{name} menciis vin en:"
|
||||
subject: "%{name} menciis vin"
|
||||
reblog:
|
||||
body: '%{name} diskonigis vian mesaĝon:'
|
||||
body: "%{name} diskonigis vian mesaĝon:"
|
||||
subject: "%{name} diskonigis vian mesaĝon"
|
||||
pagination:
|
||||
next: Sekva
|
||||
|
@ -3,23 +3,12 @@ es:
|
||||
about:
|
||||
about_mastodon: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>.
|
||||
about_this: Acerca de esta instancia
|
||||
apps: Apps
|
||||
business_email: 'Correo de negocios:'
|
||||
closed_registrations: Los registros están actualmente cerrados en esta instancia.
|
||||
contact: Contacto
|
||||
description_headline: "¿Qué es %{domain}?"
|
||||
domain_count_after: otras instancias
|
||||
domain_count_before: Conectado a
|
||||
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
|
||||
links: Enlaces
|
||||
other_instances: Otras instancias
|
||||
@ -93,7 +82,7 @@ es:
|
||||
blocking: Lista de bloqueados
|
||||
following: Lista de seguidos
|
||||
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>.
|
||||
media_attachments:
|
||||
validations:
|
||||
|
@ -3,23 +3,12 @@ fa:
|
||||
about:
|
||||
about_mastodon: ماستدون (Mastodon) یک شبکهٔ اجتماعی <em>آزاد و کدباز</em> است. یک جایگزین <em>غیرمتمرکز</em> برای شبکههای تجاری، که نمیگذارد ارتباطهای شما را یک شرکت در انحصار خود بگیرد. یک سرور مورد اعتماد را انتخاب کنید — هر سروری که باشد، همچنان میتوانید با سرورهای دیگر ارتباط داشته باشید. هر کسی میتواند سرور ماستدون خود را راه بیندازد و در <em>شبکهٔ اجتماعی</em> سهیم شود.
|
||||
about_this: دربارهٔ این سرور
|
||||
apps: برنامهها
|
||||
business_email: 'ایمیل کاری:'
|
||||
closed_registrations: امکان ثبت نام روی این سرور هماینک فعال نیست.
|
||||
contact: تماس
|
||||
description_headline: "%{domain} چیست؟"
|
||||
domain_count_after: سرور دیگر
|
||||
domain_count_before: متصل به
|
||||
features:
|
||||
api: رابط برنامهنویسی برای برنامهها و سرویسهای دیگر
|
||||
blocks: ابزارهای قدرتمند برای مسدود یا بیصدا کردن دیگران
|
||||
characters: ۵۰۰ حرف برای هر نوشته
|
||||
chronology: نمایش نوشتههای دیگران به ترتیب زمانی
|
||||
ethics: 'اخلاقمدار: بدون تبلیغات، بدون ردگیری'
|
||||
gifv: تصاویر متحرک و ویدیوهای کوتاه
|
||||
privacy: تنظیمات حریم خصوصی جداگانه برای هر نوشته
|
||||
public: نمایش نوشتههای عمومی دیگران از همهجا
|
||||
features_headline: برگهای برندهٔ ماستدون
|
||||
get_started: آغاز کنید
|
||||
links: پیوندها
|
||||
other_instances: سرورهای دیگر
|
||||
@ -159,8 +148,6 @@ fa:
|
||||
desc_html: وقتی امکان ثبت نام روی سرور فعال نباشد در صفحهٔ اصلی نمایش مییابد<br>میتوانید HTML بنویسید
|
||||
title: پیغام برای فعالنبودن ثبت نام
|
||||
open:
|
||||
disabled: غیرفعال
|
||||
enabled: فعال
|
||||
title: امکان ثبت نام
|
||||
setting: تنظیمات
|
||||
site_description:
|
||||
|
@ -3,22 +3,11 @@ fi:
|
||||
about:
|
||||
about_mastodon: Mastodon on <em>ilmainen, avoimeen lähdekoodiin perustuva</em> sosiaalinen verkosto. <em>Hajautettu</em> vaihtoehto kaupallisille alustoille, se välttää eiskit yhden yrityksen monopolisoinnin sinun viestinnässäsi. Valitse palvelin mihin luotat — 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
|
||||
apps: Ohjelmat
|
||||
business_email: 'Business e-mail:'
|
||||
contact: Ota yhteyttä
|
||||
description_headline: Mikä on %{domain}?
|
||||
domain_count_after: muuhun palvelimeen
|
||||
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ö
|
||||
links: Linkit
|
||||
other_instances: Muut palvelimet
|
||||
@ -92,7 +81,7 @@ fi:
|
||||
blocking: Estetyt lista
|
||||
following: Seuratut lista
|
||||
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>.
|
||||
notification_mailer:
|
||||
digest:
|
||||
|
@ -3,23 +3,12 @@ fr:
|
||||
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_this: À propos de cette instance
|
||||
apps: Applications
|
||||
business_email: Courriel professionnel
|
||||
closed_registrations: Les inscriptions sont actuellement fermées sur cette instance.
|
||||
contact: Contact
|
||||
description_headline: Qu’est-ce que %{domain} ?
|
||||
domain_count_after: autres instances
|
||||
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
|
||||
links: Liens
|
||||
other_instances: Autres instances
|
||||
@ -48,7 +37,7 @@ fr:
|
||||
create:
|
||||
name: "%{account_name} a créé une note."
|
||||
outbox:
|
||||
name: "Boîte d’envoi de %{account_name}"
|
||||
name: Boîte d’envoi de %{account_name}
|
||||
summary: Liste d’activités de %{account_name}
|
||||
admin:
|
||||
accounts:
|
||||
@ -173,8 +162,6 @@ fr:
|
||||
desc_html: Affiché sur la page d’accueil lorsque les inscriptions sont fermées<br>Vous pouvez utiliser des balises HTML
|
||||
title: Message de fermeture des inscriptions
|
||||
open:
|
||||
disabled: Désactivées
|
||||
enabled: Activées
|
||||
title: Inscriptions
|
||||
setting: Paramètre
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ he:
|
||||
about:
|
||||
about_mastodon: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד — לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
|
||||
about_this: אודות שרת זה
|
||||
apps: ישומים
|
||||
business_email: 'דוא"ל עסקי:'
|
||||
closed_registrations: הרשמות סגורות לשרת זה לעת עתה.
|
||||
contact: צור קשר
|
||||
description_headline: מהו %{domain}?
|
||||
domain_count_after: שרתים אחרים
|
||||
domain_count_before: מחובר אל
|
||||
features:
|
||||
api: API פתוח לישומים ושירותים
|
||||
blocks: כלי חסימה והשתקה חזקים
|
||||
characters: 500 תווים להודעה
|
||||
chronology: הטורים כרונולוגיים
|
||||
ethics: 'תכנון מוסרי: אין פרסומות, אין מעקב'
|
||||
gifv: GIFV וסרטונים קצרים
|
||||
privacy: אפשרויות פרטיוּת נפרדות לכל הודעה
|
||||
public: טורים פומביים
|
||||
features_headline: מה מייחד קהילות מבוססות מסטודון
|
||||
get_started: בואו נתחיל
|
||||
links: קישורים
|
||||
other_instances: שרתים אחרים
|
||||
@ -167,8 +156,6 @@ he:
|
||||
desc_html: מוצג על הדף הראשי כאשר ההרשמות סגורות<br>ניתן להשתמש בתגיות HTML
|
||||
title: מסר סגירת הרשמות
|
||||
open:
|
||||
disabled: מבוטל
|
||||
enabled: מופעל
|
||||
title: הרשמה פתוחה
|
||||
setting: הגדרה
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ hr:
|
||||
about:
|
||||
about_mastodon: Mastodon je <em>besplatna, open-source</em> socijalna mreža. <em>Decentralizirana</em> alternativa komercijalnim platformama, izbjegava rizik toga da jedna tvrtka monopolizira vašu komunikaciju. Izaberite server kojem ćete vjerovati — 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
|
||||
apps: Aplikacije
|
||||
business_email: 'Poslovni e-mail:'
|
||||
closed_registrations: Registracije na ovoj instanci su trenutno zatvorene.
|
||||
contact: Kontakt
|
||||
description_headline: Što je %{domain}?
|
||||
domain_count_after: druge instance
|
||||
domain_count_before: Spojen na
|
||||
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
|
||||
links: Linkovi
|
||||
other_instances: Druge instance
|
||||
@ -94,7 +83,7 @@ hr:
|
||||
following: Lista onih koje slijedim
|
||||
muting: Lista utišanih
|
||||
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>.
|
||||
notification_mailer:
|
||||
digest:
|
||||
|
@ -3,23 +3,12 @@ id:
|
||||
about:
|
||||
about_mastodon: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai — 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
|
||||
apps: Apl
|
||||
business_email: 'E-mail bisnis:'
|
||||
closed_registrations: Pendaftaran untuk server ini sedang ditutup.
|
||||
contact: Kontak
|
||||
description_headline: Apa itu %{domain}?
|
||||
domain_count_after: server lain
|
||||
domain_count_before: Terhubung dengan
|
||||
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
|
||||
links: Link
|
||||
other_instances: Server lain
|
||||
@ -158,8 +147,6 @@ id:
|
||||
desc_html: Ditampilkan pada halaman depan saat pendaftaran ditutup<br>Anda bisa menggunakan tag HTML
|
||||
title: Pesan penutupan pendaftaran
|
||||
open:
|
||||
disabled: Dinonaktifkan
|
||||
enabled: Diaktifkan
|
||||
title: Pendaftaran terbuka
|
||||
setting: Pengaturan
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ io:
|
||||
about:
|
||||
about_mastodon: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
|
||||
about_this: Pri ta instaluro
|
||||
apps: Apliki
|
||||
business_email: 'Profesionala retpost-adreso:'
|
||||
closed_registrations: Membresko ne nun esas posible en ta instaluro.
|
||||
contact: Kontaktar
|
||||
description_headline: Quo esas %{domain}?
|
||||
domain_count_after: altra instaluri
|
||||
domain_count_before: Konektita ad
|
||||
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
|
||||
links: Ligili
|
||||
other_instances: Altra instaluri
|
||||
@ -146,8 +135,6 @@ io:
|
||||
desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags
|
||||
title: Closed registration message
|
||||
open:
|
||||
disabled: Disabled
|
||||
enabled: Enabled
|
||||
title: Open registration
|
||||
setting: Setting
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ it:
|
||||
about:
|
||||
about_mastodon: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi — 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
|
||||
apps: Applicazioni
|
||||
business_email: 'Email di lavoro:'
|
||||
closed_registrations: Al momento le iscrizioni a questo server sono chiuse.
|
||||
contact: Contatti
|
||||
description_headline: Cos'è %{domain}?
|
||||
domain_count_after: altri server
|
||||
domain_count_before: Connesso a
|
||||
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
|
||||
links: Links
|
||||
other_instances: Altri server
|
||||
@ -93,7 +82,7 @@ it:
|
||||
blocking: Lista dei bloccati
|
||||
following: Lista dei seguaci
|
||||
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>.
|
||||
media_attachments:
|
||||
validations:
|
||||
|
@ -3,23 +3,12 @@ ja:
|
||||
about:
|
||||
about_mastodon: Mastodon は<em>自由でオープンソース</em>なソーシャルネットワークです。商用プラットフォームの代替となる<em>分散型</em>を採用し、あなたのやりとりが一つの会社によって独占されるのを防ぎます。信頼できるインスタンスを選択してください — どのインスタンスを選んでも、誰とでもやりとりすることができます。 だれでも自分の Mastodon インスタンスを作ることができ、シームレスに<em>ソーシャルネットワーク</em>に参加できます。
|
||||
about_this: このインスタンスについて
|
||||
apps: アプリ
|
||||
business_email: 'ビジネスメールアドレス:'
|
||||
closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。
|
||||
contact: 連絡先
|
||||
description_headline: "%{domain} とは?"
|
||||
domain_count_after: 個のインスタンス
|
||||
domain_count_before: 接続中
|
||||
features:
|
||||
api: アプリやその他サービスにAPIを公開
|
||||
blocks: 豊富なブロックやミュート機能
|
||||
characters: 1つの投稿は500文字まで利用可能
|
||||
chronology: 時系列順のタイムライン
|
||||
ethics: 広告もトラッキングもありません
|
||||
gifv: GIFVや短い動画にも対応
|
||||
privacy: 投稿ごとに公開範囲を細かく設定可能
|
||||
public: 公開タイムライン
|
||||
features_headline: Mastodon の特徴
|
||||
get_started: 参加する
|
||||
links: リンク
|
||||
other_instances: 他のインスタンス
|
||||
@ -173,8 +162,6 @@ ja:
|
||||
desc_html: 新規登録を停止しているときにフロントページに表示されます。<br>HTMLタグが利用可能です。
|
||||
title: 新規登録停止時のメッセージ
|
||||
open:
|
||||
disabled: 無効
|
||||
enabled: 有効
|
||||
title: 新規登録を受け付ける
|
||||
setting: 設定
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ ko:
|
||||
about:
|
||||
about_mastodon: Mastodon 은<em>자유로운 오픈 소스</em>소셜 네트워크입니다. 상용 플랫폼의 대체로써 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 — 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 Mastodon 인스턴스를 만들 수 있으며, Seamless하게 <em>소셜 네트워크</em>에 참가할 수 있습니다.
|
||||
about_this: 이 인스턴스에 대해서
|
||||
apps: 어플리케이션
|
||||
business_email: '비즈니스 메일 주소:'
|
||||
closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다.
|
||||
contact: 연락처
|
||||
description_headline: "%{domain} 는 무엇인가요?"
|
||||
domain_count_after: 개의 인스턴스
|
||||
domain_count_before: 연결됨
|
||||
features:
|
||||
api: 어플리케이션이나 그 외 서비스에 API를 공개
|
||||
blocks: 강력한 차단 및 뮤트 기능
|
||||
characters: 한번에 500자까지 포스팅 가능
|
||||
chronology: 시간 순서의 타임라인
|
||||
ethics: 광고도 트래킹도 없습니다
|
||||
gifv: GIFV나 짧은 동영상도 지원
|
||||
privacy: 각 포스팅마다 공개 범위를 상세히 설정 가능
|
||||
public: 공개 타임라인
|
||||
features_headline: Mastodon 의 특징
|
||||
get_started: 참가하기
|
||||
links: 링크
|
||||
other_instances: 다른 인스턴스
|
||||
@ -151,7 +140,7 @@ ko:
|
||||
nsfw:
|
||||
'false': NSFW 꺼짐
|
||||
'true': NSFW 켜짐
|
||||
report: "신고 #%{id}"
|
||||
report: '신고 #%{id}'
|
||||
report_contents: 내용
|
||||
reported_account: 신고 대상 계정
|
||||
reported_by: 신고자
|
||||
@ -173,8 +162,6 @@ ko:
|
||||
desc_html: 신규 등록을 받지 않을 때 프론트 페이지에 표시됩니다. <br>HTML 태그를 사용할 수 있습니다.
|
||||
title: 신규 등록 정지 시 메시지
|
||||
open:
|
||||
disabled: 꺼짐
|
||||
enabled: 켜짐
|
||||
title: 신규 등록을 받음
|
||||
setting: 설정
|
||||
site_description:
|
||||
@ -301,7 +288,7 @@ ko:
|
||||
one: "1건의 새로운 알림 \U0001F418"
|
||||
other: "%{count}건의 새로운 알림 \U0001F418"
|
||||
favourite:
|
||||
body: '%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다.'
|
||||
body: "%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다."
|
||||
subject: "%{name} 님이 내 Toot을 즐겨찾기에 등록했습니다"
|
||||
follow:
|
||||
body: "%{name} 님이 나를 팔로우 했습니다"
|
||||
@ -323,7 +310,7 @@ ko:
|
||||
acct: 아이디@도메인을 입력해 주십시오
|
||||
missing_resource: 리디렉션 대상을 찾을 수 없습니다
|
||||
proceed: 팔로우 하기
|
||||
prompt: '팔로우 하려 하고 있습니다'
|
||||
prompt: 팔로우 하려 하고 있습니다
|
||||
sessions:
|
||||
activity: 마지막 활동
|
||||
browser: 브라우저
|
||||
|
@ -3,23 +3,12 @@ nl:
|
||||
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 — 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
|
||||
apps: Apps
|
||||
business_email: 'E-mailadres:'
|
||||
closed_registrations: Registreren op deze server is momenteel uitgeschakeld.
|
||||
contact: Contact
|
||||
description_headline: Wat is %{domain}?
|
||||
domain_count_after: andere servers
|
||||
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
|
||||
links: Links
|
||||
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
|
||||
title: Bericht wanneer registratie is uitgeschakeld
|
||||
open:
|
||||
disabled: Uitgeschakeld
|
||||
enabled: Ingeschakeld
|
||||
title: Open registratie
|
||||
setting: Instelling
|
||||
site_description:
|
||||
@ -177,7 +164,7 @@ nl:
|
||||
following: Volglijst
|
||||
muting: Negeerlijst
|
||||
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>.
|
||||
notification_mailer:
|
||||
digest:
|
||||
@ -286,7 +273,7 @@ nl:
|
||||
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."
|
||||
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_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
|
||||
|
@ -3,23 +3,12 @@
|
||||
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å — 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
|
||||
apps: Applikasjoner
|
||||
business_email: 'Bedriftsepost:'
|
||||
closed_registrations: Registreringer er for øyeblikket lukket på denne instansen.
|
||||
contact: Kontakt
|
||||
description_headline: Hva er %{domain}?
|
||||
domain_count_after: andre instanser
|
||||
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
|
||||
links: Lenker
|
||||
other_instances: Andre instanser
|
||||
@ -160,8 +149,6 @@
|
||||
desc_html: Vises på forsiden når registreringer er lukket<br>Du kan bruke HTML-tagger
|
||||
title: Melding for lukket registrering
|
||||
open:
|
||||
disabled: På
|
||||
enabled: Av
|
||||
title: Åpen registrering
|
||||
setting: Innstilling
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ oc:
|
||||
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 qu’una 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 d’aquesta instància
|
||||
apps: Aplicacions
|
||||
business_email: 'Corrièl professional :'
|
||||
closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància.
|
||||
contact: Contacte
|
||||
description_headline: Qué es %{domain} ?
|
||||
domain_count_after: autras instàncias
|
||||
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 d’actualitat 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 d’actualitat publics
|
||||
features_headline: Çò que fa que Mastodon es diferent
|
||||
get_started: Venètz al malhum
|
||||
links: Ligams
|
||||
other_instances: Autras instàncias
|
||||
@ -167,8 +156,6 @@ oc:
|
||||
desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.<br>Podètz utilizar de balisas HTML
|
||||
title: Messatge de barradura de las inscripcions
|
||||
open:
|
||||
disabled: Desactivadas
|
||||
enabled: Activadas
|
||||
title: Inscripcions
|
||||
setting: Paramètre
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ pl:
|
||||
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 — 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
|
||||
apps: Aplikacje
|
||||
business_email: 'Służbowy adres e-mail:'
|
||||
closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta.
|
||||
contact: Kontakt
|
||||
description_headline: Czym jest %{domain}?
|
||||
domain_count_after: instancji
|
||||
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!
|
||||
links: Odnośniki
|
||||
other_instances: Inne instancje
|
||||
@ -48,7 +37,7 @@ pl:
|
||||
create:
|
||||
name: "%{account_name} utworzył(a) wpis."
|
||||
outbox:
|
||||
name: "Skrzynka %{account_name}"
|
||||
name: Skrzynka %{account_name}
|
||||
summary: Zbiór aktywności użytkownika %{account_name}.
|
||||
admin:
|
||||
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
|
||||
title: Wiadomość o nieaktywnej rejestracji
|
||||
open:
|
||||
disabled: Nieaktywna
|
||||
enabled: Aktywna
|
||||
title: Otwarta rejestracja
|
||||
setting: Ustawienie
|
||||
site_description:
|
||||
@ -198,7 +185,7 @@ pl:
|
||||
title: Administracja
|
||||
admin_mailer:
|
||||
new_report:
|
||||
body: "Użytkownik %{reporter} zgłosił %{target}"
|
||||
body: Użytkownik %{reporter} zgłosił %{target}
|
||||
subject: Nowe zgłoszenie na %{instance} (#%{id})
|
||||
application_mailer:
|
||||
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>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:
|
||||
formats:
|
||||
default: "%b %d, %Y, %H:%M"
|
||||
|
@ -3,23 +3,12 @@ pt-BR:
|
||||
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 — 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
|
||||
apps: Aplicações
|
||||
business_email: 'Email comercial:'
|
||||
closed_registrations: Registros estão fechadas para essa instância.
|
||||
contact: Contato
|
||||
description_headline: O que é %{domain}?
|
||||
domain_count_after: outras instâncias
|
||||
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
|
||||
links: Links
|
||||
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
|
||||
title: Mensagem de registro fechados
|
||||
open:
|
||||
disabled: Desabilitado
|
||||
enabled: Habilitado
|
||||
title: Aberto para registro
|
||||
setting: Preferências
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ pt:
|
||||
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_this: Sobre esta instância
|
||||
apps: Aplicações
|
||||
business_email: 'Email comercial:'
|
||||
closed_registrations: Novos registos estão fechados nesta instância.
|
||||
contact: Contacto
|
||||
description_headline: O que é o %{domain}?
|
||||
domain_count_after: outras instâncias
|
||||
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
|
||||
links: Links
|
||||
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
|
||||
title: Mensagem de registos encerrados
|
||||
open:
|
||||
disabled: Desabilitado
|
||||
enabled: Habilitado
|
||||
title: Aceitar novos registos
|
||||
setting: Preferências
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ ru:
|
||||
about:
|
||||
about_mastodon: Mastodon - это <em>свободная</em> социальная сеть с <em>открытым исходным кодом</em>. Как <em>децентрализованная</em> альтернатива коммерческим платформам, Mastodon предотвращает риск монополизации Вашего общения одной компанией. Выберите сервер, которому Вы доверяете — что бы Вы ни выбрали, Вы сможете общаться со всеми остальными. Любой может запустить свой собственный узел Mastodon и участвовать в <em>социальной сети</em> совершенно бесшовно.
|
||||
about_this: Об этом узле
|
||||
apps: Приложения
|
||||
business_email: 'Деловой e-mail:'
|
||||
closed_registrations: В данный момент регистрация на этом узле закрыта.
|
||||
contact: Связаться
|
||||
description_headline: Что такое %{domain}?
|
||||
domain_count_after: другими узлами
|
||||
domain_count_before: Связан с
|
||||
features:
|
||||
api: Открытый API для приложений и сервисов
|
||||
blocks: Продвинутые инструменты блокирования и глушения
|
||||
characters: 500 символов на пост
|
||||
chronology: Хронологические ленты
|
||||
ethics: 'Этичный дизайн: нет рекламы, нет слежения'
|
||||
gifv: GIFV и короткие видео
|
||||
privacy: Тонкие настройки приватности для каждого поста
|
||||
public: Публичные ленты
|
||||
features_headline: Что выделяет Mastodon
|
||||
get_started: Начать
|
||||
links: Ссылки
|
||||
other_instances: Другие узлы
|
||||
@ -141,8 +130,6 @@ ru:
|
||||
desc_html: Отображается на титульной странице, когда закрыта регистрация<br>Можно использовать HTML-теги
|
||||
title: Сообщение о закрытой регистрации
|
||||
open:
|
||||
disabled: Закрыта
|
||||
enabled: Открыта
|
||||
title: Открыть регистрацию
|
||||
setting: Настройка
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ th:
|
||||
about:
|
||||
about_mastodon: แมสโทดอน เป็น <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค. เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ — ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น.
|
||||
about_this: เกี่ยวกับอินซะแตนซ์นี้
|
||||
apps: แอ๊ฟ
|
||||
business_email: 'อีเมล์ธุรกิจ:'
|
||||
closed_registrations: อินซะแตนซ์นี้ปิดรับลงทะเบียนแล้ว.
|
||||
contact: ติดต่อ
|
||||
description_headline: โดเมนคือ %{domain} ?
|
||||
domain_count_after: อินซะแตนซ์อื่นๆ
|
||||
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: เริ่มกันเลย
|
||||
links: ลิงก์
|
||||
other_instances: อินซะแตนซ์อื่นๆ
|
||||
@ -160,8 +149,6 @@ th:
|
||||
desc_html: Displayed on frontpage when registrations are closed<br> ใช้ HTML tags ได้
|
||||
title: ปิดข้อความลงทะเบียน
|
||||
open:
|
||||
disabled: ปิดการใช้งาน
|
||||
enabled: ปิดใช้งาน
|
||||
title: เปิดรับลงทะเบียน
|
||||
setting: ตั้งค่า
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ tr:
|
||||
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_this: Bu sunucu hakkında
|
||||
apps: Uygulamalar
|
||||
business_email: 'İş e-postası:'
|
||||
closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır.
|
||||
contact: İletişim
|
||||
description_headline: Peki %{domain} nedir?
|
||||
domain_count_after: sunucu var.
|
||||
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
|
||||
links: Bağlantılar
|
||||
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.
|
||||
title: Kayıt alımları kapatılma mesajı
|
||||
open:
|
||||
disabled: Kapalı
|
||||
enabled: Açık
|
||||
title: Kayıt alımları
|
||||
setting: Ayar adı
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ uk:
|
||||
about:
|
||||
about_mastodon: Mastodon - це <em>вільна</em> соціальна мережа з <em>відкритим вихідним кодом</em>. Вона є <em>децентралізованою</em> альтернативою комерційним платформам, що дозволяє уникнути ризиків монополізації вашого спілкування однією компанією. Виберіть сервер, якому ви довіряєте — що б ви не вибрали, Ви зможете спілкуватись з усіма іншими. Будь-який користувач може запустити власну інстанцію Mastodon та без проблем брати участь в <em>соціальній мережі</em>.
|
||||
about_this: Про цю інстанцію
|
||||
apps: Додатки
|
||||
business_email: 'Діловий email:'
|
||||
closed_registrations: На даний момент реєстрація на цій інстанції закрита.
|
||||
contact: Зв'язатися
|
||||
description_headline: Що таке %{domain}?
|
||||
domain_count_after: іншими інстанціями
|
||||
domain_count_before: Зв'язаний з
|
||||
features:
|
||||
api: Відкритий API для додаків та сервісів
|
||||
blocks: Продвинуті інструменти самомодерації
|
||||
characters: 500 символів на пост
|
||||
chronology: Хронологічні стрічки
|
||||
ethics: 'Этичний дизайн: немає реклами, немає стеження'
|
||||
gifv: GIFV та короткі відео
|
||||
privacy: Тонкі налаштування приватності для кожного поста
|
||||
public: Публічні стрічки
|
||||
features_headline: Що виділяє Mastodon
|
||||
get_started: Почати
|
||||
links: Посилання
|
||||
other_instances: Інші інстанції
|
||||
@ -141,8 +130,6 @@ uk:
|
||||
desc_html: Відображається на титульній сторінці, коли реєстрація закрита <br>Можна використовувати HTML-теги
|
||||
title: Повідомлення про закриту реєстрацію
|
||||
open:
|
||||
disabled: Закрита
|
||||
enabled: Відкрита
|
||||
title: Відкрити реєстрацію
|
||||
setting: Налаштування
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ zh-CN:
|
||||
about:
|
||||
about_mastodon: Mastodon(长毛象)是一个<em>自由、开放源码</em>的社交网站。它是一个分布式的服务,避免你的通信被单一商业机构垄断操控。请你选择一家你信任的 Mastodon 实例,在上面创建帐号,然后你就可以和任一 Mastodon 实例上的用户互通,享受无缝的<em>社交</em>交流。
|
||||
about_this: 关于本实例
|
||||
apps: 应用程序
|
||||
business_email: 商业电邮︰
|
||||
closed_registrations: 这个实例目前不开放注册 _(:3」∠)_
|
||||
contact: 联络
|
||||
description_headline: 关于 %{domain}
|
||||
domain_count_after: 个其它实例
|
||||
domain_count_before: 现已接入
|
||||
features:
|
||||
api: 开放 API,供各式应用程序及服务接入
|
||||
blocks: 完善的封锁用户、静音功能
|
||||
characters: 每篇嘟文最多 500 字
|
||||
chronology: 纯粹按时间排序,不作多余处理
|
||||
ethics: 良心设计︰没有广告,不追踪你的使用行为
|
||||
gifv: 支持显示 GIFV 动图小视频
|
||||
privacy: 可逐篇嘟文设置隐私
|
||||
public: 提供公共时间轴
|
||||
features_headline: 是什么让 Mastodon 与众不同
|
||||
get_started: 上手使用
|
||||
links: 链接
|
||||
other_instances: 其它实例
|
||||
@ -166,8 +155,6 @@ zh-CN:
|
||||
desc_html: 当本站暂停接受注册时,会显示这个消息。<br/> 可使用 HTML
|
||||
title: 暂停注册消息
|
||||
open:
|
||||
disabled: 停用
|
||||
enabled: 启用
|
||||
title: 开放注册
|
||||
setting: 设置
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ zh-HK:
|
||||
about:
|
||||
about_mastodon: Mastodon(萬象)是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
|
||||
about_this: 關於本服務站
|
||||
apps: 應用程式
|
||||
business_email: 聯絡網站管理者︰
|
||||
closed_registrations: 本服務站暫時停止接受登記。
|
||||
contact: 聯絡
|
||||
description_headline: 關於 %{domain}
|
||||
domain_count_after: 個其他服務站
|
||||
domain_count_before: 已連接至
|
||||
features:
|
||||
api: 開放 API,供各式應用程式及服務連入
|
||||
blocks: 完善的封鎖用戶、靜音功能
|
||||
characters: 每篇文章最多 500 字
|
||||
chronology: 時間軸忠實按時排序,不多餘處理
|
||||
ethics: 良心設計︰無廣告,不追蹤用戶
|
||||
gifv: 支援顯示 GIFV 短片圖組
|
||||
privacy: 可逐篇文章設定私隱度
|
||||
public: 公共時間軸
|
||||
features_headline: 甚麼讓 Mastodon 與眾不同
|
||||
get_started: 立即登記
|
||||
links: 連結
|
||||
other_instances: 其他服務站
|
||||
@ -159,8 +148,6 @@ zh-HK:
|
||||
desc_html: 當本站暫停接受註冊時,會顯示這個訊息。<br/> 可使用 HTML
|
||||
title: 暫停註冊訊息
|
||||
open:
|
||||
disabled: 停用
|
||||
enabled: 啟用
|
||||
title: 開放註冊
|
||||
setting: 設定
|
||||
site_description:
|
||||
|
@ -3,23 +3,12 @@ zh-TW:
|
||||
about:
|
||||
about_mastodon: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的<em>社群網路</em>交流。
|
||||
about_this: 關於本服務站
|
||||
apps: 應用程式
|
||||
business_email: 商務信箱︰
|
||||
closed_registrations: 本服務站暫時停止接受註冊。
|
||||
contact: 聯絡我們
|
||||
description_headline: 關於 %{domain}
|
||||
domain_count_after: 個服務站相連
|
||||
domain_count_before: 與其他
|
||||
features:
|
||||
api: 開放 API,供各式應用程式及服務串接
|
||||
blocks: 完善的封鎖使用者、靜音功能
|
||||
characters: 每篇文章最多 500 字
|
||||
chronology: 時間軸按時序顯示文章,不作多餘處理
|
||||
ethics: 良心設計︰沒有廣告,不追蹤您的使用行為
|
||||
gifv: 支援顯示 GIFV 短片
|
||||
privacy: 可逐篇文章調整隱私設定
|
||||
public: 公開時間軸
|
||||
features_headline: Mastodon 與眾不同之處
|
||||
get_started: 立即註冊
|
||||
links: 連結
|
||||
other_instances: 其他服務站
|
||||
@ -120,8 +109,6 @@ zh-TW:
|
||||
desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤。
|
||||
title: 關閉註冊訊息
|
||||
open:
|
||||
disabled: 停用
|
||||
enabled: 啟用
|
||||
title: 開放註冊
|
||||
setting: 設定
|
||||
site_description:
|
||||
|
@ -16,6 +16,7 @@ defaults: &defaults
|
||||
open_registrations: true
|
||||
closed_registrations_message: ''
|
||||
open_deletion: true
|
||||
timeline_preview: true
|
||||
boost_modal: false
|
||||
auto_play_gif: false
|
||||
delete_modal: true
|
||||
|
@ -161,16 +161,12 @@ namespace :mastodon do
|
||||
namespace :settings do
|
||||
desc 'Open registrations on this instance'
|
||||
task open_registrations: :environment do
|
||||
setting = Setting.where(var: 'open_registrations').first
|
||||
setting.value = true
|
||||
setting.save
|
||||
Setting.open_registrations = true
|
||||
end
|
||||
|
||||
desc 'Close registrations on this instance'
|
||||
task close_registrations: :environment do
|
||||
setting = Setting.where(var: 'open_registrations').first
|
||||
setting.value = false
|
||||
setting.save
|
||||
Setting.open_registrations = false
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -12,7 +12,7 @@ describe 'Localization' do
|
||||
|
||||
get "/about", headers: headers
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.about_mastodon', locale: 'zh-HK')
|
||||
I18n.t('about.about_mastodon_html', locale: 'zh-HK')
|
||||
)
|
||||
end
|
||||
|
||||
@ -21,7 +21,7 @@ describe 'Localization' do
|
||||
|
||||
get "/about", headers: headers
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.about_mastodon', locale: 'es')
|
||||
I18n.t('about.about_mastodon_html', locale: 'es')
|
||||
)
|
||||
end
|
||||
it 'falls back to english when locale is missing' do
|
||||
@ -29,7 +29,7 @@ describe 'Localization' do
|
||||
|
||||
get "/about", headers: headers
|
||||
expect(response.body).to include(
|
||||
I18n.t('about.about_mastodon', locale: 'en')
|
||||
I18n.t('about.about_mastodon_html', locale: 'en')
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@ -10,10 +10,11 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do
|
||||
|
||||
it 'has valid open graph tags' do
|
||||
instance_presenter = double(:instance_presenter,
|
||||
site_title: 'something',
|
||||
site_description: 'something',
|
||||
version_number: '1.0',
|
||||
open_registrations: false,
|
||||
closed_registrations_message: 'yes',
|
||||
)
|
||||
closed_registrations_message: 'yes')
|
||||
assign(:instance_presenter, instance_presenter)
|
||||
render
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user