diff --git a/app/controllers/api/v1/timelines/direct_controller.rb b/app/controllers/api/v1/timelines/direct_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..d455227eb56a53b79b9a7f8fbd1b394a6d0fa0aa --- /dev/null +++ b/app/controllers/api/v1/timelines/direct_controller.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class Api::V1::Timelines::DirectController < Api::BaseController + before_action -> { doorkeeper_authorize! :read }, only: [:show] + before_action :require_user!, only: [:show] + after_action :insert_pagination_headers, unless: -> { @statuses.empty? } + + respond_to :json + + def show + @statuses = load_statuses + render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) + end + + private + + def load_statuses + cached_direct_statuses + end + + def cached_direct_statuses + cache_collection direct_statuses, Status + end + + def direct_statuses + direct_timeline_statuses.paginate_by_max_id( + limit_param(DEFAULT_STATUSES_LIMIT), + params[:max_id], + params[:since_id] + ) + end + + def direct_timeline_statuses + Status.as_direct_timeline(current_account) + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def pagination_params(core_params) + params.permit(:local, :limit).merge(core_params) + end + + def next_path + api_v1_timelines_direct_url pagination_params(max_id: pagination_max_id) + end + + def prev_path + api_v1_timelines_direct_url pagination_params(since_id: pagination_since_id) + end + + def pagination_max_id + @statuses.last.id + end + + def pagination_since_id + @statuses.first.id + end +end diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index ea9d9f359c3a67103b76e634a3dfa7ee129abaa3..eee9c6928c132822931161621e242734abbde85c 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -145,6 +145,8 @@ export function submitCompose() { if (response.data.in_reply_to_id === null && response.data.visibility === 'public') { insertIfOnline('community'); insertIfOnline('public'); + } else if (response.data.visibility === 'direct') { + insertIfOnline('direct'); } }).catch(function (error) { dispatch(submitComposeFail(error)); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index f76510cdb1679970dc7c72444a1c31ca42f27e19..14215ab6d5411d501a903f4f2251daed9dd11ea7 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -46,4 +46,5 @@ export const connectCommunityStream = () => connectTimelineStream('community', ' export const connectMediaStream = () => connectTimelineStream('community', 'public:local'); export const connectPublicStream = () => connectTimelineStream('public', 'public'); export const connectHashtagStream = (tag) => connectTimelineStream(`hashtag:${tag}`, `hashtag&tag=${tag}`); +export const connectDirectStream = () => connectTimelineStream('direct', 'direct'); export const connectListStream = (id) => connectTimelineStream(`list:${id}`, `list&list=${id}`); diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 5be07126d51bfe84f552cb1ccd8535b3999e54a0..eca847ee73473f364934cef1e1c61d02079349ee 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -87,6 +87,7 @@ export function expandTimeline(timelineId, path, params = {}) { export const expandHomeTimeline = ({ maxId } = {}) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }); export const expandPublicTimeline = ({ maxId } = {}) => expandTimeline('public', '/api/v1/timelines/public', { max_id: maxId }); export const expandCommunityTimeline = ({ maxId } = {}) => expandTimeline('community', '/api/v1/timelines/public', { local: true, max_id: maxId }); +export const expandDirectTimeline = ({ maxId } = {}) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }); export const expandAccountTimeline = (accountId, { maxId, withReplies } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, max_id: maxId }); export const expandAccountFeaturedTimeline = accountId => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true }); diff --git a/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js new file mode 100644 index 0000000000000000000000000000000000000000..1833f69e5c2aa1ae804918d3b451bddea6d3af9d --- /dev/null +++ b/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js @@ -0,0 +1,17 @@ +import { connect } from 'react-redux'; +import ColumnSettings from '../../community_timeline/components/column_settings'; +import { changeSetting } from '../../../actions/settings'; + +const mapStateToProps = state => ({ + settings: state.getIn(['settings', 'direct']), +}); + +const mapDispatchToProps = dispatch => ({ + + onChange (key, checked) { + dispatch(changeSetting(['direct', ...key], checked)); + }, + +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings); diff --git a/app/javascript/mastodon/features/direct_timeline/index.js b/app/javascript/mastodon/features/direct_timeline/index.js new file mode 100644 index 0000000000000000000000000000000000000000..fda57f69af1bb8abedd5fd2b7ba1c7b05e346091 --- /dev/null +++ b/app/javascript/mastodon/features/direct_timeline/index.js @@ -0,0 +1,104 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import StatusListContainer from '../ui/containers/status_list_container'; +import Column from '../../components/column'; +import ColumnHeader from '../../components/column_header'; +import { expandDirectTimeline } from '../../actions/timelines'; +import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import ColumnSettingsContainer from './containers/column_settings_container'; +import { connectDirectStream } from '../../actions/streaming'; + +const messages = defineMessages({ + title: { id: 'column.direct', defaultMessage: 'Direct messages' }, +}); + +const mapStateToProps = state => ({ + hasUnread: state.getIn(['timelines', 'direct', 'unread']) > 0, +}); + +@connect(mapStateToProps) +@injectIntl +export default class DirectTimeline extends React.PureComponent { + + static propTypes = { + dispatch: PropTypes.func.isRequired, + columnId: PropTypes.string, + intl: PropTypes.object.isRequired, + hasUnread: PropTypes.bool, + multiColumn: PropTypes.bool, + }; + + handlePin = () => { + const { columnId, dispatch } = this.props; + + if (columnId) { + dispatch(removeColumn(columnId)); + } else { + dispatch(addColumn('DIRECT', {})); + } + } + + handleMove = (dir) => { + const { columnId, dispatch } = this.props; + dispatch(moveColumn(columnId, dir)); + } + + handleHeaderClick = () => { + this.column.scrollTop(); + } + + componentDidMount () { + const { dispatch } = this.props; + + dispatch(expandDirectTimeline()); + this.disconnect = dispatch(connectDirectStream()); + } + + componentWillUnmount () { + if (this.disconnect) { + this.disconnect(); + this.disconnect = null; + } + } + + setRef = c => { + this.column = c; + } + + handleLoadMore = maxId => { + this.props.dispatch(expandDirectTimeline({ maxId })); + } + + render () { + const { intl, hasUnread, columnId, multiColumn } = this.props; + const pinned = !!columnId; + + return ( + <Column ref={this.setRef}> + <ColumnHeader + icon='envelope' + active={hasUnread} + title={intl.formatMessage(messages.title)} + onPin={this.handlePin} + onMove={this.handleMove} + onClick={this.handleHeaderClick} + pinned={pinned} + multiColumn={multiColumn} + > + <ColumnSettingsContainer /> + </ColumnHeader> + + <StatusListContainer + trackScroll={!pinned} + scrollKey={`direct_timeline-${columnId}`} + timelineId='direct' + onLoadMore={this.handleLoadMore} + emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />} + /> + </Column> + ); + } + +} diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 053a1ca175f545231cd26311a412cd7406988954..4a249f30169152c4e313f11cb07a045a29e02646 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -19,6 +19,7 @@ const messages = defineMessages({ 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' }, @@ -98,20 +99,24 @@ export default class GettingStarted extends ImmutablePureComponent { } } + 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( - <ColumnLink key='4' icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />, - <ColumnLink key='5' icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' /> + <ColumnLink key='5' icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />, + <ColumnLink key='6' icon='bars' text={intl.formatMessage(messages.lists)} to='/lists' /> ); if (myAccount.get('locked')) { - navItems.push(<ColumnLink key='6' icon='users' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />); + navItems.push(<ColumnLink key='7' icon='users' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />); } if (multiColumn) { - navItems.push(<ColumnLink key='7' icon='question' text={intl.formatMessage(messages.keyboard_shortcuts)} to='/keyboard-shortcuts' />); + navItems.push(<ColumnLink key='8' icon='question' text={intl.formatMessage(messages.keyboard_shortcuts)} to='/keyboard-shortcuts' />); } - navItems.push(<ColumnLink key='8' icon='book' text={intl.formatMessage(messages.info)} href='/about/more' />); + navItems.push(<ColumnLink key='9' icon='book' text={intl.formatMessage(messages.info)} href='/about/more' />); return ( <Column icon='asterisk' heading={intl.formatMessage(messages.heading)} hideHeadingOnMobile> diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index 05cdb4e3b9f1df7de7d7ebc305b0cc0006b8b999..0a62cbbeb44db90f27743e51571330d56832a7f4 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -12,7 +12,7 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; import detectPassiveEvents from 'detect-passive-events'; import { scrollRight } from '../../../scroll'; @@ -24,6 +24,7 @@ const componentMap = { 'PUBLIC': PublicTimeline, 'COMMUNITY': CommunityTimeline, 'HASHTAG': HashtagTimeline, + 'DIRECT': DirectTimeline, 'FAVOURITES': FavouritedStatuses, 'LIST': ListTimeline, }; diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index d2ef19e47f6db4ffb758335b0d7006927988d55c..adca0d617d065eef45ccc24288b09f4fdd49d71d 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -30,6 +30,7 @@ import { Following, Reblogs, Favourites, + DirectTimeline, HashtagTimeline, Notifications, FollowRequests, @@ -79,6 +80,7 @@ const keyMap = { goToNotifications: 'g n', goToLocal: 'g l', goToFederated: 'g t', + goToDirect: 'g d', goToStart: 'g s', goToFavourites: 'g f', goToPinned: 'g p', @@ -140,6 +142,7 @@ class SwitchingColumnsArea extends React.PureComponent { <WrappedRoute path='/timelines/home' component={HomeTimeline} content={children} /> <WrappedRoute path='/timelines/public' exact component={PublicTimeline} content={children} /> <WrappedRoute path='/timelines/public/local' component={CommunityTimeline} content={children} /> + <WrappedRoute path='/timelines/direct' component={DirectTimeline} content={children} /> <WrappedRoute path='/timelines/tag/:id' component={HashtagTimeline} content={children} /> <WrappedRoute path='/timelines/list/:id' component={ListTimeline} content={children} /> @@ -386,6 +389,10 @@ export default class UI extends React.PureComponent { this.context.router.history.push('/timelines/public'); } + handleHotkeyGoToDirect = () => { + this.context.router.history.push('/timelines/direct'); + } + handleHotkeyGoToStart = () => { this.context.router.history.push('/getting-started'); } @@ -425,6 +432,7 @@ export default class UI extends React.PureComponent { goToNotifications: this.handleHotkeyGoToNotifications, goToLocal: this.handleHotkeyGoToLocal, goToFederated: this.handleHotkeyGoToFederated, + goToDirect: this.handleHotkeyGoToDirect, goToStart: this.handleHotkeyGoToStart, goToFavourites: this.handleHotkeyGoToFavourites, goToPinned: this.handleHotkeyGoToPinned, diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index 19957208ffc89c24fefd897413578fcb8b2f1cb7..8cf2a6e7d79bccae6e15f29628f811efb898ef8f 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -26,6 +26,10 @@ export function HashtagTimeline () { return import(/* webpackChunkName: "features/hashtag_timeline" */'../../hashtag_timeline'); } +export function DirectTimeline() { + return import(/* webpackChunkName: "features/direct_timeline" */'../../direct_timeline'); +} + export function ListTimeline () { return import(/* webpackChunkName: "features/list_timeline" */'../../list_timeline'); } diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index c13ff773df4f626cb87eed67efa8f9be40ee6592..24c8a5b54a16f8ddc0a950cd6ff54f7ecb2cd363 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "إعادة المØاولة", "column.blocks": "الØسابات المØجوبة", "column.community": "الخيط العام المØلي", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "المÙضلة", "column.follow_requests": "طلبات المتابعة", @@ -100,6 +101,7 @@ "emoji_button.symbols": "رموز", "emoji_button.travel": "أماكن Ùˆ أسÙار", "empty_column.community": "الخط الزمني المØلي Ùارغ. أكتب شيئا ما للعامة كبداية !", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "ليس هناك بعد٠أي Ù…Øتوى ذو علاقة بهذا الوسم.", "empty_column.home": "إنك لا تتبع بعد أي شخص إلى Øد الآن. زر {public} أو استخدام Øقل البØØ« لكي تبدأ على التعر٠على مستخدمين آخرين.", "empty_column.home.public_timeline": "الخيط العام", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "هل تود إخÙاء الإخطارات القادمة من هذا المستخدم ØŸ", "navigation_bar.blocks": "الØسابات المØجوبة", "navigation_bar.community_timeline": "الخيط العام المØلي", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "تعديل المل٠الشخصي", "navigation_bar.favourites": "المÙضلة", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} Ùˆ {results}}", "standalone.public_title": "نظرة على ...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "تعذرت ترقية هذا المنشور", "status.delete": "Ø¥ØØ°Ù", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "تدبيس على المل٠الشخصي", "status.pinned": "تبويق مثبَّت", "status.reblog": "رَقّÙÙŠ", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} رقى", "status.reply": "ردّ", "status.replyAll": "رÙد على الخيط", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 981aced0bbd59e30f17b113b132f9a78b2f9a1da..25ef6db6531c73cd4851d54076ff5b6cb85ce9be 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blocked users", "column.community": "Local timeline", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "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.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Редактирай профил", "navigation_bar.favourites": "Favourites", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Изтриване", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "СподелÑне", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} Ñподели", "status.reply": "Отговор", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index d9270e0ce959b39ffc47c50f71c470b30f569839..6a44808e046fc23b6e301354b07e3aaad7ceb533 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Torna-ho a provar", "column.blocks": "Usuaris blocats", "column.community": "LÃnia de temps local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorits", "column.follow_requests": "Peticions per seguir-te", @@ -100,6 +101,7 @@ "emoji_button.symbols": "SÃmbols", "emoji_button.travel": "Viatges i Llocs", "empty_column.community": "La lÃnia de temps local és buida. Escriu alguna cosa públicament per fer rodar la pilota!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Encara no hi ha res amb aquesta etiqueta.", "empty_column.home": "Encara no segueixes ningú. Visita {public} o fes cerca per començar i conèixer altres usuaris.", "empty_column.home.public_timeline": "la lÃnia de temps pública", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?", "navigation_bar.blocks": "Usuaris bloquejats", "navigation_bar.community_timeline": "LÃnia de temps Local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favorits", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, un {result} altres {results}}", "standalone.public_title": "Una mirada a l'interior ...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Aquesta publicació no pot ser retootejada", "status.delete": "Esborrar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fixat en el perfil", "status.pinned": "Toot fixat", "status.reblog": "Impuls", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} ha retootejat", "status.reply": "Respondre", "status.replyAll": "Respondre al tema", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 6eb5e6840e60289f57d4035574b791aabbf755b4..69c2ae8d87f48da751c6db27136bf8a65a49579a 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Erneut versuchen", "column.blocks": "Blockierte Profile", "column.community": "Lokale Zeitleiste", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoriten", "column.follow_requests": "Folgeanfragen", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbole", "emoji_button.travel": "Reisen und Orte", "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", "empty_column.home": "Deine Startseite ist leer! Besuche {public} oder nutze die Suche, um loszulegen und andere Leute zu finden.", "empty_column.home.public_timeline": "die öffentliche Zeitleiste", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Benachrichtigungen von diesem Account verbergen?", "navigation_bar.blocks": "Blockierte Profile", "navigation_bar.community_timeline": "Lokale Zeitleiste", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profil bearbeiten", "navigation_bar.favourites": "Favoriten", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}", "standalone.public_title": "Ein kleiner Einblick …", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", "status.delete": "Löschen", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Im Profil anheften", "status.pinned": "Pinned toot", "status.reblog": "Teilen", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} teilte", "status.reply": "Antworten", "status.replyAll": "Auf Thread antworten", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index a3c4f775c5cf889f9cd0f8f5ca26f01abfb9052f..5a02e0c72010d0553e145d7373ad243095496719 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -242,6 +242,14 @@ "defaultMessage": "Boost", "id": "status.reblog" }, + { + "defaultMessage": "Boost to original audience", + "id": "status.reblog_private" + }, + { + "defaultMessage": "Unboost", + "id": "status.cancel_reblog_private" + }, { "defaultMessage": "This post cannot be boosted", "id": "status.cannot_reblog" @@ -897,6 +905,19 @@ ], "path": "app/javascript/mastodon/features/compose/index.json" }, + { + "descriptors": [ + { + "defaultMessage": "Direct messages", + "id": "column.direct" + }, + { + "defaultMessage": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "id": "empty_column.direct" + } + ], + "path": "app/javascript/mastodon/features/direct_timeline/index.json" + }, { "descriptors": [ { @@ -971,6 +992,10 @@ "defaultMessage": "Local timeline", "id": "navigation_bar.community_timeline" }, + { + "defaultMessage": "Direct messages", + "id": "navigation_bar.direct" + }, { "defaultMessage": "Preferences", "id": "navigation_bar.preferences" @@ -1399,6 +1424,14 @@ "defaultMessage": "Boost", "id": "status.reblog" }, + { + "defaultMessage": "Boost to original audience", + "id": "status.reblog_private" + }, + { + "defaultMessage": "Unboost", + "id": "status.cancel_reblog_private" + }, { "defaultMessage": "This post cannot be boosted", "id": "status.cannot_reblog" diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index a389735c1ac3e7a175e96357c406a3f80782a322..d8bd7e3e02df27b81ff47736fae23806d50f8b4e 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blocked users", "column.community": "Local timeline", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "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.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Delete", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 19f3c59072c580e68378de0d5204a5b8c67cddff..e51163971e28fa4095202e2b6d8ca5667a81eb8b 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Bonvolu reprovi", "column.blocks": "Blokitaj uzantoj", "column.community": "Loka tempolinio", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Stelumoj", "column.follow_requests": "Petoj de sekvado", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Simboloj", "emoji_button.travel": "VojaÄoj kaj lokoj", "empty_column.community": "La loka tempolinio estas malplena. Skribu ion por plenigi Äin!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "AnkoraÅ estas nenio per ĉi tiu kradvorto.", "empty_column.home": "Via hejma tempolinio estas malplena! Vizitu {public} aÅ uzu la serĉilon por renkonti aliajn uzantojn.", "empty_column.home.public_timeline": "la publikan tempolinion", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Ĉu vi volas kaÅi la sciigojn el ĉi tiu uzanto?", "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.community_timeline": "Loka tempolinio", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Redakti profilon", "navigation_bar.favourites": "Stelumoj", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}", "standalone.public_title": "Enrigardo…", "status.block": "Bloki @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ĉi tiu mesaÄo ne diskonigeblas", "status.delete": "Forigi", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Alpingli profile", "status.pinned": "Alpinglita mesaÄo", "status.reblog": "Diskonigi", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} diskonigis", "status.reply": "Respondi", "status.replyAll": "Respondi al la fadeno", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index e765cc0786995ebb08036ff3fb3faa68c2ab304c..61ea0588ded5a82d1e9fd9c7a6570f3111d99389 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Inténtalo de nuevo", "column.blocks": "Usuarios bloqueados", "column.community": "LÃnea de tiempo local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoritos", "column.follow_requests": "Solicitudes de seguimiento", @@ -100,6 +101,7 @@ "emoji_button.symbols": "SÃmbolos", "emoji_button.travel": "Viajes y lugares", "empty_column.community": "La lÃnea de tiempo local está vacÃa. ¡Escribe algo para empezar la fiesta!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "No hay nada en este hashtag aún.", "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.", "empty_column.home.public_timeline": "la lÃnea de tiempo pública", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?", "navigation_bar.blocks": "Usuarios bloqueados", "navigation_bar.community_timeline": "Historia local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "standalone.public_title": "Un pequeño vistazo...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Este toot no puede retootearse", "status.delete": "Borrar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fijar", "status.pinned": "Toot fijado", "status.reblog": "Retootear", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "Retooteado por {name}", "status.reply": "Responder", "status.replyAll": "Responder al hilo", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 822c998cec9e10205fbb142e4650d35a6a7823ab..cfe93007d173831a2bb8b327615e0454726858e2 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "تلاش دوباره", "column.blocks": "کاربران مسدودشده", "column.community": "نوشته‌های Ù…ØÙ„ÛŒ", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "پسندیده‌ها", "column.follow_requests": "درخواست‌های پیگیری", @@ -100,6 +101,7 @@ "emoji_button.symbols": "نمادها", "emoji_button.travel": "سÙر Ùˆ مکان", "empty_column.community": "Ùهرست نوشته‌های Ù…ØÙ„ÛŒ خالی است. چیزی بنویسید تا چرخش بچرخد!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "هنوز هیچ چیزی با این هشتگ نیست.", "empty_column.home": "شما هنوز پیگیر کسی نیستید. {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.", "empty_column.home.public_timeline": "Ùهرست نوشته‌های همه‌جا", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟", "navigation_bar.blocks": "کاربران مسدودشده", "navigation_bar.community_timeline": "نوشته‌های Ù…ØÙ„ÛŒ", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "ویرایش نمایه", "navigation_bar.favourites": "پسندیده‌ها", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}", "standalone.public_title": "نگاهی به کاربران این سرور...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید", "status.delete": "پاک‌کردن", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "نوشتهٔ ثابت نمایه", "status.pinned": "Pinned toot", "status.reblog": "بازبوقیدن", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "‫{name}‬ بازبوقید", "status.reply": "پاسخ", "status.replyAll": "به نوشته پاسخ دهید", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 5763ac442a5dd349134cfa17ec8a047f73929503..1677c3c6cc603bc624b181f6e11f90339eb123ed 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Yritä uudestaan", "column.blocks": "Estetyt käyttäjät", "column.community": "Paikallinen aikajana", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Suosikit", "column.follow_requests": "Seuraamispyynnöt", @@ -100,6 +101,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.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", @@ -154,6 +156,7 @@ "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.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Muokkaa profiilia", "navigation_bar.favourites": "Suosikit", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Kurkistus sisälle...", "status.block": "Estä @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Tätä julkaisua ei voi buustata", "status.delete": "Poista", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Kiinnitä profiiliin", "status.pinned": "Kiinnitetty tuuttaus", "status.reblog": "Buustaa", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} buustasi", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index ef1c115e37f87de9760aadb9e098552c3adc156d..98c1c43d2892fce4423b6e029c6e79ef68afadf1 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Réessayer", "column.blocks": "Comptes bloqués", "column.community": "Fil public local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoris", "column.follow_requests": "Demandes de suivi", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux & Voyages", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag.", "empty_column.home": "Vous ne suivez encore personne. Visitez {public} ou bien utilisez la recherche pour vous connecter à d’autres personnes.", "empty_column.home.public_timeline": "le fil public", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Masquer les notifications de cette personne ?", "navigation_bar.blocks": "Comptes bloqués", "navigation_bar.community_timeline": "Fil public local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modifier le profil", "navigation_bar.favourites": "Favoris", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", "standalone.public_title": "Un aperçu …", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Cette publication ne peut être boostée", "status.delete": "Effacer", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Épingler sur le profil", "status.pinned": "Pouet épinglé", "status.reblog": "Partager", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} a partagé :", "status.reply": "Répondre", "status.replyAll": "Répondre au fil", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 5cbb7d31d38303b81d0082b30fa4ced492911354..fca42374d35f1ac725f3760022fc8368b3531e5e 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Inténteo de novo", "column.blocks": "Usuarias bloqueadas", "column.community": "Liña temporal local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoritas", "column.follow_requests": "Peticións de seguimento", @@ -100,6 +101,7 @@ "emoji_button.symbols": "SÃmbolos", "emoji_button.travel": "Viaxes e Lugares", "empty_column.community": "A liña temporal local está baldeira. Escriba algo de xeito público para que rule!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "AÃnda non hai nada con esta etiqueta.", "empty_column.home": "A súa liña temporal de inicio está baldeira! Visite {public} ou utilice a busca para atopar outras usuarias.", "empty_column.home.public_timeline": "a liña temporal pública", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Esconder notificacións deste usuario?", "navigation_bar.blocks": "Usuarias bloqueadas", "navigation_bar.community_timeline": "Liña temporal local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritas", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count,plural,one {result} outros {results}}", "standalone.public_title": "Ollada dentro...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Esta mensaxe non pode ser promocionada", "status.delete": "Eliminar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fixar no perfil", "status.pinned": "Pinned toot", "status.reblog": "Promover", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} promoveu", "status.reply": "Resposta", "status.replyAll": "Resposta a conversa", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 656d93cdf18e012cbf1aa7cab77a9ae6e59eeb84..e3e87f1d0368a5ae855bef0f155c87dc9c89743b 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "×œ× ×¡×•×ª שוב", "column.blocks": "חסימות", "column.community": "ציר זמן מקומי", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "חיבובי×", "column.follow_requests": "בקשות מעקב", @@ -100,6 +101,7 @@ "emoji_button.symbols": "סמלי×", "emoji_button.travel": "×˜×™×•×œ×™× ×•×תרי×", "empty_column.community": "טור הסביבה ריק. יש ×œ×¤×¨×¡× ×ž×©×”×• כדי ×©×“×‘×¨×™× ×™×ª×¨×—×™×œ×• להתגלגל!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "×ין ×›×œ×•× ×‘×”×שתג ×”×–×” עדיין.", "empty_column.home": "××£ ×חד ×œ× ×‘×ž×¢×§×‘ עדיין. ×פשר לבקר ב{public} ×ו להשתמש בחיפוש כדי להתחיל ולהכיר ×—×¦×•×¦×¨× ×™× ×חרי×.", "empty_column.home.public_timeline": "ציר זמן בין-קהילתי", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "להסתיר הודעות מחשבון ×–×”?", "navigation_bar.blocks": "חסימות", "navigation_bar.community_timeline": "ציר זמן מקומי", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "עריכת פרופיל", "navigation_bar.favourites": "חיבובי×", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {תוצ××”} other {תוצ×ות}}", "standalone.public_title": "הצצה ×¤× ×™×ž×”...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "×œ× × ×™×ª×Ÿ להדהד הודעה זו", "status.delete": "מחיקה", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "לקבע ב×ודות", "status.pinned": "Pinned toot", "status.reblog": "הדהוד", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "הודהד על ידי {name}", "status.reply": "תגובה", "status.replyAll": "תגובה לכול×", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 2d7d0a5a41ab614cc103ea93b1179a54846fcd48..b41c98394d412bca858a65848c948e72335446fd 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blokirani korisnici", "column.community": "Lokalni timeline", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoriti", "column.follow_requests": "Zahtjevi za slijeÄ‘enje", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Simboli", "emoji_button.travel": "Putovanja & Mjesta", "empty_column.community": "Lokalni timeline je prazan. NapiÅ¡i neÅ¡to javno kako bi pokrenuo stvari!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "JoÅ¡ ne postoji niÅ¡ta s ovim hashtagom.", "empty_column.home": "JoÅ¡ ne slijediÅ¡ nikoga. Posjeti {public} ili koristi tražilicu kako bi poÄeo i upoznao druge korisnike.", "empty_column.home.public_timeline": "javni timeline", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalni timeline", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Uredi profil", "navigation_bar.favourites": "Favoriti", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ovaj post ne može biti boostan", "status.delete": "ObriÅ¡i", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Podigni", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} je podigao", "status.reply": "Odgovori", "status.replyAll": "Odgovori na temu", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 24f3a7816b8e9dde8ba91d7c4779d253b6f86b73..956accc6774dfd6a5557dea39f5ec4bff052de66 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Próbálja újra", "column.blocks": "Letiltott felhasználók", "column.community": "Helyi idÅ‘vonal", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Kedvencek", "column.follow_requests": "Követési kérések", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Szimbólumok", "emoji_button.travel": "Utazás és Helyek", "empty_column.community": "A helyi idÅ‘vonal üres. Ãrj egy publikus stástuszt, hogy elindÃtsd a labdát!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Jelenleg nem található semmi ezen hashtaggel.", "empty_column.home": "A hazai idÅ‘vonala üres! Látogasd meg a {public} vagy használd a keresÅ‘t, hogy ismerj meg más felhasználókat.", "empty_column.home.public_timeline": "publikus idÅ‘vonal", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "ÉrtesÃtések elrejtése ezen felhasználótól?", "navigation_bar.blocks": "Tiltott felhasználók", "navigation_bar.community_timeline": "Helyi idÅ‘vonal", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profil szerkesztése", "navigation_bar.favourites": "Kedvencek", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Betekintés...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ezen státusz nem rebloggolható", "status.delete": "Törlés", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Kitűzés a profilra", "status.pinned": "Pinned toot", "status.reblog": "Reblog", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} reblogolta", "status.reply": "Válasz", "status.replyAll": "Válaszolj a beszélgetésre", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 2ba52c5c085c3916d0608f2096b7a6c3d65d1f1b..33e079201ad29f7545cd81c4772ef70a8ac733cc 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Ô¿Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬", "column.blocks": "Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Ö…Õ£Õ¿Õ¡Õ¿Õ¥Ö€Õ¥Ö€", "column.community": "ÕÕ¥Õ²Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Õ€Õ¡Õ¾Õ¡Õ¶Õ¡Õ®Õ¶Õ¥Ö€", "column.follow_requests": "Õ€Õ¥Õ¿Õ¥Ö‚Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡ÕµÖÕ¥Ö€", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Õ†Õ·Õ¡Õ¶Õ¶Õ¥Ö€", "emoji_button.travel": "ÕˆÖ‚Õ²Õ¥Ö‚Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¥Ö‚ Õ¿Õ¥Õ²Õ¡Õ¶Ö„Õ¶Õ¥Ö€", "empty_column.community": "ÕÕ¥Õ²Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„Õ¨ Õ¤Õ¡Õ¿Õ¡Õ›Ö€Õ¯ Õ§Ö‰ Õ€Ö€Õ¡ÕºÕ¡Ö€Õ¡Õ¯Õ¡ÕµÕ«Õ¶ Õ´Õ« Õ¢Õ¡Õ¶ Õ£Ö€Õ«Ö€ Õ·Õ¡Ö€ÕªÕ«Õ¹Õ¨ ÕÕ¸Õ¤ Õ¿Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Ô±ÕµÕ½ ÕºÕ«Õ¿Õ¡Õ¯Õ¸Õ¾ Õ¤Õ¥Õ¼ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¹Õ¯Õ¡Ö‰", "empty_column.home": "Õ”Õ¸ Õ°Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„Õ¨ Õ¤Õ¡Õ¿Õ¡Õ›Ö€Õ¯ Õ§Ö‰ Ô±ÕµÖÕ¥Õ¬Õ«Õ›Ö€ {public}Õ¨ Õ¯Õ¡Õ´ Ö…Õ£Õ¿Õ¾Õ«Ö€ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ«ÖÕ Õ¡ÕµÕ¬ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö Õ°Õ¡Õ¶Õ¤Õ«ÕºÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰", "empty_column.home.public_timeline": "Õ°Ö€Õ¡ÕºÕ¡Ö€Õ¡Õ¯Õ¡ÕµÕ«Õ¶ Õ°Õ¸Õ½Ö„", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Ô¹Õ¡Ö„ÖÕ¶Õ¥ÕžÕ¬ ÖÕ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¶ Õ¡ÕµÕ½ Ö…Õ£Õ¿Õ¡Õ¿Õ«Ö€Õ¸Õ»Õ«ÖÖ‰", "navigation_bar.blocks": "Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Ö…Õ£Õ¿Õ¡Õ¿Õ¥Ö€Õ¥Ö€", "navigation_bar.community_timeline": "ÕÕ¥Õ²Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ½Ö„", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ§Õ»Õ¨", "navigation_bar.favourites": "Õ€Õ¡Õ¾Õ¡Õ¶Õ¡Õ®Õ¶Õ¥Ö€", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Ô±ÕµÕ½ պահին…", "status.block": "Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ @{name}ÖŠÕ«Õ¶", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ô±ÕµÕ½ Õ©Õ¸Ö‚Õ©Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¿Õ¡Ö€Õ¡Õ®Õ¾Õ¥Õ¬", "status.delete": "Õ‹Õ¶Õ»Õ¥Õ¬", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Ô±Õ´Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ§Õ»Õ¸Ö‚Õ´", "status.pinned": "Pinned toot", "status.reblog": "ÕÕ¡Ö€Õ¡Õ®Õ¥Õ¬", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} Õ¿Õ¡Ö€Õ¡Õ®Õ¥Õ¬ Õ§", "status.reply": "ÕŠÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬", "status.replyAll": "ÕŠÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬ Õ©Õ¥Õ¬Õ«Õ¶", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index e1518c1aa326026f625748a4917cb0c2bee4ce42..412ffd3a03ae7911eca0d8bfcbeda9e5a284f67e 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Coba lagi", "column.blocks": "Pengguna diblokir", "column.community": "Linimasa Lokal", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorit", "column.follow_requests": "Permintaan mengikuti", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Simbol", "emoji_button.travel": "Tempat Wisata", "empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Tidak ada apapun dalam hashtag ini.", "empty_column.home": "Linimasa anda kosong! Kunjungi {public} atau gunakan pencarian untuk memulai dan bertemu pengguna lain.", "empty_column.home.public_timeline": "linimasa publik", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Pengguna diblokir", "navigation_bar.community_timeline": "Linimasa lokal", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Ubah profil", "navigation_bar.favourites": "Favorit", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {hasil} other {hasil}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Hapus", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "di-boost {name}", "status.reply": "Balas", "status.replyAll": "Balas ke semua", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index c79d4a63407197a433487bc9e961911d1d602cd7..9730bf934d00e60c7515227ca5e8765f2b09b3a8 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blokusita uzeri", "column.community": "Lokala tempolineo", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorati", "column.follow_requests": "Demandi di sequado", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Esas ankore nulo en ta gretovorto.", "empty_column.home": "Tu sequas ankore nulu. Vizitez {public} od uzez la serchilo por komencar e renkontrar altra uzeri.", "empty_column.home.public_timeline": "la publika tempolineo", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokusita uzeri", "navigation_bar.community_timeline": "Lokala tempolineo", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modifikar profilo", "navigation_bar.favourites": "Favorati", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Efacar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Repetar", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} repetita", "status.reply": "Respondar", "status.replyAll": "Respondar a filo", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 3c85a3e204324f42c06e169535831813cbcff707..5146d7ca21f6b1c3a1f1903dca1e3d827a28a1b9 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Utenti bloccati", "column.community": "Timeline locale", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Apprezzati", "column.follow_requests": "Richieste di amicizia", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Non c'è ancora nessun post con questo hashtag.", "empty_column.home": "Non stai ancora seguendo nessuno. Visita {public} o usa la ricerca per incontrare nuove persone.", "empty_column.home.public_timeline": "la timeline pubblica", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Utenti bloccati", "navigation_bar.community_timeline": "Timeline locale", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modifica profilo", "navigation_bar.favourites": "Apprezzati", @@ -238,6 +241,7 @@ "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Elimina", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Condividi", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} ha condiviso", "status.reply": "Rispondi", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 2da9192caa4f07ed48a8de7771ea7724840627ea..a4aa06a06a4c80eb73bbb766b969e2d3e04470df 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "å†è©¦è¡Œ", "column.blocks": "ブãƒãƒƒã‚¯ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼", "column.community": "ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ライン", + "column.direct": "Direct messages", "column.domain_blocks": "éžè¡¨ç¤ºã«ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³", "column.favourites": "ãŠæ°—ã«å…¥ã‚Š", "column.follow_requests": "フォãƒãƒ¼ãƒªã‚¯ã‚¨ã‚¹ãƒˆ", @@ -100,6 +101,7 @@ "emoji_button.symbols": "記å·", "emoji_button.travel": "æ—…è¡Œã¨å ´æ‰€", "empty_column.community": "ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ラインã¯ã¾ã 使ã‚ã‚Œã¦ã„ã¾ã›ã‚“。何ã‹æ›¸ã„ã¦ã¿ã¾ã—ょã†ï¼", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "ã“ã®ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¯ã¾ã 使ã‚ã‚Œã¦ã„ã¾ã›ã‚“。", "empty_column.home": "ã¾ã 誰もフォãƒãƒ¼ã—ã¦ã„ã¾ã›ã‚“。{public}を見ã«è¡Œãã‹ã€æ¤œç´¢ã‚’使ã£ã¦ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’見ã¤ã‘ã¾ã—ょã†ã€‚", "empty_column.home.public_timeline": "連åˆã‚¿ã‚¤ãƒ ライン", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®é€šçŸ¥ã‚’éš ã—ã¾ã™ã‹ï¼Ÿ", "navigation_bar.blocks": "ブãƒãƒƒã‚¯ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼", "navigation_bar.community_timeline": "ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ライン", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "éžè¡¨ç¤ºã«ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³", "navigation_bar.edit_profile": "プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’編集", "navigation_bar.favourites": "ãŠæ°—ã«å…¥ã‚Š", @@ -238,6 +241,7 @@ "search_results.total": "{count, number}件ã®çµæžœ", "standalone.public_title": "今ã“ã‚“ãªè©±ã‚’ã—ã¦ã„ã¾ã™...", "status.block": "@{name}ã•ã‚“をブãƒãƒƒã‚¯", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "ã“ã®æŠ•ç¨¿ã¯ãƒ–ーストã§ãã¾ã›ã‚“", "status.delete": "削除", "status.direct": "@{name}ã•ã‚“ã«ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸", @@ -253,6 +257,7 @@ "status.pin": "プãƒãƒ•ã‚£ãƒ¼ãƒ«ã«å›ºå®šè¡¨ç¤º", "status.pinned": "固定ã•ã‚ŒãŸãƒˆã‚¥ãƒ¼ãƒˆ", "status.reblog": "ブースト", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name}ã•ã‚“ãŒãƒ–ースト", "status.reply": "返信", "status.replyAll": "全員ã«è¿”ä¿¡", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index e2fadff3c523591978e565db84cf3469605954be..92367dc95c5f95e097a7ea1389d3af7f2e194d1f 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "다시 ì‹œë„", "column.blocks": "차단 ì¤‘ì¸ ì‚¬ìš©ìž", "column.community": "로컬 타임ë¼ì¸", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "ì¦ê²¨ì°¾ê¸°", "column.follow_requests": "팔로우 ìš”ì²", @@ -100,6 +101,7 @@ "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", "empty_column.community": "로컬 타임ë¼ì¸ì— 아무 ê²ƒë„ ì—†ìŠµë‹ˆë‹¤. 아무거나 ì ì–´ 보세요!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "ì´ í•´ì‹œíƒœê·¸ëŠ” ì•„ì§ ì‚¬ìš©ë˜ì§€ 않았습니다.", "empty_column.home": "ì•„ì§ ì•„ë¬´ë„ íŒ”ë¡œìš° í•˜ê³ ìžˆì§€ 않습니다. {public}를 보러 가거나, 검색하여 다른 사용ìžë¥¼ 찾아 보세요.", "empty_column.home.public_timeline": "ì—°í•© 타임ë¼ì¸", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "ì´ ì‚¬ìš©ìžë¡œë¶€í„°ì˜ ì•Œë¦¼ì„ ë®¤íŠ¸í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "navigation_bar.blocks": "차단한 사용ìž", "navigation_bar.community_timeline": "로컬 타임ë¼ì¸", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "프로필 편집", "navigation_bar.favourites": "ì¦ê²¨ì°¾ê¸°", @@ -238,6 +241,7 @@ "search_results.total": "{count, number}ê±´ì˜ ê²°ê³¼", "standalone.public_title": "지금 ì´ëŸ° ì´ì•¼ê¸°ë¥¼ í•˜ê³ ìžˆìŠµë‹ˆë‹¤â€¦", "status.block": "@{name} 차단", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "ì´ í¬ìŠ¤íŠ¸ëŠ” 부스트 í• ìˆ˜ 없습니다", "status.delete": "ì‚ì œ", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "ê³ ì •", "status.pinned": "ê³ ì • ëœ íˆ¿", "status.reblog": "부스트", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name}ë‹˜ì´ ë¶€ìŠ¤íŠ¸ 했습니다", "status.reply": "답장", "status.replyAll": "ì „ì›ì—게 답장", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 0222432a0da95aa74874a5c6f7d7f393bac74a4b..c18ddbd01e304a0bf777f203693f35fb5a4a580f 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Opnieuw proberen", "column.blocks": "Geblokkeerde gebruikers", "column.community": "Lokale tijdlijn", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorieten", "column.follow_requests": "Volgverzoeken", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en plekken", "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.", "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.", "empty_column.home.public_timeline": "de globale tijdlijn", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?", "navigation_bar.blocks": "Geblokkeerde gebruikers", "navigation_bar.community_timeline": "Lokale tijdlijn", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profiel bewerken", "navigation_bar.favourites": "Favorieten", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}", "standalone.public_title": "Een kijkje binnenin...", "status.block": "Blokkeer @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Deze toot kan niet geboost worden", "status.delete": "Verwijderen", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Aan profielpagina vastmaken", "status.pinned": "Vastgemaakte toot", "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boostte", "status.reply": "Reageren", "status.replyAll": "Reageer op iedereen", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 20b2cbb26a151436bdd060a1493b057cda945026..282a72acbaff4e7b22a332f52669cf374adc6e13 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Prøv igjen", "column.blocks": "Blokkerte brukere", "column.community": "Lokal tidslinje", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Likt", "column.follow_requests": "Følgeforespørsler", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symboler", "emoji_button.travel": "Reise & steder", "empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for Ã¥ fÃ¥ snøballen til Ã¥ rulle!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Det er ingenting i denne hashtagen ennÃ¥.", "empty_column.home": "Du har ikke fulgt noen ennÃ¥. Besøk {publlic} eller bruk søk for Ã¥ komme i gang og møte andre brukere.", "empty_column.home.public_timeline": "en offentlig tidslinje", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Skjul varslinger fra denne brukeren?", "navigation_bar.blocks": "Blokkerte brukere", "navigation_bar.community_timeline": "Lokal tidslinje", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Rediger profil", "navigation_bar.favourites": "Favoritter", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}", "standalone.public_title": "En titt inni...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Denne posten kan ikke fremheves", "status.delete": "Slett", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fest pÃ¥ profilen", "status.pinned": "Pinned toot", "status.reblog": "Fremhev", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "Fremhevd av {name}", "status.reply": "Svar", "status.replyAll": "Svar til samtale", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 32133c1f48d128fa1dc74981302f36b3dbfdfac6..7170aefb8ce6a1108937815d75bba4c23d72181d 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Tornar ensajar", "column.blocks": "Personas blocadas", "column.community": "Flux public local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Simbòls", "emoji_button.travel": "Viatges & lòcs", "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "I a pas encara de contengut ligat a aquesta etiqueta.", "empty_column.home": "Vòstre flux d’acuèlh es void. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.", "empty_column.home.public_timeline": "lo flux public", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?", "navigation_bar.blocks": "Personas blocadas", "navigation_bar.community_timeline": "Flux public local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modificar lo perfil", "navigation_bar.favourites": "Favorits", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", "standalone.public_title": "Una ulhada dedins…", "status.block": "Blocar @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat", "status.delete": "Escafar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Penjar al perfil", "status.pinned": "Tut penjat", "status.reblog": "Partejar", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} a partejat", "status.reply": "Respondre", "status.replyAll": "Respondre a la conversacion", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 5360b6f3348913cbbc33b8a5ae3317e1b3bbbada..c55603a99135d541c8b3601e4c27aef42ac1f57b 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Spróbuj ponownie", "column.blocks": "Zablokowani użytkownicy", "column.community": "Lokalna oÅ› czasu", + "column.direct": "Direct messages", "column.domain_blocks": "Ukryte domeny", "column.favourites": "Ulubione", "column.follow_requests": "ProÅ›by o Å›ledzenie", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", "empty_column.community": "Lokalna oÅ› czasu jest pusta. Napisz coÅ› publicznie, aby zagaić!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Nie ma wpisów oznaczonych tym hashtagiem. Możesz napisać pierwszy!", "empty_column.home": "Nie Å›ledzisz nikogo. Odwiedź publicznÄ… oÅ› czasu lub użyj wyszukiwarki, aby znaleźć interesujÄ…ce CiÄ™ profile.", "empty_column.home.public_timeline": "publiczna oÅ› czasu", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?", "navigation_bar.blocks": "Zablokowani użytkownicy", "navigation_bar.community_timeline": "Lokalna oÅ› czasu", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Ukryte domeny", "navigation_bar.edit_profile": "Edytuj profil", "navigation_bar.favourites": "Ulubione", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}", "standalone.public_title": "Spojrzenie w gÅ‚Ä…b…", "status.block": "Zablokuj @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ten wpis nie może zostać podbity", "status.delete": "UsuÅ„", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Przypnij do profilu", "status.pinned": "PrzypiÄ™ty wpis", "status.reblog": "Podbij", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} podbiÅ‚", "status.reply": "Odpowiedz", "status.replyAll": "Odpowiedz na wÄ…tek", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index b4be0bbc7b5d71183f11005d586c716fe023076d..c604476c7ab3b335e1eeced9edcdb1b1c145de4e 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Tente novamente", "column.blocks": "Usuários bloqueados", "column.community": "Local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoritos", "column.follow_requests": "Seguidores pendentes", @@ -100,6 +101,7 @@ "emoji_button.symbols": "SÃmbolos", "emoji_button.travel": "Viagens & Lugares", "empty_column.community": "A timeline local está vazia. Escreva algo publicamente para começar!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Ainda não há qualquer conteúdo com essa hashtag.", "empty_column.home": "Você ainda não segue usuário algum. Visite a timeline {public} ou use o buscador para procurar e conhecer outros usuários.", "empty_column.home.public_timeline": "global", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Esconder notificações deste usuário?", "navigation_bar.blocks": "Usuários bloqueados", "navigation_bar.community_timeline": "Local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "standalone.public_title": "Dê uma espiada...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", "status.delete": "Excluir", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fixar no perfil", "status.pinned": "Toot fixado", "status.reblog": "Compartilhar", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} compartilhou", "status.reply": "Responder", "status.replyAll": "Responder à sequência", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 132de529346e9403fbcb637d26e7cc90f392c55f..826785aad11bace4a514ef4bb20c62d8766addfa 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Tente de novo", "column.blocks": "Utilizadores Bloqueados", "column.community": "Local", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoritos", "column.follow_requests": "Seguidores Pendentes", @@ -100,6 +101,7 @@ "emoji_button.symbols": "SÃmbolos", "emoji_button.travel": "Viagens & Lugares", "empty_column.community": "Ainda não existe conteúdo local para mostrar!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Não foram encontradas publicações com essa hashtag.", "empty_column.home": "Ainda não segues qualquer utilizador. Visita {public} ou utiliza a pesquisa para procurar outros utilizadores.", "empty_column.home.public_timeline": "global", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Esconder notificações deste utilizador?", "navigation_bar.blocks": "Utilizadores bloqueados", "navigation_bar.community_timeline": "Local", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "standalone.public_title": "Espreitar lá dentro...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Este post não pode ser partilhado", "status.delete": "Eliminar", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fixar no perfil", "status.pinned": "Pinned toot", "status.reblog": "Partilhar", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} partilhou", "status.reply": "Responder", "status.replyAll": "Responder à conversa", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index b56ccf1df0b9481c27ec84dcfc533453e5f903df..bb3cc1794b4e1d1937918d2edb5bcdd3d92a3d2c 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Попробовать Ñнова", "column.blocks": "СпиÑок блокировки", "column.community": "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°", + "column.direct": "Direct messages", "column.domain_blocks": "Скрытые домены", "column.favourites": "ПонравившееÑÑ", "column.follow_requests": "ЗапроÑÑ‹ на подпиÑку", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Символы", "emoji_button.travel": "ПутешеÑтвиÑ", "empty_column.community": "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð»ÐµÐ½Ñ‚Ð° пуÑта. Ðапишите что-нибудь, чтобы разогреть народ!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "СтатуÑов Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñ…Ñштегом еще не ÑущеÑтвует.", "empty_column.home": "Пока Ð’Ñ‹ ни на кого не подпиÑаны. ПолиÑтайте {public} или иÑпользуйте поиÑк, чтобы оÑвоитьÑÑ Ð¸ завеÑти новые знакомÑтва.", "empty_column.home.public_timeline": "публичные ленты", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Убрать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтого пользователÑ?", "navigation_bar.blocks": "СпиÑок блокировки", "navigation_bar.community_timeline": "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Скрытые домены", "navigation_bar.edit_profile": "Изменить профиль", "navigation_bar.favourites": "ПонравившееÑÑ", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}", "standalone.public_title": "ПрÑмо ÑейчаÑ", "status.block": "Заблокировать @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ðтот ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ðµ может быть продвинут", "status.delete": "Удалить", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Закрепить в профиле", "status.pinned": "Pinned toot", "status.reblog": "Продвинуть", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} продвинул(а)", "status.reply": "Ответить", "status.replyAll": "Ответить на тред", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 1593151379286773e9802412c6e73db8df807584..58274fd2d82ac30857e415ebb11e20b3be11a6b2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "SkúsiÅ¥ znova", "column.blocks": "Blokovanà užÃvatelia", "column.community": "Lokálna Äasová os", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Obľúbené", "column.follow_requests": "Žiadosti o sledovanie", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestovanie a miesta", "empty_column.community": "Lokálna Äasová os je prázdna. NapÃÅ¡te nieÄo, aby sa to tu zaÄalo hýbaÅ¥!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Pod týmto hashtagom sa eÅ¡te niÄ nenachádza.", "empty_column.home": "VaÅ¡a lokálna osa je zatiaľ prázdna! Pre zaÄiatok pozrite {public} alebo použite vyhľadávanie a nájdite tak ostatných použÃvateľov.", "empty_column.home.public_timeline": "verejná Äasová os", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "SkryÅ¥ notifikácie od tohoto užÃvateľa?", "navigation_bar.blocks": "Blokovanà užÃvatelia", "navigation_bar.community_timeline": "Lokálna Äasová os", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "UpraviÅ¥ profil", "navigation_bar.favourites": "Obľúbené", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, jeden {výsledok} ostatné {výsledky}}", "standalone.public_title": "Náhľad dovnútra...", "status.block": "BlokovaÅ¥ @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Tento prÃspevok nemôže byÅ¥ re-tootnutý", "status.delete": "ZmazaÅ¥", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pripni na profil", "status.pinned": "Pripnutý prÃspevok", "status.reblog": "PovýšiÅ¥", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} povýšil/a", "status.reply": "OdpovedaÅ¥", "status.replyAll": "OdpovedaÅ¥ na diskusiu", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 69c7aa62bfd1918bb210e5bdcaa9aa0636c27c19..e4d07edd14f20de362e695abac4da8ea14e358fd 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "PokuÅ¡ajte ponovo", "column.blocks": "Blokirani korisnici", "column.community": "Lokalna lajna", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Omiljeni", "column.follow_requests": "Zahtevi za praćenje", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Simboli", "emoji_button.travel": "Putovanja & mesta", "empty_column.community": "Lokalna lajna je prazna. NapiÅ¡ite neÅ¡to javno da lajna produva!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Trenutno nema niÅ¡ta na ovom heÅ¡tegu.", "empty_column.home": "VaÅ¡a lajna je prazna! Posetite {public} ili koristite pretragu da poÄnete i upoznajete nove ljude.", "empty_column.home.public_timeline": "javna lajna", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Sakrij obaveÅ¡tenja od ovog korisnika?", "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalna lajna", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Izmeni profil", "navigation_bar.favourites": "Omiljeni", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {rezultat} few {rezultata} other {rezultata}}", "standalone.public_title": "Pogled iznutra...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ovaj status ne može da se podrži", "status.delete": "ObriÅ¡i", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "PrikaÄi na profil", "status.pinned": "Pinned toot", "status.reblog": "Podrži", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} podržao(la)", "status.reply": "Odgovori", "status.replyAll": "Odgovori na diskusiju", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index e9739451eb61eaa849fa0d83033c00856b670093..60c781e9dc64c98d49684e467ece972a3bb807f1 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Покушајте поново", "column.blocks": "Блокирани кориÑници", "column.community": "Локална лајна", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Омиљени", "column.follow_requests": "Захтеви за праћење", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Симболи", "emoji_button.travel": "Путовања & меÑта", "empty_column.community": "Локална лајна је празна. Ðапишите нешто јавно да лајна продува!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Тренутно нема ништа на овом хештегу.", "empty_column.home": "Ваша лајна је празна! ПоÑетите {public} или кориÑтите претрагу да почнете и упознајете нове људе.", "empty_column.home.public_timeline": "јавна лајна", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Сакриј обавештења од овог кориÑника?", "navigation_bar.blocks": "Блокирани кориÑници", "navigation_bar.community_timeline": "Локална лајна", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Измени профил", "navigation_bar.favourites": "Омиљени", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {резултат} few {резултата} other {резултата}}", "standalone.public_title": "Поглед изнутра...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Овај ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ðµ може да Ñе подржи", "status.delete": "Обриши", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Прикачи на профил", "status.pinned": "Pinned toot", "status.reblog": "Подржи", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} подржао(ла)", "status.reply": "Одговори", "status.replyAll": "Одговори на диÑкуÑију", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index b063adb0f939514c3dea17a56bec2c79bd9e725c..8fa6992f1db3d8f38364062de698d6c24117857a 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Försök igen", "column.blocks": "Blockerade användare", "column.community": "Lokal tidslinje", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoriter", "column.follow_requests": "Följ förfrÃ¥gningar", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symboler", "emoji_button.travel": "Resor & Platser", "empty_column.community": "Den lokala tidslinjen är tom. Skriv nÃ¥got offentligt för att fÃ¥ bollen att rulla!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Det finns inget i denna hashtag ännu.", "empty_column.home": "Din hemma-tidslinje är tom! Besök {public} eller använd sökning för att komma igÃ¥ng och träffa andra användare.", "empty_column.home.public_timeline": "den publika tidslinjen", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Dölj notifikationer frÃ¥n denna användare?", "navigation_bar.blocks": "Blockerade användare", "navigation_bar.community_timeline": "Lokal tidslinje", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Redigera profil", "navigation_bar.favourites": "Favoriter", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, ett {result} andra {results}}", "standalone.public_title": "En titt inuti...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Detta inlägg kan inte knuffas", "status.delete": "Ta bort", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Fäst i profil", "status.pinned": "Fäst toot", "status.reblog": "Knuff", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} knuffade", "status.reply": "Svara", "status.replyAll": "Svara pÃ¥ trÃ¥den", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 22a75c2378752c36b46156f2acdb9a3cd7b9a654..3b91c0d2ceea84738bb490b4a85ec7cce09f2662 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blocked users", "column.community": "Local timeline", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "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.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Delete", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 8e36c512f38e7a34f5471d2666de1279f88b4003..cdf6f46a3b0ccfff7b706ca8aa0e863974243c5e 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Engellenen kullanıcılar", "column.community": "Yerel zaman tüneli", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoriler", "column.follow_requests": "Takip istekleri", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", "empty_column.community": "Yerel zaman tüneliniz boÅŸ. Daha fazla eÄŸlence için herkese açık bir gönderi paylaşın.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "Henüz bu hashtag’e sahip hiçbir gönderi yok.", "empty_column.home": "Henüz kimseyi takip etmiyorsunuz. {public} ziyaret edebilir veya arama kısmını kullanarak diÄŸer kullanıcılarla iletiÅŸime geçebilirsiniz.", "empty_column.home.public_timeline": "herkese açık zaman tüneli", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Engellenen kullanıcılar", "navigation_bar.community_timeline": "Yerel zaman tüneli", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Profili düzenle", "navigation_bar.favourites": "Favoriler", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Bu gönderi boost edilemez", "status.delete": "Sil", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost'la", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boost etti", "status.reply": "Cevapla", "status.replyAll": "KonuÅŸmayı cevapla", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 09210a325819de797632f05307456c2245027df9..261e5795e07920680401940569555e7e56ea1115 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Заблоковані кориÑтувачі", "column.community": "Локальна Ñтрічка", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "Вподобане", "column.follow_requests": "Запити на підпиÑку", @@ -100,6 +101,7 @@ "emoji_button.symbols": "Символи", "emoji_button.travel": "Подорожі", "empty_column.community": "Локальна Ñтрічка пуÑта. Ðапишіть щоÑÑŒ, щоб розігріти народ!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "ДопиÑів з цим хештегом поки не Ñ–Ñнує.", "empty_column.home": "Ви поки ні на кого не підпиÑані. Погортайте {public}, або ÑкориÑтуйтеÑÑŒ пошуком, щоб оÑвоїтиÑÑ Ñ‚Ð° познайомитиÑÑ Ð· іншими кориÑтувачами.", "empty_column.home.public_timeline": "публічні Ñтрічки", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Заблоковані кориÑтувачі", "navigation_bar.community_timeline": "Локальна Ñтрічка", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Редагувати профіль", "navigation_bar.favourites": "Вподобане", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð½Ðµ може бути передмухнутий", "status.delete": "Видалити", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Передмухнути", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} передмухнув(-ла)", "status.reply": "ВідповіÑти", "status.replyAll": "ВідповіÑти на тред", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index f0772ffaa1f2802beccd89d1b5ae8d4761cd2032..aba0bde83a202ba38c0cb4da12dde3b169c20207 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "é‡è¯•", "column.blocks": "å±è”½ç”¨æˆ·", "column.community": "本站时间轴", + "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", "column.favourites": "收è—过的嘟文", "column.follow_requests": "关注请求", @@ -100,6 +101,7 @@ "emoji_button.symbols": "符å·", "emoji_button.travel": "旅行和地点", "empty_column.community": "æœ¬ç«™æ—¶é—´è½´æš‚æ—¶æ²¡æœ‰å†…å®¹ï¼Œå¿«å˜Ÿå‡ ä¸ªæ¥æŠ¢å¤´é¦™å•Šï¼", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "这个è¯é¢˜æ ‡ç¾ä¸‹æš‚时没有内容。", "empty_column.home": "ä½ è¿˜æ²¡æœ‰å…³æ³¨ä»»ä½•ç”¨æˆ·ã€‚å¿«çœ‹çœ‹{public},å‘其他用户æ讪å§ã€‚", "empty_column.home.public_timeline": "公共时间轴", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "åŒæ—¶éšè—æ¥è‡ªè¿™ä¸ªç”¨æˆ·çš„通知", "navigation_bar.blocks": "被å±è”½çš„用户", "navigation_bar.community_timeline": "本站时间轴", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "修改个人资料", "navigation_bar.favourites": "收è—的内容", @@ -238,6 +241,7 @@ "search_results.total": "å…± {count, number} 个结果", "standalone.public_title": "大家都在干啥?", "status.block": "å±è”½ @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "æ— æ³•è½¬å˜Ÿè¿™æ¡å˜Ÿæ–‡", "status.delete": "åˆ é™¤", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "在个人资料页é¢ç½®é¡¶", "status.pinned": "Pinned toot", "status.reblog": "转嘟", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} 转嘟了", "status.reply": "回å¤", "status.replyAll": "回å¤æ‰€æœ‰äºº", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 28685f4d8ffbfe2736567695452cab44a8069ba4..b5ebd20fc4b8f5779c894d3a7d89117311bae8a0 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "é‡è©¦", "column.blocks": "å°éŽ–用戶", "column.community": "本站時間軸", + "column.direct": "Direct messages", "column.domain_blocks": "éš±è—çš„æœå‹™ç«™", "column.favourites": "æœ€æ„›çš„æ–‡ç« ", "column.follow_requests": "關注請求", @@ -100,6 +101,7 @@ "emoji_button.symbols": "符號", "emoji_button.travel": "æ—…éŠæ™¯ç‰©", "empty_column.community": "本站時間軸暫時未有內容,快寫一點æ±è¥¿ä¾†æ¶é 香啊ï¼", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "這個標籤暫時未有內容。", "empty_column.home": "ä½ é‚„æ²’æœ‰é—œæ³¨ä»»ä½•ç”¨æˆ¶ã€‚å¿«çœ‹çœ‹{public},å‘其他用戶æ訕å§ã€‚", "empty_column.home.public_timeline": "公共時間軸", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "éš±è—來自這用戶的通知嗎?", "navigation_bar.blocks": "è¢«ä½ å°éŽ–的用戶", "navigation_bar.community_timeline": "本站時間軸", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "éš±è—çš„æœå‹™ç«™", "navigation_bar.edit_profile": "修改個人資料", "navigation_bar.favourites": "最愛的內容", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} é …çµæžœ", "standalone.public_title": "站點一瞥…", "status.block": "å°éŽ– @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "é€™ç¯‡æ–‡ç« ç„¡æ³•è¢«è½‰æŽ¨", "status.delete": "刪除", "status.direct": "ç§è¨Š @{name}", @@ -253,6 +257,7 @@ "status.pin": "ç½®é ‚åˆ°è³‡æ–™é ", "status.pinned": "ç½®é ‚æ–‡ç« ", "status.reblog": "轉推", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} 轉推", "status.reply": "回應", "status.replyAll": "回應所有人", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index efed9cd4da34a4007a9bc01a04da412a767a6cbb..28d63460070672687a3bbb2c4c1fe51bcf3f01c6 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -40,6 +40,7 @@ "bundle_modal_error.retry": "é‡è©¦", "column.blocks": "å°éŽ–的使用者", "column.community": "本地時間軸", + "column.direct": "Direct messages", "column.domain_blocks": "éš±è—域å", "column.favourites": "最愛", "column.follow_requests": "關注請求", @@ -100,6 +101,7 @@ "emoji_button.symbols": "符號", "emoji_button.travel": "æ—…éŠèˆ‡åœ°é»ž", "empty_column.community": "本地時間軸是空的。公開寫點什麼å§ï¼", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "這個主題標籤下什麼都沒有。", "empty_column.home": "ä½ é‚„æ²’é—œæ³¨ä»»ä½•äººã€‚é€ è¨ª{public}或利用æœå°‹åŠŸèƒ½æ‰¾åˆ°å…¶ä»–用者。", "empty_column.home.public_timeline": "公開時間軸", @@ -154,6 +156,7 @@ "mute_modal.hide_notifications": "éš±è—來自這個使用者的通知?", "navigation_bar.blocks": "å°éŽ–的使用者", "navigation_bar.community_timeline": "本地時間軸", + "navigation_bar.direct": "Direct messages", "navigation_bar.domain_blocks": "éš±è—的域å", "navigation_bar.edit_profile": "編輯用者資訊", "navigation_bar.favourites": "最愛", @@ -238,6 +241,7 @@ "search_results.total": "{count, number} é …çµæžœ", "standalone.public_title": "站點一瞥…", "status.block": "å°éŽ– @{name}", + "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "æ¤è²¼æ–‡ç„¡æ³•è½‰æŽ¨", "status.delete": "刪除", "status.direct": "Direct message @{name}", @@ -253,6 +257,7 @@ "status.pin": "ç½®é ‚åˆ°å€‹äººè³‡è¨Šé ", "status.pinned": "ç½®é ‚çš„æŽ¨æ–‡", "status.reblog": "轉推", + "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} 轉推了", "status.reply": "回應", "status.replyAll": "回應這串", diff --git a/app/javascript/mastodon/reducers/contexts.js b/app/javascript/mastodon/reducers/contexts.js index c1ecf7e8a17b3fb510dbd2f24ac2d3b82867161c..ebd01e5327afa121cbe927ae3e003ffdcd4619d0 100644 --- a/app/javascript/mastodon/reducers/contexts.js +++ b/app/javascript/mastodon/reducers/contexts.js @@ -41,8 +41,9 @@ const deleteFromContexts = (immutableState, ids) => immutableState.withMutations }); const filterContexts = (state, relationship, statuses) => { - const ownedStatusIds = statuses.filter(status => status.get('account') === relationship.id) - .map(status => status.get('id')); + const ownedStatusIds = statuses + .filter(status => status.get('account') === relationship.id) + .map(status => status.get('id')); return deleteFromContexts(state, ownedStatusIds); }; diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index 390b2a13ab0043cf4c1fd51e1acf4340b52f91db..9ec52a7fafeabb42b06a152b25d6bbf4a13ce0db 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -58,6 +58,12 @@ const initialState = ImmutableMap({ body: '', }), }), + + direct: ImmutableMap({ + regex: ImmutableMap({ + body: '', + }), + }), }); const defaultColumns = fromJS([ diff --git a/app/models/status.rb b/app/models/status.rb index f924be47b664a71a6714e54a1eed2e89c066206d..62857dd6b97a3bcd4eca13906d51872ee2b3c42a 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -183,6 +183,14 @@ class Status < ApplicationRecord where(account: [account] + account.following).where(visibility: [:public, :unlisted, :private]) end + def as_direct_timeline(account) + query = joins("LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id AND mentions.account_id = #{account.id}") + .where("mentions.account_id = #{account.id} OR statuses.account_id = #{account.id}") + .where(visibility: [:direct]) + + apply_timeline_filters(query, account, false) + end + def as_public_timeline(account = nil, local_only = false) query = timeline_scope(local_only).without_replies diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index e2763c2b9df59703f7597f45714ac7e27b32bd3b..cb65a2256539582fc9c7630d04bd4a6d08793598 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -36,6 +36,7 @@ class BatchedRemoveStatusService < BaseService # Cannot be batched statuses.each do |status| unpush_from_public_timelines(status) + unpush_from_direct_timelines(status) if status.direct_visibility? batch_salmon_slaps(status) if status.local? end @@ -87,6 +88,16 @@ class BatchedRemoveStatusService < BaseService end end + def unpush_from_direct_timelines(status) + payload = @json_payloads[status.id] + redis.pipelined do + @mentions[status.id].each do |mention| + redis.publish("timeline:direct:#{mention.account.id}", payload) if mention.account.local? + end + redis.publish("timeline:direct:#{status.account.id}", payload) if status.account.local? + end + end + def batch_salmon_slaps(status) return if @mentions[status.id].empty? diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index bbaf3094b117a04fbfe6d197ccafbe5e6758c48f..0f77556dcf29d9838402dc930623307ab92a78c6 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -10,8 +10,11 @@ class FanOutOnWriteService < BaseService deliver_to_self(status) if status.account.local? + render_anonymous_payload(status) + if status.direct_visibility? deliver_to_mentioned_followers(status) + deliver_to_direct_timelines(status) else deliver_to_followers(status) deliver_to_lists(status) @@ -19,7 +22,6 @@ class FanOutOnWriteService < BaseService return if status.account.silenced? || !status.public_visibility? || status.reblog? - render_anonymous_payload(status) deliver_to_hashtags(status) return if status.reply? && status.in_reply_to_account_id != status.account_id @@ -84,4 +86,13 @@ class FanOutOnWriteService < BaseService Redis.current.publish('timeline:public', @payload) Redis.current.publish('timeline:public:local', @payload) if status.local? end + + def deliver_to_direct_timelines(status) + Rails.logger.debug "Delivering status #{status.id} to direct timelines" + + status.mentions.includes(:account).each do |mention| + Redis.current.publish("timeline:direct:#{mention.account.id}", @payload) if mention.account.local? + end + Redis.current.publish("timeline:direct:#{status.account.id}", @payload) if status.account.local? + end end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index a100f73cebc27221ed0d7553675991617b9738cf..e164c03ab193ca6238e3ab5e4348f1a35a61e373 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -20,6 +20,7 @@ class RemoveStatusService < BaseService remove_reblogs remove_from_hashtags remove_from_public + remove_from_direct if status.direct_visibility? @status.destroy! @@ -130,6 +131,13 @@ class RemoveStatusService < BaseService Redis.current.publish('timeline:public:local', @payload) if @status.local? end + def remove_from_direct + @mentions.each do |mention| + Redis.current.publish("timeline:direct:#{mention.account.id}", @payload) if mention.account.local? + end + Redis.current.publish("timeline:direct:#{@account.id}", @payload) if @account.local? + end + def redis Redis.current end diff --git a/config/routes.rb b/config/routes.rb index 2776898aceecf4de0c90e87d46110c319116d159..d959301e98183a91e91f3c74e4ea8621e28bd6b6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -229,6 +229,7 @@ Rails.application.routes.draw do end namespace :timelines do + resource :direct, only: :show, controller: :direct resource :home, only: :show, controller: :home resource :public, only: :show, controller: :public resources :tag, only: :show diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 4b5c208717301b031ab6d43c4de1053c0a501b45..c6701018e52de520a74aa2d8bb0a3e51338d58a7 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -304,6 +304,55 @@ RSpec.describe Status, type: :model do end end + describe '.as_direct_timeline' do + let(:account) { Fabricate(:account) } + let(:followed) { Fabricate(:account) } + let(:not_followed) { Fabricate(:account) } + + before do + Fabricate(:follow, account: account, target_account: followed) + + @self_public_status = Fabricate(:status, account: account, visibility: :public) + @self_direct_status = Fabricate(:status, account: account, visibility: :direct) + @followed_public_status = Fabricate(:status, account: followed, visibility: :public) + @followed_direct_status = Fabricate(:status, account: followed, visibility: :direct) + @not_followed_direct_status = Fabricate(:status, account: not_followed, visibility: :direct) + + @results = Status.as_direct_timeline(account) + end + + it 'does not include public statuses from self' do + expect(@results).to_not include(@self_public_status) + end + + it 'includes direct statuses from self' do + expect(@results).to include(@self_direct_status) + end + + it 'does not include public statuses from followed' do + expect(@results).to_not include(@followed_public_status) + end + + it 'includes direct statuses mentioning recipient from followed' do + Fabricate(:mention, account: account, status: @followed_direct_status) + expect(@results).to include(@followed_direct_status) + end + + it 'does not include direct statuses not mentioning recipient from followed' do + expect(@results).to_not include(@followed_direct_status) + end + + it 'includes direct statuses mentioning recipient from non-followed' do + Fabricate(:mention, account: account, status: @not_followed_direct_status) + expect(@results).to include(@not_followed_direct_status) + end + + it 'does not include direct statuses not mentioning recipient from non-followed' do + expect(@results).to_not include(@not_followed_direct_status) + end + + end + describe '.as_public_timeline' do it 'only includes statuses with public visibility' do public_status = Fabricate(:status, visibility: :public) diff --git a/streaming/index.js b/streaming/index.js index 1b4f8596ceffd0673b6ea7a1fc753dcc112e7b60..48bab8078e5c472d5f667698e9f21ae7aac628a6 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -466,6 +466,10 @@ const startWorker = (workerId) => { streamFrom('timeline:public:local', req, streamToHttp(req, res), streamHttpEnd(req), true); }); + app.get('/api/v1/streaming/direct', (req, res) => { + streamFrom(`timeline:direct:${req.accountId}`, req, streamToHttp(req, res), streamHttpEnd(req), true); + }); + app.get('/api/v1/streaming/hashtag', (req, res) => { streamFrom(`timeline:hashtag:${req.query.tag.toLowerCase()}`, req, streamToHttp(req, res), streamHttpEnd(req), true); }); @@ -517,6 +521,9 @@ const startWorker = (workerId) => { case 'public:local': streamFrom('timeline:public:local', req, streamToWs(req, ws), streamWsEnd(req, ws), true); break; + case 'direct': + streamFrom(`timeline:direct:${req.accountId}`, req, streamToWs(req, ws), streamWsEnd(req, ws), true); + break; case 'hashtag': streamFrom(`timeline:hashtag:${location.query.tag.toLowerCase()}`, req, streamToWs(req, ws), streamWsEnd(req, ws), true); break; diff --git a/yarn.lock b/yarn.lock index fba2cb9a766cdc970c306412c5adaed0c145ffd3..c5a49a497e8013318489f154b968d2dfb511bc41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5994,9 +5994,9 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" +react-dom@^16.3.0: + version "16.3.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -6180,9 +6180,9 @@ react-transition-group@^2.2.0: prop-types "^15.5.8" warning "^3.0.0" -react@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" +react@^16.3.0: + version "16.3.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0"