Merge remote-tracking branch 'glitchsoc/master' into 454-allow-keyword-mutes-to-skip-mentions
Conflicts: app/models/glitch/keyword_mute.rb
This commit is contained in:
		
						commit
						e931cf656d
					
				
					 100 changed files with 477 additions and 486 deletions
				
			
		|  | @ -30,6 +30,7 @@ plugins: | ||||||
|     channel: eslint-4 |     channel: eslint-4 | ||||||
|   rubocop: |   rubocop: | ||||||
|     enabled: true |     enabled: true | ||||||
|  |     channel: rubocop-0-54 | ||||||
|   scss-lint: |   scss-lint: | ||||||
|     enabled: true |     enabled: true | ||||||
| exclude_patterns: | exclude_patterns: | ||||||
|  |  | ||||||
|  | @ -107,5 +107,8 @@ Style/RegexpLiteral: | ||||||
| Style/SymbolArray: | Style/SymbolArray: | ||||||
|   Enabled: false |   Enabled: false | ||||||
| 
 | 
 | ||||||
| Style/TrailingCommaInLiteral: | Style/TrailingCommaInArrayLiteral: | ||||||
|  |   EnforcedStyleForMultiline: 'comma' | ||||||
|  | 
 | ||||||
|  | Style/TrailingCommaInHashLiteral: | ||||||
|   EnforcedStyleForMultiline: 'comma' |   EnforcedStyleForMultiline: 'comma' | ||||||
|  |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| # frozen_string_literal: true |  | ||||||
| 
 |  | ||||||
| class Api::V1::TrendsController < Api::BaseController |  | ||||||
|   before_action :set_tags |  | ||||||
| 
 |  | ||||||
|   respond_to :json |  | ||||||
| 
 |  | ||||||
|   def index |  | ||||||
|     render json: @tags, each_serializer: REST::TagSerializer |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   private |  | ||||||
| 
 |  | ||||||
