diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index c0addbeccc680897167676ebc9402a1710e369c0..47690e81eb925333a422c4e9a5db6f97d03298d6 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -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 diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index f27a1f4d450c39640b0e74889ebf224d419de371..29b590d7a3d19c4d4094129add30ac3e499c2d67 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -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 diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 218da69066f7942f912194d0921bc13e57b8eaa0..8a8b9ec76ba54c5d6e25229aaabe7a3d90b1a663 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -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 diff --git a/app/javascript/fonts/montserrat/Montserrat-Medium.ttf b/app/javascript/fonts/montserrat/Montserrat-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88d70b89c3f2740e9b9c80881616136b5f697091 Binary files /dev/null and b/app/javascript/fonts/montserrat/Montserrat-Medium.ttf differ diff --git a/app/javascript/images/cloud2.png b/app/javascript/images/cloud2.png new file mode 100644 index 0000000000000000000000000000000000000000..f325ca6de0967bec0b77f532cf7e961adb89b99a Binary files /dev/null and b/app/javascript/images/cloud2.png differ diff --git a/app/javascript/images/cloud3.png b/app/javascript/images/cloud3.png new file mode 100644 index 0000000000000000000000000000000000000000..ab194d0b857a946094418fdf4bd87caadb8d8122 Binary files /dev/null and b/app/javascript/images/cloud3.png differ diff --git a/app/javascript/images/cloud4.png b/app/javascript/images/cloud4.png new file mode 100644 index 0000000000000000000000000000000000000000..98323f5a271555a8e5cc72a8a166ddbd8de7eddc Binary files /dev/null and b/app/javascript/images/cloud4.png differ diff --git a/app/javascript/images/elephant-fren.png b/app/javascript/images/elephant-fren.png new file mode 100644 index 0000000000000000000000000000000000000000..3b64edf084c020002a00022bd188837a82ed0727 Binary files /dev/null and b/app/javascript/images/elephant-fren.png differ diff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg index c233db842819caf92698b419dc1450c8c9d18c3d..16cb3a94407434b5f6b411b2672d61c84828baa0 100644 --- a/app/javascript/images/logo.svg +++ b/app/javascript/images/logo.svg @@ -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> \ No newline at end of file +<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> diff --git a/app/javascript/mastodon/components/dropdown_menu.js b/app/javascript/mastodon/components/dropdown_menu.js index 12e1b44fa2225d5da2e80e8833aa550086913fe0..98323b0691dc16aea5831dca3589a6acc4a4ce63 100644 --- a/app/javascript/mastodon/components/dropdown_menu.js +++ b/app/javascript/mastodon/components/dropdown_menu.js @@ -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 { expanded } = this.state; + 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}> diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index 75222e9650a4c3b9dc9e726c874ff96e88873579..89a358e384c0479819fd21777107f43e9ccccf1a 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -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 = { diff --git a/app/javascript/mastodon/components/permalink.js b/app/javascript/mastodon/components/permalink.js index 0b7d0a65ad9df83aad7a34a31f8cab7684592c34..d726d37a20a3e912c728a226996d44d42fb4374a 100644 --- a/app/javascript/mastodon/components/permalink.js +++ b/app/javascript/mastodon/components/permalink.js @@ -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> ); diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index df771f5a8f669795c0c3b8f1fdfb0b1182d1d327..6b9fdd2afe794a81572c125fd4465f022d9dddcd 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -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> diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index fd7c990544ece07de84e9bfaad91297003028bc8..7bb394e71bd1aabe7f6fba4ac228caadf812b34b 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -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> ); diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js index 02b4c84020c8ff3105afd6f84fba6b9967dceba1..1b803a22ec08ceae8223b98f572132e0945c52e0 100644 --- a/app/javascript/mastodon/components/status_content.js +++ b/app/javascript/mastodon/components/status_content.js @@ -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} diff --git a/app/javascript/mastodon/components/video_player.js b/app/javascript/mastodon/components/video_player.js index 452a843196e300bdda839d73db60fcf83cd36f6b..999cf42d9e51b8174ee41aa64416307c4c6c3046 100644 --- a/app/javascript/mastodon/components/video_player.js +++ b/app/javascript/mastodon/components/video_player.js @@ -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 = ( - <div className='status__video-player-expand'> - <IconButton overlay title={intl.formatMessage(messages.expand_video)} icon='expand' onClick={this.handleExpand} /> - </div> - ); + 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> diff --git a/app/javascript/mastodon/containers/timeline_container.js b/app/javascript/mastodon/containers/timeline_container.js new file mode 100644 index 0000000000000000000000000000000000000000..6b545ef0922035dd37bf371fd8ac6a124450672d --- /dev/null +++ b/app/javascript/mastodon/containers/timeline_container.js @@ -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> + ); + } + +} diff --git a/app/javascript/mastodon/features/standalone/public_timeline/index.js b/app/javascript/mastodon/features/standalone/public_timeline/index.js new file mode 100644 index 0000000000000000000000000000000000000000..de4b5320a5a95f3c4f973edeae4a73caf6de4052 --- /dev/null +++ b/app/javascript/mastodon/features/standalone/public_timeline/index.js @@ -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> + ); + } + +} diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 254250a3b9589d5fb52c646a7366e7f8be4f555c..0b00da39d50cedf1fe60a25ade78c75d1844106a 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -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() { diff --git a/app/javascript/styles/about.scss b/app/javascript/styles/about.scss index 3512bdcb45d877515b7686ed77c19b14ee98bf77..b9c0183911da8021fa70abad3a947e2af8224eda 100644 --- a/app/javascript/styles/about.scss +++ b/app/javascript/styles/about.scss @@ -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; + + &:first-child { + padding-top: 0; + } - .features-list__column { - flex: 1 1 0; + .visual { + flex: 0 0 auto; + display: flex; + align-items: center; + margin-left: 15px; - ul { - list-style: none; + .fa { + display: block; + color: $ui-primary-color; + font-size: 48px; } + } - li { - margin: 0; + .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; - - .mascot { - flex: 1 1 auto; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; +.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; - img { - display: block; + .mascot-container { + max-width: 800px; margin: 0 auto; - max-width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 100%; + } + + .mascot { + position: absolute; + bottom: -14px; + width: auto; height: auto; + left: 60px; + z-index: 3; + } + } + + p, + li { + font: inherit; + font-weight: inherit; + margin-bottom: 0; + } + + .header { + line-height: 30px; + overflow: hidden; + + .container { + display: flex; + justify-content: space-between; + } + + .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 { + 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; } } - .simple_form, - .closed-registrations-message { - width: 300px; + #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: rgba(darken($ui-base-color, 7%), 0.5); - padding: 14px; - border-radius: 4px; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.4); + background: $ui-base-color; + overflow: hidden; + box-shadow: 0 0 6px rgba($black, 0.1); - .actions { - margin-bottom: 0; + .column { + padding: 0; + border-radius: 4px; + overflow: hidden; + height: 100%; } - .info { - text-align: center; + .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; } } } - @media screen and (max-width: 625px) { - .mascot { + .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; } + } - .simple_form, - .closed-registrations-message { - flex: auto; + @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); + } } diff --git a/app/javascript/styles/basics.scss b/app/javascript/styles/basics.scss index 4da698e816922dc28ad09c9ddd42e61919be3e9d..182ea36a436d8c910660ed979d8b28ed48ad08d3 100644 --- a/app/javascript/styles/basics.scss +++ b/app/javascript/styles/basics.scss @@ -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; diff --git a/app/javascript/styles/boost.scss b/app/javascript/styles/boost.scss index 8d6478e10742a38364d055953468f3b4a353a7b1..5eb3149ef98f3a52eaa25558794f4e4ebaec2771 100644 --- a/app/javascript/styles/boost.scss +++ b/app/javascript/styles/boost.scss @@ -12,3 +12,7 @@ button.icon-button i.fa-retweet { background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color(lighten($ui-base-color, 33%))}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-highlight-color)}' stroke-width='0'/></svg>"); } } + +button.icon-button.disabled i.fa-retweet { + background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color(lighten($ui-base-color, 13%))}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($ui-highlight-color)}' stroke-width='0'/></svg>"); +} diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss index def69d250dc00b96f3234c951030f2e7f329ad64..8d0350eb600ece49445f7fbd4cd949459b0aad38 100644 --- a/app/javascript/styles/components.scss +++ b/app/javascript/styles/components.scss @@ -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 { diff --git a/app/javascript/styles/containers.scss b/app/javascript/styles/containers.scss index 68f73e0c05b6472198d868017c0fe021b0ce6bba..44d4c11187c461e0fe313f2465e7952909d4c92b 100644 --- a/app/javascript/styles/containers.scss +++ b/app/javascript/styles/containers.scss @@ -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; } } } diff --git a/app/javascript/styles/fonts/montserrat.scss b/app/javascript/styles/fonts/montserrat.scss index e4012ab02ef5da3d2f20bc9381a36723858ecc84..206f1865e5e1e59349605a8884ae2b6c0a3e8f6e 100644 --- a/app/javascript/styles/fonts/montserrat.scss +++ b/app/javascript/styles/fonts/montserrat.scss @@ -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; +} diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss index 414dc4fe872e069a22321e72f99febc60d2bdf7e..e723b50ff3362bc9cca0e513113d20332d3b6e06 100644 --- a/app/javascript/styles/forms.scss +++ b/app/javascript/styles/forms.scss @@ -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 { diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index 63ef23d5d73f765e519f327de35d84321a7de889..5d5be58bae07d231978792bdffbadaf71d1d0e31 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -5,6 +5,7 @@ class InstancePresenter :closed_registrations_message, :site_contact_email, :open_registrations, + :site_title, :site_description, :site_extended_description, :site_terms, diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 49ff9e377882b30df61fe8a4843f7c136eda43a7..6751c94118641b8d4988f5f8efc34568f0840391 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -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 diff --git a/app/views/about/_features.html.haml b/app/views/about/_features.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..8fbc6b7607334ae839704962f6555263c7ccf3ff --- /dev/null +++ b/app/views/about/_features.html.haml @@ -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' diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 4f38c1eccfe36cf82126ac041eb6387d20625588..eeeb0088fa77ef493fd82af6ce44b9a1e6c4266c 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -1,10 +1,13 @@ = simple_form_for(new_user, url: user_registration_path) do |f| = f.simple_fields_for :account do |account_fields| - = 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') } + .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) diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index d15b04163f1c64b5568a49cfa9ef281f469330e9..f75f87c99bcb6a860f5fda301893fe934ec27e6a 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -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 - %h1 - = image_tag asset_pack_path('logo.png') - = Setting.site_title +.landing-page + .header-wrapper + .mascot-container + = image_tag asset_pack_path('elephant-fren.png'), class: 'mascot' - %p!= t('about.about_mastodon') + .header + .container.links + .brand + = link_to root_url do + = image_tag asset_pack_path('logo.svg') + Mastodon - .screenshot-with-signup - .mascot= image_tag asset_pack_path('fluffy-elephant-friend.png') + %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/' - - if @instance_presenter.open_registrations - = render 'registration' - - else - .closed-registrations-message - - if @instance_presenter.closed_registrations_message.blank? - %p= t('about.closed_registrations') + .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 + = @instance_presenter.site_title + %small= t 'about.hosted_on', domain: site_hostname + - if @instance_presenter.open_registrations + = render 'registration' - 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 + .closed-registrations-message + %div + - if @instance_presenter.closed_registrations_message.blank? + %p= t('about.closed_registrations') + - else + = @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') + .learn-more-cta + .container + %h3= t('about.description_headline', domain: site_hostname) + %p= @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname) - .features-list - .features-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' + .features + .container + - if Setting.timeline_preview + #mastodon-timeline{ data: { props: Oj.dump(default_props) } } - - unless @instance_presenter.site_description.blank? - %h3= t('about.description_headline', domain: site_hostname) - %p!= @instance_presenter.site_description - - .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' - · - = 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' + .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' + = " (#{@instance_presenter.version_number})" diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index 3096a958da68378efaa37a2c8ffbca772b03c024..59192530b7ee434d2936edec63e991bd06037b09 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -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 diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index 82d5483dd574b15e8929633225481e0fb7d222aa..af7ee2b286cda4ef21a194834950f130c156d5f0 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -5,7 +5,10 @@ = render 'shared/error_messages', object: resource = f.simple_fields_for :account do |ff| - = ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') } + .input-with-append + = ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') } + .append + = "@#{site_hostname}" = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } = f.input :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' diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml index e5429a8ed0e337abdce73901146d14e333f9420d..b4f1bd0f35a126a3966deebae839ead9eb133874 100644 --- a/app/views/layouts/auth.html.haml +++ b/app/views/layouts/auth.html.haml @@ -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' diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 4d045dee1eb54772f96f4deb1a08e049c8ddcbee..d395dc9c37103d152466d06b01b4945475ae2f0d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -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: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 76d6a260514589b762501ba0f67d1418727bbec5..042d609b0335e14ef1d3e1e211685847d4088516 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -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: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 2fbc63ef9b45c1f2a99a25533d37d7345c476f9a..10c34498bfe137fb327a201b489e665f5c888bd8 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -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 diff --git a/config/locales/de.yml b/config/locales/de.yml index f2841d0b7f76023c530c00ef488978f781eefaae..2bdb87708e0aaa22d2549f31ab0167712b79c52f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -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: diff --git a/config/locales/en.yml b/config/locales/en.yml index 8bb893d1c339bae29fd0fa82a569614378646025..e33dde0389e6e1a9b0a916de4d10a9e0e85ff62f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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. diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 8b42415df51d2b1eea3fbb23990124259faedc82..d47a5db0edf28e4e16f1e23fa045f779db804097 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -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 diff --git a/config/locales/es.yml b/config/locales/es.yml index f587bb4ec96fd5607a5148e8d9728e6a0e0b8acd..c051c9a08d39513e07a53997664c18cbc492c82f 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -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: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 515443608e8fabe68f55abd19049f83d678c6cc0..6f0bd0839e933cfc0fcbbced83272cde5061ac49 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -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: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index c20bf690b125f828d4be13dd7e3966408392d3b2..a2488530fec12956918f2aa78bcce113402f8282 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -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: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index fcf5f6f9e358045e0f85e049ece1648197e27418..9eeafaa6e94c753996b8b6f70e94e18b1867bed5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -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: diff --git a/config/locales/he.yml b/config/locales/he.yml index ec7d972ec8f660282defa7c609879eff5cdb3e31..760ddac00397acccbf4f3c953cc3ea695e04d526 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -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: diff --git a/config/locales/hr.yml b/config/locales/hr.yml index f873fc7ed427f8169847cd41cad2088ebd9807f2..8297ca6296fd43b51af5118fcf7ed009503fd829 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -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: diff --git a/config/locales/id.yml b/config/locales/id.yml index fc4ffd046cc3eb9dabf22d5809d2a23c8bcadd0e..4bcd8f2ed7df7e92d90a109e72498801e6718637 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -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: diff --git a/config/locales/io.yml b/config/locales/io.yml index db430b0febcb51a2dde6b9d10316bd7260021425..8eb48c30335d030d86b2120e52486a9b453d3d93 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -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: diff --git a/config/locales/it.yml b/config/locales/it.yml index a96a459df388b16594187933b151ba8791e0ec14..5c014c61d2ce43f285518de1232417f598d54d61 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -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: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 9cb2428f70cd07bf83d111daa8b92fd5a6fdd84a..5b91aa75d085f1db848ed6ef1b31f0c98f5b2684 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -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: @@ -395,7 +382,7 @@ ja: <h2>プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼</h2> <h3 id="collect">ã©ã®ã‚ˆã†ãªæƒ…å ±ã‚’åŽé›†ã™ã‚‹ã®ã§ã™ã‹ï¼Ÿ</h3> - + <p>ã‚ãªãŸãŒã“ã®ã‚µã‚¤ãƒˆã«ç™»éŒ²ã™ã‚‹ã¨ã€ã“ã“ã§å…±æœ‰ã•ã‚ŒãŸæƒ…å ±ã‚’èªã‚“ã ã‚Šã€æ›¸ã„ãŸã‚Šã€è©•ä¾¡ã—ãŸã‚Šã—ã¦ã€ãƒ•ã‚©ãƒ¼ãƒ©ãƒ ã§ã®æƒ…å ±ã‚’é›†ã‚る事ãŒã§ãã¾ã™ã€‚</p> <p>ã“ã®ã‚µã‚¤ãƒˆã«ç™»éŒ²ã™ã‚‹éš›ã«ã¯ã€åå‰ã¨ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…¥åŠ›ã‚’求ã‚ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ãŸã ã—ã€ç™»éŒ²ã‚’ã™ã‚‹ã“ã¨ãªãã“ã®ã‚µã‚¤ãƒˆã‚’利用ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€å›ºæœ‰ã®ãƒªãƒ³ã‚¯ã‚’å«ã‚“ã メールã§ç¢ºèªã•ã‚Œã¾ã™ã€‚ãã®ãƒªãƒ³ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå ´åˆã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’制御ã™ã‚‹ã“ã¨ã¨ãªã‚Šã¾ã™ã€‚</p> diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 844e78908ba5882f1a6aa96393f485550b5ba8a7..c8ad38d418993e524bbbe96511490086cb84ed4e 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -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: 브ë¼ìš°ì € diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 306ce6b1f546dda9c4079972857be1ac445a6d2e..633061b064b62e4ea3559b162ba54503267b4e73 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -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: @@ -89,7 +76,7 @@ nl: admin_mailer: new_report: body: "%{reporter} heeft %{target} gerapporteerd" - subject: Nieuwe toots gerapporteerd op %{instance} (#%{id}) + subject: Nieuwe toots gerapporteerd op %{instance} (#%{id}) application_mailer: settings: 'E-mailvoorkeuren wijzigen: %{link}' signature: Mastodon-meldingen van %{instance} @@ -131,7 +118,7 @@ nl: bad_password_msg: Goed geprobeerd hackers! Ongeldig wachtwoord confirm_password: Voer jouw huidige wachtwoord in om jouw identiteit te bevestigen description_html: Hierdoor worden alle gegevens van jouw account <strong>permanent, onomkeerbaar</strong> verwijderd en wordt deze gedeactiveerd. Om toekomstige identiteitsdiefstal te voorkomen, kan op deze server jouw gebruikersnaam niet meer gebruikt worden. - proceed: Account verwijderen + proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd warning_html: We kunnen alleen garanderen dat jouw gegevens op deze server worden verwijderd. Berichten (toots), incl. media, die veel zijn gedeeld laten mogelijk sporen achter. Offline servers en servers die niet meer op jouw updates zijn geabonneerd zullen niet hun databases updaten. warning_title: Verwijdering gegevens op andere servers @@ -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 diff --git a/config/locales/no.yml b/config/locales/no.yml index 5fd63f121ed37dabbd88f66ec9c972f422575997..05714959dfaefeda664a6280a3a750ddb1996f73 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -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: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 631133f745db8a019be32666b3aaaa06a511b558..30d5258a5dc1cff2bd3b480c307f26a5c898f95a 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -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: @@ -220,7 +207,7 @@ oc: - dv - ds abbr_month_names: - - + - - gen - feb - mar @@ -246,7 +233,7 @@ oc: long: Lo %e %B de %Y short: "%e %b" month_names: - - + - - de genièr - de febrièr - de març diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 321b1590eae4e57ef6f4ae5ee4a0e80ed9cc8af5..018ff3c7bfed52025c8bbc30221144bca229dd8e 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -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" diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 973a8d401f664973aa54bee145198e0405ad93dc..fb5e03c8c7890f364a23e808696359241c7ab7bf 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -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: diff --git a/config/locales/pt.yml b/config/locales/pt.yml index dff2898c06cf9436f9f2102053aa9f404071124d..0f59185a76b5cf3f61dc70b58a9e911bb3126500 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -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: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 6321e96eb0ccf5051c47eeb016c01052e649cbfd..414d39dd2130e2e0dba426798c822f221e2af7b8 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -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: diff --git a/config/locales/th.yml b/config/locales/th.yml index 322e5e74bf1f15a109d6eda3724df19eaab28776..a71252afefdc7951f1b05a997852bc5206922d29 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -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: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 0e33e2efe7ee6e3238b015dae3ddd934fb7fd4fe..a8927eaa8569bacbac0eac6eae49aaa5e073101c 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -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: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 1327c1a7b2fe16b17c88d6e45b92ef803df6e04b..65f1aabf5228b77f358dacca72a908806dd07dde 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -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: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6c8e9fc6d9a1e28dff2e8f1b14b57346e58979e6..d5d1b672c47b8c1338c2b96003d59be382b7d5ad 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -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: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 4d8262c5b7801c00ee2b2fc2edca81f344754e66..aa9f27912cddedde4cc5a3c5e0098560c6d1f453 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -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: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 754175a7ae6072e4d18aad296230e45fa3a3037d..58caf78481a7508cce23f3d8d59f9289f13f6447 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -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: diff --git a/config/settings.yml b/config/settings.yml index be2a7a1f83459df828026ea41267a9226bebe818..579ba2929ad64d594fd8673ad28be44f2faf6d38 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -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 diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 0e182c7556ab7ea918817e5a05a3a8431686c703..bd70937e4892119bdcba53d7f2f401d637aeac00 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -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 diff --git a/spec/requests/localization_spec.rb b/spec/requests/localization_spec.rb index 2f7a5e91ef4ac2b9c1ad5de732daa2255e9acd6f..f625a93a4fe302c084b96cf473ca15255671c03e 100644 --- a/spec/requests/localization_spec.rb +++ b/spec/requests/localization_spec.rb @@ -6,13 +6,13 @@ describe 'Localization' do after(:all) do I18n.locale = I18n.default_locale end - + it 'uses a specific region when provided' do headers = { 'Accept-Language' => 'zh-HK' } 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 diff --git a/spec/views/about/show.html.haml_spec.rb b/spec/views/about/show.html.haml_spec.rb index 2c5130d849c48d93ceb95800e31dc791239ef8d5..c0ead6349129e660a0b98d5ac551493032198ce4 100644 --- a/spec/views/about/show.html.haml_spec.rb +++ b/spec/views/about/show.html.haml_spec.rb @@ -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_description: 'something', - open_registrations: false, - closed_registrations_message: 'yes', - ) + site_title: 'something', + site_description: 'something', + version_number: '1.0', + open_registrations: false, + closed_registrations_message: 'yes') assign(:instance_presenter, instance_presenter) render