diff options
Diffstat (limited to 'app')
106 files changed, 1285 insertions, 700 deletions
diff --git a/app/controllers/api/v1/trends_controller.rb b/app/controllers/api/v1/trends_controller.rb deleted file mode 100644 index bcea9857e..000000000 --- a/app/controllers/api/v1/trends_controller.rb +++ /dev/null @@ -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 diff --git a/app/javascript/flavours/glitch/components/column_back_button.js b/app/javascript/flavours/glitch/components/column_back_button.js index 50c3bf11f..a562ef9b9 100644 --- a/app/javascript/flavours/glitch/components/column_back_button.js +++ b/app/javascript/flavours/glitch/components/column_back_button.js @@ -10,10 +10,10 @@ export default class ColumnBackButton extends React.PureComponent { handleClick = () => { // 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)) { - this.context.router.history.push('/'); - } else { + if (window.history.state) { this.context.router.history.goBack(); + } else { + this.context.router.history.push('/'); } } diff --git a/app/javascript/flavours/glitch/components/column_back_button_slim.js b/app/javascript/flavours/glitch/components/column_back_button_slim.js index 2cdf1b25b..c99c202af 100644 --- a/app/javascript/flavours/glitch/components/column_back_button_slim.js +++ b/app/javascript/flavours/glitch/components/column_back_button_slim.js @@ -10,10 +10,10 @@ export default class ColumnBackButtonSlim extends React.PureComponent { handleClick = () => { // 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)) { - this.context.router.history.push('/'); - } else { + if (window.history.state) { this.context.router.history.goBack(); + } else { + this.context.router.history.push('/'); } } diff --git a/app/javascript/flavours/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js index bfad6467d..72207637d 100644 --- a/app/javascript/flavours/glitch/components/column_header.js +++ b/app/javascript/flavours/glitch/components/column_header.js @@ -66,10 +66,10 @@ export default class ColumnHeader extends React.PureComponent { handleBackClick = () => { // 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)) { - this.context.router.history.push('/'); - } else { + if (window.history.state) { this.context.router.history.goBack(); + } else { + this.context.router.history.push('/'); } } diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index c93705266..a90ff491e 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -153,6 +153,11 @@ export default class Status extends ImmutablePureComponent { muted, prepend, } = this.props; + + // Prevent a crash when node is undefined. Not completely sure why this + // happens, might be because status === null. + if (node === undefined) return; + const autoCollapseSettings = settings.getIn(['collapsed', 'auto']); if (function () { diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 6ae4bc08d..5bc5d8406 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -188,7 +188,7 @@ export default class StatusActionBar extends ImmutablePureComponent { <IconButton className='status__action-bar-button' disabled={reblogDisabled} active={status.get('reblogged')} pressed={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblogMessage)} icon={reblogIcon} onClick={this.handleReblogClick} /> <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> {shareButton} - <IconButton className='status__action-bar-button' disabled={anonymousAccess} active={status.get('bookmarked')} pressed={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /> + <IconButton className='status__action-bar-button bookmark-icon' disabled={anonymousAccess} active={status.get('bookmarked')} pressed={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /> <div className='status__action-bar-dropdown'> <DropdownMenuContainer disabled={anonymousAccess} status={status} items={menu} icon='ellipsis-h' size={18} direction='right' ariaLabel={intl.formatMessage(messages.more)} /> diff --git a/app/javascript/flavours/glitch/components/status_icons.js b/app/javascript/flavours/glitch/components/status_icons.js index e354c45e4..c9747650f 100644 --- a/app/javascript/flavours/glitch/components/status_icons.js +++ b/app/javascript/flavours/glitch/components/status_icons.js @@ -47,9 +47,15 @@ export default class StatusIcons extends React.PureComponent { return ( <div className='status__info__icons'> + {status.get('in_reply_to_id', null) !== null ? ( + <i + className={`fa fa-fw fa-comment status__reply-icon`} + aria-hidden='true' + /> + ) : null} {mediaIcon ? ( <i - className={`fa fa-fw fa-${mediaIcon}`} + className={`fa fa-fw fa-${mediaIcon} status__media-icon`} aria-hidden='true' /> ) : null} diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js index ef8805377..976d7ba76 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -159,7 +159,7 @@ export default class ActionBar extends React.PureComponent { <div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblog_message)} icon={reblogIcon} onClick={this.handleReblogClick} /></div> <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div> {shareButton} - <div className='detailed-status__button'><IconButton active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div> + <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div> <div className='detailed-status__action-bar-dropdown'> <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' ariaLabel='More' /> diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js index 0e3a83bb6..4a7a7d0f4 100644 --- a/app/javascript/flavours/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -99,10 +99,6 @@ const keyMap = { @withRouter export default class UI extends React.Component { - static contextTypes = { - router: PropTypes.object.isRequired, - }; - static propTypes = { dispatch: PropTypes.func.isRequired, children: PropTypes.node, @@ -113,6 +109,7 @@ export default class UI extends React.Component { isComposing: PropTypes.bool, hasComposingText: PropTypes.bool, location: PropTypes.object, + router: PropTypes.object, intl: PropTypes.object.isRequired, dropdownMenuIsOpen: PropTypes.bool, }; @@ -200,7 +197,7 @@ export default class UI extends React.Component { handleServiceWorkerPostMessage = ({ data }) => { if (data.type === 'navigate') { - this.context.router.history.push(data.path); + this.props.router.history.push(data.path); } else { console.warn('Unknown message type:', data.type); } @@ -305,10 +302,11 @@ export default class UI extends React.Component { } handleHotkeyBack = () => { - if (window.history && window.history.length === 1) { - this.context.router.history.push('/'); - } else { + // if history is exhausted, or we would leave mastodon, just go to root. + if (window.history.state) { this.context.router.history.goBack(); + } else { + this.context.router.history.push('/'); } } @@ -318,54 +316,54 @@ export default class UI extends React.Component { handleHotkeyToggleHelp = () => { if (this.props.location.pathname === '/keyboard-shortcuts') { - this.context.router.history.goBack(); + this.props.router.history.goBack(); } else { - this.context.router.history.push('/keyboard-shortcuts'); + this.props.router.history.push('/keyboard-shortcuts'); } } handleHotkeyGoToHome = () => { - this.context.router.history.push('/timelines/home'); + this.props.router.history.push('/timelines/home'); } handleHotkeyGoToNotifications = () => { - this.context.router.history.push('/notifications'); + this.props.router.history.push('/notifications'); } handleHotkeyGoToLocal = () => { - this.context.router.history.push('/timelines/public/local'); + this.props.router.history.push('/timelines/public/local'); } handleHotkeyGoToFederated = () => { - this.context.router.history.push('/timelines/public'); + this.props.router.history.push('/timelines/public'); } handleHotkeyGoToDirect = () => { - this.context.router.history.push('/timelines/direct'); + this.props.router.history.push('/timelines/direct'); } handleHotkeyGoToStart = () => { - this.context.router.history.push('/getting-started'); + this.props.router.history.push('/getting-started'); } handleHotkeyGoToFavourites = () => { - this.context.router.history.push('/favourites'); + this.props.router.history.push('/favourites'); } handleHotkeyGoToPinned = () => { - this.context.router.history.push('/pinned'); + this.props.router.history.push('/pinned'); } handleHotkeyGoToProfile = () => { - this.context.router.history.push(`/accounts/${me}`); + this.props.router.history.push(`/accounts/${me}`); } handleHotkeyGoToBlocked = () => { - this.context.router.history.push('/blocks'); + this.props.router.history.push('/blocks'); } handleHotkeyGoToMuted = () => { - this.context.router.history.push('/mutes'); + this.props.router.history.push('/mutes'); } render () { diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 0fa940766..487bb7ffb 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -248,6 +248,10 @@ color: $gold-star; } +.bookmark-icon.active { + color: $red-bookmark; +} + .notification__display-name { color: inherit; font-weight: 500; diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index 733845c5f..2b31e2dcb 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -331,8 +331,13 @@ height: 1em; color: $action-button-color; - .status__visibility-icon { + .status__media-icon { padding-left: 6px; + padding-right: 1px; + } + + .status__visibility-icon { + padding-left: 4px; } } diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss index cc08fd06f..bde808fe2 100644 --- a/app/javascript/flavours/glitch/styles/variables.scss +++ b/app/javascript/flavours/glitch/styles/variables.scss @@ -6,6 +6,8 @@ $error-red: #df405a; // Cerise $warning-red: #ff5050; // Sunset Orange $gold-star: #ca8f04; // Dark Goldenrod +$red-bookmark: $warning-red; + // Values from the classic Mastodon UI $classic-base-color: #282c37; // Midnight Express $classic-primary-color: #9baec8; // Echo Blue diff --git a/app/javascript/flavours/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js index c00210677..b76826481 100644 --- a/app/javascript/flavours/glitch/util/main.js +++ b/app/javascript/flavours/glitch/util/main.js @@ -28,11 +28,6 @@ function main() { store.dispatch(registerPushNotifications.register()); } perf.stop('main()'); - - // remember the initial URL - if (window.history && typeof window._mastoInitialHistoryLen === 'undefined') { - window._mastoInitialHistoryLen = window.history.length; - } }); } diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index 849cb4f5a..3e1e5f270 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -29,6 +29,8 @@ export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL'; export const STATUS_REVEAL = 'STATUS_REVEAL'; export const STATUS_HIDE = 'STATUS_HIDE'; +export const REDRAFT = 'REDRAFT'; + export function fetchStatusRequest(id, skipLoading) { return { 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) => { + const status = getState().getIn(['statuses', id]); + dispatch(deleteStatusRequest(id)); api(getState).delete(`/api/v1/statuses/${id}`).then(() => { evictStatus(id); dispatch(deleteStatusSuccess(id)); dispatch(deleteFromTimelines(id)); + + if (withRedraft) { + dispatch(redraft(status)); + } }).catch(error => { dispatch(deleteStatusFail(id, error)); }); diff --git a/app/javascript/mastodon/actions/trends.js b/app/javascript/mastodon/actions/trends.js deleted file mode 100644 index 853e4f60a..000000000 --- a/app/javascript/mastodon/actions/trends.js +++ /dev/null @@ -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, -}); diff --git a/app/javascript/mastodon/components/collapsable.js b/app/javascript/mastodon/components/collapsable.js deleted file mode 100644 index d5d431186..000000000 --- a/app/javascript/mastodon/components/collapsable.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import Motion from '../features/ui/util/optional_motion'; -import spring from 'react-motion/lib/spring'; -import PropTypes from 'prop-types'; - -const Collapsable = ({ fullHeight, isVisible, children }) => ( - <Motion defaultStyle={{ opacity: !isVisible ? 0 : 100, height: isVisible ? fullHeight : 0 }} style={{ opacity: spring(!isVisible ? 0 : 100), height: spring(!isVisible ? 0 : fullHeight) }}> - {({ opacity, height }) => ( - <div style={{ height: `${height}px`, overflow: 'hidden', opacity: opacity / 100, display: Math.floor(opacity) === 0 ? 'none' : 'block' }}> - {children} - </div> - )} - </Motion> -); - -Collapsable.propTypes = { - fullHeight: PropTypes.number.isRequired, - isVisible: PropTypes.bool.isRequired, - children: PropTypes.node.isRequired, -}; - -export default Collapsable; diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js new file mode 100644 index 000000000..a407df31e --- /dev/null +++ b/app/javascript/mastodon/components/hashtag.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { Sparklines, SparklinesCurve } from 'react-sparklines'; +import { Link } from 'react-router-dom'; +import { FormattedMessage } from 'react-intl'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { shortNumberFormat } from '../utils/numbers'; + +const Hashtag = ({ hashtag }) => ( + <div className='trends__item'> + <div className='trends__item__name'> + <Link to={`/timelines/tag/${hashtag.get('name')}`}> + #<span>{hashtag.get('name')}</span> + </Link> + + <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} /> + </div> + + <div className='trends__item__current'> + {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']))} + </div> + + <div className='trends__item__sparkline'> + <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> + <SparklinesCurve style={{ fill: 'none' }} /> + </Sparklines> + </div> + </div> +); + +Hashtag.propTypes = { + hashtag: ImmutablePropTypes.map.isRequired, +}; + +export default Hashtag; diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index d605dbc8a..0ae21e3f0 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -9,6 +9,7 @@ import { me } from '../initial_state'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, + redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, @@ -88,6 +89,10 @@ export default class StatusActionBar extends ImmutablePureComponent { this.props.onDelete(this.props.status); } + handleRedraftClick = () => { + this.props.onDelete(this.props.status, true); + } + handlePinClick = () => { 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.redraft), action: this.handleRedraftClick }); } else { 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 }); diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index f22509edf..3e7b5215b 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -33,6 +33,8 @@ import { showAlertForError } from '../actions/alerts'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, + redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' }, blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, }); @@ -91,14 +93,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ })); }, - onDelete (status) { + onDelete (status, withRedraft = false) { if (!deleteModal) { - dispatch(deleteStatus(status.get('id'))); + dispatch(deleteStatus(status.get('id'), withRedraft)); } else { dispatch(openModal('CONFIRM', { - message: intl.formatMessage(messages.deleteMessage), - confirm: intl.formatMessage(messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'))), + message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), + confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), + onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), })); } }, diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js index 23dbf32bc..2d0f72be2 100644 --- a/app/javascript/mastodon/features/account/components/action_bar.js +++ b/app/javascript/mastodon/features/account/components/action_bar.js @@ -3,8 +3,9 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; 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 { shortNumberFormat } from '../../../utils/numbers'; const messages = defineMessages({ mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, @@ -23,6 +24,14 @@ const messages = defineMessages({ unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' }, hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' }, showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' }, + pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' }, + preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, + follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, + favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, + lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, + blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, + domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' }, + mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, }); @injectIntl @@ -54,17 +63,29 @@ export default class ActionBar extends React.PureComponent { let menu = []; let extraInfo = ''; - menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention }); - menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect }); + if (account.get('id') !== me) { + menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention }); + menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect }); + menu.push(null); + } if ('share' in navigator) { menu.push({ text: intl.formatMessage(messages.share, { name: account.get('username') }), action: this.handleShare }); + menu.push(null); } - menu.push(null); - if (account.get('id') === me) { menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' }); + menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' }); + menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' }); + menu.push(null); + menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' }); + menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' }); + menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' }); + menu.push(null); + menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' }); + menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' }); + menu.push({ text: intl.formatMessage(messages.domain_blocks), to: '/domain_blocks' }); } else { if (account.getIn(['relationship', 'following'])) { if (account.getIn(['relationship', 'showing_reblogs'])) { @@ -126,17 +147,17 @@ export default class ActionBar extends React.PureComponent { <div className='account__action-bar-links'> <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}> <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 className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}> <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 className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}> <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span> - <strong><FormattedNumber value={account.get('followers_count')} /></strong> + <strong>{shortNumberFormat(account.get('followers_count'))}</strong> </Link> </div> </div> diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 7358053da..dd2cd406b 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -14,6 +14,7 @@ const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' }, unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, + edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, }); class Avatar extends ImmutablePureComponent { @@ -74,6 +75,10 @@ export default class Header extends ImmutablePureComponent { intl: PropTypes.object.isRequired, }; + openEditProfile = () => { + window.open('/settings/profile', '_blank'); + } + render () { const { account, intl } = this.props; @@ -118,6 +123,12 @@ export default class Header extends ImmutablePureComponent { </div> ); } + } else { + actionBtn = ( + <div className='account--action-button'> + <IconButton size={26} icon='pencil' title={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} /> + </div> + ); } if (account.get('moved') && !account.getIn(['relationship', 'following'])) { diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 6cc594c88..60485e3c6 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -7,7 +7,6 @@ import ReplyIndicatorContainer from '../containers/reply_indicator_container'; import AutosuggestTextarea from '../../../components/autosuggest_textarea'; import UploadButtonContainer from '../containers/upload_button_container'; import { defineMessages, injectIntl } from 'react-intl'; -import Collapsable from '../../../components/collapsable'; import SpoilerButtonContainer from '../containers/spoiler_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import SensitiveButtonContainer from '../containers/sensitive_button_container'; @@ -160,17 +159,15 @@ export default class ComposeForm extends ImmutablePureComponent { <div className='compose-form'> <WarningContainer /> - <Collapsable isVisible={this.props.spoiler} fullHeight={50}> - <div className='spoiler-input'> - <label> - <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span> - <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} type='text' className='spoiler-input__input' id='cw-spoiler-input' /> - </label> - </div> - </Collapsable> - <ReplyIndicatorContainer /> + <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`}> + <label> + <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span> + <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} type='text' className='spoiler-input__input' id='cw-spoiler-input' /> + </label> + </div> + <div className='compose-form__autosuggest-wrapper'> <AutosuggestTextarea ref={this.setAutosuggestTextarea} diff --git a/app/javascript/mastodon/features/compose/components/search_results.js b/app/javascript/mastodon/features/compose/components/search_results.js index 445bf27bb..c351b84bb 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.js +++ b/app/javascript/mastodon/features/compose/components/search_results.js @@ -1,77 +1,23 @@ import React from 'react'; -import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, FormattedNumber } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import AccountContainer from '../../../containers/account_container'; import StatusContainer from '../../../containers/status_container'; -import { Link } from 'react-router-dom'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { Sparklines, SparklinesCurve } from 'react-sparklines'; - -const shortNumberFormat = number => { - if (number < 1000) { - return <FormattedNumber value={number} />; - } else { - return <React.Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</React.Fragment>; - } -}; - -const renderHashtag = hashtag => ( - <div className='trends__item' key={hashtag.get('name')}> - <div className='trends__item__name'> - <Link to={`/timelines/tag/${hashtag.get('name')}`}> - #<span>{hashtag.get('name')}</span> - </Link> - - <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} /> - </div> - - <div className='trends__item__current'> - {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']))} - </div> - - <div className='trends__item__sparkline'> - <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> - <SparklinesCurve style={{ fill: 'none' }} /> - </Sparklines> - </div> - </div> -); +import Hashtag from '../../../components/hashtag'; export default class SearchResults extends ImmutablePureComponent { static propTypes = { results: ImmutablePropTypes.map.isRequired, - trends: ImmutablePropTypes.list, - fetchTrends: PropTypes.func.isRequired, }; - componentDidMount () { - const { fetchTrends } = this.props; - fetchTrends(); - } - render () { - const { results, trends } = this.props; + const { results } = this.props; let accounts, statuses, hashtags; 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 => renderHashtag(hashtag))} - </div> - </div> - ); - } - if (results.get('accounts') && results.get('accounts').size > 0) { count += results.get('accounts').size; accounts = ( @@ -100,7 +46,7 @@ export default class SearchResults extends ImmutablePureComponent { <div className='search-results__section'> <h5><i className='fa fa-fw fa-hashtag' /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5> - {results.get('hashtags').map(hashtag => renderHashtag(hashtag))} + {results.get('hashtags').map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} </div> ); } diff --git a/app/javascript/mastodon/features/compose/containers/search_results_container.js b/app/javascript/mastodon/features/compose/containers/search_results_container.js index 7273460e2..16d95d417 100644 --- a/app/javascript/mastodon/features/compose/containers/search_results_container.js +++ b/app/javascript/mastodon/features/compose/containers/search_results_container.js @@ -1,14 +1,8 @@ import { connect } from 'react-redux'; import SearchResults from '../components/search_results'; -import { fetchTrends } from '../../../actions/trends'; const mapStateToProps = state => ({ results: state.getIn(['search', 'results']), - trends: state.get('trends'), }); -const mapDispatchToProps = dispatch => ({ - fetchTrends: () => dispatch(fetchTrends()), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); +export default connect(mapStateToProps)(SearchResults); diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index d8e9ad9ee..df1ec4915 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -75,7 +75,7 @@ export default class Compose extends React.PureComponent { const { columns } = this.props; header = ( <nav className='drawer__header'> - <Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)} aria-label={intl.formatMessage(messages.start)}><i role='img' className='fa fa-fw fa-asterisk' /></Link> + <Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)} aria-label={intl.formatMessage(messages.start)}><i role='img' className='fa fa-fw fa-bars' /></Link> {!columns.some(column => column.get('id') === 'HOME') && ( <Link to='/timelines/home' className='drawer__tab' title={intl.formatMessage(messages.home_timeline)} aria-label={intl.formatMessage(messages.home_timeline)}><i role='img' className='fa fa-fw fa-home' /></Link> )} diff --git a/app/javascript/mastodon/features/domain_blocks/index.js b/app/javascript/mastodon/features/domain_blocks/index.js index 3b29e2a26..b8a942d6c 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.js +++ b/app/javascript/mastodon/features/domain_blocks/index.js @@ -28,7 +28,7 @@ export default class Blocks extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - domains: ImmutablePropTypes.list, + domains: ImmutablePropTypes.orderedSet, intl: PropTypes.object.isRequired, }; diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 4a249f301..115dfd2b9 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -10,34 +10,32 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { me } from '../../initial_state'; import { fetchFollowRequests } from '../../actions/accounts'; import { List as ImmutableList } from 'immutable'; +import { Link } from 'react-router-dom'; +import NavigationBar from '../compose/components/navigation_bar'; const messages = defineMessages({ - heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' }, notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' }, public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' }, - navigation_subheading: { id: 'column_subheading.navigation', defaultMessage: 'Navigation' }, settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' }, community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' }, direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, - sign_out: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' }, mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, - info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' }, pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, - keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' }, + discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' }, + personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' }, + security: { id: 'navigation_bar.security', defaultMessage: 'Security' }, }); const mapStateToProps = state => ({ myAccount: state.getIn(['accounts', me]), - columns: state.getIn(['settings', 'columns']), unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size, - unreadNotifications: state.getIn(['notifications', 'unread']), }); const mapDispatchToProps = dispatch => ({ @@ -77,65 +75,73 @@ export default class GettingStarted extends ImmutablePureComponent { } render () { - const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications } = this.props; + const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props; const navItems = []; + let i = 1; + let height = 0; if (multiColumn) { - if (!columns.find(item => item.get('id') === 'HOME')) { - navItems.push(<ColumnLink key='0' icon='home' text={intl.formatMessage(messages.home_timeline)} to='/timelines/home' />); - } - - if (!columns.find(item => item.get('id') === 'NOTIFICATIONS')) { - navItems.push(<ColumnLink key='1' icon='bell' text={intl.formatMessage(messages.notifications)} badge={badgeDisplay(unreadNotifications)} to='/notifications' />); - } - - if (!columns.find(item => item.get('id') === 'COMMUNITY')) { - navItems.push(<ColumnLink key='2' icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />); - } - - if (!columns.find(item => item.get('id') === 'PUBLIC')) { - navItems.push(<ColumnLink key='3' icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />); - } - } - - if (!multiColumn || !columns.find(item => item.get('id') === 'DIRECT')) { - navItems.push(<ColumnLink key='4' icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />); + navItems.push( + <ColumnSubheading key={i++} text={intl.formatMessage(messages.discover)} />, + <ColumnLink key={i++} icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />, + <ColumnLink key={i++} icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />, + <ColumnSubheading key={i++} text={intl.formatMessage(messages.personal)} /> + ); + + height += 34*2 + 48*2; } navItems.push( - <ColumnLink key='5' icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />, - <ColumnLink key='6' icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' /> + <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />, + <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />, + <ColumnLink key={i++} icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' /> ); + height += 48*3; + if (myAccount.get('locked')) { - navItems.push(<ColumnLink key='7' icon='users' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />); + navItems.push(<ColumnLink key={i++} icon='users' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />); + height += 48; } - if (multiColumn) { - navItems.push(<ColumnLink key='8' icon='question' text={intl.formatMessage(messages.keyboard_shortcuts)} to='/keyboard-shortcuts' />); - } + if (!multiColumn) { + navItems.push( + <ColumnSubheading key={i++} text={intl.formatMessage(messages.settings_subheading)} />, + <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' />, + <ColumnLink key={i++} icon='lock' text={intl.formatMessage(messages.security)} href='/auth/edit' /> + ); - navItems.push(<ColumnLink key='9' icon='book' text={intl.formatMessage(messages.info)} href='/about/more' />); + height += 34 + 48*2; + } return ( - <Column icon='asterisk' heading={intl.formatMessage(messages.heading)} hideHeadingOnMobile> - <div className='getting-started__wrapper'> - <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} /> + <Column> + {multiColumn && <div className='column-header__wrapper'> + <h1 className='column-header'> + <button> + <i className='fa fa-bars fa-fw column-header__icon' /> + <FormattedMessage id='getting_started.heading' defaultMessage='Getting started' /> + </button> + </h1> + </div>} + + <div className='getting-started__wrapper' style={{ height }}> + {!multiColumn && <NavigationBar account={myAccount} />} {navItems} - <ColumnSubheading text={intl.formatMessage(messages.settings_subheading)} /> - <ColumnLink icon='thumb-tack' text={intl.formatMessage(messages.pins)} to='/pinned' /> - <ColumnLink icon='volume-off' text={intl.formatMessage(messages.mutes)} to='/mutes' /> - <ColumnLink icon='ban' text={intl.formatMessage(messages.blocks)} to='/blocks' /> - <ColumnLink icon='minus-circle' text={intl.formatMessage(messages.domain_blocks)} to='/domain_blocks' /> - <ColumnLink icon='cog' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' /> - <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href='/auth/sign_out' method='delete' /> </div> - <div className='static-content getting-started'> - <p> - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a> • <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a> • <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a> - </p> + {!multiColumn && <div className='flex-spacer' />} + + <div className='getting-started getting-started__footer'> + <ul> + {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} + <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this instance' /></a> · </li> + <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> + <li><a href='https://github.com/tootsuite/documentation#documentation' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li> + <li><a href='/auth/sign_out' data-method='delete'><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li> + </ul> + <p> <FormattedMessage id='getting_started.open_source_notice' diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index 9162e1326..541499668 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -8,6 +8,7 @@ import { me } from '../../../initial_state'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, + redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' }, direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' }, mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' }, reply: { id: 'status.reply', defaultMessage: 'Reply' }, @@ -67,6 +68,10 @@ export default class ActionBar extends React.PureComponent { this.props.onDelete(this.props.status); } + handleRedraftClick = () => { + this.props.onDelete(this.props.status, true); + } + handleDirectClick = () => { 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(null); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); + menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { 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 }); diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index 505a88a3f..ca792043f 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -47,6 +47,8 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, + redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' }, + redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' }, blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, @@ -77,9 +79,12 @@ const makeMapStateToProps = () => { let id = ids.shift(); const replies = state.getIn(['contexts', 'replies', id]); + if (status.get('id') !== id) { + mutable.push(id); + } + if (replies) { - replies.forEach(reply => { - mutable.push(reply); + replies.reverse().forEach(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; if (!deleteModal) { - dispatch(deleteStatus(status.get('id'))); + dispatch(deleteStatus(status.get('id'), withRedraft)); } else { dispatch(openModal('CONFIRM', { - message: intl.formatMessage(messages.deleteMessage), - confirm: intl.formatMessage(messages.deleteConfirm), - onConfirm: () => dispatch(deleteStatus(status.get('id'))), + message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage), + confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm), + onConfirm: () => dispatch(deleteStatus(status.get('id'), withRedraft)), })); } } diff --git a/app/javascript/mastodon/features/trends/index.js b/app/javascript/mastodon/features/trends/index.js new file mode 100644 index 000000000..f33af3e2e --- /dev/null +++ b/app/javascript/mastodon/features/trends/index.js @@ -0,0 +1,66 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import { connect } from 'react-redux'; +import { injectIntl, defineMessages } from 'react-intl'; +import Column from '../ui/components/column'; +import ColumnHeader from '../../components/column_header'; +import Hashtag from '../../components/hashtag'; +import classNames from 'classnames'; +import { fetchTrends } from '../../actions/trends'; + +const messages = defineMessages({ + title: { id: 'trends.header', defaultMessage: 'Trending now' }, + refreshTrends: { id: 'trends.refresh', defaultMessage: 'Refresh trends' }, +}); + +const mapStateToProps = state => ({ + trends: state.getIn(['trends', 'items']), + loading: state.getIn(['trends', 'isLoading']), +}); + +const mapDispatchToProps = dispatch => ({ + fetchTrends: () => dispatch(fetchTrends()), +}); + +@connect(mapStateToProps, mapDispatchToProps) +@injectIntl +export default class Trends extends ImmutablePureComponent { + + static propTypes = { + intl: PropTypes.object.isRequired, + trends: ImmutablePropTypes.list, + fetchTrends: PropTypes.func.isRequired, + loading: PropTypes.bool, + }; + + componentDidMount () { + this.props.fetchTrends(); + } + + handleRefresh = () => { + this.props.fetchTrends(); + } + + render () { + const { trends, loading, intl } = this.props; + + return ( + <Column> + <ColumnHeader + icon='fire' + title={intl.formatMessage(messages.title)} + extraButton={( + <button className='column-header__button' title={intl.formatMessage(messages.refreshTrends)} aria-label={intl.formatMessage(messages.refreshTrends)} onClick={this.handleRefresh}><i className={classNames('fa', 'fa-refresh', { 'fa-spin': loading })} /></button> + )} + /> + + <div className='scrollable'> + {trends && trends.map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} + </div> + </Column> + ); + } + +} diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js index 8616f0315..90f001319 100644 --- a/app/javascript/mastodon/features/ui/components/report_modal.js +++ b/app/javascript/mastodon/features/ui/components/report_modal.js @@ -63,6 +63,12 @@ export default class ReportModal extends ImmutablePureComponent { this.props.dispatch(submitReport()); } + handleKeyDown = e => { + if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) { + this.handleSubmit(); + } + } + componentDidMount () { 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)} value={comment} onChange={this.handleCommentChange} + onKeyDown={this.handleKeyDown} disabled={isSubmitting} /> diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index adb856b92..f1409b946 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -132,11 +132,12 @@ class SwitchingColumnsArea extends React.PureComponent { render () { const { children } = this.props; const { mobile } = this.state; + const redirect = mobile ? <Redirect from='/' to='/timelines/home' exact /> : <Redirect from='/' to='/getting-started' exact />; return ( <ColumnsAreaContainer ref={this.setRef} singleColumn={mobile}> <WrappedSwitch> - <Redirect from='/' to='/getting-started' exact /> + {redirect} <WrappedRoute path='/getting-started' component={GettingStarted} content={children} /> <WrappedRoute path='/keyboard-shortcuts' component={KeyboardShortcuts} content={children} /> <WrappedRoute path='/timelines/home' component={HomeTimeline} content={children} /> diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index c8e37a366..60d4acc39 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -58,7 +58,6 @@ "column_header.pin": "تدبيس", "column_header.show_settings": "عرض الإعدادات", "column_header.unpin": "فك التدبيس", - "column_subheading.navigation": "التصفح", "column_subheading.settings": "الإعدادات", "compose_form.direct_message_warning": "لن يَظهر هذا التبويق إلا للمستخدمين المذكورين.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "متأكد من أنك تود حظر إسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.", "confirmations.mute.confirm": "أكتم", "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.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", "embed.instructions": "يمكنكم إدماج هذه الحالة على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", @@ -112,11 +113,10 @@ "empty_column.public": "لا يوجد أي شيء هنا ! قم بنشر شيء ما للعامة، أو إتبع مستخدمين آخرين في الخوادم المثيلة الأخرى لملء خيط المحادثات العام", "follow_request.authorize": "ترخيص", "follow_request.reject": "رفض", - "getting_started.appsshort": "تطبيقات", - "getting_started.faq": "أسئلة وأجوبة شائعة", + "getting_started.documentation": "Documentation", "getting_started.heading": "إستعدّ للبدء", "getting_started.open_source_notice": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على جيت هب {github}.", - "getting_started.userguide": "دليل المستخدم", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "متقدمة", "home.column_settings.basic": "أساسية", "home.column_settings.filter_regex": "تصفية حسب التعبيرات العادية", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "الحسابات المحجوبة", "navigation_bar.community_timeline": "الخيط العام المحلي", "navigation_bar.direct": "الرسائل المباشِرة", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "النطاقات المخفية", "navigation_bar.edit_profile": "تعديل الملف الشخصي", "navigation_bar.favourites": "المفضلة", @@ -169,9 +170,11 @@ "navigation_bar.lists": "القوائم", "navigation_bar.logout": "خروج", "navigation_bar.mutes": "الحسابات المكتومة", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "التبويقات المثبتة", "navigation_bar.preferences": "التفضيلات", "navigation_bar.public_timeline": "الخيط العام الموحد", + "navigation_bar.security": "Security", "notification.favourite": "{name} أعجب بمنشورك", "notification.follow": "{name} يتابعك", "notification.mention": "{name} ذكرك", @@ -263,6 +266,7 @@ "status.reblog": "رَقِّي", "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", "status.reblogged_by": "{name} رقى", + "status.redraft": "Delete & re-draft", "status.reply": "ردّ", "status.replyAll": "رُد على الخيط", "status.report": "إبلِغ عن @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "البحث", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.", "upload_area.title": "إسحب ثم أفلت للرفع", "upload_button.label": "إضافة وسائط", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 9ac5aad9e..ebee044b8 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Mute", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Първи стъпки", "getting_started.open_source_notice": "Mastodon е софтуер с отворен код. Можеш да помогнеш или да докладваш за проблеми в Github: {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Редактирай профил", "navigation_bar.favourites": "Favourites", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Излизане", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Предпочитания", "navigation_bar.public_timeline": "Публичен канал", + "navigation_bar.security": "Security", "notification.favourite": "{name} хареса твоята публикация", "notification.follow": "{name} те последва", "notification.mention": "{name} те спомена", @@ -263,6 +266,7 @@ "status.reblog": "Споделяне", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} сподели", + "status.redraft": "Delete & re-draft", "status.reply": "Отговор", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Добави медия", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 8fd42ca34..48b4d28cd 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -58,7 +58,6 @@ "column_header.pin": "Fixa", "column_header.show_settings": "Mostra la configuració", "column_header.unpin": "No fixis", - "column_subheading.navigation": "Navegació", "column_subheading.settings": "Configuració", "compose_form.direct_message_warning": "Aquest toot només serà enviat als usuaris esmentats. De totes maneres, els operadors de la teva o de qualsevol de les instàncies receptores poden inspeccionar aquest missatge.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Silencia", "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.message": "Estàs segur que vols deixar de seguir {name}?", "embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.", @@ -112,11 +113,10 @@ "empty_column.public": "No hi ha res aquí! Escriu alguna cosa públicament o segueix manualment usuaris d'altres instàncies per omplir-ho", "follow_request.authorize": "Autoritzar", "follow_request.reject": "Rebutjar", - "getting_started.appsshort": "Aplicacions", - "getting_started.faq": "PMF", + "getting_started.documentation": "Documentation", "getting_started.heading": "Començant", "getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir o informar de problemes a GitHub a {github}.", - "getting_started.userguide": "Guia de l'usuari", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avançat", "home.column_settings.basic": "Bàsic", "home.column_settings.filter_regex": "Filtrar per expressió regular", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Usuaris bloquejats", "navigation_bar.community_timeline": "Línia de temps Local", "navigation_bar.direct": "Missatges directes", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Dominis ocults", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favorits", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Llistes", "navigation_bar.logout": "Tancar sessió", "navigation_bar.mutes": "Usuaris silenciats", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toots fixats", "navigation_bar.preferences": "Preferències", "navigation_bar.public_timeline": "Línia de temps federada", + "navigation_bar.security": "Security", "notification.favourite": "{name} ha afavorit el teu estat", "notification.follow": "{name} et segueix", "notification.mention": "{name} t'ha esmentat", @@ -263,6 +266,7 @@ "status.reblog": "Impuls", "status.reblog_private": "Impulsar a l'audiència original", "status.reblogged_by": "{name} ha retootejat", + "status.redraft": "Delete & re-draft", "status.reply": "Respondre", "status.replyAll": "Respondre al tema", "status.report": "Informar sobre @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Cerca", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "El vostre esborrany es perdrà si sortiu de Mastodon.", "upload_area.title": "Arrossega i deixa anar per carregar", "upload_button.label": "Afegir multimèdia", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index bc75813ea..11bb662d8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -58,7 +58,6 @@ "column_header.pin": "Puntarulà", "column_header.show_settings": "Mustrà i parametri", "column_header.unpin": "Spuntarulà", - "column_subheading.navigation": "Navigazione", "column_subheading.settings": "Parametri", "compose_form.direct_message_warning": "Solu l'utilizatori mintuvati puderenu vede stu statutu.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Piattà", "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.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", @@ -112,11 +113,10 @@ "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altre istanze per empie a linea pubblica", "follow_request.authorize": "Auturizà", "follow_request.reject": "Righjittà", - "getting_started.appsshort": "Applicazione", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Per principià", "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.", - "getting_started.userguide": "Guida d'utilizazione", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avanzati", "home.column_settings.basic": "Bàsichi", "home.column_settings.filter_regex": "Filtrà cù spressione regulare (regex)", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Utilizatori bluccati", "navigation_bar.community_timeline": "Linea pubblica lucale", "navigation_bar.direct": "Missaghji diretti", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Duminii piattati", "navigation_bar.edit_profile": "Mudificà u prufile", "navigation_bar.favourites": "Favuriti", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Liste", "navigation_bar.logout": "Scunnettassi", "navigation_bar.mutes": "Utilizatori piattati", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Statuti puntarulati", "navigation_bar.preferences": "Preferenze", "navigation_bar.public_timeline": "Linea pubblica glubale", + "navigation_bar.security": "Security", "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti", "notification.follow": "{name} v'hà seguitatu", "notification.mention": "{name} v'hà mintuvatu", @@ -219,7 +222,7 @@ "privacy.unlisted.long": "Ùn mette micca nant'a linea pubblica (ma tutt'u mondu pò vede u statutu nant'à u vostru prufile)", "privacy.unlisted.short": "Micca listatu", "regeneration_indicator.label": "Caricamentu…", - "regeneration_indicator.sublabel": "Priparazione di a vostra pagina d'accolta", + "regeneration_indicator.sublabel": "Priparazione di a vostra pagina d'accolta!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "avà", @@ -263,6 +266,7 @@ "status.reblog": "Sparte", "status.reblog_private": "Sparte à l'audienza uriginale", "status.reblogged_by": "{name} hà spartutu", + "status.redraft": "Delete & re-draft", "status.reply": "Risponde", "status.replyAll": "Risponde à tutti", "status.report": "Palisà @{name}", @@ -282,12 +286,13 @@ "tabs_bar.search": "Cercà", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", "upload_area.title": "Drag & drop per caricà un fugliale", "upload_button.label": "Aghjunghje un media", "upload_form.description": "Discrive per i malvistosi", "upload_form.focus": "Riquatrà", - "upload_form.undo": "Annullà", + "upload_form.undo": "Sguassà", "upload_progress.label": "Caricamentu...", "video.close": "Chjudà a video", "video.exit_fullscreen": "Caccià u pienu screnu", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 29756aff0..7ccf38059 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -58,7 +58,6 @@ "column_header.pin": "Anheften", "column_header.show_settings": "Einstellungen anzeigen", "column_header.unpin": "Lösen", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Einstellungen", "compose_form.direct_message_warning": "Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Stummschalten", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Instanzen, um die Zeitleiste aufzufüllen", "follow_request.authorize": "Erlauben", "follow_request.reject": "Ablehnen", - "getting_started.appsshort": "Apps", - "getting_started.faq": "Häufig gestellte Fragen", + "getting_started.documentation": "Documentation", "getting_started.heading": "Erste Schritte", "getting_started.open_source_notice": "Mastodon ist quelloffene Software. Du kannst auf GitHub unter {github} dazu beitragen oder Probleme melden.", - "getting_started.userguide": "Bedienungsanleitung", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Erweitert", "home.column_settings.basic": "Einfach", "home.column_settings.filter_regex": "Mit regulären Ausdrücken filtern", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blockierte Profile", "navigation_bar.community_timeline": "Lokale Zeitleiste", "navigation_bar.direct": "Direktnachrichten", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Versteckte Domains", "navigation_bar.edit_profile": "Profil bearbeiten", "navigation_bar.favourites": "Favoriten", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listen", "navigation_bar.logout": "Abmelden", "navigation_bar.mutes": "Stummgeschaltete Profile", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Angeheftete Beiträge", "navigation_bar.preferences": "Einstellungen", "navigation_bar.public_timeline": "Föderierte Zeitleiste", + "navigation_bar.security": "Security", "notification.favourite": "{name} hat deinen Beitrag favorisiert", "notification.follow": "{name} folgt dir", "notification.mention": "{name} hat dich erwähnt", @@ -263,6 +266,7 @@ "status.reblog": "Teilen", "status.reblog_private": "An das eigentliche Publikum teilen", "status.reblogged_by": "{name} teilte", + "status.redraft": "Delete & re-draft", "status.reply": "Antworten", "status.replyAll": "Auf Thread antworten", "status.report": "@{name} melden", @@ -282,6 +286,7 @@ "tabs_bar.search": "Suchen", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", "upload_area.title": "Zum Hochladen hereinziehen", "upload_button.label": "Mediendatei hinzufügen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index ef2a796a3..464592121 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -121,6 +121,15 @@ { "descriptors": [ { + "defaultMessage": "{count} {rawCount, plural, one {person} other {people}} talking", + "id": "trends.count_by_accounts" + } + ], + "path": "app/javascript/mastodon/components/hashtag.json" + }, + { + "descriptors": [ + { "defaultMessage": "Load more", "id": "status.load_more" } @@ -211,6 +220,10 @@ "id": "status.delete" }, { + "defaultMessage": "Delete & re-draft", + "id": "status.redraft" + }, + { "defaultMessage": "Direct message @{name}", "id": "status.direct" }, @@ -369,6 +382,14 @@ "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", "id": "confirmations.block.confirm" }, @@ -501,6 +522,38 @@ "id": "account.show_reblogs" }, { + "defaultMessage": "Pinned toots", + "id": "navigation_bar.pins" + }, + { + "defaultMessage": "Preferences", + "id": "navigation_bar.preferences" + }, + { + "defaultMessage": "Follow requests", + "id": "navigation_bar.follow_requests" + }, + { + "defaultMessage": "Favourites", + "id": "navigation_bar.favourites" + }, + { + "defaultMessage": "Lists", + "id": "navigation_bar.lists" + }, + { + "defaultMessage": "Blocked users", + "id": "navigation_bar.blocks" + }, + { + "defaultMessage": "Hidden domains", + "id": "navigation_bar.domain_blocks" + }, + { + "defaultMessage": "Muted users", + "id": "navigation_bar.mutes" + }, + { "defaultMessage": "Information below may reflect the user's profile incompletely.", "id": "account.disclaimer_full" }, @@ -542,6 +595,10 @@ "id": "account.unblock" }, { + "defaultMessage": "Edit profile", + "id": "account.edit_profile" + }, + { "defaultMessage": "Follows you", "id": "account.follows_you" }, @@ -990,10 +1047,6 @@ { "descriptors": [ { - "defaultMessage": "Getting started", - "id": "getting_started.heading" - }, - { "defaultMessage": "Home", "id": "tabs_bar.home" }, @@ -1006,10 +1059,6 @@ "id": "navigation_bar.public_timeline" }, { - "defaultMessage": "Navigation", - "id": "column_subheading.navigation" - }, - { "defaultMessage": "Settings", "id": "column_subheading.settings" }, @@ -1030,10 +1079,6 @@ "id": "navigation_bar.follow_requests" }, { - "defaultMessage": "Logout", - "id": "navigation_bar.logout" - }, - { "defaultMessage": "Favourites", "id": "navigation_bar.favourites" }, @@ -1050,10 +1095,6 @@ "id": "navigation_bar.mutes" }, { - "defaultMessage": "Extended information", - "id": "navigation_bar.info" - }, - { "defaultMessage": "Pinned toots", "id": "navigation_bar.pins" }, @@ -1062,20 +1103,40 @@ "id": "navigation_bar.lists" }, { - "defaultMessage": "Keyboard shortcuts", + "defaultMessage": "Discover", + "id": "navigation_bar.discover" + }, + { + "defaultMessage": "Personal", + "id": "navigation_bar.personal" + }, + { + "defaultMessage": "Security", + "id": "navigation_bar.security" + }, + { + "defaultMessage": "Getting started", + "id": "getting_started.heading" + }, + { + "defaultMessage": "Hotkeys", "id": "navigation_bar.keyboard_shortcuts" }, { - "defaultMessage": "FAQ", - "id": "getting_started.faq" + "defaultMessage": "About this instance", + "id": "navigation_bar.info" + }, + { + "defaultMessage": "Terms of service", + "id": "getting_started.terms" }, { - "defaultMessage": "User Guide", - "id": "getting_started.userguide" + "defaultMessage": "Documentation", + "id": "getting_started.documentation" }, { - "defaultMessage": "Apps", - "id": "getting_started.appsshort" + "defaultMessage": "Logout", + "id": "navigation_bar.logout" }, { "defaultMessage": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", @@ -1438,6 +1499,10 @@ "id": "status.delete" }, { + "defaultMessage": "Delete & re-draft", + "id": "status.redraft" + }, + { "defaultMessage": "Direct message @{name}", "id": "status.direct" }, @@ -1519,6 +1584,14 @@ "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", "id": "confirmations.block.confirm" }, diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index bb48fe93f..64efbd31a 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -58,7 +58,6 @@ "column_header.pin": "Καρφίτσωμα", "column_header.show_settings": "Εμφάνιση ρυθμίσεων", "column_header.unpin": "Ξεκαρφίτσωμα", - "column_subheading.navigation": "Πλοήγηση", "column_subheading.settings": "Ρυθμίσεις", "compose_form.direct_message_warning": "Αυτό το τουτ θα σταλεί μόνο στους αναφερόμενους χρήστες.", "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "Σίγουρα θες να μπλοκάρεις ολόκληρο το {domain}; Συνήθως μερικά εστιασμένα μπλοκ ή αποσιωπήσεις επαρκούν και προτιμούνται.", "confirmations.mute.confirm": "Αποσιώπηση", "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.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", @@ -112,11 +113,10 @@ "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να τη γεμίσεις", "follow_request.authorize": "Ενέκρινε", "follow_request.reject": "Απέρριψε", - "getting_started.appsshort": "Εφαρμογές", - "getting_started.faq": "Συχνές Ερωτήσεις", + "getting_started.documentation": "Documentation", "getting_started.heading": "Ξεκινώντας", "getting_started.open_source_notice": "Το Mastodon είναι ελεύθερο λογισμικό. Μπορείς να συνεισφέρεις ή να αναφέρεις ζητήματα στο GitHub στο {github}.", - "getting_started.userguide": "Οδηγός Χρήσης", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Προχωρημένα", "home.column_settings.basic": "Βασικά", "home.column_settings.filter_regex": "Φιλτράρετε μέσω regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Αποκλεισμένοι χρήστες", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Απευθείας μηνύματα", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Αποσύνδεση", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Προτιμήσεις", "navigation_bar.public_timeline": "Ομοσπονδιακή ροή", + "navigation_bar.security": "Security", "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", "notification.mention": "Ο/Η {name} σε ανέφερε", @@ -263,6 +266,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", + "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", "status.report": "Καταγγελία @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 690904236..ae3b96c6d 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -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.mute.confirm": "Mute", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -115,11 +117,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -163,19 +164,22 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", "navigation_bar.follow_requests": "Follow requests", "navigation_bar.info": "About this instance", - "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", + "navigation_bar.keyboard_shortcuts": "Hotkeys", "navigation_bar.lists": "Lists", "navigation_bar.misc": "Misc", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", @@ -267,6 +271,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", + "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", @@ -286,6 +291,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index bb27099b7..b01237a2e 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -58,7 +58,6 @@ "column_header.pin": "Alpingli", "column_header.show_settings": "Montri agordojn", "column_header.unpin": "Depingli", - "column_subheading.navigation": "Navigado", "column_subheading.settings": "Agordado", "compose_form.direct_message_warning": "Tiu mesaĝo estos sendita nur al menciitaj uzantoj.", "compose_form.direct_message_warning_learn_more": "Lerni pli", @@ -84,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.mute.confirm": "Silentigi", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj nodoj por plenigi la publikan tempolinion", "follow_request.authorize": "Rajtigi", "follow_request.reject": "Rifuzi", - "getting_started.appsshort": "Aplikaĵoj", - "getting_started.faq": "Oftaj demandoj", + "getting_started.documentation": "Dokumentado", "getting_started.heading": "Por komenci", "getting_started.open_source_notice": "Mastodon estas malfermitkoda programo. Vi povas kontribui aŭ raporti problemojn en GitHub je {github}.", - "getting_started.userguide": "Gvidilo de uzo", + "getting_started.terms": "Uzkondiĉoj", "home.column_settings.advanced": "Precizaj agordoj", "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.filter_regex": "Filtri per regulesprimoj", @@ -160,18 +160,21 @@ "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.community_timeline": "Loka tempolinio", "navigation_bar.direct": "Rektaj mesaĝoj", + "navigation_bar.discover": "Esplori", "navigation_bar.domain_blocks": "Kaŝitaj domajnoj", "navigation_bar.edit_profile": "Redakti profilon", "navigation_bar.favourites": "Stelumoj", "navigation_bar.follow_requests": "Petoj de sekvado", "navigation_bar.info": "Pri ĉi tiu nodo", - "navigation_bar.keyboard_shortcuts": "Klavaraj mallongigoj", + "navigation_bar.keyboard_shortcuts": "Rapidklavoj", "navigation_bar.lists": "Listoj", "navigation_bar.logout": "Elsaluti", "navigation_bar.mutes": "Silentigitaj uzantoj", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Alpinglitaj mesaĝoj", "navigation_bar.preferences": "Preferoj", "navigation_bar.public_timeline": "Fratara tempolinio", + "navigation_bar.security": "Sekureco", "notification.favourite": "{name} stelumis vian mesaĝon", "notification.follow": "{name} eksekvis vin", "notification.mention": "{name} menciis vin", @@ -263,6 +266,7 @@ "status.reblog": "Diskonigi", "status.reblog_private": "Diskonigi al la originala atentaro", "status.reblogged_by": "{name} diskonigis", + "status.redraft": "Delete & re-draft", "status.reply": "Respondi", "status.replyAll": "Respondi al la fadeno", "status.report": "Signali @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Serĉi", "timeline.media": "Aŭdovidaĵoj", "timeline.posts": "Mesaĝoj", + "trends.count_by_accounts": "{count} {rawCount, pluraj, unu {person} alia(j) {people}} parolas", "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.", "upload_area.title": "Altreni kaj lasi por alŝuti", "upload_button.label": "Aldoni aŭdovidaĵon", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 6092630c4..ba85841f6 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -58,7 +58,6 @@ "column_header.pin": "Fijar", "column_header.show_settings": "Mostrar ajustes", "column_header.unpin": "Dejar de fijar", - "column_subheading.navigation": "Navegación", "column_subheading.settings": "Ajustes", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Silenciar", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", - "getting_started.appsshort": "Aplicaciones", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Primeros pasos", "getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.", - "getting_started.userguide": "Guía de usuario", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avanzado", "home.column_settings.basic": "Básico", "home.column_settings.filter_regex": "Filtrar con expresiones regulares", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Usuarios bloqueados", "navigation_bar.community_timeline": "Historia local", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listas", "navigation_bar.logout": "Cerrar sesión", "navigation_bar.mutes": "Usuarios silenciados", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toots fijados", "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Historia federada", + "navigation_bar.security": "Security", "notification.favourite": "{name} marcó tu estado como favorito", "notification.follow": "{name} te empezó a seguir", "notification.mention": "{name} te ha mencionado", @@ -263,6 +266,7 @@ "status.reblog": "Retootear", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "Retooteado por {name}", + "status.redraft": "Delete & re-draft", "status.reply": "Responder", "status.replyAll": "Responder al hilo", "status.report": "Reportar", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 636c51f6f..49be810e2 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -3,7 +3,7 @@ "account.block": "Blokeatu @{name}", "account.block_domain": "Ezkutatu {domain} domeinuko guztia", "account.blocked": "Blokeatuta", - "account.direct": "Mezu zuzena @{name} erabiltzaileari", + "account.direct": "Mezu zuzena @{name}(r)i", "account.disclaimer_full": "Baliteke beheko informazioak erabiltzailearen profilaren zati bat baino ez erakustea.", "account.domain_blocked": "Ezkutatutako domeinua", "account.edit_profile": "Profila aldatu", @@ -11,24 +11,24 @@ "account.followers": "Jarraitzaileak", "account.follows": "Jarraitzen", "account.follows_you": "Jarraitzen dizu", - "account.hide_reblogs": "Ezkutatu @{name} erabiltzailearen bultzadak", + "account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak", "account.media": "Media", - "account.mention": "@{name} aipatu", + "account.mention": "Aipatu @{name}", "account.moved_to": "{name} hona lekualdatu da:", - "account.mute": "@{name} isilarazi", - "account.mute_notifications": "Mututu @{name} erabiltzailearen jakinarazpenak", - "account.muted": "Isilarazita", + "account.mute": "Mututu @{name}", + "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", + "account.muted": "Mutututa", "account.posts": "Toot-ak", "account.posts_with_replies": "Toot eta erantzunak", - "account.report": "@{name} salatu", + "account.report": "Salatu @{name}", "account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko", "account.share": "@{name}(e)ren profila elkarbanatu", - "account.show_reblogs": "Erakutsi @{name} erabiltzailearen bultzadak", + "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak", "account.unblock": "Desblokeatu @{name}", "account.unblock_domain": "Berriz erakutsi {domain}", "account.unfollow": "Jarraitzeari utzi", "account.unmute": "Desmututu @{name}", - "account.unmute_notifications": "Desmututu @{name} erabiltzailearen jakinarazpenak", + "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak", "account.view_full_profile": "Ikusi profil osoa", "alert.unexpected.message": "Ustekabeko errore bat gertatu da.", "alert.unexpected.title": "Ene!", @@ -45,7 +45,7 @@ "column.domain_blocks": "Domeinu ezkutuak", "column.favourites": "Gogokoak", "column.follow_requests": "Jarraitzeko eskariak", - "column.home": "Home", + "column.home": "Hasiera", "column.lists": "Zerrendak", "column.mutes": "Mutututako erabiltzaileak", "column.notifications": "Jakinarazpenak", @@ -58,18 +58,17 @@ "column_header.pin": "Finkatu", "column_header.show_settings": "Erakutsi ezarpenak", "column_header.unpin": "Desfinkatu", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Ezarpenak", "compose_form.direct_message_warning": "Toot hau aipatutako erabiltzaileei besterik ez zaie bidaliko.", "compose_form.direct_message_warning_learn_more": "Ikasi gehiago", "compose_form.hashtag_warning": "Toot hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan toot publikoak besterik ez dira agertzen.", "compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren mezuak ikusteko.", - "compose_form.lock_disclaimer.lock": "blokeatuta", + "compose_form.lock_disclaimer.lock": "giltzapetuta", "compose_form.placeholder": "Zer duzu buruan?", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Multimedia mingarri gisa markatu da", - "compose_form.sensitive.unmarked": "Multimedia ez da mingarri gisa markatu", + "compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da", + "compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu", "compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du", "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta", "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen", @@ -77,24 +76,26 @@ "confirmations.block.confirm": "Block", "confirmations.block.message": "Ziur {name} blokeatu nahi duzula?", "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete.message": "Ziur mezu hau ezabatu nahi duzula?", "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", "confirmations.domain_block.confirm": "Ezkutatu domeinu osoa", - "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": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da.", "confirmations.mute.confirm": "Mututu", "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.message": "Ziur {name} jarraitzeari utzi nahi diozula?", - "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", "embed.preview": "Hau da izango duen itxura:", "emoji_button.activity": "Jarduera", "emoji_button.custom": "Pertsonalizatua", "emoji_button.flags": "Banderak", "emoji_button.food": "Janari eta edaria", - "emoji_button.label": "Insert emoji", + "emoji_button.label": "Txertatu emoji-a", "emoji_button.nature": "Natura", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Emojirik ez!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objektuak", "emoji_button.people": "Jendea", "emoji_button.recent": "Maiz erabiliak", @@ -102,21 +103,20 @@ "emoji_button.search_results": "Bilaketaren emaitzak", "emoji_button.symbols": "Sinboloak", "emoji_button.travel": "Bidaiak eta tokiak", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!", + "empty_column.direct": "Ez duzu mezu zuzenik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.", "empty_column.hashtag": "Ez dago ezer traola honetan oraindik.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home": "Zure hasierako denbora-lerroa hutsik dago! Ikusi {public} edo erabili bilaketa lehen urratsak eman eta beste batzuk aurkitzeko.", "empty_column.home.public_timeline": "denbora-lerro publikoa", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "empty_column.list": "Ez dago ezer zerrenda honetan. Zerrenda honetako kideek mezu berriak argitaratzean, hemen agertuko dira.", + "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.", + "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste instantzia batzuetako erabiltzailean hau betetzeko", "follow_request.authorize": "Baimendu", "follow_request.reject": "Ukatu", - "getting_started.appsshort": "Aplikazioak", - "getting_started.faq": "FAQ", - "getting_started.heading": "Lehen urratsak", - "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "Erabiltzaile gida", + "getting_started.documentation": "Dokumentazioa", + "getting_started.heading": "Abiapuntua", + "getting_started.open_source_notice": "Mastodon software librea da. Ekarpenak egin ditzakezu edo akatsen berri eman GitHub bidez: {github}.", + "getting_started.terms": "Erabilera baldintzak", "home.column_settings.advanced": "Aurreratua", "home.column_settings.basic": "Oinarrizkoa", "home.column_settings.filter_regex": "Iragazi adierazpen erregularren bidez", @@ -125,8 +125,8 @@ "home.settings": "Zutabearen ezarpenak", "keyboard_shortcuts.back": "atzera nabigatzeko", "keyboard_shortcuts.boost": "bultzada ematea", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.column": "mezu bat zutabe batean fokatzea", + "keyboard_shortcuts.compose": "testua konposatzeko arean fokatzea", "keyboard_shortcuts.description": "Description", "keyboard_shortcuts.down": "zerrendan behera mugitzea", "keyboard_shortcuts.enter": "to open status", @@ -137,9 +137,9 @@ "keyboard_shortcuts.mention": "egilea aipatzea", "keyboard_shortcuts.reply": "erantzutea", "keyboard_shortcuts.search": "bilaketan fokua jartzea", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_hidden": "testua erakustea/ezkutatzea abisu baten atzean", "keyboard_shortcuts.toot": "toot berria hastea", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea", "keyboard_shortcuts.up": "zerrendan gora mugitzea", "lightbox.close": "Itxi", "lightbox.next": "Hurrengoa", @@ -160,22 +160,25 @@ "navigation_bar.blocks": "Blokeatutako erabiltzaileak", "navigation_bar.community_timeline": "Denbora-lerro lokala", "navigation_bar.direct": "Mezu zuzenak", + "navigation_bar.discover": "Aurkitu", "navigation_bar.domain_blocks": "Domeinu ezkutuak", - "navigation_bar.edit_profile": "Editatu profila", + "navigation_bar.edit_profile": "Aldatu profila", "navigation_bar.favourites": "Gogokoak", "navigation_bar.follow_requests": "Jarraitzeko eskariak", - "navigation_bar.info": "Extended information", - "navigation_bar.keyboard_shortcuts": "Teklatu laster-bideak", + "navigation_bar.info": "Instantzia honi buruz", + "navigation_bar.keyboard_shortcuts": "Laster-teklak", "navigation_bar.lists": "Zerrendak", "navigation_bar.logout": "Amaitu saioa", "navigation_bar.mutes": "Mutututako erabiltzaileak", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Finkatutako toot-ak", "navigation_bar.preferences": "Hobespenak", "navigation_bar.public_timeline": "Federatutako denbora-lerroa", - "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} erabiltzaileak jarraitzen zaitu", - "notification.mention": "{name} erabiltzaileak aipatu zaitu", - "notification.reblog": "{name} boosted your status", + "navigation_bar.security": "Segurtasuna", + "notification.favourite": "{name}(e)k zure mezua gogoko du", + "notification.follow": "{name}(e)k jarraitzen zaitu", + "notification.mention": "{name}(e)k aipatu zaitu", + "notification.reblog": "{name}(e)k bultzada eman dio zure mezuari", "notifications.clear": "Garbitu jakinarazpenak", "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", @@ -190,10 +193,10 @@ "notifications.group": "{count} jakinarazpen", "onboarding.done": "Egina", "onboarding.next": "Hurrengoa", - "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", + "onboarding.page_five.public_timelines": "Denbora-lerro lokalak {domain} domeinuko guztien mezu publikoak erakusten ditu. Federatutako denbora-lerroak {domain} domeinuko edonork jarraitutakoen mezu publikoak erakusten ditu. Hauek denbora-lerro publikoak dira, jende berria ezagutzeko primerakoak.", "onboarding.page_four.home": "Hasierako denbora-lerroak jarraitzen duzun jendearen mezuak erakusten ditu.", "onboarding.page_four.notifications": "Jakinarazpenen zutabeak besteek zurekin hasitako hartu-emanak erakusten ditu.", - "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", + "onboarding.page_one.federation": "Mastodon lotutako zerbitzari independenteez eraikitako gizarte sare bat da. Zerbitzari hauei instantzia deitzen diegu.", "onboarding.page_one.full_handle": "Zure erabiltzaile-izen osoa", "onboarding.page_one.handle_hint": "Hau da zure lagunei zu aurkitzeko emango zeniena.", "onboarding.page_one.welcome": "Ongi etorri Mastodon-era!", @@ -201,15 +204,15 @@ "onboarding.page_six.almost_done": "Ia eginda...", "onboarding.page_six.appetoot": "Bon Appetoot!", "onboarding.page_six.apps_available": "{apps} eskuragarri daude iOS, Android eta beste plataformetarako.", - "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", + "onboarding.page_six.github": "Mastodon software librea da. Akatsen berri eman ezakezu, ezaugarriak eskatu, edo kodea proposatu hemen: {github}.", "onboarding.page_six.guidelines": "komunitatearen gida-lerroak", "onboarding.page_six.read_guidelines": "Irakurri {domain} {guidelines} mesedez!", "onboarding.page_six.various_app": "mugikorrerako aplikazioak", - "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", - "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", - "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.page_three.profile": "Editatu zure profila zure abatarra, biografia eta pantaila-izena aldatzeko. Han hobespen gehiago daude ere.", + "onboarding.page_three.search": "Erabili bilaketa-barra jendea aurkitzeko eta traolak begiratzeko, esaterako {illustration} edo {introductions}. Instantzia honetan ez dagoen pertsona bat bilatzeko , erabili erabiltzaile-izen osoa.", + "onboarding.page_two.compose": "Idatzi mezuak konposizio-zutabean. Irudiak igo ditzakezu, pribatutasun ezarpenak aldatu, eta edukiei abisuak gehitu beheko ikonoekin.", "onboarding.skip": "Saltatu", - "privacy.change": "Adjust status privacy", + "privacy.change": "Doitu mezuaren pribatutasuna", "privacy.direct.long": "Bidali aipatutako erabiltzaileei besterik ez", "privacy.direct.short": "Zuzena", "privacy.private.long": "Bidali jarraitzaileei besterik ez", @@ -227,17 +230,17 @@ "relative_time.seconds": "{number}s", "reply_indicator.cancel": "Utzi", "report.forward": "Birbidali hona: {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", + "report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?", + "report.hint": "Txostena zure instantziaren moderatzaileei bidaliko zaio. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:", "report.placeholder": "Iruzkin gehigarriak", "report.submit": "Submit", - "report.target": "Report {target}", + "report.target": "{target} salatzen", "search.placeholder": "Bilatu", "search_popout.search_format": "Bilaketa aurreratuaren formatua", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.full_text": "Testu hutsarekin zuk idatzitako mezuak, gogokoak, bultzadak edo aipamenak aurkitu ditzakezu, bat datozen erabiltzaile-izenak, pantaila-izenak, eta traolak.", "search_popout.tips.hashtag": "traola", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Testu hutsak pantaila-izenak, erabiltzaile-izenak eta traolak bilatzen ditu", "search_popout.tips.user": "erabiltzailea", "search_results.accounts": "Jendea", "search_results.hashtags": "Traolak", @@ -248,7 +251,7 @@ "status.cancel_reblog_private": "Kendu bultzada", "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman", "status.delete": "Delete", - "status.direct": "Mezu zuzena @{name} erabiltzaileari", + "status.direct": "Mezu zuzena @{name}(r)i", "status.embed": "Txertatu", "status.favourite": "Gogokoa", "status.load_more": "Kargatu gehiago", @@ -257,17 +260,18 @@ "status.more": "Gehiago", "status.mute": "Mututu @{name}", "status.mute_conversation": "Mututu elkarrizketa", - "status.open": "Expand this status", + "status.open": "Hedatu mezu hau", "status.pin": "Finkatu profilean", "status.pinned": "Finkatutako toot-a", "status.reblog": "Bultzada", "status.reblog_private": "Bultzada jatorrizko hartzaileei", - "status.reblogged_by": "{name} erabiltzailearen bultzada", + "status.reblogged_by": "{name}(r)en bultzada", + "status.redraft": "Delete & re-draft", "status.reply": "Erantzun", "status.replyAll": "Erantzun harian", - "status.report": "Report @{name}", - "status.sensitive_toggle": "Click to view", - "status.sensitive_warning": "Eduki mingarria", + "status.report": "Salatu @{name}", + "status.sensitive_toggle": "Egin klik ikusteko", + "status.sensitive_warning": "Eduki hunkigarria", "status.share": "Partekatu", "status.show_less": "Erakutsi gutxiago", "status.show_less_all": "Erakutsi denetarik gutxiago", @@ -276,12 +280,13 @@ "status.unmute_conversation": "Desmututu elkarrizketa", "status.unpin": "Desfinkatu profiletik", "tabs_bar.federated_timeline": "Federatua", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", + "tabs_bar.home": "Hasiera", + "tabs_bar.local_timeline": "Lokala", "tabs_bar.notifications": "Jakinarazpenak", "tabs_bar.search": "Bilatu", "timeline.media": "Media", "timeline.posts": "Toot-ak", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} hitz egiten", "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", "upload_area.title": "Arrastatu eta jaregin igotzeko", "upload_button.label": "Gehitu multimedia", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 6c0f34a11..bf7a256d6 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -58,7 +58,6 @@ "column_header.pin": "ثابتکردن", "column_header.show_settings": "نمایش تنظیمات", "column_header.unpin": "رهاکردن", - "column_subheading.navigation": "گشت و گذار", "column_subheading.settings": "تنظیمات", "compose_form.direct_message_warning": "این بوق تنها به کاربرانی که از آنها نام برده شده فرستاده خواهد شد.", "compose_form.direct_message_warning_learn_more": "بیشتر بدانید", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "آیا جدی جدی میخواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقتها مسدودکردن یا بیصداکردن چند حساب کاربری خاص کافی است و توصیه میشود.", "confirmations.mute.confirm": "بیصدا کن", "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.message": "آیا واقعاً میخواهید به پیگیری از {name} پایان دهید؟", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", @@ -112,11 +113,10 @@ "empty_column.public": "اینجا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران دیگر را پی بگیرید تا اینجا پر شود", "follow_request.authorize": "اجازه دهید", "follow_request.reject": "اجازه ندهید", - "getting_started.appsshort": "اپها", - "getting_started.faq": "پرسشهای رایج", + "getting_started.documentation": "Documentation", "getting_started.heading": "آغاز کنید", "getting_started.open_source_notice": "ماستدون یک نرمافزار آزاد است. میتوانید در ساخت آن مشارکت کنید یا مشکلاتش را در {github} گزارش دهید.", - "getting_started.userguide": "راهنمای کاربری", + "getting_started.terms": "شرایط استفاده", "home.column_settings.advanced": "پیشرفته", "home.column_settings.basic": "اصلی", "home.column_settings.filter_regex": "با عبارتهای باقاعده (regexp) فیلتر کنید", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "کاربران مسدودشده", "navigation_bar.community_timeline": "نوشتههای محلی", "navigation_bar.direct": "پیغامهای خصوصی", + "navigation_bar.discover": "گشت و گذار", "navigation_bar.domain_blocks": "دامینهای پنهانشده", "navigation_bar.edit_profile": "ویرایش نمایه", "navigation_bar.favourites": "پسندیدهها", @@ -169,9 +170,11 @@ "navigation_bar.lists": "فهرستها", "navigation_bar.logout": "خروج", "navigation_bar.mutes": "کاربران بیصداشده", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "نوشتههای ثابت", "navigation_bar.preferences": "ترجیحات", "navigation_bar.public_timeline": "نوشتههای همهجا", + "navigation_bar.security": "امنیت", "notification.favourite": "{name} نوشتهٔ شما را پسندید", "notification.follow": "{name} پیگیر شما شد", "notification.mention": "{name} از شما نام برد", @@ -263,6 +266,7 @@ "status.reblog": "بازبوقیدن", "status.reblog_private": "بازبوق به مخاطبان اولیه", "status.reblogged_by": "{name} بازبوقید", + "status.redraft": "Delete & re-draft", "status.reply": "پاسخ", "status.replyAll": "به نوشته پاسخ دهید", "status.report": "گزارش دادن @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "جستجو", "timeline.media": "عکس و ویدیو", "timeline.posts": "بوقها", + "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشتهاند}}", "ui.beforeunload": "اگر از ماستدون خارج شوید پیشنویس شما پاک خواهد شد.", "upload_area.title": "برای بارگذاری به اینجا بکشید", "upload_button.label": "افزودن تصویر", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index d04e0230a..4cdee49ee 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,9 +1,9 @@ { - "account.badges.bot": "Bot", + "account.badges.bot": "Botti", "account.block": "Estä @{name}", "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}", "account.blocked": "Estetty", - "account.direct": "Direct message @{name}", + "account.direct": "Viesti käyttäjälle @{name}", "account.disclaimer_full": "Alla olevat käyttäjän profiilitiedot saattavat olla epätäydellisiä.", "account.domain_blocked": "Verkko-osoite piilotettu", "account.edit_profile": "Muokkaa", @@ -41,7 +41,7 @@ "bundle_modal_error.retry": "Yritä uudestaan", "column.blocks": "Estetyt käyttäjät", "column.community": "Paikallinen aikajana", - "column.direct": "Direct messages", + "column.direct": "Viestit", "column.domain_blocks": "Piilotetut verkkotunnukset", "column.favourites": "Suosikit", "column.follow_requests": "Seuraamispyynnöt", @@ -58,10 +58,9 @@ "column_header.pin": "Kiinnitä", "column_header.show_settings": "Näytä asetukset", "column_header.unpin": "Poista kiinnitys", - "column_subheading.navigation": "Navigaatio", "column_subheading.settings": "Asetukset", "compose_form.direct_message_warning": "Tämä tuuttaus näkyy vain mainituille käyttäjille.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "Lisätietoja", "compose_form.hashtag_warning": "Tämä tuuttaus ei näy hashtag-hauissa, koska se on listaamaton. Hashtagien avulla voi hakea vain julkisia tuuttauksia.", "compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.", "compose_form.lock_disclaimer.lock": "lukittu", @@ -84,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.mute.confirm": "Mykistä", "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.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", @@ -103,7 +104,7 @@ "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu", "empty_column.community": "Paikallinen aikajana on tyhjä. Homma lähtee käyntiin, kun kirjoitat jotain julkista!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.", "empty_column.hashtag": "Tällä hashtagilla ei ole vielä mitään.", "empty_column.home": "Kotiaikajanasi on tyhjä! {public} ja hakutoiminto auttavat alkuun ja kohtaamaan muita käyttäjiä.", "empty_column.home.public_timeline": "yleinen aikajana", @@ -112,11 +113,10 @@ "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt manuaalisesti seuraamassa muiden instanssien käyttäjiä", "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", - "getting_started.appsshort": "Sovellukset", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Aloitus", "getting_started.open_source_notice": "Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHubissa: {github}.", - "getting_started.userguide": "Käyttöopas", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Lisäasetukset", "home.column_settings.basic": "Perusasetukset", "home.column_settings.filter_regex": "Suodata säännöllisillä lausekkeilla", @@ -159,7 +159,8 @@ "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?", "navigation_bar.blocks": "Estetyt käyttäjät", "navigation_bar.community_timeline": "Paikallinen aikajana", - "navigation_bar.direct": "Direct messages", + "navigation_bar.direct": "Viestit", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Piilotetut verkkotunnukset", "navigation_bar.edit_profile": "Muokkaa profiilia", "navigation_bar.favourites": "Suosikit", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listat", "navigation_bar.logout": "Kirjaudu ulos", "navigation_bar.mutes": "Mykistetyt käyttäjät", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Kiinnitetyt tuuttaukset", "navigation_bar.preferences": "Asetukset", "navigation_bar.public_timeline": "Yleinen aikajana", + "navigation_bar.security": "Security", "notification.favourite": "{name} tykkäsi tilastasi", "notification.follow": "{name} seurasi sinua", "notification.mention": "{name} mainitsi sinut", @@ -263,6 +266,7 @@ "status.reblog": "Buustaa", "status.reblog_private": "Buustaa alkuperäiselle yleisölle", "status.reblogged_by": "{name} buustasi", + "status.redraft": "Delete & re-draft", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", "status.report": "Raportoi @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Hae", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää mediaa", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 24b771efa..35c753091 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -58,7 +58,6 @@ "column_header.pin": "Épingler", "column_header.show_settings": "Afficher les paramètres", "column_header.unpin": "Retirer", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Paramètres", "compose_form.direct_message_warning": "Ce pouet sera uniquement envoyé qu'aux personnes mentionnées. Cependant, l'administration de votre instance et des instances réceptrices pourront inspecter ce message.", "compose_form.direct_message_warning_learn_more": "En savoir plus", @@ -84,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.mute.confirm": "Masquer", "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.message": "Voulez-vous arrêter de suivre {name} ?", "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", @@ -112,11 +113,10 @@ "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public", "follow_request.authorize": "Accepter", "follow_request.reject": "Rejeter", - "getting_started.appsshort": "Applications", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Pour commencer", "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer et envoyer vos commentaires et rapports de bogues via {github} sur GitHub.", - "getting_started.userguide": "Guide d’utilisation", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avancé", "home.column_settings.basic": "Basique", "home.column_settings.filter_regex": "Filtrer avec une expression rationnelle", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Comptes bloqués", "navigation_bar.community_timeline": "Fil public local", "navigation_bar.direct": "Messages directs", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Domaines cachés", "navigation_bar.edit_profile": "Modifier le profil", "navigation_bar.favourites": "Favoris", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listes", "navigation_bar.logout": "Déconnexion", "navigation_bar.mutes": "Comptes masqués", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pouets épinglés", "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", + "navigation_bar.security": "Security", "notification.favourite": "{name} a ajouté à ses favoris :", "notification.follow": "{name} vous suit", "notification.mention": "{name} vous a mentionné⋅e :", @@ -263,6 +266,7 @@ "status.reblog": "Partager", "status.reblog_private": "Booster vers l'audience originale", "status.reblogged_by": "{name} a partagé :", + "status.redraft": "Delete & re-draft", "status.reply": "Répondre", "status.replyAll": "Répondre au fil", "status.report": "Signaler @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Chercher", "timeline.media": "Media", "timeline.posts": "Pouets", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", "upload_area.title": "Glissez et déposez pour envoyer", "upload_button.label": "Joindre un média", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index f2f0fc260..5aab4d648 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -58,7 +58,6 @@ "column_header.pin": "Fixar", "column_header.show_settings": "Mostras axustes", "column_header.unpin": "Soltar", - "column_subheading.navigation": "Navegación", "column_subheading.settings": "Axustes", "compose_form.direct_message_warning": "Este toot enviarase só as usuarias mencionadas. Porén, a súa proveedora de internet e calquera das instancias receptoras poderían examinar esta mensaxe.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Acalar", "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.message": "Quere deixar de seguir a {name}?", "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", @@ -112,11 +113,10 @@ "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outras instancias para ir enchéndoa", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", - "getting_started.appsshort": "Aplicacións", - "getting_started.faq": "PMF", + "getting_started.documentation": "Documentation", "getting_started.heading": "Comezando", "getting_started.open_source_notice": "Mastodon é software de código aberto. Pode contribuír ou informar de fallos en GitHub en {github}.", - "getting_started.userguide": "Guía de usuaria", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avanzado", "home.column_settings.basic": "Básico", "home.column_settings.filter_regex": "Filtrar expresións regulares", @@ -160,18 +160,21 @@ "navigation_bar.blocks": "Usuarias bloqueadas", "navigation_bar.community_timeline": "Liña temporal local", "navigation_bar.direct": "Mensaxes directas", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Dominios agochados", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritas", "navigation_bar.follow_requests": "Peticións de seguimento", "navigation_bar.info": "Sobre esta instancia", - "navigation_bar.keyboard_shortcuts": "Atallos do teclado", + "navigation_bar.keyboard_shortcuts": "Atallos", "navigation_bar.lists": "Listas", "navigation_bar.logout": "Sair", "navigation_bar.mutes": "Usuarias acaladas", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Mensaxes fixadas", "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Liña temporal federada", + "navigation_bar.security": "Security", "notification.favourite": "{name} marcou como favorito o seu estado", "notification.follow": "{name} está a seguila", "notification.mention": "{name} mencionoute", @@ -263,6 +266,7 @@ "status.reblog": "Promover", "status.reblog_private": "Promover a audiencia orixinal", "status.reblogged_by": "{name} promoveu", + "status.redraft": "Delete & re-draft", "status.reply": "Resposta", "status.replyAll": "Resposta a conversa", "status.report": "Informar @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Buscar", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "O borrador perderase se sae de Mastodon.", "upload_area.title": "Arrastre e solte para subir", "upload_button.label": "Engadir medios", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 361beebcc..188d69553 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -58,7 +58,6 @@ "column_header.pin": "קיבוע", "column_header.show_settings": "הצגת העדפות", "column_header.unpin": "שחרור קיבוע", - "column_subheading.navigation": "ניווט", "column_subheading.settings": "אפשרויות", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.", "confirmations.mute.confirm": "להשתיק", "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.message": "להפסיק מעקב אחרי {name}?", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", @@ -112,11 +113,10 @@ "empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות", "follow_request.authorize": "קבלה", "follow_request.reject": "דחיה", - "getting_started.appsshort": "יישומונים לניידים", - "getting_started.faq": "שאלות ותשובות", + "getting_started.documentation": "Documentation", "getting_started.heading": "בואו נתחיל", "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.", - "getting_started.userguide": "מדריך למשתמשים", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "למתקדמים", "home.column_settings.basic": "למתחילים", "home.column_settings.filter_regex": "סינון באמצעות ביטויים רגולריים (regular expressions)", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "חסימות", "navigation_bar.community_timeline": "ציר זמן מקומי", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "עריכת פרופיל", "navigation_bar.favourites": "חיבובים", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "יציאה", "navigation_bar.mutes": "השתקות", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "חיצרוצים מקובעים", "navigation_bar.preferences": "העדפות", "navigation_bar.public_timeline": "ציר זמן בין-קהילתי", + "navigation_bar.security": "Security", "notification.favourite": "חצרוצך חובב על ידי {name}", "notification.follow": "{name} במעקב אחרייך", "notification.mention": "אוזכרת על ידי {name}", @@ -263,6 +266,7 @@ "status.reblog": "הדהוד", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "הודהד על ידי {name}", + "status.redraft": "Delete & re-draft", "status.reply": "תגובה", "status.replyAll": "תגובה לכולם", "status.report": "דיווח על @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", "upload_area.title": "ניתן להעלות על ידי Drag & drop", "upload_button.label": "הוספת מדיה", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 93dc1c17d..fc787366d 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigacija", "column_subheading.settings": "Postavke", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Utišaj", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "Ovdje nema ništa! Napiši nešto javno, ili ručno slijedi korisnike sa drugih instanci kako bi popunio", "follow_request.authorize": "Autoriziraj", "follow_request.reject": "Odbij", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Počnimo", "getting_started.open_source_notice": "Mastodon je softver otvorenog koda. Možeš pridonijeti ili prijaviti probleme na GitHubu {github}.", - "getting_started.userguide": "Upute za korištenje", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", "home.column_settings.filter_regex": "Filtriraj s regularnim izrazima", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalni timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Uredi profil", "navigation_bar.favourites": "Favoriti", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Odjavi se", "navigation_bar.mutes": "Utišani korisnici", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Postavke", "navigation_bar.public_timeline": "Federalni timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} je lajkao tvoj status", "notification.follow": "{name} te sada slijedi", "notification.mention": "{name} te je spomenuo", @@ -263,6 +266,7 @@ "status.reblog": "Podigni", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} je podigao", + "status.redraft": "Delete & re-draft", "status.reply": "Odgovori", "status.replyAll": "Odgovori na temu", "status.report": "Prijavi @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Povuci i spusti kako bi uploadao", "upload_button.label": "Dodaj media", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 158c0fe41..7c850b005 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -58,7 +58,6 @@ "column_header.pin": "Kitűz", "column_header.show_settings": "Beállítások mutatása", "column_header.unpin": "Kitűzés eltávolítása", - "column_subheading.navigation": "Navigáció", "column_subheading.settings": "Beállítások", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Némít", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Jelenleg semmi nincs itt! Írj valamit publikusan vagy kövess más szervereken levő felhasználókat, hogy megtöltsd", "follow_request.authorize": "Engedélyez", "follow_request.reject": "Visszautasít", - "getting_started.appsshort": "Applikációk", - "getting_started.faq": "GYIK", + "getting_started.documentation": "Documentation", "getting_started.heading": "Első lépések", "getting_started.open_source_notice": "Mastodon egy nyílt forráskódú szoftver. Hozzájárulás vagy problémák jelentése a GitHub-on {github}.", - "getting_started.userguide": "Használati Útmutató", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Fejlett", "home.column_settings.basic": "Alap", "home.column_settings.filter_regex": "Szűrje ki reguláris kifejezésekkel", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Tiltott felhasználók", "navigation_bar.community_timeline": "Helyi idővonal", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profil szerkesztése", "navigation_bar.favourites": "Kedvencek", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listák", "navigation_bar.logout": "Kijelentkezés", "navigation_bar.mutes": "Némított felhasználók", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Kitűzött tülkök", "navigation_bar.preferences": "Beállítások", "navigation_bar.public_timeline": "Nyilvános időfolyam", + "navigation_bar.security": "Security", "notification.favourite": "{name} kedvencnek jelölte az állapotod", "notification.follow": "{name} követ téged", "notification.mention": "{name} megemlített", @@ -263,6 +266,7 @@ "status.reblog": "Reblog", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} reblogolta", + "status.redraft": "Delete & re-draft", "status.reply": "Válasz", "status.replyAll": "Válaszolj a beszélgetésre", "status.report": "Report @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "A piszkozata el fog vesztődni ha elhagyja Mastodon-t.", "upload_area.title": "Húzza ide a feltöltéshez", "upload_button.label": "Média hozzáadása", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 76b3a9c12..bb167998e 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -58,7 +58,6 @@ "column_header.pin": "Ամրացնել", "column_header.show_settings": "Ցուցադրել կարգավորումները", "column_header.unpin": "Հանել", - "column_subheading.navigation": "Նավարկություն", "column_subheading.settings": "Կարգավորումներ", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։", "confirmations.mute.confirm": "Լռեցնել", "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.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", @@ -112,11 +113,10 @@ "empty_column.public": "Այստեղ բան չկա՛։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգույցներից էակների՝ այն լցնելու համար։", "follow_request.authorize": "Վավերացնել", "follow_request.reject": "Մերժել", - "getting_started.appsshort": "Հավելվածներ", - "getting_started.faq": "ՀՏՀ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Ինչպես սկսել", "getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրեպներ զեկուցել ԳիթՀաբում՝ {github}։", - "getting_started.userguide": "Ձեռնարկ", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Առաջադեմ", "home.column_settings.basic": "Հիմնական", "home.column_settings.filter_regex": "Զտել օրինաչափ արտահայտությամբ", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Արգելափակված օգտատերեր", "navigation_bar.community_timeline": "Տեղական հոսք", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Խմբագրել անձնական էջը", "navigation_bar.favourites": "Հավանածներ", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Ցանկեր", "navigation_bar.logout": "Դուրս գալ", "navigation_bar.mutes": "Լռեցրած օգտատերեր", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Ամրացված թթեր", "navigation_bar.preferences": "Նախապատվություններ", "navigation_bar.public_timeline": "Դաշնային հոսք", + "navigation_bar.security": "Security", "notification.favourite": "{name} հավանեց թութդ", "notification.follow": "{name} սկսեց հետեւել քեզ", "notification.mention": "{name} նշեց քեզ", @@ -263,6 +266,7 @@ "status.reblog": "Տարածել", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} տարածել է", + "status.redraft": "Delete & re-draft", "status.reply": "Պատասխանել", "status.replyAll": "Պատասխանել թելին", "status.report": "Բողոքել @{name}֊ից", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։", "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար", "upload_button.label": "Ավելացնել մեդիա", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 00240530d..0dee97656 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -58,7 +58,6 @@ "column_header.pin": "Sematkan", "column_header.show_settings": "Tampilkan pengaturan", "column_header.unpin": "Lepaskan", - "column_subheading.navigation": "Navigasi", "column_subheading.settings": "Pengaturan", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Bisukan", "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.message": "Apakah anda ingin berhenti mengikuti {name}?", "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", @@ -112,11 +113,10 @@ "empty_column.public": "Tidak ada apapun disini! Tulis sesuatu, atau ikuti pengguna lain dari server lain untuk mengisi ini", "follow_request.authorize": "Izinkan", "follow_request.reject": "Tolak", - "getting_started.appsshort": "Aplikasi", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Mulai", "getting_started.open_source_notice": "Mastodon adalah perangkat lunak yang bersifat terbuka. Anda dapat berkontribusi atau melaporkan permasalahan/bug di Github {github}.", - "getting_started.userguide": "Panduan Pengguna", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Tingkat Lanjut", "home.column_settings.basic": "Dasar", "home.column_settings.filter_regex": "Saring dengan regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Pengguna diblokir", "navigation_bar.community_timeline": "Linimasa lokal", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Ubah profil", "navigation_bar.favourites": "Favorit", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Keluar", "navigation_bar.mutes": "Pengguna dibisukan", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Pengaturan", "navigation_bar.public_timeline": "Linimasa gabungan", + "navigation_bar.security": "Security", "notification.favourite": "{name} menyukai status anda", "notification.follow": "{name} mengikuti anda", "notification.mention": "{name} mentioned you", @@ -263,6 +266,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "di-boost {name}", + "status.redraft": "Delete & re-draft", "status.reply": "Balas", "status.replyAll": "Balas ke semua", "status.report": "Laporkan @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.", "upload_area.title": "Seret & lepaskan untuk mengunggah", "upload_button.label": "Tambahkan media", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index d20ee0f62..abb81981e 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Mute", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.", "follow_request.authorize": "Yurizar", "follow_request.reject": "Refuzar", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Debuto", "getting_started.open_source_notice": "Mastodon esas programaro kun apertita kodexo. Tu povas kontributar o signalar problemi en GitHub ye {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Komplexa", "home.column_settings.basic": "Simpla", "home.column_settings.filter_regex": "Ekfiltrar per reguloza expresuri", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blokusita uzeri", "navigation_bar.community_timeline": "Lokala tempolineo", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modifikar profilo", "navigation_bar.favourites": "Favorati", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Ekirar", "navigation_bar.mutes": "Celita uzeri", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferi", "navigation_bar.public_timeline": "Federata tempolineo", + "navigation_bar.security": "Security", "notification.favourite": "{name} favorizis tua mesajo", "notification.follow": "{name} sequeskis tu", "notification.mention": "{name} mencionis tu", @@ -263,6 +266,7 @@ "status.reblog": "Repetar", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} repetita", + "status.redraft": "Delete & re-draft", "status.reply": "Respondar", "status.replyAll": "Respondar a filo", "status.report": "Denuncar @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Tranar faligar por kargar", "upload_button.label": "Adjuntar kontenajo", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index cc0551b14..f0d58621d 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -58,7 +58,6 @@ "column_header.pin": "Fissa in cima", "column_header.show_settings": "Mostra impostazioni", "column_header.unpin": "Non fissare in cima", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Impostazioni", "compose_form.direct_message_warning": "Questo toot sarà mandato solo a tutti gli utenti menzionati.", "compose_form.direct_message_warning_learn_more": "Per saperne di piu'", @@ -84,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.mute.confirm": "Silenzia", "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.message": "Sei sicuro che non vuoi più seguire {name}?", "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", @@ -112,11 +113,10 @@ "empty_column.public": "Qui non c'è nulla! Scrivi qualcosa pubblicamente, o aggiungi utenti da altri server per riempire questo spazio", "follow_request.authorize": "Autorizza", "follow_request.reject": "Rifiuta", - "getting_started.appsshort": "App", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Come iniziare", "getting_started.open_source_notice": "Mastodon è un software open source. Puoi contribuire o segnalare errori su GitHub all'indirizzo {github}.", - "getting_started.userguide": "Manuale utente", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avanzato", "home.column_settings.basic": "Semplice", "home.column_settings.filter_regex": "Filtra con espressioni regolari", @@ -127,12 +127,12 @@ "keyboard_shortcuts.boost": "per condividere", "keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne", "keyboard_shortcuts.compose": "per portare il focus nell'area di composizione", - "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.description": "Descrizione", "keyboard_shortcuts.down": "per spostarsi in basso nella lista", - "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.enter": "per aprire lo status", "keyboard_shortcuts.favourite": "per segnare come apprezzato", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.heading": "Tasti di scelta rapida", + "keyboard_shortcuts.hotkey": "Tasto di scelta rapida", "keyboard_shortcuts.legend": "per mostrare questa spiegazione", "keyboard_shortcuts.mention": "per menzionare l'autore", "keyboard_shortcuts.reply": "per rispondere", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Utenti bloccati", "navigation_bar.community_timeline": "Timeline locale", "navigation_bar.direct": "Messaggi diretti", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Domini nascosti", "navigation_bar.edit_profile": "Modifica profilo", "navigation_bar.favourites": "Apprezzati", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Liste", "navigation_bar.logout": "Esci", "navigation_bar.mutes": "Utenti silenziati", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toot fissati in cima", "navigation_bar.preferences": "Impostazioni", "navigation_bar.public_timeline": "Timeline federata", + "navigation_bar.security": "Security", "notification.favourite": "{name} ha apprezzato il tuo post", "notification.follow": "{name} ha iniziato a seguirti", "notification.mention": "{name} ti ha menzionato", @@ -234,10 +237,10 @@ "report.target": "Invio la segnalazione {target}", "search.placeholder": "Cerca", "search_popout.search_format": "Formato di ricerca avanzato", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.full_text": "Testo semplice per trovare gli status che hai scritto, segnato come apprezzati, condiviso o in cui sei stato citato, e inoltre i nomi utente, nomi visualizzati e hashtag che lo contengono.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Testo semplice per trovare nomi visualizzati, nomi utente e hashtag che lo contengono", "search_popout.tips.user": "utente", "search_results.accounts": "Gente", "search_results.hashtags": "Hashtag", @@ -261,8 +264,9 @@ "status.pin": "Fissa in cima sul profilo", "status.pinned": "Toot fissato in cima", "status.reblog": "Condividi", - "status.reblog_private": "Boost to original audience", + "status.reblog_private": "Condividi con i destinatari iniziali", "status.reblogged_by": "{name} ha condiviso", + "status.redraft": "Delete & re-draft", "status.reply": "Rispondi", "status.replyAll": "Rispondi alla conversazione", "status.report": "Segnala @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Cerca", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.", "upload_area.title": "Trascina per caricare", "upload_button.label": "Aggiungi file multimediale", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 8de92db16..9bb3fca25 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -87,6 +87,8 @@ "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。", "confirmations.mute.confirm": "ミュート", "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.message": "本当に{name}さんのフォローを解除しますか?", "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", @@ -115,11 +117,10 @@ "empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のインスタンスのユーザーをフォローしたりしていっぱいにしましょう", "follow_request.authorize": "許可", "follow_request.reject": "拒否", - "getting_started.appsshort": "アプリ", - "getting_started.faq": "よくある質問", + "getting_started.documentation": "ドキュメント", "getting_started.heading": "スタート", "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub({github})から開発に参加したり、問題を報告したりできます。", - "getting_started.userguide": "ユーザーガイド", + "getting_started.terms": "プライバシーポリシー", "home.column_settings.advanced": "高度な設定", "home.column_settings.basic": "基本設定", "home.column_settings.filter_regex": "正規表現でフィルター", @@ -163,19 +164,22 @@ "navigation_bar.blocks": "ブロックしたユーザー", "navigation_bar.community_timeline": "ローカルタイムライン", "navigation_bar.direct": "ダイレクトメッセージ", + "navigation_bar.discover": "見つける", "navigation_bar.domain_blocks": "非表示にしたドメイン", "navigation_bar.edit_profile": "プロフィールを編集", "navigation_bar.favourites": "お気に入り", "navigation_bar.follow_requests": "フォローリクエスト", "navigation_bar.info": "このインスタンスについて", - "navigation_bar.keyboard_shortcuts": "キーボードショートカット", + "navigation_bar.keyboard_shortcuts": "ホットキー", "navigation_bar.lists": "リスト", "navigation_bar.logout": "ログアウト", "navigation_bar.mutes": "ミュートしたユーザー", + "navigation_bar.personal": "個人用", "navigation_bar.pins": "固定したトゥート", "navigation_bar.preferences": "ユーザー設定", "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.misc": "その他", + "navigation_bar.security": "セキュリティ", "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました", "notification.follow": "{name}さんにフォローされました", "notification.mention": "{name}さんがあなたに返信しました", @@ -267,6 +271,7 @@ "status.reblog": "ブースト", "status.reblog_private": "ブースト", "status.reblogged_by": "{name}さんがブースト", + "status.redraft": "Delete & re-draft", "status.reply": "返信", "status.replyAll": "全員に返信", "status.report": "@{name}さんを通報", @@ -284,8 +289,9 @@ "tabs_bar.local_timeline": "ローカル", "tabs_bar.notifications": "通知", "tabs_bar.search": "検索", - "timeline.media": "Media", + "timeline.media": "メディア", "timeline.posts": "投稿", + "trends.count_by_accounts": "{count} {rawCount, plural, one {人} other {人}} がトゥート", "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", "upload_area.title": "ドラッグ&ドロップでアップロード", "upload_button.label": "メディアを追加", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index edcf5f817..fef953c66 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -58,7 +58,6 @@ "column_header.pin": "고정하기", "column_header.show_settings": "설정 보이기", "column_header.unpin": "고정 해제", - "column_subheading.navigation": "내비게이션", "column_subheading.settings": "설정", "compose_form.direct_message_warning": "이 툿은 멘션 된 유저들에게만 보여집니다.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "정말로 {domain} 전체를 숨기시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다.", "confirmations.mute.confirm": "뮤트", "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.message": "정말로 {name}를 언팔로우하시겠습니까?", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", @@ -112,11 +113,10 @@ "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 인스턴스의 유저를 팔로우 해서 채워보세요", "follow_request.authorize": "허가", "follow_request.reject": "거부", - "getting_started.appsshort": "애플리케이션", - "getting_started.faq": "자주 있는 질문", + "getting_started.documentation": "Documentation", "getting_started.heading": "시작", "getting_started.open_source_notice": "Mastodon은 오픈 소스 소프트웨어입니다. 누구나 GitHub({github})에서 개발에 참여하거나, 문제를 보고할 수 있습니다.", - "getting_started.userguide": "사용자 가이드", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "고급 사용자용", "home.column_settings.basic": "기본 설정", "home.column_settings.filter_regex": "정규 표현식으로 필터링", @@ -160,18 +160,21 @@ "navigation_bar.blocks": "차단한 사용자", "navigation_bar.community_timeline": "로컬 타임라인", "navigation_bar.direct": "다이렉트 메시지", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "숨겨진 도메인", "navigation_bar.edit_profile": "프로필 편집", "navigation_bar.favourites": "즐겨찾기", "navigation_bar.follow_requests": "팔로우 요청", "navigation_bar.info": "이 인스턴스에 대해서", - "navigation_bar.keyboard_shortcuts": "키보드 단축키", + "navigation_bar.keyboard_shortcuts": "단축키", "navigation_bar.lists": "리스트", "navigation_bar.logout": "로그아웃", "navigation_bar.mutes": "뮤트 중인 사용자", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "고정된 툿", "navigation_bar.preferences": "사용자 설정", "navigation_bar.public_timeline": "연합 타임라인", + "navigation_bar.security": "Security", "notification.favourite": "{name}님이 즐겨찾기 했습니다", "notification.follow": "{name}님이 나를 팔로우 했습니다", "notification.mention": "{name}님이 답글을 보냈습니다", @@ -263,6 +266,7 @@ "status.reblog": "부스트", "status.reblog_private": "원래의 수신자들에게 부스트", "status.reblogged_by": "{name}님이 부스트 했습니다", + "status.redraft": "Delete & re-draft", "status.reply": "답장", "status.replyAll": "전원에게 답장", "status.report": "신고", @@ -282,6 +286,7 @@ "tabs_bar.search": "검색", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", "upload_area.title": "드래그 & 드롭으로 업로드", "upload_button.label": "미디어 추가", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index ee4d9de47..d744a8723 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -58,7 +58,6 @@ "column_header.pin": "Vastmaken", "column_header.show_settings": "Instellingen tonen", "column_header.unpin": "Losmaken", - "column_subheading.navigation": "Navigatie", "column_subheading.settings": "Instellingen", "compose_form.direct_message_warning": "Deze toot wordt alleen naar vermelde gebruikers verstuurd. Echter, de beheerders en moderatoren van jouw en de ontvangende Mastodonserver(s) kunnen dit bericht mogelijk wel bekijken.", "compose_form.direct_message_warning_learn_more": "Meer leren", @@ -84,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.mute.confirm": "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen", "follow_request.authorize": "Goedkeuren", "follow_request.reject": "Afkeuren", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentatie", "getting_started.heading": "Aan de slag", "getting_started.open_source_notice": "Mastodon is vrije software. Je kunt bijdragen of problemen melden op GitHub via {github}.", - "getting_started.userguide": "Gebruikersgids", + "getting_started.terms": "Voorwaarden", "home.column_settings.advanced": "Geavanceerd", "home.column_settings.basic": "Algemeen", "home.column_settings.filter_regex": "Wegfilteren met reguliere expressies", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Geblokkeerde gebruikers", "navigation_bar.community_timeline": "Lokale tijdlijn", "navigation_bar.direct": "Directe berichten", + "navigation_bar.discover": "Ontdekken", "navigation_bar.domain_blocks": "Verborgen domeinen", "navigation_bar.edit_profile": "Profiel bewerken", "navigation_bar.favourites": "Favorieten", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lijsten", "navigation_bar.logout": "Afmelden", "navigation_bar.mutes": "Genegeerde gebruikers", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Vastgezette toots", "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", + "navigation_bar.security": "Beveiliging", "notification.favourite": "{name} markeerde jouw toot als favoriet", "notification.follow": "{name} volgt jou nu", "notification.mention": "{name} vermeldde jou", @@ -263,6 +266,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost naar oorspronkelijke ontvangers", "status.reblogged_by": "{name} boostte", + "status.redraft": "Delete & re-draft", "status.reply": "Reageren", "status.replyAll": "Reageer op iedereen", "status.report": "Rapporteer @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Zoeken", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {persoon praat} other {mensen praten}} hierover", "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", "upload_area.title": "Hierin slepen om te uploaden", "upload_button.label": "Media toevoegen", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index d8de2ad4b..d971bfcdc 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -58,7 +58,6 @@ "column_header.pin": "Fest", "column_header.show_settings": "Vis innstillinger", "column_header.unpin": "Løsne", - "column_subheading.navigation": "Navigasjon", "column_subheading.settings": "Innstillinger", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Demp", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Det er ingenting her! Skriv noe offentlig, eller følg brukere manuelt fra andre instanser for å fylle den opp", "follow_request.authorize": "Autorisér", "follow_request.reject": "Avvis", - "getting_started.appsshort": "Apper", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Kom i gang", "getting_started.open_source_notice": "Mastodon er fri programvare. Du kan bidra eller rapportere problemer på GitHub på {github}.", - "getting_started.userguide": "Brukerguide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avansert", "home.column_settings.basic": "Enkel", "home.column_settings.filter_regex": "Filtrér med regulære uttrykk", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blokkerte brukere", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Rediger profil", "navigation_bar.favourites": "Favoritter", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lister", "navigation_bar.logout": "Logg ut", "navigation_bar.mutes": "Dempede brukere", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Festa tuter", "navigation_bar.preferences": "Preferanser", "navigation_bar.public_timeline": "Felles tidslinje", + "navigation_bar.security": "Security", "notification.favourite": "{name} likte din status", "notification.follow": "{name} fulgte deg", "notification.mention": "{name} nevnte deg", @@ -263,6 +266,7 @@ "status.reblog": "Fremhev", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "Fremhevd av {name}", + "status.redraft": "Delete & re-draft", "status.reply": "Svar", "status.replyAll": "Svar til samtale", "status.report": "Rapporter @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", "upload_area.title": "Dra og slipp for å laste opp", "upload_button.label": "Legg til media", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 3ad5b3d95..cfbd3a83c 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -58,7 +58,6 @@ "column_header.pin": "Penjar", "column_header.show_settings": "Mostrar los paramètres", "column_header.unpin": "Despenjar", - "column_subheading.navigation": "Navigacion", "column_subheading.settings": "Paramètres", "compose_form.direct_message_warning": "Sols los mencionats poiràn veire aqueste tut.", "compose_form.direct_message_warning_learn_more": "Ne saber mai", @@ -84,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.mute.confirm": "Rescondre", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autras instàncias per garnir lo flux public", "follow_request.authorize": "Acceptar", "follow_request.reject": "Regetar", - "getting_started.appsshort": "Aplicacions", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Per començar", "getting_started.open_source_notice": "Mastodon es un logicial liure. Podètz contribuir e mandar vòstres comentaris e rapòrt de bug via {github} sus GitHub.", - "getting_started.userguide": "Guida d’utilizacion", + "getting_started.terms": "Condicions d’utilizacion", "home.column_settings.advanced": "Avançat", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filtrar amb una expression racionala", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Personas blocadas", "navigation_bar.community_timeline": "Flux public local", "navigation_bar.direct": "Messatges dirèctes", + "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domenis resconduts", "navigation_bar.edit_profile": "Modificar lo perfil", "navigation_bar.favourites": "Favorits", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listas", "navigation_bar.logout": "Desconnexion", "navigation_bar.mutes": "Personas rescondudas", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Tuts penjats", "navigation_bar.preferences": "Preferéncias", "navigation_bar.public_timeline": "Flux public global", + "navigation_bar.security": "Seguretat", "notification.favourite": "{name} a ajustat a sos favorits", "notification.follow": "{name} vos sèc", "notification.mention": "{name} vos a mencionat", @@ -263,6 +266,7 @@ "status.reblog": "Partejar", "status.reblog_private": "Partejar a l’audiéncia d’origina", "status.reblogged_by": "{name} a partejat", + "status.redraft": "Delete & re-draft", "status.reply": "Respondre", "status.replyAll": "Respondre a la conversacion", "status.report": "Senhalar @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Recèrcas", "timeline.media": "Media", "timeline.posts": "Tuts", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", "upload_area.title": "Lisatz e depausatz per mandar", "upload_button.label": "Ajustar un mèdia", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index cca48eaf6..759d7c9e8 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -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.mute.confirm": "Wycisz", "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.message": "Czy na pewno zamierzasz przestać śledzić {name}?", "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", @@ -115,11 +117,10 @@ "empty_column.public": "Tu nic nie ma! Napisz coś publicznie, lub dodaj ludzi z innych instancji, aby to wyświetlić", "follow_request.authorize": "Autoryzuj", "follow_request.reject": "Odrzuć", - "getting_started.appsshort": "Aplikacje", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Dokumentacja", "getting_started.heading": "Rozpocznij", "getting_started.open_source_notice": "Mastodon jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitHubie tutaj: {github}.", - "getting_started.userguide": "Podręcznik użytkownika", + "getting_started.terms": "Zasady użytkowania", "home.column_settings.advanced": "Zaawansowane", "home.column_settings.basic": "Podstawowe", "home.column_settings.filter_regex": "Filtruj z użyciem wyrażeń regularnych", @@ -163,6 +164,7 @@ "navigation_bar.blocks": "Zablokowani użytkownicy", "navigation_bar.community_timeline": "Lokalna oś czasu", "navigation_bar.direct": "Wiadomości bezpośrednie", + "navigation_bar.discover": "Odkrywaj", "navigation_bar.domain_blocks": "Ukryte domeny", "navigation_bar.edit_profile": "Edytuj profil", "navigation_bar.favourites": "Ulubione", @@ -173,9 +175,11 @@ "navigation_bar.logout": "Wyloguj", "navigation_bar.misc": "Różne", "navigation_bar.mutes": "Wyciszeni użytkownicy", + "navigation_bar.personal": "Osobiste", "navigation_bar.pins": "Przypięte wpisy", "navigation_bar.preferences": "Preferencje", "navigation_bar.public_timeline": "Globalna oś czasu", + "navigation_bar.security": "Bezpieczeństwo", "notification.favourite": "{name} dodał Twój wpis do ulubionych", "notification.follow": "{name} zaczął Cię śledzić", "notification.mention": "{name} wspomniał o tobie", @@ -267,6 +271,7 @@ "status.reblog": "Podbij", "status.reblog_private": "Podbij dla odbiorców oryginalnego wpisu", "status.reblogged_by": "{name} podbił", + "status.redraft": "Usuń i przeredaguj", "status.reply": "Odpowiedz", "status.replyAll": "Odpowiedz na wątek", "status.report": "Zgłoś @{name}", @@ -286,6 +291,7 @@ "tabs_bar.search": "Szukaj", "timeline.media": "Zawartość multimedialna", "timeline.posts": "Wpisy", + "trends.count_by_accounts": "{count} {rawCount, plural, one {osoba rozmawia} few {osoby rozmawiają} other {osób rozmawia}} o tym", "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.", "upload_area.title": "Przeciągnij i upuść aby wysłać", "upload_button.label": "Dodaj zawartość multimedialną", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index c8441df29..fcb2a5686 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -58,7 +58,6 @@ "column_header.pin": "Fixar", "column_header.show_settings": "Mostrar configurações", "column_header.unpin": "Desafixar", - "column_subheading.navigation": "Navegação", "column_subheading.settings": "Configurações", "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados. A mensagem não é encriptada e será armazenada nos servidores dos usuários mencionados.", "compose_form.direct_message_warning_learn_more": "Saber mais", @@ -84,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.mute.confirm": "Silenciar", "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.message": "Você tem certeza de que quer deixar de seguir {name}?", "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", @@ -112,11 +113,10 @@ "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Primeiros passos", "getting_started.open_source_notice": "Mastodon é um software de código aberto. Você pode contribuir ou reportar problemas na página do GitHub do projeto: {github}.", - "getting_started.userguide": "Guia de usuário", + "getting_started.terms": "Termos de serviço", "home.column_settings.advanced": "Avançado", "home.column_settings.basic": "Básico", "home.column_settings.filter_regex": "Filtrar com uma expressão regular", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Usuários bloqueados", "navigation_bar.community_timeline": "Local", "navigation_bar.direct": "Mensagens diretas", + "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios escondidos", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listas", "navigation_bar.logout": "Sair", "navigation_bar.mutes": "Usuários silenciados", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Postagens fixadas", "navigation_bar.preferences": "Preferências", "navigation_bar.public_timeline": "Global", + "navigation_bar.security": "Segurança", "notification.favourite": "{name} adicionou a sua postagem aos favoritos", "notification.follow": "{name} te seguiu", "notification.mention": "{name} te mencionou", @@ -263,6 +266,7 @@ "status.reblog": "Compartilhar", "status.reblog_private": "Compartilhar com a audiência original", "status.reblogged_by": "{name} compartilhou", + "status.redraft": "Delete & re-draft", "status.reply": "Responder", "status.replyAll": "Responder à sequência", "status.report": "Denunciar @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Buscar", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre", "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar mídia", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 18d66be7f..d51a47955 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -58,7 +58,6 @@ "column_header.pin": "Fixar", "column_header.show_settings": "Mostrar preferências", "column_header.unpin": "Desafixar", - "column_subheading.navigation": "Navegação", "column_subheading.settings": "Preferências", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Silenciar", "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.message": "De certeza que queres deixar de seguir {name}?", "embed.instructions": "Publicar este post num outro site copiando o código abaixo.", @@ -112,11 +113,10 @@ "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para ver aqui os conteúdos públicos", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", - "getting_started.appsshort": "Aplicações", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Primeiros passos", "getting_started.open_source_notice": "Mastodon é software de fonte aberta. Podes contribuir ou repostar problemas no GitHub do projecto: {github}.", - "getting_started.userguide": "Guia do utilizador", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avançado", "home.column_settings.basic": "Básico", "home.column_settings.filter_regex": "Filtrar com uma expressão regular", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Utilizadores bloqueados", "navigation_bar.community_timeline": "Local", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listas", "navigation_bar.logout": "Sair", "navigation_bar.mutes": "Utilizadores silenciados", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Posts fixos", "navigation_bar.preferences": "Preferências", "navigation_bar.public_timeline": "Global", + "navigation_bar.security": "Security", "notification.favourite": "{name} adicionou o teu post aos favoritos", "notification.follow": "{name} seguiu-te", "notification.mention": "{name} mencionou-te", @@ -263,6 +266,7 @@ "status.reblog": "Partilhar", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} partilhou", + "status.redraft": "Delete & re-draft", "status.reply": "Responder", "status.replyAll": "Responder à conversa", "status.report": "Denunciar @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "O teu rascunho vai ser perdido se abandonares o Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar media", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 577ec9921..0ef7a32bb 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -58,7 +58,6 @@ "column_header.pin": "Закрепить", "column_header.show_settings": "Показать настройки", "column_header.unpin": "Открепить", - "column_subheading.navigation": "Навигация", "column_subheading.settings": "Настройки", "compose_form.direct_message_warning": "Этот статус будет виден только упомянутым пользователям.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "Вы на самом деле уверены, что хотите блокировать весь {domain}? В большинстве случаев нескольких отдельных блокировок или глушений достаточно.", "confirmations.mute.confirm": "Заглушить", "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.message": "Вы уверены, что хотите отписаться от {name}?", "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", @@ -112,11 +113,10 @@ "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту.", "follow_request.authorize": "Авторизовать", "follow_request.reject": "Отказать", - "getting_started.appsshort": "Приложения", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Добро пожаловать", "getting_started.open_source_notice": "Mastodon - программа с открытым исходным кодом. Вы можете помочь проекту или сообщить о проблемах на GitHub по адресу {github}.", - "getting_started.userguide": "Руководство", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Дополнительные", "home.column_settings.basic": "Основные", "home.column_settings.filter_regex": "Отфильтровать регулярным выражением", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Список блокировки", "navigation_bar.community_timeline": "Локальная лента", "navigation_bar.direct": "Личные сообщения", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Скрытые домены", "navigation_bar.edit_profile": "Изменить профиль", "navigation_bar.favourites": "Понравившееся", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Списки", "navigation_bar.logout": "Выйти", "navigation_bar.mutes": "Список глушения", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Закреплённые посты", "navigation_bar.preferences": "Опции", "navigation_bar.public_timeline": "Глобальная лента", + "navigation_bar.security": "Security", "notification.favourite": "{name} понравился Ваш статус", "notification.follow": "{name} подписался(-лась) на Вас", "notification.mention": "{name} упомянул(а) Вас", @@ -263,6 +266,7 @@ "status.reblog": "Продвинуть", "status.reblog_private": "Продвинуть для своей аудитории", "status.reblogged_by": "{name} продвинул(а)", + "status.redraft": "Delete & re-draft", "status.reply": "Ответить", "status.replyAll": "Ответить на тред", "status.report": "Пожаловаться", @@ -282,6 +286,7 @@ "tabs_bar.search": "Поиск", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.", "upload_area.title": "Перетащите сюда, чтобы загрузить", "upload_button.label": "Добавить медиаконтент", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index b85ba1318..983018dd8 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -58,10 +58,9 @@ "column_header.pin": "Pripnúť", "column_header.show_settings": "Ukáž nastavenia", "column_header.unpin": "Odopnúť", - "column_subheading.navigation": "Navigácia", "column_subheading.settings": "Nastavenia", "compose_form.direct_message_warning": "Tento príspevok bude videný výhradne iba spomenutými užívateľmi. Ber ale na vedomie že správci tvojej a všetkých iných zahrnutých instancií majú možnosť skontrolovať túto správu.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "Zistiť viac", "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.", "compose_form.lock_disclaimer": "Váš účet nie je zamknutý. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", @@ -84,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.mute.confirm": "Ignoruj", "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.message": "Naozaj chcete prestať sledovať {name}?", "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", @@ -112,11 +113,10 @@ "empty_column.public": "Ešte tu nič nie je. Napíšte niečo verejne alebo začnite sledovať používateľov z iných Mastodon serverov aby tu niečo pribudlo", "follow_request.authorize": "Povoľ prístup", "follow_request.reject": "Odmietni", - "getting_started.appsshort": "Aplikácie", - "getting_started.faq": "Časté otázky", + "getting_started.documentation": "Documentation", "getting_started.heading": "Začni tu", "getting_started.open_source_notice": "Mastodon má otvorený kód. Nahlásiť chyby, alebo prispieť môžeš na GitHube v {github}.", - "getting_started.userguide": "Používateľská príručka", + "getting_started.terms": "Podmienky prevozu", "home.column_settings.advanced": "Pokročilé", "home.column_settings.basic": "Základné", "home.column_settings.filter_regex": "Filtrovať použitím regulárnych výrazov", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blokovaní užívatelia", "navigation_bar.community_timeline": "Lokálna časová os", "navigation_bar.direct": "Súkromné správy", + "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", "navigation_bar.edit_profile": "Upraviť profil", "navigation_bar.favourites": "Obľúbené", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Zoznamy", "navigation_bar.logout": "Odhlásiť", "navigation_bar.mutes": "Ignorovaní užívatelia", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pripnuté tooty", "navigation_bar.preferences": "Voľby", "navigation_bar.public_timeline": "Federovaná časová os", + "navigation_bar.security": "Zabezbečenie", "notification.favourite": "{name} sa páči tvoj status", "notification.follow": "{name} ťa začal/a následovať", "notification.mention": "{name} ťa spomenul/a", @@ -187,7 +190,7 @@ "notifications.column_settings.reblog": "Boosty:", "notifications.column_settings.show": "Zobraziť v stĺpci", "notifications.column_settings.sound": "Prehrať zvuk", - "notifications.group": "{count} notifications", + "notifications.group": "{count} oznámenia", "onboarding.done": "Koniec", "onboarding.next": "Ďalej", "onboarding.page_five.public_timelines": "Lokálna časová os zobrazuje verejné správy od všetkých na {domain}. Federovaná časová os zobrazuje verejné správy od všetkých tých, čo následujú užívatrľov {domain} z iných serverov. Tieto sú takzvané Verejné Časové Osi, výborná možnosť ako nájsť a spoznať nových ľudí.", @@ -263,6 +266,7 @@ "status.reblog": "Povýšiť", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} povýšil/a", + "status.redraft": "Delete & re-draft", "status.reply": "Odpovedať", "status.replyAll": "Odpovedať na diskusiu", "status.report": "Nahlásiť @{name}", @@ -281,7 +285,8 @@ "tabs_bar.notifications": "Notifikácie", "tabs_bar.search": "Hľadaj", "timeline.media": "Media", - "timeline.posts": "Toots", + "timeline.posts": "Príspevky", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Čo máte rozpísané sa stratí, ak opustíte Mastodon.", "upload_area.title": "Ťahaj a pusti pre nahratie", "upload_button.label": "Pridať médiá", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 3cc7389ae..2d89b63eb 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -58,7 +58,6 @@ "column_header.pin": "Pripni", "column_header.show_settings": "Prikaži nastavitve", "column_header.unpin": "Odpni", - "column_subheading.navigation": "Navigacija", "column_subheading.settings": "Nastavitve", "compose_form.direct_message_warning": "Ta tut bo viden le vsem omenjenim uporabnikom.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Utišanje", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Tukaj ni ničesar! Da ga napolnite, napišite nekaj javnega ali pa ročno sledite uporabnikom iz drugih vozlišč", "follow_request.authorize": "Odobri", "follow_request.reject": "Zavrni", - "getting_started.appsshort": "Aplikacije", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Prvi koraki", "getting_started.open_source_notice": "Mastodon je odprtokodna programska oprema. V GitHubu na {github} lahko prispevate ali poročate o napakah.", - "getting_started.userguide": "Navodila za uporabo", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", "home.column_settings.filter_regex": "Filtrirajte z navadnimi izrazi", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pripeti tuti", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", @@ -263,6 +266,7 @@ "status.reblog": "Suni", "status.reblog_private": "Suni v prvotno občinstvo", "status.reblogged_by": "{name} sunjen", + "status.redraft": "Delete & re-draft", "status.reply": "Odgovori", "status.replyAll": "Odgovori na objavo", "status.report": "Prijavi @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Poišči", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.", "upload_area.title": "Povlecite in spustite za pošiljanje", "upload_button.label": "Dodaj medij", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index e2b55c179..c17495979 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -58,7 +58,6 @@ "column_header.pin": "Prikači", "column_header.show_settings": "Prikaži postavke", "column_header.unpin": "Otkači", - "column_subheading.navigation": "Navigacija", "column_subheading.settings": "Postavke", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Ućutkaj", "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.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", @@ -112,11 +113,10 @@ "empty_column.public": "Ovde nema ničega! Napišite nešto javno, ili nađite korisnike sa drugih instanci koje ćete zapratiti da popunite ovu prazninu", "follow_request.authorize": "Odobri", "follow_request.reject": "Odbij", - "getting_started.appsshort": "Aplikacije", - "getting_started.faq": "ČPP", + "getting_started.documentation": "Documentation", "getting_started.heading": "Da počnete", "getting_started.open_source_notice": "Mastodont je softver otvorenog koda. Možete mu doprineti ili prijaviti probleme preko GitHub-a na {github}.", - "getting_started.userguide": "Korisničko uputstvo", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", "home.column_settings.filter_regex": "Filtriraj regularnim izrazima", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalna lajna", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Izmeni profil", "navigation_bar.favourites": "Omiljeni", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Liste", "navigation_bar.logout": "Odjava", "navigation_bar.mutes": "Ućutkani korisnici", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Prikačeni tutovi", "navigation_bar.preferences": "Podešavanja", "navigation_bar.public_timeline": "Federisana lajna", + "navigation_bar.security": "Security", "notification.favourite": "{name} je stavio Vaš status kao omiljeni", "notification.follow": "{name} Vas je zapratio", "notification.mention": "{name} Vas je pomenuo", @@ -263,6 +266,7 @@ "status.reblog": "Podrži", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} podržao(la)", + "status.redraft": "Delete & re-draft", "status.reply": "Odgovori", "status.replyAll": "Odgovori na diskusiju", "status.report": "Prijavi korisnika @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.", "upload_area.title": "Prevucite ovde da otpremite", "upload_button.label": "Dodaj multimediju", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 09efb985c..f11e3935c 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -58,7 +58,6 @@ "column_header.pin": "Прикачи", "column_header.show_settings": "Прикажи поставке", "column_header.unpin": "Откачи", - "column_subheading.navigation": "Навигација", "column_subheading.settings": "Поставке", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "Да ли сте стварно, стварно сигурно да желите да блокирате цео домен {domain}? У већини случајева, пар добрих блокирања или ућуткавања су довољна и препоручљива.", "confirmations.mute.confirm": "Ућуткај", "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.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", @@ -112,11 +113,10 @@ "empty_column.public": "Овде нема ничега! Напишите нешто јавно, или нађите кориснике са других инстанци које ћете запратити да попуните ову празнину", "follow_request.authorize": "Одобри", "follow_request.reject": "Одбиј", - "getting_started.appsshort": "Апликације", - "getting_started.faq": "ЧПП", + "getting_started.documentation": "Documentation", "getting_started.heading": "Да почнете", "getting_started.open_source_notice": "Мастoдонт је софтвер отвореног кода. Можете му допринети или пријавити проблеме преко GitHub-а на {github}.", - "getting_started.userguide": "Корисничко упутство", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Напредно", "home.column_settings.basic": "Основно", "home.column_settings.filter_regex": "Филтрирај регуларним изразима", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Блокирани корисници", "navigation_bar.community_timeline": "Локална лајна", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Измени профил", "navigation_bar.favourites": "Омиљени", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Листе", "navigation_bar.logout": "Одјава", "navigation_bar.mutes": "Ућуткани корисници", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Прикачени тутови", "navigation_bar.preferences": "Подешавања", "navigation_bar.public_timeline": "Федерисана лајна", + "navigation_bar.security": "Security", "notification.favourite": "{name} је ставио Ваш статус као омиљени", "notification.follow": "{name} Вас је запратио", "notification.mention": "{name} Вас је поменуо", @@ -263,6 +266,7 @@ "status.reblog": "Подржи", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} подржао(ла)", + "status.redraft": "Delete & re-draft", "status.reply": "Одговори", "status.replyAll": "Одговори на дискусију", "status.report": "Пријави корисника @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.", "upload_area.title": "Превуците овде да отпремите", "upload_button.label": "Додај мултимедију", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index d2af13bfb..fd0cc3268 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -58,7 +58,6 @@ "column_header.pin": "Fäst", "column_header.show_settings": "Visa inställningar", "column_header.unpin": "Ångra fäst", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Inställningar", "compose_form.direct_message_warning": "Denna toot kommer endast att skickas nämnda nämnda användare.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Tysta", "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.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.", @@ -112,11 +113,10 @@ "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det", "follow_request.authorize": "Godkänn", "follow_request.reject": "Avvisa", - "getting_started.appsshort": "Appar", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Kom igång", "getting_started.open_source_notice": "Mastodon är programvara med öppen källkod. Du kan bidra eller rapportera problem via GitHub på {github}.", - "getting_started.userguide": "Användarguide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Avancerad", "home.column_settings.basic": "Grundläggande", "home.column_settings.filter_regex": "Filtrera ut med regelbundna uttryck", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blockerade användare", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.direct": "Direktmeddelanden", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Dolda domäner", "navigation_bar.edit_profile": "Redigera profil", "navigation_bar.favourites": "Favoriter", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Listor", "navigation_bar.logout": "Logga ut", "navigation_bar.mutes": "Tystade användare", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Nålade inlägg (toots)", "navigation_bar.preferences": "Inställningar", "navigation_bar.public_timeline": "Förenad tidslinje", + "navigation_bar.security": "Security", "notification.favourite": "{name} favoriserade din status", "notification.follow": "{name} följer dig", "notification.mention": "{name} nämnde dig", @@ -263,6 +266,7 @@ "status.reblog": "Knuff", "status.reblog_private": "Knuffa till de ursprungliga åhörarna", "status.reblogged_by": "{name} knuffade", + "status.redraft": "Delete & re-draft", "status.reply": "Svara", "status.replyAll": "Svara på tråden", "status.report": "Rapportera @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Sök", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "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_button.label": "Lägg till media", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index ce0d4b9cc..22b164936 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Mute", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", @@ -263,6 +266,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", + "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index f0ba25ec3..57fe1b5d9 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Mute", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", @@ -263,6 +266,7 @@ "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", + "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 89f00fd3b..9c5e89463 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigasyon", "column_subheading.settings": "Ayarlar", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,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.mute.confirm": "Sessize al", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "Burada hiçbir gönderi yok! Herkese açık bir şeyler yazın, veya diğer sunucudaki insanları takip ederek bu alanın dolmasını sağlayın", "follow_request.authorize": "Yetkilendir", "follow_request.reject": "Reddet", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Başlangıç", "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. Github {github}. {apps} üzerinden katkıda bulunabilir, hata raporlayabilirsiniz.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Gelişmiş", "home.column_settings.basic": "Temel", "home.column_settings.filter_regex": "Regex kullanarak filtrele", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Engellenen kullanıcılar", "navigation_bar.community_timeline": "Yerel zaman tüneli", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profili düzenle", "navigation_bar.favourites": "Favoriler", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Çıkış", "navigation_bar.mutes": "Sessize alınmış kullanıcılar", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Tercihler", "navigation_bar.public_timeline": "Federe zaman tüneli", + "navigation_bar.security": "Security", "notification.favourite": "{name} senin durumunu favorilere ekledi", "notification.follow": "{name} seni takip ediyor", "notification.mention": "{name} mentioned you", @@ -263,6 +266,7 @@ "status.reblog": "Boost'la", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boost etti", + "status.redraft": "Delete & re-draft", "status.reply": "Cevapla", "status.replyAll": "Konuşmayı cevapla", "status.report": "@{name}'i raporla", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "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_button.label": "Görsel ekle", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index e81476541..0f76a0045 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Навігація", "column_subheading.settings": "Налаштування", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів.", "confirmations.mute.confirm": "Заглушити", "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.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку.", "follow_request.authorize": "Авторизувати", "follow_request.reject": "Відмовити", - "getting_started.appsshort": "Додатки", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Ласкаво просимо", "getting_started.open_source_notice": "Mastodon - програма з відкритим вихідним кодом. Ви можете допомогти проекту, або повідомити про проблеми на GitHub за адресою {github}.", - "getting_started.userguide": "Посібник", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Додаткові", "home.column_settings.basic": "Основні", "home.column_settings.filter_regex": "Відфільтрувати регулярним виразом", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Заблоковані користувачі", "navigation_bar.community_timeline": "Локальна стрічка", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Редагувати профіль", "navigation_bar.favourites": "Вподобане", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Вийти", "navigation_bar.mutes": "Заглушені користувачі", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Налаштування", "navigation_bar.public_timeline": "Глобальна стрічка", + "navigation_bar.security": "Security", "notification.favourite": "{name} сподобався ваш допис", "notification.follow": "{name} підписався(-лась) на Вас", "notification.mention": "{name} згадав(-ла) Вас", @@ -263,6 +266,7 @@ "status.reblog": "Передмухнути", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} передмухнув(-ла)", + "status.redraft": "Delete & re-draft", "status.reply": "Відповісти", "status.replyAll": "Відповісти на тред", "status.report": "Поскаржитися", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Перетягніть сюди, щоб завантажити", "upload_button.label": "Додати медіаконтент", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index b67afd29f..24bab6f80 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -58,7 +58,6 @@ "column_header.pin": "固定", "column_header.show_settings": "显示设置", "column_header.unpin": "取消固定", - "column_subheading.navigation": "导航", "column_subheading.settings": "设置", "compose_form.direct_message_warning": "这条嘟文仅对所有被提及的用户可见。", "compose_form.direct_message_warning_learn_more": "了解详情", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "你真的确定要隐藏所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户应该就能满足你的需要了。", "confirmations.mute.confirm": "隐藏", "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.message": "你确定要取消关注 {name} 吗?", "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", @@ -112,11 +113,10 @@ "empty_column.public": "这里神马都没有!写一些公开的嘟文,或者关注其他实例的用户后,这里就会有嘟文出现了哦!", "follow_request.authorize": "同意", "follow_request.reject": "拒绝", - "getting_started.appsshort": "应用", - "getting_started.faq": "常见问题", + "getting_started.documentation": "Documentation", "getting_started.heading": "开始使用", "getting_started.open_source_notice": "Mastodon 是一个开源软件。欢迎前往 GitHub({github})贡献代码或反馈问题。", - "getting_started.userguide": "用户指南", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "高级设置", "home.column_settings.basic": "基本设置", "home.column_settings.filter_regex": "使用正则表达式(regex)过滤", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "已屏蔽的用户", "navigation_bar.community_timeline": "本站时间轴", "navigation_bar.direct": "私信", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "已屏蔽的网站", "navigation_bar.edit_profile": "修改个人资料", "navigation_bar.favourites": "收藏的内容", @@ -169,9 +170,11 @@ "navigation_bar.lists": "列表", "navigation_bar.logout": "注销", "navigation_bar.mutes": "已隐藏的用户", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "置顶嘟文", "navigation_bar.preferences": "首选项", "navigation_bar.public_timeline": "跨站公共时间轴", + "navigation_bar.security": "Security", "notification.favourite": "{name} 收藏了你的嘟文", "notification.follow": "{name} 开始关注你", "notification.mention": "{name} 提及你", @@ -263,6 +266,7 @@ "status.reblog": "转嘟", "status.reblog_private": "转嘟给原有关注者", "status.reblogged_by": "{name} 转嘟了", + "status.redraft": "Delete & re-draft", "status.reply": "回复", "status.replyAll": "回复所有人", "status.report": "举报 @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "搜索", "timeline.media": "媒体", "timeline.posts": "嘟文", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会被丢弃。", "upload_area.title": "将文件拖放到此处开始上传", "upload_button.label": "上传媒体文件", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index cad53c69a..578f03842 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -58,10 +58,9 @@ "column_header.pin": "固定", "column_header.show_settings": "顯示設定", "column_header.unpin": "取下", - "column_subheading.navigation": "瀏覽", "column_subheading.settings": "設定", "compose_form.direct_message_warning": "這文章只有被提及的用戶才可以看到。", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。", "compose_form.lock_disclaimer": "你的用戶狀態為「{locked}」,任何人都能立即關注你,然後看到「只有關注者能看」的文章。", "compose_form.lock_disclaimer.lock": "公共", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。", "confirmations.mute.confirm": "靜音", "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.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", @@ -94,7 +95,7 @@ "emoji_button.food": "飲飲食食", "emoji_button.label": "加入表情符號", "emoji_button.nature": "自然", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "沒有表情符號!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物品", "emoji_button.people": "人物", "emoji_button.recent": "常用", @@ -112,11 +113,10 @@ "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。", "follow_request.authorize": "批准", "follow_request.reject": "拒絕", - "getting_started.appsshort": "手機應用", - "getting_started.faq": "常見問題", + "getting_started.documentation": "Documentation", "getting_started.heading": "開始使用", "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub ({github}) 貢獻或者回報問題。", - "getting_started.userguide": "使用指南", + "getting_started.terms": "服務條款", "home.column_settings.advanced": "進階", "home.column_settings.basic": "基本", "home.column_settings.filter_regex": "使用正規表達式 (regular expression) 過濾", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "被你封鎖的用戶", "navigation_bar.community_timeline": "本站時間軸", "navigation_bar.direct": "個人訊息", + "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "隱藏的服務站", "navigation_bar.edit_profile": "修改個人資料", "navigation_bar.favourites": "最愛的內容", @@ -169,9 +170,11 @@ "navigation_bar.lists": "列表", "navigation_bar.logout": "登出", "navigation_bar.mutes": "被你靜音的用戶", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "置頂文章", "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "跨站時間軸", + "navigation_bar.security": "安全", "notification.favourite": "{name} 收藏了你的文章", "notification.follow": "{name} 開始關注你", "notification.mention": "{name} 提及你", @@ -187,20 +190,20 @@ "notifications.column_settings.reblog": "轉推你的文章:", "notifications.column_settings.show": "在通知欄顯示", "notifications.column_settings.sound": "播放音效", - "notifications.group": "{count} notifications", + "notifications.group": "{count} 條通知", "onboarding.done": "開始使用", "onboarding.next": "繼續", "onboarding.page_five.public_timelines": "「本站時間軸」顯示在 {domain} 各用戶的公開文章。「跨站時間軸」顯示在 {domain} 各人關注的所有用戶(包括其他服務站)的公開文章。這些都是「公共時間軸」,是認識新朋友的好地方。", - "onboarding.page_four.home": "「主頁」顯示你所關注用戶的文章", + "onboarding.page_four.home": "「主頁」顯示你所關注用戶的文章。", "onboarding.page_four.notifications": "「通知」欄顯示你和其他人的互動。", - "onboarding.page_one.federation": "Mastodon(萬象社交)是由一批獨立網站組成的龐大網絡,我們將這些獨立又互連網站稱為「服務站」(instance)", + "onboarding.page_one.federation": "Mastodon(萬象社交)是由一批獨立網站組成的龐大網絡,我們將這些獨立又互連網站稱為「服務站」(instance) 。", "onboarding.page_one.full_handle": "你的帳號全名", - "onboarding.page_one.handle_hint": "朋友可以從這個帳號全名找到你", - "onboarding.page_one.welcome": "歡迎使用 Mastodon(萬象社交)", - "onboarding.page_six.admin": "你服務站的管理員是{admin}", + "onboarding.page_one.handle_hint": "朋友可以從這個帳號全名找到你。", + "onboarding.page_one.welcome": "歡迎使用 Mastodon(萬象社交)!", + "onboarding.page_six.admin": "你服務站的管理員是{admin}。", "onboarding.page_six.almost_done": "差不多了……", "onboarding.page_six.appetoot": "手機,你好!", - "onboarding.page_six.apps_available": "目前支援 Mastodon 的{apps}已經支援 iOS、Android 和其他系統平台", + "onboarding.page_six.apps_available": "目前支援 Mastodon 的{apps}已經支援 iOS、Android 和其他系統平台。", "onboarding.page_six.github": "Mastodon (萬象)是一個開源的程式,你可以在 {github} 上回報問題、提議新功能、或者參與開發貢獻。", "onboarding.page_six.guidelines": "社群守則", "onboarding.page_six.read_guidelines": "請留意閱讀 {domain} 的 {guidelines}!", @@ -237,7 +240,7 @@ "search_popout.tips.full_text": "輸入簡單的文字,搜索由你發放、收藏、轉推和提及你的文章,以及符合的用戶名稱,帳號名稱和標籤。", "search_popout.tips.hashtag": "標籤", "search_popout.tips.status": "文章", - "search_popout.tips.text": "輸入簡單的文字,搜索符合的用戶名稱,帳號名稱和標籤。", + "search_popout.tips.text": "輸入簡單的文字,搜索符合的用戶名稱,帳號名稱和標籤", "search_popout.tips.user": "用戶", "search_results.accounts": "使用者", "search_results.hashtags": "標籤", @@ -263,6 +266,7 @@ "status.reblog": "轉推", "status.reblog_private": "轉推到原讀者", "status.reblogged_by": "{name} 轉推", + "status.redraft": "Delete & re-draft", "status.reply": "回應", "status.replyAll": "回應所有人", "status.report": "舉報 @{name}", @@ -281,7 +285,8 @@ "tabs_bar.notifications": "通知", "tabs_bar.search": "搜尋", "timeline.media": "Media", - "timeline.posts": "Toots", + "timeline.posts": "文章", + "trends.count_by_accounts": "{count} 位用戶在討論", "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。", "upload_area.title": "將檔案拖放至此上載", "upload_button.label": "上載媒體檔案", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 91b44012f..88dd4ac6d 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -58,7 +58,6 @@ "column_header.pin": "固定", "column_header.show_settings": "顯示設定", "column_header.unpin": "取下", - "column_subheading.navigation": "瀏覽", "column_subheading.settings": "設定", "compose_form.direct_message_warning": "此則推文只會被所有提到的使用者看見。", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。", "confirmations.mute.confirm": "消音", "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.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此貼文,請將以下代碼貼進你的網站。", @@ -112,11 +113,10 @@ "empty_column.public": "這裡什麼都沒有!公開寫些什麼,或是關注其他副本的使用者。", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", - "getting_started.appsshort": "應用程式", - "getting_started.faq": "常見問答", + "getting_started.documentation": "Documentation", "getting_started.heading": "馬上開始", "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上做出貢獻或是回報問題。", - "getting_started.userguide": "使用者指南", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "進階", "home.column_settings.basic": "基本", "home.column_settings.filter_regex": "以正規表示式過濾", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "封鎖的使用者", "navigation_bar.community_timeline": "本地時間軸", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "隱藏的域名", "navigation_bar.edit_profile": "編輯用者資訊", "navigation_bar.favourites": "最愛", @@ -169,9 +170,11 @@ "navigation_bar.lists": "名單", "navigation_bar.logout": "登出", "navigation_bar.mutes": "消音的使用者", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "置頂貼文", "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "聯盟時間軸", + "navigation_bar.security": "Security", "notification.favourite": "{name}收藏了你的狀態", "notification.follow": "{name}關注了你", "notification.mention": "{name}提到了你", @@ -263,6 +266,7 @@ "status.reblog": "轉推", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} 轉推了", + "status.redraft": "Delete & re-draft", "status.reply": "回應", "status.replyAll": "回應這串", "status.report": "通報 @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", "upload_area.title": "拖放來上傳", "upload_button.label": "增加媒體", diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 62461d1a7..8524ddb8e 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -32,9 +32,11 @@ import { } from '../actions/compose'; import { TIMELINE_DELETE } from '../actions/timelines'; 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 uuid from '../uuid'; import { me } from '../initial_state'; +import { unescapeHTML } from '../utils/html'; const initialState = ImmutableMap({ mounted: 0, @@ -170,6 +172,18 @@ const hydrate = (state, hydratedState) => { 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) { switch(action.type) { case STORE_HYDRATE: @@ -301,6 +315,24 @@ export default function compose(state = initialState, action) { 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: return state; } diff --git a/app/javascript/mastodon/reducers/contexts.js b/app/javascript/mastodon/reducers/contexts.js index 53e70b58e..4c2d6cc8a 100644 --- a/app/javascript/mastodon/reducers/contexts.js +++ b/app/javascript/mastodon/reducers/contexts.js @@ -5,6 +5,7 @@ import { import { CONTEXT_FETCH_SUCCESS } from '../actions/statuses'; import { TIMELINE_DELETE, TIMELINE_UPDATE } from '../actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import compareId from '../compare_id'; const initialState = ImmutableMap({ inReplyTos: ImmutableMap(), @@ -15,27 +16,27 @@ const normalizeContext = (immutableState, id, ancestors, descendants) => immutab state.update('inReplyTos', immutableAncestors => immutableAncestors.withMutations(inReplyTos => { state.update('replies', immutableDescendants => immutableDescendants.withMutations(replies => { function addReply({ id, in_reply_to_id }) { - if (in_reply_to_id) { - const siblings = replies.get(in_reply_to_id, ImmutableList()); + if (in_reply_to_id && !inReplyTos.has(id)) { - if (!siblings.includes(id)) { - const index = siblings.findLastIndex(sibling => sibling.id < id); - replies.set(in_reply_to_id, siblings.insert(index + 1, id)); - } + replies.update(in_reply_to_id, ImmutableList(), siblings => { + const index = siblings.findLastIndex(sibling => compareId(sibling, id) < 0); + return siblings.insert(index + 1, id); + }); inReplyTos.set(id, in_reply_to_id); } } - if (ancestors[0]) { - addReply({ id, in_reply_to_id: ancestors[0].id }); - } + // We know in_reply_to_id of statuses but `id` itself. + // So we assume that the status of the id replies to last ancestors. - if (descendants[0]) { - addReply({ id: descendants[0].id, in_reply_to_id: id }); + ancestors.forEach(addReply); + + if (ancestors[0]) { + addReply({ id, in_reply_to_id: ancestors[ancestors.length - 1].id }); } - [ancestors, descendants].forEach(statuses => statuses.forEach(addReply)); + descendants.forEach(addReply); })); })); }); @@ -80,7 +81,7 @@ const updateContext = (state, status) => { mutable.setIn(['inReplyTos', status.id], status.in_reply_to_id); if (!replies.includes(status.id)) { - mutable.setIn(['replies', status.id], replies.push(status.id)); + mutable.setIn(['replies', status.in_reply_to_id], replies.push(status.id)); } }); } diff --git a/app/javascript/mastodon/reducers/domain_lists.js b/app/javascript/mastodon/reducers/domain_lists.js index a9e3519f3..eff97fbd6 100644 --- a/app/javascript/mastodon/reducers/domain_lists.js +++ b/app/javascript/mastodon/reducers/domain_lists.js @@ -6,7 +6,9 @@ import { import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable'; const initialState = ImmutableMap({ - blocks: ImmutableMap(), + blocks: ImmutableMap({ + items: ImmutableOrderedSet(), + }), }); export default function domainLists(state = initialState, action) { diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js index 019c1f466..3d9a6a132 100644 --- a/app/javascript/mastodon/reducers/index.js +++ b/app/javascript/mastodon/reducers/index.js @@ -26,7 +26,6 @@ import height_cache from './height_cache'; import custom_emojis from './custom_emojis'; import lists from './lists'; import listEditor from './list_editor'; -import trends from './trends'; const reducers = { dropdown_menu, @@ -56,7 +55,6 @@ const reducers = { custom_emojis, lists, listEditor, - trends, }; export default combineReducers(reducers); diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index de8865e43..0a034d739 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -64,6 +64,10 @@ const initialState = ImmutableMap({ body: '', }), }), + + trends: ImmutableMap({ + show: true, + }), }); const defaultColumns = fromJS([ diff --git a/app/javascript/mastodon/reducers/trends.js b/app/javascript/mastodon/reducers/trends.js deleted file mode 100644 index 95cf8f284..000000000 --- a/app/javascript/mastodon/reducers/trends.js +++ /dev/null @@ -1,13 +0,0 @@ -import { TRENDS_FETCH_SUCCESS } from '../actions/trends'; -import { fromJS } from 'immutable'; - -const initialState = null; - -export default function trendsReducer(state = initialState, action) { - switch(action.type) { - case TRENDS_FETCH_SUCCESS: - return fromJS(action.trends); - default: - return state; - } -}; diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js index c1854c1cd..2435da117 100644 --- a/app/javascript/mastodon/service_worker/entry.js +++ b/app/javascript/mastodon/service_worker/entry.js @@ -33,7 +33,7 @@ self.addEventListener('fetch', function(event) { event.respondWith(asyncResponse.then( response => asyncCache.then(cache => cache.put('/', response.clone())) - .then(() => response), + .then(() => response), () => asyncCache.then(cache => cache.match('/')))); } else if (url.pathname === '/auth/sign_out') { const asyncResponse = fetch(event.request); diff --git a/app/javascript/mastodon/utils/html.js b/app/javascript/mastodon/utils/html.js index 0b646ce58..5159df9db 100644 --- a/app/javascript/mastodon/utils/html.js +++ b/app/javascript/mastodon/utils/html.js @@ -1,6 +1,5 @@ export const unescapeHTML = (html) => { const wrapper = document.createElement('div'); - html = html.replace(/<br \/>|<br>|\n/g, ' '); - wrapper.innerHTML = html; + wrapper.innerHTML = html.replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n').replace(/<[^>]*>/g, ''); return wrapper.textContent; }; diff --git a/app/javascript/mastodon/utils/numbers.js b/app/javascript/mastodon/utils/numbers.js new file mode 100644 index 000000000..fdd8269ae --- /dev/null +++ b/app/javascript/mastodon/utils/numbers.js @@ -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>; + } +}; diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index fe304317d..460dc53a9 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -26,20 +26,20 @@ } .compose-form .compose-form__modifiers .compose-form__upload__actions .icon-button { - color: $ui-base-color; + color: lighten($white, 7%); &:active, &:focus, &:hover { - color: darken($ui-base-color, 7%); + color: $white; } } .compose-form .compose-form__modifiers .compose-form__upload-description input { - color: $ui-base-color; + color: lighten($white, 7%); &::placeholder { - color: $ui-base-color; + color: lighten($white, 7%); } } @@ -100,7 +100,7 @@ .dropdown-menu__item { a { 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 .activity-stream-tabs { background: $account-background-color; - - a { - &.active { - color: $ui-primary-color; - } - } + border-bottom-color: lighten($ui-base-color, 8%); } .activity-stream { .entry { background: $account-background-color; + + .detailed-status.light, + .more.light, + .status.light { + border-bottom-color: lighten($ui-base-color, 8%); + } } .status.light { @@ -219,7 +220,7 @@ .account-grid-card { .controls { .icon-button { - color: $ui-secondary-color; + color: $darker-text-color; } } @@ -230,7 +231,7 @@ } .username { - color: $ui-secondary-color; + color: $darker-text-color; } .account__header__content { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 712b6f813..a261b582b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -251,7 +251,7 @@ .compose-form__warning { color: $inverted-text-color; - margin-bottom: 15px; + margin-bottom: 10px; background: $ui-primary-color; box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3); padding: 8px 10px; @@ -298,6 +298,19 @@ position: relative; } + .spoiler-input { + height: 0; + transform-origin: bottom; + opacity: 0.0; + transition: all 0.4s ease; + + &.spoiler-input--visible { + height: 47px; + opacity: 1.0; + transition: all 0.4s ease; + } + } + .autosuggest-textarea__textarea, .spoiler-input__input { display: block; @@ -569,9 +582,8 @@ } .reply-indicator { - border-radius: 4px 4px 0 0; - position: relative; - bottom: -2px; + border-radius: 4px; + margin-bottom: 10px; background: $ui-primary-color; padding: 10px; } @@ -1663,24 +1675,6 @@ a.account__display-name { vertical-align: middle; } -.static-content { - padding: 10px; - padding-top: 20px; - color: $dark-text-color; - - h1 { - font-size: 16px; - font-weight: 500; - margin-bottom: 40px; - text-align: center; - } - - p { - font-size: 13px; - margin-bottom: 20px; - } -} - .columns-area { display: flex; flex: 1 1 auto; @@ -1772,6 +1766,8 @@ a.account__display-name { margin-bottom: 0; } + .getting-started__wrapper, + .getting-started__trends, .search { margin-bottom: 10px; } @@ -2175,25 +2171,82 @@ a.account__display-name { } .getting-started__wrapper, -.getting_started { +.getting-started, +.flex-spacer { background: $ui-base-color; } .getting-started__wrapper { - position: relative; - overflow-y: auto; + flex: 0 0 auto; +} + +.flex-spacer { + flex: 1 1 auto; } .getting-started { - background: $ui-base-color; - flex: 1 0 auto; + color: $dark-text-color; p { - color: $secondary-text-color; + color: $dark-text-color; + font-size: 13px; + margin-bottom: 20px; + + a { + color: $dark-text-color; + text-decoration: underline; + } } a { - color: $dark-text-color; + text-decoration: none; + color: $darker-text-color; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + } + + &__footer { + flex: 0 0 auto; + padding: 10px; + padding-top: 20px; + + ul { + margin-bottom: 10px; + } + + ul li { + display: inline; + } + } + + &__trends { + background: $ui-base-color; + flex: 0 1 auto; + + @media screen and (max-height: 810px) { + .trends__item:nth-child(3) { + display: none; + } + } + + @media screen and (max-height: 720px) { + .trends__item:nth-child(2) { + display: none; + } + } + + @media screen and (max-height: 670px) { + display: none; + } + } + + &__scrollable { + max-height: 100%; + overflow-y: auto; } } @@ -2420,8 +2473,10 @@ a.status-card { line-height: inherit; margin: 0; padding: 15px; + box-sizing: border-box; width: 100%; clear: both; + text-decoration: none; &:hover { background: lighten($ui-base-color, 2%); diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index 982bfd990..e54c55947 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -195,6 +195,7 @@ a.table-action-link { font-weight: 700; background: linear-gradient(to right, orange , yellow, green, cyan, blue, violet,orange , yellow, green, cyan, blue, violet); background-size: 200% 100%; + -webkit-background-clip: text; background-clip: text; color: transparent; animation: Swag 2s linear 0s infinite; diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 869749f1e..00479fd9a 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -83,7 +83,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity return if status.tags.include?(hashtag) status.tags << hashtag - TrendingTags.record_use!(hashtag, status.account, status.created_at) + TrendingTags.record_use!(hashtag, status.account, status.created_at) if status.public_visibility? rescue ActiveRecord::RecordInvalid nil end diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index a064248d9..d067415fd 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -187,4 +187,15 @@ module AccountInteractions def pinned?(status) status_pins.where(status: status).exists? end + + def followers_for_local_distribution + followers.local + .joins(:user) + .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago) + end + + def lists_for_local_distribution + lists.joins(account: :user) + .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago) + end end diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index c17f04776..c17f19a60 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -24,14 +24,17 @@ module Remotable Request.new(:get, url).perform do |response| next if response.code != 200 - matches = response.headers['content-disposition']&.match(/filename="([^"]*)"/) - filename = matches.nil? ? parsed_url.path.split('/').last : matches[1] + 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] + extname = filename.nil? ? '' : File.extname(filename) + end + basename = SecureRandom.hex(8) - extname = if filename.nil? - '' - else - File.extname(filename) - end send("#{attachment_name}=", StringIO.new(response.body_with_limit(limit))) send("#{attachment_name}_file_name=", basename + extname) @@ -57,4 +60,26 @@ module Remotable 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 diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb index 1ba8fc693..fa441469c 100644 --- a/app/models/concerns/status_threading_concern.rb +++ b/app/models/concerns/status_threading_concern.rb @@ -51,12 +51,16 @@ module StatusThreadingConcern end 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) AS ( SELECT id, ARRAY[id] 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 SELECT statuses.id, path || statuses.id FROM search_tree @@ -68,6 +72,8 @@ module StatusThreadingConcern ORDER BY path LIMIT :limit SQL + + descendants_with_self - [self] end def find_statuses_from_tree_path(ids, account) diff --git a/app/models/favourite.rb b/app/models/favourite.rb index c998a67eb..0fce82f6f 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -16,7 +16,7 @@ class Favourite < ApplicationRecord update_index('statuses#status', :status) if Chewy.enabled? belongs_to :account, inverse_of: :favourites - belongs_to :status, inverse_of: :favourites, counter_cache: true + belongs_to :status, inverse_of: :favourites has_one :notification, as: :activity, dependent: :destroy @@ -25,4 +25,27 @@ class Favourite < ApplicationRecord before_validation do self.status = status.reblog if status&.reblog? end + + after_create :increment_cache_counters + after_destroy :decrement_cache_counters + + private + + def increment_cache_counters + if association(:status).loaded? + status.update_attribute(:favourites_count, status.favourites_count + 1) + else + Status.where(id: status_id).update_all('favourites_count = COALESCE(favourites_count, 0) + 1') + end + end + + def decrement_cache_counters + return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?) + + if association(:status).loaded? + status.update_attribute(:favourites_count, [status.favourites_count - 1, 0].max) + else + Status.where(id: status_id).update_all('favourites_count = GREATEST(COALESCE(favourites_count, 0) - 1, 0)') + end + end end diff --git a/app/models/glitch/keyword_mute.rb b/app/models/glitch/keyword_mute.rb index 17ebc5b5e..7d0002afd 100644 --- a/app/models/glitch/keyword_mute.rb +++ b/app/models/glitch/keyword_mute.rb @@ -33,68 +33,74 @@ class Glitch::KeywordMute < ApplicationRecord Rails.cache.delete(TagMatcher.cache_key(account_id)) end - class RegexpMatcher + class CachedKeywordMute + attr_reader :keyword + attr_reader :whole_word + + def initialize(keyword, whole_word) + @keyword = keyword + @whole_word = whole_word + end + + def boundary_regex_for_keyword + sb = keyword =~ /\A[[:word:]]/ ? '\b' : '' + eb = keyword =~ /[[:word:]]\Z/ ? '\b' : '' + + /(?mix:#{sb}#{Regexp.escape(keyword)}#{eb})/ + end + + def matches?(str) + str =~ (whole_word ? boundary_regex_for_keyword : /#{Regexp.escape(keyword)}/i) + end + end + + class Matcher attr_reader :account_id - attr_reader :regex + attr_reader :words def initialize(account_id) @account_id = account_id - regex_text = Rails.cache.fetch(self.class.cache_key(account_id)) { make_regex_text } - @regex = /#{regex_text}/ + @words = Rails.cache.fetch(self.class.cache_key(account_id)) { fetch_keywords } end protected - def keywords - Glitch::KeywordMute.where(account_id: account_id).pluck(:whole_word, :keyword) + def fetch_keywords + Glitch::KeywordMute.where(account_id: account_id).pluck(:whole_word, :keyword).map do |whole_word, keyword| + CachedKeywordMute.new(transform_keyword(keyword), whole_word) + end end - def boundary_regex_for_keyword(keyword) - sb = keyword =~ /\A[[:word:]]/ ? '\b' : '' - eb = keyword =~ /[[:word:]]\Z/ ? '\b' : '' - - /(?mix:#{sb}#{Regexp.escape(keyword)}#{eb})/ + def transform_keyword(keyword) + keyword end end - class TextMatcher < RegexpMatcher + class TextMatcher < Matcher def self.cache_key(account_id) format('keyword_mutes:regex:text:%s', account_id) end def matches?(str) - !!(regex =~ str) - end - - private - - def make_regex_text - kws = keywords.map! do |whole_word, keyword| - whole_word ? boundary_regex_for_keyword(keyword) : /(?i:#{Regexp.escape(keyword)})/ - end - - Regexp.union(kws).source + words.any? { |w| w.matches?(str) } end end - class TagMatcher < RegexpMatcher + class TagMatcher < Matcher def self.cache_key(account_id) format('keyword_mutes:regex:tag:%s', account_id) end def matches?(tags) - tags.pluck(:name).any? { |n| regex =~ n } + tags.pluck(:name).any? do |n| + words.any? { |w| w.matches?(n) } + end end - private - - def make_regex_text - kws = keywords.map! do |whole_word, keyword| - term = (Tag::HASHTAG_RE =~ keyword) ? $1 : keyword - whole_word ? boundary_regex_for_keyword(term) : term - end + protected - Regexp.union(kws).source + def transform_keyword(kw) + Tag::HASHTAG_RE =~ kw ? $1 : kw end end end diff --git a/app/models/status.rb b/app/models/status.rb index c6d6453df..c0e241ddd 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -43,19 +43,19 @@ class Status < ApplicationRecord belongs_to :application, class_name: 'Doorkeeper::Application', optional: true - belongs_to :account, inverse_of: :statuses, counter_cache: true + belongs_to :account, inverse_of: :statuses belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account', optional: true belongs_to :conversation, optional: true belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true - belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count, optional: true + belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true has_many :favourites, inverse_of: :status, dependent: :destroy has_many :bookmarks, inverse_of: :status, 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 :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 :preview_cards @@ -172,6 +172,17 @@ class Status < ApplicationRecord @emojis ||= CustomEmoji.from_text([spoiler_text, text].join(' '), account.domain) end + def mark_for_mass_destruction! + @marked_for_mass_destruction = true + end + + def marked_for_mass_destruction? + @marked_for_mass_destruction + end + + after_create :increment_counter_caches + after_destroy :decrement_counter_caches + after_create_commit :store_uri, if: :local? after_create_commit :update_statistics, if: :local? @@ -183,7 +194,6 @@ class Status < ApplicationRecord before_validation :set_reblog before_validation :set_visibility before_validation :set_conversation - before_validation :set_sensitivity before_validation :set_local class << self @@ -306,7 +316,11 @@ class Status < ApplicationRecord # 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) - 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 @@ -377,10 +391,6 @@ class Status < ApplicationRecord self.sensitive = false if sensitive.nil? end - def set_sensitivity - self.sensitive = sensitive || spoiler_text.present? - end - def set_locality if account.domain.nil? && !attribute_changed?(:local_only) self.local_only = marked_local_only? @@ -414,4 +424,40 @@ class Status < ApplicationRecord return unless public_visibility? || unlisted_visibility? ActivityTracker.increment('activity:statuses:local') end + + def increment_counter_caches + return if direct_visibility? + + if association(:account).loaded? + account.update_attribute(:statuses_count, account.statuses_count + 1) + else + Account.where(id: account_id).update_all('statuses_count = COALESCE(statuses_count, 0) + 1') + end + + return unless reblog? + + if association(:reblog).loaded? + reblog.update_attribute(:reblogs_count, reblog.reblogs_count + 1) + else + Status.where(id: reblog_of_id).update_all('reblogs_count = COALESCE(reblogs_count, 0) + 1') + end + end + + def decrement_counter_caches + return if direct_visibility? || marked_for_mass_destruction? + + if association(:account).loaded? + account.update_attribute(:statuses_count, [account.statuses_count - 1, 0].max) + else + Account.where(id: account_id).update_all('statuses_count = GREATEST(COALESCE(statuses_count, 0) - 1, 0)') + end + + return unless reblog? + + if association(:reblog).loaded? + reblog.update_attribute(:reblogs_count, [reblog.reblogs_count - 1, 0].max) + else + Status.where(id: reblog_of_id).update_all('reblogs_count = GREATEST(COALESCE(reblogs_count, 0) - 1, 0)') + end + end end diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index eedd92644..c3641d7fd 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -1,33 +1,18 @@ # frozen_string_literal: true class TrendingTags - KEY = 'trending_tags' - HALF_LIFE = 1.day.to_i - MAX_ITEMS = 500 EXPIRE_HISTORY_AFTER = 7.days.seconds class << self def record_use!(tag, account, at_time = Time.now.utc) - return if disallowed_hashtags.include?(tag.name) || account.silenced? + return if disallowed_hashtags.include?(tag.name) || account.silenced? || account.bot? - increment_vote!(tag.id, at_time) increment_historical_use!(tag.id, at_time) increment_unique_use!(tag.id, account.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 - private - def increment_vote!(tag_id, at_time) - redis.zincrby(KEY, (2**((at_time.to_i - epoch) / HALF_LIFE)).to_f, tag_id.to_s) - redis.zremrangebyrank(KEY, 0, -MAX_ITEMS) if rand < (2.to_f / MAX_ITEMS) - end - def increment_historical_use!(tag_id, at_time) key = "activity:tags:#{tag_id}:#{at_time.beginning_of_day.to_i}" redis.incrby(key, 1) @@ -40,12 +25,6 @@ class TrendingTags redis.expire(key, EXPIRE_HISTORY_AFTER) end - # The epoch needs to be 2.5 years in the future if the half-life is one day - # While dynamic, it will always be the same within one year - def epoch - @epoch ||= Date.new(Date.current.year + 2.5, 10, 1).to_datetime.to_i - end - def disallowed_hashtags return @disallowed_hashtags if defined?(@disallowed_hashtags) diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index ace51a1fc..ebb4034aa 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -21,7 +21,10 @@ class BatchedRemoveStatusService < BaseService @activity_xml = {} # Ensure that rendered XML reflects destroyed state - statuses.each(&:destroy) + statuses.each do |status| + status.mark_for_mass_destruction! + status.destroy + end # Batch by source account statuses.group_by(&:account_id).each_value do |account_statuses| @@ -53,7 +56,7 @@ class BatchedRemoveStatusService < BaseService end def unpush_from_home_timelines(account, statuses) - recipients = account.followers.local.to_a + recipients = account.followers_for_local_distribution.to_a recipients << account if account.local? @@ -65,7 +68,7 @@ class BatchedRemoveStatusService < BaseService end def unpush_from_list_timelines(account, statuses) - account.lists.select(:id, :account_id).each do |list| + account.lists_for_local_distribution.select(:id, :account_id).each do |list| statuses.each do |status| FeedManager.instance.unpush_from_list(list, status) end diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 8b3630229..5efd3edb2 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -38,7 +38,7 @@ class FanOutOnWriteService < BaseService def deliver_to_followers(status) Rails.logger.debug "Delivering status #{status.id} to followers" - status.account.followers.where(domain: nil).joins(:user).where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago).select(:id).reorder(nil).find_in_batches do |followers| + status.account.followers_for_local_distribution.select(:id).reorder(nil).find_in_batches do |followers| FeedInsertWorker.push_bulk(followers) do |follower| [status.id, follower.id, :home] end @@ -48,7 +48,7 @@ class FanOutOnWriteService < BaseService def deliver_to_lists(status) Rails.logger.debug "Delivering status #{status.id} to lists" - status.account.lists.joins(account: :user).where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago).select(:id).reorder(nil).find_in_batches do |lists| + status.account.lists_for_local_distribution.select(:id).reorder(nil).find_in_batches do |lists| FeedInsertWorker.push_bulk(lists) do |list| [status.id, list.id, :list] end diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 86d0f9971..560a81768 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -40,7 +40,7 @@ class FetchLinkCardService < BaseService @card ||= PreviewCard.new(url: @url) 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 return if failed diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index b1d5bd3a7..6e982c7e6 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -28,7 +28,7 @@ class PostStatusService < BaseService status = account.statuses.create!(text: text, media_attachments: media || [], 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] || '', visibility: options[:visibility] || account.user&.setting_default_privacy, language: language_from_option(options[:language]) || LanguageDetector.instance.detect(text, account), diff --git a/app/services/process_hashtags_service.rb b/app/services/process_hashtags_service.rb index 0695922b8..cf7471c98 100644 --- a/app/services/process_hashtags_service.rb +++ b/app/services/process_hashtags_service.rb @@ -7,7 +7,7 @@ class ProcessHashtagsService < BaseService tags.map { |str| str.mb_chars.downcase }.uniq(&:to_s).each do |name| tag = Tag.where(name: name).first_or_create(name: name) status.tags << tag - TrendingTags.record_use!(tag, status.account, status.created_at) + TrendingTags.record_use!(tag, status.account, status.created_at) if status.public_visibility? end end end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 8c3e18444..b9631077c 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -43,13 +43,13 @@ class RemoveStatusService < BaseService end def remove_from_followers - @account.followers.local.find_each do |follower| + @account.followers_for_local_distribution.find_each do |follower| FeedManager.instance.unpush_from_home(follower, @status) end end def remove_from_lists - @account.lists.select(:id, :account_id).find_each do |list| + @account.lists_for_local_distribution.select(:id, :account_id).find_each do |list| FeedManager.instance.unpush_from_list(list, @status) end end diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 56fa2d8dd..708d15e37 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -41,9 +41,10 @@ class SuspendAccountService < BaseService end def purge_profile! - @account.suspended = true - @account.display_name = '' - @account.note = '' + @account.suspended = true + @account.display_name = '' + @account.note = '' + @account.statuses_count = 0 @account.avatar.destroy @account.header.destroy @account.save! diff --git a/app/views/admin/accounts/_account.html.haml b/app/views/admin/accounts/_account.html.haml index dfa7c5649..c6e63152d 100644 --- a/app/views/admin/accounts/_account.html.haml +++ b/app/views/admin/accounts/_account.html.haml @@ -1,7 +1,7 @@ %tr %td.username = account.username - %td.domain + %td - unless account.local? = link_to account.domain, admin_accounts_path(by_domain: account.domain) %td diff --git a/app/workers/maintenance/destroy_media_worker.rb b/app/workers/maintenance/destroy_media_worker.rb new file mode 100644 index 000000000..5f052983b --- /dev/null +++ b/app/workers/maintenance/destroy_media_worker.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class Maintenance::DestroyMediaWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull' + + def perform(media_attachment_id) + media = MediaAttachment.find(media_attachment_id) + media.destroy + rescue ActiveRecord::RecordNotFound + true + end +end diff --git a/app/workers/maintenance/redownload_account_media_worker.rb b/app/workers/maintenance/redownload_account_media_worker.rb new file mode 100644 index 000000000..fc26815f2 --- /dev/null +++ b/app/workers/maintenance/redownload_account_media_worker.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class Maintenance::RedownloadAccountMediaWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull', retry: false + + def perform(account_id) + account = Account.find(account_id) + account.reset_avatar! + account.reset_header! + account.save + rescue ActiveRecord::RecordNotFound + true + end +end diff --git a/app/workers/maintenance/uncache_media_worker.rb b/app/workers/maintenance/uncache_media_worker.rb new file mode 100644 index 000000000..f6a51a1b8 --- /dev/null +++ b/app/workers/maintenance/uncache_media_worker.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class Maintenance::UncacheMediaWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull' + + def perform(media_attachment_id) + media = MediaAttachment.find(media_attachment_id) + + return unless media.file.exists? + + media.file.destroy + media.save + rescue ActiveRecord::RecordNotFound + true + end +end |