diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 0a8015a5674c3d1dd5322c0927fef2ca4f291218..f6c599b8624de4c465cd3224ccaef1ea7428c462 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -40,7 +40,7 @@ class AccountsController < ApplicationController format.rss do expires_in 1.minute, public: true - @statuses = filtered_statuses.without_reblogs.without_replies.limit(PAGE_SIZE) + @statuses = filtered_statuses.without_reblogs.without_local_only.without_replies.limit(PAGE_SIZE) @statuses = cache_collection(@statuses, Status) render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag]) end @@ -71,7 +71,11 @@ class AccountsController < ApplicationController end def default_statuses - @account.statuses.where(visibility: [:public, :unlisted]) + if current_user.nil? + @account.statuses.without_local_only.where(visibility: [:public, :unlisted]) + else + @account.statuses.where(visibility: [:public, :unlisted]) + end end def only_media_scope diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb index e77f57910b2bfbcbe11c0fb958bb7b9eb43e3f63..b2fa720b6bcdde4fbf9d67da81c49ea3edbab649 100644 --- a/app/controllers/api/v1/accounts/credentials_controller.rb +++ b/app/controllers/api/v1/accounts/credentials_controller.rb @@ -33,6 +33,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController 'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy), 'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive), 'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language), + 'setting_default_federation' => source_params.fetch(:federation, @account.user.setting_default_federation), } end end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index bba3c0651beedb365d8554bd3bb0057d801e9db4..cb454e286473707a8c779c058a534bbe4f6ab39f 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -44,7 +44,8 @@ class Api::V1::StatusesController < Api::BaseController scheduled_at: status_params[:scheduled_at], application: doorkeeper_token.application, poll: status_params[:poll], - idempotency: request.headers['Idempotency-Key']) + idempotency: request.headers['Idempotency-Key'], + local_only: status_params[:local_only]) render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer end @@ -76,6 +77,7 @@ class Api::V1::StatusesController < Api::BaseController :spoiler_text, :visibility, :scheduled_at, + :local_only, media_ids: [], poll: [ :multiple, diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index edf29947bb046761c86ce3f9b7453aecea30a719..12b11c542c52f73be0c8a3c9bbfd60cf62da0964 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -40,6 +40,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_default_privacy, :setting_default_sensitive, :setting_default_language, + :setting_default_federation, :setting_unfollow_modal, :setting_boost_modal, :setting_delete_modal, diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 8e7906c7387da3de01a0d6afe7cb76576f04559b..2dcb81035de9c483f89a5132bc0c78191e3f7588 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -42,6 +42,7 @@ export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; +export const COMPOSE_FEDERATION_CHANGE = 'COMPOSE_FEDERATION_CHANGE'; export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; @@ -142,6 +143,7 @@ export function submitCompose(routerHistory) { spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '', visibility: getState().getIn(['compose', 'privacy']), poll: getState().getIn(['compose', 'poll'], null), + local_only: !getState().getIn(['compose', 'federation']), }, { headers: { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), @@ -525,6 +527,13 @@ export function changeComposeVisibility(value) { }; }; +export function changeComposeFederation(value) { + return { + type: COMPOSE_FEDERATION_CHANGE, + value, + }; +}; + export function insertEmojiCompose(position, emoji, needsSpace) { return { type: COMPOSE_EMOJI_INSERT, diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 0bfbd887945dabdf9b9e5001c4d17121b087420c..27c2b466500780b1a79164e7124de7d8e47578b4 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -22,6 +22,7 @@ const messages = defineMessages({ reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost to original audience' }, cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' }, cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' }, + local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' }, favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, open: { id: 'status.open', defaultMessage: 'Expand this status' }, report: { id: 'status.report', defaultMessage: 'Report @{name}' }, @@ -183,6 +184,7 @@ class StatusActionBar extends ImmutablePureComponent { const mutingConversation = status.get('muted'); const anonymousAccess = !me; const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); + const federated = !status.get('local_only'); let menu = []; let reblogIcon = 'retweet'; @@ -257,6 +259,9 @@ class StatusActionBar extends ImmutablePureComponent { <div className='status__action-bar-dropdown'> <DropdownMenuContainer disabled={anonymousAccess} status={status} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} /> </div> + { !federated && + <IconButton className='status__action-bar-button' disabled title={intl.formatMessage(messages.local_only)} icon='chain-broken' /> + } </div> ); } diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 672f93cf45cc41cb29d1ffdb96226735432090b8..a6d0c88a8956b63be1a42c4ec68199063eafd466 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -11,6 +11,7 @@ import UploadButtonContainer from '../containers/upload_button_container'; import { defineMessages, injectIntl } from 'react-intl'; import SpoilerButtonContainer from '../containers/spoiler_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; +import FederationDropdownContainer from '../containers/federation_dropdown_container'; import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import PollFormContainer from '../containers/poll_form_container'; import UploadFormContainer from '../containers/upload_form_container'; @@ -43,6 +44,7 @@ class ComposeForm extends ImmutablePureComponent { suggestions: ImmutablePropTypes.list, spoiler: PropTypes.bool, privacy: PropTypes.string, + federation: PropTypes.bool, spoilerText: PropTypes.string, focusDate: PropTypes.instanceOf(Date), caretPosition: PropTypes.number, @@ -242,6 +244,7 @@ class ComposeForm extends ImmutablePureComponent { <PollButtonContainer /> <PrivacyDropdownContainer /> <SpoilerButtonContainer /> + <FederationDropdownContainer /> </div> <div className='character-counter__wrapper'><CharacterCounter max={65535} text={text} /></div> </div> diff --git a/app/javascript/mastodon/features/compose/components/federation_dropdown.js b/app/javascript/mastodon/features/compose/components/federation_dropdown.js new file mode 100644 index 0000000000000000000000000000000000000000..571cbcb6b59aeb324bc992664a4baf7ba8486f9e --- /dev/null +++ b/app/javascript/mastodon/features/compose/components/federation_dropdown.js @@ -0,0 +1,250 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { injectIntl, defineMessages } from 'react-intl'; +import IconButton from '../../../components/icon_button'; +import Overlay from 'react-overlays/lib/Overlay'; +import Motion from '../../ui/util/optional_motion'; +import spring from 'react-motion/lib/spring'; +import detectPassiveEvents from 'detect-passive-events'; +import classNames from 'classnames'; + +const messages = defineMessages({ + federate_short: { id: 'federation.federated.short', defaultMessage: 'Federated' }, + federate_long: { id: 'federation.federated.long', defaultMessage: 'Allow toot to reach other instances' }, + local_only_short: { id: 'federation.local_only.short', defaultMessage: 'Local-only' }, + local_only_long: { id: 'federation.local_only.long', defaultMessage: 'Restrict this toot only to my instance' }, + change_federation: { id: 'federation.change', defaultMessage: 'Adjust status federation' }, +}); + +const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false; + +class FederationDropdownMenu extends React.PureComponent { + + static propTypes = { + style: PropTypes.object, + items: PropTypes.array.isRequired, + value: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + }; + + state = { + mounted: false, + }; + + handleDocumentClick = e => { + if (this.node && !this.node.contains(e.target)) { + this.props.onClose(); + } + } + + handleKeyDown = e => { + const { items } = this.props; + const value = Boolean(e.currentTarget.getAttribute('data-index')); + const index = items.findIndex(item => { + return (item.value === value); + }); + let element; + + switch(e.key) { + case 'Escape': + this.props.onClose(); + break; + case 'Enter': + this.handleClick(e); + break; + case 'ArrowDown': + element = this.node.childNodes[index + 1]; + if (element) { + element.focus(); + this.props.onChange(Boolean(element.getAttribute('data-index'))); + } + break; + case 'ArrowUp': + element = this.node.childNodes[index - 1]; + if (element) { + element.focus(); + this.props.onChange(Boolean(element.getAttribute('data-index'))); + } + break; + case 'Home': + element = this.node.firstChild; + if (element) { + element.focus(); + this.props.onChange(Boolean(element.getAttribute('data-index'))); + } + break; + case 'End': + element = this.node.lastChild; + if (element) { + element.focus(); + this.props.onChange(Boolean(element.getAttribute('data-index'))); + } + break; + } + } + + handleClick = e => { + const value = Boolean(e.currentTarget.getAttribute('data-index')); + + e.preventDefault(); + + this.props.onClose(); + this.props.onChange(value); + } + + componentDidMount () { + document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); + if (this.focusedItem) this.focusedItem.focus(); + this.setState({ mounted: true }); + } + + componentWillUnmount () { + document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); + } + + setRef = c => { + this.node = c; + } + + setFocusRef = c => { + this.focusedItem = c; + } + + render () { + const { mounted } = this.state; + const { style, items, value } = this.props; + + return ( + <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}> + {({ opacity, scaleX, scaleY }) => ( + // It should not be transformed when mounting because the resulting + // size will be used to determine the coordinate of the menu by + // react-overlays + <div className='privacy-dropdown__dropdown' style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} role='listbox' ref={this.setRef}> + {items.map(item => ( + <div role='option' tabIndex='0' key={item.value} data-index={item.value ? item.value : undefined} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}> + <div className='privacy-dropdown__option__icon'> + <i className={`fa fa-fw fa-${item.icon}`} /> + </div> + + <div className='privacy-dropdown__option__content'> + <strong>{item.text}</strong> + {item.meta} + </div> + </div> + ))} + </div> + )} + </Motion> + ); + } + +} + +@injectIntl +export default class FederationDropdown extends React.PureComponent { + + static propTypes = { + isUserTouching: PropTypes.func, + isModalOpen: PropTypes.bool.isRequired, + onModalOpen: PropTypes.func, + onModalClose: PropTypes.func, + value: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, + }; + + state = { + open: false, + placement: null, + }; + + handleToggle = ({ target }) => { + if (this.props.isUserTouching()) { + if (this.state.open) { + this.props.onModalClose(); + } else { + this.props.onModalOpen({ + actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })), + onClick: this.handleModalActionClick, + }); + } + } else { + const { top } = target.getBoundingClientRect(); + this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' }); + this.setState({ open: !this.state.open }); + } + } + + handleModalActionClick = (e) => { + e.preventDefault(); + + const { value } = this.options[e.currentTarget.getAttribute('data-index')]; + + this.props.onModalClose(); + this.props.onChange(value); + } + + handleKeyDown = e => { + switch(e.key) { + case 'Escape': + this.handleClose(); + break; + } + } + + handleClose = () => { + this.setState({ open: false }); + } + + handleChange = value => { + this.props.onChange(value); + } + + componentWillMount () { + const { intl: { formatMessage } } = this.props; + + this.options = [ + { icon: 'link', value: true, text: formatMessage(messages.federate_short), meta: formatMessage(messages.federate_long) }, + { icon: 'chain-broken', value: false, text: formatMessage(messages.local_only_short), meta: formatMessage(messages.local_only_long) }, + ]; + } + + render () { + const { value, intl } = this.props; + const { open, placement } = this.state; + + const valueOption = this.options.find(item => item.value === value); + + return ( + <div className={classNames('privacy-dropdown', { active: open })} onKeyDown={this.handleKeyDown}> + <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === 0 })}> + <IconButton + className='privacy-dropdown__value-icon' + icon={valueOption.icon} + title={intl.formatMessage(messages.change_federation)} + size={18} + expanded={open} + active={open} + inverted + onClick={this.handleToggle} + style={{ height: null, lineHeight: '27px' }} + /> + </div> + + <Overlay show={open} placement={placement} target={this}> + <FederationDropdownMenu + items={this.options} + value={value} + onClose={this.handleClose} + onChange={this.handleChange} + /> + </Overlay> + </div> + ); + } + +} diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 37a0e8845b4f1b1d2f523a40ad932407b6b2c1fd..1483e943b4e14b87fda779a76c1592bba33fc521 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -17,6 +17,7 @@ const mapStateToProps = state => ({ spoiler: state.getIn(['compose', 'spoiler']), spoilerText: state.getIn(['compose', 'spoiler_text']), privacy: state.getIn(['compose', 'privacy']), + federation: state.getIn(['compose', 'federation']), focusDate: state.getIn(['compose', 'focusDate']), caretPosition: state.getIn(['compose', 'caretPosition']), preselectDate: state.getIn(['compose', 'preselectDate']), diff --git a/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js new file mode 100644 index 0000000000000000000000000000000000000000..268f4da2dbb6ddbe102347c075c3cf6061f5f2f6 --- /dev/null +++ b/app/javascript/mastodon/features/compose/containers/federation_dropdown_container.js @@ -0,0 +1,24 @@ +import { connect } from 'react-redux'; +import FederationDropdown from '../components/federation_dropdown'; +import { changeComposeFederation } from '../../../actions/compose'; +import { openModal, closeModal } from '../../../actions/modal'; +import { isUserTouching } from '../../../is_mobile'; + +const mapStateToProps = state => ({ + isModalOpen: state.get('modal').modalType === 'ACTIONS', + value: state.getIn(['compose', 'federation']), +}); + +const mapDispatchToProps = dispatch => ({ + + onChange (value) { + dispatch(changeComposeFederation(value)); + }, + + isUserTouching, + onModalOpen: props => dispatch(openModal('ACTIONS', props)), + onModalClose: () => dispatch(closeModal()), + +}); + +export default connect(mapStateToProps, mapDispatchToProps)(FederationDropdown); diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index e97f18f08c134ce796d5dd317db01f269cc24822..a0838740a7dbe8feda2e5ea7100179707ad6d340 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name'; import StatusContent from '../../../components/status_content'; import MediaGallery from '../../../components/media_gallery'; import { Link } from 'react-router-dom'; -import { FormattedDate, FormattedNumber } from 'react-intl'; +import { defineMessages, injectIntl, FormattedDate, FormattedNumber } from 'react-intl'; import Card from './card'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Video from '../../video'; @@ -15,6 +15,11 @@ import scheduleIdleTask from '../../ui/util/schedule_idle_task'; import classNames from 'classnames'; import Icon from 'mastodon/components/icon'; +const messages = defineMessages({ + local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' }, +}); + +@injectIntl export default class DetailedStatus extends ImmutablePureComponent { static contextTypes = { @@ -90,6 +95,7 @@ export default class DetailedStatus extends ImmutablePureComponent { render () { const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; + const intl = this.props.intl; const outerStyle = { boxSizing: 'border-box' }; const { compact } = this.props; @@ -100,6 +106,7 @@ export default class DetailedStatus extends ImmutablePureComponent { let media = ''; let applicationLink = ''; let reblogLink = ''; + let localOnly = ''; let reblogIcon = 'retweet'; let favouriteLink = ''; @@ -187,6 +194,10 @@ export default class DetailedStatus extends ImmutablePureComponent { ); } + if(status.get('local_only')) { + localOnly = <span> · <i className='fa fa-chain-broken' title={intl.formatMessage(messages.local_only)} /></span>; + } + if (this.context.router) { favouriteLink = ( <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'> @@ -222,7 +233,7 @@ export default class DetailedStatus extends ImmutablePureComponent { <div className='detailed-status__meta'> <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener'> <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' /> - </a>{applicationLink} · {reblogLink} · {favouriteLink} + </a>{applicationLink} · {reblogLink} · {favouriteLink}{localOnly} </div> </div> </div> diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 1b560b96416262551df5ac90a1465eb16501ac9a..4dd9df55bc8d384251f4a772812172c026d7f37a 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "ترخيص", "follow_request.reject": "Ø±ÙØ¶", "getting_started.developers": "Ø§Ù„Ù…ÙØ·ÙˆÙ‘ÙØ±ÙˆÙ†", @@ -354,6 +359,7 @@ "status.favourite": "أض٠إلى Ø§Ù„Ù…ÙØ¶Ù„Ø©", "status.filtered": "Ù…ÙØµÙّى", "status.load_more": "ØÙ…ّل المزيد", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "الصورة مستترة", "status.mention": "Ø£Ø°ÙƒÙØ± @{name}", "status.more": "المزيد", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 5145a6579b0795b8fbbdea1588157a407249066e..b2c98bb157731bb4532c1318f4a298705157bae4 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizar", "follow_request.reject": "Refugar", "getting_started.developers": "Desendolcadores", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Cargar más", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Mediu anubrÃu", "status.mention": "Mentar a @{name}", "status.more": "Más", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index a4afe2adb2bebc0efc4272ea88f84a342e6d3437..12b03796eb7371a3f321c02cb8b0193274ac6420 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Предпочитани", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Споменаване", "status.more": "More", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 6c4f0def6bb162e00de8fbf4d47a0a0675cae861..67501844d1eee52857d93038faa6c21c828fa7ce 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "অনà§à¦®à¦¤à¦¿ দিন", "follow_request.reject": "পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ করà§à¦¨", "getting_started.developers": "তৈরিকারকদের জনà§à¦¯", @@ -354,6 +359,7 @@ "status.favourite": "পছনà§à¦¦à§‡à¦° করতে", "status.filtered": "ছাà¦à¦•নিদিত", "status.load_more": "আরো দেখà§à¦¨", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "ছবি বা à¦à¦¿à¦¡à¦¿à¦“ পেছনে", "status.mention": "@{name}কে উলà§à¦²à§‡à¦– করতে", "status.more": "আরো", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 396e4a325d4ff78e2a6bb5771d0d1b6908a09c14..e6d1bba1d3e3dc50ec28816a6daceae502474946 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Prova recarregant la pà gina. Si això no ajuda encara pots ser capaç d'utilitzar Mastodont a través d'un navegador diferent o app nativa.", "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls", "errors.unexpected_crash.report_issue": "Informa d'un problema", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autoritzar", "follow_request.reject": "Rebutjar", "getting_started.developers": "Desenvolupadors", @@ -354,6 +359,7 @@ "status.favourite": "Favorit", "status.filtered": "Filtrat", "status.load_more": "Carrega més", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Multimèdia amagat", "status.mention": "Esmentar @{name}", "status.more": "Més", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 6c680f13fa1b5d56f69046d8b8e1c72a3d0046dc..8321ffe5a365427718ce2ed08942f4fdd7cb62f3 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Pruvate d'attualizà sta pagina. S'ellu persiste u prublemu, pudete forse sempre accede à Mastodon dapoi un'alltru navigatore o applicazione.", "errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta", "errors.unexpected_crash.report_issue": "Palisà prublemu", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Auturizà ", "follow_request.reject": "Righjittà ", "getting_started.developers": "Sviluppatori", @@ -354,6 +359,7 @@ "status.favourite": "Aghjunghje à i favuriti", "status.filtered": "Filtratu", "status.load_more": "Vede di più", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media piattata", "status.mention": "Mintuvà @{name}", "status.more": "Più", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index fc807d45e50b5678216de80716acb42d0fdc3b21..ed0588e7c7a0af87949f58a10c936623fe626af4 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Zkuste obnovit stránku. Pokud to nepomůže, budete možná moci dále použÃvat Mastodon pomocà jiného prohlÞeÄe nebo nativnà aplikace.", "errors.unexpected_crash.copy_stacktrace": "ZkopÃrovat stacktrace do schránky", "errors.unexpected_crash.report_issue": "Nahlásit problém", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizovat", "follow_request.reject": "OdmÃtnout", "getting_started.developers": "Vývojáři", @@ -354,6 +359,7 @@ "status.favourite": "OblÃbit", "status.filtered": "Filtrováno", "status.load_more": "Zobrazit vÃce", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Média skryta", "status.mention": "ZmÃnit uživatele @{name}", "status.more": "VÃce", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 8c2e08bb3d4969f04147ebcaf259f55af29dbb5a..aeb919f5fb8da086f24b75e7fda755e746c37f9d 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Caniatau", "follow_request.reject": "Gwrthod", "getting_started.developers": "Datblygwyr", @@ -354,6 +359,7 @@ "status.favourite": "Hoffi", "status.filtered": "Wedi'i hidlo", "status.load_more": "Llwythwch mwy", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Cyfryngau wedi'u cuddio", "status.mention": "Crybwyll @{name}", "status.more": "Mwy", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 95e4fe5033dc0653b4fe47311f8e4e261052ed46..64088fd6e8e01df82f864774a7dab7d17ec439fd 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Godkend", "follow_request.reject": "Afvis", "getting_started.developers": "Udviklere", @@ -354,6 +359,7 @@ "status.favourite": "Favorit", "status.filtered": "Filtreret", "status.load_more": "Indlæs mere", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Medie skjult", "status.mention": "Nævn @{name}", "status.more": "Mere", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 401e3fc15348601bdee038e2945dae06315651ac..077cb729a99f1fbed5b388fbc8d5fd03917b345d 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Versuche die Seite zu aktualisieren. Wenn das nicht hilft, kannst du Mastodon über einen anderen Browser oder eine native App verwenden.", "errors.unexpected_crash.copy_stacktrace": "Fehlerlog in die Zwischenablage kopieren", "errors.unexpected_crash.report_issue": "Problem melden", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Erlauben", "follow_request.reject": "Ablehnen", "getting_started.developers": "Entwickler", @@ -354,6 +359,7 @@ "status.favourite": "Favorisieren", "status.filtered": "Gefiltert", "status.load_more": "Weitere laden", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Medien versteckt", "status.mention": "@{name} erwähnen", "status.more": "Mehr", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 8ab40ce3c70ffe5b3485ff159a93286e4f72cebe..62d822615e79993e6df0cc02a8c8114bf43f897b 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -394,6 +394,10 @@ "defaultMessage": "This post cannot be boosted", "id": "status.cannot_reblog" }, + { + "defaultMessage": "This post is only visible by other users of your instance", + "id": "status.local_only" + }, { "defaultMessage": "Favourite", "id": "status.favourite" @@ -946,6 +950,31 @@ ], "path": "app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.json" }, + { + "descriptors": [ + { + "defaultMessage": "Federated", + "id": "federation.federated.short" + }, + { + "defaultMessage": "Allow toot to reach other instances", + "id": "federation.federated.long" + }, + { + "defaultMessage": "Local-only", + "id": "federation.local_only.short" + }, + { + "defaultMessage": "Restrict this toot only to my instance", + "id": "federation.local_only.long" + }, + { + "defaultMessage": "Adjust status federation", + "id": "federation.change" + } + ], + "path": "app/javascript/mastodon/features/compose/components/federation_dropdown.json" + }, { "descriptors": [ { @@ -2247,6 +2276,15 @@ ], "path": "app/javascript/mastodon/features/status/components/action_bar.json" }, + { + "descriptors": [ + { + "defaultMessage": "This post is only visible by other users of your instance", + "id": "status.local_only" + } + ], + "path": "app/javascript/mastodon/features/status/components/detailed_status.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index ab000fa8d6ce1b6b330d7243fcdcb29cd4e5354b..e395c8ba991168b92371cfdcf8c29a657e556218 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Δοκίμασε να ανανεώσεις τη σελίδα. Αν αυτό δε βοηθήσει, ίσως να μποÏÎσεις να χÏησιμοποιήσεις το Mastodon μÎσω διαφοÏÎµÏ„Î¹ÎºÎ¿Ï browser ή κάποιας εφαÏμογής.", "errors.unexpected_crash.copy_stacktrace": "ΑντιγÏαφή μηνυμάτων κώδικα στο Ï€ÏόχειÏο", "errors.unexpected_crash.report_issue": "ΑναφοÏά Ï€Ïοβλήματος", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "ΕνÎκÏινε", "follow_request.reject": "ΑπÎÏÏιψε", "getting_started.developers": "Ανάπτυξη", @@ -354,6 +359,7 @@ "status.favourite": "Σημείωσε ως αγαπημÎνο", "status.filtered": "ΦιλτÏαÏισμÎνα", "status.load_more": "ΦόÏτωσε πεÏισσότεÏα", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "ΚÏυμμÎνο πολυμÎσο", "status.mention": "ΑνÎφεÏε τον/την @{name}", "status.more": "ΠεÏισσότεÏα", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index c50bdb8d3d2602eb55ecfb658e222017bb2e6f72..29070422dbdecc12ed99cabb9cc6afa79d8a4d2e 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 0070cdb5cfbdebc48bbf2d2be7299eaaaff0c1dc..0835ae5b07b6edd31039c163459ad10ce35b727c 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Raporti problemon", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Rajtigi", "follow_request.reject": "Rifuzi", "getting_started.developers": "Programistoj", @@ -354,6 +359,7 @@ "status.favourite": "Stelumi", "status.filtered": "Filtrita", "status.load_more": "Åœargi pli", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "AÅdovidaĵo kaÅita", "status.mention": "Mencii @{name}", "status.more": "Pli", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index c213a03e13eb4fddb4ec8f22cec27ea953eb47c4..d964716faf3f63731579952c3d18a1270fdc8e64 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Intenta actualizar la página. Si eso no ayuda, es posible que puedas usar Mastodon a través de otro navegador o aplicación nativa.", "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles", "errors.unexpected_crash.report_issue": "Informar de un problema/error", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", "getting_started.developers": "Desarrolladores", @@ -354,6 +359,7 @@ "status.favourite": "Favorito", "status.filtered": "Filtrado", "status.load_more": "Cargar más", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Contenido multimedia oculto", "status.mention": "Mencionar", "status.more": "Más", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index f89901ab030b1b30eccc035bb3322ccb7442a402..1fb7faf9adf53a8a1ac081d14d1cdac7fb6039ec 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Eman arazoaren berri", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Baimendu", "follow_request.reject": "Ukatu", "getting_started.developers": "Garatzaileak", @@ -354,6 +359,7 @@ "status.favourite": "Gogokoa", "status.filtered": "Iragazita", "status.load_more": "Kargatu gehiago", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Multimedia ezkutatua", "status.mention": "Aipatu @{name}", "status.more": "Gehiago", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index b651edd32ee1a07dc2002b7f9f4192e692f79a27..fa3453f105d3d4dd341c7a763b178884f1917469 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Ù„Ø·ÙØ§Ù‹ ØµÙØÙ‡ را دوباره باز کنید. اگر آن هم Ú©Ù…Ú©ÛŒ نکرد، همچنان شاید بتوانید با ماستدون از راه یکی از اپ‌های آن کار کنید.", "errors.unexpected_crash.copy_stacktrace": "Ú©Ù¾ÛŒ جزئیات اشکال", "errors.unexpected_crash.report_issue": "گزارش اشکال", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "اجازه دهید", "follow_request.reject": "اجازه ندهید", "getting_started.developers": "برای برنامه‌نویسان", @@ -354,6 +359,7 @@ "status.favourite": "پسندیدن", "status.filtered": "Ùیلترشده", "status.load_more": "بیشتر نشان بده", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "تصویر پنهان شده", "status.mention": "نام‌بردن از @{name}", "status.more": "بیشتر", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 2e71e6e180c331f7d4935fd07441df7c10bbc205..ca96d298abd397120eba70b66d541d13ba470ef2 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos tämä ei auta, saatat yhä pystyä käyttämään Mastodonia toisen selaimen tai sovelluksen kautta.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", "getting_started.developers": "Kehittäjille", @@ -354,6 +359,7 @@ "status.favourite": "Tykkää", "status.filtered": "Suodatettu", "status.load_more": "Lataa lisää", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media piilotettu", "status.mention": "Mainitse @{name}", "status.more": "Lisää", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 38f20b619d29744cba71187589d1e3799a38dfdc..9568b54f0f9b73a721dcacb8f0b4dd3db0353b67 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -156,6 +156,12 @@ "error.unexpected_crash.next_steps": "Essayez de rafraîchir la page. Si cela n’aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.", "errors.unexpected_crash.copy_stacktrace": "Copier la trace-pile dans le presse-papier", "errors.unexpected_crash.report_issue": "Signaler un bogue", + "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Accepter", "follow_request.reject": "Rejeter", "getting_started.developers": "Développeur·euse·s", @@ -354,6 +360,7 @@ "status.favourite": "Ajouter aux favoris", "status.filtered": "Filtré", "status.load_more": "Charger plus", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Média caché", "status.mention": "Mentionner @{name}", "status.more": "Plus", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 0125754b131ad5dfc9d2de78b2d5973fcbea240c..bee0384c33f438f428511fbd01c1b8934cd3adeb 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Intenta actualizar a páxina. Se esto non axuda podes tamén utilizar Mastodon en outro navegador ou app nativa.", "errors.unexpected_crash.copy_stacktrace": "Copiar trazas ao portaretallos", "errors.unexpected_crash.report_issue": "Informar de problema", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", "getting_started.developers": "Desenvolvedoras", @@ -354,6 +359,7 @@ "status.favourite": "Favorita", "status.filtered": "Filtrado", "status.load_more": "Cargar máis", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Medios ocultos", "status.mention": "Mencionar @{name}", "status.more": "Máis", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 70aec3279b22aa446bdbeb6c244bb64bad5fd22d..81912477d9a5cd05002c51c86f3fb6e75f8af570 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "קבלה", "follow_request.reject": "דחיה", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "חיבוב", "status.filtered": "Filtered", "status.load_more": "עוד", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "מדיה מוסתרת", "status.mention": "×¤× ×™×” ×ל @{name}", "status.more": "עוד", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 4fb924a5fb154e3f283abd237ab149e31463bc52..325b64dc4220ae521d8d2b17be81b02733b953b1 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 09298a7ad14a9d51a1e00e4175fcab9db4d688b4..fd32fcd3804190e4f82989dc6ed02ec5cdf03970 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autoriziraj", "follow_request.reject": "Odbij", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "OznaÄi omiljenim", "status.filtered": "Filtered", "status.load_more": "UÄitaj viÅ¡e", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Sakriven media sadržaj", "status.mention": "Spomeni @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index c35c943e6f5ab19eb5e0a52df61720d6a8af1a1b..0eadb290348a5a445b29215a2dbd504ec2aa87d6 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Próbáld frissÃteni az oldalt. Ha ez nem segÃt, egy másik böngészÅ‘n vagy appon keresztül még mindig használhatod a Mastodont.", "errors.unexpected_crash.copy_stacktrace": "Stacktrace vágólapra másolása", "errors.unexpected_crash.report_issue": "Probléma bejelentése", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Engedélyezés", "follow_request.reject": "VisszautasÃtás", "getting_started.developers": "FejlesztÅ‘knek", @@ -354,6 +359,7 @@ "status.favourite": "Kedvenc", "status.filtered": "Megszűrt", "status.load_more": "Többet", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Média elrejtve", "status.mention": "@{name} emlÃtése", "status.more": "Többet", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 69af86bf2645dd822f57556d7b9969cf8ea890b4..e667e5b4e8c4618b9520b2854991afaeef5d1343 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "ÕŽÕ¡Õ¾Õ¥Ö€Õ¡ÖÕ¶Õ¥Õ¬", "follow_request.reject": "Õ„Õ¥Ö€ÕªÕ¥Õ¬", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Õ€Õ¡Õ¾Õ¡Õ¶Õ¥Õ¬", "status.filtered": "Filtered", "status.load_more": "Ô²Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Õ´Õ¥Õ¤Õ«Õ¡Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ©Õ¡Ö„ÖÕ¾Õ¡Õ® Õ§", "status.mention": "Õ†Õ·Õ¥Õ¬ @{name}ÖŠÕ«Õ¶", "status.more": "Ô±Õ¾Õ¥Õ¬Õ«Õ¶", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 371922a4d678961a7e8617872bedbbd3f0ce718d..900f95d422b1b7944d157f2eb235194ebef8d7e5 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Coba segarkan halaman. Jika tak membantu, Anda masih bisa memakai Mastodon dengan peramban berbeda atau aplikasi native.", "errors.unexpected_crash.copy_stacktrace": "Salin stacktrace ke papan klip", "errors.unexpected_crash.report_issue": "Laporkan masalah", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Izinkan", "follow_request.reject": "Tolak", "getting_started.developers": "Pengembang", @@ -354,6 +359,7 @@ "status.favourite": "Difavoritkan", "status.filtered": "Filtered", "status.load_more": "Tampilkan semua", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media disembunyikan", "status.mention": "Balasan @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 076835218ca56d235231a23dbc0f1e93b81c2168..06db699cb248a6720df8b6c84ba6da0232e949ca 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Yurizar", "follow_request.reject": "Refuzar", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favorizar", "status.filtered": "Filtered", "status.load_more": "Kargar pluse", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Kontenajo celita", "status.mention": "Mencionar @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 8d4b8f66efbca3a00d57b40b090067d6ae3d95e4..c5b1d724b7ee220a944d5ba67ef7ad23c0a062b8 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizza", "follow_request.reject": "Rifiuta", "getting_started.developers": "Sviluppatori", @@ -354,6 +359,7 @@ "status.favourite": "Apprezzato", "status.filtered": "Filtrato", "status.load_more": "Mostra di più", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Allegato nascosto", "status.mention": "Nomina @{name}", "status.more": "Altro", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 5561e9da17cf610381a7f6d32ccdf90ab8d0d6a1..f6026824c12d4f031489a3e64f3a6ecc9dab4ba3 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "ページã®å†èªã¿è¾¼ã¿ã‚’ãŠè©¦ã—ãã ã•ã„。ãれã§ã‚‚解決ã—ãªã„å ´åˆã€åˆ¥ã®ãƒ–ラウザã‹ã‚¢ãƒ—リを使ãˆã°ä½¿ç”¨ã§ãã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚", "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードã«ã‚³ãƒ”ー", "errors.unexpected_crash.report_issue": "å•é¡Œã‚’å ±å‘Š", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "許å¯", "follow_request.reject": "æ‹’å¦", "getting_started.developers": "開発", @@ -354,6 +359,7 @@ "status.favourite": "ãŠæ°—ã«å…¥ã‚Š", "status.filtered": "フィルターã•れã¾ã—ãŸ", "status.load_more": "ã‚‚ã£ã¨è¦‹ã‚‹", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "éžè¡¨ç¤ºã®ãƒ¡ãƒ‡ã‚£ã‚¢", "status.mention": "@{name}ã•ã‚“ã«ãƒˆã‚¥ãƒ¼ãƒˆ", "status.more": "ã‚‚ã£ã¨è¦‹ã‚‹", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 35789374a5d9ababe3c07c2a25f6aefad8f50640..c378bc9c88916e28c398a8c659d611f095eed645 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "áƒáƒ•ტáƒáƒ იზáƒáƒªáƒ˜áƒ", "follow_request.reject": "უáƒáƒ ყáƒáƒ¤áƒ", "getting_started.developers": "დეველáƒáƒžáƒ”რები", @@ -354,6 +359,7 @@ "status.favourite": "ფáƒáƒ•áƒáƒ იტი", "status.filtered": "ფილტრირებული", "status.load_more": "მეტის ჩáƒáƒ¢áƒ•ირთვáƒ", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "მედირდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ", "status.mention": "áƒáƒ¡áƒáƒ®áƒ”ლე @{name}", "status.more": "მეტი", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index ba0f5378e8a002f229ef02658458fa0a3fb5ad5f..be0a5050397af653ffc7d9a3d66f29bae882d38b 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "ÐвторизациÑ", "follow_request.reject": "Қабылдамау", "getting_started.developers": "ЖаÑаушылар тобы", @@ -354,6 +359,7 @@ "status.favourite": "Таңдаулы", "status.filtered": "Фильтрленген", "status.load_more": "Тағы әкел", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Жабық медиа", "status.mention": "Ðталым @{name}", "status.more": "Тағы", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index ea70c7055fa53f0f31bf7ecb6b5dc0bbad1e9fdb..2640b43b415dbdf8323b65feae11678735ac8032 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "페ì´ì§€ë¥¼ ìƒˆë¡œê³ ì¹¨ 해보세요. ê·¸ëž˜ë„ í•´ê²°ë˜ì§€ 않는 경우, 다른 브ë¼ìš°ì €ë‚˜ 네ì´í‹°ë¸Œ ì•±ìœ¼ë¡œë„ ë§ˆìŠ¤í† ëˆì„ ì´ìš©í•˜ì‹¤ 수 있습니다.", "errors.unexpected_crash.copy_stacktrace": "ì—러 ë‚´ìš©ì„ í´ë¦½ë³´ë“œì— 복사", "errors.unexpected_crash.report_issue": "ë¬¸ì œ ì‹ ê³ ", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "허가", "follow_request.reject": "ê±°ë¶€", "getting_started.developers": "개발ìž", @@ -354,6 +359,7 @@ "status.favourite": "ì¦ê²¨ì°¾ê¸°", "status.filtered": "필터로 걸러ì§", "status.load_more": "ë” ë³´ê¸°", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "미디어 숨겨ì§", "status.mention": "답장", "status.more": "ìžì„¸ížˆ", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 39ca86a0ccd390881205a230f7d0d328a057c737..611a5eb53cf3b0288fd322003f0e907bbc289665 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 1c0e355018ff0ae30f1beff37c1a6dec2707dca3..fc76339c54f534877d939069a95c88fa4c697cfc 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "AutorizÄ“t", "follow_request.reject": "NoraidÄ«t", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 6881d3be38d58c31ae4f985c39cec711111fe6b4..6efd42955cfe20fae93a6c4a0f18b2bbbd374bbe 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Favourite", "status.filtered": "Filtered", "status.load_more": "Load more", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 68b8f4cbd0fb72dd723610356e9f57282f6f7db0..ba649dde09fd6489233a0b3fb5f7375f021dbed0 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren", "errors.unexpected_crash.report_issue": "Technisch probleem melden", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Goedkeuren", "follow_request.reject": "Afkeuren", "getting_started.developers": "Ontwikkelaars", @@ -354,6 +359,7 @@ "status.favourite": "Favoriet", "status.filtered": "Gefilterd", "status.load_more": "Meer laden", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media verborgen", "status.mention": "Vermeld @{name}", "status.more": "Meer", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 37b893938fcd9542c9e1b141ef0c7bccc614dcc0..28f89863323581c959eafc17c18c5419134e5dd2 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorisér", "follow_request.reject": "Avvis", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Lik", "status.filtered": "Filtered", "status.load_more": "Last mer", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media skjult", "status.mention": "Nevn @{name}", "status.more": "Mer", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index b52d58970109c65c8b660b176dd971a8835ac470..1a2479ecb2d9f4371db33c2d2ed986ac573780bd 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Senhalar un problèma", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Acceptar", "follow_request.reject": "Regetar", "getting_started.developers": "Desvelopaires", @@ -354,6 +359,7 @@ "status.favourite": "Apondre als favorits", "status.filtered": "Filtrat", "status.load_more": "Cargar mai", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Mèdia rescondut", "status.mention": "Mencionar", "status.more": "Mai", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 1eb9822498d65b822132d38ffad3f5154ce7c88d..cf0c0188edc7c963737be4e1f5e16d1e85e83fe0 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Spróbuj odÅ›wieżyć stronÄ™. JeÅ›li to nie pomoże, wciąż jesteÅ› w stanie używać Mastodona przez innÄ… przeglÄ…darkÄ™ lub natywnÄ… aplikacjÄ™.", "errors.unexpected_crash.copy_stacktrace": "Skopiuj Å›lad stosu do schowka", "errors.unexpected_crash.report_issue": "ZgÅ‚oÅ› problem", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autoryzuj", "follow_request.reject": "Odrzuć", "getting_started.developers": "Dla programistów", @@ -354,6 +359,7 @@ "status.favourite": "Dodaj do ulubionych", "status.filtered": "Filtrowany(-a)", "status.load_more": "ZaÅ‚aduj wiÄ™cej", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Zawartość multimedialna ukryta", "status.mention": "Wspomnij o @{name}", "status.more": "WiÄ™cej", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 7c6a1fd224ef92d280ed2eb65983b8cc07f59e40..86322e1e12c94971a99f28939c268ed075b17153 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, você ainda pode usar Mastodon através de um navegador diferente ou aplicativo nativo.", "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace para a área de transferência", "errors.unexpected_crash.report_issue": "Reportar problema", + "federation.change": "Ajustar federação do toot", + "federation.federated.long": "Permitir que o toot chegue a outras instâncias", + "federation.federated.short": "Federado", + "federation.local_only.long": "Restringir o toot somente à minha instância", + "federation.local_only.short": "Somente local", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", "getting_started.developers": "Desenvolvedores", @@ -354,6 +359,7 @@ "status.favourite": "Adicionar aos favoritos", "status.filtered": "Filtrado", "status.load_more": "Carregar mais", + "status.local_only": "Esse post só é visÃvel para outros usuários da sua instância", "status.media_hidden": "MÃdia escondida", "status.mention": "Mencionar @{name}", "status.more": "Mais", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 859dc1991254149683ca0456686d33adbfefc65c..c3b1ea17136bda3623b3a57d21d586e404fd2725 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Ajustar federação do toot", + "federation.federated.long": "Permitir que o toot chegue a outras instâncias", + "federation.federated.short": "Federado", + "federation.local_only.long": "Restringir o toot somente à minha instância", + "federation.local_only.short": "Somente local", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", "getting_started.developers": "Responsáveis pelo desenvolvimento", @@ -354,6 +359,7 @@ "status.favourite": "Adicionar aos favoritos", "status.filtered": "Filtrada", "status.load_more": "Carregar mais", + "status.local_only": "Esse post só é visÃvel para outros usuários da sua instância", "status.media_hidden": "Média escondida", "status.mention": "Mencionar @{name}", "status.more": "Mais", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 617dbcc0dc3347f764bd91a9d0d3b247dd034b6d..b52ec721b8d1743e0caa6b1c354f57e8541eeba1 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizează", "follow_request.reject": "Respinge", "getting_started.developers": "Dezvoltatori", @@ -354,6 +359,7 @@ "status.favourite": "Favorite", "status.filtered": "Sortate", "status.load_more": "ÃŽncarcă mai multe", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media ascunsă", "status.mention": "Mentionează @{name}", "status.more": "Mai mult", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 4ace1649aa067f37ce8f6a3a0af7703b24d18866..9a36c3b575ccbd7ff569196f9e5839715ce59d1f 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Попробуйте обновить Ñтраницу. ЕÑли проблема не иÑчезает, иÑпользуйте Mastodon из-под другого браузера или приложениÑ.", "errors.unexpected_crash.copy_stacktrace": "Копировать ÑÑ‚ÐµÐºÑ‚Ñ€ÐµÐ¹Ñ Ð² буфер обмена", "errors.unexpected_crash.report_issue": "Сообщить о проблеме", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Ðвторизовать", "follow_request.reject": "Отказать", "getting_started.developers": "Разработчикам", @@ -354,6 +359,7 @@ "status.favourite": "ÐравитÑÑ", "status.filtered": "Отфильтровано", "status.load_more": "Показать еще", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Медиа Ñкрыто", "status.mention": "УпомÑнуть @{name}", "status.more": "Больше", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 5d27263094403a64b0f24f9232ecf8a07b0c6374..01fd3d42c979dfd89e483932411724886bb187bd 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "SkopÃruj stacktrace do schránky", "errors.unexpected_crash.report_issue": "Nahlás problém", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Povoľ prÃstup", "follow_request.reject": "Odmietni", "getting_started.developers": "Vývojári", @@ -354,6 +359,7 @@ "status.favourite": "PáÄi sa mi", "status.filtered": "Filtrované", "status.load_more": "Ukáž viac", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Skryté médiá", "status.mention": "Spomeň @{name}", "status.more": "Viac", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 65e275102cd70e6d113065c734f39aaf87cfe5fd..29d7bf473ec6007201326431d1edfd6658ec045f 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Overi", "follow_request.reject": "Zavrni", "getting_started.developers": "Razvijalci", @@ -354,6 +359,7 @@ "status.favourite": "Priljubljen", "status.filtered": "Filtrirano", "status.load_more": "Naloži veÄ", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Mediji so skriti", "status.mention": "Omeni @{name}", "status.more": "VeÄ", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index f58466d87138aaf20638ee249d7dae8f8e7e3672..1f6de613d636ed674a3b018ef3544e4f88e291f2 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Autorizoje", "follow_request.reject": "Hidhe tej", "getting_started.developers": "Zhvillues", @@ -354,6 +359,7 @@ "status.favourite": "I parapëlqyer", "status.filtered": "I filtruar", "status.load_more": "Ngarko më tepër", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Me media të fshehur", "status.mention": "Përmendni @{name}", "status.more": "Më tepër", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 59b8459aedecc4da8e1b5e9449eed3443ba8bcf9..e396087dff74b93a47bf97e6fb7b8fe8618d19ab 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Odobri", "follow_request.reject": "Odbij", "getting_started.developers": "Developers", @@ -354,6 +359,7 @@ "status.favourite": "Omiljeno", "status.filtered": "Filtered", "status.load_more": "UÄitaj joÅ¡", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Multimedija sakrivena", "status.mention": "Pomeni korisnika @{name}", "status.more": "JoÅ¡", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index d222e774d217c3f2120093458f7616d1f6c16b5c..40d14599a41b15a2f0abec6c01626e480d08c851 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Одобри", "follow_request.reject": "Одбиј", "getting_started.developers": "Програмери", @@ -354,6 +359,7 @@ "status.favourite": "Омиљено", "status.filtered": "Филтрирано", "status.load_more": "Учитај још", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Мултимедија Ñакривена", "status.mention": "Помени кориÑника @{name}", "status.more": "Још", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index e8c1c40c2546df9daf1e28bafb0e37d48f7958b5..2bbb534c889df84c730304f1768a08d066b78caf 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Prova att ladda om sidan. Om det inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller app.", "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp", "errors.unexpected_crash.report_issue": "Rapportera problem", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Godkänn", "follow_request.reject": "Avvisa", "getting_started.developers": "Utvecklare", @@ -354,6 +359,7 @@ "status.favourite": "Favorit", "status.filtered": "Filtrerat", "status.load_more": "Ladda fler", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Media dold", "status.mention": "Omnämn @{name}", "status.more": "Mer", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 82b5fff9e34eb2c431c2cbfb3454a6259031048a..957cf024c53fe3aa588ac186e88df6a5f01b9913 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "அதிகாரமளி", "follow_request.reject": "விலகà¯à®•à¯", "getting_started.developers": "உரà¯à®µà®¾à®•à¯à®•à¯à®¨à®°à¯à®•ளà¯", @@ -354,6 +359,7 @@ "status.favourite": "விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯à®•à¯à®•à¯à®•நà¯à®¤", "status.filtered": "வடிகடà¯à®Ÿà¯", "status.load_more": "அதிகமாய௠à®à®±à¯à®±à¯", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "மீடியா மறைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯", "status.mention": "கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯ @{name}", "status.more": "அதிக", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 3cfbc5786ff40a2c487f087dec90d856ffbf3ba0..6e2a3acfd49d9b6aa15f339e1ce8bee1bb94f1dc 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "à°…à°¨à±à°®à°¤à°¿à°‚à°šà±", "follow_request.reject": "తిరసà±à°•à°°à°¿à°‚à°šà±", "getting_started.developers": "డెవలపరà±à°²à±", @@ -354,6 +359,7 @@ "status.favourite": "ఇషà±à°Ÿà°ªà°¡à±", "status.filtered": "వడకటà±à°Ÿà°¬à°¡à°¿à°¨", "status.load_more": "మరినà±à°¨à°¿ లోడౠచేయి", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "మీడియా దాచబడింది", "status.mention": "@{name}నౠపà±à°°à°¸à±à°¤à°¾à°µà°¿à°‚à°šà±", "status.more": "ఇంకొనà±à°¨à°¿", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index a9278fdd057e2925ed9cde27a190f9c497db7946..352e92092290a44100291ad59d6252cdb0ca088d 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "รายงานปัà¸à¸«à¸²", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "à¸à¸™à¸¸à¸à¸²à¸•", "follow_request.reject": "ปà¸à¸´à¹€à¸ªà¸˜", "getting_started.developers": "นัà¸à¸žà¸±à¸’นา", @@ -354,6 +359,7 @@ "status.favourite": "ชื่นชà¸à¸š", "status.filtered": "à¸à¸£à¸à¸‡à¸à¸¢à¸¹à¹ˆ", "status.load_more": "โหลดเพิ่มเติม", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "ซ่à¸à¸™à¸ªà¸·à¹ˆà¸à¸à¸¢à¸¹à¹ˆ", "status.mention": "à¸à¸¥à¹ˆà¸²à¸§à¸–ึง @{name}", "status.more": "เพิ่มเติม", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 5ceefa1828d95e15c48f42f04fb9f3838ddb21e1..4be3eaa15e36c983462ad27d6876b33ada627646 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Sayfayı yenilemeyi deneyin. EÄŸer bu yardımcı olmazsa, Mastodon'u farklı bir tarayıcı ya da yerel uygulama üzerinden kullanabilirsiniz.", "errors.unexpected_crash.copy_stacktrace": "Yığın izlemeyi (stacktrace) panoya kopyala", "errors.unexpected_crash.report_issue": "Sorun bildir", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Yetkilendir", "follow_request.reject": "Reddet", "getting_started.developers": "GeliÅŸtiriciler", @@ -354,6 +359,7 @@ "status.favourite": "Favorilere ekle", "status.filtered": "FiltrelenmiÅŸ", "status.load_more": "Daha fazla", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Gizli görsel", "status.mention": "Bahset : @{name}", "status.more": "Daha fazla", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 6501c0283b99e4ace08748756011030691bda9a5..b8be74b008b2ba4b7d2d69f5186723300a5ae77e 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "Ðвторизувати", "follow_request.reject": "Відмовити", "getting_started.developers": "Розробникам", @@ -354,6 +359,7 @@ "status.favourite": "ПодобаєтьÑÑ", "status.filtered": "Відфільтровано", "status.load_more": "Завантажити більше", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "Медіаконтент приховано", "status.mention": "Згадати @{name}", "status.more": "Більше", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 2804b2724ea22950c494752f31da8b51e30890b4..0e53f8ffad9930c2521bf6db635498d941973ebd 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "åŒæ„", "follow_request.reject": "æ‹’ç»", "getting_started.developers": "å¼€å‘", @@ -354,6 +359,7 @@ "status.favourite": "æ”¶è—", "status.filtered": "已过滤", "status.load_more": "åŠ è½½æ›´å¤š", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "éšè—媒体内容", "status.mention": "æåŠ @{name}", "status.more": "更多", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3ca9f0e2e5dc6a0265cfdc55bad5c6411aaea9a0..49993cb52053fa5b68a9c53172a0c06bb78cddac 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "批准", "follow_request.reject": "拒絕", "getting_started.developers": "開發者", @@ -354,6 +359,7 @@ "status.favourite": "æ”¶è—", "status.filtered": "Filtered", "status.load_more": "載入更多", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "éš±è—媒體內容", "status.mention": "æåŠ @{name}", "status.more": "更多", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 136573381f0608e5ffe39d24ace1127e1b4d3f7c..e6080011ee8ef9dc758ade4c3a3a329ec57ac506 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -156,6 +156,11 @@ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.report_issue": "Report issue", + "federation.change": "Adjust status federation", + "federation.federated.long": "Allow toot to reach other instances", + "federation.federated.short": "Federated", + "federation.local_only.long": "Restrict this toot only to my instance", + "federation.local_only.short": "Local-only", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", "getting_started.developers": "開發者", @@ -354,6 +359,7 @@ "status.favourite": "最愛", "status.filtered": "å·²éŽæ¿¾", "status.load_more": "載入更多", + "status.local_only": "This post is only visible by other users of your instance", "status.media_hidden": "éš±è—媒體內容", "status.mention": "æåˆ° @{name}", "status.more": "更多", diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index b5dc81703d156f670a08c9e0a1bb8eeb8f612f8d..8692cb25467a2e45c3039d12ac7e73ab90381847 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -23,6 +23,7 @@ import { COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, COMPOSE_VISIBILITY_CHANGE, + COMPOSE_FEDERATION_CHANGE, COMPOSE_COMPOSING_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, @@ -50,6 +51,7 @@ const initialState = ImmutableMap({ spoiler: false, spoiler_text: '', privacy: null, + federation: null, text: '', focusDate: null, caretPosition: null, @@ -65,6 +67,7 @@ const initialState = ImmutableMap({ suggestion_token: null, suggestions: ImmutableList(), default_privacy: 'public', + default_federation: true, default_sensitive: false, resetFileKey: Math.floor((Math.random() * 0x10000)), idempotencyKey: null, @@ -96,6 +99,7 @@ function clearAll(state) { map.set('is_changing_upload', false); map.set('in_reply_to', null); map.set('privacy', state.get('default_privacy')); + map.set('federation', state.get('default_federation')); map.set('sensitive', false); map.update('media_attachments', list => list.clear()); map.set('poll', null); @@ -272,6 +276,10 @@ export default function compose(state = initialState, action) { return state .set('spoiler_text', action.text) .set('idempotencyKey', uuid()); + case COMPOSE_FEDERATION_CHANGE: + return state + .set('federation', action.value) + .set('idempotencyKey', uuid()); case COMPOSE_VISIBILITY_CHANGE: return state .set('privacy', action.value) @@ -287,6 +295,7 @@ export default function compose(state = initialState, action) { map.set('in_reply_to', action.status.get('id')); map.set('text', statusToTextMentions(state, action.status)); map.set('privacy', privacyPreference(action.status.get('visibility'), state.get('default_privacy'))); + map.set('federation', !action.status.get('local_only')); map.set('focusDate', new Date()); map.set('caretPosition', null); map.set('preselectDate', new Date()); @@ -309,6 +318,7 @@ export default function compose(state = initialState, action) { map.set('spoiler_text', ''); map.set('privacy', state.get('default_privacy')); map.set('poll', null); + map.set('federation', state.get('default_federation')); map.set('idempotencyKey', uuid()); }); case COMPOSE_SUBMIT_REQUEST: @@ -379,6 +389,7 @@ export default function compose(state = initialState, action) { map.set('text', action.raw_text || unescapeHTML(expandMentions(action.status))); map.set('in_reply_to', action.status.get('in_reply_to_id')); map.set('privacy', action.status.get('visibility')); + map.set('federation', !action.status.get('local_only')); map.set('media_attachments', action.status.get('media_attachments')); map.set('focusDate', new Date()); map.set('caretPosition', null); diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 3568a3e1167a20bbf03357c57a4d0cd6a359f535..52249f940111fd9c652f1985380e82b18e824427 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -20,6 +20,7 @@ class UserSettingsDecorator user.settings['default_privacy'] = default_privacy_preference if change?('setting_default_privacy') user.settings['default_sensitive'] = default_sensitive_preference if change?('setting_default_sensitive') user.settings['default_language'] = default_language_preference if change?('setting_default_language') + user.settings['default_federation'] = default_federation_preference if change?('setting_default_federation') user.settings['unfollow_modal'] = unfollow_modal_preference if change?('setting_unfollow_modal') user.settings['boost_modal'] = boost_modal_preference if change?('setting_boost_modal') user.settings['delete_modal'] = delete_modal_preference if change?('setting_delete_modal') @@ -55,6 +56,10 @@ class UserSettingsDecorator boolean_cast_setting 'setting_default_sensitive' end + def default_federation_preference + boolean_cast_setting 'setting_default_federation' + end + def unfollow_modal_preference boolean_cast_setting 'setting_unfollow_modal' end diff --git a/app/models/status.rb b/app/models/status.rb index 0c01a5389d88b355dea6e142fcbe4d4a0ea89e0a..8dd50e40c45756d1cf4b2a49be9aeb93285aeb0b 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -23,6 +23,7 @@ # in_reply_to_account_id :bigint(8) # poll_id :bigint(8) # deleted_at :datetime +# local_only :boolean # class Status < ApplicationRecord @@ -84,6 +85,7 @@ class Status < ApplicationRecord scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') } scope :without_reblogs, -> { where('statuses.reblog_of_id IS NULL') } + scope :without_local_only, -> { where(local_only: [false, nil]) } scope :with_public_visibility, -> { where(visibility: :public) } scope :tagged_with, ->(tag) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag }) } scope :excluding_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced_at: nil }) } @@ -154,6 +156,10 @@ class Status < ApplicationRecord attributes['local'] || uri.nil? end + def local_only? + local_only + end + def reblog? !reblog_of_id.nil? end @@ -265,6 +271,8 @@ class Status < ApplicationRecord around_create Mastodon::Snowflake::Callbacks + before_create :set_locality + before_validation :prepare_contents, if: :local? before_validation :set_reblog before_validation :set_visibility @@ -338,7 +346,7 @@ class Status < ApplicationRecord visibility = [:public, :unlisted] if account.nil? - where(visibility: visibility) + where(visibility: visibility).without_local_only elsif target_account.blocking?(account) # get rid of blocked peeps none elsif account.id == target_account.id # author can see own stuff @@ -381,7 +389,7 @@ class Status < ApplicationRecord end def filter_timeline_default(query) - query.excluding_silenced_accounts + query.without_local_only.excluding_silenced_accounts end def account_silencing_filter(account) @@ -454,6 +462,10 @@ class Status < ApplicationRecord self.local = account.local? end + def set_locality + self.local_only = reblog.local_only if reblog? + end + def update_statistics return unless distributable? diff --git a/app/models/user.rb b/app/models/user.rb index 9a19a53b32dae12c4876050f8bf3f07c35e26576..b34546ab98447d67a13ce94f8057346a3ae923eb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -108,7 +108,7 @@ class User < ApplicationRecord delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, :reduce_motion, :system_font_ui, :noindex, :theme, :display_media, :hide_network, :expand_spoilers, :default_language, :aggregate_reblogs, :show_application, - :advanced_layout, :use_blurhash, :use_pending_items, :trends, + :advanced_layout, :use_blurhash, :use_pending_items, :trends, :default_federation, to: :settings, prefix: :setting, allow_nil: false attr_reader :invite_code diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 3d4e50d3719730cc65540f58180a103fc3a284f9..00e12bcbc9b18e308e0298dedbc5c7d0276aa6e8 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -12,6 +12,8 @@ class StatusPolicy < ApplicationPolicy end def show? + return false if local_only? && (current_account.nil? || !current_account.local?) + if requires_mention? owned? || mention_exists? elsif private? @@ -90,4 +92,8 @@ class StatusPolicy < ApplicationPolicy def author record.account end + + def local_only? + record.local_only? + end end diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index e74f0b74068ea210d8f46650b57ce9273730cf4f..e473d4a09413a2cc88d6df0a52979f0cc839b3b2 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -59,6 +59,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:me] = object.current_account.id.to_s store[:default_privacy] = object.current_account.user.setting_default_privacy store[:default_sensitive] = object.current_account.user.setting_default_sensitive + store[:default_federation] = object.current_account.user.setting_default_federation end store[:text] = object.text if object.text diff --git a/app/serializers/rest/credential_account_serializer.rb b/app/serializers/rest/credential_account_serializer.rb index be0d763dc122991b0fdc957d321cd0d7c2a7a9df..fa8f900cc594170dc646a0fab0fee5643a6082b3 100644 --- a/app/serializers/rest/credential_account_serializer.rb +++ b/app/serializers/rest/credential_account_serializer.rb @@ -10,6 +10,7 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer privacy: user.setting_default_privacy, sensitive: user.setting_default_sensitive, language: user.setting_default_language, + federation: user.setting_default_federation, note: object.note, fields: object.fields.map(&:to_h), follow_requests_count: FollowRequest.where(target_account: object).limit(40).count, diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 2dc4a1b61cae02afbf5c91dcac14a8c30ce4052f..ad0287a91c9cdfc93dc7d1ed73282ce6e82f6c16 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -4,7 +4,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id, :sensitive, :spoiler_text, :visibility, :language, :uri, :url, :replies_count, :reblogs_count, - :favourites_count + :favourites_count, :local_only attribute :favourited, if: :current_user? attribute :reblogged, if: :current_user? diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index a0a650d62411735c9da77f9ffc118e31065d61bd..b59982d84531c2369e6e94ec79933c0abb824176 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -85,11 +85,19 @@ class PostStatusService < BaseService end end + def local_only_option(local_only, in_reply_to, federation_setting) + return in_reply_to&.local_only? if local_only.nil? # XXX temporary, just until clients implement to avoid leaking local_only posts + return federation_setting if local_only.nil? + local_only + end + def postprocess_status! LinkCrawlWorker.perform_async(@status.id) unless @status.spoiler_text? DistributionWorker.perform_async(@status.id) - ActivityPub::DistributionWorker.perform_async(@status.id) - PollExpirationNotifyWorker.perform_at(@status.poll.expires_at, @status.poll.id) if @status.poll + unless @status.local_only? + ActivityPub::DistributionWorker.perform_async(@status.id) + PollExpirationNotifyWorker.perform_at(@status.poll.expires_at, @status.poll.id) if @status.poll + end end def validate_media! @@ -160,6 +168,7 @@ class PostStatusService < BaseService visibility: @visibility, language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account), application: @options[:application], + local_only: local_only_option(@options[:local_only], @in_reply_to, @account.user&.setting_default_federation), }.compact end diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 2f7a9e985b5f9209fcc8c6812b1199278b84613b..19de377174a724897466c95a1d7720c95d6d1900 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -49,7 +49,7 @@ class ProcessMentionsService < BaseService if mentioned_account.local? LocalNotificationWorker.perform_async(mentioned_account.id, mention.id, mention.class.name) - elsif mentioned_account.activitypub? + elsif mentioned_account.activitypub? && !@status.local_only? ActivityPub::DeliveryWorker.perform_async(activitypub_json, mention.status.account_id, mentioned_account.inbox_url) end end diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb index 3bb460fcaf946e6db5a998b3c68d6c12bc4a84d9..9c409da801e1f6257756c3f04ad0b71e489d6cff 100644 --- a/app/services/reblog_service.rb +++ b/app/services/reblog_service.rb @@ -23,7 +23,9 @@ class ReblogService < BaseService reblog = account.statuses.create!(reblog: reblogged_status, text: '', visibility: visibility) DistributionWorker.perform_async(reblog.id) - ActivityPub::DistributionWorker.perform_async(reblog.id) + unless reblogged_status.local_only? + ActivityPub::DistributionWorker.perform_async(reblog.id) + end create_notification(reblog) bump_potential_friendship(account, reblog) diff --git a/app/views/admin/reports/_status.html.haml b/app/views/admin/reports/_status.html.haml index 6facc0a568ba93fc24d2dc19d380a99e7c6f1d07..6640f30e0fa661d3670f067ce58c01f3acc9deb4 100644 --- a/app/views/admin/reports/_status.html.haml +++ b/app/views/admin/reports/_status.html.haml @@ -35,3 +35,7 @@ · = fa_icon('eye-slash fw') = t('stream_entries.sensitive_content') + - if status.proper.local_only + · + = fa_icon('chain-broken fw') + = t('statuses.local_only') diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml index db7d806bc05445eed383840606b674be059d0b2a..4f15ed0164d740a35835f921996421f1d1950ce1 100644 --- a/app/views/settings/preferences/other/show.html.haml +++ b/app/views/settings/preferences/other/show.html.haml @@ -25,6 +25,9 @@ .fields-group = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label + .fields-group + = f.input :setting_default_federation, as: :boolean, wrapper: :with_label + .fields-group = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml index 3e933289e98b5cfaed05f45d8efe51698c4eb000..6367f4eddf40199b7d18884b9d7638569d8b332a 100644 --- a/app/views/statuses/_detailed_status.html.haml +++ b/app/views/statuses/_detailed_status.html.haml @@ -78,6 +78,10 @@ %span.detailed-status__favorites>= number_to_human status.favourites_count, strip_insignificant_zeros: true = " " + - if status.local_only + · + %span.detailed-status__link.modal-button.disabled< + = fa_icon 'chain-broken fw', 'title': t('statuses.local_only') - if user_signed_in? · = link_to t('statuses.open_in_web'), web_url("statuses/#{status.id}"), class: 'detailed-status__application', target: '_blank' diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml index a68fe10220c85766afb2b5fee2649a361d433789..9b89e30a92db5b6bf02865b01ea54ee81ea4242e 100644 --- a/app/views/statuses/_simple_status.html.haml +++ b/app/views/statuses/_simple_status.html.haml @@ -62,3 +62,6 @@ = fa_icon 'envelope fw' = link_to remote_interaction_path(status, type: :favourite), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do = fa_icon 'star fw' + - if status.local_only + %span.status__action-bar-button.icon-button.disabled{style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;'}< + = fa_icon 'chain-broken fw', 'title': t('statuses.local_only') diff --git a/config/locales/en.yml b/config/locales/en.yml index b62b4186ffbeb12843d700308669b2b93461b257..c00659a707fd9b04ae5325076049c9249afc2b5c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1025,6 +1025,7 @@ en: one: 'contained a disallowed hashtag: %{tags}' other: 'contained the disallowed hashtags: %{tags}' language_detection: Automatically detect language + local_only: Local-only open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index bafbcaab3018044eeb1bb377e73ae855172a6c34..c21d98063c7e46a1a920e50cd5699b8fb8a682ec 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -914,6 +914,7 @@ pt-BR: one: 'continha a hashtag não permitida: %{tags}' other: 'continha as hashtags não permitidas: %{tags}' language_detection: Detectar idioma automaticamente + local_only: Somente local open_in_web: Abrir na web over_character_limit: limite de caracteres de %{max} excedido pin_errors: diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 3d909e9991bd4351e7537b76f5f938ab05956003..2a08510ff02292a323ff1484ecdeb6c3417f926c 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -34,6 +34,7 @@ en: phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts) + setting_default_federation: Toots do not federate to other instances unless manually changed while composing setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media @@ -113,6 +114,7 @@ en: setting_aggregate_reblogs: Group boosts in timelines setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting + setting_default_federation: Allow my toots to reach other instances by default 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.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 3f3f78180b1695d6430ae019dfb0408aa1356559..72f179d5238af5affcbc180a482355af9c46b882 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -103,6 +103,7 @@ pt-BR: setting_aggregate_reblogs: Agrupar compartilhamentos nas timelines setting_auto_play_gif: Reproduzir GIFs automaticamente setting_boost_modal: Mostrar diálogo de confirmação antes de compartilhar postagem + setting_default_federation: Permitir que meus toots cheguem em outras instâncias por padrão setting_default_language: Idioma das postagens setting_default_privacy: Privacidade das postagens setting_default_sensitive: Sempre marcar mÃdia como sensÃvel diff --git a/config/settings.yml b/config/settings.yml index bd2f65b5e4dc9583f199e8ac2f83d377e1fdd90e..a39eb2ea80bcd872125cd21676aae0c0d1a2d7d4 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -17,6 +17,7 @@ defaults: &defaults timeline_preview: true show_staff_badge: true default_sensitive: false + default_federation: true hide_network: false unfollow_modal: false boost_modal: false diff --git a/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb b/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb new file mode 100644 index 0000000000000000000000000000000000000000..af1e29d6a141c9bf1de2d9aa1ba48cdc596b30c1 --- /dev/null +++ b/db/migrate/20171210213213_add_local_only_flag_to_statuses.rb @@ -0,0 +1,5 @@ +class AddLocalOnlyFlagToStatuses < ActiveRecord::Migration[5.1] + def change + add_column :statuses, :local_only, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 62e2d3a6d64e8ef513c29a3ecef779588041dd3d..cd1f26281c5134d3ff7b19f2336645ed4d9c09e0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -678,6 +678,7 @@ ActiveRecord::Schema.define(version: 2019_10_07_013357) do t.bigint "in_reply_to_account_id" t.bigint "poll_id" t.datetime "deleted_at" + t.boolean "local_only" t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)" t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))" t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id" diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 51a10cd1776f2acad4cf3387b49c8cc1b970f824..0b6086978d890af4c93764d13a151d300734422e 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -481,6 +481,32 @@ RSpec.describe Status, type: :model do end end end + + context 'with local-only statuses' do + let(:status) { Fabricate(:status, local_only: true) } + + subject { Status.as_public_timeline(viewer) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'excludes local-only statuses' do + expect(subject).to_not include(status) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'includes local-only statuses' do + expect(subject).to include(status) + end + end + + # TODO: What happens if the viewer is remote? + # Can the viewer be remote? + # What prevents the viewer from being remote? + end end describe '.as_tag_timeline' do @@ -502,6 +528,27 @@ RSpec.describe Status, type: :model do results = Status.as_tag_timeline(tag) expect(results).to include(status) end + + context 'on a local-only status' do + let(:tag) { Fabricate(:tag) } + let(:status) { Fabricate(:status, local_only: true, tags: [tag]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'filters the local-only status out of the result set' do + expect(Status.as_tag_timeline(tag, viewer)).not_to include(status) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer', domain: nil) } + + it 'keeps the local-only status in the result set' do + expect(Status.as_tag_timeline(tag, viewer)).to include(status) + end + end + end end describe '.permitted_for' do diff --git a/spec/policies/status_policy_spec.rb b/spec/policies/status_policy_spec.rb index 1cddf4abd57da9a0df420ae141f4e9d403c9f38a..8bce29cad27e3660fa7d6a6920afc8486b40c244 100644 --- a/spec/policies/status_policy_spec.rb +++ b/spec/policies/status_policy_spec.rb @@ -73,6 +73,18 @@ RSpec.describe StatusPolicy, type: :model do expect(subject).to_not permit(viewer, status) end + + it 'denies access when local-only and the viewer is not logged in' do + allow(status).to receive(:local_only?) { true } + + expect(subject).to_not permit(nil, status) + end + + it 'denies access when local-only and the viewer is from another domain' do + viewer = Fabricate(:account, domain: 'remote-domain') + allow(status).to receive(:local_only?) { true } + expect(subject).to_not permit(viewer, status) + end end permissions :reblog? do diff --git a/streaming/index.js b/streaming/index.js index 304e7e0465bed4e3b79a2b8e2e8e53792779d99f..f743f574451e233ed7250aff0543db5966f9a332 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -376,6 +376,12 @@ const startWorker = (workerId) => { return; } + // Only send local-only statuses to logged-in users + if (payload.local_only && !req.accountId) { + log.silly(req.requestId, `Message ${payload.id} filtered because it was local-only`); + return; + } + // Only messages that may require filtering are statuses, since notifications // are already personalized and deletes do not matter if (!needsFiltering || event !== 'update') {