|   def set_tags |  | ||||||
|     @tags = TrendingTags.get(limit_param(10)) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -10,10 +10,10 @@ export default class ColumnBackButton extends React.PureComponent { | ||||||
| 
 | 
 | ||||||
|   handleClick = () => { |   handleClick = () => { | ||||||
|     // if history is exhausted, or we would leave mastodon, just go to root.
 |     // if history is exhausted, or we would leave mastodon, just go to root.
 | ||||||
|     if (window.history && (window.history.length === 1 || window.history.length === window._mastoInitialHistoryLen)) { |     if (window.history.state) { | ||||||
|       this.context.router.history.push('/'); |  | ||||||
|     } else { |  | ||||||
|       this.context.router.history.goBack(); |       this.context.router.history.goBack(); | ||||||
|  |     } else { | ||||||
|  |       this.context.router.history.push('/'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,10 +10,10 @@ export default class ColumnBackButtonSlim extends React.PureComponent { | ||||||
| 
 | 
 | ||||||
|   handleClick = () => { |   handleClick = () => { | ||||||
|     // if history is exhausted, or we would leave mastodon, just go to root.
 |     // if history is exhausted, or we would leave mastodon, just go to root.
 | ||||||
|     if (window.history && (window.history.length === 1 || window.history.length === window._mastoInitialHistoryLen)) { |     if (window.history.state) { | ||||||
|       this.context.router.history.push('/'); |  | ||||||
|     } else { |  | ||||||
|       this.context.router.history.goBack(); |       this.context.router.history.goBack(); | ||||||
|  |     } else { | ||||||
|  |       this.context.router.history.push('/'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -66,10 +66,10 @@ export default class ColumnHeader extends React.PureComponent { | ||||||
| 
 | 
 | ||||||
|   handleBackClick = () => { |   handleBackClick = () => { | ||||||
|     // if history is exhausted, or we would leave mastodon, just go to root.
 |     // if history is exhausted, or we would leave mastodon, just go to root.
 | ||||||
|     if (window.history && (window.history.length === 1 || window.history.length === window._mastoInitialHistoryLen)) { |     if (window.history.state) { | ||||||
|       this.context.router.history.push('/'); |  | ||||||
|     } else { |  | ||||||
|       this.context.router.history.goBack(); |       this.context.router.history.goBack(); | ||||||
|  |     } else { | ||||||
|  |       this.context.router.history.push('/'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -99,10 +99,6 @@ const keyMap = { | ||||||
| @withRouter | @withRouter | ||||||
| export default class UI extends React.Component { | export default class UI extends React.Component { | ||||||
| 
 | 
 | ||||||
|   static contextTypes = { |  | ||||||
|     router: PropTypes.object.isRequired, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   static propTypes = { |   static propTypes = { | ||||||
|     dispatch: PropTypes.func.isRequired, |     dispatch: PropTypes.func.isRequired, | ||||||
|     children: PropTypes.node, |     children: PropTypes.node, | ||||||
|  | @ -113,6 +109,7 @@ export default class UI extends React.Component { | ||||||
|     isComposing: PropTypes.bool, |     isComposing: PropTypes.bool, | ||||||
|     hasComposingText: PropTypes.bool, |     hasComposingText: PropTypes.bool, | ||||||
|     location: PropTypes.object, |     location: PropTypes.object, | ||||||
|  |     router: PropTypes.object, | ||||||
|     intl: PropTypes.object.isRequired, |     intl: PropTypes.object.isRequired, | ||||||
|     dropdownMenuIsOpen: PropTypes.bool, |     dropdownMenuIsOpen: PropTypes.bool, | ||||||
|   }; |   }; | ||||||
|  | @ -200,7 +197,7 @@ export default class UI extends React.Component { | ||||||
| 
 | 
 | ||||||
|   handleServiceWorkerPostMessage = ({ data }) => { |   handleServiceWorkerPostMessage = ({ data }) => { | ||||||
|     if (data.type === 'navigate') { |     if (data.type === 'navigate') { | ||||||
|       this.context.router.history.push(data.path); |       this.props.router.history.push(data.path); | ||||||
|     } else { |     } else { | ||||||
|       console.warn('Unknown message type:', data.type); |       console.warn('Unknown message type:', data.type); | ||||||
|     } |     } | ||||||
|  | @ -305,10 +302,11 @@ export default class UI extends React.Component { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyBack = () => { |   handleHotkeyBack = () => { | ||||||
|     if (window.history && window.history.length === 1) { |     // if history is exhausted, or we would leave mastodon, just go to root.
 | ||||||
|       this.context.router.history.push('/'); |     if (window.history.state) { | ||||||
|     } else { |  | ||||||
|       this.context.router.history.goBack(); |       this.context.router.history.goBack(); | ||||||
|  |     } else { | ||||||
|  |       this.context.router.history.push('/'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -318,54 +316,54 @@ export default class UI extends React.Component { | ||||||
| 
 | 
 | ||||||
|   handleHotkeyToggleHelp = () => { |   handleHotkeyToggleHelp = () => { | ||||||
|     if (this.props.location.pathname === '/keyboard-shortcuts') { |     if (this.props.location.pathname === '/keyboard-shortcuts') { | ||||||
|       this.context.router.history.goBack(); |       this.props.router.history.goBack(); | ||||||
|     } else { |     } else { | ||||||
|       this.context.router.history.push('/keyboard-shortcuts'); |       this.props.router.history.push('/keyboard-shortcuts'); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToHome = () => { |   handleHotkeyGoToHome = () => { | ||||||
|     this.context.router.history.push('/timelines/home'); |     this.props.router.history.push('/timelines/home'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToNotifications = () => { |   handleHotkeyGoToNotifications = () => { | ||||||
|     this.context.router.history.push('/notifications'); |     this.props.router.history.push('/notifications'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToLocal = () => { |   handleHotkeyGoToLocal = () => { | ||||||
|     this.context.router.history.push('/timelines/public/local'); |     this.props.router.history.push('/timelines/public/local'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToFederated = () => { |   handleHotkeyGoToFederated = () => { | ||||||
|     this.context.router.history.push('/timelines/public'); |     this.props.router.history.push('/timelines/public'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToDirect = () => { |   handleHotkeyGoToDirect = () => { | ||||||
|     this.context.router.history.push('/timelines/direct'); |     this.props.router.history.push('/timelines/direct'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToStart = () => { |   handleHotkeyGoToStart = () => { | ||||||
|     this.context.router.history.push('/getting-started'); |     this.props.router.history.push('/getting-started'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToFavourites = () => { |   handleHotkeyGoToFavourites = () => { | ||||||
|     this.context.router.history.push('/favourites'); |     this.props.router.history.push('/favourites'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToPinned = () => { |   handleHotkeyGoToPinned = () => { | ||||||
|     this.context.router.history.push('/pinned'); |     this.props.router.history.push('/pinned'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToProfile = () => { |   handleHotkeyGoToProfile = () => { | ||||||
|     this.context.router.history.push(`/accounts/${me}`); |     this.props.router.history.push(`/accounts/${me}`); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToBlocked = () => { |   handleHotkeyGoToBlocked = () => { | ||||||
|     this.context.router.history.push('/blocks'); |     this.props.router.history.push('/blocks'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleHotkeyGoToMuted = () => { |   handleHotkeyGoToMuted = () => { | ||||||
|     this.context.router.history.push('/mutes'); |     this.props.router.history.push('/mutes'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   render () { |   render () { | ||||||
|  |  | ||||||
|  | @ -27,7 +27,6 @@ import { | ||||||
|   FAVOURITES_FETCH_SUCCESS, |   FAVOURITES_FETCH_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/interactions'; | } from 'flavours/glitch/actions/interactions'; | ||||||
| import { | import { | ||||||
|   TIMELINE_REFRESH_SUCCESS, |  | ||||||
|   TIMELINE_UPDATE, |   TIMELINE_UPDATE, | ||||||
|   TIMELINE_EXPAND_SUCCESS, |   TIMELINE_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/timelines'; | } from 'flavours/glitch/actions/timelines'; | ||||||
|  | @ -38,7 +37,6 @@ import { | ||||||
| import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; | import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; | ||||||
| import { | import { | ||||||
|   NOTIFICATIONS_UPDATE, |   NOTIFICATIONS_UPDATE, | ||||||
|   NOTIFICATIONS_REFRESH_SUCCESS, |  | ||||||
|   NOTIFICATIONS_EXPAND_SUCCESS, |   NOTIFICATIONS_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/notifications'; | } from 'flavours/glitch/actions/notifications'; | ||||||
| import { | import { | ||||||
|  | @ -144,11 +142,9 @@ export default function accounts(state = initialState, action) { | ||||||
|   case LIST_ACCOUNTS_FETCH_SUCCESS: |   case LIST_ACCOUNTS_FETCH_SUCCESS: | ||||||
|   case LIST_EDITOR_SUGGESTIONS_READY: |   case LIST_EDITOR_SUGGESTIONS_READY: | ||||||
|     return action.accounts ? normalizeAccounts(state, action.accounts) : state; |     return action.accounts ? normalizeAccounts(state, action.accounts) : state; | ||||||
|   case NOTIFICATIONS_REFRESH_SUCCESS: |  | ||||||
|   case NOTIFICATIONS_EXPAND_SUCCESS: |   case NOTIFICATIONS_EXPAND_SUCCESS: | ||||||
|   case SEARCH_FETCH_SUCCESS: |   case SEARCH_FETCH_SUCCESS: | ||||||
|     return normalizeAccountsFromStatuses(normalizeAccounts(state, action.accounts), action.statuses); |     return normalizeAccountsFromStatuses(normalizeAccounts(state, action.accounts), action.statuses); | ||||||
|   case TIMELINE_REFRESH_SUCCESS: |  | ||||||
|   case TIMELINE_EXPAND_SUCCESS: |   case TIMELINE_EXPAND_SUCCESS: | ||||||
|   case CONTEXT_FETCH_SUCCESS: |   case CONTEXT_FETCH_SUCCESS: | ||||||
|   case FAVOURITED_STATUSES_FETCH_SUCCESS: |   case FAVOURITED_STATUSES_FETCH_SUCCESS: | ||||||
|  |  | ||||||
|  | @ -29,7 +29,6 @@ import { | ||||||
|   FAVOURITES_FETCH_SUCCESS, |   FAVOURITES_FETCH_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/interactions'; | } from 'flavours/glitch/actions/interactions'; | ||||||
| import { | import { | ||||||
|   TIMELINE_REFRESH_SUCCESS, |  | ||||||
|   TIMELINE_UPDATE, |   TIMELINE_UPDATE, | ||||||
|   TIMELINE_EXPAND_SUCCESS, |   TIMELINE_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/timelines'; | } from 'flavours/glitch/actions/timelines'; | ||||||
|  | @ -40,7 +39,6 @@ import { | ||||||
| import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; | import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; | ||||||
| import { | import { | ||||||
|   NOTIFICATIONS_UPDATE, |   NOTIFICATIONS_UPDATE, | ||||||
|   NOTIFICATIONS_REFRESH_SUCCESS, |  | ||||||
|   NOTIFICATIONS_EXPAND_SUCCESS, |   NOTIFICATIONS_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/notifications'; | } from 'flavours/glitch/actions/notifications'; | ||||||
| import { | import { | ||||||
|  | @ -119,11 +117,9 @@ export default function accountsCounters(state = initialState, action) { | ||||||
|   case LIST_ACCOUNTS_FETCH_SUCCESS: |   case LIST_ACCOUNTS_FETCH_SUCCESS: | ||||||
|   case LIST_EDITOR_SUGGESTIONS_READY: |   case LIST_EDITOR_SUGGESTIONS_READY: | ||||||
|     return action.accounts ? normalizeAccounts(state, action.accounts) : state; |     return action.accounts ? normalizeAccounts(state, action.accounts) : state; | ||||||
|   case NOTIFICATIONS_REFRESH_SUCCESS: |  | ||||||
|   case NOTIFICATIONS_EXPAND_SUCCESS: |   case NOTIFICATIONS_EXPAND_SUCCESS: | ||||||
|   case SEARCH_FETCH_SUCCESS: |   case SEARCH_FETCH_SUCCESS: | ||||||
|     return normalizeAccountsFromStatuses(normalizeAccounts(state, action.accounts), action.statuses); |     return normalizeAccountsFromStatuses(normalizeAccounts(state, action.accounts), action.statuses); | ||||||
|   case TIMELINE_REFRESH_SUCCESS: |  | ||||||
|   case TIMELINE_EXPAND_SUCCESS: |   case TIMELINE_EXPAND_SUCCESS: | ||||||
|   case CONTEXT_FETCH_SUCCESS: |   case CONTEXT_FETCH_SUCCESS: | ||||||
|   case FAVOURITED_STATUSES_FETCH_SUCCESS: |   case FAVOURITED_STATUSES_FETCH_SUCCESS: | ||||||
|  |  | ||||||
|  | @ -21,14 +21,12 @@ import { | ||||||
|   STATUS_UNMUTE_SUCCESS, |   STATUS_UNMUTE_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/statuses'; | } from 'flavours/glitch/actions/statuses'; | ||||||
| import { | import { | ||||||
|   TIMELINE_REFRESH_SUCCESS, |  | ||||||
|   TIMELINE_UPDATE, |   TIMELINE_UPDATE, | ||||||
|   TIMELINE_DELETE, |   TIMELINE_DELETE, | ||||||
|   TIMELINE_EXPAND_SUCCESS, |   TIMELINE_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/timelines'; | } from 'flavours/glitch/actions/timelines'; | ||||||
| import { | import { | ||||||
|   NOTIFICATIONS_UPDATE, |   NOTIFICATIONS_UPDATE, | ||||||
|   NOTIFICATIONS_REFRESH_SUCCESS, |  | ||||||
|   NOTIFICATIONS_EXPAND_SUCCESS, |   NOTIFICATIONS_EXPAND_SUCCESS, | ||||||
| } from 'flavours/glitch/actions/notifications'; | } from 'flavours/glitch/actions/notifications'; | ||||||
| import { | import { | ||||||
|  | @ -129,10 +127,8 @@ export default function statuses(state = initialState, action) { | ||||||
|     return state.setIn([action.id, 'muted'], true); |     return state.setIn([action.id, 'muted'], true); | ||||||
|   case STATUS_UNMUTE_SUCCESS: |   case STATUS_UNMUTE_SUCCESS: | ||||||
|     return state.setIn([action.id, 'muted'], false); |     return state.setIn([action.id, 'muted'], false); | ||||||
|   case TIMELINE_REFRESH_SUCCESS: |  | ||||||
|   case TIMELINE_EXPAND_SUCCESS: |   case TIMELINE_EXPAND_SUCCESS: | ||||||
|   case CONTEXT_FETCH_SUCCESS: |   case CONTEXT_FETCH_SUCCESS: | ||||||
|   case NOTIFICATIONS_REFRESH_SUCCESS: |  | ||||||
|   case NOTIFICATIONS_EXPAND_SUCCESS: |   case NOTIFICATIONS_EXPAND_SUCCESS: | ||||||
|   case FAVOURITED_STATUSES_FETCH_SUCCESS: |   case FAVOURITED_STATUSES_FETCH_SUCCESS: | ||||||
|   case FAVOURITED_STATUSES_EXPAND_SUCCESS: |   case FAVOURITED_STATUSES_EXPAND_SUCCESS: | ||||||
|  |  | ||||||
|  | @ -28,11 +28,6 @@ function main() { | ||||||
|       store.dispatch(registerPushNotifications.register()); |       store.dispatch(registerPushNotifications.register()); | ||||||
|     } |     } | ||||||
|     perf.stop('main()'); |     perf.stop('main()'); | ||||||
| 
 |  | ||||||
|     // remember the initial URL
 |  | ||||||
|     if (window.history && typeof window._mastoInitialHistoryLen === 'undefined') { |  | ||||||
|       window._mastoInitialHistoryLen = window.history.length; |  | ||||||
|     } |  | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -29,6 +29,8 @@ export const STATUS_UNMUTE_FAIL    = 'STATUS_UNMUTE_FAIL'; | ||||||
| export const STATUS_REVEAL = 'STATUS_REVEAL'; | export const STATUS_REVEAL = 'STATUS_REVEAL'; | ||||||
| export const STATUS_HIDE   = 'STATUS_HIDE'; | export const STATUS_HIDE   = 'STATUS_HIDE'; | ||||||
| 
 | 
 | ||||||
|  | export const REDRAFT = 'REDRAFT'; | ||||||
|  | 
 | ||||||
| export function fetchStatusRequest(id, skipLoading) { | export function fetchStatusRequest(id, skipLoading) { | ||||||
|   return { |   return { | ||||||
|     type: STATUS_FETCH_REQUEST, |     type: STATUS_FETCH_REQUEST, | ||||||
|  | @ -131,14 +133,27 @@ export function fetchStatusFail(id, error, skipLoading) { | ||||||
|   }; |   }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export function deleteStatus(id) { | export function redraft(status) { | ||||||
|  |   return { | ||||||
|  |     type: REDRAFT, | ||||||
|  |     status, | ||||||
|  |   }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export function deleteStatus(id, withRedraft = false) { | ||||||
|   return (dispatch, getState) => { |   return (dispatch, getState) => { | ||||||
|  |     const status = getState().getIn(['statuses', id]); | ||||||
|  | 
 | ||||||
|     dispatch(deleteStatusRequest(id)); |     dispatch(deleteStatusRequest(id)); | ||||||
| 
 | 
 | ||||||
|     api(getState).delete(`/api/v1/statuses/${id}`).then(() => { |     api(getState).delete(`/api/v1/statuses/${id}`).then(() => { | ||||||
|       evictStatus(id); |       evictStatus(id); | ||||||
|       dispatch(deleteStatusSuccess(id)); |       dispatch(deleteStatusSuccess(id)); | ||||||
|       dispatch(deleteFromTimelines(id)); |       dispatch(deleteFromTimelines(id)); | ||||||
|  | 
 | ||||||
|  |       if (withRedraft) { | ||||||
|  |         dispatch(redraft(status)); | ||||||
|  |       } | ||||||
|     }).catch(error => { |     }).catch(error => { | ||||||
|       dispatch(deleteStatusFail(id, error)); |       dispatch(deleteStatusFail(id, error)); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  | @ -1,32 +0,0 @@ | ||||||
| import api from '../api'; |  | ||||||
| 
 |  | ||||||
| export const TRENDS_FETCH_REQUEST = 'TRENDS_FETCH_REQUEST'; |  | ||||||
| export const TRENDS_FETCH_SUCCESS = 'TRENDS_FETCH_SUCCESS'; |  | ||||||
| export const TRENDS_FETCH_FAIL    = 'TRENDS_FETCH_FAIL'; |  | ||||||
| 
 |  | ||||||
| export const fetchTrends = () => (dispatch, getState) => { |  | ||||||
|   dispatch(fetchTrendsRequest()); |  | ||||||
| 
 |  | ||||||
|   api(getState) |  | ||||||
|     .get('/api/v1/trends') |  | ||||||
|     .then(({ data }) => dispatch(fetchTrendsSuccess(data))) |  | ||||||
|     .catch(err => dispatch(fetchTrendsFail(err))); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const fetchTrendsRequest = () => ({ |  | ||||||
|   type: TRENDS_FETCH_REQUEST, |  | ||||||
|   skipLoading: true, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export const fetchTrendsSuccess = trends => ({ |  | ||||||
|   type: TRENDS_FETCH_SUCCESS, |  | ||||||
|   trends, |  | ||||||
|   skipLoading: true, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export const fetchTrendsFail = error => ({ |  | ||||||
|   type: TRENDS_FETCH_FAIL, |  | ||||||
|   error, |  | ||||||
|   skipLoading: true, |  | ||||||
|   skipAlert: true, |  | ||||||
| }); |  | ||||||
|  | @ -1,16 +1,9 @@ | ||||||
| import React from 'react'; | import React from 'react'; | ||||||
| import { Sparklines, SparklinesCurve } from 'react-sparklines'; | import { Sparklines, SparklinesCurve } from 'react-sparklines'; | ||||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||||
| import { FormattedMessage, FormattedNumber } from 'react-intl'; | import { FormattedMessage } from 'react-intl'; | ||||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||||
| 
 | import { shortNumberFormat } from '../utils/numbers'; | ||||||
| const shortNumberFormat = number => { |  | ||||||
|   if (number < 1000) { |  | ||||||
|     return <FormattedNumber value={number} />; |  | ||||||
|   } else { |  | ||||||
|     return <React.Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</React.Fragment>; |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| const Hashtag = ({ hashtag }) => ( | const Hashtag = ({ hashtag }) => ( | ||||||
|   <div className='trends__item'> |   <div className='trends__item'> | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ import { me } from '../initial_state'; | ||||||
| 
 | 
 | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   delete: { id: 'status.delete', defaultMessage: 'Delete' }, |   delete: { id: 'status.delete', defaultMessage: 'Delete' }, | ||||||
|  |   redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, | ||||||
|   direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, |   direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, | ||||||
|   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, |   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, | ||||||
|   mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, |   mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, | ||||||
|  | @ -88,6 +89,10 @@ export default class StatusActionBar extends ImmutablePureComponent { | ||||||
|     this.props.onDelete(this.props.status); |     this.props.onDelete(this.props.status); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   handleRedraftClick = () => { | ||||||
|  |     this.props.onDelete(this.props.status, true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   handlePinClick = () => { |   handlePinClick = () => { | ||||||
|     this.props.onPin(this.props.status); |     this.props.onPin(this.props.status); | ||||||
|   } |   } | ||||||
|  | @ -159,6 +164,7 @@ export default class StatusActionBar extends ImmutablePureComponent { | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); |       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); | ||||||
|  |       menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); | ||||||
|     } else { |     } else { | ||||||
|       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); |       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); | ||||||
|       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); |       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); | ||||||
|  |  | ||||||
|  | @ -33,6 +33,8 @@ import { showAlertForError } from '../actions/alerts'; | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, |   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, | ||||||
|   deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, |   deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, | ||||||
|  |   redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, | ||||||
|  |   redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' }, | ||||||
|   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, |   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | @ -91,14 +93,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ | ||||||
|     })); |     })); | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   onDelete (status) { |   onDelete (status, withRedraft = false) { | ||||||
|     if (!deleteModal) { |     if (!deleteModal) { | ||||||
|       dispatch(deleteStatus(status.get('id'))); |       dispatch(deleteStatus(status.get('id'), withRedraft)); | ||||||
|     } else { |     } else { | ||||||
|       dispatch(openModal('CONFIRM', { |       dispatch(openModal('CONFIRM', { | ||||||
|         message: intl.formatMessage(messages.deleteMessage), |         message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), | ||||||
|         confirm: intl.formatMessage(messages.deleteConfirm), |         confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), | ||||||
|         onConfirm: () => dispatch(deleteStatus(status.get('id'))), |         onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), | ||||||
|       })); |       })); | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|  | @ -3,8 +3,9 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||||
| import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||||
| import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; | import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; | ||||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||||
| import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; | import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; | ||||||
| import { me } from '../../../initial_state'; | import { me } from '../../../initial_state'; | ||||||
|  | import { shortNumberFormat } from '../../../utils/numbers'; | ||||||
| 
 | 
 | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, |   mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, | ||||||
|  | @ -146,17 +147,17 @@ export default class ActionBar extends React.PureComponent { | ||||||
|           <div className='account__action-bar-links'> |           <div className='account__action-bar-links'> | ||||||
|             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}> |             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}> | ||||||
|               <span><FormattedMessage id='account.posts' defaultMessage='Toots' /></span> |               <span><FormattedMessage id='account.posts' defaultMessage='Toots' /></span> | ||||||
|               <strong><FormattedNumber value={account.get('statuses_count')} /></strong> |               <strong>{shortNumberFormat(account.get('statuses_count'))}</strong> | ||||||
|             </Link> |             </Link> | ||||||
| 
 | 
 | ||||||
|             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}> |             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}> | ||||||
|               <span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span> |               <span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span> | ||||||
|               <strong><FormattedNumber value={account.get('following_count')} /></strong> |               <strong>{shortNumberFormat(account.get('following_count'))}</strong> | ||||||
|             </Link> |             </Link> | ||||||
| 
 | 
 | ||||||
|             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}> |             <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}> | ||||||
|               <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span> |               <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span> | ||||||
|               <strong><FormattedNumber value={account.get('followers_count')} /></strong> |               <strong>{shortNumberFormat(account.get('followers_count'))}</strong> | ||||||
|             </Link> |             </Link> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| import React from 'react'; | import React from 'react'; | ||||||
| import PropTypes from 'prop-types'; |  | ||||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||||
| import { FormattedMessage } from 'react-intl'; | import { FormattedMessage } from 'react-intl'; | ||||||
| import AccountContainer from '../../../containers/account_container'; | import AccountContainer from '../../../containers/account_container'; | ||||||
|  | @ -11,36 +10,14 @@ export default class SearchResults extends ImmutablePureComponent { | ||||||
| 
 | 
 | ||||||
|   static propTypes = { |   static propTypes = { | ||||||
|     results: ImmutablePropTypes.map.isRequired, |     results: ImmutablePropTypes.map.isRequired, | ||||||
|     trends: ImmutablePropTypes.list, |  | ||||||
|     fetchTrends: PropTypes.func.isRequired, |  | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   componentDidMount () { |  | ||||||
|     const { fetchTrends } = this.props; |  | ||||||
|     fetchTrends(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   render () { |   render () { | ||||||
|     const { results, trends } = this.props; |     const { results } = this.props; | ||||||
| 
 | 
 | ||||||
|     let accounts, statuses, hashtags; |     let accounts, statuses, hashtags; | ||||||
|     let count = 0; |     let count = 0; | ||||||
| 
 | 
 | ||||||
|     if (results.isEmpty()) { |  | ||||||
|       return ( |  | ||||||
|         <div className='search-results'> |  | ||||||
|           <div className='trends'> |  | ||||||
|             <div className='trends__header'> |  | ||||||
|               <i className='fa fa-fire fa-fw' /> |  | ||||||
|               <FormattedMessage id='trends.header' defaultMessage='Trending now' /> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             {trends && trends.map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} |  | ||||||
|           </div> |  | ||||||
|         </div> |  | ||||||
|       ); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (results.get('accounts') && results.get('accounts').size > 0) { |     if (results.get('accounts') && results.get('accounts').size > 0) { | ||||||
|       count   += results.get('accounts').size; |       count   += results.get('accounts').size; | ||||||
|       accounts = ( |       accounts = ( | ||||||
|  |  | ||||||
|  | @ -1,14 +1,8 @@ | ||||||
| import { connect } from 'react-redux'; | import { connect } from 'react-redux'; | ||||||
| import SearchResults from '../components/search_results'; | import SearchResults from '../components/search_results'; | ||||||
| import { fetchTrends } from '../../../actions/trends'; |  | ||||||
| 
 | 
 | ||||||
| const mapStateToProps = state => ({ | const mapStateToProps = state => ({ | ||||||
|   results: state.getIn(['search', 'results']), |   results: state.getIn(['search', 'results']), | ||||||
|   trends: state.getIn(['trends', 'items']), |  | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| const mapDispatchToProps = dispatch => ({ | export default connect(mapStateToProps)(SearchResults); | ||||||
|   fetchTrends: () => dispatch(fetchTrends()), |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); |  | ||||||
|  |  | ||||||
|  | @ -1,71 +0,0 @@ | ||||||
| import classNames from 'classnames'; |  | ||||||
| import React from 'react'; |  | ||||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; |  | ||||||
| import PropTypes from 'prop-types'; |  | ||||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; |  | ||||||
| import { FormattedMessage, defineMessages } from 'react-intl'; |  | ||||||
| import Hashtag from '../../../components/hashtag'; |  | ||||||
| import { Link } from 'react-router-dom'; |  | ||||||
| 
 |  | ||||||
| const messages = defineMessages({ |  | ||||||
|   refresh_trends: { id: 'trends.refresh', defaultMessage: 'Refresh' }, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export default class Trends extends ImmutablePureComponent { |  | ||||||
| 
 |  | ||||||
|   static defaultProps = { |  | ||||||
|     loading: false, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   static propTypes = { |  | ||||||
|     trends: ImmutablePropTypes.list, |  | ||||||
|     loading: PropTypes.bool.isRequired, |  | ||||||
|     showTrends: PropTypes.bool.isRequired, |  | ||||||
|     fetchTrends: PropTypes.func.isRequired, |  | ||||||
|     toggleTrends: PropTypes.func.isRequired, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   componentDidMount () { |  | ||||||
|     setTimeout(() => this.props.fetchTrends(), 5000); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   handleRefreshTrends = () => { |  | ||||||
|     this.props.fetchTrends(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   handleToggle = () => { |  | ||||||
|     this.props.toggleTrends(!this.props.showTrends); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   render () { |  | ||||||
|     const { intl, trends, loading, showTrends } = this.props; |  | ||||||
| 
 |  | ||||||
|     if (!trends || trends.size < 1) { |  | ||||||
|       return null; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return ( |  | ||||||
|       <div className='getting-started__trends'> |  | ||||||
|         <div className='column-header__wrapper'> |  | ||||||
|           <h1 className='column-header'> |  | ||||||
|             <button> |  | ||||||
|               <i className='fa fa-fire fa-fw' /> |  | ||||||
|               <FormattedMessage id='trends.header' defaultMessage='Trending now' /> |  | ||||||
|             </button> |  | ||||||
| 
 |  | ||||||
|             <div className='column-header__buttons'> |  | ||||||
|               {showTrends && <button onClick={this.handleRefreshTrends} className='column-header__button' title={intl.formatMessage(messages.refresh_trends)} aria-label={intl.formatMessage(messages.refresh_trends)} disabled={loading}><i className={classNames('fa', 'fa-refresh', { 'fa-spin': loading })} /></button>} |  | ||||||
|               <button onClick={this.handleToggle} className='column-header__button'><i className={classNames('fa', showTrends ? 'fa-chevron-down' : 'fa-chevron-up')} /></button> |  | ||||||
|             </div> |  | ||||||
|           </h1> |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
|         {showTrends && <div className='getting-started__scrollable'> |  | ||||||
|           {trends.take(3).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} |  | ||||||
|           <Link to='/trends' className='load-more'><FormattedMessage id='status.load_more' defaultMessage='Load more' /></Link> |  | ||||||
|         </div>} |  | ||||||
|       </div> |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -1,18 +0,0 @@ | ||||||
| import { connect } from 'react-redux'; |  | ||||||
| import { injectIntl } from 'react-intl'; |  | ||||||
| import { fetchTrends } from '../../../actions/trends'; |  | ||||||
| import Trends from '../components/trends'; |  | ||||||
| import { changeSetting } from '../../../actions/settings'; |  | ||||||
| 
 |  | ||||||
| const mapStateToProps = state => ({ |  | ||||||
|   trends: state.getIn(['trends', 'items']), |  | ||||||
|   loading: state.getIn(['trends', 'isLoading']), |  | ||||||
|   showTrends: state.getIn(['settings', 'trends', 'show']), |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const mapDispatchToProps = dispatch => ({ |  | ||||||
|   fetchTrends: () => dispatch(fetchTrends()), |  | ||||||
|   toggleTrends: show => dispatch(changeSetting(['trends', 'show'], show)), |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Trends)); |  | ||||||
|  | @ -12,7 +12,6 @@ import { fetchFollowRequests } from '../../actions/accounts'; | ||||||
| import { List as ImmutableList } from 'immutable'; | import { List as ImmutableList } from 'immutable'; | ||||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||||
| import NavigationBar from '../compose/components/navigation_bar'; | import NavigationBar from '../compose/components/navigation_bar'; | ||||||
| import TrendsContainer from './containers/trends_container'; |  | ||||||
| 
 | 
 | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' }, |   home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' }, | ||||||
|  | @ -132,8 +131,6 @@ export default class GettingStarted extends ImmutablePureComponent { | ||||||
|           {navItems} |           {navItems} | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         {multiColumn && <TrendsContainer />} |  | ||||||
| 
 |  | ||||||
|         {!multiColumn && <div className='flex-spacer' />} |         {!multiColumn && <div className='flex-spacer' />} | ||||||
| 
 | 
 | ||||||
|         <div className='getting-started getting-started__footer'> |         <div className='getting-started getting-started__footer'> | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ import { me } from '../../../initial_state'; | ||||||
| 
 | 
 | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   delete: { id: 'status.delete', defaultMessage: 'Delete' }, |   delete: { id: 'status.delete', defaultMessage: 'Delete' }, | ||||||
|  |   redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, | ||||||
|   direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, |   direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, | ||||||
|   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, |   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, | ||||||
|   reply: { id: 'status.reply', defaultMessage: 'Reply' }, |   reply: { id: 'status.reply', defaultMessage: 'Reply' }, | ||||||
|  | @ -67,6 +68,10 @@ export default class ActionBar extends React.PureComponent { | ||||||
|     this.props.onDelete(this.props.status); |     this.props.onDelete(this.props.status); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   handleRedraftClick = () => { | ||||||
|  |     this.props.onDelete(this.props.status, true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   handleDirectClick = () => { |   handleDirectClick = () => { | ||||||
|     this.props.onDirect(this.props.status.get('account'), this.context.router.history); |     this.props.onDirect(this.props.status.get('account'), this.context.router.history); | ||||||
|   } |   } | ||||||
|  | @ -132,6 +137,7 @@ export default class ActionBar extends React.PureComponent { | ||||||
|       menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); |       menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); | ||||||
|       menu.push(null); |       menu.push(null); | ||||||
|       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); |       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); | ||||||
|  |       menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); | ||||||
|     } else { |     } else { | ||||||
|       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); |       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); | ||||||
|       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); |       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); | ||||||
|  |  | ||||||
|  | @ -47,6 +47,8 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from | ||||||
| const messages = defineMessages({ | const messages = defineMessages({ | ||||||
|   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, |   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, | ||||||
|   deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, |   deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, | ||||||
|  |   redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, | ||||||
|  |   redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' }, | ||||||
|   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, |   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, | ||||||
|   revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, |   revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, | ||||||
|   hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, |   hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, | ||||||
|  | @ -77,9 +79,12 @@ const makeMapStateToProps = () => { | ||||||
|           let id        = ids.shift(); |           let id        = ids.shift(); | ||||||
|           const replies = state.getIn(['contexts', 'replies', id]); |           const replies = state.getIn(['contexts', 'replies', id]); | ||||||
| 
 | 
 | ||||||
|  |           if (status.get('id') !== id) { | ||||||
|  |             mutable.push(id); | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|           if (replies) { |           if (replies) { | ||||||
|             replies.forEach(reply => { |             replies.reverse().forEach(reply => { | ||||||
|               mutable.push(reply); |  | ||||||
|               ids.unshift(reply); |               ids.unshift(reply); | ||||||
|             }); |             }); | ||||||
|           } |           } | ||||||
|  | @ -169,16 +174,16 @@ export default class Status extends ImmutablePureComponent { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleDeleteClick = (status) => { |   handleDeleteClick = (status, withRedraft = false) => { | ||||||
|     const { dispatch, intl } = this.props; |     const { dispatch, intl } = this.props; | ||||||
| 
 | 
 | ||||||
|     if (!deleteModal) { |     if (!deleteModal) { | ||||||
|       dispatch(deleteStatus(status.get('id'))); |       dispatch(deleteStatus(status.get('id'), withRedraft)); | ||||||
|     } else { |     } else { | ||||||
|       dispatch(openModal('CONFIRM', { |       dispatch(openModal('CONFIRM', { | ||||||
|         message: intl.formatMessage(messages.deleteMessage), |         message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), | ||||||
|         confirm: intl.formatMessage(messages.deleteConfirm), |         confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), | ||||||
|         onConfirm: () => dispatch(deleteStatus(status.get('id'))), |         onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), | ||||||
|       })); |       })); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -63,6 +63,12 @@ export default class ReportModal extends ImmutablePureComponent { | ||||||
|     this.props.dispatch(submitReport()); |     this.props.dispatch(submitReport()); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   handleKeyDown = e => { | ||||||
|  |     if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) { | ||||||
|  |       this.handleSubmit(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   componentDidMount () { |   componentDidMount () { | ||||||
|     this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true })); |     this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true })); | ||||||
|   } |   } | ||||||
|  | @ -98,6 +104,7 @@ export default class ReportModal extends ImmutablePureComponent { | ||||||
|               placeholder={intl.formatMessage(messages.placeholder)} |               placeholder={intl.formatMessage(messages.placeholder)} | ||||||
|               value={comment} |               value={comment} | ||||||
|               onChange={this.handleCommentChange} |               onChange={this.handleCommentChange} | ||||||
|  |               onKeyDown={this.handleKeyDown} | ||||||
|               disabled={isSubmitting} |               disabled={isSubmitting} | ||||||
|             /> |             /> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -42,7 +42,6 @@ import { | ||||||
|   Mutes, |   Mutes, | ||||||
|   PinnedStatuses, |   PinnedStatuses, | ||||||
|   Lists, |   Lists, | ||||||
|   Trends, |  | ||||||
| } from './util/async-components'; | } from './util/async-components'; | ||||||
| import { HotKeys } from 'react-hotkeys'; | import { HotKeys } from 'react-hotkeys'; | ||||||
| import { me } from '../../initial_state'; | import { me } from '../../initial_state'; | ||||||
|  | @ -155,7 +154,6 @@ class SwitchingColumnsArea extends React.PureComponent { | ||||||
|           <WrappedRoute path='/pinned' component={PinnedStatuses} content={children} /> |           <WrappedRoute path='/pinned' component={PinnedStatuses} content={children} /> | ||||||
| 
 | 
 | ||||||
|           <WrappedRoute path='/search' component={Compose} content={children} componentParams={{ isSearchPage: true }} /> |           <WrappedRoute path='/search' component={Compose} content={children} componentParams={{ isSearchPage: true }} /> | ||||||
|           <WrappedRoute path='/trends' component={Trends} content={children} /> |  | ||||||
| 
 | 
 | ||||||
|           <WrappedRoute path='/statuses/new' component={Compose} content={children} /> |           <WrappedRoute path='/statuses/new' component={Compose} content={children} /> | ||||||
|           <WrappedRoute path='/statuses/:statusId' exact component={Status} content={children} /> |           <WrappedRoute path='/statuses/:statusId' exact component={Status} content={children} /> | ||||||
|  |  | ||||||
|  | @ -129,7 +129,3 @@ export function EmbedModal () { | ||||||
| export function ListEditor () { | export function ListEditor () { | ||||||
|   return import(/* webpackChunkName: "features/list_editor" */'../../list_editor'); |   return import(/* webpackChunkName: "features/list_editor" */'../../list_editor'); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| export function Trends () { |  | ||||||
|   return import(/* webpackChunkName: "features/trends" */'../../trends'); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "متأكد من أنك تود حظر إسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.", |   "confirmations.domain_block.message": "متأكد من أنك تود حظر إسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.", | ||||||
|   "confirmations.mute.confirm": "أكتم", |   "confirmations.mute.confirm": "أكتم", | ||||||
|   "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", |   "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "إلغاء المتابعة", |   "confirmations.unfollow.confirm": "إلغاء المتابعة", | ||||||
|   "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", |   "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", | ||||||
|   "embed.instructions": "يمكنكم إدماج هذه الحالة على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", |   "embed.instructions": "يمكنكم إدماج هذه الحالة على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "رَقِّي", |   "status.reblog": "رَقِّي", | ||||||
|   "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", |   "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", | ||||||
|   "status.reblogged_by": "{name} رقى", |   "status.reblogged_by": "{name} رقى", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "ردّ", |   "status.reply": "ردّ", | ||||||
|   "status.replyAll": "رُد على الخيط", |   "status.replyAll": "رُد على الخيط", | ||||||
|   "status.report": "إبلِغ عن @{name}", |   "status.report": "إبلِغ عن @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.", |   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.", | ||||||
|   "upload_area.title": "إسحب ثم أفلت للرفع", |   "upload_area.title": "إسحب ثم أفلت للرفع", | ||||||
|   "upload_button.label": "إضافة وسائط", |   "upload_button.label": "إضافة وسائط", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Mute", |   "confirmations.mute.confirm": "Mute", | ||||||
|   "confirmations.mute.message": "Are you sure you want to mute {name}?", |   "confirmations.mute.message": "Are you sure you want to mute {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Споделяне", |   "status.reblog": "Споделяне", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} сподели", |   "status.reblogged_by": "{name} сподели", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Отговор", |   "status.reply": "Отговор", | ||||||
|   "status.replyAll": "Reply to thread", |   "status.replyAll": "Reply to thread", | ||||||
|   "status.report": "Report @{name}", |   "status.report": "Report @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop to upload", |   "upload_area.title": "Drag & drop to upload", | ||||||
|   "upload_button.label": "Добави медия", |   "upload_button.label": "Добави медия", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Estàs realment, realment segur que vols blocar totalment {domain}? En la majoria dels casos blocar o silenciar uns pocs objectius és suficient i preferible.", |   "confirmations.domain_block.message": "Estàs realment, realment segur que vols blocar totalment {domain}? En la majoria dels casos blocar o silenciar uns pocs objectius és suficient i preferible.", | ||||||
|   "confirmations.mute.confirm": "Silencia", |   "confirmations.mute.confirm": "Silencia", | ||||||
|   "confirmations.mute.message": "Estàs segur que vols silenciar {name}?", |   "confirmations.mute.message": "Estàs segur que vols silenciar {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Deixa de seguir", |   "confirmations.unfollow.confirm": "Deixa de seguir", | ||||||
|   "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", |   "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", | ||||||
|   "embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.", |   "embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Impuls", |   "status.reblog": "Impuls", | ||||||
|   "status.reblog_private": "Impulsar a l'audiència original", |   "status.reblog_private": "Impulsar a l'audiència original", | ||||||
|   "status.reblogged_by": "{name} ha retootejat", |   "status.reblogged_by": "{name} ha retootejat", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Respondre", |   "status.reply": "Respondre", | ||||||
|   "status.replyAll": "Respondre al tema", |   "status.replyAll": "Respondre al tema", | ||||||
|   "status.report": "Informar sobre @{name}", |   "status.report": "Informar sobre @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "El vostre esborrany es perdrà si sortiu de Mastodon.", |   "ui.beforeunload": "El vostre esborrany es perdrà si sortiu de Mastodon.", | ||||||
|   "upload_area.title": "Arrossega i deixa anar per carregar", |   "upload_area.title": "Arrossega i deixa anar per carregar", | ||||||
|   "upload_button.label": "Afegir multimèdia", |   "upload_button.label": "Afegir multimèdia", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Site sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà.", |   "confirmations.domain_block.message": "Site sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà.", | ||||||
|   "confirmations.mute.confirm": "Piattà", |   "confirmations.mute.confirm": "Piattà", | ||||||
|   "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", |   "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Disabbunassi", |   "confirmations.unfollow.confirm": "Disabbunassi", | ||||||
|   "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", |   "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", | ||||||
|   "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", |   "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Sparte", |   "status.reblog": "Sparte", | ||||||
|   "status.reblog_private": "Sparte à l'audienza uriginale", |   "status.reblog_private": "Sparte à l'audienza uriginale", | ||||||
|   "status.reblogged_by": "{name} hà spartutu", |   "status.reblogged_by": "{name} hà spartutu", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Risponde", |   "status.reply": "Risponde", | ||||||
|   "status.replyAll": "Risponde à tutti", |   "status.replyAll": "Risponde à tutti", | ||||||
|   "status.report": "Palisà @{name}", |   "status.report": "Palisà @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", |   "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop per caricà un fugliale", |   "upload_area.title": "Drag & drop per caricà un fugliale", | ||||||
|   "upload_button.label": "Aghjunghje un media", |   "upload_button.label": "Aghjunghje un media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Bist du dir wirklich sicher, dass du die ganze Domain {domain} verbergen willst? In den meisten Fällen reichen ein paar gezielte Blocks aus.", |   "confirmations.domain_block.message": "Bist du dir wirklich sicher, dass du die ganze Domain {domain} verbergen willst? In den meisten Fällen reichen ein paar gezielte Blocks aus.", | ||||||
|   "confirmations.mute.confirm": "Stummschalten", |   "confirmations.mute.confirm": "Stummschalten", | ||||||
|   "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", |   "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Entfolgen", |   "confirmations.unfollow.confirm": "Entfolgen", | ||||||
|   "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", |   "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", | ||||||
|   "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", |   "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Teilen", |   "status.reblog": "Teilen", | ||||||
|   "status.reblog_private": "An das eigentliche Publikum teilen", |   "status.reblog_private": "An das eigentliche Publikum teilen", | ||||||
|   "status.reblogged_by": "{name} teilte", |   "status.reblogged_by": "{name} teilte", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Antworten", |   "status.reply": "Antworten", | ||||||
|   "status.replyAll": "Auf Thread antworten", |   "status.replyAll": "Auf Thread antworten", | ||||||
|   "status.report": "@{name} melden", |   "status.report": "@{name} melden", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", |   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", | ||||||
|   "upload_area.title": "Zum Hochladen hereinziehen", |   "upload_area.title": "Zum Hochladen hereinziehen", | ||||||
|   "upload_button.label": "Mediendatei hinzufügen", |   "upload_button.label": "Mediendatei hinzufügen", | ||||||
|  |  | ||||||
|  | @ -219,6 +219,10 @@ | ||||||
|         "defaultMessage": "Delete", |         "defaultMessage": "Delete", | ||||||
|         "id": "status.delete" |         "id": "status.delete" | ||||||
|       }, |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Delete & re-draft", | ||||||
|  |         "id": "status.redraft" | ||||||
|  |       }, | ||||||
|       { |       { | ||||||
|         "defaultMessage": "Direct message @{name}", |         "defaultMessage": "Direct message @{name}", | ||||||
|         "id": "status.direct" |         "id": "status.direct" | ||||||
|  | @ -377,6 +381,14 @@ | ||||||
|         "defaultMessage": "Are you sure you want to delete this status?", |         "defaultMessage": "Are you sure you want to delete this status?", | ||||||
|         "id": "confirmations.delete.message" |         "id": "confirmations.delete.message" | ||||||
|       }, |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Delete & redraft", | ||||||
|  |         "id": "confirmations.redraft.confirm" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|  |         "id": "confirmations.redraft.message" | ||||||
|  |       }, | ||||||
|       { |       { | ||||||
|         "defaultMessage": "Block", |         "defaultMessage": "Block", | ||||||
|         "id": "confirmations.block.confirm" |         "id": "confirmations.block.confirm" | ||||||
|  | @ -804,10 +816,6 @@ | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     "descriptors": [ |     "descriptors": [ | ||||||
|       { |  | ||||||
|         "defaultMessage": "Trending now", |  | ||||||
|         "id": "trends.header" |  | ||||||
|       }, |  | ||||||
|       { |       { | ||||||
|         "defaultMessage": "People", |         "defaultMessage": "People", | ||||||
|         "id": "search_results.accounts" |         "id": "search_results.accounts" | ||||||
|  | @ -1036,23 +1044,6 @@ | ||||||
|     ], |     ], | ||||||
|     "path": "app/javascript/mastodon/features/follow_requests/index.json" |     "path": "app/javascript/mastodon/features/follow_requests/index.json" | ||||||
|   }, |   }, | ||||||
|   { |  | ||||||
|     "descriptors": [ |  | ||||||
|       { |  | ||||||
|         "defaultMessage": "Refresh", |  | ||||||
|         "id": "trends.refresh" |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "defaultMessage": "Trending now", |  | ||||||
|         "id": "trends.header" |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "defaultMessage": "Load more", |  | ||||||
|         "id": "status.load_more" |  | ||||||
|       } |  | ||||||
|     ], |  | ||||||
|     "path": "app/javascript/mastodon/features/getting_started/components/trends.json" |  | ||||||
|   }, |  | ||||||
|   { |   { | ||||||
|     "descriptors": [ |     "descriptors": [ | ||||||
|       { |       { | ||||||
|  | @ -1507,6 +1498,10 @@ | ||||||
|         "defaultMessage": "Delete", |         "defaultMessage": "Delete", | ||||||
|         "id": "status.delete" |         "id": "status.delete" | ||||||
|       }, |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Delete & re-draft", | ||||||
|  |         "id": "status.redraft" | ||||||
|  |       }, | ||||||
|       { |       { | ||||||
|         "defaultMessage": "Direct message @{name}", |         "defaultMessage": "Direct message @{name}", | ||||||
|         "id": "status.direct" |         "id": "status.direct" | ||||||
|  | @ -1588,6 +1583,14 @@ | ||||||
|         "defaultMessage": "Are you sure you want to delete this status?", |         "defaultMessage": "Are you sure you want to delete this status?", | ||||||
|         "id": "confirmations.delete.message" |         "id": "confirmations.delete.message" | ||||||
|       }, |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Delete & redraft", | ||||||
|  |         "id": "confirmations.redraft.confirm" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "defaultMessage": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|  |         "id": "confirmations.redraft.message" | ||||||
|  |       }, | ||||||
|       { |       { | ||||||
|         "defaultMessage": "Block", |         "defaultMessage": "Block", | ||||||
|         "id": "confirmations.block.confirm" |         "id": "confirmations.block.confirm" | ||||||
|  | @ -1607,19 +1610,6 @@ | ||||||
|     ], |     ], | ||||||
|     "path": "app/javascript/mastodon/features/status/index.json" |     "path": "app/javascript/mastodon/features/status/index.json" | ||||||
|   }, |   }, | ||||||
|   { |  | ||||||
|     "descriptors": [ |  | ||||||
|       { |  | ||||||
|         "defaultMessage": "Trending now", |  | ||||||
|         "id": "trends.header" |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "defaultMessage": "Refresh trends", |  | ||||||
|         "id": "trends.refresh" |  | ||||||
|       } |  | ||||||
|     ], |  | ||||||
|     "path": "app/javascript/mastodon/features/trends/index.json" |  | ||||||
|   }, |  | ||||||
|   { |   { | ||||||
|     "descriptors": [ |     "descriptors": [ | ||||||
|       { |       { | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Σίγουρα θες να μπλοκάρεις ολόκληρο το {domain}; Συνήθως μερικά εστιασμένα μπλοκ ή αποσιωπήσεις επαρκούν και προτιμούνται.", |   "confirmations.domain_block.message": "Σίγουρα θες να μπλοκάρεις ολόκληρο το {domain}; Συνήθως μερικά εστιασμένα μπλοκ ή αποσιωπήσεις επαρκούν και προτιμούνται.", | ||||||
|   "confirmations.mute.confirm": "Αποσιώπηση", |   "confirmations.mute.confirm": "Αποσιώπηση", | ||||||
|   "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις τον/την {name};", |   "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις τον/την {name};", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", |   "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", | ||||||
|   "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", |   "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", | ||||||
|   "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", |   "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} boosted", |   "status.reblogged_by": "{name} boosted", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Reply", |   "status.reply": "Reply", | ||||||
|   "status.replyAll": "Reply to thread", |   "status.replyAll": "Reply to thread", | ||||||
|   "status.report": "Καταγγελία @{name}", |   "status.report": "Καταγγελία @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop to upload", |   "upload_area.title": "Drag & drop to upload", | ||||||
|   "upload_button.label": "Add media", |   "upload_button.label": "Add media", | ||||||
|  |  | ||||||
|  | @ -87,6 +87,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Mute", |   "confirmations.mute.confirm": "Mute", | ||||||
|   "confirmations.mute.message": "Are you sure you want to mute {name}?", |   "confirmations.mute.message": "Are you sure you want to mute {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -269,6 +271,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} boosted", |   "status.reblogged_by": "{name} boosted", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Reply", |   "status.reply": "Reply", | ||||||
|   "status.replyAll": "Reply to thread", |   "status.replyAll": "Reply to thread", | ||||||
|   "status.report": "Report @{name}", |   "status.report": "Report @{name}", | ||||||
|  | @ -289,8 +292,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop to upload", |   "upload_area.title": "Drag & drop to upload", | ||||||
|   "upload_button.label": "Add media", |   "upload_button.label": "Add media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas.", |   "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas.", | ||||||
|   "confirmations.mute.confirm": "Silentigi", |   "confirmations.mute.confirm": "Silentigi", | ||||||
|   "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", |   "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Ne plu sekvi", |   "confirmations.unfollow.confirm": "Ne plu sekvi", | ||||||
|   "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", |   "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", | ||||||
|   "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", |   "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Diskonigi", |   "status.reblog": "Diskonigi", | ||||||
|   "status.reblog_private": "Diskonigi al la originala atentaro", |   "status.reblog_private": "Diskonigi al la originala atentaro", | ||||||
|   "status.reblogged_by": "{name} diskonigis", |   "status.reblogged_by": "{name} diskonigis", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Respondi", |   "status.reply": "Respondi", | ||||||
|   "status.replyAll": "Respondi al la fadeno", |   "status.replyAll": "Respondi al la fadeno", | ||||||
|   "status.report": "Signali @{name}", |   "status.report": "Signali @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Aŭdovidaĵoj", |   "timeline.media": "Aŭdovidaĵoj", | ||||||
|   "timeline.posts": "Mesaĝoj", |   "timeline.posts": "Mesaĝoj", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, pluraj, unu {person} alia(j) {people}} parolas", |   "trends.count_by_accounts": "{count} {rawCount, pluraj, unu {person} alia(j) {people}} parolas", | ||||||
|   "trends.header": "Nun furoras", |  | ||||||
|   "trends.refresh": "Aktualigi", |  | ||||||
|   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.", |   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.", | ||||||
|   "upload_area.title": "Altreni kaj lasi por alŝuti", |   "upload_area.title": "Altreni kaj lasi por alŝuti", | ||||||
|   "upload_button.label": "Aldoni aŭdovidaĵon", |   "upload_button.label": "Aldoni aŭdovidaĵon", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio entero? En algunos casos es preferible bloquear o silenciar objetivos determinados.", |   "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio entero? En algunos casos es preferible bloquear o silenciar objetivos determinados.", | ||||||
|   "confirmations.mute.confirm": "Silenciar", |   "confirmations.mute.confirm": "Silenciar", | ||||||
|   "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", |   "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Dejar de seguir", |   "confirmations.unfollow.confirm": "Dejar de seguir", | ||||||
|   "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", |   "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", | ||||||
|   "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", |   "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Retootear", |   "status.reblog": "Retootear", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "Retooteado por {name}", |   "status.reblogged_by": "Retooteado por {name}", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Responder", |   "status.reply": "Responder", | ||||||
|   "status.replyAll": "Responder al hilo", |   "status.replyAll": "Responder al hilo", | ||||||
|   "status.report": "Reportar", |   "status.report": "Reportar", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", |   "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", | ||||||
|   "upload_area.title": "Arrastra y suelta para subir", |   "upload_area.title": "Arrastra y suelta para subir", | ||||||
|   "upload_button.label": "Subir multimedia", |   "upload_button.label": "Subir multimedia", | ||||||
|  |  | ||||||
|  | @ -13,14 +13,14 @@ | ||||||
|   "account.follows_you": "Jarraitzen dizu", |   "account.follows_you": "Jarraitzen dizu", | ||||||
|   "account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak", |   "account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak", | ||||||
|   "account.media": "Media", |   "account.media": "Media", | ||||||
|   "account.mention": "@{name} aipatu", |   "account.mention": "Aipatu @{name}", | ||||||
|   "account.moved_to": "{name} hona lekualdatu da:", |   "account.moved_to": "{name} hona lekualdatu da:", | ||||||
|   "account.mute": "Mututu @{name}", |   "account.mute": "Mututu @{name}", | ||||||
|   "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", |   "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", | ||||||
|   "account.muted": "Mutututa", |   "account.muted": "Mutututa", | ||||||
|   "account.posts": "Toot-ak", |   "account.posts": "Toot-ak", | ||||||
|   "account.posts_with_replies": "Toot eta erantzunak", |   "account.posts_with_replies": "Toot eta erantzunak", | ||||||
|   "account.report": "@{name} salatu", |   "account.report": "Salatu @{name}", | ||||||
|   "account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko", |   "account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko", | ||||||
|   "account.share": "@{name}(e)ren profila elkarbanatu", |   "account.share": "@{name}(e)ren profila elkarbanatu", | ||||||
|   "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak", |   "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak", | ||||||
|  | @ -67,8 +67,8 @@ | ||||||
|   "compose_form.placeholder": "Zer duzu buruan?", |   "compose_form.placeholder": "Zer duzu buruan?", | ||||||
|   "compose_form.publish": "Toot", |   "compose_form.publish": "Toot", | ||||||
|   "compose_form.publish_loud": "{publish}!", |   "compose_form.publish_loud": "{publish}!", | ||||||
|   "compose_form.sensitive.marked": "Multimedia mingarri gisa markatu da", |   "compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da", | ||||||
|   "compose_form.sensitive.unmarked": "Multimedia ez da mingarri gisa markatu", |   "compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu", | ||||||
|   "compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du", |   "compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du", | ||||||
|   "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta", |   "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta", | ||||||
|   "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen", |   "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen", | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da.", |   "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da.", | ||||||
|   "confirmations.mute.confirm": "Mututu", |   "confirmations.mute.confirm": "Mututu", | ||||||
|   "confirmations.mute.message": "Ziur {name} mututu nahi duzula?", |   "confirmations.mute.message": "Ziur {name} mututu nahi duzula?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Utzi jarraitzeari", |   "confirmations.unfollow.confirm": "Utzi jarraitzeari", | ||||||
|   "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", |   "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", | ||||||
|   "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", |   "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", | ||||||
|  | @ -264,11 +266,12 @@ | ||||||
|   "status.reblog": "Bultzada", |   "status.reblog": "Bultzada", | ||||||
|   "status.reblog_private": "Bultzada jatorrizko hartzaileei", |   "status.reblog_private": "Bultzada jatorrizko hartzaileei", | ||||||
|   "status.reblogged_by": "{name}(r)en bultzada", |   "status.reblogged_by": "{name}(r)en bultzada", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Erantzun", |   "status.reply": "Erantzun", | ||||||
|   "status.replyAll": "Erantzun harian", |   "status.replyAll": "Erantzun harian", | ||||||
|   "status.report": "Salatu @{name}", |   "status.report": "Salatu @{name}", | ||||||
|   "status.sensitive_toggle": "Egin klik ikusteko", |   "status.sensitive_toggle": "Egin klik ikusteko", | ||||||
|   "status.sensitive_warning": "Eduki mingarria", |   "status.sensitive_warning": "Eduki hunkigarria", | ||||||
|   "status.share": "Partekatu", |   "status.share": "Partekatu", | ||||||
|   "status.show_less": "Erakutsi gutxiago", |   "status.show_less": "Erakutsi gutxiago", | ||||||
|   "status.show_less_all": "Erakutsi denetarik gutxiago", |   "status.show_less_all": "Erakutsi denetarik gutxiago", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toot-ak", |   "timeline.posts": "Toot-ak", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} hitz egiten", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} hitz egiten", | ||||||
|   "trends.header": "Joera orain", |  | ||||||
|   "trends.refresh": "Freskatu", |  | ||||||
|   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", |   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", | ||||||
|   "upload_area.title": "Arrastatu eta jaregin igotzeko", |   "upload_area.title": "Arrastatu eta jaregin igotzeko", | ||||||
|   "upload_button.label": "Gehitu multimedia", |   "upload_button.label": "Gehitu multimedia", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "آیا جدی جدی میخواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقتها مسدودکردن یا بیصداکردن چند حساب کاربری خاص کافی است و توصیه میشود.", |   "confirmations.domain_block.message": "آیا جدی جدی میخواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقتها مسدودکردن یا بیصداکردن چند حساب کاربری خاص کافی است و توصیه میشود.", | ||||||
|   "confirmations.mute.confirm": "بیصدا کن", |   "confirmations.mute.confirm": "بیصدا کن", | ||||||
|   "confirmations.mute.message": "آیا واقعاً میخواهید {name} را بیصدا کنید؟", |   "confirmations.mute.message": "آیا واقعاً میخواهید {name} را بیصدا کنید؟", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "لغو پیگیری", |   "confirmations.unfollow.confirm": "لغو پیگیری", | ||||||
|   "confirmations.unfollow.message": "آیا واقعاً میخواهید به پیگیری از {name} پایان دهید؟", |   "confirmations.unfollow.message": "آیا واقعاً میخواهید به پیگیری از {name} پایان دهید؟", | ||||||
|   "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", |   "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "بازبوقیدن", |   "status.reblog": "بازبوقیدن", | ||||||
|   "status.reblog_private": "بازبوق به مخاطبان اولیه", |   "status.reblog_private": "بازبوق به مخاطبان اولیه", | ||||||
|   "status.reblogged_by": "{name} بازبوقید", |   "status.reblogged_by": "{name} بازبوقید", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "پاسخ", |   "status.reply": "پاسخ", | ||||||
|   "status.replyAll": "به نوشته پاسخ دهید", |   "status.replyAll": "به نوشته پاسخ دهید", | ||||||
|   "status.report": "گزارش دادن @{name}", |   "status.report": "گزارش دادن @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "عکس و ویدیو", |   "timeline.media": "عکس و ویدیو", | ||||||
|   "timeline.posts": "بوقها", |   "timeline.posts": "بوقها", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشتهاند}}", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشتهاند}}", | ||||||
|   "trends.header": "موضوعات داغ", |  | ||||||
|   "trends.refresh": "بهروزرسانی", |  | ||||||
|   "ui.beforeunload": "اگر از ماستدون خارج شوید پیشنویس شما پاک خواهد شد.", |   "ui.beforeunload": "اگر از ماستدون خارج شوید پیشنویس شما پاک خواهد شد.", | ||||||
|   "upload_area.title": "برای بارگذاری به اینجا بکشید", |   "upload_area.title": "برای بارگذاری به اینجا بکشید", | ||||||
|   "upload_button.label": "افزودن تصویر", |   "upload_button.label": "افزودن تصویر", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkko-osoitteen {domain}? Useimmiten jokunen kohdistettu esto ja mykistys riittää, ja se on suositeltavampi tapa toimia.", |   "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkko-osoitteen {domain}? Useimmiten jokunen kohdistettu esto ja mykistys riittää, ja se on suositeltavampi tapa toimia.", | ||||||
|   "confirmations.mute.confirm": "Mykistä", |   "confirmations.mute.confirm": "Mykistä", | ||||||
|   "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", |   "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Lakkaa seuraamasta", |   "confirmations.unfollow.confirm": "Lakkaa seuraamasta", | ||||||
|   "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", |   "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", | ||||||
|   "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", |   "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Buustaa", |   "status.reblog": "Buustaa", | ||||||
|   "status.reblog_private": "Buustaa alkuperäiselle yleisölle", |   "status.reblog_private": "Buustaa alkuperäiselle yleisölle", | ||||||
|   "status.reblogged_by": "{name} buustasi", |   "status.reblogged_by": "{name} buustasi", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Vastaa", |   "status.reply": "Vastaa", | ||||||
|   "status.replyAll": "Vastaa ketjuun", |   "status.replyAll": "Vastaa ketjuun", | ||||||
|   "status.report": "Raportoi @{name}", |   "status.report": "Raportoi @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", |   "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", | ||||||
|   "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", |   "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", | ||||||
|   "upload_button.label": "Lisää mediaa", |   "upload_button.label": "Lisää mediaa", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûr⋅e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables.", |   "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûr⋅e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables.", | ||||||
|   "confirmations.mute.confirm": "Masquer", |   "confirmations.mute.confirm": "Masquer", | ||||||
|   "confirmations.mute.message": "Confirmez-vous le masquage de {name} ?", |   "confirmations.mute.message": "Confirmez-vous le masquage de {name} ?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Ne plus suivre", |   "confirmations.unfollow.confirm": "Ne plus suivre", | ||||||
|   "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", |   "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", | ||||||
|   "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", |   "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Partager", |   "status.reblog": "Partager", | ||||||
|   "status.reblog_private": "Booster vers l'audience originale", |   "status.reblog_private": "Booster vers l'audience originale", | ||||||
|   "status.reblogged_by": "{name} a partagé :", |   "status.reblogged_by": "{name} a partagé :", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Répondre", |   "status.reply": "Répondre", | ||||||
|   "status.replyAll": "Répondre au fil", |   "status.replyAll": "Répondre au fil", | ||||||
|   "status.report": "Signaler @{name}", |   "status.report": "Signaler @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Pouets", |   "timeline.posts": "Pouets", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", |   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", | ||||||
|   "upload_area.title": "Glissez et déposez pour envoyer", |   "upload_area.title": "Glissez et déposez pour envoyer", | ||||||
|   "upload_button.label": "Joindre un média", |   "upload_button.label": "Joindre un média", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos.", |   "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos.", | ||||||
|   "confirmations.mute.confirm": "Acalar", |   "confirmations.mute.confirm": "Acalar", | ||||||
|   "confirmations.mute.message": "Está segura de que quere acalar a {name}?", |   "confirmations.mute.message": "Está segura de que quere acalar a {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Deixar de seguir", |   "confirmations.unfollow.confirm": "Deixar de seguir", | ||||||
|   "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", |   "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", | ||||||
|   "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", |   "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Promover", |   "status.reblog": "Promover", | ||||||
|   "status.reblog_private": "Promover a audiencia orixinal", |   "status.reblog_private": "Promover a audiencia orixinal", | ||||||
|   "status.reblogged_by": "{name} promoveu", |   "status.reblogged_by": "{name} promoveu", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Resposta", |   "status.reply": "Resposta", | ||||||
|   "status.replyAll": "Resposta a conversa", |   "status.replyAll": "Resposta a conversa", | ||||||
|   "status.report": "Informar @{name}", |   "status.report": "Informar @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "O borrador perderase se sae de Mastodon.", |   "ui.beforeunload": "O borrador perderase se sae de Mastodon.", | ||||||
|   "upload_area.title": "Arrastre e solte para subir", |   "upload_area.title": "Arrastre e solte para subir", | ||||||
|   "upload_button.label": "Engadir medios", |   "upload_button.label": "Engadir medios", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.", |   "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.", | ||||||
|   "confirmations.mute.confirm": "להשתיק", |   "confirmations.mute.confirm": "להשתיק", | ||||||
|   "confirmations.mute.message": "להשתיק את {name}?", |   "confirmations.mute.message": "להשתיק את {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "להפסיק מעקב", |   "confirmations.unfollow.confirm": "להפסיק מעקב", | ||||||
|   "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", |   "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", | ||||||
|   "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", |   "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "הדהוד", |   "status.reblog": "הדהוד", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "הודהד על ידי {name}", |   "status.reblogged_by": "הודהד על ידי {name}", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "תגובה", |   "status.reply": "תגובה", | ||||||
|   "status.replyAll": "תגובה לכולם", |   "status.replyAll": "תגובה לכולם", | ||||||
|   "status.report": "דיווח על @{name}", |   "status.report": "דיווח על @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", |   "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", | ||||||
|   "upload_area.title": "ניתן להעלות על ידי Drag & drop", |   "upload_area.title": "ניתן להעלות על ידי Drag & drop", | ||||||
|   "upload_button.label": "הוספת מדיה", |   "upload_button.label": "הוספת מדיה", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Jesi li zaista, zaista siguran da želiš potpuno blokirati {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Jesi li zaista, zaista siguran da želiš potpuno blokirati {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Utišaj", |   "confirmations.mute.confirm": "Utišaj", | ||||||
|   "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?", |   "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Podigni", |   "status.reblog": "Podigni", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} je podigao", |   "status.reblogged_by": "{name} je podigao", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Odgovori", |   "status.reply": "Odgovori", | ||||||
|   "status.replyAll": "Odgovori na temu", |   "status.replyAll": "Odgovori na temu", | ||||||
|   "status.report": "Prijavi @{name}", |   "status.report": "Prijavi @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Povuci i spusti kako bi uploadao", |   "upload_area.title": "Povuci i spusti kako bi uploadao", | ||||||
|   "upload_button.label": "Dodaj media", |   "upload_button.label": "Dodaj media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Nagyon biztos abban, hogy le szeretné tiltani az egész {domain}-t? A legtöbb esetben néhány célszerű tiltás vagy némítás elegendő és kívánatosabb megoldás.", |   "confirmations.domain_block.message": "Nagyon biztos abban, hogy le szeretné tiltani az egész {domain}-t? A legtöbb esetben néhány célszerű tiltás vagy némítás elegendő és kívánatosabb megoldás.", | ||||||
|   "confirmations.mute.confirm": "Némít", |   "confirmations.mute.confirm": "Némít", | ||||||
|   "confirmations.mute.message": "Biztos benne, hogy némítani szeretné {name}?", |   "confirmations.mute.message": "Biztos benne, hogy némítani szeretné {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Követés visszavonása", |   "confirmations.unfollow.confirm": "Követés visszavonása", | ||||||
|   "confirmations.unfollow.message": "Biztos benne, hogy vissza szeretné vonni {name} követését?", |   "confirmations.unfollow.message": "Biztos benne, hogy vissza szeretné vonni {name} követését?", | ||||||
|   "embed.instructions": "Ágyazza be ezen státuszt weboldalába az alábbi kód másolásával.", |   "embed.instructions": "Ágyazza be ezen státuszt weboldalába az alábbi kód másolásával.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Reblog", |   "status.reblog": "Reblog", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} reblogolta", |   "status.reblogged_by": "{name} reblogolta", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Válasz", |   "status.reply": "Válasz", | ||||||
|   "status.replyAll": "Válaszolj a beszélgetésre", |   "status.replyAll": "Válaszolj a beszélgetésre", | ||||||
|   "status.report": "Report @{name}", |   "status.report": "Report @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "A piszkozata el fog vesztődni ha elhagyja Mastodon-t.", |   "ui.beforeunload": "A piszkozata el fog vesztődni ha elhagyja Mastodon-t.", | ||||||
|   "upload_area.title": "Húzza ide a feltöltéshez", |   "upload_area.title": "Húzza ide a feltöltéshez", | ||||||
|   "upload_button.label": "Média hozzáadása", |   "upload_button.label": "Média hozzáadása", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։", |   "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։", | ||||||
|   "confirmations.mute.confirm": "Լռեցնել", |   "confirmations.mute.confirm": "Լռեցնել", | ||||||
|   "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", |   "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Ապահետեւել", |   "confirmations.unfollow.confirm": "Ապահետեւել", | ||||||
|   "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", |   "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", | ||||||
|   "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", |   "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Տարածել", |   "status.reblog": "Տարածել", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} տարածել է", |   "status.reblogged_by": "{name} տարածել է", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Պատասխանել", |   "status.reply": "Պատասխանել", | ||||||
|   "status.replyAll": "Պատասխանել թելին", |   "status.replyAll": "Պատասխանել թելին", | ||||||
|   "status.report": "Բողոքել @{name}֊ից", |   "status.report": "Բողոքել @{name}֊ից", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։", |   "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։", | ||||||
|   "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար", |   "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար", | ||||||
|   "upload_button.label": "Ավելացնել մեդիա", |   "upload_button.label": "Ավելացնել մեդիա", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Apakah anda benar benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", |   "confirmations.domain_block.message": "Apakah anda benar benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", | ||||||
|   "confirmations.mute.confirm": "Bisukan", |   "confirmations.mute.confirm": "Bisukan", | ||||||
|   "confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?", |   "confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Berhenti mengikuti", |   "confirmations.unfollow.confirm": "Berhenti mengikuti", | ||||||
|   "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", |   "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", | ||||||
|   "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", |   "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "di-boost {name}", |   "status.reblogged_by": "di-boost {name}", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Balas", |   "status.reply": "Balas", | ||||||
|   "status.replyAll": "Balas ke semua", |   "status.replyAll": "Balas ke semua", | ||||||
|   "status.report": "Laporkan @{name}", |   "status.report": "Laporkan @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.", |   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.", | ||||||
|   "upload_area.title": "Seret & lepaskan untuk mengunggah", |   "upload_area.title": "Seret & lepaskan untuk mengunggah", | ||||||
|   "upload_button.label": "Tambahkan media", |   "upload_button.label": "Tambahkan media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Mute", |   "confirmations.mute.confirm": "Mute", | ||||||
|   "confirmations.mute.message": "Are you sure you want to mute {name}?", |   "confirmations.mute.message": "Are you sure you want to mute {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Repetar", |   "status.reblog": "Repetar", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} repetita", |   "status.reblogged_by": "{name} repetita", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Respondar", |   "status.reply": "Respondar", | ||||||
|   "status.replyAll": "Respondar a filo", |   "status.replyAll": "Respondar a filo", | ||||||
|   "status.report": "Denuncar @{name}", |   "status.report": "Denuncar @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Tranar faligar por kargar", |   "upload_area.title": "Tranar faligar por kargar", | ||||||
|   "upload_button.label": "Adjuntar kontenajo", |   "upload_button.label": "Adjuntar kontenajo", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili.", |   "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili.", | ||||||
|   "confirmations.mute.confirm": "Silenzia", |   "confirmations.mute.confirm": "Silenzia", | ||||||
|   "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", |   "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Smetti di seguire", |   "confirmations.unfollow.confirm": "Smetti di seguire", | ||||||
|   "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", |   "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", | ||||||
|   "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", |   "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Condividi", |   "status.reblog": "Condividi", | ||||||
|   "status.reblog_private": "Condividi con i destinatari iniziali", |   "status.reblog_private": "Condividi con i destinatari iniziali", | ||||||
|   "status.reblogged_by": "{name} ha condiviso", |   "status.reblogged_by": "{name} ha condiviso", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Rispondi", |   "status.reply": "Rispondi", | ||||||
|   "status.replyAll": "Rispondi alla conversazione", |   "status.replyAll": "Rispondi alla conversazione", | ||||||
|   "status.report": "Segnala @{name}", |   "status.report": "Segnala @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.", |   "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.", | ||||||
|   "upload_area.title": "Trascina per caricare", |   "upload_area.title": "Trascina per caricare", | ||||||
|   "upload_button.label": "Aggiungi file multimediale", |   "upload_button.label": "Aggiungi file multimediale", | ||||||
|  |  | ||||||
|  | @ -87,6 +87,8 @@ | ||||||
|   "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。", |   "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。", | ||||||
|   "confirmations.mute.confirm": "ミュート", |   "confirmations.mute.confirm": "ミュート", | ||||||
|   "confirmations.mute.message": "本当に{name}さんをミュートしますか?", |   "confirmations.mute.message": "本当に{name}さんをミュートしますか?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "フォロー解除", |   "confirmations.unfollow.confirm": "フォロー解除", | ||||||
|   "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", |   "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", | ||||||
|   "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", |   "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", | ||||||
|  | @ -269,6 +271,7 @@ | ||||||
|   "status.reblog": "ブースト", |   "status.reblog": "ブースト", | ||||||
|   "status.reblog_private": "ブースト", |   "status.reblog_private": "ブースト", | ||||||
|   "status.reblogged_by": "{name}さんがブースト", |   "status.reblogged_by": "{name}さんがブースト", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "返信", |   "status.reply": "返信", | ||||||
|   "status.replyAll": "全員に返信", |   "status.replyAll": "全員に返信", | ||||||
|   "status.report": "@{name}さんを通報", |   "status.report": "@{name}さんを通報", | ||||||
|  | @ -289,8 +292,6 @@ | ||||||
|   "timeline.media": "メディア", |   "timeline.media": "メディア", | ||||||
|   "timeline.posts": "投稿", |   "timeline.posts": "投稿", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {人} other {人}} がトゥート", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {人} other {人}} がトゥート", | ||||||
|   "trends.header": "トレンドタグ", |  | ||||||
|   "trends.refresh": "更新", |  | ||||||
|   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", |   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", | ||||||
|   "upload_area.title": "ドラッグ&ドロップでアップロード", |   "upload_area.title": "ドラッグ&ドロップでアップロード", | ||||||
|   "upload_button.label": "メディアを追加", |   "upload_button.label": "メディアを追加", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "정말로 {domain} 전체를 숨기시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다.", |   "confirmations.domain_block.message": "정말로 {domain} 전체를 숨기시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다.", | ||||||
|   "confirmations.mute.confirm": "뮤트", |   "confirmations.mute.confirm": "뮤트", | ||||||
|   "confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?", |   "confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "언팔로우", |   "confirmations.unfollow.confirm": "언팔로우", | ||||||
|   "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", |   "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", | ||||||
|   "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", |   "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "부스트", |   "status.reblog": "부스트", | ||||||
|   "status.reblog_private": "원래의 수신자들에게 부스트", |   "status.reblog_private": "원래의 수신자들에게 부스트", | ||||||
|   "status.reblogged_by": "{name}님이 부스트 했습니다", |   "status.reblogged_by": "{name}님이 부스트 했습니다", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "답장", |   "status.reply": "답장", | ||||||
|   "status.replyAll": "전원에게 답장", |   "status.replyAll": "전원에게 답장", | ||||||
|   "status.report": "신고", |   "status.report": "신고", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", |   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", | ||||||
|   "upload_area.title": "드래그 & 드롭으로 업로드", |   "upload_area.title": "드래그 & 드롭으로 업로드", | ||||||
|   "upload_button.label": "미디어 추가", |   "upload_button.label": "미디어 추가", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gepaster.", |   "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gepaster.", | ||||||
|   "confirmations.mute.confirm": "Negeren", |   "confirmations.mute.confirm": "Negeren", | ||||||
|   "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", |   "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Ontvolgen", |   "confirmations.unfollow.confirm": "Ontvolgen", | ||||||
|   "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", |   "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", | ||||||
|   "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", |   "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost naar oorspronkelijke ontvangers", |   "status.reblog_private": "Boost naar oorspronkelijke ontvangers", | ||||||
|   "status.reblogged_by": "{name} boostte", |   "status.reblogged_by": "{name} boostte", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Reageren", |   "status.reply": "Reageren", | ||||||
|   "status.replyAll": "Reageer op iedereen", |   "status.replyAll": "Reageer op iedereen", | ||||||
|   "status.report": "Rapporteer @{name}", |   "status.report": "Rapporteer @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {persoon praat} other {mensen praten}} hierover", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {persoon praat} other {mensen praten}} hierover", | ||||||
|   "trends.header": "Trends", |  | ||||||
|   "trends.refresh": "Vernieuwen", |  | ||||||
|   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", |   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", | ||||||
|   "upload_area.title": "Hierin slepen om te uploaden", |   "upload_area.title": "Hierin slepen om te uploaden", | ||||||
|   "upload_button.label": "Media toevoegen", |   "upload_button.label": "Media toevoegen", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", |   "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", | ||||||
|   "confirmations.mute.confirm": "Demp", |   "confirmations.mute.confirm": "Demp", | ||||||
|   "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", |   "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Slutt å følge", |   "confirmations.unfollow.confirm": "Slutt å følge", | ||||||
|   "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", |   "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", | ||||||
|   "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", |   "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Fremhev", |   "status.reblog": "Fremhev", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "Fremhevd av {name}", |   "status.reblogged_by": "Fremhevd av {name}", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Svar", |   "status.reply": "Svar", | ||||||
|   "status.replyAll": "Svar til samtale", |   "status.replyAll": "Svar til samtale", | ||||||
|   "status.report": "Rapporter @{name}", |   "status.report": "Rapporter @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", |   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", | ||||||
|   "upload_area.title": "Dra og slipp for å laste opp", |   "upload_area.title": "Dra og slipp for å laste opp", | ||||||
|   "upload_button.label": "Legg til media", |   "upload_button.label": "Legg til media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", |   "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", | ||||||
|   "confirmations.mute.confirm": "Rescondre", |   "confirmations.mute.confirm": "Rescondre", | ||||||
|   "confirmations.mute.message": "Sètz segur de voler rescondre {name} ?", |   "confirmations.mute.message": "Sètz segur de voler rescondre {name} ?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Quitar de sègre", |   "confirmations.unfollow.confirm": "Quitar de sègre", | ||||||
|   "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", |   "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", | ||||||
|   "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", |   "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Partejar", |   "status.reblog": "Partejar", | ||||||
|   "status.reblog_private": "Partejar a l’audiéncia d’origina", |   "status.reblog_private": "Partejar a l’audiéncia d’origina", | ||||||
|   "status.reblogged_by": "{name} a partejat", |   "status.reblogged_by": "{name} a partejat", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Respondre", |   "status.reply": "Respondre", | ||||||
|   "status.replyAll": "Respondre a la conversacion", |   "status.replyAll": "Respondre a la conversacion", | ||||||
|   "status.report": "Senhalar @{name}", |   "status.report": "Senhalar @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Tuts", |   "timeline.posts": "Tuts", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", | ||||||
|   "trends.header": "Tendéncia actuala", |  | ||||||
|   "trends.refresh": "Actualizar", |  | ||||||
|   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", |   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", | ||||||
|   "upload_area.title": "Lisatz e depausatz per mandar", |   "upload_area.title": "Lisatz e depausatz per mandar", | ||||||
|   "upload_button.label": "Ajustar un mèdia", |   "upload_button.label": "Ajustar un mèdia", | ||||||
|  |  | ||||||
|  | @ -87,6 +87,8 @@ | ||||||
|   "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", |   "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", | ||||||
|   "confirmations.mute.confirm": "Wycisz", |   "confirmations.mute.confirm": "Wycisz", | ||||||
|   "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", |   "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Usuń i przeredaguj", | ||||||
|  |   "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Utracisz wszystkie odpowiedzi, podbicia i polubienia dotyczące go.", | ||||||
|   "confirmations.unfollow.confirm": "Przestań śledzić", |   "confirmations.unfollow.confirm": "Przestań śledzić", | ||||||
|   "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", |   "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", | ||||||
|   "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", |   "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", | ||||||
|  | @ -269,6 +271,7 @@ | ||||||
|   "status.reblog": "Podbij", |   "status.reblog": "Podbij", | ||||||
|   "status.reblog_private": "Podbij dla odbiorców oryginalnego wpisu", |   "status.reblog_private": "Podbij dla odbiorców oryginalnego wpisu", | ||||||
|   "status.reblogged_by": "{name} podbił", |   "status.reblogged_by": "{name} podbił", | ||||||
|  |   "status.redraft": "Usuń i przeredaguj", | ||||||
|   "status.reply": "Odpowiedz", |   "status.reply": "Odpowiedz", | ||||||
|   "status.replyAll": "Odpowiedz na wątek", |   "status.replyAll": "Odpowiedz na wątek", | ||||||
|   "status.report": "Zgłoś @{name}", |   "status.report": "Zgłoś @{name}", | ||||||
|  | @ -289,8 +292,6 @@ | ||||||
|   "timeline.media": "Zawartość multimedialna", |   "timeline.media": "Zawartość multimedialna", | ||||||
|   "timeline.posts": "Wpisy", |   "timeline.posts": "Wpisy", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {osoba rozmawia} few {osoby rozmawiają} other {osób rozmawia}} o tym", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {osoba rozmawia} few {osoby rozmawiają} other {osób rozmawia}} o tym", | ||||||
|   "trends.header": "Na czasie", |  | ||||||
|   "trends.refresh": "Odśwież", |  | ||||||
|   "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.", |   "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.", | ||||||
|   "upload_area.title": "Przeciągnij i upuść aby wysłać", |   "upload_area.title": "Przeciągnij i upuść aby wysłać", | ||||||
|   "upload_button.label": "Dodaj zawartość multimedialną", |   "upload_button.label": "Dodaj zawartość multimedialną", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado.", |   "confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado.", | ||||||
|   "confirmations.mute.confirm": "Silenciar", |   "confirmations.mute.confirm": "Silenciar", | ||||||
|   "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?", |   "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Deixar de seguir", |   "confirmations.unfollow.confirm": "Deixar de seguir", | ||||||
|   "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", |   "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", | ||||||
|   "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", |   "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Compartilhar", |   "status.reblog": "Compartilhar", | ||||||
|   "status.reblog_private": "Compartilhar com a audiência original", |   "status.reblog_private": "Compartilhar com a audiência original", | ||||||
|   "status.reblogged_by": "{name} compartilhou", |   "status.reblogged_by": "{name} compartilhou", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Responder", |   "status.reply": "Responder", | ||||||
|   "status.replyAll": "Responder à sequência", |   "status.replyAll": "Responder à sequência", | ||||||
|   "status.report": "Denunciar @{name}", |   "status.report": "Denunciar @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre", | ||||||
|   "trends.header": "Hashtags do momento", |  | ||||||
|   "trends.refresh": "Atualizar", |  | ||||||
|   "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", |   "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", | ||||||
|   "upload_area.title": "Arraste e solte para enviar", |   "upload_area.title": "Arraste e solte para enviar", | ||||||
|   "upload_button.label": "Adicionar mídia", |   "upload_button.label": "Adicionar mídia", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "De certeza que queres bloquear por completo o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é o suficiente e o recomendado.", |   "confirmations.domain_block.message": "De certeza que queres bloquear por completo o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é o suficiente e o recomendado.", | ||||||
|   "confirmations.mute.confirm": "Silenciar", |   "confirmations.mute.confirm": "Silenciar", | ||||||
|   "confirmations.mute.message": "De certeza que queres silenciar {name}?", |   "confirmations.mute.message": "De certeza que queres silenciar {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Deixar de seguir", |   "confirmations.unfollow.confirm": "Deixar de seguir", | ||||||
|   "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", |   "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", | ||||||
|   "embed.instructions": "Publicar este post num outro site copiando o código abaixo.", |   "embed.instructions": "Publicar este post num outro site copiando o código abaixo.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Partilhar", |   "status.reblog": "Partilhar", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} partilhou", |   "status.reblogged_by": "{name} partilhou", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Responder", |   "status.reply": "Responder", | ||||||
|   "status.replyAll": "Responder à conversa", |   "status.replyAll": "Responder à conversa", | ||||||
|   "status.report": "Denunciar @{name}", |   "status.report": "Denunciar @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "O teu rascunho vai ser perdido se abandonares o Mastodon.", |   "ui.beforeunload": "O teu rascunho vai ser perdido se abandonares o Mastodon.", | ||||||
|   "upload_area.title": "Arraste e solte para enviar", |   "upload_area.title": "Arraste e solte para enviar", | ||||||
|   "upload_button.label": "Adicionar media", |   "upload_button.label": "Adicionar media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Вы на самом деле уверены, что хотите блокировать весь {domain}? В большинстве случаев нескольких отдельных блокировок или глушений достаточно.", |   "confirmations.domain_block.message": "Вы на самом деле уверены, что хотите блокировать весь {domain}? В большинстве случаев нескольких отдельных блокировок или глушений достаточно.", | ||||||
|   "confirmations.mute.confirm": "Заглушить", |   "confirmations.mute.confirm": "Заглушить", | ||||||
|   "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?", |   "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Отписаться", |   "confirmations.unfollow.confirm": "Отписаться", | ||||||
|   "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", |   "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", | ||||||
|   "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", |   "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Продвинуть", |   "status.reblog": "Продвинуть", | ||||||
|   "status.reblog_private": "Продвинуть для своей аудитории", |   "status.reblog_private": "Продвинуть для своей аудитории", | ||||||
|   "status.reblogged_by": "{name} продвинул(а)", |   "status.reblogged_by": "{name} продвинул(а)", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Ответить", |   "status.reply": "Ответить", | ||||||
|   "status.replyAll": "Ответить на тред", |   "status.replyAll": "Ответить на тред", | ||||||
|   "status.report": "Пожаловаться", |   "status.report": "Пожаловаться", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.", |   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.", | ||||||
|   "upload_area.title": "Перетащите сюда, чтобы загрузить", |   "upload_area.title": "Перетащите сюда, чтобы загрузить", | ||||||
|   "upload_button.label": "Добавить медиаконтент", |   "upload_button.label": "Добавить медиаконтент", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Ste si naozaj istý, že chcete blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať daných používateľov, čiže to sa doporučuje.", |   "confirmations.domain_block.message": "Ste si naozaj istý, že chcete blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať daných používateľov, čiže to sa doporučuje.", | ||||||
|   "confirmations.mute.confirm": "Ignoruj", |   "confirmations.mute.confirm": "Ignoruj", | ||||||
|   "confirmations.mute.message": "Naozaj chcete ignorovať {name}?", |   "confirmations.mute.message": "Naozaj chcete ignorovať {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Nesledovať", |   "confirmations.unfollow.confirm": "Nesledovať", | ||||||
|   "confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?", |   "confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?", | ||||||
|   "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", |   "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Povýšiť", |   "status.reblog": "Povýšiť", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} povýšil/a", |   "status.reblogged_by": "{name} povýšil/a", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Odpovedať", |   "status.reply": "Odpovedať", | ||||||
|   "status.replyAll": "Odpovedať na diskusiu", |   "status.replyAll": "Odpovedať na diskusiu", | ||||||
|   "status.report": "Nahlásiť @{name}", |   "status.report": "Nahlásiť @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Príspevky", |   "timeline.posts": "Príspevky", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Čo máte rozpísané sa stratí, ak opustíte Mastodon.", |   "ui.beforeunload": "Čo máte rozpísané sa stratí, ak opustíte Mastodon.", | ||||||
|   "upload_area.title": "Ťahaj a pusti pre nahratie", |   "upload_area.title": "Ťahaj a pusti pre nahratie", | ||||||
|   "upload_button.label": "Pridať médiá", |   "upload_button.label": "Pridať médiá", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše.", |   "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše.", | ||||||
|   "confirmations.mute.confirm": "Utišanje", |   "confirmations.mute.confirm": "Utišanje", | ||||||
|   "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", |   "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Prenehaj slediti", |   "confirmations.unfollow.confirm": "Prenehaj slediti", | ||||||
|   "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", |   "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", | ||||||
|   "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", |   "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Suni", |   "status.reblog": "Suni", | ||||||
|   "status.reblog_private": "Suni v prvotno občinstvo", |   "status.reblog_private": "Suni v prvotno občinstvo", | ||||||
|   "status.reblogged_by": "{name} sunjen", |   "status.reblogged_by": "{name} sunjen", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Odgovori", |   "status.reply": "Odgovori", | ||||||
|   "status.replyAll": "Odgovori na objavo", |   "status.replyAll": "Odgovori na objavo", | ||||||
|   "status.report": "Prijavi @{name}", |   "status.report": "Prijavi @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.", |   "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.", | ||||||
|   "upload_area.title": "Povlecite in spustite za pošiljanje", |   "upload_area.title": "Povlecite in spustite za pošiljanje", | ||||||
|   "upload_button.label": "Dodaj medij", |   "upload_button.label": "Dodaj medij", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Da li ste stvarno, stvarno sigurno da želite da blokirate ceo domen {domain}? U većini slučajeva, par dobrih blokiranja ili ućutkavanja su dovoljna i preporučljiva.", |   "confirmations.domain_block.message": "Da li ste stvarno, stvarno sigurno da želite da blokirate ceo domen {domain}? U većini slučajeva, par dobrih blokiranja ili ućutkavanja su dovoljna i preporučljiva.", | ||||||
|   "confirmations.mute.confirm": "Ućutkaj", |   "confirmations.mute.confirm": "Ućutkaj", | ||||||
|   "confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?", |   "confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Otprati", |   "confirmations.unfollow.confirm": "Otprati", | ||||||
|   "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", |   "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", | ||||||
|   "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", |   "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Podrži", |   "status.reblog": "Podrži", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} podržao(la)", |   "status.reblogged_by": "{name} podržao(la)", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Odgovori", |   "status.reply": "Odgovori", | ||||||
|   "status.replyAll": "Odgovori na diskusiju", |   "status.replyAll": "Odgovori na diskusiju", | ||||||
|   "status.report": "Prijavi korisnika @{name}", |   "status.report": "Prijavi korisnika @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.", |   "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.", | ||||||
|   "upload_area.title": "Prevucite ovde da otpremite", |   "upload_area.title": "Prevucite ovde da otpremite", | ||||||
|   "upload_button.label": "Dodaj multimediju", |   "upload_button.label": "Dodaj multimediju", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Да ли сте стварно, стварно сигурно да желите да блокирате цео домен {domain}? У већини случајева, пар добрих блокирања или ућуткавања су довољна и препоручљива.", |   "confirmations.domain_block.message": "Да ли сте стварно, стварно сигурно да желите да блокирате цео домен {domain}? У већини случајева, пар добрих блокирања или ућуткавања су довољна и препоручљива.", | ||||||
|   "confirmations.mute.confirm": "Ућуткај", |   "confirmations.mute.confirm": "Ућуткај", | ||||||
|   "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", |   "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Отпрати", |   "confirmations.unfollow.confirm": "Отпрати", | ||||||
|   "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", |   "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", | ||||||
|   "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", |   "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Подржи", |   "status.reblog": "Подржи", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} подржао(ла)", |   "status.reblogged_by": "{name} подржао(ла)", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Одговори", |   "status.reply": "Одговори", | ||||||
|   "status.replyAll": "Одговори на дискусију", |   "status.replyAll": "Одговори на дискусију", | ||||||
|   "status.report": "Пријави корисника @{name}", |   "status.report": "Пријави корисника @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.", |   "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.", | ||||||
|   "upload_area.title": "Превуците овде да отпремите", |   "upload_area.title": "Превуците овде да отпремите", | ||||||
|   "upload_button.label": "Додај мултимедију", |   "upload_button.label": "Додај мултимедију", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade tillräckligt och föredras.", |   "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade tillräckligt och föredras.", | ||||||
|   "confirmations.mute.confirm": "Tysta", |   "confirmations.mute.confirm": "Tysta", | ||||||
|   "confirmations.mute.message": "Är du säker du vill tysta ner {name}?", |   "confirmations.mute.message": "Är du säker du vill tysta ner {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Sluta följa", |   "confirmations.unfollow.confirm": "Sluta följa", | ||||||
|   "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", |   "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", | ||||||
|   "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", |   "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Knuff", |   "status.reblog": "Knuff", | ||||||
|   "status.reblog_private": "Knuffa till de ursprungliga åhörarna", |   "status.reblog_private": "Knuffa till de ursprungliga åhörarna", | ||||||
|   "status.reblogged_by": "{name} knuffade", |   "status.reblogged_by": "{name} knuffade", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Svara", |   "status.reply": "Svara", | ||||||
|   "status.replyAll": "Svara på tråden", |   "status.replyAll": "Svara på tråden", | ||||||
|   "status.report": "Rapportera @{name}", |   "status.report": "Rapportera @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.", |   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.", | ||||||
|   "upload_area.title": "Dra & släpp för att ladda upp", |   "upload_area.title": "Dra & släpp för att ladda upp", | ||||||
|   "upload_button.label": "Lägg till media", |   "upload_button.label": "Lägg till media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Mute", |   "confirmations.mute.confirm": "Mute", | ||||||
|   "confirmations.mute.message": "Are you sure you want to mute {name}?", |   "confirmations.mute.message": "Are you sure you want to mute {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} boosted", |   "status.reblogged_by": "{name} boosted", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Reply", |   "status.reply": "Reply", | ||||||
|   "status.replyAll": "Reply to thread", |   "status.replyAll": "Reply to thread", | ||||||
|   "status.report": "Report @{name}", |   "status.report": "Report @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop to upload", |   "upload_area.title": "Drag & drop to upload", | ||||||
|   "upload_button.label": "Add media", |   "upload_button.label": "Add media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Mute", |   "confirmations.mute.confirm": "Mute", | ||||||
|   "confirmations.mute.message": "Are you sure you want to mute {name}?", |   "confirmations.mute.message": "Are you sure you want to mute {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost", |   "status.reblog": "Boost", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} boosted", |   "status.reblogged_by": "{name} boosted", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Reply", |   "status.reply": "Reply", | ||||||
|   "status.replyAll": "Reply to thread", |   "status.replyAll": "Reply to thread", | ||||||
|   "status.report": "Report @{name}", |   "status.report": "Report @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Drag & drop to upload", |   "upload_area.title": "Drag & drop to upload", | ||||||
|   "upload_button.label": "Add media", |   "upload_button.label": "Add media", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", |   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", | ||||||
|   "confirmations.mute.confirm": "Sessize al", |   "confirmations.mute.confirm": "Sessize al", | ||||||
|   "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", |   "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Boost'la", |   "status.reblog": "Boost'la", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} boost etti", |   "status.reblogged_by": "{name} boost etti", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Cevapla", |   "status.reply": "Cevapla", | ||||||
|   "status.replyAll": "Konuşmayı cevapla", |   "status.replyAll": "Konuşmayı cevapla", | ||||||
|   "status.report": "@{name}'i raporla", |   "status.report": "@{name}'i raporla", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Upload için sürükle bırak yapınız", |   "upload_area.title": "Upload için sürükle bırak yapınız", | ||||||
|   "upload_button.label": "Görsel ekle", |   "upload_button.label": "Görsel ekle", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів.", |   "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів.", | ||||||
|   "confirmations.mute.confirm": "Заглушити", |   "confirmations.mute.confirm": "Заглушити", | ||||||
|   "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?", |   "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "Unfollow", |   "confirmations.unfollow.confirm": "Unfollow", | ||||||
|   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", |   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", | ||||||
|   "embed.instructions": "Embed this status on your website by copying the code below.", |   "embed.instructions": "Embed this status on your website by copying the code below.", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "Передмухнути", |   "status.reblog": "Передмухнути", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} передмухнув(-ла)", |   "status.reblogged_by": "{name} передмухнув(-ла)", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "Відповісти", |   "status.reply": "Відповісти", | ||||||
|   "status.replyAll": "Відповісти на тред", |   "status.replyAll": "Відповісти на тред", | ||||||
|   "status.report": "Поскаржитися", |   "status.report": "Поскаржитися", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", |   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", | ||||||
|   "upload_area.title": "Перетягніть сюди, щоб завантажити", |   "upload_area.title": "Перетягніть сюди, щоб завантажити", | ||||||
|   "upload_button.label": "Додати медіаконтент", |   "upload_button.label": "Додати медіаконтент", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "你真的确定要隐藏所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户应该就能满足你的需要了。", |   "confirmations.domain_block.message": "你真的确定要隐藏所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户应该就能满足你的需要了。", | ||||||
|   "confirmations.mute.confirm": "隐藏", |   "confirmations.mute.confirm": "隐藏", | ||||||
|   "confirmations.mute.message": "你确定要隐藏 {name} 吗?", |   "confirmations.mute.message": "你确定要隐藏 {name} 吗?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "取消关注", |   "confirmations.unfollow.confirm": "取消关注", | ||||||
|   "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", |   "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", | ||||||
|   "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", |   "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "转嘟", |   "status.reblog": "转嘟", | ||||||
|   "status.reblog_private": "转嘟给原有关注者", |   "status.reblog_private": "转嘟给原有关注者", | ||||||
|   "status.reblogged_by": "{name} 转嘟了", |   "status.reblogged_by": "{name} 转嘟了", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "回复", |   "status.reply": "回复", | ||||||
|   "status.replyAll": "回复所有人", |   "status.replyAll": "回复所有人", | ||||||
|   "status.report": "举报 @{name}", |   "status.report": "举报 @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "媒体", |   "timeline.media": "媒体", | ||||||
|   "timeline.posts": "嘟文", |   "timeline.posts": "嘟文", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会被丢弃。", |   "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会被丢弃。", | ||||||
|   "upload_area.title": "将文件拖放到此处开始上传", |   "upload_area.title": "将文件拖放到此处开始上传", | ||||||
|   "upload_button.label": "上传媒体文件", |   "upload_button.label": "上传媒体文件", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。", |   "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。", | ||||||
|   "confirmations.mute.confirm": "靜音", |   "confirmations.mute.confirm": "靜音", | ||||||
|   "confirmations.mute.message": "你確定要將{name}靜音嗎?", |   "confirmations.mute.message": "你確定要將{name}靜音嗎?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "取消關注", |   "confirmations.unfollow.confirm": "取消關注", | ||||||
|   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", |   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", | ||||||
|   "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", |   "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "轉推", |   "status.reblog": "轉推", | ||||||
|   "status.reblog_private": "轉推到原讀者", |   "status.reblog_private": "轉推到原讀者", | ||||||
|   "status.reblogged_by": "{name} 轉推", |   "status.reblogged_by": "{name} 轉推", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "回應", |   "status.reply": "回應", | ||||||
|   "status.replyAll": "回應所有人", |   "status.replyAll": "回應所有人", | ||||||
|   "status.report": "舉報 @{name}", |   "status.report": "舉報 @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "文章", |   "timeline.posts": "文章", | ||||||
|   "trends.count_by_accounts": "{count} 位用戶在討論", |   "trends.count_by_accounts": "{count} 位用戶在討論", | ||||||
|   "trends.header": "現時趨勢", |  | ||||||
|   "trends.refresh": "重新載入", |  | ||||||
|   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。", |   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。", | ||||||
|   "upload_area.title": "將檔案拖放至此上載", |   "upload_area.title": "將檔案拖放至此上載", | ||||||
|   "upload_button.label": "上載媒體檔案", |   "upload_button.label": "上載媒體檔案", | ||||||
|  |  | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|   "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。", |   "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。", | ||||||
|   "confirmations.mute.confirm": "消音", |   "confirmations.mute.confirm": "消音", | ||||||
|   "confirmations.mute.message": "你確定要消音 {name} ?", |   "confirmations.mute.message": "你確定要消音 {name} ?", | ||||||
|  |   "confirmations.redraft.confirm": "Delete & redraft", | ||||||
|  |   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", | ||||||
|   "confirmations.unfollow.confirm": "取消關注", |   "confirmations.unfollow.confirm": "取消關注", | ||||||
|   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", |   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", | ||||||
|   "embed.instructions": "要內嵌此貼文,請將以下代碼貼進你的網站。", |   "embed.instructions": "要內嵌此貼文,請將以下代碼貼進你的網站。", | ||||||
|  | @ -264,6 +266,7 @@ | ||||||
|   "status.reblog": "轉推", |   "status.reblog": "轉推", | ||||||
|   "status.reblog_private": "Boost to original audience", |   "status.reblog_private": "Boost to original audience", | ||||||
|   "status.reblogged_by": "{name} 轉推了", |   "status.reblogged_by": "{name} 轉推了", | ||||||
|  |   "status.redraft": "Delete & re-draft", | ||||||
|   "status.reply": "回應", |   "status.reply": "回應", | ||||||
|   "status.replyAll": "回應這串", |   "status.replyAll": "回應這串", | ||||||
|   "status.report": "通報 @{name}", |   "status.report": "通報 @{name}", | ||||||
|  | @ -284,8 +287,6 @@ | ||||||
|   "timeline.media": "Media", |   "timeline.media": "Media", | ||||||
|   "timeline.posts": "Toots", |   "timeline.posts": "Toots", | ||||||
|   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", |   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", | ||||||
|   "trends.header": "Trending now", |  | ||||||
|   "trends.refresh": "Refresh", |  | ||||||
|   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", |   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", | ||||||
|   "upload_area.title": "拖放來上傳", |   "upload_area.title": "拖放來上傳", | ||||||
|   "upload_button.label": "增加媒體", |   "upload_button.label": "增加媒體", | ||||||
|  |  | ||||||
|  | @ -32,9 +32,11 @@ import { | ||||||
| } from '../actions/compose'; | } from '../actions/compose'; | ||||||
| import { TIMELINE_DELETE } from '../actions/timelines'; | import { TIMELINE_DELETE } from '../actions/timelines'; | ||||||
| import { STORE_HYDRATE } from '../actions/store'; | import { STORE_HYDRATE } from '../actions/store'; | ||||||
|  | import { REDRAFT } from '../actions/statuses'; | ||||||
| import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; | import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; | ||||||
| import uuid from '../uuid'; | import uuid from '../uuid'; | ||||||
| import { me } from '../initial_state'; | import { me } from '../initial_state'; | ||||||
|  | import { unescapeHTML } from '../utils/html'; | ||||||
| 
 | 
 | ||||||
| const initialState = ImmutableMap({ | const initialState = ImmutableMap({ | ||||||
|   mounted: 0, |   mounted: 0, | ||||||
|  | @ -170,6 +172,18 @@ const hydrate = (state, hydratedState) => { | ||||||
|   return state; |   return state; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | const domParser = new DOMParser(); | ||||||
|  | 
 | ||||||
|  | const expandMentions = status => { | ||||||
|  |   const fragment = domParser.parseFromString(status.get('content'), 'text/html').documentElement; | ||||||
|  | 
 | ||||||
|  |   status.get('mentions').forEach(mention => { | ||||||
|  |     fragment.querySelector(`a[href="${mention.get('url')}"]`).textContent = `@${mention.get('acct')}`; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   return fragment.innerHTML; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| export default function compose(state = initialState, action) { | export default function compose(state = initialState, action) { | ||||||
|   switch(action.type) { |   switch(action.type) { | ||||||
|   case STORE_HYDRATE: |   case STORE_HYDRATE: | ||||||
|  | @ -301,6 +315,24 @@ export default function compose(state = initialState, action) { | ||||||
| 
 | 
 | ||||||
|         return item; |         return item; | ||||||
|       })); |       })); | ||||||
|  |   case REDRAFT: | ||||||
|  |     return state.withMutations(map => { | ||||||
|  |       map.set('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('media_attachments', action.status.get('media_attachments')); | ||||||
|  |       map.set('focusDate', new Date()); | ||||||
|  |       map.set('caretPosition', null); | ||||||
|  |       map.set('idempotencyKey', uuid()); | ||||||
|  | 
 | ||||||
|  |       if (action.status.get('spoiler_text').length > 0) { | ||||||
|  |         map.set('spoiler', true); | ||||||
|  |         map.set('spoiler_text', action.status.get('spoiler_text')); | ||||||
|  |       } else { | ||||||
|  |         map.set('spoiler', false); | ||||||
|  |         map.set('spoiler_text', ''); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|   default: |   default: | ||||||
|     return state; |     return state; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -26,7 +26,6 @@ import height_cache from './height_cache'; | ||||||
| import custom_emojis from './custom_emojis'; | import custom_emojis from './custom_emojis'; | ||||||
| import lists from './lists'; | import lists from './lists'; | ||||||
| import listEditor from './list_editor'; | import listEditor from './list_editor'; | ||||||
| import trends from './trends'; |  | ||||||
| 
 | 
 | ||||||
| const reducers = { | const reducers = { | ||||||
|   dropdown_menu, |   dropdown_menu, | ||||||
|  | @ -56,7 +55,6 @@ const reducers = { | ||||||
|   custom_emojis, |   custom_emojis, | ||||||
|   lists, |   lists, | ||||||
|   listEditor, |   listEditor, | ||||||
|   trends, |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export default combineReducers(reducers); | export default combineReducers(reducers); | ||||||
|  |  | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| import { TRENDS_FETCH_REQUEST, TRENDS_FETCH_SUCCESS, TRENDS_FETCH_FAIL } from '../actions/trends'; |  | ||||||
| import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; |  | ||||||
| 
 |  | ||||||
| const initialState = ImmutableMap({ |  | ||||||
|   items: ImmutableList(), |  | ||||||
|   isLoading: false, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| export default function trendsReducer(state = initialState, action) { |  | ||||||
|   switch(action.type) { |  | ||||||
|   case TRENDS_FETCH_REQUEST: |  | ||||||
|     return state.set('isLoading', true); |  | ||||||
|   case TRENDS_FETCH_SUCCESS: |  | ||||||
|     return state.withMutations(map => { |  | ||||||
|       map.set('items', fromJS(action.trends)); |  | ||||||
|       map.set('isLoading', false); |  | ||||||
|     }); |  | ||||||
|   case TRENDS_FETCH_FAIL: |  | ||||||
|     return state.set('isLoading', false); |  | ||||||
|   default: |  | ||||||
|     return state; |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| export const unescapeHTML = (html) => { | export const unescapeHTML = (html) => { | ||||||
|   const wrapper = document.createElement('div'); |   const wrapper = document.createElement('div'); | ||||||
|   html = html.replace(/<br \/>|<br>|\n/g, ' '); |   wrapper.innerHTML = html.replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n').replace(/<[^>]*>/g, ''); | ||||||
|   wrapper.innerHTML = html; |  | ||||||
|   return wrapper.textContent; |   return wrapper.textContent; | ||||||
| }; | }; | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								app/javascript/mastodon/utils/numbers.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/javascript/mastodon/utils/numbers.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | import React, { Fragment } from 'react'; | ||||||
|  | import { FormattedNumber } from 'react-intl'; | ||||||
|  | 
 | ||||||
|  | export const shortNumberFormat = number => { | ||||||
|  |   if (number < 1000) { | ||||||
|  |     return <FormattedNumber value={number} />; | ||||||
|  |   } else { | ||||||
|  |     return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</Fragment>; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | @ -26,20 +26,20 @@ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button { | .compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button { | ||||||
|   color: $ui-base-color; |   color: lighten($white, 7%); | ||||||
| 
 | 
 | ||||||
|   &:active, |   &:active, | ||||||
|   &:focus, |   &:focus, | ||||||
|   &:hover { |   &:hover { | ||||||
|     color: darken($ui-base-color, 7%); |     color: $white; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .compose-form .compose-form__modifiers .compose-form__upload-description input { | .compose-form .compose-form__modifiers .compose-form__upload-description input { | ||||||
|   color: $ui-base-color; |   color: lighten($white, 7%); | ||||||
| 
 | 
 | ||||||
|   &::placeholder { |   &::placeholder { | ||||||
|     color: $ui-base-color; |     color: lighten($white, 7%); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -100,7 +100,7 @@ | ||||||
| .dropdown-menu__item { | .dropdown-menu__item { | ||||||
|   a { |   a { | ||||||
|     background: $ui-base-color; |     background: $ui-base-color; | ||||||
|     color: $ui-secondary-color; |     color: $darker-text-color; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -189,17 +189,18 @@ | ||||||
| // Change the default colors used on some parts of the profile pages | // Change the default colors used on some parts of the profile pages | ||||||
| .activity-stream-tabs { | .activity-stream-tabs { | ||||||
|   background: $account-background-color; |   background: $account-background-color; | ||||||
| 
 |   border-bottom-color: lighten($ui-base-color, 8%); | ||||||
|   a { |  | ||||||
|     &.active { |  | ||||||
|       color: $ui-primary-color; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .activity-stream { | .activity-stream { | ||||||
|   .entry { |   .entry { | ||||||
|     background: $account-background-color; |     background: $account-background-color; | ||||||
|  | 
 | ||||||
|  |     .detailed-status.light, | ||||||
|  |     .more.light, | ||||||
|  |     .status.light { | ||||||
|  |       border-bottom-color: lighten($ui-base-color, 8%); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .status.light { |   .status.light { | ||||||
|  | @ -219,7 +220,7 @@ | ||||||
|   .account-grid-card { |   .account-grid-card { | ||||||
|     .controls { |     .controls { | ||||||
|       .icon-button { |       .icon-button { | ||||||
|         color: $ui-secondary-color; |         color: $darker-text-color; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -230,7 +231,7 @@ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .username { |     .username { | ||||||
|       color: $ui-secondary-color; |       color: $darker-text-color; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .account__header__content { |     .account__header__content { | ||||||
|  |  | ||||||
|  | @ -195,6 +195,7 @@ a.table-action-link { | ||||||
|       font-weight: 700; |       font-weight: 700; | ||||||
|       background: linear-gradient(to right, orange , yellow, green, cyan, blue, violet,orange , yellow, green, cyan, blue, violet); |       background: linear-gradient(to right, orange , yellow, green, cyan, blue, violet,orange , yellow, green, cyan, blue, violet); | ||||||
|       background-size: 200% 100%; |       background-size: 200% 100%; | ||||||
|  |       -webkit-background-clip: text; | ||||||
|       background-clip: text; |       background-clip: text; | ||||||
|       color: transparent; |       color: transparent; | ||||||
|       animation: Swag 2s linear 0s infinite; |       animation: Swag 2s linear 0s infinite; | ||||||
|  |  | ||||||
|  | @ -24,15 +24,18 @@ module Remotable | ||||||
|           Request.new(:get, url).perform do |response| |           Request.new(:get, url).perform do |response| | ||||||
|             next if response.code != 200 |             next if response.code != 200 | ||||||
| 
 | 
 | ||||||
|             matches  = response.headers['content-disposition']&.match(/filename="([^"]*)"/) |             content_type = parse_content_type(response.headers.get('content-type').last) | ||||||
|  |             extname      = detect_extname_from_content_type(content_type) | ||||||
|  | 
 | ||||||
|  |             if extname.nil? | ||||||
|  |               disposition = response.headers.get('content-disposition').last | ||||||
|  |               matches     = disposition&.match(/filename="([^"]*)"/) | ||||||
|               filename    = matches.nil? ? parsed_url.path.split('/').last : matches[1] |               filename    = matches.nil? ? parsed_url.path.split('/').last : matches[1] | ||||||
|             basename = SecureRandom.hex(8) |               extname     = filename.nil? ? '' : File.extname(filename) | ||||||
|             extname = if filename.nil? |  | ||||||
|                         '' |  | ||||||
|                       else |  | ||||||
|                         File.extname(filename) |  | ||||||
|             end |             end | ||||||
| 
 | 
 | ||||||
|  |             basename = SecureRandom.hex(8) | ||||||
|  | 
 | ||||||
|             send("#{attachment_name}=", StringIO.new(response.body_with_limit(limit))) |             send("#{attachment_name}=", StringIO.new(response.body_with_limit(limit))) | ||||||
|             send("#{attachment_name}_file_name=", basename + extname) |             send("#{attachment_name}_file_name=", basename + extname) | ||||||
| 
 | 
 | ||||||
|  | @ -57,4 +60,26 @@ module Remotable | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def detect_extname_from_content_type(content_type) | ||||||
|  |     return if content_type.nil? | ||||||
|  | 
 | ||||||
|  |     type = MIME::Types[content_type].first | ||||||
|  | 
 | ||||||
|  |     return if type.nil? | ||||||
|  | 
 | ||||||
|  |     extname = type.extensions.first | ||||||
|  | 
 | ||||||
|  |     return if extname.nil? | ||||||
|  | 
 | ||||||
|  |     ".#{extname}" | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def parse_content_type(content_type) | ||||||
|  |     return if content_type.nil? | ||||||
|  | 
 | ||||||
|  |     content_type.split(/\s*;\s*/).first | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -51,12 +51,16 @@ module StatusThreadingConcern | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def descendant_statuses(limit, max_child_id, since_child_id, depth) |   def descendant_statuses(limit, max_child_id, since_child_id, depth) | ||||||
|     Status.find_by_sql([<<-SQL.squish, id: id, limit: limit, max_child_id: max_child_id, since_child_id: since_child_id, depth: depth]) |     # use limit + 1 and depth + 1 because 'self' is included | ||||||
|  |     depth += 1 if depth.present? | ||||||
|  |     limit += 1 if limit.present? | ||||||
|  | 
 | ||||||
|  |     descendants_with_self = Status.find_by_sql([<<-SQL.squish, id: id, limit: limit, max_child_id: max_child_id, since_child_id: since_child_id, depth: depth]) | ||||||
|       WITH RECURSIVE search_tree(id, path) |       WITH RECURSIVE search_tree(id, path) | ||||||
|       AS ( |       AS ( | ||||||
|         SELECT id, ARRAY[id] |         SELECT id, ARRAY[id] | ||||||
|         FROM statuses |         FROM statuses | ||||||
|         WHERE in_reply_to_id = :id AND COALESCE(id < :max_child_id, TRUE) AND COALESCE(id > :since_child_id, TRUE) |         WHERE id = :id AND COALESCE(id < :max_child_id, TRUE) AND COALESCE(id > :since_child_id, TRUE) | ||||||
|         UNION ALL |         UNION ALL | ||||||
|         SELECT statuses.id, path || statuses.id |         SELECT statuses.id, path || statuses.id | ||||||
|         FROM search_tree |         FROM search_tree | ||||||
|  | @ -68,6 +72,8 @@ module StatusThreadingConcern | ||||||
|       ORDER BY path |       ORDER BY path | ||||||
|       LIMIT :limit |       LIMIT :limit | ||||||
|     SQL |     SQL | ||||||
|  | 
 | ||||||
|  |     descendants_with_self - [self] | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def find_statuses_from_tree_path(ids, account) |   def find_statuses_from_tree_path(ids, account) | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ class Glitch::KeywordMute < ApplicationRecord | ||||||
| 
 | 
 | ||||||
|     def matches?(str, required_scope) |     def matches?(str, required_scope) | ||||||
|       ((required_scope & scope) == required_scope) && \ |       ((required_scope & scope) == required_scope) && \ | ||||||
|         str =~ (whole_word ? boundary_regex_for_keyword : /#{keyword}/i) |         str =~ (whole_word ? boundary_regex_for_keyword : /#{Regexp.escape(keyword)}/i) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ class Status < ApplicationRecord | ||||||
|   has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy |   has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy | ||||||
|   has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread |   has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread | ||||||
|   has_many :mentions, dependent: :destroy |   has_many :mentions, dependent: :destroy | ||||||
|   has_many :media_attachments, dependent: :destroy |   has_many :media_attachments, dependent: :nullify | ||||||
| 
 | 
 | ||||||
|   has_and_belongs_to_many :tags |   has_and_belongs_to_many :tags | ||||||
|   has_and_belongs_to_many :preview_cards |   has_and_belongs_to_many :preview_cards | ||||||
|  | @ -194,7 +194,6 @@ class Status < ApplicationRecord | ||||||
|   before_validation :set_reblog |   before_validation :set_reblog | ||||||
|   before_validation :set_visibility |   before_validation :set_visibility | ||||||
|   before_validation :set_conversation |   before_validation :set_conversation | ||||||
|   before_validation :set_sensitivity |  | ||||||
|   before_validation :set_local |   before_validation :set_local | ||||||
| 
 | 
 | ||||||
|   class << self |   class << self | ||||||
|  | @ -317,7 +316,11 @@ class Status < ApplicationRecord | ||||||
|         # non-followers can see everything that isn't private/direct, but can see stuff they are mentioned in. |         # non-followers can see everything that isn't private/direct, but can see stuff they are mentioned in. | ||||||
|         visibility.push(:private) if account.following?(target_account) |         visibility.push(:private) if account.following?(target_account) | ||||||
| 
 | 
 | ||||||
|         where(visibility: visibility).or(where(id: account.mentions.select(:status_id))) |         scope = left_outer_joins(:reblog) | ||||||
|  | 
 | ||||||
|  |         scope.where(visibility: visibility) | ||||||
|  |              .or(scope.where(id: account.mentions.select(:status_id))) | ||||||
|  |              .merge(scope.where(reblog_of_id: nil).or(scope.where.not(reblogs_statuses: { account_id: account.excluded_from_timeline_account_ids }))) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -388,10 +391,6 @@ class Status < ApplicationRecord | ||||||
|     self.sensitive  = false if sensitive.nil? |     self.sensitive  = false if sensitive.nil? | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def set_sensitivity |  | ||||||
|     self.sensitive = sensitive || spoiler_text.present? |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def set_locality |   def set_locality | ||||||
|     if account.domain.nil? && !attribute_changed?(:local_only) |     if account.domain.nil? && !attribute_changed?(:local_only) | ||||||
|       self.local_only = marked_local_only? |       self.local_only = marked_local_only? | ||||||
|  |  | ||||||
|  | @ -1,9 +1,7 @@ | ||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class TrendingTags | class TrendingTags | ||||||
|   KEY                  = 'trending_tags' |  | ||||||
|   EXPIRE_HISTORY_AFTER = 7.days.seconds |   EXPIRE_HISTORY_AFTER = 7.days.seconds | ||||||
|   THRESHOLD            = 5 |  | ||||||
| 
 | 
 | ||||||
|   class << self |   class << self | ||||||
|     def record_use!(tag, account, at_time = Time.now.utc) |     def record_use!(tag, account, at_time = Time.now.utc) | ||||||
|  | @ -11,30 +9,10 @@ class TrendingTags | ||||||
| 
 | 
 | ||||||
|       increment_historical_use!(tag.id, at_time) |       increment_historical_use!(tag.id, at_time) | ||||||
|       increment_unique_use!(tag.id, account.id, at_time) |       increment_unique_use!(tag.id, account.id, at_time) | ||||||
|       increment_vote!(tag.id, at_time) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     def get(limit) |  | ||||||
|       tag_ids = redis.zrevrange(KEY, 0, limit).map(&:to_i) |  | ||||||
|       tags    = Tag.where(id: tag_ids).to_a.map { |tag| [tag.id, tag] }.to_h |  | ||||||
|       tag_ids.map { |tag_id| tags[tag_id] }.compact |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|     def increment_vote!(tag_id, at_time) |  | ||||||
|       expected = redis.pfcount("activity:tags:#{tag_id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts").to_f |  | ||||||
|       expected = 1.0 if expected.zero? |  | ||||||
|       observed = redis.pfcount("activity:tags:#{tag_id}:#{at_time.beginning_of_day.to_i}:accounts").to_f |  | ||||||
| 
 |  | ||||||
|       if expected > observed || observed < THRESHOLD |  | ||||||
|         redis.zrem(KEY, tag_id.to_s) |  | ||||||
|       else |  | ||||||
|         score = ((observed - expected)**2) / expected |  | ||||||
|         redis.zadd(KEY, score, tag_id.to_s) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     def increment_historical_use!(tag_id, at_time) |     def increment_historical_use!(tag_id, at_time) | ||||||
|       key = "activity:tags:#{tag_id}:#{at_time.beginning_of_day.to_i}" |       key = "activity:tags:#{tag_id}:#{at_time.beginning_of_day.to_i}" | ||||||
|       redis.incrby(key, 1) |       redis.incrby(key, 1) | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ class FetchLinkCardService < BaseService | ||||||
|     @card ||= PreviewCard.new(url: @url) |     @card ||= PreviewCard.new(url: @url) | ||||||
| 
 | 
 | ||||||
|     failed = Request.new(:head, @url).perform do |res| |     failed = Request.new(:head, @url).perform do |res| | ||||||
|       res.code != 405 && (res.code != 200 || res.mime_type != 'text/html') |       res.code != 405 && res.code != 501 && (res.code != 200 || res.mime_type != 'text/html') | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     return if failed |     return if failed | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ class PostStatusService < BaseService | ||||||
|       status = account.statuses.create!(text: text, |       status = account.statuses.create!(text: text, | ||||||
|                                         media_attachments: media || [], |                                         media_attachments: media || [], | ||||||
|                                         thread: in_reply_to, |                                         thread: in_reply_to, | ||||||
|                                         sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]), |                                         sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]) || options[:spoiler_text].present?, | ||||||
|                                         spoiler_text: options[:spoiler_text] || '', |                                         spoiler_text: options[:spoiler_text] || '', | ||||||
|                                         visibility: options[:visibility] || account.user&.setting_default_privacy, |                                         visibility: options[:visibility] || account.user&.setting_default_privacy, | ||||||
|                                         language: language_from_option(options[:language]) || LanguageDetector.instance.detect(text, account), |                                         language: language_from_option(options[:language]) || LanguageDetector.instance.detect(text, account), | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| %tr | %tr | ||||||
|   %td.username |   %td.username | ||||||
|     = account.username |     = account.username | ||||||
|   %td.domain |   %td | ||||||
|     - unless account.local? |     - unless account.local? | ||||||
|       = link_to account.domain, admin_accounts_path(by_domain: account.domain) |       = link_to account.domain, admin_accounts_path(by_domain: account.domain) | ||||||
|   %td |   %td | ||||||
|  |  | ||||||
|  | @ -5,8 +5,8 @@ | ||||||
|     %meta{ charset: 'utf-8' }/ |     %meta{ charset: 'utf-8' }/ | ||||||
|     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') |     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') | ||||||
|     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ |     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ | ||||||
|     = render partial: 'layouts/theme', object: @core |     = render partial: 'layouts/theme', object: (@core || { pack: 'common' }) | ||||||
|     = render partial: 'layouts/theme', object: @theme |     = render partial: 'layouts/theme', object: (@theme || { pack: 'common', flavour: 'glitch', skin: 'default' }) | ||||||
|   %body.error |   %body.error | ||||||
|     .dialog |     .dialog | ||||||
|       %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ |       %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ | ||||||
|  |  | ||||||
|  | @ -117,4 +117,4 @@ eu: | ||||||
|       follow: jarraitu kontuak, blokeatu, utzi jarraitzeari eta desblokeatu |       follow: jarraitu kontuak, blokeatu, utzi jarraitzeari eta desblokeatu | ||||||
|       push: jaso zure kontuaren push jakinarazpenak |       push: jaso zure kontuaren push jakinarazpenak | ||||||
|       read: irakurri zure kontuko datuak |       read: irakurri zure kontuko datuak | ||||||
|       write: argitaratu zure izenean |       write: zure izenean argitaratu | ||||||
|  |  | ||||||
|  | @ -424,7 +424,7 @@ en: | ||||||
|     following: 'Success! You are now following:' |     following: 'Success! You are now following:' | ||||||
|     post_follow: |     post_follow: | ||||||
|       close: Or, you can just close this window. |       close: Or, you can just close this window. | ||||||
|       return: Return to the user's profile |       return: Show the user's profile | ||||||
|       web: Go to web |       web: Go to web | ||||||
|     title: Follow %{acct} |     title: Follow %{acct} | ||||||
|   datetime: |   datetime: | ||||||
|  |  | ||||||
|  | @ -153,14 +153,14 @@ eu: | ||||||
|     action_logs: |     action_logs: | ||||||
|       actions: |       actions: | ||||||
|         assigned_to_self_report: "%{name}(e)k %{target} salaketa bere buruari esleitu dio" |         assigned_to_self_report: "%{name}(e)k %{target} salaketa bere buruari esleitu dio" | ||||||
|         change_email_user: "%{name}(e)k %{target}(r)en helbide elektronikoa aldatu du" |         change_email_user: "%{name}(e)k %{target}(r)en e-mail helbidea aldatu du" | ||||||
|         confirm_user: "%{name}(e)k %{target}(r)en helbide elektronikoa berretsi du" |         confirm_user: "%{name}(e)k %{target}(r)en e-mail helbidea berretsi du" | ||||||
|         create_custom_emoji: "%{name}(e)k emoji berria kargatu du %{target}" |         create_custom_emoji: "%{name}(e)k emoji berria kargatu du %{target}" | ||||||
|         create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du" |         create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du" | ||||||
|         create_email_domain_block: "%{name}(e)k %{target} helbide elektronikoen domeinua zerrenda beltzean sartu du" |         create_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda beltzean sartu du" | ||||||
|         demote_user: "%{name}(e)k %{target} mailaz jaitsi du" |         demote_user: "%{name}(e)k %{target} mailaz jaitsi du" | ||||||
|         destroy_domain_block: "%{name}(e)k %{target} domeinua desblokeatu du" |         destroy_domain_block: "%{name}(e)k %{target} domeinua desblokeatu du" | ||||||
|         destroy_email_domain_block: "%{name}(e)k %{target} helbide elektronikoen domeinua zerrenda zurian sartu du" |         destroy_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda zurian sartu du" | ||||||
|         destroy_status: "%{name}(e)k %{target}(e)n egoera kendu du" |         destroy_status: "%{name}(e)k %{target}(e)n egoera kendu du" | ||||||
|         disable_2fa_user: "%{name}(e)k %{target}(r)i bi faktoreetako eskaera kendu dio" |         disable_2fa_user: "%{name}(e)k %{target}(r)i bi faktoreetako eskaera kendu dio" | ||||||
|         disable_custom_emoji: "%{name}(e)k %{target} emoji-a desgaitu du" |         disable_custom_emoji: "%{name}(e)k %{target} emoji-a desgaitu du" | ||||||
|  | @ -356,8 +356,8 @@ eu: | ||||||
|       back_to_account: Atzera kontuaren orrira |       back_to_account: Atzera kontuaren orrira | ||||||
|       batch: |       batch: | ||||||
|         delete: Ezabatu |         delete: Ezabatu | ||||||
|         nsfw_off: Markatu ez mingarri gisa |         nsfw_off: Markatu ez hunkigarri gisa | ||||||
|         nsfw_on: Markatu mingarri gisa |         nsfw_on: Markatu hunkigarri gisa | ||||||
|       failed_to_execute: Ezin izan da burutu |       failed_to_execute: Ezin izan da burutu | ||||||
|       media: |       media: | ||||||
|         title: Multimedia |         title: Multimedia | ||||||
|  | @ -694,7 +694,7 @@ eu: | ||||||
|     click_to_show: Klik erakusteko |     click_to_show: Klik erakusteko | ||||||
|     pinned: Finkatutako toot-a |     pinned: Finkatutako toot-a | ||||||
|     reblogged: bultzatua |     reblogged: bultzatua | ||||||
|     sensitive_content: Eduki mingarria |     sensitive_content: Eduki hunkigarria | ||||||
|   terms: |   terms: | ||||||
|     body_html: | |     body_html: | | ||||||
|       <h2>Pribatutasun politika</h2> |       <h2>Pribatutasun politika</h2> | ||||||
|  |  | ||||||
|  | @ -425,7 +425,7 @@ pl: | ||||||
|     following: 'Pomyślnie! Od teraz śledzisz:' |     following: 'Pomyślnie! Od teraz śledzisz:' | ||||||
|     post_follow: |     post_follow: | ||||||
|       close: Ewentualnie, możesz po prostu zamknąć tę stronę. |       close: Ewentualnie, możesz po prostu zamknąć tę stronę. | ||||||
|       return: Powróć do strony użytkownika |       return: Pokaż stronę użytkownika | ||||||
|       web: Przejdź do sieci |       web: Przejdź do sieci | ||||||
|     title: Śledź %{acct} |     title: Śledź %{acct} | ||||||
|   datetime: |   datetime: | ||||||
|  | @ -784,9 +784,13 @@ pl: | ||||||
| 
 | 
 | ||||||
|       <hr class="spacer" /> |       <hr class="spacer" /> | ||||||
| 
 | 
 | ||||||
|       <h3 id="coppa">Children's Online Privacy Protection Act Compliance</h3> |       <h3 id="children">Korzystanie ze strony przez dzieci</h3> | ||||||
| 
 | 
 | ||||||
|       <p>Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 13 lat. Jeżeli serwer znajduje się w USA, a nie ukończyłeś 13 roku życia, zgodnie z wymogami COPPA (<a href="https://pl.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Prawo o Ochronie Prywatności Dzieci w Internecie</a>), nie używaj tej strony.</p> |       <p>Jeżeli serwer znajduje się w UE lub w EOG: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 16 lat. Jeżeli nie ukończyłeś 16 roku życia, zgodnie z wymogami COPPA (<a href="https://pl.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Prawo o Ochronie Prywatności Dzieci w Internecie</a>), nie używaj tej strony.</p> | ||||||
|  | 
 | ||||||
|  |       <p>Jeżeli serwer znajduje się w USA: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 13 lat. Jeżeli nie ukończyłeś 13 roku życia, zgodnie z wymogami RODO (<a href="https://pl.wikipedia.org/wiki/Ogólne_rozporządzenie_o_ochronie_danych">Ogólne rozporządzenie o ochronie danych</a>), nie używaj tej strony.</p> | ||||||
|  | 
 | ||||||
|  |       <p>Wymogi mogą być inne, jeżeli serwer znajduje się w innym kraju.</p> | ||||||
| 
 | 
 | ||||||
|       <hr class="spacer" /> |       <hr class="spacer" /> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ en: | ||||||
|         setting_default_sensitive: Always mark media as sensitive |         setting_default_sensitive: Always mark media as sensitive | ||||||
|         setting_delete_modal: Show confirmation dialog before deleting a toot |         setting_delete_modal: Show confirmation dialog before deleting a toot | ||||||
|         setting_display_sensitive_media: Always show media marked as sensitive |         setting_display_sensitive_media: Always show media marked as sensitive | ||||||
|         setting_favourite_modal: Show confirmation dialog before favouriting |         setting_favourite_modal: Show confirmation dialog before favouriting (applies to Glitch flavour only) | ||||||
|         setting_hide_network: Hide your network |         setting_hide_network: Hide your network | ||||||
|         setting_noindex: Opt-out of search engine indexing |         setting_noindex: Opt-out of search engine indexing | ||||||
|         setting_reduce_motion: Reduce motion in animations |         setting_reduce_motion: Reduce motion in animations | ||||||
|  |  | ||||||
|  | @ -37,7 +37,7 @@ eu: | ||||||
|         current_password: Oraingo pasahitza |         current_password: Oraingo pasahitza | ||||||
|         data: Datuak |         data: Datuak | ||||||
|         display_name: Pantaila-izena |         display_name: Pantaila-izena | ||||||
|         email: Helbide elektronikoa |         email: E-mail helbidea | ||||||
|         expires_in: Iraungitzea |         expires_in: Iraungitzea | ||||||
|         fields: Profilaren metadatuak |         fields: Profilaren metadatuak | ||||||
|         filtered_languages: Iragazitako hizkuntzak |         filtered_languages: Iragazitako hizkuntzak | ||||||
|  | @ -49,14 +49,14 @@ eu: | ||||||
|         note: Biografia |         note: Biografia | ||||||
|         otp_attempt: Bi faktoreetako kodea |         otp_attempt: Bi faktoreetako kodea | ||||||
|         password: Pasahitza |         password: Pasahitza | ||||||
|         setting_auto_play_gif: Automatikoki abiatu GIF animatuak |         setting_auto_play_gif: Erreproduzitu GIF animatuak automatikoki | ||||||
|         setting_boost_modal: Erakutsi baieztapen elkarrizketa-koadroa bultzada eman aurretik |         setting_boost_modal: Erakutsi baieztapen elkarrizketa-koadroa bultzada eman aurretik | ||||||
|         setting_default_privacy: Mezuen pribatutasuna |         setting_default_privacy: Mezuen pribatutasuna | ||||||
|         setting_default_sensitive: Beti markatu edukiak mingarri gisa |         setting_default_sensitive: Beti markatu edukiak hunkigarri gisa | ||||||
|         setting_delete_modal: Erakutsi baieztapen elkarrizketa-koadroa toot bat ezabatu aurretik |         setting_delete_modal: Erakutsi baieztapen elkarrizketa-koadroa toot bat ezabatu aurretik | ||||||
|         setting_display_sensitive_media: Beti erakutsi mingarri marka duen edukia |         setting_display_sensitive_media: Beti erakutsi hunkigarri gisa markatutako edukia | ||||||
|         setting_hide_network: Ezkutatu zure sarea |         setting_hide_network: Ezkutatu zure sarea | ||||||
|         setting_noindex: Atera bilaketa motorraren idexaziotik |         setting_noindex: Atera bilaketa motorraren indexaziotik | ||||||
|         setting_reduce_motion: Murriztu animazioen mugimenduak |         setting_reduce_motion: Murriztu animazioen mugimenduak | ||||||
|         setting_system_font_ui: Erabili sistemako tipografia lehenetsia |         setting_system_font_ui: Erabili sistemako tipografia lehenetsia | ||||||
|         setting_theme: Gunearen gaia |         setting_theme: Gunearen gaia | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ sk: | ||||||
|     reserved_username: Prihlasovacie meno je rezervované |     reserved_username: Prihlasovacie meno je rezervované | ||||||
|     roles: |     roles: | ||||||
|       admin: Administrátor |       admin: Administrátor | ||||||
|  |       bot: Automat | ||||||
|       moderator: Moderátor |       moderator: Moderátor | ||||||
|     unfollow: Prestať sledovať |     unfollow: Prestať sledovať | ||||||
|   admin: |   admin: | ||||||
|  |  | ||||||
|  | @ -271,7 +271,6 @@ Rails.application.routes.draw do | ||||||
|       resources :favourites, only: [:index] |       resources :favourites, only: [:index] | ||||||
|       resources :bookmarks,  only: [:index] |       resources :bookmarks,  only: [:index] | ||||||
|       resources :reports,    only: [:index, :create] |       resources :reports,    only: [:index, :create] | ||||||
|       resources :trends,     only: [:index] |  | ||||||
| 
 | 
 | ||||||
|       namespace :apps do |       namespace :apps do | ||||||
|         get :verify_credentials, to: 'credentials#show' |         get :verify_credentials, to: 'credentials#show' | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ module Mastodon | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def flags |     def flags | ||||||
|       'rc1' |       'rc3' | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def to_a |     def to_a | ||||||
|  |  | ||||||
|  | @ -561,7 +561,7 @@ namespace :mastodon do | ||||||
| 
 | 
 | ||||||
|     desc 'Generates home timelines for users who logged in in the past two weeks' |     desc 'Generates home timelines for users who logged in in the past two weeks' | ||||||
|     task build: :environment do |     task build: :environment do | ||||||
|       User.active.select(:account_id).find_in_batches do |users| |       User.active.select(:id, :account_id).find_in_batches do |users| | ||||||
|         RegenerationWorker.push_bulk(users.map(&:account_id)) |         RegenerationWorker.push_bulk(users.map(&:account_id)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								spec/controllers/api/web/embeds_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								spec/controllers/api/web/embeds_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | ||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | require 'rails_helper' | ||||||
|  | 
 | ||||||
|  | describe Api::Web::EmbedsController do | ||||||
|  |   render_views | ||||||
|  | 
 | ||||||
|  |   let(:user) { Fabricate(:user) } | ||||||
|  |   before { sign_in user } | ||||||
|  | 
 | ||||||
|  |   describe 'POST #create' do | ||||||
|  |     subject(:response) { post :create, params: { url: url } } | ||||||
|  |     subject(:body) { JSON.parse(response.body, symbolize_names: true) } | ||||||
|  | 
 | ||||||
|  |     context 'when successfully finds status' do | ||||||
|  |       let(:status) { Fabricate(:status) } | ||||||
|  |       let(:url) { "http://#{ Rails.configuration.x.web_domain }/@#{status.account.username}/#{status.id}" } | ||||||
|  | 
 | ||||||
|  |       it 'returns a right response' do | ||||||
|  |         expect(response).to have_http_status :ok | ||||||
|  |         expect(body[:author_name]).to eq status.account.username | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'when fails to find status' do | ||||||
|  |       let(:url) { 'https://host.test/oembed.html' } | ||||||
|  |       let(:service_instance) { double('fetch_oembed_service') } | ||||||
|  | 
 | ||||||
|  |       before do | ||||||
|  |         allow(FetchOEmbedService).to receive(:new) { service_instance } | ||||||
|  |         allow(service_instance).to receive(:call) { call_result } | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       context 'when successfully fetching oembed' do | ||||||
|  |         let(:call_result) { { result: :ok } } | ||||||
|  | 
 | ||||||
|  |         it 'returns a right response' do | ||||||
|  |           expect(response).to have_http_status :ok | ||||||
|  |           expect(body[:result]).to eq 'ok' | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       context 'when fails to fetch oembed' do | ||||||
|  |         let(:call_result) { nil } | ||||||
|  | 
 | ||||||
|  |         it 'returns a right response' do | ||||||
|  |           expect(response).to have_http_status :not_found | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										30
									
								
								spec/controllers/settings/sessions_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								spec/controllers/settings/sessions_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | require 'rails_helper' | ||||||
|  | 
 | ||||||
|  | describe Settings::SessionsController do | ||||||
|  |   render_views | ||||||
|  | 
 | ||||||
|  |   let(:user) { Fabricate(:user) } | ||||||
|  |   let(:session_activation) { Fabricate(:session_activation, user: user) } | ||||||
|  |   before { sign_in user, scope: :user } | ||||||
|  | 
 | ||||||
|  |   describe 'DELETE #destroy' do | ||||||
|  |     subject { delete :destroy, params: { id: id } } | ||||||
|  | 
 | ||||||
|  |     context 'when session activation exists' do | ||||||
|  |       let(:id) { session_activation.id } | ||||||
|  | 
 | ||||||
|  |       it 'destroys session activation' do | ||||||
|  |         is_expected.to redirect_to edit_user_registration_path | ||||||
|  |         expect(SessionActivation.find_by(id: id)).to be_nil | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'when session activation does not exist' do | ||||||
|  |       let(:id) { session_activation.id + 1000 } | ||||||
|  | 
 | ||||||
|  |       it 'destroys session activation' do | ||||||
|  |         is_expected.to have_http_status :not_found | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -6,10 +6,11 @@ describe StatusFinder do | ||||||
|   include RoutingHelper |   include RoutingHelper | ||||||
| 
 | 
 | ||||||
|   describe '#status' do |   describe '#status' do | ||||||
|  |     subject { described_class.new(url) } | ||||||
|  | 
 | ||||||
|     context 'with a status url' do |     context 'with a status url' do | ||||||
|       let(:status) { Fabricate(:status) } |       let(:status) { Fabricate(:status) } | ||||||
|       let(:url) { short_account_status_url(account_username: status.account.username, id: status.id) } |       let(:url) { short_account_status_url(account_username: status.account.username, id: status.id) } | ||||||
|       subject { described_class.new(url) } |  | ||||||
| 
 | 
 | ||||||
|       it 'finds the stream entry' do |       it 'finds the stream entry' do | ||||||
|         expect(subject.status).to eq(status) |         expect(subject.status).to eq(status) | ||||||
|  | @ -27,7 +28,6 @@ describe StatusFinder do | ||||||
|     context 'with a stream entry url' do |     context 'with a stream entry url' do | ||||||
|       let(:stream_entry) { Fabricate(:stream_entry) } |       let(:stream_entry) { Fabricate(:stream_entry) } | ||||||
|       let(:url) { account_stream_entry_url(stream_entry.account, stream_entry) } |       let(:url) { account_stream_entry_url(stream_entry.account, stream_entry) } | ||||||
|       subject { described_class.new(url) } |  | ||||||
| 
 | 
 | ||||||
|       it 'finds the stream entry' do |       it 'finds the stream entry' do | ||||||
|         expect(subject.status).to eq(stream_entry.status) |         expect(subject.status).to eq(stream_entry.status) | ||||||
|  | @ -37,7 +37,6 @@ describe StatusFinder do | ||||||
|     context 'with a remote url even if id exists on local' do |     context 'with a remote url even if id exists on local' do | ||||||
|       let(:status) { Fabricate(:status) } |       let(:status) { Fabricate(:status) } | ||||||
|       let(:url) { "https://example.com/users/test/statuses/#{status.id}" } |       let(:url) { "https://example.com/users/test/statuses/#{status.id}" } | ||||||
|       subject { described_class.new(url) } |  | ||||||
| 
 | 
 | ||||||
|       it 'raises an error' do |       it 'raises an error' do | ||||||
|         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) |         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|  | @ -46,7 +45,6 @@ describe StatusFinder do | ||||||
| 
 | 
 | ||||||
|     context 'with a plausible url' do |     context 'with a plausible url' do | ||||||
|       let(:url) { 'https://example.com/users/test/updates/123/embed' } |       let(:url) { 'https://example.com/users/test/updates/123/embed' } | ||||||
|       subject { described_class.new(url) } |  | ||||||
| 
 | 
 | ||||||
|       it 'raises an error' do |       it 'raises an error' do | ||||||
|         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) |         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|  | @ -55,7 +53,6 @@ describe StatusFinder do | ||||||
| 
 | 
 | ||||||
|     context 'with an unrecognized url' do |     context 'with an unrecognized url' do | ||||||
|       let(:url) { 'https://example.com/about' } |       let(:url) { 'https://example.com/about' } | ||||||
|       subject { described_class.new(url) } |  | ||||||
| 
 | 
 | ||||||
|       it 'raises an error' do |       it 'raises an error' do | ||||||
|         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) |         expect { subject.status }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|  |  | ||||||
|  | @ -81,12 +81,18 @@ RSpec.describe Glitch::KeywordMute, type: :model do | ||||||
|         expect(matcher.matches?('(hot take)', Unscoped)).to be_truthy |         expect(matcher.matches?('(hot take)', Unscoped)).to be_truthy | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'escapes metacharacters in keywords' do |       it 'escapes metacharacters in whole-word keywords' do | ||||||
|         Glitch::KeywordMute.create!(account: alice, keyword: '(hot take)') |         Glitch::KeywordMute.create!(account: alice, keyword: '(hot take)') | ||||||
| 
 | 
 | ||||||
|         expect(matcher.matches?('(hot take)', Unscoped)).to be_truthy |         expect(matcher.matches?('(hot take)', Unscoped)).to be_truthy | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  |       it 'escapes metacharacters in non-whole-word keywords' do | ||||||
|  |         Glitch::KeywordMute.create!(account: alice, keyword: '(-', whole_word: false) | ||||||
|  | 
 | ||||||
|  |         expect(matcher.matches?('bad (-)')).to be_truthy | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|       it 'uses case-folding rules appropriate for more than just English' do |       it 'uses case-folding rules appropriate for more than just English' do | ||||||
|         Glitch::KeywordMute.create!(account: alice, keyword: 'großeltern') |         Glitch::KeywordMute.create!(account: alice, keyword: 'großeltern') | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue