mirror of
https://git.kescher.at/CatCatNya/catstodon.git
synced 2024-11-22 11:48:06 +01:00
Merge pull request #2804 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to ad95c98054
This commit is contained in:
commit
a31ab56b3a
133 changed files with 1410 additions and 817 deletions
|
@ -614,7 +614,7 @@ GEM
|
|||
pundit (2.3.2)
|
||||
activesupport (>= 3.0.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.8.0)
|
||||
racc (1.8.1)
|
||||
rack (2.2.9)
|
||||
rack-attack (6.7.0)
|
||||
rack (>= 1.0, < 4)
|
||||
|
@ -698,7 +698,7 @@ GEM
|
|||
responders (3.1.1)
|
||||
actionpack (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rexml (3.3.2)
|
||||
rexml (3.3.4)
|
||||
strscan
|
||||
rotp (6.3.0)
|
||||
rouge (4.2.1)
|
||||
|
@ -735,7 +735,7 @@ GEM
|
|||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 8)
|
||||
rspec-support (3.13.1)
|
||||
rubocop (1.65.0)
|
||||
rubocop (1.65.1)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
|
|
|
@ -5,6 +5,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController
|
|||
include AccountableConcern
|
||||
|
||||
LIMIT = 100
|
||||
MAX_LIMIT = 500
|
||||
|
||||
before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_allows' }, only: [:index, :show]
|
||||
before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_allows' }, except: [:index, :show]
|
||||
|
@ -47,7 +48,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController
|
|||
private
|
||||
|
||||
def set_domain_allows
|
||||
@domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||
@domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||
end
|
||||
|
||||
def set_domain_allow
|
||||
|
@ -67,7 +68,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController
|
|||
end
|
||||
|
||||
def records_continue?
|
||||
@domain_allows.size == limit_param(LIMIT)
|
||||
@domain_allows.size == limit_param(LIMIT, MAX_LIMIT)
|
||||
end
|
||||
|
||||
def resource_params
|
||||
|
|
|
@ -5,6 +5,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
|||
include AccountableConcern
|
||||
|
||||
LIMIT = 100
|
||||
MAX_LIMIT = 500
|
||||
|
||||
before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_blocks' }, only: [:index, :show]
|
||||
before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_blocks' }, except: [:index, :show]
|
||||
|
@ -59,7 +60,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
|||
end
|
||||
|
||||
def set_domain_blocks
|
||||
@domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||
@domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||
end
|
||||
|
||||
def set_domain_block
|
||||
|
@ -83,7 +84,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
|||
end
|
||||
|
||||
def records_continue?
|
||||
@domain_blocks.size == limit_param(LIMIT)
|
||||
@domain_blocks.size == limit_param(LIMIT, MAX_LIMIT)
|
||||
end
|
||||
|
||||
def resource_params
|
||||
|
|
|
@ -5,7 +5,8 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
|
|||
before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index
|
||||
|
||||
before_action :require_user!
|
||||
before_action :set_request, except: :index
|
||||
before_action :set_request, only: [:show, :accept, :dismiss]
|
||||
before_action :set_requests, only: [:accept_bulk, :dismiss_bulk]
|
||||
|
||||
after_action :insert_pagination_headers, only: :index
|
||||
|
||||
|
@ -32,6 +33,16 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
|
|||
render_empty
|
||||
end
|
||||
|
||||
def accept_bulk
|
||||
@requests.each { |request| AcceptNotificationRequestService.new.call(request) }
|
||||
render_empty
|
||||
end
|
||||
|
||||
def dismiss_bulk
|
||||
@requests.each(&:destroy!)
|
||||
render_empty
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_requests
|
||||
|
@ -53,6 +64,10 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
|
|||
@request = NotificationRequest.where(account: current_account).find(params[:id])
|
||||
end
|
||||
|
||||
def set_requests
|
||||
@requests = NotificationRequest.where(account: current_account, id: Array(params[:id]).uniq.map(&:to_i))
|
||||
end
|
||||
|
||||
def next_path
|
||||
api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty?
|
||||
end
|
||||
|
|
|
@ -5,7 +5,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
|||
|
||||
layout 'auth'
|
||||
|
||||
before_action :set_body_classes
|
||||
before_action :set_confirmation_user!, only: [:show, :confirm_captcha]
|
||||
before_action :redirect_confirmed_user, if: :signed_in_confirmed_user?
|
||||
|
||||
|
@ -73,10 +72,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
|||
user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank?
|
||||
end
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = 'lighter'
|
||||
end
|
||||
|
||||
def after_resending_confirmation_instructions_path_for(_resource_name)
|
||||
if user_signed_in?
|
||||
if current_user.confirmed? && current_user.approved?
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
class Auth::PasswordsController < Devise::PasswordsController
|
||||
skip_before_action :check_self_destruct!
|
||||
before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid?
|
||||
before_action :set_body_classes
|
||||
|
||||
layout 'auth'
|
||||
|
||||
|
@ -24,10 +23,6 @@ class Auth::PasswordsController < Devise::PasswordsController
|
|||
redirect_to new_password_path(resource_name)
|
||||
end
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = 'lighter'
|
||||
end
|
||||
|
||||
def reset_password_token_is_valid?
|
||||
resource_class.with_reset_password_token(params[:reset_password_token]).present?
|
||||
end
|
||||
|
|
|
@ -105,7 +105,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
private
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter'
|
||||
@body_classes = 'admin' if %w(edit update).include?(action_name)
|
||||
end
|
||||
|
||||
def set_invite
|
||||
|
|
|
@ -16,8 +16,6 @@ class Auth::SessionsController < Devise::SessionsController
|
|||
|
||||
include Auth::TwoFactorAuthenticationConcern
|
||||
|
||||
before_action :set_body_classes
|
||||
|
||||
content_security_policy only: :new do |p|
|
||||
p.form_action(false)
|
||||
end
|
||||
|
@ -103,10 +101,6 @@ class Auth::SessionsController < Devise::SessionsController
|
|||
|
||||
private
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = 'lighter'
|
||||
end
|
||||
|
||||
def home_paths(resource)
|
||||
paths = [about_path, '/explore']
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ class Auth::SetupController < ApplicationController
|
|||
|
||||
before_action :authenticate_user!
|
||||
before_action :require_unconfirmed_or_pending!
|
||||
before_action :set_body_classes
|
||||
before_action :set_user
|
||||
|
||||
skip_before_action :require_functional!
|
||||
|
@ -35,10 +34,6 @@ class Auth::SetupController < ApplicationController
|
|||
@user = current_user
|
||||
end
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = 'lighter'
|
||||
end
|
||||
|
||||
def user_params
|
||||
params.require(:user).permit(:email)
|
||||
end
|
||||
|
|
|
@ -83,7 +83,6 @@ module Auth::TwoFactorAuthenticationConcern
|
|||
def prompt_for_two_factor(user)
|
||||
register_attempt_in_session(user)
|
||||
|
||||
@body_classes = 'lighter'
|
||||
@webauthn_enabled = user.webauthn_enabled?
|
||||
@scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank?
|
||||
'webauthn'
|
||||
|
|
|
@ -42,7 +42,6 @@ module ChallengableConcern
|
|||
end
|
||||
|
||||
def render_challenge
|
||||
@body_classes = 'lighter'
|
||||
render 'auth/challenges/new', layout: 'auth'
|
||||
end
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ class MailSubscriptionsController < ApplicationController
|
|||
|
||||
skip_before_action :require_functional!
|
||||
|
||||
before_action :set_body_classes
|
||||
before_action :set_user
|
||||
before_action :set_type
|
||||
|
||||
|
@ -25,10 +24,6 @@ class MailSubscriptionsController < ApplicationController
|
|||
not_found unless @user
|
||||
end
|
||||
|
||||
def set_body_classes
|
||||
@body_classes = 'lighter'
|
||||
end
|
||||
|
||||
def set_type
|
||||
@type = email_type_from_param
|
||||
end
|
||||
|
|
|
@ -11,6 +11,8 @@ interface Props {
|
|||
style?: React.CSSProperties;
|
||||
inline?: boolean;
|
||||
animate?: boolean;
|
||||
counter?: number | string;
|
||||
counterBorderColor?: string;
|
||||
}
|
||||
|
||||
export const Avatar: React.FC<Props> = ({
|
||||
|
@ -19,6 +21,8 @@ export const Avatar: React.FC<Props> = ({
|
|||
size = 20,
|
||||
inline = false,
|
||||
style: styleFromParent,
|
||||
counter,
|
||||
counterBorderColor,
|
||||
}) => {
|
||||
const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate);
|
||||
|
||||
|
@ -43,7 +47,15 @@ export const Avatar: React.FC<Props> = ({
|
|||
style={style}
|
||||
data-avatar-of={account && `@${account.get('acct')}`}
|
||||
>
|
||||
{src && <img src={src} alt={account?.get('acct')} />}
|
||||
{src && <img src={src} alt='' />}
|
||||
{counter && (
|
||||
<div
|
||||
className='account__avatar__counter'
|
||||
style={{ borderColor: counterBorderColor }}
|
||||
>
|
||||
{counter}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -20,7 +20,7 @@ let id = 0;
|
|||
class DropdownMenu extends PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
|
||||
items: PropTypes.array.isRequired,
|
||||
loading: PropTypes.bool,
|
||||
scrollable: PropTypes.bool,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
|
@ -39,6 +39,7 @@ class DropdownMenu extends PureComponent {
|
|||
if (this.node && !this.node.contains(e.target)) {
|
||||
this.props.onClose();
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -164,7 +165,7 @@ class Dropdown extends PureComponent {
|
|||
children: PropTypes.node,
|
||||
icon: PropTypes.string,
|
||||
iconComponent: PropTypes.func,
|
||||
items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]),
|
||||
items: PropTypes.array.isRequired,
|
||||
loading: PropTypes.bool,
|
||||
size: PropTypes.number,
|
||||
title: PropTypes.string,
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import Toggle from 'react-toggle';
|
||||
|
||||
export const CheckboxWithLabel = ({ checked, disabled, children, onChange }) => {
|
||||
const handleChange = useCallback(({ target }) => {
|
||||
onChange(target.checked);
|
||||
}, [onChange]);
|
||||
|
||||
return (
|
||||
<label className='app-form__toggle'>
|
||||
<div className='app-form__toggle__label'>
|
||||
{children}
|
||||
</div>
|
||||
|
||||
<div className='app-form__toggle__toggle'>
|
||||
<div>
|
||||
<Toggle checked={checked} onChange={handleChange} disabled={disabled} />
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
);
|
||||
};
|
||||
|
||||
CheckboxWithLabel.propTypes = {
|
||||
checked: PropTypes.bool,
|
||||
disabled: PropTypes.bool,
|
||||
children: PropTypes.children,
|
||||
onChange: PropTypes.func,
|
||||
};
|
|
@ -0,0 +1,40 @@
|
|||
import type { PropsWithChildren } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import Toggle from 'react-toggle';
|
||||
|
||||
interface Props {
|
||||
checked: boolean;
|
||||
disabled?: boolean;
|
||||
onChange: (checked: boolean) => void;
|
||||
}
|
||||
|
||||
export const CheckboxWithLabel: React.FC<PropsWithChildren<Props>> = ({
|
||||
checked,
|
||||
disabled,
|
||||
children,
|
||||
onChange,
|
||||
}) => {
|
||||
const handleChange = useCallback(
|
||||
({ target }: React.ChangeEvent<HTMLInputElement>) => {
|
||||
onChange(target.checked);
|
||||
},
|
||||
[onChange],
|
||||
);
|
||||
|
||||
return (
|
||||
<label className='app-form__toggle'>
|
||||
<div className='app-form__toggle__label'>{children}</div>
|
||||
|
||||
<div className='app-form__toggle__toggle'>
|
||||
<div>
|
||||
<Toggle
|
||||
checked={checked}
|
||||
onChange={handleChange}
|
||||
disabled={disabled}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
);
|
||||
};
|
|
@ -8,10 +8,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
|||
import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions';
|
||||
|
||||
import { CheckboxWithLabel } from './checkbox_with_label';
|
||||
import ClearColumnButton from './clear_column_button';
|
||||
import GrantPermissionButton from './grant_permission_button';
|
||||
import PillBarButton from './pill_bar_button';
|
||||
import { PolicyControls } from './policy_controls';
|
||||
import SettingToggle from './setting_toggle';
|
||||
|
||||
class ColumnSettings extends PureComponent {
|
||||
|
@ -25,32 +25,14 @@ class ColumnSettings extends PureComponent {
|
|||
alertsEnabled: PropTypes.bool,
|
||||
browserSupport: PropTypes.bool,
|
||||
browserPermission: PropTypes.string,
|
||||
notificationPolicy: PropTypes.object.isRequired,
|
||||
onChangePolicy: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
onPushChange = (path, checked) => {
|
||||
this.props.onChange(['push', ...path], checked);
|
||||
};
|
||||
|
||||
handleFilterNotFollowing = checked => {
|
||||
this.props.onChangePolicy('filter_not_following', checked);
|
||||
};
|
||||
|
||||
handleFilterNotFollowers = checked => {
|
||||
this.props.onChangePolicy('filter_not_followers', checked);
|
||||
};
|
||||
|
||||
handleFilterNewAccounts = checked => {
|
||||
this.props.onChangePolicy('filter_new_accounts', checked);
|
||||
};
|
||||
|
||||
handleFilterPrivateMentions = checked => {
|
||||
this.props.onChangePolicy('filter_private_mentions', checked);
|
||||
};
|
||||
|
||||
render () {
|
||||
const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props;
|
||||
const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props;
|
||||
|
||||
const unreadMarkersShowStr = <FormattedMessage id='notifications.column_settings.unread_notifications.highlight' defaultMessage='Highlight unread notifications' />;
|
||||
const groupingShowStr = <FormattedMessage id='notifications.column_settings.beta.grouping' defaultMessage='Group notifications' />;
|
||||
|
@ -81,31 +63,7 @@ class ColumnSettings extends PureComponent {
|
|||
</section>
|
||||
)}
|
||||
|
||||
<section>
|
||||
<h3><FormattedMessage id='notifications.policy.title' defaultMessage='Filter out notifications from…' /></h3>
|
||||
|
||||
<div className='column-settings__row'>
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_not_following} onChange={this.handleFilterNotFollowing}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_not_following_title' defaultMessage="People you don't follow" /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_not_following_hint' defaultMessage='Until you manually approve them' /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_not_followers} onChange={this.handleFilterNotFollowers}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_not_followers_title' defaultMessage='People not following you' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_not_followers_hint' defaultMessage='Including people who have been following you fewer than {days, plural, one {one day} other {# days}}' values={{ days: 3 }} /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_new_accounts} onChange={this.handleFilterNewAccounts}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_new_accounts_title' defaultMessage='New accounts' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_new_accounts.hint' defaultMessage='Created within the past {days, plural, one {one day} other {# days}}' values={{ days: 30 }} /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_private_mentions} onChange={this.handleFilterPrivateMentions}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_private_mentions_title' defaultMessage='Unsolicited private mentions' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_private_mentions_hint' defaultMessage="Filtered unless it's in reply to your own mention or if you follow the sender" /></span>
|
||||
</CheckboxWithLabel>
|
||||
</div>
|
||||
</section>
|
||||
<PolicyControls />
|
||||
|
||||
<section role='group' aria-labelledby='notifications-filter-bar'>
|
||||
<h3 id='notifications-filter-bar'><FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' /></h3>
|
||||
|
|
|
@ -1,18 +1,62 @@
|
|||
import { useEffect } from 'react';
|
||||
import { useCallback, useEffect } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link, useHistory } from 'react-router-dom';
|
||||
|
||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||
import { fetchNotificationPolicy } from 'flavours/glitch/actions/notification_policies';
|
||||
import { Icon } from 'flavours/glitch/components/icon';
|
||||
import { selectSettingsNotificationsMinimizeFilteredBanner } from 'flavours/glitch/selectors/settings';
|
||||
import { useAppSelector, useAppDispatch } from 'flavours/glitch/store';
|
||||
import { toCappedNumber } from 'flavours/glitch/utils/numbers';
|
||||
|
||||
const messages = defineMessages({
|
||||
filteredNotifications: {
|
||||
id: 'notification_requests.title',
|
||||
defaultMessage: 'Filtered notifications',
|
||||
},
|
||||
});
|
||||
|
||||
export const FilteredNotificationsIconButton: React.FC<{
|
||||
className?: string;
|
||||
}> = ({ className }) => {
|
||||
const intl = useIntl();
|
||||
const history = useHistory();
|
||||
const policy = useAppSelector((state) => state.notificationPolicy);
|
||||
const minimizeSetting = useAppSelector(
|
||||
selectSettingsNotificationsMinimizeFilteredBanner,
|
||||
);
|
||||
|
||||
const handleClick = useCallback(() => {
|
||||
history.push('/notifications/requests');
|
||||
}, [history]);
|
||||
|
||||
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!minimizeSetting) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.filteredNotifications)}
|
||||
title={intl.formatMessage(messages.filteredNotifications)}
|
||||
onClick={handleClick}
|
||||
className={className}
|
||||
>
|
||||
<Icon id='filtered-notifications' icon={InventoryIcon} />
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
export const FilteredNotificationsBanner: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
const policy = useAppSelector((state) => state.notificationPolicy);
|
||||
const minimizeSetting = useAppSelector(
|
||||
selectSettingsNotificationsMinimizeFilteredBanner,
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
void dispatch(fetchNotificationPolicy());
|
||||
|
@ -30,6 +74,10 @@ export const FilteredNotificationsBanner: React.FC = () => {
|
|||
return null;
|
||||
}
|
||||
|
||||
if (minimizeSetting) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Link
|
||||
className='filtered-notifications-banner'
|
||||
|
@ -54,10 +102,6 @@ export const FilteredNotificationsBanner: React.FC = () => {
|
|||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className='filtered-notifications-banner__badge'>
|
||||
{toCappedNumber(policy.summary.pending_notifications_count)}
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -38,12 +38,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => {
|
|||
return (
|
||||
<div className='notification-request'>
|
||||
<Link to={`/notifications/requests/${id}`} className='notification-request__link'>
|
||||
<Avatar account={account} size={36} />
|
||||
<Avatar account={account} size={40} counter={toCappedNumber(notificationsCount)} />
|
||||
|
||||
<div className='notification-request__name'>
|
||||
<div className='notification-request__name__display-name'>
|
||||
<bdi><strong dangerouslySetInnerHTML={{ __html: account?.get('display_name_html') }} /></bdi>
|
||||
<span className='filtered-notifications-banner__badge'>{toCappedNumber(notificationsCount)}</span>
|
||||
</div>
|
||||
|
||||
<span>@{account?.get('acct')}</span>
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
import { useCallback } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import { updateNotificationsPolicy } from 'flavours/glitch/actions/notification_policies';
|
||||
import { useAppSelector, useAppDispatch } from 'flavours/glitch/store';
|
||||
|
||||
import { CheckboxWithLabel } from './checkbox_with_label';
|
||||
|
||||
export const PolicyControls: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const notificationPolicy = useAppSelector(
|
||||
(state) => state.notificationPolicy,
|
||||
);
|
||||
|
||||
const handleFilterNotFollowing = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_not_following: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterNotFollowers = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_not_followers: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterNewAccounts = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_new_accounts: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterPrivateMentions = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_private_mentions: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
if (!notificationPolicy) return null;
|
||||
|
||||
return (
|
||||
<section>
|
||||
<h3>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.title'
|
||||
defaultMessage='Filter out notifications from…'
|
||||
/>
|
||||
</h3>
|
||||
|
||||
<div className='column-settings__row'>
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_not_following}
|
||||
onChange={handleFilterNotFollowing}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_following_title'
|
||||
defaultMessage="People you don't follow"
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_following_hint'
|
||||
defaultMessage='Until you manually approve them'
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_not_followers}
|
||||
onChange={handleFilterNotFollowers}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_followers_title'
|
||||
defaultMessage='People not following you'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_followers_hint'
|
||||
defaultMessage='Including people who have been following you fewer than {days, plural, one {one day} other {# days}}'
|
||||
values={{ days: 3 }}
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_new_accounts}
|
||||
onChange={handleFilterNewAccounts}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_new_accounts_title'
|
||||
defaultMessage='New accounts'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_new_accounts.hint'
|
||||
defaultMessage='Created within the past {days, plural, one {one day} other {# days}}'
|
||||
values={{ days: 30 }}
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_private_mentions}
|
||||
onChange={handleFilterPrivateMentions}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_private_mentions_title'
|
||||
defaultMessage='Unsolicited private mentions'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_private_mentions_hint'
|
||||
defaultMessage="Filtered unless it's in reply to your own mention or if you follow the sender"
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
|
@ -6,7 +6,6 @@ import { openModal } from 'flavours/glitch/actions/modal';
|
|||
import { initializeNotifications } from 'flavours/glitch/actions/notifications_migration';
|
||||
|
||||
import { showAlert } from '../../../actions/alerts';
|
||||
import { updateNotificationsPolicy } from '../../../actions/notification_policies';
|
||||
import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
||||
import { changeSetting } from '../../../actions/settings';
|
||||
|
@ -25,7 +24,6 @@ const mapStateToProps = state => ({
|
|||
alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true),
|
||||
browserSupport: state.getIn(['notifications', 'browserSupport']),
|
||||
browserPermission: state.getIn(['notifications', 'browserPermission']),
|
||||
notificationPolicy: state.notificationPolicy,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
|
@ -74,12 +72,6 @@ const mapDispatchToProps = (dispatch) => ({
|
|||
dispatch(requestBrowserPermission());
|
||||
},
|
||||
|
||||
onChangePolicy (param, checked) {
|
||||
dispatch(updateNotificationsPolicy({
|
||||
[param]: checked,
|
||||
}));
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));
|
||||
|
|
|
@ -38,7 +38,10 @@ import { LoadGap } from '../../components/load_gap';
|
|||
import ScrollableList from '../../components/scrollable_list';
|
||||
import NotificationPurgeButtonsContainer from '../../containers/notification_purge_buttons_container';
|
||||
|
||||
import { FilteredNotificationsBanner } from './components/filtered_notifications_banner';
|
||||
import {
|
||||
FilteredNotificationsBanner,
|
||||
FilteredNotificationsIconButton,
|
||||
} from './components/filtered_notifications_banner';
|
||||
import NotificationsPermissionBanner from './components/notifications_permission_banner';
|
||||
import ColumnSettingsContainer from './containers/column_settings_container';
|
||||
import FilterBarContainer from './containers/filter_bar_container';
|
||||
|
@ -290,7 +293,9 @@ class Notifications extends PureComponent {
|
|||
scrollContainer = <NotSignedInIndicator />;
|
||||
}
|
||||
|
||||
const extraButtons = [];
|
||||
const extraButtons = [
|
||||
<FilteredNotificationsIconButton key='filtered-notifications-icon' className='column-header__button' />,
|
||||
];
|
||||
|
||||
if (canMarkAsRead) {
|
||||
extraButtons.push(
|
||||
|
|
|
@ -9,16 +9,52 @@ import { useSelector, useDispatch } from 'react-redux';
|
|||
|
||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||
import { fetchNotificationRequests, expandNotificationRequests } from 'flavours/glitch/actions/notifications';
|
||||
import { changeSetting } from 'flavours/glitch/actions/settings';
|
||||
import Column from 'flavours/glitch/components/column';
|
||||
import ColumnHeader from 'flavours/glitch/components/column_header';
|
||||
import ScrollableList from 'flavours/glitch/components/scrollable_list';
|
||||
|
||||
import { NotificationRequest } from './components/notification_request';
|
||||
import { PolicyControls } from './components/policy_controls';
|
||||
import SettingToggle from './components/setting_toggle';
|
||||
|
||||
const messages = defineMessages({
|
||||
title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' },
|
||||
maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' }
|
||||
});
|
||||
|
||||
const ColumnSettings = () => {
|
||||
const dispatch = useDispatch();
|
||||
const settings = useSelector((state) => state.settings.get('notifications'));
|
||||
|
||||
const onChange = useCallback(
|
||||
(key, checked) => {
|
||||
dispatch(changeSetting(['notifications', ...key], checked));
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
return (
|
||||
<div className='column-settings'>
|
||||
<section>
|
||||
<div className='column-settings__row'>
|
||||
<SettingToggle
|
||||
prefix='notifications'
|
||||
settings={settings}
|
||||
settingPath={['minimizeFilteredBanner']}
|
||||
onChange={onChange}
|
||||
label={
|
||||
<FormattedMessage id='notification_requests.minimize_banner' defaultMessage='Minimize filtred notifications banner' />
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<PolicyControls />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const NotificationRequests = ({ multiColumn }) => {
|
||||
const columnRef = useRef();
|
||||
const intl = useIntl();
|
||||
|
@ -48,7 +84,9 @@ export const NotificationRequests = ({ multiColumn }) => {
|
|||
onClick={handleHeaderClick}
|
||||
multiColumn={multiColumn}
|
||||
showBackButton
|
||||
/>
|
||||
>
|
||||
<ColumnSettings />
|
||||
</ColumnHeader>
|
||||
|
||||
<ScrollableList
|
||||
scrollKey='notification_requests'
|
||||
|
|
|
@ -43,7 +43,10 @@ import Column from '../../components/column';
|
|||
import { ColumnHeader } from '../../components/column_header';
|
||||
import { LoadGap } from '../../components/load_gap';
|
||||
import ScrollableList from '../../components/scrollable_list';
|
||||
import { FilteredNotificationsBanner } from '../notifications/components/filtered_notifications_banner';
|
||||
import {
|
||||
FilteredNotificationsBanner,
|
||||
FilteredNotificationsIconButton,
|
||||
} from '../notifications/components/filtered_notifications_banner';
|
||||
import NotificationsPermissionBanner from '../notifications/components/notifications_permission_banner';
|
||||
import ColumnSettingsContainer from '../notifications/containers/column_settings_container';
|
||||
|
||||
|
@ -306,16 +309,21 @@ export const Notifications: React.FC<{
|
|||
<NotSignedInIndicator />
|
||||
);
|
||||
|
||||
const extraButton = canMarkAsRead ? (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
) : null;
|
||||
const extraButton = (
|
||||
<>
|
||||
<FilteredNotificationsIconButton className='column-header__button' />
|
||||
{canMarkAsRead && (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column
|
||||
|
|
|
@ -52,6 +52,7 @@ const initialState = ImmutableMap({
|
|||
|
||||
dismissPermissionBanner: false,
|
||||
showUnread: true,
|
||||
minimizeFilteredBanner: false,
|
||||
|
||||
shows: ImmutableMap({
|
||||
follow: true,
|
||||
|
|
|
@ -37,4 +37,9 @@ export const selectNeedsNotificationPermission = (state: RootState) =>
|
|||
'dismissPermissionBanner',
|
||||
])) as boolean;
|
||||
|
||||
export const selectSettingsNotificationsMinimizeFilteredBanner = (
|
||||
state: RootState,
|
||||
) =>
|
||||
state.settings.getIn(['notifications', 'minimizeFilteredBanner']) as boolean;
|
||||
|
||||
/* eslint-enable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */
|
||||
|
|
|
@ -1,15 +1,3 @@
|
|||
@mixin avatar-radius() {
|
||||
border-radius: $ui-avatar-border-size;
|
||||
background-position: 50%;
|
||||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
@mixin avatar-size($size: 48px) {
|
||||
width: $size;
|
||||
height: $size;
|
||||
background-size: $size $size;
|
||||
}
|
||||
|
||||
@mixin fullwidth-gallery {
|
||||
&.full-width {
|
||||
margin-left: -14px;
|
||||
|
|
|
@ -49,8 +49,6 @@
|
|||
flex: 0 0 auto;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
@include avatar-size(48px);
|
||||
|
||||
padding-top: 2px;
|
||||
|
||||
img {
|
||||
|
@ -59,8 +57,6 @@
|
|||
display: block;
|
||||
margin: 0;
|
||||
border-radius: 4px;
|
||||
@include avatar-radius;
|
||||
|
||||
background: darken($ui-base-color, 8%);
|
||||
object-fit: cover;
|
||||
}
|
||||
|
|
|
@ -66,10 +66,6 @@ body {
|
|||
}
|
||||
}
|
||||
|
||||
&.lighter {
|
||||
background: $ui-base-color;
|
||||
}
|
||||
|
||||
&.with-modals {
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
|
@ -109,7 +105,6 @@ body {
|
|||
}
|
||||
|
||||
&.embed {
|
||||
background: lighten($ui-base-color, 4%);
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
|
||||
|
@ -122,15 +117,12 @@ body {
|
|||
}
|
||||
|
||||
&.admin {
|
||||
background: var(--background-color);
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&.error {
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
color: $darker-text-color;
|
||||
background: $ui-base-color;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
|
|
|
@ -2162,17 +2162,15 @@ body > [data-popper-placement] {
|
|||
}
|
||||
|
||||
.account__avatar {
|
||||
@include avatar-radius;
|
||||
|
||||
display: block;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
&-inline {
|
||||
|
@ -2182,8 +2180,6 @@ body > [data-popper-placement] {
|
|||
}
|
||||
|
||||
&-composite {
|
||||
@include avatar-radius;
|
||||
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
|
@ -2210,6 +2206,29 @@ body > [data-popper-placement] {
|
|||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
&__counter {
|
||||
$height: 16px;
|
||||
$h-padding: 5px;
|
||||
|
||||
position: absolute;
|
||||
bottom: -3px;
|
||||
inset-inline-end: -3px;
|
||||
padding-left: $h-padding;
|
||||
padding-right: $h-padding;
|
||||
height: $height;
|
||||
border-radius: $height;
|
||||
min-width: $height - 2 * $h-padding; // to ensure that it is never narrower than a circle
|
||||
line-height: $height + 1px; // to visually center the numbers
|
||||
background-color: $ui-button-background-color;
|
||||
color: $white;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: var(--background-color);
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
a .account__avatar {
|
||||
|
@ -10774,6 +10793,12 @@ noscript {
|
|||
letter-spacing: 0.5px;
|
||||
line-height: 24px;
|
||||
color: $secondary-text-color;
|
||||
|
||||
bdi {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
|
||||
.filtered-notifications-banner__badge {
|
||||
|
|
|
@ -72,12 +72,9 @@
|
|||
}
|
||||
|
||||
.avatar {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
flex: 0 0 auto;
|
||||
@include avatar-size(40px);
|
||||
|
||||
margin-inline-end: 10px;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
|
@ -85,7 +82,6 @@
|
|||
display: block;
|
||||
margin: 0;
|
||||
border-radius: 4px;
|
||||
@include avatar-radius;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@ interface Props {
|
|||
style?: React.CSSProperties;
|
||||
inline?: boolean;
|
||||
animate?: boolean;
|
||||
counter?: number | string;
|
||||
counterBorderColor?: string;
|
||||
}
|
||||
|
||||
export const Avatar: React.FC<Props> = ({
|
||||
|
@ -19,6 +21,8 @@ export const Avatar: React.FC<Props> = ({
|
|||
size = 20,
|
||||
inline = false,
|
||||
style: styleFromParent,
|
||||
counter,
|
||||
counterBorderColor,
|
||||
}) => {
|
||||
const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate);
|
||||
|
||||
|
@ -43,6 +47,14 @@ export const Avatar: React.FC<Props> = ({
|
|||
style={style}
|
||||
>
|
||||
{src && <img src={src} alt='' />}
|
||||
{counter && (
|
||||
<div
|
||||
className='account__avatar__counter'
|
||||
style={{ borderColor: counterBorderColor }}
|
||||
>
|
||||
{counter}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -20,7 +20,7 @@ let id = 0;
|
|||
class DropdownMenu extends PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
|
||||
items: PropTypes.array.isRequired,
|
||||
loading: PropTypes.bool,
|
||||
scrollable: PropTypes.bool,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
|
@ -39,6 +39,7 @@ class DropdownMenu extends PureComponent {
|
|||
if (this.node && !this.node.contains(e.target)) {
|
||||
this.props.onClose();
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -164,7 +165,7 @@ class Dropdown extends PureComponent {
|
|||
children: PropTypes.node,
|
||||
icon: PropTypes.string,
|
||||
iconComponent: PropTypes.func,
|
||||
items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]),
|
||||
items: PropTypes.array.isRequired,
|
||||
loading: PropTypes.bool,
|
||||
size: PropTypes.number,
|
||||
title: PropTypes.string,
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import Toggle from 'react-toggle';
|
||||
|
||||
export const CheckboxWithLabel = ({ checked, disabled, children, onChange }) => {
|
||||
const handleChange = useCallback(({ target }) => {
|
||||
onChange(target.checked);
|
||||
}, [onChange]);
|
||||
|
||||
return (
|
||||
<label className='app-form__toggle'>
|
||||
<div className='app-form__toggle__label'>
|
||||
{children}
|
||||
</div>
|
||||
|
||||
<div className='app-form__toggle__toggle'>
|
||||
<div>
|
||||
<Toggle checked={checked} onChange={handleChange} disabled={disabled} />
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
);
|
||||
};
|
||||
|
||||
CheckboxWithLabel.propTypes = {
|
||||
checked: PropTypes.bool,
|
||||
disabled: PropTypes.bool,
|
||||
children: PropTypes.children,
|
||||
onChange: PropTypes.func,
|
||||
};
|
|
@ -0,0 +1,40 @@
|
|||
import type { PropsWithChildren } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import Toggle from 'react-toggle';
|
||||
|
||||
interface Props {
|
||||
checked: boolean;
|
||||
disabled?: boolean;
|
||||
onChange: (checked: boolean) => void;
|
||||
}
|
||||
|
||||
export const CheckboxWithLabel: React.FC<PropsWithChildren<Props>> = ({
|
||||
checked,
|
||||
disabled,
|
||||
children,
|
||||
onChange,
|
||||
}) => {
|
||||
const handleChange = useCallback(
|
||||
({ target }: React.ChangeEvent<HTMLInputElement>) => {
|
||||
onChange(target.checked);
|
||||
},
|
||||
[onChange],
|
||||
);
|
||||
|
||||
return (
|
||||
<label className='app-form__toggle'>
|
||||
<div className='app-form__toggle__label'>{children}</div>
|
||||
|
||||
<div className='app-form__toggle__toggle'>
|
||||
<div>
|
||||
<Toggle
|
||||
checked={checked}
|
||||
onChange={handleChange}
|
||||
disabled={disabled}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
);
|
||||
};
|
|
@ -8,9 +8,9 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
|||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions';
|
||||
|
||||
import { CheckboxWithLabel } from './checkbox_with_label';
|
||||
import ClearColumnButton from './clear_column_button';
|
||||
import GrantPermissionButton from './grant_permission_button';
|
||||
import { PolicyControls } from './policy_controls';
|
||||
import SettingToggle from './setting_toggle';
|
||||
|
||||
class ColumnSettings extends PureComponent {
|
||||
|
@ -24,32 +24,14 @@ class ColumnSettings extends PureComponent {
|
|||
alertsEnabled: PropTypes.bool,
|
||||
browserSupport: PropTypes.bool,
|
||||
browserPermission: PropTypes.string,
|
||||
notificationPolicy: PropTypes.object.isRequired,
|
||||
onChangePolicy: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
onPushChange = (path, checked) => {
|
||||
this.props.onChange(['push', ...path], checked);
|
||||
};
|
||||
|
||||
handleFilterNotFollowing = checked => {
|
||||
this.props.onChangePolicy('filter_not_following', checked);
|
||||
};
|
||||
|
||||
handleFilterNotFollowers = checked => {
|
||||
this.props.onChangePolicy('filter_not_followers', checked);
|
||||
};
|
||||
|
||||
handleFilterNewAccounts = checked => {
|
||||
this.props.onChangePolicy('filter_new_accounts', checked);
|
||||
};
|
||||
|
||||
handleFilterPrivateMentions = checked => {
|
||||
this.props.onChangePolicy('filter_private_mentions', checked);
|
||||
};
|
||||
|
||||
render () {
|
||||
const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission, notificationPolicy } = this.props;
|
||||
const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props;
|
||||
|
||||
const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
|
||||
const unreadMarkersShowStr = <FormattedMessage id='notifications.column_settings.unread_notifications.highlight' defaultMessage='Highlight unread notifications' />;
|
||||
|
@ -79,31 +61,7 @@ class ColumnSettings extends PureComponent {
|
|||
</section>
|
||||
)}
|
||||
|
||||
<section>
|
||||
<h3><FormattedMessage id='notifications.policy.title' defaultMessage='Filter out notifications from…' /></h3>
|
||||
|
||||
<div className='column-settings__row'>
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_not_following} onChange={this.handleFilterNotFollowing}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_not_following_title' defaultMessage="People you don't follow" /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_not_following_hint' defaultMessage='Until you manually approve them' /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_not_followers} onChange={this.handleFilterNotFollowers}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_not_followers_title' defaultMessage='People not following you' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_not_followers_hint' defaultMessage='Including people who have been following you fewer than {days, plural, one {one day} other {# days}}' values={{ days: 3 }} /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_new_accounts} onChange={this.handleFilterNewAccounts}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_new_accounts_title' defaultMessage='New accounts' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_new_accounts.hint' defaultMessage='Created within the past {days, plural, one {one day} other {# days}}' values={{ days: 30 }} /></span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel checked={notificationPolicy.filter_private_mentions} onChange={this.handleFilterPrivateMentions}>
|
||||
<strong><FormattedMessage id='notifications.policy.filter_private_mentions_title' defaultMessage='Unsolicited private mentions' /></strong>
|
||||
<span className='hint'><FormattedMessage id='notifications.policy.filter_private_mentions_hint' defaultMessage="Filtered unless it's in reply to your own mention or if you follow the sender" /></span>
|
||||
</CheckboxWithLabel>
|
||||
</div>
|
||||
</section>
|
||||
<PolicyControls />
|
||||
|
||||
<section role='group' aria-labelledby='notifications-beta'>
|
||||
<h3 id='notifications-beta'>
|
||||
|
|
|
@ -1,18 +1,62 @@
|
|||
import { useEffect } from 'react';
|
||||
import { useCallback, useEffect } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link, useHistory } from 'react-router-dom';
|
||||
|
||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||
import { fetchNotificationPolicy } from 'mastodon/actions/notification_policies';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { selectSettingsNotificationsMinimizeFilteredBanner } from 'mastodon/selectors/settings';
|
||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||
import { toCappedNumber } from 'mastodon/utils/numbers';
|
||||
|
||||
const messages = defineMessages({
|
||||
filteredNotifications: {
|
||||
id: 'notification_requests.title',
|
||||
defaultMessage: 'Filtered notifications',
|
||||
},
|
||||
});
|
||||
|
||||
export const FilteredNotificationsIconButton: React.FC<{
|
||||
className?: string;
|
||||
}> = ({ className }) => {
|
||||
const intl = useIntl();
|
||||
const history = useHistory();
|
||||
const policy = useAppSelector((state) => state.notificationPolicy);
|
||||
const minimizeSetting = useAppSelector(
|
||||
selectSettingsNotificationsMinimizeFilteredBanner,
|
||||
);
|
||||
|
||||
const handleClick = useCallback(() => {
|
||||
history.push('/notifications/requests');
|
||||
}, [history]);
|
||||
|
||||
if (policy === null || policy.summary.pending_notifications_count === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!minimizeSetting) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.filteredNotifications)}
|
||||
title={intl.formatMessage(messages.filteredNotifications)}
|
||||
onClick={handleClick}
|
||||
className={className}
|
||||
>
|
||||
<Icon id='filtered-notifications' icon={InventoryIcon} />
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
export const FilteredNotificationsBanner: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
const policy = useAppSelector((state) => state.notificationPolicy);
|
||||
const minimizeSetting = useAppSelector(
|
||||
selectSettingsNotificationsMinimizeFilteredBanner,
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
void dispatch(fetchNotificationPolicy());
|
||||
|
@ -30,6 +74,10 @@ export const FilteredNotificationsBanner: React.FC = () => {
|
|||
return null;
|
||||
}
|
||||
|
||||
if (minimizeSetting) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Link
|
||||
className='filtered-notifications-banner'
|
||||
|
@ -54,10 +102,6 @@ export const FilteredNotificationsBanner: React.FC = () => {
|
|||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className='filtered-notifications-banner__badge'>
|
||||
{toCappedNumber(policy.summary.pending_notifications_count)}
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -38,12 +38,11 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => {
|
|||
return (
|
||||
<div className='notification-request'>
|
||||
<Link to={`/notifications/requests/${id}`} className='notification-request__link'>
|
||||
<Avatar account={account} size={36} />
|
||||
<Avatar account={account} size={40} counter={toCappedNumber(notificationsCount)} />
|
||||
|
||||
<div className='notification-request__name'>
|
||||
<div className='notification-request__name__display-name'>
|
||||
<bdi><strong dangerouslySetInnerHTML={{ __html: account?.get('display_name_html') }} /></bdi>
|
||||
<span className='filtered-notifications-banner__badge'>{toCappedNumber(notificationsCount)}</span>
|
||||
</div>
|
||||
|
||||
<span>@{account?.get('acct')}</span>
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
import { useCallback } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import { updateNotificationsPolicy } from 'mastodon/actions/notification_policies';
|
||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||
|
||||
import { CheckboxWithLabel } from './checkbox_with_label';
|
||||
|
||||
export const PolicyControls: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const notificationPolicy = useAppSelector(
|
||||
(state) => state.notificationPolicy,
|
||||
);
|
||||
|
||||
const handleFilterNotFollowing = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_not_following: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterNotFollowers = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_not_followers: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterNewAccounts = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_new_accounts: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
const handleFilterPrivateMentions = useCallback(
|
||||
(checked: boolean) => {
|
||||
void dispatch(
|
||||
updateNotificationsPolicy({ filter_private_mentions: checked }),
|
||||
);
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
if (!notificationPolicy) return null;
|
||||
|
||||
return (
|
||||
<section>
|
||||
<h3>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.title'
|
||||
defaultMessage='Filter out notifications from…'
|
||||
/>
|
||||
</h3>
|
||||
|
||||
<div className='column-settings__row'>
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_not_following}
|
||||
onChange={handleFilterNotFollowing}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_following_title'
|
||||
defaultMessage="People you don't follow"
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_following_hint'
|
||||
defaultMessage='Until you manually approve them'
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_not_followers}
|
||||
onChange={handleFilterNotFollowers}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_followers_title'
|
||||
defaultMessage='People not following you'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_not_followers_hint'
|
||||
defaultMessage='Including people who have been following you fewer than {days, plural, one {one day} other {# days}}'
|
||||
values={{ days: 3 }}
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_new_accounts}
|
||||
onChange={handleFilterNewAccounts}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_new_accounts_title'
|
||||
defaultMessage='New accounts'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_new_accounts.hint'
|
||||
defaultMessage='Created within the past {days, plural, one {one day} other {# days}}'
|
||||
values={{ days: 30 }}
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
|
||||
<CheckboxWithLabel
|
||||
checked={notificationPolicy.filter_private_mentions}
|
||||
onChange={handleFilterPrivateMentions}
|
||||
>
|
||||
<strong>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_private_mentions_title'
|
||||
defaultMessage='Unsolicited private mentions'
|
||||
/>
|
||||
</strong>
|
||||
<span className='hint'>
|
||||
<FormattedMessage
|
||||
id='notifications.policy.filter_private_mentions_hint'
|
||||
defaultMessage="Filtered unless it's in reply to your own mention or if you follow the sender"
|
||||
/>
|
||||
</span>
|
||||
</CheckboxWithLabel>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
|
@ -6,7 +6,6 @@ import { openModal } from 'mastodon/actions/modal';
|
|||
import { initializeNotifications } from 'mastodon/actions/notifications_migration';
|
||||
|
||||
import { showAlert } from '../../../actions/alerts';
|
||||
import { updateNotificationsPolicy } from '../../../actions/notification_policies';
|
||||
import { setFilter, requestBrowserPermission } from '../../../actions/notifications';
|
||||
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
|
||||
import { changeSetting } from '../../../actions/settings';
|
||||
|
@ -25,7 +24,6 @@ const mapStateToProps = state => ({
|
|||
alertsEnabled: state.getIn(['settings', 'notifications', 'alerts']).includes(true),
|
||||
browserSupport: state.getIn(['notifications', 'browserSupport']),
|
||||
browserPermission: state.getIn(['notifications', 'browserPermission']),
|
||||
notificationPolicy: state.notificationPolicy,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
|
@ -74,12 +72,6 @@ const mapDispatchToProps = (dispatch) => ({
|
|||
dispatch(requestBrowserPermission());
|
||||
},
|
||||
|
||||
onChangePolicy (param, checked) {
|
||||
dispatch(updateNotificationsPolicy({
|
||||
[param]: checked,
|
||||
}));
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));
|
||||
|
|
|
@ -34,7 +34,10 @@ import ColumnHeader from '../../components/column_header';
|
|||
import { LoadGap } from '../../components/load_gap';
|
||||
import ScrollableList from '../../components/scrollable_list';
|
||||
|
||||
import { FilteredNotificationsBanner } from './components/filtered_notifications_banner';
|
||||
import {
|
||||
FilteredNotificationsBanner,
|
||||
FilteredNotificationsIconButton,
|
||||
} from './components/filtered_notifications_banner';
|
||||
import NotificationsPermissionBanner from './components/notifications_permission_banner';
|
||||
import ColumnSettingsContainer from './containers/column_settings_container';
|
||||
import FilterBarContainer from './containers/filter_bar_container';
|
||||
|
@ -255,20 +258,21 @@ class Notifications extends PureComponent {
|
|||
scrollContainer = <NotSignedInIndicator />;
|
||||
}
|
||||
|
||||
let extraButton = null;
|
||||
|
||||
if (canMarkAsRead) {
|
||||
extraButton = (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={this.handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
const extraButton = (
|
||||
<>
|
||||
<FilteredNotificationsIconButton className='column-header__button' />
|
||||
{canMarkAsRead && (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={this.handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>
|
||||
|
|
|
@ -9,16 +9,52 @@ import { useSelector, useDispatch } from 'react-redux';
|
|||
|
||||
import InventoryIcon from '@/material-icons/400-24px/inventory_2.svg?react';
|
||||
import { fetchNotificationRequests, expandNotificationRequests } from 'mastodon/actions/notifications';
|
||||
import { changeSetting } from 'mastodon/actions/settings';
|
||||
import Column from 'mastodon/components/column';
|
||||
import ColumnHeader from 'mastodon/components/column_header';
|
||||
import ScrollableList from 'mastodon/components/scrollable_list';
|
||||
|
||||
import { NotificationRequest } from './components/notification_request';
|
||||
import { PolicyControls } from './components/policy_controls';
|
||||
import SettingToggle from './components/setting_toggle';
|
||||
|
||||
const messages = defineMessages({
|
||||
title: { id: 'notification_requests.title', defaultMessage: 'Filtered notifications' },
|
||||
maximize: { id: 'notification_requests.maximize', defaultMessage: 'Maximize' }
|
||||
});
|
||||
|
||||
const ColumnSettings = () => {
|
||||
const dispatch = useDispatch();
|
||||
const settings = useSelector((state) => state.settings.get('notifications'));
|
||||
|
||||
const onChange = useCallback(
|
||||
(key, checked) => {
|
||||
dispatch(changeSetting(['notifications', ...key], checked));
|
||||
},
|
||||
[dispatch],
|
||||
);
|
||||
|
||||
return (
|
||||
<div className='column-settings'>
|
||||
<section>
|
||||
<div className='column-settings__row'>
|
||||
<SettingToggle
|
||||
prefix='notifications'
|
||||
settings={settings}
|
||||
settingPath={['minimizeFilteredBanner']}
|
||||
onChange={onChange}
|
||||
label={
|
||||
<FormattedMessage id='notification_requests.minimize_banner' defaultMessage='Minimize filtred notifications banner' />
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<PolicyControls />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const NotificationRequests = ({ multiColumn }) => {
|
||||
const columnRef = useRef();
|
||||
const intl = useIntl();
|
||||
|
@ -48,7 +84,9 @@ export const NotificationRequests = ({ multiColumn }) => {
|
|||
onClick={handleHeaderClick}
|
||||
multiColumn={multiColumn}
|
||||
showBackButton
|
||||
/>
|
||||
>
|
||||
<ColumnSettings />
|
||||
</ColumnHeader>
|
||||
|
||||
<ScrollableList
|
||||
scrollKey='notification_requests'
|
||||
|
|
|
@ -43,7 +43,10 @@ import Column from '../../components/column';
|
|||
import { ColumnHeader } from '../../components/column_header';
|
||||
import { LoadGap } from '../../components/load_gap';
|
||||
import ScrollableList from '../../components/scrollable_list';
|
||||
import { FilteredNotificationsBanner } from '../notifications/components/filtered_notifications_banner';
|
||||
import {
|
||||
FilteredNotificationsBanner,
|
||||
FilteredNotificationsIconButton,
|
||||
} from '../notifications/components/filtered_notifications_banner';
|
||||
import NotificationsPermissionBanner from '../notifications/components/notifications_permission_banner';
|
||||
import ColumnSettingsContainer from '../notifications/containers/column_settings_container';
|
||||
|
||||
|
@ -306,16 +309,21 @@ export const Notifications: React.FC<{
|
|||
<NotSignedInIndicator />
|
||||
);
|
||||
|
||||
const extraButton = canMarkAsRead ? (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
) : null;
|
||||
const extraButton = (
|
||||
<>
|
||||
<FilteredNotificationsIconButton className='column-header__button' />
|
||||
{canMarkAsRead && (
|
||||
<button
|
||||
aria-label={intl.formatMessage(messages.markAsRead)}
|
||||
title={intl.formatMessage(messages.markAsRead)}
|
||||
onClick={handleMarkAsRead}
|
||||
className='column-header__button'
|
||||
>
|
||||
<Icon id='done-all' icon={DoneAllIcon} />
|
||||
</button>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column
|
||||
|
|
|
@ -291,8 +291,6 @@
|
|||
"filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة",
|
||||
"filter_modal.select_filter.title": "تصفية هذا المنشور",
|
||||
"filter_modal.title.status": "تصفية منشور",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {إشارة} two {إشارتين} few {# إشارات} other {# إشارة}}",
|
||||
"filtered_notifications_banner.pending_requests": "إشعارات من {count, plural, zero {}=0 {لا أحد} one {شخص واحد قد تعرفه} two {شخصين قد تعرفهما} few {# أشخاص قد تعرفهم} many {# شخص قد تعرفهم} other {# شخص قد تعرفهم}}",
|
||||
"filtered_notifications_banner.title": "الإشعارات المصفاة",
|
||||
"firehose.all": "الكل",
|
||||
"firehose.local": "هذا الخادم",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Скарыстайцеся існуючай катэгорыяй або стварыце новую",
|
||||
"filter_modal.select_filter.title": "Фільтраваць гэты допіс",
|
||||
"filter_modal.title.status": "Фільтраваць допіс",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {згадванне} few {згадванні} many {згадванняў} other {згадвання}}",
|
||||
"filtered_notifications_banner.pending_requests": "Апавяшчэнні ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце",
|
||||
"filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні",
|
||||
"firehose.all": "Усе",
|
||||
"firehose.local": "Гэты сервер",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Изберете съществуваща категория или създайте нова",
|
||||
"filter_modal.select_filter.title": "Филтриране на публ.",
|
||||
"filter_modal.title.status": "Филтриране на публ.",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {споменаване} other {споменавания}}",
|
||||
"filtered_notifications_banner.pending_requests": "Известията от {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}",
|
||||
"filtered_notifications_banner.pending_requests": "От {count, plural, =0 {никого, когото може да познавате} one {едно лице, което може да познавате} other {# души, които може да познавате}}",
|
||||
"filtered_notifications_banner.title": "Филтрирани известия",
|
||||
"firehose.all": "Всичко",
|
||||
"firehose.local": "Този сървър",
|
||||
|
|
|
@ -252,7 +252,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez",
|
||||
"filter_modal.select_filter.title": "Silañ an toud-mañ",
|
||||
"filter_modal.title.status": "Silañ un toud",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {meneg} two {veneg} few {meneg} other {a venegoù}}",
|
||||
"firehose.all": "Pep tra",
|
||||
"firehose.local": "Ar servijer-mañ",
|
||||
"firehose.remote": "Servijerioù all",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
|
||||
"filter_modal.select_filter.title": "Filtra aquest tut",
|
||||
"filter_modal.title.status": "Filtra un tut",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menció} other {mencions}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {De ningú} one {D'una persona} other {De # persones}} que potser coneixes",
|
||||
"filtered_notifications_banner.title": "Notificacions filtrades",
|
||||
"firehose.all": "Tots",
|
||||
"firehose.local": "Aquest servidor",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii",
|
||||
"filter_modal.select_filter.title": "Filtrovat tento příspěvek",
|
||||
"filter_modal.title.status": "Filtrovat příspěvek",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {zmínka} few {zmínky} many {zmínek} other {zmínek}}",
|
||||
"filtered_notifications_banner.pending_requests": "Oznámení od {count, plural, =0 {nikoho} one {jednoho člověka, kterého znáte} few {# lidí, které znáte} many {# lidí, které znáte} other {# lidí, které znáte}}",
|
||||
"filtered_notifications_banner.title": "Filtrovaná oznámení",
|
||||
"firehose.all": "Vše",
|
||||
"firehose.local": "Tento server",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd",
|
||||
"filter_modal.select_filter.title": "Hidlo'r postiad hwn",
|
||||
"filter_modal.title.status": "Hidlo postiad",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}",
|
||||
"filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw",
|
||||
"filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo",
|
||||
"firehose.all": "Popeth",
|
||||
"firehose.local": "Gweinydd hwn",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny",
|
||||
"filter_modal.select_filter.title": "Filtrér dette indlæg",
|
||||
"filter_modal.title.status": "Filtrér et indlæg",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender",
|
||||
"filtered_notifications_banner.pending_requests": "Fra {count, plural, =0 {ingen} one {én person} other {# personer}}, man måske kender",
|
||||
"filtered_notifications_banner.title": "Filtrerede notifikationer",
|
||||
"firehose.all": "Alle",
|
||||
"firehose.local": "Denne server",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen",
|
||||
"filter_modal.select_filter.title": "Diesen Beitrag filtern",
|
||||
"filter_modal.title.status": "Beitrag per Filter ausblenden",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {Erwähnung} other {Erwähnungen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}",
|
||||
"filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem, den} one {einer Person, die} other {# Personen, die}} du möglicherweise kennst",
|
||||
"filtered_notifications_banner.title": "Gefilterte Benachrichtigungen",
|
||||
"firehose.all": "Alles",
|
||||
"firehose.local": "Dieser Server",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
|
||||
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
|
||||
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {επισήμανση} other {επισημάνσεις}}",
|
||||
"filtered_notifications_banner.pending_requests": "Ειδοποιήσεις από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις",
|
||||
"filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις",
|
||||
"firehose.all": "Όλα",
|
||||
"firehose.local": "Αυτός ο διακομιστής",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Use an existing category or create a new one",
|
||||
"filter_modal.select_filter.title": "Filter this post",
|
||||
"filter_modal.title.status": "Filter a post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know",
|
||||
"filtered_notifications_banner.title": "Filtered notifications",
|
||||
"firehose.all": "All",
|
||||
"firehose.local": "This server",
|
||||
|
|
|
@ -505,6 +505,8 @@
|
|||
"notification.update": "{name} edited a post",
|
||||
"notification_requests.accept": "Accept",
|
||||
"notification_requests.dismiss": "Dismiss",
|
||||
"notification_requests.maximize": "Maximize",
|
||||
"notification_requests.minimize_banner": "Minimize filtred notifications banner",
|
||||
"notification_requests.notifications_from": "Notifications from {name}",
|
||||
"notification_requests.title": "Filtered notifications",
|
||||
"notifications.clear": "Clear notifications",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva",
|
||||
"filter_modal.select_filter.title": "Filtrar este mensaje",
|
||||
"filter_modal.title.status": "Filtrar un mensaje",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
|
||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
|
||||
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
||||
"firehose.all": "Todos",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
||||
"filter_modal.title.status": "Filtrar una publicación",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
|
||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas",
|
||||
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
||||
"firehose.all": "Todas",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
||||
"filter_modal.title.status": "Filtrar una publicación",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
|
||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {nadie} one {una persona} other {# personas}} que puede que conozcas",
|
||||
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
||||
"firehose.all": "Todas",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -290,8 +290,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Kasuta olemasolevat kategooriat või loo uus",
|
||||
"filter_modal.select_filter.title": "Filtreeri seda postitust",
|
||||
"filter_modal.title.status": "Postituse filtreerimine",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mainimine} other {mainimist}}",
|
||||
"filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada",
|
||||
"filtered_notifications_banner.title": "Filtreeritud teavitused",
|
||||
"firehose.all": "Kõik",
|
||||
"firehose.local": "See server",
|
||||
|
|
|
@ -294,8 +294,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria",
|
||||
"filter_modal.select_filter.title": "Iragazi bidalketa hau",
|
||||
"filter_modal.title.status": "Iragazi bidalketa bat",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {aipamen} other {aipamen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak",
|
||||
"filtered_notifications_banner.title": "Iragazitako jakinarazpenak",
|
||||
"firehose.all": "Guztiak",
|
||||
"firehose.local": "Zerbitzari hau",
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"account.block_domain": "Estä verkkotunnus {domain}",
|
||||
"account.block_short": "Estä",
|
||||
"account.blocked": "Estetty",
|
||||
"account.browse_more_on_origin_server": "Selaile kattavampaa alkuperäprofiilia",
|
||||
"account.browse_more_on_origin_server": "Selaa lisää alkuperäisessä profiilissa",
|
||||
"account.cancel_follow_request": "Peruuta seurantapyyntö",
|
||||
"account.copy": "Kopioi linkki profiiliin",
|
||||
"account.direct": "Mainitse @{name} yksityisesti",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"account.endorse": "Suosittele profiilissasi",
|
||||
"account.featured_tags.last_status_at": "Viimeisin julkaisu {date}",
|
||||
"account.featured_tags.last_status_never": "Ei julkaisuja",
|
||||
"account.featured_tags.title": "Käyttäjän {name} esillä pidettävät aihetunnisteet",
|
||||
"account.featured_tags.title": "Käyttäjän {name} esille nostamat aihetunnisteet",
|
||||
"account.follow": "Seuraa",
|
||||
"account.follow_back": "Seuraa takaisin",
|
||||
"account.followers": "Seuraajat",
|
||||
|
@ -68,14 +68,14 @@
|
|||
"account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto",
|
||||
"account.unblock_short": "Kumoa esto",
|
||||
"account.unendorse": "Kumoa suosittelu profiilissasi",
|
||||
"account.unfollow": "Lopeta seuraaminen",
|
||||
"account.unfollow": "Älä seuraa",
|
||||
"account.unmute": "Poista käyttäjän @{name} mykistys",
|
||||
"account.unmute_notifications_short": "Poista ilmoitusten mykistys",
|
||||
"account.unmute_short": "Poista mykistys",
|
||||
"account_note.placeholder": "Lisää muistiinpano napsauttamalla",
|
||||
"admin.dashboard.daily_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen päivittäin",
|
||||
"admin.dashboard.monthly_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen kuukausittain",
|
||||
"admin.dashboard.retention.average": "Keskiarvo",
|
||||
"admin.dashboard.daily_retention": "Käyttäjien pysyvyys päivittäin rekisteröitymisen jälkeen",
|
||||
"admin.dashboard.monthly_retention": "Käyttäjien pysyvyys kuukausittain rekisteröitymisen jälkeen",
|
||||
"admin.dashboard.retention.average": "Keskimäärin",
|
||||
"admin.dashboard.retention.cohort": "Rekisteröitymis-kk.",
|
||||
"admin.dashboard.retention.cohort_size": "Uusia käyttäjiä",
|
||||
"admin.impact_report.instance_accounts": "Tilien profiilit, jotka tämä poistaisi",
|
||||
|
@ -200,7 +200,7 @@
|
|||
"copy_icon_button.copied": "Sisältö kopioitiin leikepöydälle",
|
||||
"copypaste.copied": "Kopioitu",
|
||||
"copypaste.copy_to_clipboard": "Kopioi leikepöydälle",
|
||||
"directory.federated": "Koko tunnettu fediversumi",
|
||||
"directory.federated": "Tunnetusta fediversumista",
|
||||
"directory.local": "Vain palvelimelta {domain}",
|
||||
"directory.new_arrivals": "Äskettäin saapuneet",
|
||||
"directory.recently_active": "Hiljattain aktiiviset",
|
||||
|
@ -211,10 +211,10 @@
|
|||
"dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat korkeammalle sijalle.",
|
||||
"dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat korkeammalle sijalle.",
|
||||
"dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat korkeammalle sijalle.",
|
||||
"dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.",
|
||||
"dismissable_banner.public_timeline": "Nämä ovat tuoreimpia julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.",
|
||||
"domain_block_modal.block": "Estä palvelin",
|
||||
"domain_block_modal.block_account_instead": "Estä sen sijaan @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Ihmiset tältä palvelimelta eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Tämän palvelimen käyttäjät eivät voi olla vuorovaikutuksessa vanhojen julkaisujesi kanssa.",
|
||||
"domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.",
|
||||
"domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.",
|
||||
"domain_block_modal.title": "Estetäänkö verkkotunnus?",
|
||||
|
@ -228,8 +228,8 @@
|
|||
"domain_pill.their_username": "Hänen yksilöllinen tunnisteensa omalla palvelimellaan. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.",
|
||||
"domain_pill.username": "Käyttäjänimi",
|
||||
"domain_pill.whats_in_a_handle": "Mitä käyttäjätunnuksessa on?",
|
||||
"domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa läpi sosiaalisen verkon, joka koostuu <button>ActivityPub-pohjaisista alustoista</button>.",
|
||||
"domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi läpi sosiaalisen verkon, joka koostuu <button>ActivityPub-pohjaisista alustoista</button>.",
|
||||
"domain_pill.who_they_are": "Koska käyttäjätunnukset kertovat, kuka ja missä joku on, voit olla vuorovaikutuksessa ihmisten kanssa kaikkialla sosiaalisessa verkossa, joka koostuu <button>ActivityPub-pohjaisista alustoista</button>.",
|
||||
"domain_pill.who_you_are": "Koska käyttäjätunnuksesi kertoo, kuka ja missä olet, ihmiset voivat olla vaikutuksessa kanssasi kaikkialla sosiaalisessa verkossa, joka koostuu <button>ActivityPub-pohjaisista alustoista</button>.",
|
||||
"domain_pill.your_handle": "Käyttäjätunnuksesi:",
|
||||
"domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.",
|
||||
"domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.",
|
||||
|
@ -265,12 +265,12 @@
|
|||
"empty_column.follow_requests": "Et ole vielä vastaanottanut seurantapyyntöjä. Saamasi pyynnöt näkyvät täällä.",
|
||||
"empty_column.followed_tags": "Et seuraa vielä yhtäkään aihetunnistetta. Kun alat seurata, ne tulevat tähän näkyviin.",
|
||||
"empty_column.hashtag": "Tällä aihetunnisteella ei löydy vielä sisältöä.",
|
||||
"empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia henkilöjä, niin näet enemmän sisältöä.",
|
||||
"empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia käyttäjiä, niin näet enemmän sisältöä.",
|
||||
"empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.",
|
||||
"empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.",
|
||||
"empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
|
||||
"empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.",
|
||||
"empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.",
|
||||
"empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun muut ovat vuorovaikutuksessa kanssasi, näet sen täällä.",
|
||||
"empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti tai seuraa muiden palvelinten käyttäjiä, niin saat sisältöä",
|
||||
"error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.",
|
||||
"error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.",
|
||||
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi",
|
||||
"filter_modal.select_filter.title": "Suodata tämä julkaisu",
|
||||
"filter_modal.title.status": "Suodata julkaisu",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}",
|
||||
"filtered_notifications_banner.pending_requests": "Ilmoituksia {count, plural, =0 {ei ole} one {1 henkilöltä} other {# henkilöltä}}, jonka saatat tuntea",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {Ei keneltäkään, jonka} one {1 käyttäjältä, jonka} other {# käyttäjältä, jotka}} saatat tuntea",
|
||||
"filtered_notifications_banner.title": "Suodatetut ilmoitukset",
|
||||
"firehose.all": "Kaikki",
|
||||
"firehose.local": "Tämä palvelin",
|
||||
|
@ -312,9 +311,9 @@
|
|||
"follow_suggestions.curated_suggestion": "Ehdotus ylläpidolta",
|
||||
"follow_suggestions.dismiss": "Älä näytä uudelleen",
|
||||
"follow_suggestions.featured_longer": "Palvelimen {domain} tiimin poimintoja",
|
||||
"follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi ihmisten keskuudessa",
|
||||
"follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi käyttäjien joukossa",
|
||||
"follow_suggestions.hints.featured": "Tämän profiilin on valinnut palvelimen {domain} tiimi.",
|
||||
"follow_suggestions.hints.friends_of_friends": "Seuraamasi käyttäjät suosivat tätä profiilia.",
|
||||
"follow_suggestions.hints.friends_of_friends": "Tämä profiili on suosittu seuraamiesi käyttäjien joukossa.",
|
||||
"follow_suggestions.hints.most_followed": "Tämä profiili on palvelimen {domain} seuratuimpia.",
|
||||
"follow_suggestions.hints.most_interactions": "Tämä profiili on viime aikoina saanut paljon huomiota palvelimella {domain}.",
|
||||
"follow_suggestions.hints.similar_to_recently_followed": "Tämä profiili on samankaltainen kuin profiilit, joita olet viimeksi seurannut.",
|
||||
|
@ -367,7 +366,7 @@
|
|||
"interaction_modal.on_another_server": "Toisella palvelimella",
|
||||
"interaction_modal.on_this_server": "Tällä palvelimella",
|
||||
"interaction_modal.sign_in": "Et ole kirjautunut tälle palvelimelle. Millä palvelimella tilisi sijaitsee?",
|
||||
"interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista palvelintasi, etsi tervetulosähköposti saapuneista viesteistäsi. Voit myös syöttää koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)",
|
||||
"interaction_modal.sign_in_hint": "Vihje: Se on sama verkkosivusto, jolle rekisteröidyit. Jos et muista palvelintasi, etsi tervetulosähköposti saapuneista viesteistäsi. Voit syöttää myös koko käyttäjätunnuksesi! (Esimerkki: @Mastodon@Mastodon.social)",
|
||||
"interaction_modal.title.favourite": "Lisää käyttäjän {name} julkaisu suosikkeihin",
|
||||
"interaction_modal.title.follow": "Seuraa käyttäjää {name}",
|
||||
"interaction_modal.title.reblog": "Tehosta käyttäjän {name} julkaisua",
|
||||
|
@ -431,7 +430,7 @@
|
|||
"lists.replies_policy.list": "Listan jäsenille",
|
||||
"lists.replies_policy.none": "Ei kellekään",
|
||||
"lists.replies_policy.title": "Näytä vastaukset:",
|
||||
"lists.search": "Hae seuraamistasi henkilöistä",
|
||||
"lists.search": "Hae seuraamistasi käyttäjistä",
|
||||
"lists.subheading": "Omat listasi",
|
||||
"load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}",
|
||||
"loading_indicator.label": "Ladataan…",
|
||||
|
@ -501,7 +500,7 @@
|
|||
"notification.relationships_severance_event.account_suspension": "Palvelimen {from} ylläpitäjä on jäädyttänyt palvelimen {target} vuorovaikutuksen. Enää et voi siis vastaanottaa päivityksiä heiltä tai olla yhteyksissä heidän kanssaan.",
|
||||
"notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt palvelimen {target} vuorovaikutuksen – mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.",
|
||||
"notification.relationships_severance_event.learn_more": "Lue lisää",
|
||||
"notification.relationships_severance_event.user_domain_block": "Olet estänyt palvelimen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.",
|
||||
"notification.relationships_severance_event.user_domain_block": "Olet estänyt verkkotunnuksen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.",
|
||||
"notification.status": "{name} julkaisi juuri",
|
||||
"notification.update": "{name} muokkasi julkaisua",
|
||||
"notification_requests.accept": "Hyväksy",
|
||||
|
@ -534,10 +533,10 @@
|
|||
"notifications.filter.all": "Kaikki",
|
||||
"notifications.filter.boosts": "Tehostukset",
|
||||
"notifications.filter.favourites": "Suosikit",
|
||||
"notifications.filter.follows": "Seuraa",
|
||||
"notifications.filter.follows": "Seuraamiset",
|
||||
"notifications.filter.mentions": "Maininnat",
|
||||
"notifications.filter.polls": "Äänestyksen tulokset",
|
||||
"notifications.filter.statuses": "Päivitykset henkilöiltä, joita seuraat",
|
||||
"notifications.filter.statuses": "Päivitykset seuraamiltasi käyttäjiltä",
|
||||
"notifications.grant_permission": "Myönnä käyttöoikeus.",
|
||||
"notifications.group": "{count} ilmoitusta",
|
||||
"notifications.mark_as_read": "Merkitse jokainen ilmoitus luetuksi",
|
||||
|
@ -547,9 +546,9 @@
|
|||
"notifications.policy.filter_new_accounts.hint": "Luotu {days, plural, one {viime päivän} other {viimeisen # päivän}} aikana",
|
||||
"notifications.policy.filter_new_accounts_title": "Uudet tilit",
|
||||
"notifications.policy.filter_not_followers_hint": "Mukaan lukien alle {days, plural, one {päivän} other {# päivää}} sinua seuranneet",
|
||||
"notifications.policy.filter_not_followers_title": "Henkilöt, jotka eivät seuraa sinua",
|
||||
"notifications.policy.filter_not_followers_title": "Käyttäjät, jotka eivät seuraa sinua",
|
||||
"notifications.policy.filter_not_following_hint": "Kunnes hyväksyt heidät manuaalisesti",
|
||||
"notifications.policy.filter_not_following_title": "Henkilöt, joita et seuraa",
|
||||
"notifications.policy.filter_not_following_title": "Käyttäjät, joita et seuraa",
|
||||
"notifications.policy.filter_private_mentions_hint": "Suodatetaan, ellei se ole vastaus omaan mainintaasi tai ellet seuraa lähettäjää",
|
||||
"notifications.policy.filter_private_mentions_title": "Ei-toivotut yksityismaininnat",
|
||||
"notifications.policy.title": "Suodata ilmoitukset pois kohteesta…",
|
||||
|
@ -619,7 +618,7 @@
|
|||
"privacy.unlisted.short": "Vaivihkaisesti julkinen",
|
||||
"privacy_policy.last_updated": "Päivitetty viimeksi {date}",
|
||||
"privacy_policy.title": "Tietosuojakäytäntö",
|
||||
"recommended": "Suositeltu",
|
||||
"recommended": "Suositellaan",
|
||||
"refresh": "Päivitä",
|
||||
"regeneration_indicator.label": "Ladataan…",
|
||||
"regeneration_indicator.sublabel": "Kotisyötettäsi valmistellaan!",
|
||||
|
@ -790,10 +789,10 @@
|
|||
"time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä",
|
||||
"time_remaining.moments": "Hetkiä jäljellä",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä",
|
||||
"timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource}-tietoa ei näytetä täällä.",
|
||||
"timeline_hint.resources.followers": "Seuraajat",
|
||||
"timeline_hint.resources.follows": "seurattua",
|
||||
"timeline_hint.resources.statuses": "Vanhemmat julkaisut",
|
||||
"timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource} eivät näy tässä.",
|
||||
"timeline_hint.resources.followers": "seuraajat",
|
||||
"timeline_hint.resources.follows": "seuratut",
|
||||
"timeline_hint.resources.statuses": "vanhemmat julkaisut",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} henkilö} other {{counter} henkilöä}} {days, plural, one {viime päivänä} other {viimeisenä {days} päivänä}}",
|
||||
"trends.trending_now": "Suosittua nyt",
|
||||
"ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan",
|
||||
"filter_modal.select_filter.title": "Filtrera hendan postin",
|
||||
"filter_modal.title.status": "Filtrera ein post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {umrøða} other {umrøður}}",
|
||||
"filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir",
|
||||
"filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir",
|
||||
"filtered_notifications_banner.title": "Sáldaðar fráboðanir",
|
||||
"firehose.all": "Allar",
|
||||
"firehose.local": "Hesin ambætarin",
|
||||
|
|
|
@ -297,7 +297,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle",
|
||||
"filter_modal.select_filter.title": "Filtrer cette publication",
|
||||
"filter_modal.title.status": "Filtrer une publication",
|
||||
"filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre",
|
||||
"filtered_notifications_banner.title": "Notifications filtrées",
|
||||
"firehose.all": "Tout",
|
||||
"firehose.local": "Ce serveur",
|
||||
|
|
|
@ -297,7 +297,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Utilisez une catégorie existante ou en créer une nouvelle",
|
||||
"filter_modal.select_filter.title": "Filtrer ce message",
|
||||
"filter_modal.title.status": "Filtrer un message",
|
||||
"filtered_notifications_banner.pending_requests": "Notifications {count, plural, =0 {de personne} one {d’une personne} other {de # personnes}} que vous pouvez connaitre",
|
||||
"filtered_notifications_banner.title": "Notifications filtrées",
|
||||
"firehose.all": "Tout",
|
||||
"firehose.local": "Ce serveur",
|
||||
|
|
|
@ -290,8 +290,6 @@
|
|||
"filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje",
|
||||
"filter_modal.select_filter.title": "Dit berjocht filterje",
|
||||
"filter_modal.title.status": "In berjocht filterje",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {fermelding} other {fermeldingen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Meldingen fan {count, plural, =0 {net ien} one {ien persoan} other {# minsken}} dy’t jo miskien kenne",
|
||||
"filtered_notifications_banner.title": "Filtere meldingen",
|
||||
"firehose.all": "Alles",
|
||||
"firehose.local": "Dizze server",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Bain úsáid as catagóir reatha nó cruthaigh ceann nua",
|
||||
"filter_modal.select_filter.title": "Déan scagadh ar an bpostáil seo",
|
||||
"filter_modal.title.status": "Déan scagadh ar phostáil",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {tagairt} other {tagairtí}}",
|
||||
"filtered_notifications_banner.pending_requests": "Fógraí ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b'fhéidir go mbeadh a fhios agat",
|
||||
"filtered_notifications_banner.pending_requests": "Ó {count, plural, =0 {duine ar bith} one {duine amháin} two {# daoine} few {# daoine} many {# daoine} other {# daoine}} b’fhéidir go bhfuil aithne agat orthu",
|
||||
"filtered_notifications_banner.title": "Fógraí scagtha",
|
||||
"firehose.all": "Gach",
|
||||
"firehose.local": "An freastalaí seo",
|
||||
|
|
|
@ -35,7 +35,9 @@
|
|||
"account.follow_back": "Lean air ais",
|
||||
"account.followers": "Luchd-leantainn",
|
||||
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}",
|
||||
"account.following": "A’ leantainn",
|
||||
"account.following_counter": "{count, plural, one {Tha {counter} a’ leantainn} other {Tha {counter} a’ leantainn}}",
|
||||
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.",
|
||||
"account.go_to_profile": "Tadhail air a’ phròifil",
|
||||
"account.hide_reblogs": "Falaich na brosnachaidhean o @{name}",
|
||||
|
@ -61,6 +63,7 @@
|
|||
"account.requested_follow": "Dh’iarr {name} ’gad leantainn",
|
||||
"account.share": "Co-roinn a’ phròifil aig @{name}",
|
||||
"account.show_reblogs": "Seall na brosnachaidhean o @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
|
||||
"account.unblock": "Dì-bhac @{name}",
|
||||
"account.unblock_domain": "Dì-bhac an àrainn {domain}",
|
||||
"account.unblock_short": "Dì-bhac",
|
||||
|
@ -168,21 +171,28 @@
|
|||
"confirmations.block.confirm": "Bac",
|
||||
"confirmations.delete.confirm": "Sguab às",
|
||||
"confirmations.delete.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às?",
|
||||
"confirmations.delete.title": "A bheil thu airson am post a sguabadh às?",
|
||||
"confirmations.delete_list.confirm": "Sguab às",
|
||||
"confirmations.delete_list.message": "A bheil thu cinnteach gu bheil thu airson an liosta seo a sguabadh às gu buan?",
|
||||
"confirmations.delete_list.title": "A bheil thu airson an liosta a sguabadh às?",
|
||||
"confirmations.discard_edit_media.confirm": "Tilg air falbh",
|
||||
"confirmations.discard_edit_media.message": "Tha atharraichean gun sàbhaladh agad ann an tuairisgeul no ro-shealladh a’ mheadhain, a bheil thu airson an tilgeil air falbh co-dhiù?",
|
||||
"confirmations.edit.confirm": "Deasaich",
|
||||
"confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
|
||||
"confirmations.edit.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?",
|
||||
"confirmations.logout.confirm": "Clàraich a-mach",
|
||||
"confirmations.logout.message": "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?",
|
||||
"confirmations.logout.title": "A bheil thu airson clàradh a-mach?",
|
||||
"confirmations.mute.confirm": "Mùch",
|
||||
"confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr",
|
||||
"confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.",
|
||||
"confirmations.redraft.title": "A bheil thu airson am post a sguabadh às ⁊ dreachd ùr a dhèanamh dheth?",
|
||||
"confirmations.reply.confirm": "Freagair",
|
||||
"confirmations.reply.message": "Ma bheir thu freagairt an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
|
||||
"confirmations.reply.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?",
|
||||
"confirmations.unfollow.confirm": "Na lean tuilleadh",
|
||||
"confirmations.unfollow.message": "A bheil thu cinnteach nach eil thu airson {name} a leantainn tuilleadh?",
|
||||
"confirmations.unfollow.title": "A bheil thu airson sgur de leantainn a chleachdaiche?",
|
||||
"conversation.delete": "Sguab às an còmhradh",
|
||||
"conversation.mark_as_read": "Cuir comharra gun deach a leughadh",
|
||||
"conversation.open": "Seall an còmhradh",
|
||||
|
@ -290,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Cleachd roinn-seòrsa a tha ann no cruthaich tè ùr",
|
||||
"filter_modal.select_filter.title": "Criathraich am post seo",
|
||||
"filter_modal.title.status": "Criathraich post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {iomradh} two {iomradh} few {iomraidhean} other {iomradh}}",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil brath ann o dhaoine} one {Tha brathan ann o # neach} two {Tha brathan ann o # neach} few {Tha brathan ann o # daoine} other {Tha brathan ann o # duine}} air a bheil thu eòlach ’s dòcha",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {Chan eil gin ann} one {O # neach} two {O # neach} few {O # daoine} other {O # duine}} air a bheil thu eòlach ’s dòcha",
|
||||
"filtered_notifications_banner.title": "Brathan criathraichte",
|
||||
"firehose.all": "Na h-uile",
|
||||
"firehose.local": "Am frithealaiche seo",
|
||||
|
@ -301,6 +310,7 @@
|
|||
"follow_requests.unlocked_explanation": "Ged nach eil an cunntas agad glaiste, tha sgioba {domain} dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.",
|
||||
"follow_suggestions.curated_suggestion": "Roghainn an sgioba",
|
||||
"follow_suggestions.dismiss": "Na seall seo a-rithist",
|
||||
"follow_suggestions.featured_longer": "Chaidh a thaghadh a làmh leis an sgioba aig {domain}",
|
||||
"follow_suggestions.friends_of_friends_longer": "Fèill mhòr am measg nan daoine a leanas tu",
|
||||
"follow_suggestions.hints.featured": "Chaidh a’ phròifil seo a thaghadh le sgioba {domain} a làimh.",
|
||||
"follow_suggestions.hints.friends_of_friends": "Tha fèill mhòr air a’ phròifil seo am measg nan daoine a leanas tu.",
|
||||
|
@ -310,6 +320,7 @@
|
|||
"follow_suggestions.personalized_suggestion": "Moladh pearsanaichte",
|
||||
"follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr",
|
||||
"follow_suggestions.popular_suggestion_longer": "Fèill mhòr air {domain}",
|
||||
"follow_suggestions.similar_to_recently_followed_longer": "Tha e coltach ri pròifilean a lean thu o chionn goirid",
|
||||
"follow_suggestions.view_all": "Seall na h-uile",
|
||||
"follow_suggestions.who_to_follow": "Molaidhean leantainn",
|
||||
"followed_tags": "Tagaichean hais ’gan leantainn",
|
||||
|
@ -405,6 +416,8 @@
|
|||
"limited_account_hint.action": "Seall a’ phròifil co-dhiù",
|
||||
"limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.",
|
||||
"link_preview.author": "Le {name}",
|
||||
"link_preview.more_from_author": "Barrachd le {name}",
|
||||
"link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
|
||||
"lists.account.add": "Cuir ris an liosta",
|
||||
"lists.account.remove": "Thoir air falbh on liosta",
|
||||
"lists.delete": "Sguab às an liosta",
|
||||
|
@ -432,6 +445,8 @@
|
|||
"mute_modal.title": "A bheil thu airson an cleachdaiche a mhùchadh?",
|
||||
"mute_modal.you_wont_see_mentions": "Chan fhaic thu na postaichean a bheir iomradh orra.",
|
||||
"mute_modal.you_wont_see_posts": "Chì iad na postaichean agad fhathast ach chan fhaic thu na postaichean aca-san.",
|
||||
"name_and_others": "{name} ’s {count, plural, one {# eile} other {# eile}}",
|
||||
"name_and_others_with_link": "{name} ’s <a>{count, plural, one {# eile} other {# eile}}</a>",
|
||||
"navigation_bar.about": "Mu dhèidhinn",
|
||||
"navigation_bar.advanced_interface": "Fosgail san eadar-aghaidh-lìn adhartach",
|
||||
"navigation_bar.blocks": "Cleachdaichean bacte",
|
||||
|
@ -459,13 +474,27 @@
|
|||
"navigation_bar.security": "Tèarainteachd",
|
||||
"not_signed_in_indicator.not_signed_in": "Feumaidh tu clàradh a-steach mus fhaigh thu cothrom air a’ ghoireas seo.",
|
||||
"notification.admin.report": "Rinn {name} gearan mu {target}",
|
||||
"notification.admin.report_account": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target} air adhbhar {category}",
|
||||
"notification.admin.report_account_other": "Rinn {name} gearan mu {count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}} le {target}",
|
||||
"notification.admin.report_statuses": "Rinn {name} gearan mu {target} air adhbhar {category}",
|
||||
"notification.admin.report_statuses_other": "Rinn {name} gearan mu {target}",
|
||||
"notification.admin.sign_up": "Chlàraich {name}",
|
||||
"notification.favourite": "Is annsa le {name} am post agad",
|
||||
"notification.follow": "Tha {name} ’gad leantainn a-nis",
|
||||
"notification.follow_request": "Dh’iarr {name} ’gad leantainn",
|
||||
"notification.mention": "Thug {name} iomradh ort",
|
||||
"notification.moderation-warning.learn_more": "Barrachd fiosrachaidh",
|
||||
"notification.moderation_warning": "Fhuair thu rabhadh on mhaorsainneachd",
|
||||
"notification.moderation_warning.action_delete_statuses": "Chaidh cuid dhe na postaichean agad a thoirt air falbh.",
|
||||
"notification.moderation_warning.action_disable": "Chaidh an cunntas agad a chur à comas.",
|
||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Chaidh comharra a chur ri cuid dhe na postaichean agad gu bheil iad frionasach.",
|
||||
"notification.moderation_warning.action_none": "Fhuair an cunntas agad rabhadh on mhaorsainneachd.",
|
||||
"notification.moderation_warning.action_sensitive": "Thèid comharra na frionasachd a chur ris na postaichean agad o seo a-mach.",
|
||||
"notification.moderation_warning.action_silence": "Chaidh an cunntas agad a chuingeachadh.",
|
||||
"notification.moderation_warning.action_suspend": "Chaidh an cunntas agad a chur à rèim.",
|
||||
"notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch",
|
||||
"notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
|
||||
"notification.private_mention": "Thug {name} iomradh ort gu prìobhaideach",
|
||||
"notification.reblog": "Bhrosnaich {name} am post agad",
|
||||
"notification.relationships_severance_event": "Chaill thu dàimhean le {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Chuir rianaire aig {from} {target} à rèim agus is ciall dha sin nach fhaigh thu naidheachdan uapa ’s nach urrainn dhut conaltradh leotha.",
|
||||
|
@ -480,9 +509,12 @@
|
|||
"notification_requests.title": "Brathan criathraichte",
|
||||
"notifications.clear": "Falamhaich na brathan",
|
||||
"notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?",
|
||||
"notifications.clear_title": "A bheil thu airson na brathan fhalamhachadh?",
|
||||
"notifications.column_settings.admin.report": "Gearanan ùra:",
|
||||
"notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
|
||||
"notifications.column_settings.alert": "Brathan deasga",
|
||||
"notifications.column_settings.beta.category": "Gleusan deuchainneil",
|
||||
"notifications.column_settings.beta.grouping": "Buidhnich na brathan",
|
||||
"notifications.column_settings.favourite": "Annsachdan:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
|
||||
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
|
||||
|
@ -646,9 +678,13 @@
|
|||
"report.unfollow_explanation": "Tha thu a’ leantainn a’ chunntais seo. Sgur dhen leantainn ach nach fhaic thu na puist aca nad dhachaigh.",
|
||||
"report_notification.attached_statuses": "Tha {count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}} ceangailte ris",
|
||||
"report_notification.categories.legal": "Laghail",
|
||||
"report_notification.categories.legal_sentence": "susbaint mhì-laghail",
|
||||
"report_notification.categories.other": "Eile",
|
||||
"report_notification.categories.other_sentence": "eile",
|
||||
"report_notification.categories.spam": "Spama",
|
||||
"report_notification.categories.spam_sentence": "spama",
|
||||
"report_notification.categories.violation": "Briseadh riaghailte",
|
||||
"report_notification.categories.violation_sentence": "briseadh riaghailte",
|
||||
"report_notification.open": "Fosgail an gearan",
|
||||
"search.no_recent_searches": "Cha do rinn thu lorg o chionn goirid",
|
||||
"search.placeholder": "Lorg",
|
||||
|
@ -676,8 +712,11 @@
|
|||
"server_banner.about_active_users": "Daoine a chleachd am frithealaiche seo rè an 30 latha mu dheireadh (Cleachdaichean gnìomhach gach mìos)",
|
||||
"server_banner.active_users": "cleachdaichean gnìomhach",
|
||||
"server_banner.administered_by": "Rianachd le:",
|
||||
"server_banner.is_one_of_many": "Is {domain} fear de dh’iomadh frithealaiche Mastodon neo-eisimeileach as urrainn dhut cleachdadh airson pàirt a ghabhail sa cho-shaoghal.",
|
||||
"server_banner.server_stats": "Stadastaireachd an fhrithealaiche:",
|
||||
"sign_in_banner.create_account": "Cruthaich cunntas",
|
||||
"sign_in_banner.follow_anyone": "Lean duine sam bith air a’ cho-shaoghal agus faic a h-uile càil a-rèir an ama. Chan eil sgeul air algairimean, sanasachd no clickbait.",
|
||||
"sign_in_banner.mastodon_is": "Is Mastodon an dòigh as fheàrr airson sùil a chumail air na tha a’ dol.",
|
||||
"sign_in_banner.sign_in": "Clàraich a-steach",
|
||||
"sign_in_banner.sso_redirect": "Clàraich a-steach no clàraich leinn",
|
||||
"status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
||||
"filter_modal.title.status": "Filtrar unha publicación",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {mencións}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer",
|
||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que igual coñeces",
|
||||
"filtered_notifications_banner.title": "Notificacións filtradas",
|
||||
"firehose.all": "Todo",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה",
|
||||
"filter_modal.select_filter.title": "סינון ההודעה הזו",
|
||||
"filter_modal.title.status": "סנן הודעה",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {איזכור} other {איזכורים} two {איזכוריים}}",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין בקשות ממשתמשים }one {בקשה אחת ממישהו/מישהי }two {יש בקשותיים ממשתמשים }other {יש # בקשות ממשתמשים }}שאולי מוכרים לך",
|
||||
"filtered_notifications_banner.title": "התראות מסוננות",
|
||||
"firehose.all": "הכל",
|
||||
"firehose.local": "שרת זה",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat",
|
||||
"filter_modal.select_filter.title": "E bejegyzés szűrése",
|
||||
"filter_modal.title.status": "Egy bejegyzés szűrése",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {említés} other {említés}}",
|
||||
"filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {senkitől} one {egy valószínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}",
|
||||
"filtered_notifications_banner.title": "Szűrt értesítések",
|
||||
"firehose.all": "Összes",
|
||||
"firehose.local": "Ez a kiszolgáló",
|
||||
|
|
|
@ -298,8 +298,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Usa un categoria existente o crea un nove",
|
||||
"filter_modal.select_filter.title": "Filtrar iste message",
|
||||
"filter_modal.title.status": "Filtrar un message",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificationes ab {count, plural, =0 {nemo} one {un persona} other {# personas}} tu poterea cognoscer",
|
||||
"filtered_notifications_banner.title": "Notificationes filtrate",
|
||||
"firehose.all": "Toto",
|
||||
"firehose.local": "Iste servitor",
|
||||
|
|
|
@ -290,8 +290,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov",
|
||||
"filter_modal.select_filter.title": "Filtrar ti-ci posta",
|
||||
"filter_modal.title.status": "Filtrar un posta",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse",
|
||||
"filtered_notifications_banner.title": "Filtrat notificationes",
|
||||
"firehose.all": "Omno",
|
||||
"firehose.local": "Ti-ci servitor",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan",
|
||||
"filter_modal.select_filter.title": "Sía þessa færslu",
|
||||
"filter_modal.title.status": "Sía færslu",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {tilvísun} other {tilvísanir}}",
|
||||
"filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt",
|
||||
"filtered_notifications_banner.pending_requests": "Frá {count, plural, =0 {engum} one {einum aðila} other {# manns}} sem þú gætir þekkt",
|
||||
"filtered_notifications_banner.title": "Síaðar tilkynningar",
|
||||
"firehose.all": "Allt",
|
||||
"firehose.local": "þessum netþjóni",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova",
|
||||
"filter_modal.select_filter.title": "Filtra questo post",
|
||||
"filter_modal.title.status": "Filtra un post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menzione} other {menzioni}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere",
|
||||
"filtered_notifications_banner.pending_requests": "Da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere",
|
||||
"filtered_notifications_banner.title": "Notifiche filtrate",
|
||||
"firehose.all": "Tutto",
|
||||
"firehose.local": "Questo server",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "既存のカテゴリーを使用するか新規作成します",
|
||||
"filter_modal.select_filter.title": "この投稿をフィルターする",
|
||||
"filter_modal.title.status": "投稿をフィルターする",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}",
|
||||
"filtered_notifications_banner.title": "保留中の通知",
|
||||
"firehose.all": "すべて",
|
||||
"firehose.local": "このサーバー",
|
||||
|
|
|
@ -171,21 +171,28 @@
|
|||
"confirmations.block.confirm": "차단",
|
||||
"confirmations.delete.confirm": "삭제",
|
||||
"confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?",
|
||||
"confirmations.delete.title": "게시물을 삭제할까요?",
|
||||
"confirmations.delete_list.confirm": "삭제",
|
||||
"confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?",
|
||||
"confirmations.delete_list.title": "리스트를 삭제할까요?",
|
||||
"confirmations.discard_edit_media.confirm": "저장 안함",
|
||||
"confirmations.discard_edit_media.message": "미디어 설명이나 미리보기에 대한 저장하지 않은 변경사항이 있습니다. 버리시겠습니까?",
|
||||
"confirmations.edit.confirm": "수정",
|
||||
"confirmations.edit.message": "지금 편집하면 작성 중인 메시지를 덮어씁니다. 진행이 확실한가요?",
|
||||
"confirmations.edit.title": "게시물을 덮어쓸까요?",
|
||||
"confirmations.logout.confirm": "로그아웃",
|
||||
"confirmations.logout.message": "정말로 로그아웃 하시겠습니까?",
|
||||
"confirmations.logout.title": "로그아웃 할까요?",
|
||||
"confirmations.mute.confirm": "뮤트",
|
||||
"confirmations.redraft.confirm": "삭제하고 다시 쓰기",
|
||||
"confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
|
||||
"confirmations.redraft.title": "삭제하고 다시 작성할까요?",
|
||||
"confirmations.reply.confirm": "답글",
|
||||
"confirmations.reply.message": "지금 답장하면 작성 중인 메시지를 덮어쓰게 됩니다. 정말 진행합니까?",
|
||||
"confirmations.reply.title": "게시물을 덮어쓸까요?",
|
||||
"confirmations.unfollow.confirm": "팔로우 해제",
|
||||
"confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?",
|
||||
"confirmations.unfollow.title": "사용자를 언팔로우 할까요?",
|
||||
"conversation.delete": "대화 삭제",
|
||||
"conversation.mark_as_read": "읽은 상태로 표시",
|
||||
"conversation.open": "대화 보기",
|
||||
|
@ -293,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다",
|
||||
"filter_modal.select_filter.title": "이 게시물을 필터",
|
||||
"filter_modal.title.status": "게시물 필터",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {멘션}}",
|
||||
"filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림",
|
||||
"filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터",
|
||||
"filtered_notifications_banner.title": "걸러진 알림",
|
||||
"firehose.all": "모두",
|
||||
"firehose.local": "이 서버",
|
||||
|
@ -439,6 +445,8 @@
|
|||
"mute_modal.title": "사용자를 뮤트할까요?",
|
||||
"mute_modal.you_wont_see_mentions": "그를 멘션하는 게시물을 더는 보지 않게 됩니다.",
|
||||
"mute_modal.you_wont_see_posts": "내가 작성한 게시물을 볼 수는 있지만, 나는 그가 작성한 것을 보지 않게 됩니다.",
|
||||
"name_and_others": "{name} 외 {count, plural, other {# 명}}",
|
||||
"name_and_others_with_link": "{name} 외 <a>{count, plural, other {# 명}}</a>",
|
||||
"navigation_bar.about": "정보",
|
||||
"navigation_bar.advanced_interface": "고급 웹 인터페이스에서 열기",
|
||||
"navigation_bar.blocks": "차단한 사용자",
|
||||
|
@ -466,6 +474,10 @@
|
|||
"navigation_bar.security": "보안",
|
||||
"not_signed_in_indicator.not_signed_in": "이 정보에 접근하려면 로그인을 해야 합니다.",
|
||||
"notification.admin.report": "{name} 님이 {target}를 신고했습니다",
|
||||
"notification.admin.report_account": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 {category}로 신고했습니다",
|
||||
"notification.admin.report_account_other": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 신고했습니다",
|
||||
"notification.admin.report_statuses": "{name} 님이 {target}을 {category}로 신고했습니다",
|
||||
"notification.admin.report_statuses_other": "{name} 님이 {target}을 신고했습니다",
|
||||
"notification.admin.sign_up": "{name} 님이 가입했습니다",
|
||||
"notification.favourite": "{name} 님이 내 게시물을 좋아합니다",
|
||||
"notification.follow": "{name} 님이 나를 팔로우했습니다",
|
||||
|
@ -481,6 +493,8 @@
|
|||
"notification.moderation_warning.action_silence": "계정이 제한되었습니다.",
|
||||
"notification.moderation_warning.action_suspend": "계정이 정지되었습니다.",
|
||||
"notification.own_poll": "설문을 마침",
|
||||
"notification.poll": "참여한 투표가 끝났습니다",
|
||||
"notification.private_mention": "{name} 님이 나를 개인적으로 멘션했습니다",
|
||||
"notification.reblog": "{name} 님이 부스트했습니다",
|
||||
"notification.relationships_severance_event": "{name} 님과의 연결이 끊어졌습니다",
|
||||
"notification.relationships_severance_event.account_suspension": "{from}의 관리자가 {target}를 정지시켰기 때문에 그들과 더이상 상호작용 할 수 없고 정보를 받아볼 수 없습니다.",
|
||||
|
@ -495,9 +509,12 @@
|
|||
"notification_requests.title": "걸러진 알림",
|
||||
"notifications.clear": "알림 비우기",
|
||||
"notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
|
||||
"notifications.clear_title": "알림을 모두 지울까요?",
|
||||
"notifications.column_settings.admin.report": "새 신고:",
|
||||
"notifications.column_settings.admin.sign_up": "새로운 가입:",
|
||||
"notifications.column_settings.alert": "데스크탑 알림",
|
||||
"notifications.column_settings.beta.category": "실험적인 기능",
|
||||
"notifications.column_settings.beta.grouping": "알림 그룹화",
|
||||
"notifications.column_settings.favourite": "좋아요:",
|
||||
"notifications.column_settings.filter_bar.advanced": "모든 범주 표시",
|
||||
"notifications.column_settings.filter_bar.category": "빠른 필터 막대",
|
||||
|
@ -661,9 +678,13 @@
|
|||
"report.unfollow_explanation": "이 계정을 팔로우하고 있습니다. 홈 피드에서 더 이상 게시물을 받아 보지 않으려면 팔로우를 해제하십시오.",
|
||||
"report_notification.attached_statuses": "{count}개의 게시물 첨부됨",
|
||||
"report_notification.categories.legal": "법령",
|
||||
"report_notification.categories.legal_sentence": "불법적인 내용",
|
||||
"report_notification.categories.other": "기타",
|
||||
"report_notification.categories.other_sentence": "기타",
|
||||
"report_notification.categories.spam": "스팸",
|
||||
"report_notification.categories.spam_sentence": "스팸",
|
||||
"report_notification.categories.violation": "규칙 위반",
|
||||
"report_notification.categories.violation_sentence": "규칙 위반",
|
||||
"report_notification.open": "신고 열기",
|
||||
"search.no_recent_searches": "최근 검색 기록이 없습니다",
|
||||
"search.placeholder": "검색",
|
||||
|
@ -755,7 +776,7 @@
|
|||
"status.title.with_attachments": "{user} 님이 {attachmentCount, plural, one {첨부파일} other {{attachmentCount}개의 첨부파일}}과 함께 게시함",
|
||||
"status.translate": "번역",
|
||||
"status.translated_from_with": "{provider}에 의해 {lang}에서 번역됨",
|
||||
"status.uncached_media_warning": "마리보기 허용되지 않음",
|
||||
"status.uncached_media_warning": "미리보기를 사용할 수 없습니다",
|
||||
"status.unmute_conversation": "이 대화의 뮤트 해제하기",
|
||||
"status.unpin": "고정 해제",
|
||||
"subscribed_languages.lead": "변경 후에는 선택한 언어들로 작성된 게시물들만 홈 타임라인과 리스트 타임라인에 나타나게 됩니다. 아무 것도 선택하지 않으면 모든 언어로 작성된 게시물을 받아봅니다.",
|
||||
|
|
|
@ -82,7 +82,6 @@
|
|||
"empty_column.notification_requests": "Omnia clara sunt! Nihil hic est. Cum novās notificātiōnēs accipīs, hic secundum tua praecepta apparebunt.",
|
||||
"empty_column.notifications": "Nōn adhūc habēs ullo notificātiōnēs. Cum aliī tē interagunt, hīc videbis.",
|
||||
"explore.trending_statuses": "Contributa",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mentiō} other {mentiōnēs}}",
|
||||
"firehose.all": "Omnis",
|
||||
"footer.about": "De",
|
||||
"generic.saved": "Servavit",
|
||||
|
|
|
@ -278,7 +278,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva",
|
||||
"filter_modal.select_filter.title": "Filtra esta publikasyon",
|
||||
"filter_modal.title.status": "Filtra una publikasyon",
|
||||
"filtered_notifications_banner.pending_requests": "Avizos de {count, plural, =0 {dingun} one {una persona} other {# personas}} ke puedes koneser",
|
||||
"filtered_notifications_banner.title": "Avizos filtrados",
|
||||
"firehose.all": "Todo",
|
||||
"firehose.local": "Este sirvidor",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.",
|
||||
"filter_modal.select_filter.title": "Filtruoti šį įrašą",
|
||||
"filter_modal.title.status": "Filtruoti įrašą",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}",
|
||||
"filtered_notifications_banner.pending_requests": "Pranešimai iš {count, plural, =0 {nė vieno} one {vienos žmogaus} few {# žmonių} many {# žmonių} other {# žmonių}}, kuriuos galbūt pažįsti",
|
||||
"filtered_notifications_banner.title": "Filtruojami pranešimai",
|
||||
"firehose.all": "Visi",
|
||||
"firehose.local": "Šis serveris",
|
||||
|
|
|
@ -268,7 +268,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu",
|
||||
"filter_modal.select_filter.title": "Filtrēt šo ziņu",
|
||||
"filter_modal.title.status": "Filtrēt ziņu",
|
||||
"filtered_notifications_banner.pending_requests": "Paziņojumi no {count, plural, =0 {neviena} one {viena cilvēka} other {# cilvēkiem}}, ko Tu varētu zināt",
|
||||
"firehose.all": "Visi",
|
||||
"firehose.local": "Šis serveris",
|
||||
"firehose.remote": "Citi serveri",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Een bestaande categorie gebruiken of een nieuwe aanmaken",
|
||||
"filter_modal.select_filter.title": "Dit bericht filteren",
|
||||
"filter_modal.title.status": "Een bericht filteren",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {vermelding} other {vermeldingen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Meldingen van {count, plural, =0 {niemand} one {één persoon} other {# mensen}} die je misschien kent",
|
||||
"filtered_notifications_banner.pending_requests": "Van {count, plural, =0 {niemand} one {een persoon} other {# personen}} die je mogelijk kent",
|
||||
"filtered_notifications_banner.title": "Gefilterde meldingen",
|
||||
"firehose.all": "Alles",
|
||||
"firehose.local": "Deze server",
|
||||
|
|
|
@ -293,8 +293,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny",
|
||||
"filter_modal.select_filter.title": "Filtrer dette innlegget",
|
||||
"filter_modal.title.status": "Filtrer eit innlegg",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}",
|
||||
"filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner",
|
||||
"filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner",
|
||||
"filtered_notifications_banner.title": "Filtrerte varslingar",
|
||||
"firehose.all": "Alle",
|
||||
"firehose.local": "Denne tenaren",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Użyj istniejącej kategorii lub utwórz nową",
|
||||
"filter_modal.select_filter.title": "Filtruj ten wpis",
|
||||
"filter_modal.title.status": "Filtruj wpis",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {wzmianka} few {wzmianki} other {wzmianek}}",
|
||||
"filtered_notifications_banner.pending_requests": "Powiadomienia od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}",
|
||||
"filtered_notifications_banner.pending_requests": "Od {count, plural, =0 {żadnej osoby którą możesz znać} one {# osoby którą możesz znać} other {# osób które możesz znać}}",
|
||||
"filtered_notifications_banner.title": "Powiadomienia filtrowane",
|
||||
"firehose.all": "Wszystko",
|
||||
"firehose.local": "Ten serwer",
|
||||
|
|
|
@ -297,8 +297,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Use uma categoria existente ou crie uma nova",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicação",
|
||||
"filter_modal.title.status": "Filtrar uma publicação",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {no one} one {one person} other {# people}} que você talvez conheça",
|
||||
"filtered_notifications_banner.title": "Notificações filtradas",
|
||||
"firehose.all": "Tudo",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Utilize uma categoria existente ou crie uma nova",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicação",
|
||||
"filter_modal.title.status": "Filtrar uma publicação",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menção} other {menções}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificações de {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que talvez conheça",
|
||||
"filtered_notifications_banner.pending_requests": "De {count, plural, =0 {ninguém} one {uma pessoa} other {# pessoas}} que pode conhecer",
|
||||
"filtered_notifications_banner.title": "Notificações filtradas",
|
||||
"firehose.all": "Todas",
|
||||
"firehose.local": "Este servidor",
|
||||
|
|
|
@ -290,8 +290,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую",
|
||||
"filter_modal.select_filter.title": "Фильтровать этот пост",
|
||||
"filter_modal.title.status": "Фильтровать пост",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {упоминание} other {упоминания}}",
|
||||
"filtered_notifications_banner.pending_requests": "Уведомления от {count, plural, =0 {никого} one {# человека} other {# других людей, с кем вы можете быть знакомы}}",
|
||||
"filtered_notifications_banner.title": "Отфильтрованные уведомления",
|
||||
"firehose.all": "Все",
|
||||
"firehose.local": "Текущий сервер",
|
||||
|
|
|
@ -241,8 +241,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Imprea una categoria chi esistit giai o crea·nde una",
|
||||
"filter_modal.select_filter.title": "Filtra custa publicatzione",
|
||||
"filter_modal.title.status": "Filtra una publicatzione",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mèntovu} other {mèntovos}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notìficas dae {count, plural, =0 {nemos} one {una persone} other {# persones}} chi connosches",
|
||||
"filtered_notifications_banner.title": "Notìficas filtradas",
|
||||
"firehose.all": "Totus",
|
||||
"firehose.local": "Custu serbidore",
|
||||
|
|
|
@ -285,7 +285,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Použite existujúcu kategóriu alebo vytvorte novú",
|
||||
"filter_modal.select_filter.title": "Filtrovanie tohto príspevku",
|
||||
"filter_modal.title.status": "Filtrovanie príspevku",
|
||||
"filtered_notifications_banner.pending_requests": "Oboznámenia od {count, plural, =0 {nikoho} one {jedného človeka} other {# ľudí}} čo môžeš poznať",
|
||||
"filtered_notifications_banner.title": "Filtrované oznámenia",
|
||||
"firehose.all": "Všetko",
|
||||
"firehose.local": "Tento server",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Uporabite obstoječo kategorijo ali ustvarite novo",
|
||||
"filter_modal.select_filter.title": "Filtriraj to objavo",
|
||||
"filter_modal.title.status": "Filtrirajte objavo",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {omemba} two {omembi} few {omembe} other {omemb}}",
|
||||
"filtered_notifications_banner.pending_requests": "Obvestila od {count, plural, =0 {nikogar, ki bi ga} one {# človeka, ki bi ga} two {# ljudi, ki bi ju} few {# ljudi, ki bi jih} other {# ljudi, ki bi jih}} lahko poznali",
|
||||
"filtered_notifications_banner.title": "Filtrirana obvestila",
|
||||
"firehose.all": "Vse",
|
||||
"firehose.local": "Ta strežnik",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re",
|
||||
"filter_modal.select_filter.title": "Filtroje këtë postim",
|
||||
"filter_modal.title.status": "Filtroni një postim",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {përmendje} other {përmendje}}",
|
||||
"filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni",
|
||||
"filtered_notifications_banner.pending_requests": "Nga {count, plural, =0 {askush} one {një person} other {# vetë}} që mund të njihni",
|
||||
"filtered_notifications_banner.title": "Njoftime të filtruar",
|
||||
"firehose.all": "Krejt",
|
||||
"firehose.local": "Këtë shërbyes",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Koristite postojeću kategoriju ili kreirajte novu",
|
||||
"filter_modal.select_filter.title": "Filtriraj ovu objavu",
|
||||
"filter_modal.title.status": "Filtriraj objavu",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {pominjanje} few {pominjanja} other {pominjanja}}",
|
||||
"filtered_notifications_banner.pending_requests": "Obaveštenja od {count, plural, =0 {nikoga koga možda poznajete} one {# osobe koju možda poznajete} few {# osobe koje možda poznajete} other {# osoba koje možda poznajete}}",
|
||||
"filtered_notifications_banner.title": "Filtrirana obaveštenja",
|
||||
"firehose.all": "Sve",
|
||||
"firehose.local": "Ovaj server",
|
||||
|
|
|
@ -293,8 +293,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Користите постојећу категорију или креирајте нову",
|
||||
"filter_modal.select_filter.title": "Филтрирај ову објаву",
|
||||
"filter_modal.title.status": "Филтрирај објаву",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {помињање} few {помињања} other {помињања}}",
|
||||
"filtered_notifications_banner.pending_requests": "Обавештења од {count, plural, =0 {никога кога можда познајете} one {# особе коју можда познајете} few {# особе које можда познајете} other {# особа које можда познајете}}",
|
||||
"filtered_notifications_banner.title": "Филтрирана обавештења",
|
||||
"firehose.all": "Све",
|
||||
"firehose.local": "Овај сервер",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Använd en befintlig kategori eller skapa en ny",
|
||||
"filter_modal.select_filter.title": "Filtrera detta inlägg",
|
||||
"filter_modal.title.status": "Filtrera ett inlägg",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {omnämning} other {omnämnanden}}",
|
||||
"filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner",
|
||||
"filtered_notifications_banner.title": "Filtrerade aviseringar",
|
||||
"firehose.all": "Allt",
|
||||
"firehose.local": "Denna server",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "ใช้หมวดหมู่ที่มีอยู่หรือสร้างหมวดหมู่ใหม่",
|
||||
"filter_modal.select_filter.title": "กรองโพสต์นี้",
|
||||
"filter_modal.title.status": "กรองโพสต์",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {การกล่าวถึง}}",
|
||||
"filtered_notifications_banner.pending_requests": "การแจ้งเตือนจาก {count, plural, =0 {ไม่มีใคร} other {# คน}} ที่คุณอาจรู้จัก",
|
||||
"filtered_notifications_banner.title": "การแจ้งเตือนที่กรองอยู่",
|
||||
"firehose.all": "ทั้งหมด",
|
||||
"firehose.local": "เซิร์ฟเวอร์นี้",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Mevcut bir kategoriyi kullan veya yeni bir tane oluştur",
|
||||
"filter_modal.select_filter.title": "Bu gönderiyi süzgeçle",
|
||||
"filter_modal.title.status": "Bir gönderi süzgeçle",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {bahsetme} other {bahsetme}}",
|
||||
"filtered_notifications_banner.pending_requests": "Bildiğiniz {count, plural, =0 {hiç kimseden} one {bir kişiden} other {# kişiden}} bildirim",
|
||||
"filtered_notifications_banner.title": "Filtrelenmiş bildirimler",
|
||||
"firehose.all": "Tümü",
|
||||
"firehose.local": "Bu sunucu",
|
||||
|
|
|
@ -300,8 +300,6 @@
|
|||
"filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову",
|
||||
"filter_modal.select_filter.title": "Фільтрувати цей допис",
|
||||
"filter_modal.title.status": "Фільтрувати допис",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}",
|
||||
"filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати",
|
||||
"filtered_notifications_banner.title": "Відфільтровані сповіщення",
|
||||
"firehose.all": "Всі",
|
||||
"firehose.local": "Цей сервер",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Sử dụng một danh mục hiện có hoặc tạo một danh mục mới",
|
||||
"filter_modal.select_filter.title": "Lọc tút này",
|
||||
"filter_modal.title.status": "Lọc một tút",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {lượt nhắc}}",
|
||||
"filtered_notifications_banner.pending_requests": "Thông báo từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết",
|
||||
"filtered_notifications_banner.pending_requests": "Từ {count, plural, =0 {không ai} other {# người}} bạn có thể biết",
|
||||
"filtered_notifications_banner.title": "Thông báo đã lọc",
|
||||
"firehose.all": "Toàn bộ",
|
||||
"firehose.local": "Máy chủ này",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "使用一个已存在类别,或创建一个新类别",
|
||||
"filter_modal.select_filter.title": "过滤此嘟文",
|
||||
"filter_modal.title.status": "过滤一条嘟文",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {提及}}",
|
||||
"filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}的通知",
|
||||
"filtered_notifications_banner.pending_requests": "来自你可能认识的 {count, plural, =0 {0 个人} other {# 个人}}",
|
||||
"filtered_notifications_banner.title": "通知(已过滤)",
|
||||
"firehose.all": "全部",
|
||||
"firehose.local": "此服务器",
|
||||
|
|
|
@ -168,6 +168,7 @@
|
|||
"confirmations.block.confirm": "封鎖",
|
||||
"confirmations.delete.confirm": "刪除",
|
||||
"confirmations.delete.message": "你確定要刪除這文章嗎?",
|
||||
"confirmations.delete.title": "刪除帖文?",
|
||||
"confirmations.delete_list.confirm": "刪除",
|
||||
"confirmations.delete_list.message": "你確定要永久刪除這列表嗎?",
|
||||
"confirmations.discard_edit_media.confirm": "捨棄",
|
||||
|
@ -176,6 +177,7 @@
|
|||
"confirmations.edit.message": "現在編輯將會覆蓋你目前正在撰寫的訊息。你確定要繼續嗎?",
|
||||
"confirmations.logout.confirm": "登出",
|
||||
"confirmations.logout.message": "確定要登出嗎?",
|
||||
"confirmations.logout.title": "登出?",
|
||||
"confirmations.mute.confirm": "靜音",
|
||||
"confirmations.redraft.confirm": "刪除並編輯",
|
||||
"confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。",
|
||||
|
@ -290,8 +292,6 @@
|
|||
"filter_modal.select_filter.subtitle": "使用既有類別,或創建一個新類別",
|
||||
"filter_modal.select_filter.title": "過濾此帖文",
|
||||
"filter_modal.title.status": "過濾一則帖文",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {則提及} other {則提及}}",
|
||||
"filtered_notifications_banner.pending_requests": "來自 {count, plural, =0 {0 位} other {# 位}}你可能認識的人的通知",
|
||||
"filtered_notifications_banner.title": "已過濾之通知",
|
||||
"firehose.all": "全部",
|
||||
"firehose.local": "本伺服器",
|
||||
|
|
|
@ -300,8 +300,7 @@
|
|||
"filter_modal.select_filter.subtitle": "使用既有的類別或是新增",
|
||||
"filter_modal.select_filter.title": "過濾此嘟文",
|
||||
"filter_modal.title.status": "過濾一則嘟文",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {# 則提及}}",
|
||||
"filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}} 之通知",
|
||||
"filtered_notifications_banner.pending_requests": "來自您可能認識的 {count, plural, =0 {0 人} other {# 人}}",
|
||||
"filtered_notifications_banner.title": "已過濾之通知",
|
||||
"firehose.all": "全部",
|
||||
"firehose.local": "本站",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue