diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 835151619c..5ebeca8802 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -289,6 +289,7 @@ RSpec/LetSetup: - 'spec/controllers/oauth/tokens_controller_spec.rb' - 'spec/controllers/settings/imports_controller_spec.rb' - 'spec/lib/activitypub/activity/delete_spec.rb' + - 'spec/lib/vacuum/applications_vacuum_spec.rb' - 'spec/lib/vacuum/preview_cards_vacuum_spec.rb' - 'spec/models/account_spec.rb' - 'spec/models/account_statuses_cleanup_policy_spec.rb' diff --git a/CHANGELOG.md b/CHANGELOG.md index 5383d426b6..c49b192735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,26 @@ All notable changes to this project will be documented in this file. +## [4.1.5] - 2023-07-21 + +### Added + +- Add check preventing Sidekiq workers from running with Makara configured ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25850)) + +### Changed + +- Change request timeout handling to use a longer deadline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26055)) + +### Fixed + +- Fix moderation interface for remote instances with a .zip TLD ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25885)) +- Fix remote accounts being possibly persisted to database with incomplete protocol values ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25886)) +- Fix trending publishers table not rendering correctly on narrow screens ([vmstan](https://github.com/mastodon/mastodon/pull/25945)) + +### Security + +- Fix CSP headers being unintentionally wide ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26105)) + ## [4.1.4] - 2023-07-07 ### Fixed diff --git a/Gemfile.lock b/Gemfile.lock index 63a9388ee2..d308192e8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -103,7 +103,7 @@ GEM attr_required (1.0.1) awrence (1.2.1) aws-eventstream (1.2.0) - aws-partitions (1.786.0) + aws-partitions (1.791.0) aws-sdk-core (3.178.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) @@ -112,7 +112,7 @@ GEM aws-sdk-kms (1.71.0) aws-sdk-core (~> 3, >= 3.177.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.130.0) + aws-sdk-s3 (1.131.0) aws-sdk-core (~> 3, >= 3.177.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.6) @@ -144,7 +144,7 @@ GEM blurhash (0.1.7) bootsnap (1.16.0) msgpack (~> 1.2) - brakeman (6.0.0) + brakeman (6.0.1) browser (5.3.1) brpoplpush-redis_script (0.1.3) concurrent-ruby (~> 1.0, >= 1.0.5) @@ -307,7 +307,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.48.0) + haml_lint (0.49.1) haml (>= 4.0, < 6.2) parallel (~> 1.10) rainbow @@ -569,7 +569,7 @@ GEM rake (13.0.6) rdf (3.2.11) link_header (~> 0.0, >= 0.0.8) - rdf-normalize (0.6.0) + rdf-normalize (0.6.1) rdf (~> 3.2) redcarpet (3.6.0) redis (4.8.1) diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 1380e6f283..06a3deee2b 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -108,7 +108,7 @@ class Auth::SessionsController < Devise::SessionsController end def home_paths(resource) - paths = [about_path] + paths = [about_path, '/explore'] paths << short_account_path(username: resource.account) if single_user_mode? && resource.is_a?(User) diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index 0416df5d45..fd66310e85 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -297,7 +297,7 @@ export default class Dropdown extends PureComponent { onKeyPress: this.handleKeyPress, }) : ( <IconButton - icon={icon} + icon={!open ? icon : 'close'} title={title} active={open} disabled={disabled} diff --git a/app/javascript/mastodon/components/intersection_observer_article.jsx b/app/javascript/mastodon/components/intersection_observer_article.jsx index 7b03ffb88e..8efa969f9b 100644 --- a/app/javascript/mastodon/components/intersection_observer_article.jsx +++ b/app/javascript/mastodon/components/intersection_observer_article.jsx @@ -114,7 +114,7 @@ export default class IntersectionObserverArticle extends Component { aria-setsize={listLength} style={{ height: `${this.height || cachedHeight}px`, opacity: 0, overflow: 'hidden' }} data-id={id} - tabIndex={0} + tabIndex={-1} > {children && cloneElement(children, { hidden: true })} </article> @@ -122,7 +122,7 @@ export default class IntersectionObserverArticle extends Component { } return ( - <article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex={0}> + <article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex={-1}> {children && cloneElement(children, { hidden: false })} </article> ); diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index d4d472334a..be2f457c76 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -12,7 +12,7 @@ import { debounce } from 'lodash'; import { Blurhash } from 'mastodon/components/blurhash'; -import { autoPlayGif, cropImages, displayMedia, displayMediaExpand, useBlurhash } from '../initial_state'; +import { autoPlayGif, displayMedia, displayMediaExpand, useBlurhash } from '../initial_state'; import { IconButton } from './icon_button'; @@ -225,7 +225,6 @@ class MediaGallery extends PureComponent { static propTypes = { sensitive: PropTypes.bool, - standalone: PropTypes.bool, media: ImmutablePropTypes.list.isRequired, lang: PropTypes.string, size: PropTypes.object, @@ -239,10 +238,6 @@ class MediaGallery extends PureComponent { onToggleVisibility: PropTypes.func, }; - static defaultProps = { - standalone: false, - }; - state = { visible: this.props.visible !== undefined ? this.props.visible : (displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all'), width: this.props.defaultWidth, @@ -311,7 +306,7 @@ class MediaGallery extends PureComponent { } render () { - const { media, lang, intl, sensitive, defaultWidth, standalone, autoplay } = this.props; + const { media, lang, intl, sensitive, defaultWidth, autoplay } = this.props; const { visible } = this.state; const width = this.state.width || defaultWidth; @@ -319,10 +314,10 @@ class MediaGallery extends PureComponent { const style = {}; - if (this.isFullSizeEligible() && (standalone || !cropImages)) { + if (this.isFullSizeEligible()) { style.aspectRatio = `${this.props.media.getIn([0, 'meta', 'small', 'aspect'])}`; } else { - style.aspectRatio = '16 / 9'; + style.aspectRatio = '3 / 2'; } const maxSize = displayMediaExpand ? 16 : 4; @@ -330,7 +325,7 @@ class MediaGallery extends PureComponent { const size = media.take(maxSize).size; const uncached = media.every(attachment => attachment.get('type') === 'unknown'); - if (standalone && this.isFullSizeEligible()) { + if (this.isFullSizeEligible()) { children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} lang={lang} displayWidth={width} visible={visible} />; } else { children = media.take(maxSize).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} lang={lang} size={size} displayWidth={width} visible={visible || uncached} />); diff --git a/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx b/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx index 756a977224..c65bd494f3 100644 --- a/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx +++ b/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx @@ -12,6 +12,7 @@ class PictureInPicturePlaceholder extends PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, + aspectRatio: PropTypes.string, }; handleClick = () => { @@ -20,8 +21,10 @@ class PictureInPicturePlaceholder extends PureComponent { }; render () { + const { aspectRatio } = this.props; + return ( - <div className='picture-in-picture-placeholder' role='button' tabIndex={0} onClick={this.handleClick}> + <div className='picture-in-picture-placeholder' style={{ aspectRatio }} role='button' tabIndex={0} onClick={this.handleClick}> <Icon id='window-restore' /> <FormattedMessage id='picture_in_picture.restore' defaultMessage='Put it back' /> </div> diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index a74866ecce..6a195201d5 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -19,7 +19,6 @@ import Bundle from '../features/ui/components/bundle'; import { MediaGallery, Video, Audio } from '../features/ui/util/async-components'; import { displayMedia } from '../initial_state'; -import AttachmentList from './attachment_list'; import { Avatar } from './avatar'; import { AvatarOverlay } from './avatar_overlay'; import { DisplayName } from './display_name'; @@ -198,17 +197,35 @@ class Status extends ImmutablePureComponent { this.props.onTranslate(this._properStatus()); }; - renderLoadingMediaGallery () { - return <div className='media-gallery' style={{ height: '110px' }} />; + getAttachmentAspectRatio () { + const attachments = this._properStatus().get('media_attachments'); + + if (attachments.getIn([0, 'type']) === 'video') { + return `${attachments.getIn([0, 'meta', 'original', 'width'])} / ${attachments.getIn([0, 'meta', 'original', 'height'])}`; + } else if (attachments.getIn([0, 'type']) === 'audio') { + return '16 / 9'; + } else { + return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2' + } } - renderLoadingVideoPlayer () { - return <div className='video-player' style={{ height: '110px' }} />; - } + renderLoadingMediaGallery = () => { + return ( + <div className='media-gallery' style={{ aspectRatio: this.getAttachmentAspectRatio() }} /> + ); + }; - renderLoadingAudioPlayer () { - return <div className='audio-player' style={{ height: '110px' }} />; - } + renderLoadingVideoPlayer = () => { + return ( + <div className='video-player' style={{ aspectRatio: this.getAttachmentAspectRatio() }} /> + ); + }; + + renderLoadingAudioPlayer = () => { + return ( + <div className='audio-player' style={{ aspectRatio: this.getAttachmentAspectRatio() }} /> + ); + }; handleOpenVideo = (options) => { const status = this._properStatus(); @@ -445,18 +462,11 @@ class Status extends ImmutablePureComponent { } if (pictureInPicture.get('inUse')) { - media = <PictureInPicturePlaceholder />; + media = <PictureInPicturePlaceholder aspectRatio={this.getAttachmentAspectRatio()} />; } else if (status.get('media_attachments').size > 0) { const language = status.getIn(['translation', 'language']) || status.get('language'); - if (this.props.muted) { - media = ( - <AttachmentList - compact - media={status.get('media_attachments')} - /> - ); - } else if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { + if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { const attachment = status.getIn(['media_attachments', 0]); const description = attachment.getIn(['translation', 'description']) || attachment.get('description'); @@ -494,11 +504,11 @@ class Status extends ImmutablePureComponent { <Component preview={attachment.get('preview_url')} frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])} + aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`} blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={description} lang={language} - inline sensitive={status.get('sensitive')} onOpenVideo={this.handleOpenVideo} deployPictureInPicture={pictureInPicture.get('available') ? this.handleDeployPictureInPicture : undefined} @@ -527,7 +537,7 @@ class Status extends ImmutablePureComponent { </Bundle> ); } - } else if (status.get('spoiler_text').length === 0 && status.get('card') && !this.props.muted) { + } else if (status.get('spoiler_text').length === 0 && status.get('card')) { media = ( <Card onOpenMedia={this.handleOpenMedia} diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx index 593fd55461..84087a566b 100644 --- a/app/javascript/mastodon/components/status_action_bar.jsx +++ b/app/javascript/mastodon/components/status_action_bar.jsx @@ -34,7 +34,7 @@ const messages = defineMessages({ reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, - favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, + favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, emojiReaction: { id: 'status.emoji_reaction', defaultMessage: 'Stamp' }, bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, removeBookmark: { id: 'status.remove_bookmark', defaultMessage: 'Remove bookmark' }, diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index c0577b830b..93356f1ca3 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -57,7 +57,7 @@ const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' }, diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index 86e1945a5d..fbb5e4c142 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -48,7 +48,7 @@ const messages = defineMessages({ pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, - favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, + favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' }, blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, diff --git a/app/javascript/mastodon/features/audio/index.jsx b/app/javascript/mastodon/features/audio/index.jsx index 72e76413b8..3f642bc74e 100644 --- a/app/javascript/mastodon/features/audio/index.jsx +++ b/app/javascript/mastodon/features/audio/index.jsx @@ -470,6 +470,7 @@ class Audio extends PureComponent { const progress = Math.min((currentTime / duration) * 100, 100); let warning; + if (sensitive) { warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />; } else { @@ -515,7 +516,10 @@ class Audio extends PureComponent { <div className={classNames('spoiler-button', { 'spoiler-button--hidden': revealed || editable })}> <button type='button' className='spoiler-button__overlay' onClick={this.toggleReveal}> - <span className='spoiler-button__overlay__label'>{warning}</span> + <span className='spoiler-button__overlay__label'> + {warning} + <span className='spoiler-button__overlay__action'><FormattedMessage id='status.media.show' defaultMessage='Click to show' /></span> + </span> </button> </div> diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx index 936dee12e3..b0c90a4302 100644 --- a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx +++ b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx @@ -86,7 +86,6 @@ class Bookmarks extends ImmutablePureComponent { onClick={this.handleHeaderClick} pinned={pinned} multiColumn={multiColumn} - showBackButton /> <StatusList diff --git a/app/javascript/mastodon/features/compose/components/action_bar.jsx b/app/javascript/mastodon/features/compose/components/action_bar.jsx index ed0625cb18..3255cbaf45 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.jsx +++ b/app/javascript/mastodon/features/compose/components/action_bar.jsx @@ -13,7 +13,7 @@ const messages = defineMessages({ preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, reaction_deck: { id: 'navigation_bar.reaction_deck', defaultMessage: 'Reaction deck' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, - favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, + favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' }, emoji_reactions: { id: 'navigation_bar.emoji_reactions', defaultMessage: 'Stamps' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' }, diff --git a/app/javascript/mastodon/features/compose/components/navigation_bar.jsx b/app/javascript/mastodon/features/compose/components/navigation_bar.jsx index 371bed905e..5af38da43c 100644 --- a/app/javascript/mastodon/features/compose/components/navigation_bar.jsx +++ b/app/javascript/mastodon/features/compose/components/navigation_bar.jsx @@ -8,7 +8,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { Avatar } from '../../../components/avatar'; -import { IconButton } from '../../../components/icon_button'; import ActionBar from './action_bar'; @@ -21,23 +20,27 @@ export default class NavigationBar extends ImmutablePureComponent { }; render () { + const username = this.props.account.get('acct') return ( <div className='navigation-bar'> - <Link to={`/@${this.props.account.get('acct')}`}> - <span style={{ display: 'none' }}>{this.props.account.get('acct')}</span> + <Link to={`/@${username}`}> + <span style={{ display: 'none' }}>{username}</span> <Avatar account={this.props.account} size={46} /> </Link> <div className='navigation-bar__profile'> - <Link to={`/@${this.props.account.get('acct')}`}> - <strong className='navigation-bar__profile-account'>@{this.props.account.get('acct')}</strong> - </Link> + <span> + <Link to={`/@${username}`}> + <strong className='navigation-bar__profile-account'>@{username}</strong> + </Link> + </span> - <a href='/settings/profile' className='navigation-bar__profile-edit'><FormattedMessage id='navigation_bar.edit_profile' defaultMessage='Edit profile' /></a> + <span> + <a href='/settings/profile' className='navigation-bar__profile-edit'><FormattedMessage id='navigation_bar.edit_profile' defaultMessage='Edit profile' /></a> + </span> </div> <div className='navigation-bar__actions'> - <IconButton className='close' title='' icon='close' onClick={this.props.onClose} /> <ActionBar account={this.props.account} onLogout={this.props.onLogout} /> </div> </div> diff --git a/app/javascript/mastodon/features/explore/components/story.jsx b/app/javascript/mastodon/features/explore/components/story.jsx index 73ec99c14b..92eb41cff8 100644 --- a/app/javascript/mastodon/features/explore/components/story.jsx +++ b/app/javascript/mastodon/features/explore/components/story.jsx @@ -1,10 +1,13 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; +import { FormattedMessage } from 'react-intl'; + import classNames from 'classnames'; import { Blurhash } from 'mastodon/components/blurhash'; import { accountsCountRenderer } from 'mastodon/components/hashtag'; +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; import { ShortNumber } from 'mastodon/components/short_number'; import { Skeleton } from 'mastodon/components/skeleton'; @@ -13,10 +16,14 @@ export default class Story extends PureComponent { static propTypes = { url: PropTypes.string, title: PropTypes.string, + lang: PropTypes.string, publisher: PropTypes.string, + publishedAt: PropTypes.string, + author: PropTypes.string, sharedTimes: PropTypes.number, thumbnail: PropTypes.string, blurhash: PropTypes.string, + expanded: PropTypes.bool, }; state = { @@ -26,16 +33,16 @@ export default class Story extends PureComponent { handleImageLoad = () => this.setState({ thumbnailLoaded: true }); render () { - const { url, title, publisher, sharedTimes, thumbnail, blurhash } = this.props; + const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, blurhash } = this.props; const { thumbnailLoaded } = this.state; return ( - <a className='story' href={url} target='blank' rel='noopener'> + <a className={classNames('story', { expanded })} href={url} target='blank' rel='noopener'> <div className='story__details'> - <div className='story__details__publisher'>{publisher ? publisher : <Skeleton width={50} />}</div> - <div className='story__details__title'>{title ? title : <Skeleton />}</div> - <div className='story__details__shared'>{typeof sharedTimes === 'number' ? <ShortNumber value={sharedTimes} renderer={accountsCountRenderer} /> : <Skeleton width={100} />}</div> + <div className='story__details__publisher'>{publisher ? <span lang={lang}>{publisher}</span> : <Skeleton width={50} />}{publishedAt && <> · <RelativeTimestamp timestamp={publishedAt} /></>}</div> + <div className='story__details__title' lang={lang}>{title ? title : <Skeleton />}</div> + <div className='story__details__shared'>{author && <><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{author}</strong> }} /> · </>}{typeof sharedTimes === 'number' ? <ShortNumber value={sharedTimes} renderer={accountsCountRenderer} /> : <Skeleton width={100} />}</div> </div> <div className='story__thumbnail'> diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index 8b199bf47c..489ab6dd61 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -55,12 +55,16 @@ class Links extends PureComponent { <div className='explore__links'> {banner} - {isLoading ? (<LoadingIndicator />) : links.map(link => ( + {isLoading ? (<LoadingIndicator />) : links.map((link, i) => ( <Story key={link.get('id')} + expanded={i === 0} + lang={link.get('language')} url={link.get('url')} title={link.get('title')} publisher={link.get('provider_name')} + publishedAt={link.get('published_at')} + author={link.get('author_name')} sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1} thumbnail={link.get('image')} blurhash={link.get('blurhash')} diff --git a/app/javascript/mastodon/features/explore/statuses.jsx b/app/javascript/mastodon/features/explore/statuses.jsx index 043492fb89..f32a4a5368 100644 --- a/app/javascript/mastodon/features/explore/statuses.jsx +++ b/app/javascript/mastodon/features/explore/statuses.jsx @@ -47,7 +47,7 @@ class Statuses extends PureComponent { return ( <> <DismissableBanner id='explore/statuses'> - <FormattedMessage id='dismissable_banner.explore_statuses' defaultMessage='These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favourites are ranked higher.' /> + <FormattedMessage id='dismissable_banner.explore_statuses' defaultMessage='These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favorites are ranked higher.' /> </DismissableBanner> <StatusList diff --git a/app/javascript/mastodon/features/favourited_statuses/index.jsx b/app/javascript/mastodon/features/favourited_statuses/index.jsx index abce7ac053..76cff7f8df 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.jsx +++ b/app/javascript/mastodon/features/favourited_statuses/index.jsx @@ -18,7 +18,7 @@ import Column from 'mastodon/features/ui/components/column'; import { getStatusList } from 'mastodon/selectors'; const messages = defineMessages({ - heading: { id: 'column.favourites', defaultMessage: 'Favourites' }, + heading: { id: 'column.favourites', defaultMessage: 'Favorites' }, }); const mapStateToProps = state => ({ @@ -74,7 +74,7 @@ class Favourites extends ImmutablePureComponent { const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; const pinned = !!columnId; - const emptyMessage = <FormattedMessage id='empty_column.favourited_statuses' defaultMessage="You don't have any favourite posts yet. When you favourite one, it will show up here." />; + const emptyMessage = <FormattedMessage id='empty_column.favourited_statuses' defaultMessage="You don't have any favorite posts yet. When you favorite one, it will show up here." />; return ( <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}> @@ -86,7 +86,6 @@ class Favourites extends ImmutablePureComponent { onClick={this.handleHeaderClick} pinned={pinned} multiColumn={multiColumn} - showBackButton /> <StatusList diff --git a/app/javascript/mastodon/features/favourites/index.jsx b/app/javascript/mastodon/features/favourites/index.jsx index 57911c3a14..bfde78708e 100644 --- a/app/javascript/mastodon/features/favourites/index.jsx +++ b/app/javascript/mastodon/features/favourites/index.jsx @@ -61,7 +61,7 @@ class Favourites extends ImmutablePureComponent { ); } - const emptyMessage = <FormattedMessage id='empty_column.favourites' defaultMessage='No one has favourited this post yet. When someone does, they will show up here.' />; + const emptyMessage = <FormattedMessage id='empty_column.favourites' defaultMessage='No one has favorited this post yet. When someone does, they will show up here.' />; return ( <Column bindToDocument={!multiColumn}> diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx index 85fd6f1209..f0cd70d7a1 100644 --- a/app/javascript/mastodon/features/getting_started/index.jsx +++ b/app/javascript/mastodon/features/getting_started/index.jsx @@ -32,7 +32,7 @@ const messages = defineMessages({ bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, - favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, + favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' }, blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Blocked domains' }, mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, diff --git a/app/javascript/mastodon/features/interaction_modal/index.jsx b/app/javascript/mastodon/features/interaction_modal/index.jsx index 59522eb8fd..b728760ceb 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.jsx +++ b/app/javascript/mastodon/features/interaction_modal/index.jsx @@ -116,8 +116,8 @@ class InteractionModal extends PureComponent { break; case 'favourite': icon = <Icon id='star' />; - title = <FormattedMessage id='interaction_modal.title.favourite' defaultMessage="Favourite {name}'s post" values={{ name }} />; - actionDescription = <FormattedMessage id='interaction_modal.description.favourite' defaultMessage='With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.' />; + title = <FormattedMessage id='interaction_modal.title.favourite' defaultMessage="Favorite {name}'s post" values={{ name }} />; + actionDescription = <FormattedMessage id='interaction_modal.description.favourite' defaultMessage='With an account on Mastodon, you can favorite this post to let the author know you appreciate it and save it for later.' />; break; case 'emoji_reaction': icon = <Icon id='smile-o' />; @@ -163,7 +163,7 @@ class InteractionModal extends PureComponent { <div className='interaction-modal__choices__choice'> <h3><FormattedMessage id='interaction_modal.on_another_server' defaultMessage='On a different server' /></h3> - <p><FormattedMessage id='interaction_modal.other_server_instructions' defaultMessage='Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.' /></p> + <p><FormattedMessage id='interaction_modal.other_server_instructions' defaultMessage='Copy and paste this URL into the search field of your favorite Mastodon app or the web interface of your Mastodon server.' /></p> <Copypaste value={url} /> </div> </div> diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx index ec117e5841..cf3a27b11a 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx @@ -54,7 +54,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { </tr> <tr> <td><kbd>f</kbd></td> - <td><FormattedMessage id='keyboard_shortcuts.favourite' defaultMessage='to favourite' /></td> + <td><FormattedMessage id='keyboard_shortcuts.favourite' defaultMessage='to favorite' /></td> </tr> <tr> <td><kbd>b</kbd></td> @@ -138,7 +138,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { </tr> <tr> <td><kbd>g</kbd>+<kbd>f</kbd></td> - <td><FormattedMessage id='keyboard_shortcuts.favourites' defaultMessage='to open favourites list' /></td> + <td><FormattedMessage id='keyboard_shortcuts.favourites' defaultMessage='to open favorites list' /></td> </tr> <tr> <td><kbd>g</kbd>+<kbd>e</kbd></td> diff --git a/app/javascript/mastodon/features/lists/index.jsx b/app/javascript/mastodon/features/lists/index.jsx index ecec4b68df..e947a40b83 100644 --- a/app/javascript/mastodon/features/lists/index.jsx +++ b/app/javascript/mastodon/features/lists/index.jsx @@ -65,7 +65,7 @@ class Lists extends ImmutablePureComponent { return ( <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.heading)}> - <ColumnHeader title={intl.formatMessage(messages.heading)} icon='list-ul' multiColumn={multiColumn} showBackButton /> + <ColumnHeader title={intl.formatMessage(messages.heading)} icon='list-ul' multiColumn={multiColumn} /> <NewListForm /> diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx index e141039c96..3a8bd6943f 100644 --- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx +++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx @@ -109,7 +109,7 @@ export default class ColumnSettings extends PureComponent { </div> <div role='group' aria-labelledby='notifications-favourite'> - <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span> + <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favorites:' /></span> <div className='column-settings__row'> <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} /> diff --git a/app/javascript/mastodon/features/notifications/components/filter_bar.jsx b/app/javascript/mastodon/features/notifications/components/filter_bar.jsx index 2c0431d3fd..aaea6819b8 100644 --- a/app/javascript/mastodon/features/notifications/components/filter_bar.jsx +++ b/app/javascript/mastodon/features/notifications/components/filter_bar.jsx @@ -7,7 +7,7 @@ import { Icon } from 'mastodon/components/icon'; const tooltips = defineMessages({ mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' }, - favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' }, + favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favorites' }, emojiReactions: { id: 'notifications.filter.emoji_reactions', defaultMessage: 'Stamps' }, boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' }, status_references: { id: 'notifications.filter.status_references', defaultMessage: 'Status references' }, diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 69471e268e..cb3f92b71c 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -21,7 +21,7 @@ import FollowRequestContainer from '../containers/follow_request_container'; import Report from './report'; const messages = defineMessages({ - favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' }, + favourite: { id: 'notification.favourite', defaultMessage: '{name} favorited your status' }, emojiReaction: { id: 'notification.emoji_reaction', defaultMessage: '{name} reacted your status with emoji' }, follow: { id: 'notification.follow', defaultMessage: '{name} followed you' }, ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' }, @@ -201,7 +201,7 @@ class Notification extends ImmutablePureComponent { </div> <span title={notification.get('created_at')}> - <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} /> + <FormattedMessage id='notification.favourite' defaultMessage='{name} favorited your status' values={{ name: link }} /> </span> </div> diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx index d0a962056e..a5a48749fc 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx @@ -23,7 +23,7 @@ const messages = defineMessages({ reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, - favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, + favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, open: { id: 'status.open', defaultMessage: 'Expand this status' }, diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index 5fe4650b6d..6c50344916 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -26,7 +26,7 @@ const messages = defineMessages({ reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, - favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, + favourite: { id: 'status.favourite', defaultMessage: 'Favorite' }, bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' }, more: { id: 'status.more', defaultMessage: 'More' }, mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' }, diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx index d23bbf16a7..29a12c87bf 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -12,6 +12,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; import { useBlurhash } from 'mastodon/initial_state'; const IDNA_PREFIX = 'xn--'; @@ -57,14 +58,9 @@ export default class Card extends PureComponent { static propTypes = { card: ImmutablePropTypes.map, onOpenMedia: PropTypes.func.isRequired, - compact: PropTypes.bool, sensitive: PropTypes.bool, }; - static defaultProps = { - compact: false, - }; - state = { previewLoaded: false, embedded: false, @@ -148,7 +144,7 @@ export default class Card extends PureComponent { } render () { - const { card, compact } = this.props; + const { card } = this.props; const { embedded, revealed } = this.state; if (card === null) { @@ -156,29 +152,27 @@ export default class Card extends PureComponent { } const provider = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name'); - const horizontal = (!compact && card.get('width') > card.get('height')) || card.get('type') !== 'link' || embedded; const interactive = card.get('type') !== 'link'; - const className = classnames('status-card', { horizontal, compact, interactive }); - const title = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener noreferrer' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>; const language = card.get('language') || ''; const description = ( - <div className='status-card__content' lang={language}> - {title} - {!(horizontal || compact) && <p className='status-card__description' title={card.get('description')}>{card.get('description')}</p>} - <span className='status-card__host'>{provider}</span> + <div className='status-card__content'> + <span className='status-card__host'> + <span lang={language}>{provider}</span> + {card.get('published_at') && <> · <RelativeTimestamp timestamp={card.get('published_at')} /></>} + </span> + <strong className='status-card__title' title={card.get('title')} lang={language}>{card.get('title')}</strong> + {card.get('author_name').length > 0 && <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span>} </div> ); const thumbnailStyle = { - visibility: revealed? null : 'hidden', + visibility: revealed ? null : 'hidden', + aspectRatio: `${card.get('width')} / ${card.get('height')}` }; - if (horizontal) { - thumbnailStyle.aspectRatio = (compact && !embedded) ? '16 / 9' : `${card.get('width')} / ${card.get('height')}`; - } + let embed; - let embed = ''; let canvas = ( <Blurhash className={classnames('status-card__image-preview', { @@ -188,12 +182,18 @@ export default class Card extends PureComponent { dummy={!useBlurhash} /> ); + let thumbnail = <img src={card.get('image')} alt='' style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />; + let spoilerButton = ( <button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'> - <span className='spoiler-button__overlay__label'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span> + <span className='spoiler-button__overlay__label'> + <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /> + <span className='spoiler-button__overlay__action'><FormattedMessage id='status.media.show' defaultMessage='Click to show' /></span> + </span> </button> ); + spoilerButton = ( <div className={classnames('spoiler-button', { 'spoiler-button--minified': revealed })}> {spoilerButton} @@ -219,19 +219,20 @@ export default class Card extends PureComponent { <div className='status-card__actions'> <div> <button type='button' onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button> - {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>} + <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a> </div> </div> )} + {!revealed && spoilerButton} </div> ); } return ( - <div className={className} ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}> + <div className='status-card' ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}> {embed} - {!compact && description} + <a href={card.get('url')} target='_blank' rel='noopener noreferrer'>{description}</a> </div> ); } else if (card.get('image')) { @@ -243,14 +244,14 @@ export default class Card extends PureComponent { ); } else { embed = ( - <div className='status-card__image'> + <div className='status-card__image' style={{ aspectRatio: '1.9 / 1' }}> <Icon id='file-text' /> </div> ); } return ( - <a href={card.get('url')} className={className} target='_blank' rel='noopener noreferrer' ref={this.setRef}> + <a href={card.get('url')} className='status-card' target='_blank' rel='noopener noreferrer' ref={this.setRef}> {embed} {description} </a> diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index 6bd016332b..f4fb303c17 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -122,8 +122,30 @@ class DetailedStatus extends ImmutablePureComponent { onTranslate(status); }; + _properStatus () { + const { status } = this.props; + + if (status.get('reblog', null) !== null && typeof status.get('reblog') === 'object') { + return status.get('reblog'); + } else { + return status; + } + } + + getAttachmentAspectRatio () { + const attachments = this._properStatus().get('media_attachments'); + + if (attachments.getIn([0, 'type']) === 'video') { + return `${attachments.getIn([0, 'meta', 'original', 'width'])} / ${attachments.getIn([0, 'meta', 'original', 'height'])}`; + } else if (attachments.getIn([0, 'type']) === 'audio') { + return '16 / 9'; + } else { + return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2' + } + } + render () { - const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; + const status = this._properStatus(); const outerStyle = { boxSizing: 'border-box' }; const { intl, compact, pictureInPicture } = this.props; @@ -147,7 +169,7 @@ class DetailedStatus extends ImmutablePureComponent { const language = status.getIn(['translation', 'language']) || status.get('language'); if (pictureInPicture.get('inUse')) { - media = <PictureInPicturePlaceholder />; + media = <PictureInPicturePlaceholder aspectRatio={this.getAttachmentAspectRatio()} />; } else if (status.get('media_attachments').size > 0) { if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { const attachment = status.getIn(['media_attachments', 0]); @@ -178,13 +200,13 @@ class DetailedStatus extends ImmutablePureComponent { <Video preview={attachment.get('preview_url')} frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])} + aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`} blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={description} lang={language} width={300} height={150} - inline onOpenVideo={this.handleOpenVideo} sensitive={status.get('sensitive')} visible={this.props.showMedia} diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js index 6aa01a07e9..fd66a2b9fc 100644 --- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js +++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js @@ -38,7 +38,7 @@ const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, }); diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index 637bbc4881..7db2d19b19 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -75,7 +75,7 @@ const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, - redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' }, @@ -208,9 +208,9 @@ class Status extends ImmutablePureComponent { dispatch: PropTypes.func.isRequired, status: ImmutablePropTypes.map, isLoading: PropTypes.bool, - ancestorsIds: ImmutablePropTypes.list, - descendantsIds: ImmutablePropTypes.list, - referenceIds: ImmutablePropTypes.list, + ancestorsIds: ImmutablePropTypes.list.isRequired, + descendantsIds: ImmutablePropTypes.list.isRequired, + referenceIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, askReplyConfirmation: PropTypes.bool, multiColumn: PropTypes.bool, @@ -237,14 +237,9 @@ class Status extends ImmutablePureComponent { UNSAFE_componentWillReceiveProps (nextProps) { if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) { - this._scrolledIntoView = false; this.props.dispatch(fetchStatus(nextProps.params.statusId)); } - if (nextProps.params.statusId && nextProps.ancestorsIds.size > this.props.ancestorsIds.size) { - this._scrolledIntoView = false; - } - if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) { this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') }); } @@ -625,20 +620,23 @@ class Status extends ImmutablePureComponent { this.node = c; }; - componentDidUpdate () { - if (this._scrolledIntoView) { - return; - } - - const { status, ancestorsIds } = this.props; - - if (status && ancestorsIds && ancestorsIds.size > 0) { - const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1]; + componentDidUpdate (prevProps) { + const { status, ancestorsIds, multiColumn } = this.props; + if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) { window.requestAnimationFrame(() => { - element.scrollIntoView(true); + this.node?.querySelector('.detailed-status__wrapper')?.scrollIntoView(true); + + // In the single-column interface, `scrollIntoView` will put the post behind the header, + // so compensate for that. + if (!multiColumn) { + const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom; + if (offset) { + const scrollingElement = document.scrollingElement || document.body; + scrollingElement.scrollBy(0, -offset); + } + } }); - this._scrolledIntoView = true; } } diff --git a/app/javascript/mastodon/features/ui/components/media_modal.jsx b/app/javascript/mastodon/features/ui/components/media_modal.jsx index d38dc18045..17f1148b1f 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/media_modal.jsx @@ -172,6 +172,7 @@ class MediaModal extends ImmutablePureComponent { width={image.get('width')} height={image.get('height')} frameRate={image.getIn(['meta', 'original', 'frame_rate'])} + aspectRatio={`${image.getIn(['meta', 'original', 'width'])} / ${image.getIn(['meta', 'original', 'height'])}`} currentTime={currentTime || 0} autoPlay={autoPlay || false} volume={volume || 1} diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index 8f74232aab..7ec39e489e 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -24,7 +24,7 @@ const messages = defineMessages({ local: { id: 'column.local', defaultMessage: 'Local' }, firehose: { id: 'column.firehose', defaultMessage: 'Live feeds' }, direct: { id: 'navigation_bar.direct', defaultMessage: 'Private mentions' }, - favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, + favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' }, bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, diff --git a/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx b/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx index abae34f7fd..e44b797692 100644 --- a/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx +++ b/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx @@ -35,7 +35,7 @@ const SignInBanner = () => { return ( <div className='sign-in-banner'> - <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.' /></p> + <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p> {signupButton} <a href='/auth/sign_in' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a> </div> diff --git a/app/javascript/mastodon/features/ui/components/video_modal.jsx b/app/javascript/mastodon/features/ui/components/video_modal.jsx index 48c6301a5e..cc166d8bc5 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/video_modal.jsx @@ -49,6 +49,7 @@ class VideoModal extends ImmutablePureComponent { <Video preview={media.get('preview_url')} frameRate={media.getIn(['meta', 'original', 'frame_rate'])} + aspectRatio={`${media.getIn(['meta', 'original', 'width'])} / ${media.getIn(['meta', 'original', 'height'])}`} blurhash={media.get('blurhash')} src={media.get('url')} currentTime={options.startTime} diff --git a/app/javascript/mastodon/features/video/index.jsx b/app/javascript/mastodon/features/video/index.jsx index 78650d34f8..3f7e0ada14 100644 --- a/app/javascript/mastodon/features/video/index.jsx +++ b/app/javascript/mastodon/features/video/index.jsx @@ -105,6 +105,7 @@ class Video extends PureComponent { static propTypes = { preview: PropTypes.string, frameRate: PropTypes.string, + aspectRatio: PropTypes.string, src: PropTypes.string.isRequired, alt: PropTypes.string, lang: PropTypes.string, @@ -113,7 +114,6 @@ class Video extends PureComponent { onOpenVideo: PropTypes.func, onCloseVideo: PropTypes.func, detailed: PropTypes.bool, - inline: PropTypes.bool, editable: PropTypes.bool, alwaysVisible: PropTypes.bool, visible: PropTypes.bool, @@ -500,14 +500,9 @@ class Video extends PureComponent { } render () { - const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, lang, detailed, sensitive, editable, blurhash, autoFocus } = this.props; + const { preview, src, aspectRatio, onOpenVideo, onCloseVideo, intl, alt, lang, detailed, sensitive, editable, blurhash, autoFocus } = this.props; const { currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); - const playerStyle = {}; - - if (inline) { - playerStyle.aspectRatio = '16 / 9'; - } let preload; @@ -527,95 +522,101 @@ class Video extends PureComponent { warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />; } + // The outer wrapper is necessary to avoid reflowing the layout when going into full screen return ( - <div - role='menuitem' - className={classNames('video-player', { inactive: !revealed, detailed, inline: inline && !fullscreen, fullscreen, editable })} - style={playerStyle} - ref={this.setPlayerRef} - onMouseEnter={this.handleMouseEnter} - onMouseLeave={this.handleMouseLeave} - onClick={this.handleClickRoot} - onKeyDown={this.handleKeyDown} - tabIndex={0} - > - <Blurhash - hash={blurhash} - className={classNames('media-gallery__preview', { - 'media-gallery__preview--hidden': revealed, - })} - dummy={!useBlurhash} - /> - - {(revealed || editable) && <video - ref={this.setVideoRef} - src={src} - poster={preview} - preload={preload} - role='button' + <div style={{ aspectRatio }}> + <div + role='menuitem' + className={classNames('video-player', { inactive: !revealed, detailed, fullscreen, editable })} + style={{ aspectRatio }} + ref={this.setPlayerRef} + onMouseEnter={this.handleMouseEnter} + onMouseLeave={this.handleMouseLeave} + onClick={this.handleClickRoot} + onKeyDown={this.handleKeyDown} tabIndex={0} - aria-label={alt} - title={alt} - lang={lang} - volume={volume} - onClick={this.togglePlay} - onKeyDown={this.handleVideoKeyDown} - onPlay={this.handlePlay} - onPause={this.handlePause} - onLoadedData={this.handleLoadedData} - onProgress={this.handleProgress} - onVolumeChange={this.handleVolumeChange} - style={{ ...playerStyle, width: '100%' }} - />} + > + <Blurhash + hash={blurhash} + className={classNames('media-gallery__preview', { + 'media-gallery__preview--hidden': revealed, + })} + dummy={!useBlurhash} + /> - <div className={classNames('spoiler-button', { 'spoiler-button--hidden': revealed || editable })}> - <button type='button' className='spoiler-button__overlay' onClick={this.toggleReveal}> - <span className='spoiler-button__overlay__label'>{warning}</span> - </button> - </div> + {(revealed || editable) && <video + ref={this.setVideoRef} + src={src} + poster={preview} + preload={preload} + role='button' + tabIndex={0} + aria-label={alt} + title={alt} + lang={lang} + volume={volume} + onClick={this.togglePlay} + onKeyDown={this.handleVideoKeyDown} + onPlay={this.handlePlay} + onPause={this.handlePause} + onLoadedData={this.handleLoadedData} + onProgress={this.handleProgress} + onVolumeChange={this.handleVolumeChange} + style={{ width: '100%' }} + />} - <div className={classNames('video-player__controls', { active: paused || hovered })}> - <div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}> - <div className='video-player__seek__buffer' style={{ width: `${buffer}%` }} /> - <div className='video-player__seek__progress' style={{ width: `${progress}%` }} /> - - <span - className={classNames('video-player__seek__handle', { active: dragging })} - tabIndex={0} - style={{ left: `${progress}%` }} - onKeyDown={this.handleVideoKeyDown} - /> + <div className={classNames('spoiler-button', { 'spoiler-button--hidden': revealed || editable })}> + <button type='button' className='spoiler-button__overlay' onClick={this.toggleReveal}> + <span className='spoiler-button__overlay__label'> + {warning} + <span className='spoiler-button__overlay__action'><FormattedMessage id='status.media.show' defaultMessage='Click to show' /></span> + </span> + </button> </div> - <div className='video-player__buttons-bar'> - <div className='video-player__buttons left'> - <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={autoFocus}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button> - <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> + <div className={classNames('video-player__controls', { active: paused || hovered })}> + <div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}> + <div className='video-player__seek__buffer' style={{ width: `${buffer}%` }} /> + <div className='video-player__seek__progress' style={{ width: `${progress}%` }} /> - <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}> - <div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} /> - - <span - className={classNames('video-player__volume__handle')} - tabIndex={0} - style={{ left: `${volume * 100}%` }} - /> - </div> - - {(detailed || fullscreen) && ( - <span className='video-player__time'> - <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span> - <span className='video-player__time-sep'>/</span> - <span className='video-player__time-total'>{formatTime(Math.floor(duration))}</span> - </span> - )} + <span + className={classNames('video-player__seek__handle', { active: dragging })} + tabIndex={0} + style={{ left: `${progress}%` }} + onKeyDown={this.handleVideoKeyDown} + /> </div> - <div className='video-player__buttons right'> - {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} className='player-button' onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>} - {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} className='player-button' onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>} - {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} className='player-button' onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>} - <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} className='player-button' onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button> + <div className='video-player__buttons-bar'> + <div className='video-player__buttons left'> + <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={autoFocus}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button> + <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> + + <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}> + <div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} /> + + <span + className={classNames('video-player__volume__handle')} + tabIndex={0} + style={{ left: `${volume * 100}%` }} + /> + </div> + + {(detailed || fullscreen) && ( + <span className='video-player__time'> + <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span> + <span className='video-player__time-sep'>/</span> + <span className='video-player__time-total'>{formatTime(Math.floor(duration))}</span> + </span> + )} + </div> + + <div className='video-player__buttons right'> + {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} className='player-button' onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>} + {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} className='player-button' onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>} + {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} className='player-button' onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>} + <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} className='player-button' onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button> + </div> </div> </div> </div> diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 71a221d128..5442e79a61 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -51,7 +51,6 @@ * @property {boolean} activity_api_enabled * @property {string} admin * @property {boolean=} boost_modal - * @property {boolean} crop_images * @property {boolean=} delete_modal * @property {boolean=} disable_swiping * @property {string=} disabled_account_id @@ -114,7 +113,6 @@ const getMeta = (prop) => initialState?.meta && initialState.meta[prop]; export const activityApiEnabled = getMeta('activity_api_enabled'); export const autoPlayGif = getMeta('auto_play_gif'); export const boostModal = getMeta('boost_modal'); -export const cropImages = getMeta('crop_images'); export const deleteModal = getMeta('delete_modal'); export const disableSwiping = getMeta('disable_swiping'); export const disabledAccountId = getMeta('disabled_account_id'); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9bc193da5f..dbe79ee620 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -116,7 +116,7 @@ "column.direct": "Private mentions", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", - "column.favourites": "Favourites", + "column.favourites": "Favorites", "column.firehose": "Live feeds", "column.follow_requests": "Follow requests", "column.home": "Home", @@ -189,7 +189,7 @@ "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.reply.confirm": "Reply", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", @@ -210,7 +210,7 @@ "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.", "dismissable_banner.dismiss": "Dismiss", "dismissable_banner.explore_links": "These are news stories being shared the most on the social web today. Newer news stories posted by more different people are ranked higher.", - "dismissable_banner.explore_statuses": "These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favourites are ranked higher.", + "dismissable_banner.explore_statuses": "These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favorites are ranked higher.", "dismissable_banner.explore_tags": "These are hashtags that are gaining traction on the social web today. Hashtags that are used by more different people are ranked higher.", "dismissable_banner.public_timeline": "These are the most recent public posts from people on the social web that people on {domain} follow.", "embed.instructions": "Embed this post on your website by copying the code below.", @@ -239,8 +239,8 @@ "empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", - "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.", + "empty_column.favourited_statuses": "You don't have any favorite posts yet. When you favorite one, it will show up here.", + "empty_column.favourites": "No one has favorited this post yet. When someone does, they will show up here.", "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", "empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", @@ -315,15 +315,15 @@ "home.explore_prompt.title": "This is your home base within Mastodon.", "home.hide_announcements": "Hide announcements", "home.show_announcements": "Show announcements", - "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.", + "interaction_modal.description.favourite": "With an account on Mastodon, you can favorite this post to let the author know you appreciate it and save it for later.", "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.", "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.", "interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.", "interaction_modal.on_another_server": "On a different server", "interaction_modal.on_this_server": "On this server", - "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.", + "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favorite Mastodon app or the web interface of your Mastodon server.", "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.", - "interaction_modal.title.favourite": "Favourite {name}'s post", + "interaction_modal.title.favourite": "Favorite {name}'s post", "interaction_modal.title.follow": "Follow {name}", "interaction_modal.title.reblog": "Boost {name}'s post", "interaction_modal.title.reply": "Reply to {name}'s post", @@ -339,8 +339,8 @@ "keyboard_shortcuts.direct": "to open private mentions column", "keyboard_shortcuts.down": "Move down in the list", "keyboard_shortcuts.enter": "Open post", - "keyboard_shortcuts.favourite": "Favourite post", - "keyboard_shortcuts.favourites": "Open favourites list", + "keyboard_shortcuts.favourite": "Favorite post", + "keyboard_shortcuts.favourites": "Open favorites list", "keyboard_shortcuts.federated": "Open federated timeline", "keyboard_shortcuts.heading": "Keyboard shortcuts", "keyboard_shortcuts.home": "Open home timeline", @@ -371,6 +371,7 @@ "lightbox.previous": "Previous", "limited_account_hint.action": "Show profile anyway", "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.", + "link_preview.author": "By {name}", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.antennas": "Related antennas", @@ -405,7 +406,7 @@ "navigation_bar.domain_blocks": "Blocked domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.explore": "Explore", - "navigation_bar.favourites": "Favourites", + "navigation_bar.favourites": "Favorites", "navigation_bar.filters": "Muted words", "navigation_bar.follow_requests": "Follow requests", "navigation_bar.followed_tags": "Followed hashtags", @@ -424,7 +425,7 @@ "notification.admin.report": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.emoji_reaction": "{name} reacted your post with emoji", - "notification.favourite": "{name} favourited your post", + "notification.favourite": "{name} favorited your post", "notification.follow": "{name} followed you", "notification.follow_request": "{name} has requested to follow you", "notification.mention": "{name} mentioned you", @@ -439,7 +440,7 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.favourite": "Favorites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", "notifications.column_settings.filter_bar.show_bar": "Show filter bar", @@ -457,7 +458,7 @@ "notifications.column_settings.update": "Edits:", "notifications.filter.all": "All", "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", + "notifications.filter.favourites": "Favorites", "notifications.filter.follows": "Follows", "notifications.filter.mentions": "Mentions", "notifications.filter.polls": "Poll results", @@ -623,7 +624,7 @@ "server_banner.server_stats": "Server stats:", "sign_in_banner.create_account": "Create account", "sign_in_banner.sign_in": "Login", - "sign_in_banner.text": "Login to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.", + "sign_in_banner.text": "Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.", "status.admin_account": "Open moderation interface for @{name}", "status.admin_domain": "Open moderation interface for {domain}", "status.admin_status": "Open this post in the moderation interface", @@ -643,7 +644,7 @@ "status.emoji_reaction": "Stamp", "status.emoji_reaction.pick": "Pick stamp", "status.expiration.add": "Set status expired time", - "status.favourite": "Favourite", + "status.favourite": "Favorite", "status.filter": "Filter this post", "status.filtered": "Filtered", "status.hide": "Hide post", diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index a5246a041b..3bfa792211 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -24,13 +24,16 @@ html { .column > .scrollable, .getting-started, .column-inline-form, -.error-column, .regeneration-indicator { background: $white; border: 1px solid lighten($ui-base-color, 8%); border-top: 0; } +.error-column { + border: 1px solid lighten($ui-base-color, 8%); +} + .column > .scrollable.about { border-top: 1px solid lighten($ui-base-color, 8%); } @@ -77,6 +80,10 @@ html { background: $white; } +.column-header { + border-bottom: 0; +} + .column-header__button.active { color: $ui-highlight-color; @@ -423,7 +430,7 @@ html { .column-header__collapsible-inner { background: darken($ui-base-color, 4%); border: 1px solid lighten($ui-base-color, 8%); - border-top: 0; + border-bottom: 0; } .dashboard__quick-access, diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index a2240b969b..4573b0c331 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -5,7 +5,7 @@ $white: #ffffff; $classic-base-color: #282c37; $classic-primary-color: #9baec8; $classic-secondary-color: #d9e1e8; -$classic-highlight-color: #6364ff; +$classic-highlight-color: #858afa; $blurple-600: #563acc; // Iris $blurple-500: #6364ff; // Brand purple diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index ff00c797c8..a77f8425dd 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -161,11 +161,22 @@ body { } } +a { + &:focus { + border-radius: 4px; + outline: $ui-button-icon-focus-outline; + } + + &:focus:not(:focus-visible) { + outline: none; + } +} + button { font-family: inherit; cursor: pointer; - &:focus { + &:focus:not(:focus-visible) { outline: none; } } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 08bafe20a5..12a6f3c672 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -74,6 +74,10 @@ background-color: $ui-button-focus-background-color; } + &:focus-visible { + outline: $ui-button-icon-focus-outline; + } + &--destructive { &:active, &:focus, @@ -98,16 +102,6 @@ transition: none; } - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - &.button-secondary { color: $ui-button-secondary-color; background: transparent; @@ -197,8 +191,6 @@ border-radius: 4px; background: transparent; cursor: pointer; - transition: all 100ms ease-in; - transition-property: background-color, color; text-decoration: none; a { @@ -211,12 +203,10 @@ &:focus { color: lighten($action-button-color, 7%); background-color: rgba($action-button-color, 0.15); - transition: all 200ms ease-out; - transition-property: background-color, color; } - &:focus { - background-color: rgba($action-button-color, 0.3); + &:focus-visible { + outline: $ui-button-icon-focus-outline; } &.disabled { @@ -225,20 +215,6 @@ cursor: default; } - &.active { - color: $highlight-text-color; - } - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - &.inverted { color: $lighter-text-color; @@ -249,8 +225,8 @@ background-color: rgba($lighter-text-color, 0.15); } - &:focus { - background-color: rgba($lighter-text-color, 0.3); + &:focus-visible { + outline: $ui-button-icon-focus-outline; } &.disabled { @@ -261,6 +237,13 @@ &.active { color: $highlight-text-color; + &:hover, + &:active, + &:focus { + color: $highlight-text-color; + background-color: transparent; + } + &.disabled { color: lighten($highlight-text-color, 13%); } @@ -269,13 +252,14 @@ &.overlayed { box-sizing: content-box; - background: rgba($base-overlay-background, 0.6); - color: rgba($primary-text-color, 0.7); + background: rgba($black, 0.65); + backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); + color: rgba($white, 0.7); border-radius: 4px; padding: 2px; &:hover { - background: rgba($base-overlay-background, 0.9); + background: rgba($black, 0.9); } } @@ -305,21 +289,16 @@ font-size: 11px; padding: 0 3px; line-height: 27px; - outline: 0; - transition: all 100ms ease-in; - transition-property: background-color, color; &:hover, &:active, &:focus { color: darken($lighter-text-color, 7%); background-color: rgba($lighter-text-color, 0.15); - transition: all 200ms ease-out; - transition-property: background-color, color; } - &:focus { - background-color: rgba($lighter-text-color, 0.3); + &:focus-visible { + outline: $ui-button-icon-focus-outline; } &.disabled { @@ -330,16 +309,13 @@ &.active { color: $highlight-text-color; - } - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; + &:hover, + &:active, + &:focus { + color: $highlight-text-color; + background-color: transparent; + } } } @@ -735,7 +711,6 @@ body > [data-popper-placement] { flex: 0 0 auto; .compose-form__publish-button-wrapper { - overflow: hidden; padding-top: 15px; } } @@ -1433,6 +1408,10 @@ body > [data-popper-placement] { } } +.scrollable > div:first-child .detailed-status { + border-top: 0; +} + .detailed-status__meta { margin-top: 16px; color: $dark-text-color; @@ -1984,13 +1963,6 @@ a.account__display-name { .navigation-bar__actions { position: relative; - .icon-button.close { - position: absolute; - pointer-events: none; - transform: scale(0, 1) translate(-100%, 0); - opacity: 0; - } - .compose__action-bar .icon-button { pointer-events: auto; transform: scale(1, 1) translate(0, 0); @@ -2000,19 +1972,21 @@ a.account__display-name { } .navigation-bar__profile { + display: flex; + flex-direction: column; flex: 1 1 auto; line-height: 20px; - overflow: hidden; } .navigation-bar__profile-account { - display: block; + display: inline; font-weight: 500; overflow: hidden; text-overflow: ellipsis; } .navigation-bar__profile-edit { + display: inline; color: inherit; text-decoration: none; } @@ -2069,7 +2043,7 @@ a.account__display-name { font-size: inherit; line-height: inherit; - &:focus { + &:focus-visible { outline: 1px dotted; } } @@ -3590,12 +3564,10 @@ button.icon-button.active i.fa-retweet { } .status-card { + display: block; position: relative; - display: flex; font-size: 14px; - border: 1px solid lighten($ui-base-color, 8%); - border-radius: 4px; - color: $dark-text-color; + color: $darker-text-color; margin-top: 14px; text-decoration: none; overflow: hidden; @@ -3649,8 +3621,29 @@ button.icon-button.active i.fa-retweet { a.status-card { cursor: pointer; - &:hover { - background: lighten($ui-base-color, 8%); + &:hover, + &:focus, + &:active { + .status-card__title, + .status-card__host, + .status-card__author { + color: $highlight-text-color; + } + } +} + +.status-card a { + color: inherit; + text-decoration: none; + + &:hover, + &:focus, + &:active { + .status-card__title, + .status-card__host, + .status-card__author { + color: $highlight-text-color; + } } } @@ -3676,42 +3669,42 @@ a.status-card { .status-card__title { display: block; - font-weight: 500; - margin-bottom: 5px; - color: $darker-text-color; + font-weight: 700; + font-size: 19px; + line-height: 24px; + color: $primary-text-color; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-decoration: none; } .status-card__content { flex: 1 1 auto; overflow: hidden; - padding: 14px 14px 14px 8px; -} - -.status-card__description { - color: $darker-text-color; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; + padding: 15px 0; + padding-bottom: 0; } .status-card__host { display: block; - margin-top: 5px; - font-size: 13px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + font-size: 14px; + margin-bottom: 8px; +} + +.status-card__author { + display: block; + margin-top: 8px; + font-size: 14px; + color: $primary-text-color; + + strong { + font-weight: 500; + } } .status-card__image { - flex: 0 0 100px; + width: 100%; background: lighten($ui-base-color, 8%); position: relative; + border-radius: 8px; & > .fa { font-size: 21px; @@ -3723,50 +3716,8 @@ a.status-card { } } -.status-card.horizontal { - display: block; - - .status-card__image { - width: 100%; - } - - .status-card__image-image, - .status-card__image-preview { - border-radius: 4px 4px 0 0; - } - - .status-card__title { - white-space: inherit; - } -} - -.status-card.compact { - border-color: lighten($ui-base-color, 4%); - - &.interactive { - border: 0; - } - - .status-card__content { - padding: 8px; - padding-top: 10px; - } - - .status-card__title { - white-space: nowrap; - } - - .status-card__image { - flex: 0 0 60px; - } -} - -a.status-card.compact:hover { - background-color: lighten($ui-base-color, 4%); -} - .status-card__image-image { - border-radius: 4px 0 0 4px; + border-radius: 8px; display: block; margin: 0; width: 100%; @@ -3777,7 +3728,7 @@ a.status-card.compact:hover { } .status-card__image-preview { - border-radius: 4px 0 0 4px; + border-radius: 8px; display: block; margin: 0; width: 100%; @@ -3932,7 +3883,6 @@ a.status-card.compact:hover { position: relative; z-index: 2; outline: 0; - overflow: hidden; & > button { margin: 0; @@ -3947,6 +3897,10 @@ a.status-card.compact:hover { overflow: hidden; white-space: nowrap; flex: 1; + + &:focus-visible { + outline: $ui-button-icon-focus-outline; + } } & > .column-header__back-button { @@ -3987,10 +3941,18 @@ a.status-card.compact:hover { font-size: 16px; padding: 0 15px; + &:last-child { + border-start-end-radius: 4px; + } + &:hover { color: lighten($darker-text-color, 4%); } + &:focus-visible { + outline: $ui-button-icon-focus-outline; + } + &.active { color: $primary-text-color; background: lighten($ui-base-color, 4%); @@ -4279,6 +4241,7 @@ a.status-card.compact:hover { margin: 0; border: 0; border-radius: 4px; + color: $white; &__label { display: flex; @@ -4286,7 +4249,6 @@ a.status-card.compact:hover { justify-content: center; gap: 8px; flex-direction: column; - color: $primary-text-color; font-weight: 500; font-size: 14px; } @@ -4648,7 +4610,7 @@ a.status-card.compact:hover { .emoji-picker-dropdown__menu { background: $simple-background-color; position: relative; - box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4); + box-shadow: var(--dropdown-shadow); border-radius: 4px; margin-top: 5px; z-index: 2; @@ -4807,11 +4769,6 @@ a.status-card.compact:hover { outline: 0; cursor: pointer; - &:active, - &:focus { - outline: 0 !important; - } - img { filter: grayscale(100%); opacity: 0.8; @@ -4827,6 +4784,13 @@ a.status-card.compact:hover { img { opacity: 1; filter: none; + border-radius: 100%; + } + } + + &:focus-visible { + img { + outline: $ui-button-icon-focus-outline; } } } @@ -4839,7 +4803,7 @@ a.status-card.compact:hover { .privacy-dropdown__dropdown, .expiration-dropdown__dropdown { background: $simple-background-color; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + box-shadow: var(--dropdown-shadow); border-radius: 4px; overflow: hidden; z-index: 2; @@ -4921,19 +4885,6 @@ a.status-card.compact:hover { .expiration-dropdown__value { background: $simple-background-color; border-radius: 4px 4px 0 0; - box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1); - - .icon-button { - transition: none; - } - - &.active { - background: $ui-highlight-color; - - .icon-button { - color: $primary-text-color; - } - } } &.top .privacy-dropdown__value, @@ -4944,7 +4895,7 @@ a.status-card.compact:hover { .privacy-dropdown__dropdown, .expiration-dropdown__dropdown { display: block; - box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1); + box-shadow: var(--dropdown-shadow); } } @@ -4963,7 +4914,7 @@ a.status-card.compact:hover { .language-dropdown { &__dropdown { background: $simple-background-color; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + box-shadow: var(--dropdown-shadow); border-radius: 4px; overflow: hidden; z-index: 2; @@ -5151,7 +5102,6 @@ a.status-card.compact:hover { position: absolute; top: 16px; inset-inline-end: 10px; - z-index: 2; display: inline-block; opacity: 0; transition: all 100ms linear; @@ -5290,9 +5240,9 @@ a.status-card.compact:hover { display: flex; } -.video-modal__container { +.video-modal .video-player { + max-height: 80vh; max-width: 100vw; - max-height: 100vh; } .audio-modal__container { @@ -6311,7 +6261,7 @@ a.status-card.compact:hover { box-sizing: border-box; margin-top: 8px; overflow: hidden; - border-radius: 4px; + border-radius: 8px; position: relative; width: 100%; min-height: 64px; @@ -6342,7 +6292,7 @@ a.status-card.compact:hover { box-sizing: border-box; display: block; position: relative; - border-radius: 4px; + border-radius: 8px; overflow: hidden; &--tall { @@ -6428,7 +6378,7 @@ a.status-card.compact:hover { box-sizing: border-box; position: relative; background: darken($ui-base-color, 8%); - border-radius: 4px; + border-radius: 8px; padding-bottom: 44px; width: 100%; @@ -6495,7 +6445,7 @@ a.status-card.compact:hover { position: relative; background: $base-shadow-color; max-width: 100%; - border-radius: 4px; + border-radius: 8px; box-sizing: border-box; color: $white; display: flex; @@ -6512,8 +6462,6 @@ a.status-card.compact:hover { video { display: block; - max-width: 100vw; - max-height: 80vh; z-index: 1; } @@ -6521,22 +6469,15 @@ a.status-card.compact:hover { width: 100% !important; height: 100% !important; margin: 0; + aspect-ratio: auto !important; video { - max-width: 100% !important; - max-height: 100% !important; width: 100% !important; height: 100% !important; outline: 0; } } - &.inline { - video { - object-fit: contain; - } - } - &__controls { position: absolute; direction: ltr; @@ -8337,6 +8278,7 @@ noscript { .search__input { border: 1px solid lighten($ui-base-color, 8%); padding: 10px; + padding-inline-end: 28px; } .search__popout { @@ -8365,8 +8307,9 @@ noscript { align-items: center; color: $primary-text-color; text-decoration: none; - padding: 15px 0; + padding: 15px; border-bottom: 1px solid lighten($ui-base-color, 8%); + gap: 15px; &:last-child { border-bottom: 0; @@ -8375,33 +8318,40 @@ noscript { &:hover, &:active, &:focus { - background-color: lighten($ui-base-color, 4%); + color: $highlight-text-color; + + .story__details__publisher, + .story__details__shared { + color: $highlight-text-color; + } } &__details { - padding: 0 15px; flex: 1 1 auto; &__publisher { color: $darker-text-color; - margin-bottom: 4px; + margin-bottom: 8px; } &__title { font-size: 19px; line-height: 24px; font-weight: 500; - margin-bottom: 4px; + margin-bottom: 8px; } &__shared { color: $darker-text-color; } + + strong { + font-weight: 500; + } } &__thumbnail { flex: 0 0 auto; - margin: 0 15px; position: relative; width: 120px; height: 120px; @@ -8412,7 +8362,7 @@ noscript { } img { - border-radius: 4px; + border-radius: 8px; display: block; margin: 0; width: 100%; @@ -8421,7 +8371,7 @@ noscript { } &__preview { - border-radius: 4px; + border-radius: 8px; display: block; margin: 0; width: 100%; @@ -8437,6 +8387,23 @@ noscript { } } } + + &.expanded { + flex-direction: column; + + .story__thumbnail { + order: 1; + width: 100%; + height: auto; + aspect-ratio: 1.91 / 1; + } + + .story__details { + order: 2; + width: 100%; + flex: 0 0 auto; + } + } } .server-banner { diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index bdb87d7cfa..bcc8cfaaec 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -105,7 +105,7 @@ &__input { display: inline-block; position: relative; - border: 1px solid $ui-primary-color; + border: 1px solid $ui-button-background-color; box-sizing: border-box; width: 18px; height: 18px; @@ -121,15 +121,10 @@ border-radius: 4px; } - &.active { - border-color: $valid-value-color; - background: $valid-value-color; - } - &:active, &:focus, &:hover { - border-color: lighten($valid-value-color, 15%); + border-color: $ui-button-focus-background-color; border-width: 4px; } @@ -241,6 +236,14 @@ color: $action-button-color; border-color: $action-button-color; margin-inline-end: 5px; + + &:hover, + &:focus, + &.active { + border-color: $action-button-color; + background-color: $action-button-color; + color: $ui-button-color; + } } li { diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index b212469bd7..40f8c45c35 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -5,6 +5,7 @@ $red-600: #b7253d !default; // Deep Carmine $red-500: #df405a !default; // Cerise $blurple-600: #563acc; // Iris $blurple-500: #6364ff; // Brand purple +$blurple-400: #7477fd; // Medium slate blue $blurple-300: #858afa; // Faded Blue $grey-600: #4e4c5a; // Trout $grey-100: #dadaf3; // Topaz @@ -61,6 +62,9 @@ $ui-button-tertiary-focus-color: $white !default; $ui-button-destructive-background-color: $red-500 !default; $ui-button-destructive-focus-background-color: $red-600 !default; +$ui-button-icon-focus-outline: solid 2px $blurple-400 !default; +$ui-button-icon-hover-background-color: rgba(140, 141, 255, 40%) !default; + // Variables for texts $primary-text-color: $white !default; $darker-text-color: $ui-primary-color !default; diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb index 4de69c1ead..fb442e2c2d 100644 --- a/app/lib/application_extension.rb +++ b/app/lib/application_extension.rb @@ -4,6 +4,8 @@ module ApplicationExtension extend ActiveSupport::Concern included do + has_many :created_users, class_name: 'User', foreign_key: 'created_by_application_id', inverse_of: :created_by_application + validates :name, length: { maximum: 60 } validates :website, url: true, length: { maximum: 2_000 }, if: :website? validates :redirect_uri, length: { maximum: 2_000 } diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index f0aeec0b3e..ffb25db2c1 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -124,6 +124,7 @@ class LinkDetailsExtractor author_url: author_url || '', embed_url: embed_url || '', language: language, + created_at: published_at.presence || Time.now.utc, } end @@ -159,6 +160,10 @@ class LinkDetailsExtractor html_entities.decode(structured_data&.description || opengraph_tag('og:description') || meta_tag('description')) end + def published_at + structured_data&.date_published || opengraph_tag('article:published_time') + end + def image valid_url_or_nil(opengraph_tag('og:image')) end diff --git a/app/lib/request.rb b/app/lib/request.rb index 7386015d6d..c7aafbd4fc 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -284,11 +284,11 @@ class Request end until socks.empty? - _, available_socks, = IO.select(nil, socks, nil, Request::TIMEOUT[:connect]) + _, available_socks, = IO.select(nil, socks, nil, Request::TIMEOUT[:connect_timeout]) if available_socks.nil? socks.each(&:close) - raise HTTP::TimeoutError, "Connect timed out after #{Request::TIMEOUT[:connect]} seconds" + raise HTTP::TimeoutError, "Connect timed out after #{Request::TIMEOUT[:connect_timeout]} seconds" end available_socks.each do |sock| diff --git a/app/lib/vacuum/applications_vacuum.rb b/app/lib/vacuum/applications_vacuum.rb new file mode 100644 index 0000000000..ba88655f16 --- /dev/null +++ b/app/lib/vacuum/applications_vacuum.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class Vacuum::ApplicationsVacuum + def perform + Doorkeeper::Application.where(owner_id: nil) + .where.missing(:created_users, :access_tokens, :access_grants) + .where(created_at: ...1.day.ago) + .in_batches.delete_all + end +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 23e0af3a2a..efff5cdad5 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -5,7 +5,7 @@ class ApplicationRecord < ActiveRecord::Base include Remotable - connects_to database: { writing: :primary, reading: :read } + connects_to database: { writing: :primary, reading: ENV['DB_REPLICA_NAME'] || ENV['READ_DATABASE_URL'] ? :read : :primary } class << self def update_index(_type_name, *_args, &_block) diff --git a/app/models/concerns/has_user_settings.rb b/app/models/concerns/has_user_settings.rb index 0b7a387b9f..b78f67ce1e 100644 --- a/app/models/concerns/has_user_settings.rb +++ b/app/models/concerns/has_user_settings.rb @@ -151,10 +151,6 @@ module HasUserSettings settings['web.trends'] end - def setting_crop_images - settings['web.crop_images'] - end - def setting_disable_swiping settings['web.disable_swiping'] end diff --git a/app/models/report.rb b/app/models/report.rb index 533e3f72ab..f6fd23cf3a 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -58,7 +58,8 @@ class Report < ApplicationRecord before_validation :set_uri, only: :create - after_create_commit :trigger_webhooks + after_create_commit :trigger_create_webhooks + after_update_commit :trigger_update_webhooks def object_type :flag @@ -155,7 +156,11 @@ class Report < ApplicationRecord errors.add(:rule_ids, I18n.t('reports.errors.invalid_rules')) unless rules.size == rule_ids&.size end - def trigger_webhooks + def trigger_create_webhooks TriggerWebhookWorker.perform_async('report.created', 'Report', id) end + + def trigger_update_webhooks + TriggerWebhookWorker.perform_async('report.updated', 'Report', id) + end end diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 34ebe0484d..2007e77fa2 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -32,7 +32,6 @@ class UserSettings setting :emoji_reaction_streaming_notify_impl2, default: false namespace :web do - setting :crop_images, default: true setting :advanced_layout, default: false setting :trends, default: true setting :use_blurhash, default: true diff --git a/app/models/webhook.rb b/app/models/webhook.rb index 14f33c5fc4..044097921e 100644 --- a/app/models/webhook.rb +++ b/app/models/webhook.rb @@ -20,6 +20,7 @@ class Webhook < ApplicationRecord account.created account.updated report.created + report.updated status.created status.updated ).freeze @@ -59,7 +60,7 @@ class Webhook < ApplicationRecord case event when 'account.approved', 'account.created', 'account.updated' :manage_users - when 'report.created' + when 'report.created', 'report.updated' :manage_reports when 'status.created', 'status.updated' :view_devops diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 4d956b7944..b01b434688 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -100,7 +100,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end def name - object.suspended? ? '' : object.display_name + object.suspended? ? object.username : (object.display_name.presence || object.username) end def summary diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 944e03b389..398f50fcb6 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -51,13 +51,11 @@ class InitialStateSerializer < ActiveModel::Serializer store[:use_blurhash] = object.current_account.user.setting_use_blurhash store[:use_pending_items] = object.current_account.user.setting_use_pending_items store[:show_trends] = Setting.trends && object.current_account.user.setting_trends - store[:crop_images] = object.current_account.user.setting_crop_images else store[:auto_play_gif] = Setting.auto_play_gif store[:display_media] = Setting.display_media store[:reduce_motion] = Setting.reduce_motion store[:use_blurhash] = Setting.use_blurhash - store[:crop_images] = Setting.crop_images end store[:disabled_account_id] = object.disabled_account.id.to_s if object.disabled_account diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb index 08bc07edd4..db44abb382 100644 --- a/app/serializers/rest/preview_card_serializer.rb +++ b/app/serializers/rest/preview_card_serializer.rb @@ -6,7 +6,7 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer attributes :url, :title, :description, :language, :type, :author_name, :author_url, :provider_name, :provider_url, :html, :width, :height, - :image, :embed_url, :blurhash + :image, :embed_url, :blurhash, :published_at def image object.image? ? full_asset_url(object.image.url(:original)) : nil @@ -15,4 +15,8 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer def html Sanitize.fragment(object.html, Sanitize::Config::MASTODON_OEMBED) end + + def published_at + object.created_at + end end diff --git a/app/views/admin/announcements/index.html.haml b/app/views/admin/announcements/index.html.haml index ce520f59d3..72227b0457 100644 --- a/app/views/admin/announcements/index.html.haml +++ b/app/views/admin/announcements/index.html.haml @@ -19,4 +19,3 @@ = render partial: 'announcement', collection: @announcements = paginate @announcements - diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml index 941f50102c..3392224855 100644 --- a/app/views/admin/custom_emojis/index.html.haml +++ b/app/views/admin/custom_emojis/index.html.haml @@ -91,4 +91,3 @@ = render partial: 'custom_emoji', collection: @custom_emojis, locals: { f: f } = paginate @custom_emojis - diff --git a/app/views/admin/ip_blocks/index.html.haml b/app/views/admin/ip_blocks/index.html.haml index d5b983de9e..675c0aaad0 100644 --- a/app/views/admin/ip_blocks/index.html.haml +++ b/app/views/admin/ip_blocks/index.html.haml @@ -25,4 +25,3 @@ = render partial: 'ip_block', collection: @ip_blocks, locals: { f: f } = paginate @ip_blocks - diff --git a/app/views/admin/relays/index.html.haml b/app/views/admin/relays/index.html.haml index 1636a53f85..47f8d6f360 100644 --- a/app/views/admin/relays/index.html.haml +++ b/app/views/admin/relays/index.html.haml @@ -17,4 +17,3 @@ %th %tbody = render @relays - diff --git a/app/views/admin/roles/edit.html.haml b/app/views/admin/roles/edit.html.haml index 659ccb8dce..5688b69b1f 100644 --- a/app/views/admin/roles/edit.html.haml +++ b/app/views/admin/roles/edit.html.haml @@ -5,4 +5,3 @@ = link_to t('admin.roles.delete'), admin_role_path(@role), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:destroy, @role) = render partial: 'form' - diff --git a/app/views/settings/applications/show.html.haml b/app/views/settings/applications/show.html.haml index 466a8ba340..be1d13eae6 100644 --- a/app/views/settings/applications/show.html.haml +++ b/app/views/settings/applications/show.html.haml @@ -28,4 +28,3 @@ .actions = f.button :button, t('generic.save_changes'), type: :submit - diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 478ccdb1e6..4b691de9b1 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -37,11 +37,6 @@ = ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping') = ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui') - %h4= t 'appearance.toot_layout' - - .fields-group - = ff.input :'web.crop_images', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_crop_images') - .fields-group = ff.input :'web.hide_recent_emojis', wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_hide_recent_emojis'), hint: false diff --git a/app/workers/scheduler/vacuum_scheduler.rb b/app/workers/scheduler/vacuum_scheduler.rb index 9e884caefd..9c040f6e47 100644 --- a/app/workers/scheduler/vacuum_scheduler.rb +++ b/app/workers/scheduler/vacuum_scheduler.rb @@ -22,6 +22,7 @@ class Scheduler::VacuumScheduler preview_cards_vacuum, backups_vacuum, access_tokens_vacuum, + applications_vacuum, feeds_vacuum, imports_vacuum, ] @@ -55,6 +56,10 @@ class Scheduler::VacuumScheduler Vacuum::ImportsVacuum.new end + def applications_vacuum + Vacuum::ApplicationsVacuum.new + end + def content_retention_policy ContentRetentionPolicy.current end diff --git a/config/application.rb b/config/application.rb index aa0f80cd08..6f21efa8db 100644 --- a/config/application.rb +++ b/config/application.rb @@ -192,7 +192,9 @@ module Mastodon # config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')] config.active_job.queue_adapter = :sidekiq + config.action_mailer.deliver_later_queue_name = 'mailers' + config.action_mailer.preview_path = Rails.root.join('spec', 'mailers', 'previews') # We use our own middleware for this config.public_file_server.enabled = false diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index b3bb336ed2..d0677b80fb 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -65,8 +65,8 @@ ignore_unused: - 'move_handler.carry_{mutes,blocks}_over_text' - 'admin_mailer.*.subject' - 'notification_mailer.*' - - 'imports.overwrite_preambles.{following,blocking,muting,domain_blocking,bookmarks}_html' - - 'imports.preambles.{following,blocking,muting,domain_blocking,bookmarks}_html' + - 'imports.overwrite_preambles.{following,blocking,muting,domain_blocking,bookmarks,lists}_html' + - 'imports.preambles.{following,blocking,muting,domain_blocking,bookmarks,lists}_html' - 'mail_subscriptions.unsubscribe.emails.*' - 'preferences.other' # some locales are missing other keys, therefore leading i18n-tasks to detect `preferences` as plural and not finding use diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 2d5624edd3..2bdf45964f 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -5,7 +5,7 @@ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy def host_to_url(str) - "http#{Rails.configuration.x.use_https ? 's' : ''}://#{str}".split('/').first if str.present? + "http#{Rails.configuration.x.use_https ? 's' : ''}://#{str.split('/').first}" if str.present? end base_host = Rails.configuration.x.web_domain diff --git a/config/initializers/cookie_rotator.rb b/config/initializers/cookie_rotator.rb index 349c363f14..b829b1a90b 100644 --- a/config/initializers/cookie_rotator.rb +++ b/config/initializers/cookie_rotator.rb @@ -1,5 +1,10 @@ # frozen_string_literal: true +# TODO: Remove after 4.2.0 +Rails.application.configure do + config.active_support.key_generator_hash_digest_class = OpenSSL::Digest::SHA1 +end + Rails.application.config.after_initialize do Rails.application.config.action_dispatch.cookies_rotations.tap do |cookies| authenticated_encrypted_cookie_salt = Rails.application.config.action_dispatch.authenticated_encrypted_cookie_salt @@ -7,8 +12,9 @@ Rails.application.config.after_initialize do secret_key_base = Rails.application.secret_key_base + # TODO: Switch to SHA1 after 4.2.0 key_generator = ActiveSupport::KeyGenerator.new( - secret_key_base, iterations: 1000, hash_digest_class: OpenSSL::Digest::SHA1 + secret_key_base, iterations: 1000, hash_digest_class: OpenSSL::Digest::SHA256 ) key_len = ActiveSupport::MessageEncryptor.key_len diff --git a/config/locales/an.yml b/config/locales/an.yml index e46dcd3ef1..0ae5b5e850 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -922,7 +922,6 @@ an: guide_link: https://crowdin.com/project/mastodon guide_link_text: Totz pueden contribuyir. sensitive_content: Conteniu sensible - toot_layout: Disenyo d'as publicacions application_mailer: notification_preferences: Cambiar preferencias de correu electronico salutation: "%{name}:" diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 25c8665c04..5b7d0cb360 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -981,7 +981,6 @@ ar: guide_link: https://crowdin.com/project/mastodon guide_link_text: يمكن للجميع المساهمة. sensitive_content: المحتوى الحساس - toot_layout: شكل المنشور application_mailer: notification_preferences: تعديل تفضيلات البريد الإلكتروني salutation: "%{name}،" diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 0350ee4ac8..34e662ca49 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -438,7 +438,6 @@ ast: guide_link: https://crowdin.com/project/mastodon guide_link_text: tol mundu pue collaborar. sensitive_content: Conteníu sensible - toot_layout: Distribución de los artículos application_mailer: notification_preferences: Camudar les preferencies de los mensaxes de corréu electrónicu applications: diff --git a/config/locales/be.yml b/config/locales/be.yml index 4464b0f9c2..e3f713f647 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1008,7 +1008,6 @@ be: guide_link: https://be.crowdin.com/project/mastodon/be guide_link_text: Кожны можа зрабіць унёсак. sensitive_content: Далікатны змест - toot_layout: Макет допісу application_mailer: notification_preferences: Змяніць налады эл. пошты salutation: "%{name}," diff --git a/config/locales/bg.yml b/config/locales/bg.yml index ac03d03902..ef273a1ac9 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -972,7 +972,6 @@ bg: guide_link: https://ru.crowdin.com/project/mastodon guide_link_text: Всеки може да участва. sensitive_content: Деликатно съдържание - toot_layout: Оформление на публикацията application_mailer: notification_preferences: Промяна на предпочитанията за имейл salutation: "%{name}," diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 11084e5b6b..3d94d0c31d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -972,7 +972,6 @@ ca: guide_link: https://crowdin.com/project/mastodon guide_link_text: Tothom hi pot contribuir. sensitive_content: Contingut sensible - toot_layout: Disseny dels tuts application_mailer: notification_preferences: Canvia les preferències de correu salutation: "%{name}," diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 5875a2a015..c7f105a72d 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -570,7 +570,6 @@ ckb: body: ماستۆدۆن لەلایەن خۆبەخشەوە وەردەگێڕێت. guide_link_text: هەموو کەسێک دەتوانێت بەشداری بکات. sensitive_content: ناوەڕۆکی هەستیار - toot_layout: لۆی توت application_mailer: notification_preferences: گۆڕینی پەسەندکراوەکانی ئیمەیڵ salutation: "%{name}," diff --git a/config/locales/co.yml b/config/locales/co.yml index 39db6df348..e878d1fd77 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -536,7 +536,6 @@ co: guide_link: https://fr.crowdin.com/project/mastodon guide_link_text: Tuttu u mondu pò participà. sensitive_content: Cuntinutu sensibile - toot_layout: Urganizazione application_mailer: notification_preferences: Cambià e priferenze e-mail salutation: "%{name}," diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 79c40c1eb7..a346bd998d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -996,7 +996,6 @@ cs: guide_link: https://cs.crowdin.com/project/mastodon guide_link_text: Zapojit se může každý. sensitive_content: Citlivý obsah - toot_layout: Rozložení příspěvků application_mailer: notification_preferences: Změnit předvolby e-mailů salutation: "%{name}," diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a9e7ab4aa2..ac1f41de07 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1046,7 +1046,6 @@ cy: guide_link: https://crowdin.com/project/mastodon guide_link_text: Gall pawb gyfrannu. sensitive_content: Cynnwys sensitif - toot_layout: Cynllun postiad application_mailer: notification_preferences: Newid gosodiadau e-bost salutation: "%{name}," diff --git a/config/locales/da.yml b/config/locales/da.yml index aac8268ef8..4b9d348712 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -972,7 +972,6 @@ da: guide_link: https://da.crowdin.com/project/mastodon guide_link_text: Alle kan bidrage. sensitive_content: Sensitivt indhold - toot_layout: Indlægslayout application_mailer: notification_preferences: Skift e-mailpræferencer salutation: "%{name}" diff --git a/config/locales/de.yml b/config/locales/de.yml index cc0da6c777..5adb255cea 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -972,7 +972,6 @@ de: guide_link: https://de.crowdin.com/project/mastodon/de guide_link_text: Alle können mitmachen und etwas dazu beitragen. sensitive_content: Inhaltswarnung - toot_layout: Timeline-Layout application_mailer: notification_preferences: E-Mail-Einstellungen ändern salutation: "%{name}," diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index a28f91c0e0..0432a5e3fb 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -127,7 +127,7 @@ en: bookmarks: Bookmarks conversations: Conversations crypto: End-to-end encryption - favourites: Favourites + favourites: Favorites filters: Filters follow: Follows, Mutes and Blocks follows: Follows @@ -170,7 +170,7 @@ en: read:accounts: see accounts information read:blocks: see your blocks read:bookmarks: see your bookmarks - read:favourites: see your favourites + read:favourites: see your favorites read:filters: see your filters read:follows: see your follows read:lists: see your lists @@ -184,7 +184,7 @@ en: write:blocks: block accounts and domains write:bookmarks: bookmark posts write:conversations: mute and delete conversations - write:favourites: favourite posts + write:favourites: favorite posts write:filters: create filters write:follows: follow people write:lists: create lists diff --git a/config/locales/el.yml b/config/locales/el.yml index 6ccc9de0de..dba37412ef 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -960,7 +960,6 @@ el: guide_link: https://crowdin.com/project/mastodon guide_link_text: Μπορεί να συνεισφέρει ο οποιοσδήποτε. sensitive_content: Ευαίσθητο περιεχόμενο - toot_layout: Διαρρύθμιση αναρτήσεων application_mailer: notification_preferences: Αλλαγή προτιμήσεων email salutation: "%{name}," diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 2b1cb0e92a..b52cd21291 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -972,7 +972,6 @@ en-GB: guide_link: https://crowdin.com/project/mastodon guide_link_text: Everyone can contribute. sensitive_content: Sensitive content - toot_layout: Post layout application_mailer: notification_preferences: Change e-mail preferences salutation: "%{name}," diff --git a/config/locales/en.yml b/config/locales/en.yml index 0eba018e29..93593e2569 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1073,7 +1073,6 @@ en: guide_link: https://crowdin.com/project/mastodon guide_link_text: Everyone can contribute. sensitive_content: Sensitive content - toot_layout: Post layout application_mailer: notification_preferences: Change e-mail preferences salutation: "%{name}," @@ -1379,12 +1378,14 @@ en: bookmarks_html: You are about to <strong>replace your bookmarks</strong> with up to <strong>%{total_items} posts</strong> from <strong>%{filename}</strong>. domain_blocking_html: You are about to <strong>replace your domain block list</strong> with up to <strong>%{total_items} domains</strong> from <strong>%{filename}</strong>. following_html: You are about to <strong>follow</strong> up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong> and <strong>stop following anyone else</strong>. + lists_html: You are about to <strong>replace your lists</strong> with contents of <strong>%{filename}</strong>. Up to <strong>%{total_items} accounts</strong> will be added to new lists. muting_html: You are about to <strong>replace your list of muted accounts</strong> with up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong>. preambles: blocking_html: You are about to <strong>block</strong> up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong>. bookmarks_html: You are about to add up to <strong>%{total_items} posts</strong> from <strong>%{filename}</strong> to your <strong>bookmarks</strong>. domain_blocking_html: You are about to <strong>block</strong> up to <strong>%{total_items} domains</strong> from <strong>%{filename}</strong>. following_html: You are about to <strong>follow</strong> up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong>. + lists_html: You are about to add up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong> to your <strong>lists</strong>. New lists will be created if there is no list to add to. muting_html: You are about to <strong>mute</strong> up to <strong>%{total_items} accounts</strong> from <strong>%{filename}</strong>. preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking. recent_imports: Recent imports @@ -1401,6 +1402,7 @@ en: bookmarks: Importing bookmarks domain_blocking: Importing blocked domains following: Importing followed accounts + lists: Importing lists muting: Importing muted accounts type: Import type type_groups: @@ -1411,6 +1413,7 @@ en: bookmarks: Bookmarks domain_blocking: Domain blocking list following: Following list + lists: Lists muting: Muting list upload: Upload invites: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 1ee8d34a47..0507c10303 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -972,7 +972,6 @@ eo: guide_link: https://crowdin.com/project/mastodon guide_link_text: Ĉiu povas kontribui. sensitive_content: Tikla enhavo - toot_layout: Mesaĝo aranĝo application_mailer: notification_preferences: Ŝanĝi retmesaĝajn preferojn salutation: "%{name}," diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 12f7d73828..6e18476146 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -972,7 +972,6 @@ es-AR: guide_link: https://es.crowdin.com/project/mastodon guide_link_text: Todos pueden contribuir. sensitive_content: Contenido sensible - toot_layout: Diseño del mensaje application_mailer: notification_preferences: Cambiar configuración de correo electrónico salutation: "%{name}:" diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 008f72fe4c..1894dd00d2 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -972,7 +972,6 @@ es-MX: guide_link: https://es.crowdin.com/project/mastodon guide_link_text: Todos pueden contribuir. sensitive_content: Contenido sensible - toot_layout: Diseño de los toots application_mailer: notification_preferences: Cambiar preferencias de correo electrónico salutation: "%{name}:" diff --git a/config/locales/es.yml b/config/locales/es.yml index fc8f8260da..2b9359762a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -972,7 +972,6 @@ es: guide_link: https://es.crowdin.com/project/mastodon guide_link_text: Todos pueden contribuir. sensitive_content: Contenido sensible - toot_layout: Diseño de las publicaciones application_mailer: notification_preferences: Cambiar preferencias de correo electrónico salutation: "%{name}:" diff --git a/config/locales/et.yml b/config/locales/et.yml index 574c1432f6..f12766ba64 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -972,7 +972,6 @@ et: guide_link: https://crowdin.com/project/mastodon/et guide_link_text: Panustada võib igaüks! sensitive_content: Tundlik sisu - toot_layout: Postituse väljanägemine application_mailer: notification_preferences: Muuda e-kirjade eelistusi salutation: "%{name}!" diff --git a/config/locales/eu.yml b/config/locales/eu.yml index b4c95f2f14..20cc5bd47a 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -969,7 +969,6 @@ eu: guide_link: https://crowdin.com/project/mastodon guide_link_text: Edonork lagundu dezake. sensitive_content: Eduki hunkigarria - toot_layout: Bidalketen diseinua application_mailer: notification_preferences: Aldatu e-mail hobespenak salutation: "%{name}," diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 2b2d677e90..508c7ac402 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -820,7 +820,6 @@ fa: guide_link: https://crowdin.com/project/mastodon guide_link_text: همه میتوانند کمک کنند. sensitive_content: محتوای حساس - toot_layout: آرایش فرسته application_mailer: notification_preferences: تغییر ترجیحات ایمیل salutation: "%{name}،" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index b9b46d98ad..41fdf98960 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -972,7 +972,6 @@ fi: guide_link: https://crowdin.com/project/mastodon guide_link_text: Kaikki voivat osallistua. sensitive_content: Arkaluonteinen sisältö - toot_layout: Viestin asettelu application_mailer: notification_preferences: Muuta sähköpostiasetuksia salutation: "%{name}," diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 6c5611caba..7318de7225 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -972,7 +972,6 @@ fo: guide_link: https://crowdin.com/project/mastodon guide_link_text: Øll kunnu geva íkast. sensitive_content: Viðkvæmt innihald - toot_layout: Uppseting av postum application_mailer: notification_preferences: Broyt teldupostastillingar salutation: "%{name}" diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml index 9193132574..f640ee2f63 100644 --- a/config/locales/fr-QC.yml +++ b/config/locales/fr-QC.yml @@ -972,7 +972,6 @@ fr-QC: guide_link: https://fr.crowdin.com/project/mastodon guide_link_text: Tout le monde peut y contribuer. sensitive_content: Contenu sensible - toot_layout: Agencement des messages application_mailer: notification_preferences: Modifier les préférences de courriel salutation: "%{name}," diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 741f3a13d9..ea0b116bf1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -972,7 +972,6 @@ fr: guide_link: https://fr.crowdin.com/project/mastodon guide_link_text: Tout le monde peut y contribuer. sensitive_content: Contenu sensible - toot_layout: Agencement des messages application_mailer: notification_preferences: Modifier les préférences de courriel salutation: "%{name}," diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 3099cba663..3c34cc1bbb 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -972,7 +972,6 @@ fy: guide_link: https://crowdin.com/project/mastodon/fy guide_link_text: Elkenien kin bydrage. sensitive_content: Gefoelige ynhâld - toot_layout: Lay-out fan berjochten application_mailer: notification_preferences: E-mailynstellingen wizigje salutation: "%{name}," diff --git a/config/locales/gd.yml b/config/locales/gd.yml index d1842b19ef..fcd90ac0e2 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1008,7 +1008,6 @@ gd: guide_link: https://crowdin.com/project/mastodon guide_link_text: '’S urrainn do neach sam bith cuideachadh.' sensitive_content: Susbaint fhrionasach - toot_layout: Co-dhealbhachd nam postaichean application_mailer: notification_preferences: Atharraich roghainnean a’ phuist-d salutation: "%{name}," diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 39180552b2..f60ef234c7 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -972,7 +972,6 @@ gl: guide_link: https://crowdin.com/project/mastodon guide_link_text: Todas podemos contribuír. sensitive_content: Contido sensible - toot_layout: Disposición da publicación application_mailer: notification_preferences: Cambiar os axustes de email salutation: "%{name}," diff --git a/config/locales/he.yml b/config/locales/he.yml index 2487c5f1fd..6ffc356c8c 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1008,7 +1008,6 @@ he: guide_link: https://crowdin.com/project/mastodon guide_link_text: כולם יכולים לתרום. sensitive_content: תוכן רגיש - toot_layout: פריסת הודעה application_mailer: notification_preferences: שינוי העדפות דוא"ל salutation: "%{name}," diff --git a/config/locales/hu.yml b/config/locales/hu.yml index d1c86fcfc2..acb0f9555a 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -972,7 +972,6 @@ hu: guide_link: https://crowdin.com/project/mastodon guide_link_text: Bárki közreműködhet. sensitive_content: Kényes tartalom - toot_layout: Bejegyzések elrendezése application_mailer: notification_preferences: E-mail beállítások módosítása salutation: "%{name}!" diff --git a/config/locales/id.yml b/config/locales/id.yml index e1e136c8d2..327e696f12 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -900,7 +900,6 @@ id: guide_link: https://crowdin.com/project/mastodon guide_link_text: Siapa saja bisa berkontribusi. sensitive_content: Konten sensitif - toot_layout: Tata letak kiriman application_mailer: notification_preferences: Ubah pilihan email salutation: "%{name}," diff --git a/config/locales/io.yml b/config/locales/io.yml index 42786dad00..6f0b26c979 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -879,7 +879,6 @@ io: guide_link: https://crowdin.com/project/mastodon guide_link_text: Omnu povas kontributar. sensitive_content: Sentoza kontenajo - toot_layout: Postostrukturo application_mailer: notification_preferences: Chanjez retpostopreferaji salutation: "%{name}," diff --git a/config/locales/is.yml b/config/locales/is.yml index b77baa211c..39e34fd1e6 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -974,7 +974,6 @@ is: guide_link: https://crowdin.com/project/mastodon/is guide_link_text: Allir geta tekið þátt. sensitive_content: Viðkvæmt efni - toot_layout: Framsetning færslu application_mailer: notification_preferences: Breyta kjörstillingum tölvupósts salutation: "%{name}," diff --git a/config/locales/it.yml b/config/locales/it.yml index fd9dca3e75..6695726b07 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -972,7 +972,6 @@ it: guide_link: https://it.crowdin.com/project/mastodon guide_link_text: Tutti possono contribuire. sensitive_content: Contenuto sensibile - toot_layout: Layout dei toot application_mailer: notification_preferences: Cambia preferenze email salutation: "%{name}," diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 965c0af48d..3adc594476 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1071,7 +1071,6 @@ ja: guide_link: https://ja.crowdin.com/project/mastodon guide_link_text: 誰でも参加することができます。 sensitive_content: 閲覧注意コンテンツ - toot_layout: 投稿のレイアウト application_mailer: notification_preferences: メール設定の変更 salutation: "%{name}さん" diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 4c4905e75d..38d0142e8d 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -319,7 +319,6 @@ kk: confirmation_dialogs: Пікірталас диалогтары discovery: Пікірталас sensitive_content: Нәзік контент - toot_layout: Жазба формасы application_mailer: notification_preferences: Change e-mail prеferences settings: 'Change e-mail preferеnces: %{link}' diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 018a54f3f8..178ef08d6b 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -954,7 +954,6 @@ ko: guide_link: https://crowdin.com/project/mastodon guide_link_text: 누구나 기여할 수 있습니다. sensitive_content: 민감한 내용 - toot_layout: 게시물 레이아웃 application_mailer: notification_preferences: 메일 설정 변경 salutation: "%{name} 님," diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 0733a73a5e..18cce48ce8 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -917,7 +917,6 @@ ku: guide_link: https://crowdin.com/project/mastodon guide_link_text: Herkes dikare beşdar bibe. sensitive_content: Naveroka hestiyarî - toot_layout: Xêzkirina şandîya application_mailer: notification_preferences: Sazkariyên e-nameyê biguherîne salutation: "%{name}," diff --git a/config/locales/lv.yml b/config/locales/lv.yml index ee8737883a..0ba4cd5e39 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -978,7 +978,6 @@ lv: guide_link: https://crowdin.com/project/mastodon guide_link_text: Ikviens var piedalīties. sensitive_content: Sensitīvs saturs - toot_layout: Ziņas izskats application_mailer: notification_preferences: Mainīt e-pasta uztādījumus salutation: "%{name}," diff --git a/config/locales/my.yml b/config/locales/my.yml index be72ca0979..975bdc2c7b 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -954,7 +954,6 @@ my: guide_link: https://crowdin.com/project/mastodon guide_link_text: လူတိုင်းပါဝင်ကူညီနိုင်ပါတယ်။ sensitive_content: သတိထားရသော အကြောင်းအရာ - toot_layout: ပို့စ်အပြင်အဆင် application_mailer: notification_preferences: အီးမေးလ် သတ်မှတ်ချက်များကို ပြောင်းပါ salutation: "%{name}" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 150798e0d4..5a19a0ac69 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -972,7 +972,6 @@ nl: guide_link: https://crowdin.com/project/mastodon/nl guide_link_text: Iedereen kan bijdragen. sensitive_content: Gevoelige inhoud - toot_layout: Lay-out van berichten application_mailer: notification_preferences: E-mailvoorkeuren wijzigen salutation: "%{name}," diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 19ead16caf..6cf282426b 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -964,7 +964,6 @@ nn: guide_link: https://crowdin.com/project/mastodon guide_link_text: Alle kan bidra. sensitive_content: Ømtolig innhald - toot_layout: Tutoppsett application_mailer: notification_preferences: Endr e-post-innstillingane salutation: "Hei %{name}," diff --git a/config/locales/no.yml b/config/locales/no.yml index 19b8228ea2..adffaef851 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -913,7 +913,6 @@ guide_link: https://crowdin.com/project/mastodon guide_link_text: Alle kan bidra. sensitive_content: Følsomt innhold - toot_layout: Innleggsoppsett application_mailer: notification_preferences: Endre E-postinnstillingene salutation: "%{name}," diff --git a/config/locales/oc.yml b/config/locales/oc.yml index aec6234e32..5bf4f343ac 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -458,7 +458,6 @@ oc: body: Mastodon es traduch per de benevòls. guide_link_text: Tot lo monde pòt contribuïr. sensitive_content: Contengut sensible - toot_layout: Disposicion del tut application_mailer: notification_preferences: Cambiar las preferéncias de corrièl salutation: "%{name}," diff --git a/config/locales/pl.yml b/config/locales/pl.yml index f60078b062..35ba087f7d 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1008,7 +1008,6 @@ pl: guide_link: https://pl.crowdin.com/project/mastodon guide_link_text: Każdy może wnieść swój wkład. sensitive_content: Wrażliwa zawartość - toot_layout: Wygląd wpisów application_mailer: notification_preferences: Zmień ustawienia e-maili salutation: "%{name}," diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 79f77f6c02..4d89642f0b 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -972,7 +972,6 @@ pt-BR: guide_link: https://br.crowdin.com/project/mastodon guide_link_text: Todos podem contribuir. sensitive_content: Conteúdo sensível - toot_layout: Formato da publicação application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index ae5a605797..725dd5ec54 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -972,7 +972,6 @@ pt-PT: guide_link: https://pt.crowdin.com/project/mastodon/ guide_link_text: Todos podem contribuir. sensitive_content: Conteúdo problemático - toot_layout: Disposição da publicação application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," diff --git a/config/locales/ro.yml b/config/locales/ro.yml index c4e242f475..65a007833b 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -407,7 +407,6 @@ ro: localization: guide_link_text: Toată lumea poate contribui. sensitive_content: Conținut sensibil - toot_layout: Aspect postare application_mailer: notification_preferences: Modifică preferințe e-mail settings: 'Modifică preferințe e-mail: %{link}' diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 6488147651..538bf0ae13 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1008,7 +1008,6 @@ ru: guide_link: https://ru.crowdin.com/project/mastodon guide_link_text: Каждый может внести свой вклад. sensitive_content: Содержимое деликатного характера - toot_layout: Структура постов application_mailer: notification_preferences: Настроить уведомления можно здесь salutation: "%{name}," diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 9187ef0a60..d9fb213cbe 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -490,7 +490,6 @@ sc: guide_link: https://crowdin.com/project/mastodon guide_link_text: Chie si siat podet contribuire. sensitive_content: Cuntenutu sensìbile - toot_layout: Dispositzione de is tuts application_mailer: notification_preferences: Muda is preferèntzias de posta salutation: "%{name}," diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 6dd93bbaa9..0a44a46f8b 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -912,7 +912,6 @@ sco: guide_link: https://crowdin.com/project/mastodon guide_link_text: Awbody kin contribute. sensitive_content: Sensitive content - toot_layout: Post leyoot application_mailer: notification_preferences: Chynge email preferences salutation: "%{name}," diff --git a/config/locales/si.yml b/config/locales/si.yml index 5a1f749d00..5f2b8b0f74 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -756,7 +756,6 @@ si: guide_link: https://crowdin.com/project/mastodon guide_link_text: සෑම කෙනෙකුටම දායක විය හැකිය. sensitive_content: සංවේදී අන්තර්ගතය - toot_layout: පෝස්ට් පිරිසැලසුම application_mailer: notification_preferences: ඊමේල් මනාප වෙනස් කරන්න salutation: "%{name}," diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index 414f0e2b56..b7f6ce5f3f 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -191,7 +191,6 @@ an: setting_always_send_emails: Ninviar siempre notificacions per correu setting_auto_play_gif: Reproducir automaticament los GIFs animaus setting_boost_modal: Amostrar finestra de confirmación antes de retutar - setting_crop_images: Retallar a 16x9 las imachens d'as publicacions no expandidas setting_default_language: Idioma de publicación setting_default_privacy: Privacidat de publicacions setting_default_sensitive: Marcar siempre imachens como sensibles diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 0240eb5624..29a73671b4 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -199,7 +199,6 @@ ar: setting_always_send_emails: ارسل إشعارات البريد الإلكتروني دائماً setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة setting_boost_modal: إظهار مربع حوار التأكيد قبل إعادة مشاركة أي منشور - setting_crop_images: قص الصور في المنشورات غير الموسعة إلى 16x9 setting_default_language: لغة النشر setting_default_privacy: خصوصية المنشور setting_default_sensitive: اعتبر الوسائط دائما كمحتوى حساس diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index ec1570f2bf..f37115aab7 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -110,7 +110,6 @@ ast: setting_always_send_emails: Unviar siempres los avisos per corréu electrónicu setting_auto_play_gif: Reproducir automáticamente los GIFs setting_boost_modal: Amosar el diálogu de confirmación enantes de compartir un artículu - setting_crop_images: Recortar les imáxenes de los artículos ensin espander a la proporción 16:9 setting_default_language: Llingua de los artículos setting_default_privacy: Privacidá de los artículos setting_default_sensitive: Marcar siempres tol conteníu como sensible diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 8227690664..cb0b6db642 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -199,7 +199,6 @@ be: setting_always_send_emails: Заўжды дасылаць для апавяшчэнні эл. пошты setting_auto_play_gif: Аўтапрайграванне анімаваных GIF setting_boost_modal: Паказваць акно пацвярджэння перад пашырэннем - setting_crop_images: У неразгорнутых допісах абразаць відарысы да 16:9 setting_default_language: Мова допісаў setting_default_privacy: Прыватнасць допісаў setting_default_sensitive: Заўсёды пазначаць кантэнт як далікатны diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 4d8cca070e..66b8eb925b 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -199,7 +199,6 @@ bg: setting_always_send_emails: Все да се пращат известия по имейла setting_auto_play_gif: Самопускащи се анимирани гифчета setting_boost_modal: Показване на прозорец за потвърждение преди подсилване - setting_crop_images: Изрязване на образи в неразгънати публикации до 16x9 setting_default_language: Език на публикуване setting_default_privacy: Поверителност на публикуване setting_default_sensitive: Все да се бележи мултимедията като деликатна diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index f06999072b..7e8cdf71d3 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -199,7 +199,6 @@ ca: setting_always_send_emails: Envia'm sempre notificacions per correu electrònic setting_auto_play_gif: Reprodueix automàticament els GIF animats setting_boost_modal: Mostra la finestra de confirmació abans d'impulsar - setting_crop_images: Retalla les imatges en tuts no ampliats a 16x9 setting_default_language: Llengua dels tuts setting_default_privacy: Privacitat dels tuts setting_default_sensitive: Marcar sempre el contingut gràfic com a sensible diff --git a/config/locales/simple_form.ckb.yml b/config/locales/simple_form.ckb.yml index 1facd567af..8aef876592 100644 --- a/config/locales/simple_form.ckb.yml +++ b/config/locales/simple_form.ckb.yml @@ -135,7 +135,6 @@ ckb: setting_aggregate_reblogs: گرووپی توتەکان یەکبخە setting_auto_play_gif: خۆکاربەخشکردنی GIFــەکان setting_boost_modal: پیشاندانی دیالۆگی دووپاتکردنەوە پێش دوبارە توتاندن - setting_crop_images: لە تووتی نەکراوە،وینەکان لە ئەندازی ۱٦×۹ ببڕە setting_default_language: زمانی نووسراوەکانتان setting_default_privacy: چوارچێوەی تایبەتێتی ئێوە setting_default_sensitive: هەمیشە نیشانکردنی میدیا وەک هەستیار diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 628837aa4e..253ccccf4e 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -136,7 +136,6 @@ co: setting_aggregate_reblogs: Gruppà e spartere indè e linee setting_auto_play_gif: Lettura autumatica di i GIF animati setting_boost_modal: Mustrà una cunfirmazione per sparte un statutu - setting_crop_images: Riquatrà i ritratti in 16x9 indè i statuti micca selezziunati setting_default_language: Lingua di pubblicazione setting_default_privacy: Cunfidenzialità di i statuti setting_default_sensitive: Sempre cunsiderà media cum’è sensibili diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index e04bd599a7..efb204bd79 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -194,7 +194,6 @@ cs: setting_always_send_emails: Vždy posílat e-mailová oznámení setting_auto_play_gif: Automaticky přehrávat animace GIF setting_boost_modal: Před boostnutím zobrazovat potvrzovací okno - setting_crop_images: Ořezávat obrázky v nerozbalených příspěvcích na 16x9 setting_default_language: Jazyk příspěvků setting_default_privacy: Soukromí příspěvků setting_default_sensitive: Vždy označovat média jako citlivá diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 30bc18f55c..bb2056d7b2 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -199,7 +199,6 @@ cy: setting_always_send_emails: Anfonwch hysbysiadau e-bost bob amser setting_auto_play_gif: Chwarae GIFs wedi'u hanimeiddio yn awtomatig setting_boost_modal: Dangos deialog cadarnhau cyn rhoi hwb - setting_crop_images: Tocio delweddau o fewn postiadau nad ydynt wedi'u hehangu i 16x9 setting_default_language: Iaith postio setting_default_privacy: Preifatrwydd cyhoeddi setting_default_sensitive: Marcio cyfryngau fel eu bod yn sensitif bob tro diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index b8d6d2b854..19b6327804 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -199,7 +199,6 @@ da: setting_always_send_emails: Send altid en e-mailnotifikationer setting_auto_play_gif: Autoafspil animerede GIF'er setting_boost_modal: Vis bekræftelsesdialog inden boosting - setting_crop_images: Beskær billeder i ikke-ekspanderede indlæg til 16x9 setting_default_language: Sprog for indlæg setting_default_privacy: Fortrolighed for indlæg setting_default_sensitive: Markér altid medier som sensitive diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index dc12cb3acd..0d1d140221 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -199,7 +199,6 @@ de: setting_always_send_emails: Benachrichtigungen immer senden setting_auto_play_gif: Animierte GIFs automatisch abspielen setting_boost_modal: Bestätigungsdialog beim Teilen eines Beitrags anzeigen - setting_crop_images: Bilder in nicht ausgeklappten Beiträgen auf 16:9 zuschneiden setting_default_language: Beitragssprache setting_default_privacy: Beitragssichtbarkeit setting_default_sensitive: Eigene Medien immer mit einer Inhaltswarnung versehen diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 60a63f2d9b..273fc26bbf 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -194,7 +194,6 @@ el: setting_always_send_emails: Πάντα να αποστέλλονται ειδοποίησεις μέσω email setting_auto_play_gif: Αυτόματη αναπαραγωγή των GIF setting_boost_modal: Επιβεβαίωση πριν την προώθηση - setting_crop_images: Περιορισμός των εικόνων σε μη-ανεπτυγμένα τουτ σε αναλογία 16x9 setting_default_language: Γλώσσα δημοσιεύσεων setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων setting_default_sensitive: Σημείωση όλων των πολυμέσων ως ευαίσθητου περιεχομένου diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index 41e6ff679b..e07eef3919 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -199,7 +199,6 @@ en-GB: setting_always_send_emails: Always send e-mail notifications setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialogue before boosting - setting_crop_images: Crop images in non-expanded posts to 16x9 setting_default_language: Posting language setting_default_privacy: Posting privacy setting_default_sensitive: Always mark media as sensitive diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 749ab6eb82..68d5b1633d 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -211,7 +211,6 @@ en: setting_auto_play_gif: Auto-play animated GIFs setting_bio_markdown: Enable profile markdown setting_boost_modal: Show confirmation dialog before boosting - setting_crop_images: Crop images in non-expanded posts to 16x9 setting_default_language: Posting language setting_default_privacy: Posting privacy setting_default_reblog_privacy: Reblogging privacy diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index ac2627ef16..26b21851bd 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -199,7 +199,6 @@ eo: setting_always_send_emails: Ĉiam sendi la sciigojn per retpoŝto setting_auto_play_gif: Aŭtomate ekigi GIF-ojn setting_boost_modal: Montri konfirman fenestron antaŭ ol diskonigi mesaĝon - setting_crop_images: Stuci bildojn en negrandigitaj mesaĝoj al 16x9 setting_default_language: Publikada lingvo setting_default_privacy: Privateco de afiŝado setting_default_sensitive: Ĉiam marki plurmediojn kiel tiklaj diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index a1482fa6a6..8431884b92 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -199,7 +199,6 @@ es-AR: setting_always_send_emails: Siempre enviar notificaciones por correo electrónico setting_auto_play_gif: Reproducir automáticamente los GIFs animados setting_boost_modal: Mostrar diálogo de confirmación antes de adherir - setting_crop_images: Recortar imágenes en mensajes no expandidos a 16x9 setting_default_language: Idioma de tus mensajes setting_default_privacy: Privacidad de mensajes setting_default_sensitive: Siempre marcar medios como sensibles diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index d128e26e32..6c794b9c92 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -199,7 +199,6 @@ es-MX: setting_always_send_emails: Enviar siempre notificaciones por correo setting_auto_play_gif: Reproducir automáticamente los GIFs animados setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot - setting_crop_images: Recortar a 16x9 las imágenes de los toots no expandidos setting_default_language: Idioma de publicación setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 0cd077c4cb..8aaf0cd5ac 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -199,7 +199,6 @@ es: setting_always_send_emails: Enviar siempre notificaciones por correo setting_auto_play_gif: Reproducir automáticamente los GIFs animados setting_boost_modal: Mostrar ventana de confirmación antes de impulsar - setting_crop_images: Recortar a 16x9 las imágenes de las publicaciones no expandidas setting_default_language: Idioma de publicación setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index eb4ec696c8..b39b934bda 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -199,7 +199,6 @@ et: setting_always_send_emails: Edasta kõik teavitused meilile setting_auto_play_gif: Esita GIF-e automaatselt setting_boost_modal: Näita enne jagamist kinnitusdialoogi - setting_crop_images: Laiendamata postitustes kärbi pildid 16:9 küljesuhtesse setting_default_language: Postituse keel setting_default_privacy: Postituse nähtavus setting_default_sensitive: Alati märgista meedia tundlikuks diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 3592e13b39..bcf2f3e7fe 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -194,7 +194,6 @@ eu: setting_always_send_emails: Bidali beti eposta jakinarazpenak setting_auto_play_gif: Erreproduzitu GIF animatuak automatikoki setting_boost_modal: Erakutsi baieztapen elkarrizketa-koadroa bultzada eman aurretik - setting_crop_images: Moztu irudiak hedatu gabeko tootetan 16x9 proportzioan setting_default_language: Argitalpenen hizkuntza setting_default_privacy: Mezuen pribatutasuna setting_default_sensitive: Beti markatu edukiak hunkigarri gisa diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index ea746bd276..9481d641f5 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -168,7 +168,6 @@ fa: setting_always_send_emails: فرستادن همیشگی آگاهیهای رایانامهای setting_auto_play_gif: پخش خودکار تصویرهای متحرک setting_boost_modal: نمایش پیغام تأیید پیش از تقویت کردن - setting_crop_images: در فرستههای ناگسترده، تصویرها را به ابعاد ۱۶×۹ کوچک کن setting_default_language: زبان نوشتههای شما setting_default_privacy: حریم خصوصی نوشتهها setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index a22461389a..7d43378c22 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -199,7 +199,6 @@ fi: setting_always_send_emails: Lähetä aina sähköposti-ilmoituksia setting_auto_play_gif: Toista GIF-animaatiot automaattisesti setting_boost_modal: Kysy vahvistus ennen tehostusta - setting_crop_images: Rajaa kuvat avaamattomissa tuuttauksissa 16:9 kuvasuhteeseen setting_default_language: Julkaisujen kieli setting_default_privacy: Viestin näkyvyys setting_default_sensitive: Merkitse media aina arkaluontoiseksi diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 9c7b817699..75ff2d8a59 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -199,7 +199,6 @@ fo: setting_always_send_emails: Send altíð fráboðanir við telduposti setting_auto_play_gif: Spæl teknimyndagjørdar GIFar sjálvvirkandi setting_boost_modal: Vís váttanarmynd, áðrenn tú stimbrar postar - setting_crop_images: Sker myndir til lutfallið 16x9 í postum, sum ikki eru víðkaðir setting_default_language: Mál, sum verður brúkt til postar setting_default_privacy: Hvussu privatir eru postar? setting_default_sensitive: Merk altíð miðlafílur sum viðkvæmar diff --git a/config/locales/simple_form.fr-QC.yml b/config/locales/simple_form.fr-QC.yml index 6f9a31ba17..6f5d02f8e6 100644 --- a/config/locales/simple_form.fr-QC.yml +++ b/config/locales/simple_form.fr-QC.yml @@ -199,7 +199,6 @@ fr-QC: setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Demander confirmation avant de partager un message - setting_crop_images: Recadrer en 16x9 les images des messages qui ne sont pas ouverts en vue détaillée setting_default_language: Langue de publication setting_default_privacy: Confidentialité des messages setting_default_sensitive: Toujours marquer les médias comme sensibles diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 5a31dcdc1f..38125bb4eb 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -199,7 +199,6 @@ fr: setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Demander confirmation avant de partager un message - setting_crop_images: Recadrer en 16x9 les images des messages qui ne sont pas ouverts en vue détaillée setting_default_language: Langue de publication setting_default_privacy: Confidentialité des messages setting_default_sensitive: Toujours marquer les médias comme sensibles diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 637f48a151..6004610cec 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -199,7 +199,6 @@ fy: setting_always_send_emails: Altyd e-mailmeldingen ferstjoere setting_auto_play_gif: Spylje animearre GIF’s automatysk ôf setting_boost_modal: Freegje foar it boosten fan in berjocht in befêstiging - setting_crop_images: Ofbyldingen bysnije oant 16x9 yn berjochten op tiidlinen setting_default_language: Taal fan jo berjochten setting_default_privacy: Sichtberheid fan nije berjochten setting_default_sensitive: Media altyd as gefoelich markearje diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 90c1a48e26..a7fc3ff1f2 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -199,7 +199,6 @@ gd: setting_always_send_emails: Cuir brathan puist-d an-còmhnaidh setting_auto_play_gif: Cluich GIFs beòthaichte gu fèin-obrachail setting_boost_modal: Seall còmhradh dearbhaidh mus dèan thu brosnachadh - setting_crop_images: Beàrr na dealbhan sna postaichean gun leudachadh air 16x9 setting_default_language: Cànan postaidh setting_default_privacy: Prìobhaideachd postaidh setting_default_sensitive: Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 0dc020726b..12407610c4 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -199,7 +199,6 @@ gl: setting_always_send_emails: Enviar sempre notificacións por correo electrónico setting_auto_play_gif: Reprodución automática de GIFs animados setting_boost_modal: Solicitar confirmación antes de promover - setting_crop_images: Recortar imaxes a 16x9 en publicacións non despregadas setting_default_language: Idioma de publicación setting_default_privacy: Privacidade da publicación setting_default_sensitive: Marcar sempre multimedia como sensible diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index f55290af09..ac03979a56 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -199,7 +199,6 @@ he: setting_always_send_emails: תמיד שלח התראות לדוא"ל setting_auto_play_gif: ניגון אוטומטי של גיפים setting_boost_modal: הצגת דיאלוג אישור לפני הדהוד - setting_crop_images: קטום תמונות בהודעות לא מורחבות ל 16 על 9 setting_default_language: שפת ברירת מחדל להודעה setting_default_privacy: פרטיות ההודעות setting_default_sensitive: תמיד לתת סימון "רגיש" למדיה diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 7b366bc104..b21f787fb5 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -199,7 +199,6 @@ hu: setting_always_send_emails: E-mail értesítések küldése mindig setting_auto_play_gif: GIF-ek automatikus lejátszása setting_boost_modal: Megerősítés kérése megtolás előtt - setting_crop_images: Képek 16x9-re vágása nem kinyitott bejegyzéseknél setting_default_language: Bejegyzések nyelve setting_default_privacy: Bejegyzések láthatósága setting_default_sensitive: Minden médiafájl megjelölése kényesként diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 52ff1f47b2..a4d3ee50f7 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -134,7 +134,6 @@ hy: setting_aggregate_reblogs: Տարծածները խմբաւորել հոսքում setting_auto_play_gif: Աւտոմատ մեկնարկել GIFs անիմացիաները setting_boost_modal: Ցուցադրել հաստատման պատուհանը տարածելուց առաջ - setting_crop_images: Ցոյց տալ գրառման նկարը 16x9 համամասնութեամբ setting_default_language: Հրապարակման լեզու setting_default_privacy: Հրապարակման գաղտնիութիւն setting_default_sensitive: Միշտ նշել մեդիան որպէս դիւրազգաց diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 3abbf326be..02d105ba33 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -187,7 +187,6 @@ id: setting_always_send_emails: Selalu kirim notifikasi email setting_auto_play_gif: Mainkan otomatis animasi GIF setting_boost_modal: Tampilkan dialog konfirmasi dialog sebelum boost - setting_crop_images: Potong gambar ke 16x9 pada toot yang tidak dibentangkan setting_default_language: Bahasa posting setting_default_privacy: Privasi postingan setting_default_sensitive: Selalu tandai media sebagai sensitif diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 62b3cadbb7..115004fe2d 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -185,7 +185,6 @@ io: setting_always_send_emails: Sempre sendez retpostoavizi setting_auto_play_gif: Automate pleez animigita GIFi setting_boost_modal: Montrez konfirmdialogo ante bustar - setting_crop_images: Ektranchez imaji en neexpansigita posti a 16x9 setting_default_language: Postolinguo setting_default_privacy: Videbleso di la mesaji setting_default_sensitive: Sempre markizez medii quale sentoza diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 0dd012d262..7f956bd702 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -199,7 +199,6 @@ is: setting_always_send_emails: Alltaf senda tilkynningar í tölvupósti setting_auto_play_gif: Spila sjálfkrafa GIF-hreyfimyndir setting_boost_modal: Sýna staðfestingarglugga fyrir endurbirtingu - setting_crop_images: Utansníða myndir í ekki-útfelldum færslum í 16x9 setting_default_language: Tungumál sem skrifað er á setting_default_privacy: Gagnaleynd færslna setting_default_sensitive: Alltaf merkja myndefni sem viðkvæmt diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 530476cd03..7e1ada179e 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -199,7 +199,6 @@ it: setting_always_send_emails: Manda sempre notifiche via email setting_auto_play_gif: Riproduci automaticamente le GIF animate setting_boost_modal: Mostra dialogo di conferma prima del boost - setting_crop_images: Ritaglia immagini in post non espansi a 16x9 setting_default_language: Lingua dei post setting_default_privacy: Privacy dei post setting_default_sensitive: Segna sempre i media come sensibili diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 411efb1103..a0247284a2 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -219,7 +219,6 @@ ja: setting_auto_play_gif: アニメーションGIFを自動再生する setting_bio_markdown: プロフィールのMarkdownを有効にする setting_boost_modal: ブーストする前に確認ダイアログを表示する - setting_crop_images: 投稿の詳細以外では画像を16:9に切り抜く setting_default_language: 投稿する言語 setting_default_privacy: 投稿の公開範囲 setting_default_reblog_privacy: BTの公開範囲 diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml index e139b457f8..f77c04b82c 100644 --- a/config/locales/simple_form.kk.yml +++ b/config/locales/simple_form.kk.yml @@ -45,7 +45,6 @@ kk: setting_advanced_layout: Кеңейтілген веб-интерфейс қосу setting_auto_play_gif: GIF анимацияларды бірден қосу setting_boost_modal: Бөлісу алдында растау диалогын көрсету - setting_crop_images: Кеңейтілмеген жазбаларда суреттерді 16х9 көлеміне кес setting_default_language: Жазба тілі setting_default_privacy: Жазба құпиялылығы setting_default_sensitive: Медиаларды әрдайым нәзік ретінде белгілеу diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 1a966bca76..e9f81c806b 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -199,7 +199,6 @@ ko: setting_always_send_emails: 항상 이메일 알림 보내기 setting_auto_play_gif: 애니메이션 GIF를 자동 재생 setting_boost_modal: 부스트 전 확인 창을 표시 - setting_crop_images: 확장되지 않은 게시물의 이미지를 16x9로 자르기 setting_default_language: 게시물 언어 setting_default_privacy: 게시물 프라이버시 setting_default_sensitive: 미디어를 언제나 민감한 콘텐츠로 설정 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index 9806881630..22ea6644bb 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -187,7 +187,6 @@ ku: setting_always_send_emails: Her dem agahdariya e-nameyê bişîne setting_auto_play_gif: GIF ên livok bi xweber bilîzine setting_boost_modal: Gotûbêja pejirandinê nîşan bide berî ku şandî werê bilindkirin - setting_crop_images: Wêneyên di nav şandiyên ku nehatine berfireh kirin wek 16×9 jê bike setting_default_language: Zimanê weşanê setting_default_privacy: Ewlehiya weşanê setting_default_sensitive: Her dem medya wek hestyar bide nîşan diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 38f03f62de..db44134daa 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -194,7 +194,6 @@ lv: setting_always_send_emails: Vienmēr sūtīt e-pasta paziņojumus setting_auto_play_gif: Automātiski atskaņot animētos GIF setting_boost_modal: Rādīt apstiprinājuma dialogu pirms izcelšanas - setting_crop_images: Apgrieziet attēlus neizvērstajās ziņās līdz 16x9 setting_default_language: Publicēšanas valoda setting_default_privacy: Publicēšanas privātums setting_default_sensitive: Atļaut atzīmēt multividi kā sensitīvu diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 5e9ec06bc6..7caefcc0ad 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -199,7 +199,6 @@ my: setting_always_send_emails: အီးမေးလ်သတိပေးချက်များကို အမြဲပို့ပါ setting_auto_play_gif: ကာတွန်း GIF များကို အလိုအလျောက်ဖွင့်ပါ setting_boost_modal: Boost မလုပ်မီ အတည်ပြုချက်ပြပါ - setting_crop_images: အကျယ်မချဲ့ထားသော စာစုများတွင် ပုံများကို ၁၆း၉ အရွယ် ဖြတ်တောက်ပါ။ setting_default_language: ပို့စ်တင်မည့်ဘာသာစကား setting_default_privacy: ပို့စ်ကို ဘယ်သူမြင်နိုင်မလဲ setting_default_sensitive: သတိထားရသောမီဒီယာအဖြစ် အမြဲအမှတ်အသားပြုပါ diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 051db27176..e3e96c81bf 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -199,7 +199,6 @@ nl: setting_always_send_emails: Altijd e-mailmeldingen verzenden setting_auto_play_gif: Geanimeerde GIF's automatisch afspelen setting_boost_modal: Vraag voor het boosten van een bericht een bevestiging - setting_crop_images: Afbeeldingen in tijdlijnberichten bijsnijden tot 16x9 setting_default_language: Taal van jouw berichten setting_default_privacy: Zichtbaarheid van nieuwe berichten setting_default_sensitive: Media altijd als gevoelig markeren diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 4e8e3a9b47..a1befc12bd 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -194,7 +194,6 @@ nn: setting_always_send_emails: Alltid send epostvarsel setting_auto_play_gif: Spel av animerte GIF-ar automatisk setting_boost_modal: Vis stadfesting før framheving - setting_crop_images: Skjer bilete i ikkje-utvida tut til 16x9 setting_default_language: Språk på innlegg setting_default_privacy: Privatliv setting_default_sensitive: Merk alltid media som nærtakande diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index f74095e4de..a7bfce81a1 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -182,7 +182,6 @@ setting_always_send_emails: Alltid send e-postvarslinger setting_auto_play_gif: Autoavspill animert GIF-filer setting_boost_modal: Vis bekreftelse før fremheving - setting_crop_images: Klipp bilder i ikke-utvidede innlegg til 16:9 setting_default_language: Innleggsspråk setting_default_privacy: Postintegritet setting_default_sensitive: Merk alltid media som følsomt diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 36d895ba63..7f790a9088 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -138,7 +138,6 @@ oc: setting_always_send_emails: Totjorn enviar los corrièls de notificacion setting_auto_play_gif: Lectura automatica dels GIFS animats setting_boost_modal: Mostrar una fenèstra de confirmacion abans de partejar un estatut - setting_crop_images: Retalhar los imatges dins los tuts pas desplegats a 16x9 setting_default_language: Lenga de publicacion setting_default_privacy: Confidencialitat dels tuts setting_default_sensitive: Totjorn marcar los mèdias coma sensibles diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index a87842ae33..800748611f 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -199,7 +199,6 @@ pl: setting_always_send_emails: Zawsze wysyłaj powiadomienia e-mail setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy setting_boost_modal: Pytaj o potwierdzenie przed podbiciem - setting_crop_images: Przycinaj obrazki w nierozwiniętych wpisach do 16x9 setting_default_language: Język wpisów setting_default_privacy: Widoczność wpisów setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index cb83e74817..902016db6c 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -199,7 +199,6 @@ pt-BR: setting_always_send_emails: Sempre enviar notificações por e-mail setting_auto_play_gif: Reproduzir GIFs automaticamente setting_boost_modal: Solicitar confirmação antes de dar boost - setting_crop_images: Cortar imagens no formato 16x9 em publicações não expandidas setting_default_language: Idioma dos toots setting_default_privacy: Privacidade dos toots setting_default_sensitive: Sempre marcar mídia como sensível diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index b1b176d7be..eda76c3813 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -199,7 +199,6 @@ pt-PT: setting_always_send_emails: Enviar sempre notificações de email setting_auto_play_gif: Reproduzir GIF automaticamente setting_boost_modal: Solicitar confirmação antes de partilhar uma publicação - setting_crop_images: Recortar imagens para o formato 16x9 nas publicações não expandidas setting_default_language: Língua de publicação setting_default_privacy: Privacidade da publicação setting_default_sensitive: Marcar sempre os media como problemáticos diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 4aaa4a0c12..343bc26962 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -123,7 +123,6 @@ ro: setting_aggregate_reblogs: Grupează impulsurile în fluxuri setting_auto_play_gif: Redă automat animațiile GIF setting_boost_modal: Arată dialogul de confirmare înainte de a impulsiona - setting_crop_images: Decupează imaginile în postările non-extinse la 16x9 setting_default_language: În ce limbă postezi setting_default_privacy: Cine vede postările tale setting_default_sensitive: Întotdeauna marchează conținutul media ca fiind sensibil diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 240e484f7c..7b51b7c731 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -194,7 +194,6 @@ ru: setting_always_send_emails: Всегда отправлять уведомления по электронной почте setting_auto_play_gif: Автоматически проигрывать GIF анимации setting_boost_modal: Всегда спрашивать перед продвижением - setting_crop_images: Кадрировать изображения в нераскрытых постах до 16:9 setting_default_language: Язык публикуемых постов setting_default_privacy: Видимость постов setting_default_sensitive: Всегда отмечать медиафайлы как «деликатного характера» diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index f897750791..6c622111c5 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -140,7 +140,6 @@ sc: setting_aggregate_reblogs: Agrupa is cumpartziduras in is lìnias de tempus setting_auto_play_gif: Riprodui is GIF animadas in automàticu setting_boost_modal: Ammustra unu diàlogu de cunfirma in antis de cumpartzire - setting_crop_images: Retàllia a 16x9 is immàgines de is tuts no ismanniados setting_default_language: Idioma de publicatzione setting_default_privacy: Riservadesa de is publicatziones setting_default_sensitive: Marca semper is elementos multimediales comente sensìbiles diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index b2a9feb331..6e9cf3acc2 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -187,7 +187,6 @@ sco: setting_always_send_emails: Aye sen email notifications setting_auto_play_gif: Auto-pley animatit GIFs setting_boost_modal: Shaw confirmation dialog afore heezin - setting_crop_images: Crap images in non-expandit posts tae 16x9 setting_default_language: Postin leid setting_default_privacy: Postin privacy setting_default_sensitive: Aye mairk media as sensitive diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index eb29eb3395..ed8a698fa8 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -156,7 +156,6 @@ si: setting_always_send_emails: සෑම විටම විද්යුත් තැපැල් දැනුම්දීම් යවන්න setting_auto_play_gif: සජීවිකරණ GIF ස්වයංක්රීයව ධාවනය කරන්න setting_boost_modal: වැඩි කිරීමට පෙර තහවුරු කිරීමේ සංවාදය පෙන්වන්න - setting_crop_images: ප්රසාරණය නොකළ පළ කිරීම් වල පින්තූර 16x9 දක්වා කප්පාදු කරන්න setting_default_language: පළ කිරීමේ භාෂාව setting_default_privacy: පුද්ගලිකත්වය පළ කිරීම setting_default_sensitive: සෑම විටම මාධ්ය සංවේදී ලෙස සලකුණු කරන්න diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 274ce2982d..bfbba8a6a1 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -116,7 +116,6 @@ sk: setting_aggregate_reblogs: Zoskupuj vyzdvihnutia v časovej osi setting_auto_play_gif: Automaticky prehrávaj animované GIFy setting_boost_modal: Zobrazuj potvrdzovacie okno pred povýšením - setting_crop_images: Orež obrázky v nerozbalených príspevkoch na 16x9 setting_default_language: Píšeš v jazyku setting_default_privacy: Súkromie príspevkov setting_default_sensitive: Označ všetky mediálne súbory ako chúlostivé diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index a02af94724..1a1c299364 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -197,7 +197,6 @@ sl: setting_always_send_emails: Vedno pošlji e-obvestila setting_auto_play_gif: Samodejno predvajanje animiranih GIF-ov setting_boost_modal: Pred izpostavljanjem pokaži potrditveno okno - setting_crop_images: Obreži slike v nerazširjenih objavah v razmerju 16:9 setting_default_language: Jezik objavljanja setting_default_privacy: Zasebnost objave setting_default_sensitive: Vedno označi medije kot občutljive diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index e552b6672e..9595f276cb 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -199,7 +199,6 @@ sq: setting_always_send_emails: Dërgo përherë njoftime me email setting_auto_play_gif: Vetëluaji GIF-et e animuar setting_boost_modal: Shfaq dialog ripohimi përpara përforcimi - setting_crop_images: Në mesazhe jo të zgjerueshëm, qethi figurat në 16x9 setting_default_language: Gjuhë postimi setting_default_privacy: Privatësi postimi setting_default_sensitive: Mediave vëru përherë shenjë si rezervat diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 1b6fe229da..2fc4e10d0d 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -199,7 +199,6 @@ sr-Latn: setting_always_send_emails: Uvek šalji obaveštenja e-poštom setting_auto_play_gif: Automatski reprodukuj animirane GIF-ove setting_boost_modal: Prikaži dijalog za potvrdu pre davanja podrške - setting_crop_images: Izreži slike u neproširenim objavama na 16x9 setting_default_language: Jezik objavljivanja setting_default_privacy: Privatnost objava setting_default_sensitive: Uvek označi multimediju kao osetljivu diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index e3b425bfd1..3af83e4ca4 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -199,7 +199,6 @@ sr: setting_always_send_emails: Увек шаљи обавештења е-поштом setting_auto_play_gif: Аутоматски репродукуј анимиране GIF-ове setting_boost_modal: Прикажи дијалог за потврду пре давања подршке - setting_crop_images: Изрежи слике у непроширеним објавама на 16x9 setting_default_language: Језик објављивања setting_default_privacy: Приватност објава setting_default_sensitive: Увек означи мултимедију као осетљиву diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index cab3d9c64b..811e56bd6d 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -194,7 +194,6 @@ sv: setting_always_send_emails: Skicka alltid e-postnotiser setting_auto_play_gif: Spela upp GIF:ar automatiskt setting_boost_modal: Visa bekräftelsedialog innan boostning - setting_crop_images: Beskär bilder i icke-utökade inlägg till 16x9 setting_default_language: Inläggsspråk setting_default_privacy: Inläggsintegritet setting_default_sensitive: Markera alltid media som känsligt diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 7145b7602f..99d43133e8 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -199,7 +199,6 @@ th: setting_always_send_emails: ส่งการแจ้งเตือนอีเมลเสมอ setting_auto_play_gif: เล่น GIF แบบเคลื่อนไหวโดยอัตโนมัติ setting_boost_modal: แสดงกล่องโต้ตอบการยืนยันก่อนดัน - setting_crop_images: ครอบตัดภาพในโพสต์ที่ไม่ได้ขยายเป็น 16x9 setting_default_language: ภาษาของการโพสต์ setting_default_privacy: ความเป็นส่วนตัวของการโพสต์ setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 13f84ced8b..39a933f21d 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -199,7 +199,6 @@ tr: setting_always_send_emails: Her zaman e-posta bildirimleri gönder setting_auto_play_gif: Hareketli GIF'leri otomatik oynat setting_boost_modal: Boostlamadan önce onay iletişim kutusu göster - setting_crop_images: Genişletilmemiş gönderilerdeki resimleri 16x9 olarak kırp setting_default_language: Gönderi dili setting_default_privacy: Gönderi gizliliği setting_default_sensitive: Medyayı her zaman hassas olarak işaretle diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 8866be281c..eb948f6f41 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -202,7 +202,6 @@ uk: setting_always_send_emails: Завжди надсилати сповіщення електронною поштою setting_auto_play_gif: Автоматично відтворювати анімовані GIF setting_boost_modal: Показувати діалог підтвердження під час поширення - setting_crop_images: Обрізати зображення в нерозгорнутих дописах до 16x9 setting_default_language: Мова дописів setting_default_privacy: Видимість дописів setting_default_sensitive: Позначати медіа делікатними diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index 85ada5ac49..1d856dc0e6 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -199,7 +199,6 @@ vi: setting_always_send_emails: Luôn gửi email thông báo setting_auto_play_gif: Tự động phát ảnh GIF setting_boost_modal: Yêu cầu xác nhận trước khi đăng lại tút - setting_crop_images: Hiển thị ảnh theo tỉ lệ 16x9 setting_default_language: Ngôn ngữ đăng setting_default_privacy: Kiểu đăng setting_default_sensitive: Ảnh/video là nội dung nhạy cảm diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index a27babc7c8..154653ab50 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -199,7 +199,6 @@ zh-CN: setting_always_send_emails: 总是发送电子邮件通知 setting_auto_play_gif: 自动播放 GIF 动画 setting_boost_modal: 在转嘟前询问我 - setting_crop_images: 把未展开嘟文中的图片裁剪到 16x9 setting_default_language: 发布语言 setting_default_privacy: 嘟文默认可见范围 setting_default_sensitive: 始终标记媒体为敏感内容 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 8c69a74dd4..cabcc07d95 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -193,7 +193,6 @@ zh-HK: setting_always_send_emails: 總是傳送電郵通知 setting_auto_play_gif: 自動播放 GIF setting_boost_modal: 在轉推前詢問我 - setting_crop_images: 將未展開文章中的圖片裁剪到 16x9 setting_default_language: 文章語言 setting_default_privacy: 文章預設為 setting_default_sensitive: 預設我的內容為敏感內容 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 9d07e65a0e..23dd6c65dc 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -199,7 +199,6 @@ zh-TW: setting_always_send_emails: 總是發送電子郵件通知 setting_auto_play_gif: 自動播放 GIF 動畫 setting_boost_modal: 轉嘟前先詢問我 - setting_crop_images: 將未展開嘟文中的圖片裁剪至 16x9 setting_default_language: 嘟文語言 setting_default_privacy: 嘟文可見範圍 setting_default_sensitive: 總是將媒體標記為敏感內容 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 5cd5519de4..93a773c862 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -683,7 +683,6 @@ sk: body: Mastodon je prekladaný dobrovoľníkmi. guide_link_text: Prispievať môže každý. sensitive_content: Chúlostivý obsah - toot_layout: Rozloženie príspevkov application_mailer: notification_preferences: Zmeň emailové voľby settings: 'Zmeň emailové voľby: %{link}' diff --git a/config/locales/sl.yml b/config/locales/sl.yml index a18b68c9a7..46f4dde9fd 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1001,7 +1001,6 @@ sl: guide_link: https://crowdin.com/project/mastodon guide_link_text: Vsakdo lahko prispeva. sensitive_content: Občutljiva vsebina - toot_layout: Postavitev objave application_mailer: notification_preferences: Spremenite e-poštne nastavitve salutation: "%{name}," diff --git a/config/locales/sq.yml b/config/locales/sq.yml index d46040052c..483dd179f9 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -972,7 +972,6 @@ sq: guide_link: https://crowdin.com/project/mastodon guide_link_text: Çdokush mund të kontribuojë. sensitive_content: Lëndë rezervat - toot_layout: Skemë mesazhesh application_mailer: notification_preferences: Ndryshoni parapëlqime email-i salutation: "%{name}," diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 9bc897eecb..514ce6530c 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -990,7 +990,6 @@ sr-Latn: guide_link: https://crowdin.com/project/mastodon guide_link_text: Svako može doprineti. sensitive_content: Osetljiv sadržaj - toot_layout: Raspored objava application_mailer: notification_preferences: Promeni preference E-pošte salutation: "Poštovani %{name}," diff --git a/config/locales/sr.yml b/config/locales/sr.yml index a1213dc111..7ea05c5fa5 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -990,7 +990,6 @@ sr: guide_link: https://crowdin.com/project/mastodon guide_link_text: Свако може допринети. sensitive_content: Осетљив садржај - toot_layout: Распоред објава application_mailer: notification_preferences: Промени преференце Е-поште salutation: "Поштовани %{name}," diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 57a28f9c3e..6b00755c65 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -962,7 +962,6 @@ sv: guide_link: https://crowdin.com/project/mastodon guide_link_text: Alla kan bidra. sensitive_content: Känsligt innehåll - toot_layout: Inläggslayout application_mailer: notification_preferences: Ändra e-postinställningar salutation: "%{name}," diff --git a/config/locales/th.yml b/config/locales/th.yml index 5fde84a1d2..e063af06a5 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -954,7 +954,6 @@ th: guide_link: https://crowdin.com/project/mastodon/th guide_link_text: ทุกคนสามารถมีส่วนร่วม sensitive_content: เนื้อหาที่ละเอียดอ่อน - toot_layout: เค้าโครงโพสต์ application_mailer: notification_preferences: เปลี่ยนการกำหนดลักษณะอีเมล salutation: "%{name}," diff --git a/config/locales/tr.yml b/config/locales/tr.yml index dd5a964008..1d66b2619d 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -972,7 +972,6 @@ tr: guide_link: https://crowdin.com/project/mastodon guide_link_text: Herkes katkıda bulunabilir. sensitive_content: Hassas içerik - toot_layout: Gönderi düzeni application_mailer: notification_preferences: E-posta tercihlerini değiştir salutation: "%{name}," diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 293ad54119..0bb5fd08cf 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1008,7 +1008,6 @@ uk: guide_link: https://uk.crowdin.com/project/mastodon guide_link_text: Кожен може взяти участь. sensitive_content: Дражливий зміст - toot_layout: Зовнішній вигляд дописів application_mailer: notification_preferences: Змінити налаштування електронної пошти salutation: "%{name}," diff --git a/config/locales/vi.yml b/config/locales/vi.yml index a9686e6f08..8ea61434aa 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -954,7 +954,6 @@ vi: guide_link: https://crowdin.com/project/mastodon guide_link_text: Ai cũng có thể đóng góp. sensitive_content: Nội dung nhạy cảm - toot_layout: Tút application_mailer: notification_preferences: Thay đổi tùy chọn email salutation: "%{name}," diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 406251a107..b27409a92f 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -954,7 +954,6 @@ zh-CN: guide_link: https://crowdin.com/project/mastodon guide_link_text: 每个人都可以参与翻译。 sensitive_content: 敏感内容 - toot_layout: 嘟文布局 application_mailer: notification_preferences: 更改电子邮件首选项 salutation: "%{name}:" diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 7073c403ac..a3bedee4d4 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -940,7 +940,6 @@ zh-HK: guide_link: https://crowdin.com/project/mastodon guide_link_text: 每個人都能貢獻。 sensitive_content: 敏感內容 - toot_layout: 發文介面 application_mailer: notification_preferences: 更改電郵設定 salutation: "%{name}:" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index f92b4f50c5..fc0df0519f 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -956,7 +956,6 @@ zh-TW: guide_link: https://crowdin.com/project/mastodon guide_link_text: 每個人都能貢獻。 sensitive_content: 敏感內容 - toot_layout: 嘟文排版 application_mailer: notification_preferences: 變更電子郵件設定 salutation: "%{name}、" diff --git a/db/seeds/04_admin.rb b/db/seeds/04_admin.rb index ec0287a454..c9b0369c9f 100644 --- a/db/seeds/04_admin.rb +++ b/db/seeds/04_admin.rb @@ -2,6 +2,7 @@ if Rails.env.development? domain = ENV['LOCAL_DOMAIN'] || Rails.configuration.x.local_domain + domain = domain.gsub(/:\d+$/, '') admin = Account.where(username: 'admin').first_or_initialize(username: 'admin') admin.save(validate: false) diff --git a/docker-compose.yml b/docker-compose.yml index f603c2f7e2..e3fa9ae1e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,7 +56,7 @@ services: web: build: . - image: ghcr.io/mastodon/mastodon + image: ghcr.io/mastodon/mastodon:v4.1.5 restart: always env_file: .env.production command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" @@ -77,7 +77,7 @@ services: streaming: build: . - image: ghcr.io/mastodon/mastodon + image: ghcr.io/mastodon/mastodon:v4.1.5 restart: always env_file: .env.production command: node ./streaming @@ -95,7 +95,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon + image: ghcr.io/mastodon/mastodon:v4.1.5 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 782ad6c665..bc885466cc 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 4 + 5 end def flags diff --git a/spec/lib/vacuum/applications_vacuum_spec.rb b/spec/lib/vacuum/applications_vacuum_spec.rb new file mode 100644 index 0000000000..57a222aafc --- /dev/null +++ b/spec/lib/vacuum/applications_vacuum_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Vacuum::ApplicationsVacuum do + subject { described_class.new } + + describe '#perform' do + let!(:app_with_token) { Fabricate(:application, created_at: 1.month.ago) } + let!(:app_with_grant) { Fabricate(:application, created_at: 1.month.ago) } + let!(:app_with_signup) { Fabricate(:application, created_at: 1.month.ago) } + let!(:app_with_owner) { Fabricate(:application, created_at: 1.month.ago, owner: Fabricate(:user)) } + let!(:unused_app) { Fabricate(:application, created_at: 1.month.ago) } + let!(:recent_app) { Fabricate(:application, created_at: 1.hour.ago) } + + let!(:active_access_token) { Fabricate(:access_token, application: app_with_token) } + let!(:active_access_grant) { Fabricate(:access_grant, application: app_with_grant) } + let!(:user) { Fabricate(:user, created_by_application: app_with_signup) } + + before do + subject.perform + end + + it 'does not delete applications with valid access tokens' do + expect { app_with_token.reload }.to_not raise_error + end + + it 'does not delete applications with valid access grants' do + expect { app_with_grant.reload }.to_not raise_error + end + + it 'does not delete applications that were used to create users' do + expect { app_with_signup.reload }.to_not raise_error + end + + it 'does not delete owned applications' do + expect { app_with_owner.reload }.to_not raise_error + end + + it 'does not delete applications registered less than a day ago' do + expect { recent_app.reload }.to_not raise_error + end + + it 'deletes unused applications' do + expect { unused_app.reload }.to raise_error ActiveRecord::RecordNotFound + end + end +end diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb new file mode 100644 index 0000000000..7eb27d61d6 --- /dev/null +++ b/spec/requests/content_security_policy_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Content-Security-Policy' do + it 'sets the expected CSP headers' do + allow(SecureRandom).to receive(:base64).with(16).and_return('ZbA+JmE7+bK8F5qvADZHuQ==') + + get '/' + expect(response.headers['Content-Security-Policy'].split(';').map(&:strip)).to contain_exactly( + "base-uri 'none'", + "default-src 'none'", + "frame-ancestors 'none'", + "font-src 'self' https://cb6e6126.ngrok.io", + "img-src 'self' https: data: blob: https://cb6e6126.ngrok.io", + "style-src 'self' https://cb6e6126.ngrok.io 'nonce-ZbA+JmE7+bK8F5qvADZHuQ=='", + "media-src 'self' https: data: https://cb6e6126.ngrok.io", + "frame-src 'self' https:", + "manifest-src 'self' https://cb6e6126.ngrok.io", + "form-action 'self'", + "child-src 'self' blob: https://cb6e6126.ngrok.io", + "worker-src 'self' blob: https://cb6e6126.ngrok.io", + "connect-src 'self' data: blob: https://cb6e6126.ngrok.io https://cb6e6126.ngrok.io ws://localhost:4000", + "script-src 'self' https://cb6e6126.ngrok.io 'wasm-unsafe-eval'" + ) + end +end diff --git a/yarn.lock b/yarn.lock index 721c0ae0ba..de5f50c7c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9270,9 +9270,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.2.15, postcss@^8.4.24: - version "8.4.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" - integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + version "8.4.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0"