Merge remote-tracking branch 'upstream/main'
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
Dalite 2025-02-28 09:35:30 +01:00
commit 37d017bcf3
78 changed files with 1559 additions and 997 deletions

View file

@ -2,6 +2,41 @@
All notable changes to this project will be documented in this file.
## [4.3.4] - 2025-02-27
### Security
- Update dependencies
- Change HTML sanitization to remove unusable and unused `embed` tag (#34021 by @ClearlyClaire, [GHSA-mq2m-hr29-8gqf](https://github.com/mastodon/mastodon/security/advisories/GHSA-mq2m-hr29-8gqf))
- Fix rate-limit on sign-up email verification ([GHSA-v39f-c9jj-8w7h](https://github.com/mastodon/mastodon/security/advisories/GHSA-v39f-c9jj-8w7h))
- Fix improper disclosure of domain blocks to unverified users ([GHSA-94h4-fj37-c825](https://github.com/mastodon/mastodon/security/advisories/GHSA-94h4-fj37-c825))
### Changed
- Change preview cards to be shown when Content Warnings are expanded (#33827 by @ClearlyClaire)
- Change warnings against changing encryption secrets to be even more noticeable (#33631 by @ClearlyClaire)
- Change `mastodon:setup` to prevent overwriting already-configured servers (#33603, #33616, and #33684 by @ClearlyClaire and @mjankowski)
- Change notifications from moderators to not be filtered (#32974 and #33654 by @ClearlyClaire and @mjankowski)
### Fixed
- Fix `GET /api/v2/notifications/:id` and `POST /api/v2/notifications/:id/dismiss` for ungrouped notifications (#33990 by @ClearlyClaire)
- Fix issue with some versions of libvips on some systems (#33853 by @kleisauke)
- Fix handling of duplicate mentions in incoming status `Update` (#33911 by @ClearlyClaire)
- Fix inefficiencies in timeline generation (#33839 and #33842 by @ClearlyClaire)
- Fix emoji rewrite adding unnecessary curft to the DOM for most emoji (#33818 by @ClearlyClaire)
- Fix `tootctl feeds build` not building list timelines (#33783 by @ClearlyClaire)
- Fix flaky test in `/api/v2/notifications` tests (#33773 by @ClearlyClaire)
- Fix incorrect signature after HTTP redirect (#33757 and #33769 by @ClearlyClaire)
- Fix polls not being validated on edition (#33755 by @ClearlyClaire)
- Fix media preview height in compose form when 3 or more images are attached (#33571 by @ClearlyClaire)
- Fix preview card sizing in “Author attribution” in profile settings (#33482 by @ClearlyClaire)
- Fix processing of incoming notifications for unfilterable types (#33429 by @ClearlyClaire)
- Fix featured tags for remote accounts not being kept up to date (#33372, #33406, and #33425 by @ClearlyClaire and @mjankowski)
- Fix notification polling showing a loading bar in web UI (#32960 by @Gargron)
- Fix accounts table long display name (#29316 by @WebCoder49)
- Fix exclusive lists interfering with notifications (#28162 by @ShadowJonathan)
## [4.3.3] - 2025-01-16
### Security

View file

@ -273,7 +273,7 @@ GEM
activesupport (>= 5.1)
haml (>= 4.0.6)
railties (>= 5.1)
haml_lint (0.60.0)
haml_lint (0.61.0)
haml (>= 5.0)
parallel (~> 1.10)
rainbow
@ -432,7 +432,7 @@ GEM
nokogiri (1.18.3)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oj (3.16.9)
oj (3.16.10)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
omniauth (2.1.2)
@ -738,7 +738,7 @@ GEM
lint_roller (~> 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rails (2.30.1)
rubocop-rails (2.30.2)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)

View file

@ -31,7 +31,7 @@ class Api::V1::Instances::DomainBlocksController < Api::V1::Instances::BaseContr
end
def show_domain_blocks_to_user?
Setting.show_domain_blocks == 'users' && user_signed_in?
Setting.show_domain_blocks == 'users' && user_signed_in? && current_user.functional_or_moved?
end
def set_domain_blocks
@ -47,6 +47,6 @@ class Api::V1::Instances::DomainBlocksController < Api::V1::Instances::BaseContr
end
def show_rationale_for_user?
Setting.show_domain_blocks_rationale == 'users' && user_signed_in?
Setting.show_domain_blocks_rationale == 'users' && user_signed_in? && current_user.functional_or_moved?
end
end

View file

@ -46,7 +46,7 @@ class Api::V2::NotificationsController < Api::BaseController
end
def show
@notification = current_account.notifications.without_suspended.find_by!(group_key: params[:group_key])
@notification = current_account.notifications.without_suspended.by_group_key(params[:group_key]).take!
presenter = GroupedNotificationsPresenter.new(NotificationGroup.from_notifications([@notification]))
render json: presenter, serializer: REST::DedupNotificationGroupSerializer
end
@ -57,7 +57,7 @@ class Api::V2::NotificationsController < Api::BaseController
end
def dismiss
current_account.notifications.where(group_key: params[:group_key]).destroy_all
current_account.notifications.by_group_key(params[:group_key]).destroy_all
render_empty
end

View file

@ -142,6 +142,13 @@ export function fetchAccountFail(id, error) {
};
}
/**
* @param {string} id
* @param {Object} options
* @param {boolean} [options.reblogs]
* @param {boolean} [options.notify]
* @returns {function(): void}
*/
export function followAccount(id, options = { reblogs: true }) {
return (dispatch, getState) => {
const alreadyFollowing = getState().getIn(['relationships', id, 'following']);

View file

@ -55,7 +55,7 @@ export const FollowButton: React.FC<{
);
}
if (!relationship) return;
if (!relationship || !accountId) return;
if (accountId === me) {
return;

View file

@ -1,528 +0,0 @@
import PropTypes from 'prop-types';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { NavLink, withRouter } from 'react-router-dom';
import { isFulfilled, isRejected } from '@reduxjs/toolkit';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import CheckIcon from '@/material-icons/400-24px/check.svg?react';
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react';
import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react';
import ShareIcon from '@/material-icons/400-24px/share.svg?react';
import { Avatar } from 'mastodon/components/avatar';
import { Badge, AutomatedBadge, GroupBadge } from 'mastodon/components/badge';
import { Button } from 'mastodon/components/button';
import { CopyIconButton } from 'mastodon/components/copy_icon_button';
import { FollowersCounter, FollowingCounter, StatusesCounter } from 'mastodon/components/counters';
import { Icon } from 'mastodon/components/icon';
import { IconButton } from 'mastodon/components/icon_button';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import { ShortNumber } from 'mastodon/components/short_number';
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
import AccountNoteContainer from '../containers/account_note_container';
import FollowRequestNoteContainer from '../containers/follow_request_note_container';
import { DomainPill } from './domain_pill';
const messages = defineMessages({
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
follow: { id: 'account.follow', defaultMessage: 'Follow' },
followBack: { id: 'account.follow_back', defaultMessage: 'Follow back' },
mutual: { id: 'account.mutual', defaultMessage: 'Mutual' },
cancel_follow_request: { id: 'account.cancel_follow_request', defaultMessage: 'Withdraw follow request' },
requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' },
account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' },
mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
direct: { id: 'account.direct', defaultMessage: 'Privately mention @{name}' },
unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
block: { id: 'account.block', defaultMessage: 'Block @{name}' },
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
report: { id: 'account.report', defaultMessage: 'Report @{name}' },
share: { id: 'account.share', defaultMessage: 'Share @{name}\'s profile' },
copy: { id: 'account.copy', defaultMessage: 'Copy link to profile' },
media: { id: 'account.media', defaultMessage: 'Media' },
blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' },
unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },
hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' },
showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' },
enableNotifications: { id: 'account.enable_notifications', defaultMessage: 'Notify me when @{name} posts' },
disableNotifications: { id: 'account.disable_notifications', defaultMessage: 'Stop notifying me when @{name} posts' },
pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' },
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' },
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' },
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Blocked domains' },
mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
languages: { id: 'account.languages', defaultMessage: 'Change subscribed languages' },
openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
});
const titleFromAccount = account => {
const displayName = account.get('display_name');
const acct = account.get('acct') === account.get('username') ? `${account.get('username')}@${localDomain}` : account.get('acct');
const prefix = displayName.trim().length === 0 ? account.get('username') : displayName;
return `${prefix} (@${acct})`;
};
const messageForFollowButton = relationship => {
if(!relationship) return messages.follow;
if (relationship.get('following') && relationship.get('followed_by')) {
return messages.mutual;
} else if (relationship.get('following') || relationship.get('requested')) {
return messages.unfollow;
} else if (relationship.get('followed_by')) {
return messages.followBack;
} else {
return messages.follow;
}
};
const dateFormatOptions = {
month: 'short',
day: 'numeric',
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
};
class Header extends ImmutablePureComponent {
static propTypes = {
identity: identityContextPropShape,
account: ImmutablePropTypes.record,
identity_props: ImmutablePropTypes.list,
onFollow: PropTypes.func.isRequired,
onBlock: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onReblogToggle: PropTypes.func.isRequired,
onNotifyToggle: PropTypes.func.isRequired,
onReport: PropTypes.func.isRequired,
onMute: PropTypes.func.isRequired,
onBlockDomain: PropTypes.func.isRequired,
onUnblockDomain: PropTypes.func.isRequired,
onEndorseToggle: PropTypes.func.isRequired,
onAddToList: PropTypes.func.isRequired,
onEditAccountNote: PropTypes.func.isRequired,
onChangeLanguages: PropTypes.func.isRequired,
onInteractionModal: PropTypes.func.isRequired,
onOpenAvatar: PropTypes.func.isRequired,
onOpenURL: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
domain: PropTypes.string.isRequired,
hidden: PropTypes.bool,
...WithRouterPropTypes,
};
setRef = c => {
this.node = c;
};
openEditProfile = () => {
window.open('/settings/profile', '_blank');
};
isStatusesPageActive = (match, location) => {
if (!match) {
return false;
}
return !location.pathname.match(/\/(followers|following)\/?$/);
};
handleMouseEnter = ({ currentTarget }) => {
if (autoPlayGif) {
return;
}
const emojis = currentTarget.querySelectorAll('.custom-emoji');
for (var i = 0; i < emojis.length; i++) {
let emoji = emojis[i];
emoji.src = emoji.getAttribute('data-original');
}
};
handleMouseLeave = ({ currentTarget }) => {
if (autoPlayGif) {
return;
}
const emojis = currentTarget.querySelectorAll('.custom-emoji');
for (var i = 0; i < emojis.length; i++) {
let emoji = emojis[i];
emoji.src = emoji.getAttribute('data-static');
}
};
handleAvatarClick = e => {
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault();
this.props.onOpenAvatar();
}
};
handleShare = () => {
const { account } = this.props;
navigator.share({
url: account.get('url'),
}).catch((e) => {
if (e.name !== 'AbortError') console.error(e);
});
};
handleHashtagClick = e => {
const { history } = this.props;
const value = e.currentTarget.textContent.replace(/^#/, '');
if (history && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault();
history.push(`/tags/${value}`);
}
};
handleMentionClick = e => {
const { history, onOpenURL } = this.props;
if (history && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
e.preventDefault();
const link = e.currentTarget;
onOpenURL(link.href).then((result) => {
if (isFulfilled(result)) {
if (result.payload.accounts[0]) {
history.push(`/@${result.payload.accounts[0].acct}`);
} else if (result.payload.statuses[0]) {
history.push(`/@${result.payload.statuses[0].account.acct}/${result.payload.statuses[0].id}`);
} else {
window.location = link.href;
}
} else if (isRejected(result)) {
window.location = link.href;
}
}).catch(() => {
// Nothing
});
}
};
_attachLinkEvents () {
const node = this.node;
if (!node) {
return;
}
const links = node.querySelectorAll('a');
let link;
for (var i = 0; i < links.length; ++i) {
link = links[i];
if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
link.addEventListener('click', this.handleHashtagClick, false);
} else if (link.classList.contains('mention')) {
link.addEventListener('click', this.handleMentionClick, false);
}
}
}
componentDidMount () {
this._attachLinkEvents();
}
componentDidUpdate () {
this._attachLinkEvents();
}
render () {
const { account, hidden, intl } = this.props;
const { signedIn, permissions } = this.props.identity;
if (!account) {
return null;
}
const suspended = account.get('suspended');
const isRemote = account.get('acct') !== account.get('username');
const remoteDomain = isRemote ? account.get('acct').split('@')[1] : null;
let actionBtn, bellBtn, lockedIcon, shareBtn;
let info = [];
let menu = [];
if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
info.push(<span key='blocked' className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
}
if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) {
info.push(<span key='muted' className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>);
} else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) {
info.push(<span key='domain_blocked' className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain blocked' /></span>);
}
if (account.getIn(['relationship', 'requested']) || account.getIn(['relationship', 'following'])) {
bellBtn = <IconButton icon={account.getIn(['relationship', 'notifying']) ? 'bell' : 'bell-o'} iconComponent={account.getIn(['relationship', 'notifying']) ? NotificationsActiveIcon : NotificationsIcon} active={account.getIn(['relationship', 'notifying'])} title={intl.formatMessage(account.getIn(['relationship', 'notifying']) ? messages.disableNotifications : messages.enableNotifications, { name: account.get('username') })} onClick={this.props.onNotifyToggle} />;
}
if ('share' in navigator) {
shareBtn = <IconButton className='optional' iconComponent={ShareIcon} title={intl.formatMessage(messages.share, { name: account.get('username') })} onClick={this.handleShare} />;
} else {
shareBtn = <CopyIconButton className='optional' title={intl.formatMessage(messages.copy)} value={account.get('url')} />;
}
if (me !== account.get('id')) {
if (signedIn && !account.get('relationship')) { // Wait until the relationship is loaded
actionBtn = <Button disabled><LoadingIndicator /></Button>;
} else if (!account.getIn(['relationship', 'blocking'])) {
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames({ 'button--destructive': (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) })} text={intl.formatMessage(messageForFollowButton(account.get('relationship')))} onClick={signedIn ? this.props.onFollow : this.props.onInteractionModal} />;
} else if (account.getIn(['relationship', 'blocking'])) {
actionBtn = <Button text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
}
} else {
actionBtn = <Button text={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />;
}
if (account.get('moved') && !account.getIn(['relationship', 'following'])) {
actionBtn = '';
}
if (account.get('locked')) {
lockedIcon = <Icon id='lock' icon={LockIcon} title={intl.formatMessage(messages.account_locked)} />;
}
if (signedIn && account.get('id') !== me && !account.get('suspended')) {
menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect });
menu.push(null);
}
if (isRemote) {
menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: account.get('url') });
menu.push(null);
}
if (account.get('id') === me) {
menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
menu.push({ text: intl.formatMessage(messages.followed_tags), to: '/followed_tags' });
menu.push(null);
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
menu.push({ text: intl.formatMessage(messages.domain_blocks), to: '/domain_blocks' });
} else if (signedIn) {
if (account.getIn(['relationship', 'following'])) {
if (!account.getIn(['relationship', 'muting'])) {
if (account.getIn(['relationship', 'showing_reblogs'])) {
menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
} else {
menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
}
menu.push({ text: intl.formatMessage(messages.languages), action: this.props.onChangeLanguages });
menu.push(null);
}
menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
menu.push(null);
}
if (account.getIn(['relationship', 'muting'])) {
menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
} else {
menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute, dangerous: true });
}
if (account.getIn(['relationship', 'blocking'])) {
menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
} else {
menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock, dangerous: true });
}
if (!account.get('suspended')) {
menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport, dangerous: true });
}
}
if (signedIn && isRemote) {
menu.push(null);
if (account.getIn(['relationship', 'domain_blocking'])) {
menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain: remoteDomain }), action: this.props.onUnblockDomain });
} else {
menu.push({ text: intl.formatMessage(messages.blockDomain, { domain: remoteDomain }), action: this.props.onBlockDomain, dangerous: true });
}
}
if ((account.get('id') !== me && (permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
menu.push(null);
if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
}
if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: remoteDomain }), href: `/admin/instances/${remoteDomain}` });
}
}
const content = { __html: account.get('note_emojified') };
const displayNameHtml = { __html: account.get('display_name_html') };
const fields = account.get('fields');
const isLocal = account.get('acct').indexOf('@') === -1;
const username = account.get('acct').split('@')[0];
const domain = isLocal ? localDomain : account.get('acct').split('@')[1];
const isIndexable = !account.get('noindex');
const badges = [];
if (account.get('bot')) {
badges.push(<AutomatedBadge key='bot-badge' />);
} else if (account.get('group')) {
badges.push(<GroupBadge key='group-badge' />);
}
account.get('roles', []).forEach((role) => {
badges.push(<Badge key={`role-badge-${role.get('id')}`} label={<span>{role.get('name')}</span>} domain={domain} roleId={role.get('id')} />);
});
return (
<div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
{!(suspended || hidden || account.get('moved')) && account.getIn(['relationship', 'requested_by']) && <FollowRequestNoteContainer account={account} />}
<div className='account__header__image'>
<div className='account__header__info'>
{info}
</div>
{!(suspended || hidden) && <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />}
</div>
<div className='account__header__bar'>
<div className='account__header__tabs'>
<a className='avatar' href={account.get('avatar')} rel='noopener' target='_blank' onClick={this.handleAvatarClick}>
<Avatar account={suspended || hidden ? undefined : account} size={90} />
</a>
<div className='account__header__tabs__buttons'>
{!hidden && bellBtn}
{!hidden && shareBtn}
<DropdownMenuContainer disabled={menu.length === 0} items={menu} icon='ellipsis-v' iconComponent={MoreHorizIcon} size={24} direction='right' />
{!hidden && actionBtn}
</div>
</div>
<div className='account__header__tabs__name'>
<h1>
<span dangerouslySetInnerHTML={displayNameHtml} />
<small>
<span>@{username}<span className='invisible'>@{domain}</span></span>
<DomainPill username={username} domain={domain} isSelf={me === account.get('id')} />
{lockedIcon}
</small>
</h1>
</div>
{badges.length > 0 && (
<div className='account__header__badges'>
{badges}
</div>
)}
{!(suspended || hidden) && (
<div className='account__header__extra'>
<div className='account__header__bio' ref={this.setRef}>
{(account.get('id') !== me && signedIn) && <AccountNoteContainer account={account} />}
{account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content translate' dangerouslySetInnerHTML={content} />}
<div className='account__header__fields'>
<dl>
<dt><FormattedMessage id='account.joined_short' defaultMessage='Joined' /></dt>
<dd>{intl.formatDate(account.get('created_at'), { year: 'numeric', month: 'short', day: '2-digit' })}</dd>
</dl>
{fields.map((pair, i) => (
<dl key={i} className={classNames({ verified: pair.get('verified_at') })}>
<dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} className='translate' />
<dd className='translate' title={pair.get('value_plain')}>
{pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' icon={CheckIcon} className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
</dd>
</dl>
))}
</div>
</div>
<div className='account__header__extra__links'>
<NavLink isActive={this.isStatusesPageActive} activeClassName='active' to={`/@${account.get('acct')}`} title={intl.formatNumber(account.get('statuses_count'))}>
<ShortNumber
value={account.get('statuses_count')}
renderer={StatusesCounter}
/>
</NavLink>
<NavLink exact activeClassName='active' to={`/@${account.get('acct')}/following`} title={intl.formatNumber(account.get('following_count'))}>
<ShortNumber
value={account.get('following_count')}
renderer={FollowingCounter}
/>
</NavLink>
<NavLink exact activeClassName='active' to={`/@${account.get('acct')}/followers`} title={intl.formatNumber(account.get('followers_count'))}>
<ShortNumber
value={account.get('followers_count')}
renderer={FollowersCounter}
/>
</NavLink>
</div>
</div>
)}
</div>
<Helmet>
<title>{titleFromAccount(account)}</title>
<meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />
<link rel='canonical' href={account.get('url')} />
</Helmet>
</div>
);
}
}
export default withRouter(withIdentity(injectIntl(Header)));

View file

@ -17,7 +17,7 @@ import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountGallery } from 'mastodon/selectors';
import { expandAccountMediaTimeline } from '../../actions/timelines';
import HeaderContainer from '../account_timeline/containers/header_container';
import { AccountHeader } from '../account_timeline/components/account_header';
import Column from '../ui/components/column';
import { MediaItem } from './components/media_item';
@ -207,7 +207,7 @@ class AccountGallery extends ImmutablePureComponent {
<ScrollContainer scrollKey='account_gallery'>
<div className='scrollable scrollable--flex' onScroll={this.handleScroll}>
<HeaderContainer accountId={this.props.accountId} />
<AccountHeader accountId={this.props.accountId} />
{(suspended || blockedBy) ? (
<div className='empty-column-indicator'>

File diff suppressed because it is too large Load diff

View file

@ -1,155 +0,0 @@
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { NavLink } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import InnerHeader from '../../account/components/header';
import MemorialNote from './memorial_note';
import MovedNote from './moved_note';
class Header extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.record,
onFollow: PropTypes.func.isRequired,
onBlock: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
onDirect: PropTypes.func.isRequired,
onReblogToggle: PropTypes.func.isRequired,
onReport: PropTypes.func.isRequired,
onMute: PropTypes.func.isRequired,
onBlockDomain: PropTypes.func.isRequired,
onUnblockDomain: PropTypes.func.isRequired,
onEndorseToggle: PropTypes.func.isRequired,
onAddToList: PropTypes.func.isRequired,
onChangeLanguages: PropTypes.func.isRequired,
onInteractionModal: PropTypes.func.isRequired,
onOpenAvatar: PropTypes.func.isRequired,
onOpenURL: PropTypes.func.isRequired,
hideTabs: PropTypes.bool,
domain: PropTypes.string.isRequired,
hidden: PropTypes.bool,
};
handleFollow = () => {
this.props.onFollow(this.props.account);
};
handleBlock = () => {
this.props.onBlock(this.props.account);
};
handleMention = () => {
this.props.onMention(this.props.account);
};
handleDirect = () => {
this.props.onDirect(this.props.account);
};
handleReport = () => {
this.props.onReport(this.props.account);
};
handleReblogToggle = () => {
this.props.onReblogToggle(this.props.account);
};
handleNotifyToggle = () => {
this.props.onNotifyToggle(this.props.account);
};
handleMute = () => {
this.props.onMute(this.props.account);
};
handleBlockDomain = () => {
this.props.onBlockDomain(this.props.account);
};
handleUnblockDomain = () => {
const domain = this.props.account.get('acct').split('@')[1];
if (!domain) return;
this.props.onUnblockDomain(domain);
};
handleEndorseToggle = () => {
this.props.onEndorseToggle(this.props.account);
};
handleAddToList = () => {
this.props.onAddToList(this.props.account);
};
handleEditAccountNote = () => {
this.props.onEditAccountNote(this.props.account);
};
handleChangeLanguages = () => {
this.props.onChangeLanguages(this.props.account);
};
handleInteractionModal = () => {
this.props.onInteractionModal(this.props.account);
};
handleOpenAvatar = () => {
this.props.onOpenAvatar(this.props.account);
};
render () {
const { account, hidden, hideTabs } = this.props;
if (account === null) {
return null;
}
return (
<div className='account-timeline__header'>
{(!hidden && account.get('memorial')) && <MemorialNote />}
{(!hidden && account.get('moved')) && <MovedNote from={account} to={account.get('moved')} />}
<InnerHeader
account={account}
onFollow={this.handleFollow}
onBlock={this.handleBlock}
onMention={this.handleMention}
onDirect={this.handleDirect}
onReblogToggle={this.handleReblogToggle}
onNotifyToggle={this.handleNotifyToggle}
onReport={this.handleReport}
onMute={this.handleMute}
onBlockDomain={this.handleBlockDomain}
onUnblockDomain={this.handleUnblockDomain}
onEndorseToggle={this.handleEndorseToggle}
onAddToList={this.handleAddToList}
onEditAccountNote={this.handleEditAccountNote}
onChangeLanguages={this.handleChangeLanguages}
onInteractionModal={this.handleInteractionModal}
onOpenAvatar={this.handleOpenAvatar}
onOpenURL={this.props.onOpenURL}
domain={this.props.domain}
hidden={hidden}
/>
{!(hideTabs || hidden) && (
<div className='account__section-headline'>
<NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Posts' /></NavLink>
<NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Posts and replies' /></NavLink>
<NavLink exact to={`/@${account.get('acct')}/media`}><FormattedMessage id='account.media' defaultMessage='Media' /></NavLink>
</div>
)}
</div>
);
}
}
export default Header;

View file

@ -1,153 +0,0 @@
import { injectIntl } from 'react-intl';
import { connect } from 'react-redux';
import { openURL } from 'mastodon/actions/search';
import {
followAccount,
unblockAccount,
unmuteAccount,
pinAccount,
unpinAccount,
} from '../../../actions/accounts';
import { initBlockModal } from '../../../actions/blocks';
import {
mentionCompose,
directCompose,
} from '../../../actions/compose';
import { initDomainBlockModal, unblockDomain } from '../../../actions/domain_blocks';
import { openModal } from '../../../actions/modal';
import { initMuteModal } from '../../../actions/mutes';
import { initReport } from '../../../actions/reports';
import { makeGetAccount, getAccountHidden } from '../../../selectors';
import Header from '../components/header';
const makeMapStateToProps = () => {
const getAccount = makeGetAccount();
const mapStateToProps = (state, { accountId }) => ({
account: getAccount(state, accountId),
domain: state.getIn(['meta', 'domain']),
hidden: getAccountHidden(state, accountId),
});
return mapStateToProps;
};
const mapDispatchToProps = (dispatch) => ({
onFollow (account) {
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
dispatch(openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }));
} else {
dispatch(followAccount(account.get('id')));
}
},
onInteractionModal (account) {
dispatch(openModal({
modalType: 'INTERACTION',
modalProps: {
type: 'follow',
accountId: account.get('id'),
url: account.get('uri'),
},
}));
},
onBlock (account) {
if (account.getIn(['relationship', 'blocking'])) {
dispatch(unblockAccount(account.get('id')));
} else {
dispatch(initBlockModal(account));
}
},
onMention (account) {
dispatch(mentionCompose(account));
},
onDirect (account) {
dispatch(directCompose(account));
},
onReblogToggle (account) {
if (account.getIn(['relationship', 'showing_reblogs'])) {
dispatch(followAccount(account.get('id'), { reblogs: false }));
} else {
dispatch(followAccount(account.get('id'), { reblogs: true }));
}
},
onEndorseToggle (account) {
if (account.getIn(['relationship', 'endorsed'])) {
dispatch(unpinAccount(account.get('id')));
} else {
dispatch(pinAccount(account.get('id')));
}
},
onNotifyToggle (account) {
if (account.getIn(['relationship', 'notifying'])) {
dispatch(followAccount(account.get('id'), { notify: false }));
} else {
dispatch(followAccount(account.get('id'), { notify: true }));
}
},
onReport (account) {
dispatch(initReport(account));
},
onMute (account) {
if (account.getIn(['relationship', 'muting'])) {
dispatch(unmuteAccount(account.get('id')));
} else {
dispatch(initMuteModal(account));
}
},
onBlockDomain (account) {
dispatch(initDomainBlockModal(account));
},
onUnblockDomain (domain) {
dispatch(unblockDomain(domain));
},
onAddToList (account) {
dispatch(openModal({
modalType: 'LIST_ADDER',
modalProps: {
accountId: account.get('id'),
},
}));
},
onChangeLanguages (account) {
dispatch(openModal({
modalType: 'SUBSCRIBED_LANGUAGES',
modalProps: {
accountId: account.get('id'),
},
}));
},
onOpenAvatar (account) {
dispatch(openModal({
modalType: 'IMAGE',
modalProps: {
src: account.get('avatar'),
alt: '',
},
}));
},
onOpenURL (url) {
return dispatch(openURL({ url }));
},
});
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Header));

View file

@ -11,7 +11,7 @@ import { TimelineHint } from 'mastodon/components/timeline_hint';
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
import { me } from 'mastodon/initial_state';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors';
import { getAccountHidden } from 'mastodon/selectors/accounts';
import { useAppSelector } from 'mastodon/store';
import { lookupAccount, fetchAccount } from '../../actions/accounts';
@ -22,8 +22,8 @@ import { LoadingIndicator } from '../../components/loading_indicator';
import StatusList from '../../components/status_list';
import Column from '../ui/components/column';
import { AccountHeader } from './components/account_header';
import { LimitedAccountHint } from './components/limited_account_hint';
import HeaderContainer from './containers/header_container';
const emptyList = ImmutableList();
@ -198,7 +198,7 @@ class AccountTimeline extends ImmutablePureComponent {
<ColumnBackButton />
<StatusList
prepend={<HeaderContainer accountId={this.props.accountId} hideTabs={forceEmptyState} tagged={this.props.params.tagged} />}
prepend={<AccountHeader accountId={this.props.accountId} hideTabs={forceEmptyState} tagged={this.props.params.tagged} />}
alwaysPrepend
append={remoteMessage}
scrollKey='account_timeline'

View file

@ -10,9 +10,10 @@ import { debounce } from 'lodash';
import { Account } from 'mastodon/components/account';
import { TimelineHint } from 'mastodon/components/timeline_hint';
import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header';
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors';
import { getAccountHidden } from 'mastodon/selectors/accounts';
import { useAppSelector } from 'mastodon/store';
import {
@ -25,7 +26,6 @@ import { ColumnBackButton } from '../../components/column_back_button';
import { LoadingIndicator } from '../../components/loading_indicator';
import ScrollableList from '../../components/scrollable_list';
import { LimitedAccountHint } from '../account_timeline/components/limited_account_hint';
import HeaderContainer from '../account_timeline/containers/header_container';
import Column from '../ui/components/column';
const mapStateToProps = (state, { params: { acct, id } }) => {
@ -168,7 +168,7 @@ class Followers extends ImmutablePureComponent {
hasMore={!forceEmptyState && hasMore}
isLoading={isLoading}
onLoadMore={this.handleLoadMore}
prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
prepend={<AccountHeader accountId={this.props.accountId} hideTabs />}
alwaysPrepend
append={remoteMessage}
emptyMessage={emptyMessage}

View file

@ -10,9 +10,10 @@ import { debounce } from 'lodash';
import { Account } from 'mastodon/components/account';
import { TimelineHint } from 'mastodon/components/timeline_hint';
import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header';
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
import { getAccountHidden } from 'mastodon/selectors';
import { getAccountHidden } from 'mastodon/selectors/accounts';
import { useAppSelector } from 'mastodon/store';
import {
@ -25,7 +26,6 @@ import { ColumnBackButton } from '../../components/column_back_button';
import { LoadingIndicator } from '../../components/loading_indicator';
import ScrollableList from '../../components/scrollable_list';
import { LimitedAccountHint } from '../account_timeline/components/limited_account_hint';
import HeaderContainer from '../account_timeline/containers/header_container';
import Column from '../ui/components/column';
const mapStateToProps = (state, { params: { acct, id } }) => {
@ -168,7 +168,7 @@ class Following extends ImmutablePureComponent {
hasMore={!forceEmptyState && hasMore}
isLoading={isLoading}
onLoadMore={this.handleLoadMore}
prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
prepend={<AccountHeader accountId={this.props.accountId} hideTabs />}
alwaysPrepend
append={remoteMessage}
emptyMessage={emptyMessage}

View file

@ -4,15 +4,16 @@
"about.disclaimer": "Mastodon ye software gratuito y de códigu llibre, y una marca rexistrada de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "El motivu nun ta disponible",
"about.domain_blocks.preamble": "Polo xeneral, Mastodon permítete ver el conteníu ya interactuar colos perfiles d'otros sirvidores nel fediversu. Estes son les esceiciones que se ficieron nesti sirvidor.",
"about.domain_blocks.silenced.explanation": "Polo xeneral, nun ves los perfiles ya'l conteníu d'esti sirvidor sacante que los busques o decidas siguilos.",
"about.domain_blocks.silenced.explanation": "Polo xeneral, nun ves los perfiles y el conteníu d'esti sirvidor sacante que los busques o decidas siguilos.",
"about.domain_blocks.silenced.title": "Llendóse",
"about.domain_blocks.suspended.explanation": "Nun se procesa, atroxa nin intercambia nengún datu d'esti sirvidor, lo que fai que cualesquier interaición o comunicación colos sos perfiles seya imposible.",
"about.domain_blocks.suspended.explanation": "Nun se procesa, atroxa nin intercambia nengún datu d'esti sirvidor, lo que fai imposible cualesquier interaición o comunicación colos sos perfiles.",
"about.domain_blocks.suspended.title": "Suspendióse",
"about.not_available": "Esta información nun ta disponible nesti sirvidor.",
"about.powered_by": "Una rede social descentralizada que tien la teunoloxía de {mastodon}",
"about.rules": "Normes del sirvidor",
"account.account_note_header": "Nota personal",
"account.add_or_remove_from_list": "Amestar o quitar de les llistes",
"account.badges.bot": "Automatizóse",
"account.badges.group": "Grupu",
"account.block": "Bloquiar a @{name}",
"account.block_domain": "Bloquiar el dominiu {domain}",
@ -25,7 +26,7 @@
"account.edit_profile": "Editar el perfil",
"account.enable_notifications": "Avisame cuando @{name} espublice artículos",
"account.endorse": "Destacar nel perfil",
"account.featured_tags.last_status_never": "Nun hai nengún artículu",
"account.featured_tags.last_status_never": "Nun hai nenguna publicación",
"account.featured_tags.title": "Etiquetes destacaes de: {name}",
"account.follow": "Siguir",
"account.follow_back": "Siguir tamién",
@ -107,6 +108,7 @@
"column.domain_blocks": "Dominios bloquiaos",
"column.edit_list": "Editar la llista",
"column.favourites": "Favoritos",
"column.firehose": "Feed en direuto",
"column.follow_requests": "Solicitúes de siguimientu",
"column.home": "Aniciu",
"column.lists": "Llistes",
@ -126,9 +128,9 @@
"community.column_settings.remote_only": "Namás lo remoto",
"compose.language.change": "Camudar la llingua",
"compose.language.search": "Buscar llingües…",
"compose.published.body": "Espublizóse l'artículu.",
"compose.published.body": "Publicóse la publicación.",
"compose.published.open": "Abrir",
"compose.saved.body": "Post guardáu.",
"compose.saved.body": "Guardóse la publicación.",
"compose_form.direct_message_warning_learn_more": "Saber más",
"compose_form.encryption_warning": "Los artículos de Mastodon nun tán cifraos de puntu a puntu. Nun compartas nengún tipu d'información sensible per Mastodon.",
"compose_form.lock_disclaimer": "La to cuenta nun ye {locked}. Cualesquier perfil pue siguite pa ver los artículos que son namás pa siguidores.",
@ -137,34 +139,33 @@
"compose_form.poll.option_placeholder": "Opción {number}",
"compose_form.poll.type": "Tipu",
"compose_form.publish": "Espublizar",
"compose_form.publish_form": "Artículu nuevu",
"compose_form.publish_form": "Publicación nueva",
"compose_form.reply": "Responder",
"confirmation_modal.cancel": "Encaboxar",
"confirmations.block.confirm": "Bloquiar",
"confirmations.delete.confirm": "Desaniciar",
"confirmations.delete.message": "¿De xuru que quies desaniciar esti artículu?",
"confirmations.delete.title": "¿Desaniciar l'artículu?",
"confirmations.delete.message": "¿De xuru que quies desaniciar esta publicación?",
"confirmations.delete.title": "¿Quies desaniciar esta publicación?",
"confirmations.delete_list.confirm": "Desaniciar",
"confirmations.delete_list.message": "¿De xuru que quies desaniciar permanentemente esta llista?",
"confirmations.delete_list.title": "¿Desaniciar la llista?",
"confirmations.delete_list.title": "¿Quies desaniciar la llista?",
"confirmations.discard_edit_media.confirm": "Escartar",
"confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "La edición va sobrescribir el mensaxe que tas escribiendo. ¿De xuru que quies siguir?",
"confirmations.follow_to_list.title": "¿Siguir al usuariu?",
"confirmations.logout.confirm": "Zarrar la sesión",
"confirmations.logout.message": "¿De xuru que quies zarrar la sesión?",
"confirmations.logout.title": "¿Zarrar la sesión?",
"confirmations.logout.title": "¿Quies zarrar la sesión?",
"confirmations.missing_alt_text.confirm": "Amestar testu alternativu",
"confirmations.missing_alt_text.title": "¿Quies amestar testu alternativu?",
"confirmations.redraft.confirm": "Desaniciar y reeditar",
"confirmations.redraft.message": "¿De xuru que quies desaniciar esti artículu y reeditalu? Van perdese los favoritos y comparticiones, y les rempuestes al artículu orixinal van quedar güérfanes.",
"confirmations.redraft.title": "¿Desaniciar ya reeditar l'artículu?",
"confirmations.redraft.title": "¿Desaniciar y reeditar la publicación?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder agora va sobrescribir el mensaxe que tas componiendo anguaño. ¿De xuru que quies siguir?",
"confirmations.unfollow.confirm": "Dexar de siguir",
"confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?",
"confirmations.unfollow.title": "¿Dexar de siguir al usuariu?",
"content_warning.hide": "Anubrir l'artículu",
"content_warning.hide": "Esconder la publicación",
"content_warning.show": "Amosar de toes toes",
"content_warning.show_more": "Amosar más",
"conversation.delete": "Desaniciar la conversación",
@ -186,7 +187,7 @@
"domain_block_modal.title": "Bloquiar el dominiu?",
"domain_pill.server": "Sirvidor",
"domain_pill.username": "Nome d'usuariu",
"embed.instructions": "Empotra esti artículu nel to sitiu web copiando'l códigu d'abaxo.",
"embed.instructions": "Empotra esta publicación nel to sitiu web copiando'l códigu d'abaxo.",
"embed.preview": "Va apaecer asina:",
"emoji_button.activity": "Actividá",
"emoji_button.flags": "Banderes",
@ -201,9 +202,9 @@
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viaxes y llugares",
"empty_column.account_suspended": "Cuenta suspendida",
"empty_column.account_timeline": "¡Equí nun hai nengún artículu!",
"empty_column.account_timeline": "¡Equí nun hai nenguna publicación!",
"empty_column.blocks": "Nun bloquiesti a nengún perfil.",
"empty_column.bookmarked_statuses": "Nun tienes nengún artículu en Marcadores. Cuando amiestes dalgún, apaez equí.",
"empty_column.bookmarked_statuses": "Nun tienes nenguna publicación en Marcadores. Cuando amiestes dalguna, va apaecer equí.",
"empty_column.direct": "Nun tienes nenguna mención privada. Cuando unvies o recibas dalguna, apaez equí.",
"empty_column.domain_blocks": "Nun hai nengún dominiu bloquiáu.",
"empty_column.explore_statuses": "Agora nun hai nada en tendencia. ¡Volvi equí dempués!",
@ -223,21 +224,21 @@
"explore.trending_links": "Noticies",
"explore.trending_statuses": "Artículos",
"explore.trending_tags": "Etiquetes",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esti artículu. Si tamién quies que se peñere l'artículu nesti contestu, tienes d'editar la peñera.",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esta publicación. Si tamién quies que se peñere la publicación nesti contestu, tienes d'editar la peñera.",
"filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de peñera caducó, tienes de camudar la so data de caducidá p'aplicala.",
"filter_modal.added.expired_title": "¡La peñera caducó!",
"filter_modal.added.review_and_configure": "Pa revisar y configurar a fondu esta categoría de peñera, vete a la {settings_link}.",
"filter_modal.added.review_and_configure_title": "Configuración de la peñera",
"filter_modal.added.settings_link": "páxina de configuración",
"filter_modal.added.short_explanation": "Esti artículu amestóse a la categoría de peñera siguiente: {title}.",
"filter_modal.added.short_explanation": "Esta publicación amestóse a la categoría de peñera siguiente: {title}.",
"filter_modal.added.title": "¡Amestóse la peñera!",
"filter_modal.select_filter.expired": "caducó",
"filter_modal.select_filter.prompt_new": "Categoría nueva: {name}",
"filter_modal.select_filter.search": "Buscar o crear",
"filter_modal.select_filter.subtitle": "Usa una categoría esistente o créala",
"filter_modal.select_filter.title": "Peñerar esti artículu",
"filter_modal.title.status": "Peñera d'un artículu",
"filter_modal.select_filter.title": "Peñerar esta publicación",
"filter_modal.title.status": "Peñera d'una publicación",
"firehose.all": "Tolos sirvidores",
"firehose.local": "Esti sirvidor",
"firehose.remote": "Otros sirvidores",
@ -285,20 +286,20 @@
"interaction_modal.on_another_server": "N'otru sirvidor",
"interaction_modal.on_this_server": "Nesti sirvidor",
"interaction_modal.title.follow": "Siguir a {name}",
"interaction_modal.title.reply": "Rempuesta al artículu de: {name}",
"interaction_modal.title.reply": "Rempuesta a la publicación de: {name}",
"interaction_modal.title.vote": "Vota na encuesta de {name}",
"intervals.full.days": "{number, plural, one {# día} other {# díes}}",
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
"intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}",
"keyboard_shortcuts.back": "Dir p'atrás",
"keyboard_shortcuts.blocked": "Abrir la llista de perfiles bloquiaos",
"keyboard_shortcuts.boost": "Compartir un artículu",
"keyboard_shortcuts.boost": "Compartir una publicación",
"keyboard_shortcuts.column": "Enfocar una columna",
"keyboard_shortcuts.compose": "Enfocar l'área de composición",
"keyboard_shortcuts.description": "Descripción",
"keyboard_shortcuts.direct": "p'abrir la columna de les menciones privaes",
"keyboard_shortcuts.down": "Baxar na llista",
"keyboard_shortcuts.enter": "Abrir un artículu",
"keyboard_shortcuts.enter": "Abrir una publicación",
"keyboard_shortcuts.federated": "Abrir la llinia de tiempu federada",
"keyboard_shortcuts.heading": "Atayos del tecláu",
"keyboard_shortcuts.home": "Abrir la llinia de tiempu del aniciu",
@ -312,12 +313,12 @@
"keyboard_shortcuts.open_media": "Abrir el conteníu mutimedia",
"keyboard_shortcuts.pinned": "Abrir la llista d'artículos fixaos",
"keyboard_shortcuts.profile": "Abrir el perfil del autor/a",
"keyboard_shortcuts.reply": "Responder a un artículu",
"keyboard_shortcuts.reply": "Responder a una publicación",
"keyboard_shortcuts.requests": "Abrir la llista de solicitúes de siguimientu",
"keyboard_shortcuts.search": "Enfocar la barra de busca",
"keyboard_shortcuts.start": "Abrir la columna «Entamar»",
"keyboard_shortcuts.toggle_sensitivity": "Amosar/esconder el conteníu multimedia",
"keyboard_shortcuts.toot": "Comenzar un artículu nuevu",
"keyboard_shortcuts.toot": "Escribir una publicación nueva",
"keyboard_shortcuts.unfocus": "Desenfocar l'área de composición/busca",
"keyboard_shortcuts.up": "Xubir na llista",
"lightbox.close": "Zarrar",
@ -377,9 +378,9 @@
"notification.mentioned_you": "{name} mentóte",
"notification.moderation-warning.learn_more": "Deprender más",
"notification.poll": "Finó una encuesta na que votesti",
"notification.reblog": "{name} compartió'l to artículu",
"notification.reblog": "{name} compartió la to publicación",
"notification.status": "{name} ta acabante d'espublizar",
"notification.update": "{name} editó un artículu",
"notification.update": "{name} editó una publicación",
"notification_requests.edit_selection": "Editar",
"notification_requests.exit_selection": "Fecho",
"notifications.clear": "Borrar los avisos",
@ -421,9 +422,10 @@
"poll.votes": "{votes, plural, one {# votu} other {# votos}}",
"poll_button.add_poll": "Amestar una encuesta",
"poll_button.remove_poll": "Quitar la encuesta",
"privacy.change": "Configurar la privacidá del artículu",
"privacy.change": "Configurar la privacidá de la publicación",
"privacy.direct.short": "Mención privada",
"privacy.private.short": "Siguidores",
"privacy.public.short": "Artículu públicu",
"privacy.public.short": "Publicación pública",
"privacy_policy.last_updated": "Data del últimu anovamientu: {date}",
"privacy_policy.title": "Política de privacidá",
"refresh": "Anovar",
@ -447,7 +449,7 @@
"report.category.subtitle": "Escueyi la meyor opción",
"report.category.title": "Dinos qué pasa con esti {type}",
"report.category.title_account": "perfil",
"report.category.title_status": "artículu",
"report.category.title_status": "publicación",
"report.close": "Fecho",
"report.comment.title": "¿Hai daqué más qu'habríemos saber?",
"report.forward": "Reunviar a {target}",
@ -467,7 +469,7 @@
"report.rules.subtitle": "Seleiciona tolo que s'axuste",
"report.rules.title": "¿Qué normes s'incumplen?",
"report.statuses.subtitle": "Seleiciona tolo que s'axuste",
"report.statuses.title": "¿Hai dalgún artículu qu'apoye esti informe?",
"report.statuses.title": "¿Hai dalguna publicación qu'apoye esti informe?",
"report.submit": "Unviar",
"report.target": "Informe de: {target}",
"report.thanks.take_action": "Equí tienes les opciones pa controlar qué ves en Mastodon:",
@ -476,7 +478,7 @@
"report.thanks.title_actionable": "Gracies pol informe, el casu yá ta n'investigación.",
"report.unfollow": "Dexar de siguir a @{name}",
"report.unfollow_explanation": "Sigues a esta cuenta. Pa dexar de ver los sos artículos nel to feed d'aniciu, dexa de siguila.",
"report_notification.attached_statuses": "{count, plural, one {Axuntóse {count} artículu} other {Axuntáronse {count} artículos}}",
"report_notification.attached_statuses": "{count, plural, one {Axuntóse {count} publicación} other {Axuntáronse {count} publicaciones}}",
"report_notification.categories.legal": "Llegal",
"report_notification.categories.legal_sentence": "conteníu illegal",
"report_notification.categories.spam": "Spam",
@ -489,6 +491,7 @@
"search.quick_action.go_to_hashtag": "Dir a la etiqueta {x}",
"search.quick_action.status_search": "Artículos que concasen con {x}",
"search.search_or_paste": "Busca o apiega una URL",
"search_popout.full_text_search_disabled_message": "Nun ta disponible nel dominiu {domain}.",
"search_popout.language_code": "códigu de llingua ISO",
"search_popout.options": "Opciones de busca",
"search_popout.quick_actions": "Aiciones rápides",
@ -500,22 +503,25 @@
"search_results.hashtags": "Etiquetes",
"search_results.see_all": "Ver too",
"search_results.statuses": "Artículos",
"server_banner.is_one_of_many": "{domain} ye unu de los munchos sirvidores independientes de Mastodon que pues usar pa participar nel fediversu.",
"server_banner.server_stats": "Estadístiques del sirvidor:",
"sign_in_banner.create_account": "Crear una cuenta",
"sign_in_banner.mastodon_is": "Mastodon ye la meyor manera de siguir al momentu qué pasa.",
"sign_in_banner.sign_in": "Aniciar la sesión",
"sign_in_banner.sso_redirect": "Aniciar la sesión o rexistrase",
"status.admin_account": "Abrir la interfaz de moderación pa @{name}",
"status.admin_domain": "Abrir la interfaz de moderación pa «{domain}»",
"status.admin_status": "Abrir esti artículu na interfaz de moderación",
"status.admin_status": "Abrir esta publicación na interfaz de moderación",
"status.block": "Bloquiar a @{name}",
"status.bookmark": "Meter en Marcadores",
"status.cannot_reblog": "Esti artículu nun se pue compartir",
"status.copy": "Copiar l'enllaz al artículu",
"status.cannot_reblog": "Esta publicación nun se pue compartir",
"status.copy": "Copiar l'enllaz a la publicación",
"status.delete": "Desaniciar",
"status.direct": "Mentar a @{name} per privao",
"status.direct_indicator": "Mención privada",
"status.edited_x_times": "Editóse {count, plural, one {{count} vegada} other {{count} vegaes}}",
"status.embed": "Consiguir el códigu pa empotrar",
"status.filter": "Peñerar esti artículu",
"status.filter": "Peñerar esta publicación",
"status.history.created": "{name} creó {date}",
"status.history.edited": "{name} editó {date}",
"status.load_more": "Cargar más",
@ -524,13 +530,13 @@
"status.more": "Más",
"status.mute": "Desactivar los avisos de @{name}",
"status.mute_conversation": "Desactivar los avisos de la conversación",
"status.open": "Espander esti artículu",
"status.open": "Espander esta publicación",
"status.pin": "Fixar nel perfil",
"status.pinned": "Artículu fixáu",
"status.pinned": "Publicación fixada",
"status.read_more": "Lleer más",
"status.reblog": "Compartir",
"status.reblogged_by": "{name} compartió",
"status.reblogs.empty": "Naide nun compartió esti artículu. Cuando daquién lo faiga, apaez equí.",
"status.reblogs.empty": "Naide nun compartió esta publicación. Cuando daquién lo faiga, va apaecer equí.",
"status.redraft": "Desaniciar y reeditar",
"status.remove_bookmark": "Desaniciar el marcador",
"status.replied_to": "En rempuesta a {name}",

View file

@ -696,6 +696,7 @@
"poll_button.remove_poll": "Elimina l'enquesta",
"privacy.change": "Canvia la privacitat del tut",
"privacy.direct.long": "Tothom mencionat a la publicació",
"privacy.direct.short": "Menció privada",
"privacy.private.long": "Només els vostres seguidors",
"privacy.private.short": "Seguidors",
"privacy.public.long": "Tothom dins o fora Mastodon",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Change post privacy",
"privacy.direct.long": "Everyone mentioned in the post",
"privacy.direct.short": "Private mention",
"privacy.private.long": "Only your followers",
"privacy.private.short": "Followers",
"privacy.public.long": "Anyone on and off Mastodon",

View file

@ -192,7 +192,7 @@
"compose_form.poll.switch_to_multiple": "Cambiar la encuesta para permitir múltiples opciones",
"compose_form.poll.switch_to_single": "Cambiar la encuesta para permitir una única opción",
"compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicación",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Nueva publicación",
"compose_form.reply": "Respuesta",
"compose_form.save_changes": "Actualización",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Bain suirbhé",
"privacy.change": "Athraigh príobháideacht postála",
"privacy.direct.long": "Luaigh gach duine sa phost",
"privacy.direct.short": "Tagairt phríobháideach",
"privacy.private.long": "Do leanúna amháin",
"privacy.private.short": "Leantóirí",
"privacy.public.long": "Duine ar bith ar agus amach Mastodon",

View file

@ -702,7 +702,7 @@
"privacy.private.short": "Follower",
"privacy.public.long": "Chiunque dentro e fuori Mastodon",
"privacy.public.short": "Pubblico",
"privacy.unlisted.additional": "",
"privacy.unlisted.additional": "Si comporta esattamente come pubblico, tranne per il fatto che il post non verrà visualizzato nei feed live o negli hashtag, nell'esplorazione o nella ricerca Mastodon, anche se hai attivato l'attivazione a livello di account.",
"privacy.unlisted.long": "Meno fanfare algoritmiche",
"privacy.unlisted.short": "Pubblico silenzioso",
"privacy_policy.last_updated": "Ultimo aggiornamento {date}",

View file

@ -86,6 +86,12 @@
"alert.unexpected.message": "Radās negaidīta kļūda.",
"alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Alt teksts",
"alt_text_modal.add_text_from_image": "Pievienot tekstu no attēla",
"alt_text_modal.cancel": "Atcelt",
"alt_text_modal.change_thumbnail": "Nomainīt sīktēlu",
"alt_text_modal.describe_for_people_with_hearing_impairments": "Aprakstīt šo cilvēkiem ar dzirdes traucējumiem…",
"alt_text_modal.describe_for_people_with_visual_impairments": "Aprakstīt šo cilvēkiem ar redzes traucējumiem…",
"alt_text_modal.done": "Gatavs",
"announcement.announcement": "Paziņojums",
"annual_report.summary.archetype.oracle": "Orākuls",
"annual_report.summary.archetype.replier": "Sabiedriskais tauriņš",
@ -205,6 +211,7 @@
"confirmations.logout.confirm": "Iziet",
"confirmations.logout.message": "Vai tiešām vēlies izrakstīties?",
"confirmations.logout.title": "Atteikties?",
"confirmations.missing_alt_text.secondary": "Vienalga iesūtīt",
"confirmations.mute.confirm": "Apklusināt",
"confirmations.redraft.confirm": "Dzēst un pārrakstīt",
"confirmations.redraft.message": "Vai tiešām vēlies dzēst šo ziņu un no jauna noformēt to? Izlase un pastiprinājumi tiks zaudēti, un atbildes uz sākotnējo ziņu tiks atstātas bez autoratlīdzības.",

View file

@ -3,7 +3,7 @@
"about.contact": "Hubungi:",
"about.disclaimer": "Mastodon ialah perisian sumber terbuka percuma, dan merupakan tanda dagangan Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Sebab tidak tersedia",
"about.domain_blocks.preamble": "Secara amnya, Mastodon membenarkan anda melihat kandungan daripada dan berinteraksi dengan pengguna daripada mana-mana pelayan dalam dunia persekutuan. Berikut ialah pengecualian yang telah dibuat pada pelayan ini secara khususnya.",
"about.domain_blocks.preamble": "Secara amnya, Mastodon membenarkan anda melihat kandungan pengguna daripada mana-mana pelayan dalam alam bersekutu dan berinteraksi dengan mereka. Berikut ialah pengecualian yang khusus pada pelayan ini.",
"about.domain_blocks.silenced.explanation": "Secara amnya, anda tidak akan melihat profil dan kandungan daripada pelayan ini, kecuali anda mencarinya secara khusus atau ikut serta dengan mengikutinya.",
"about.domain_blocks.silenced.title": "Terhad",
"about.domain_blocks.suspended.explanation": "Tiada data daripada pelayan ini yang akan diproses, disimpan atau ditukar, menjadikan sebarang interaksi atau perhubungan dengan pengguna daripada pelayan ini adalah mustahil.",
@ -19,7 +19,7 @@
"account.block_domain": "Sekat domain {domain}",
"account.block_short": "Malay",
"account.blocked": "Disekat",
"account.cancel_follow_request": "Menarik balik permintaan mengikut",
"account.cancel_follow_request": "Batalkan permintaan ikut",
"account.copy": "Salin pautan ke profil",
"account.direct": "Sebut secara persendirian @{name}",
"account.disable_notifications": "Berhenti maklumkan saya apabila @{name} mengirim hantaran",
@ -85,10 +85,45 @@
"alert.rate_limited.title": "Kadar terhad",
"alert.unexpected.message": "Berlaku ralat di luar jangkaan.",
"alert.unexpected.title": "Alamak!",
"alt_text_badge.title": "Teks alternatif",
"alt_text_modal.add_alt_text": "Tambah teks alternatif",
"alt_text_modal.add_text_from_image": "Tambah teks dari imej",
"alt_text_modal.cancel": "Batal",
"alt_text_modal.change_thumbnail": "Ubah imej kecil",
"alt_text_modal.describe_for_people_with_hearing_impairments": "Terangkan untuk OKU pendengaran…vorite\n",
"alt_text_modal.describe_for_people_with_visual_impairments": "Terangkan untuk OKU penglihatan…",
"alt_text_modal.done": "Selesai",
"announcement.announcement": "Pengumuman",
"annual_report.summary.archetype.booster": "Si pencapap",
"annual_report.summary.archetype.lurker": "Si penghendap",
"annual_report.summary.archetype.oracle": "Si penilik",
"annual_report.summary.archetype.pollster": "Si peninjau",
"annual_report.summary.archetype.replier": "Si peramah",
"annual_report.summary.followers.followers": "pengikut",
"annual_report.summary.followers.total": "sebanyak {count}",
"annual_report.summary.here_it_is": "Ini ulasan {year} anda:",
"annual_report.summary.highlighted_post.by_favourites": "hantaran paling disukai ramai",
"annual_report.summary.highlighted_post.by_reblogs": "hantaran paling digalak ramai",
"annual_report.summary.highlighted_post.by_replies": "hantaran paling dibalas ramai",
"annual_report.summary.highlighted_post.possessive": "oleh",
"annual_report.summary.most_used_app.most_used_app": "aplikasi paling banyak digunakan",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "tanda pagar paling banyak digunakan",
"annual_report.summary.most_used_hashtag.none": "Tiada",
"annual_report.summary.new_posts.new_posts": "hantaran baharu",
"annual_report.summary.percentile.text": "<topLabel>Anda berkedudukan</topLabel><percentage></percentage><bottomLabel> pengguna {domain}.</bottomLabel>",
"annual_report.summary.percentile.we_wont_tell_bernie": "Rahsia anda selamat bersama kami. ;)",
"annual_report.summary.thanks": "Terima kasih kerana setia bersama Mastodon!",
"attachments_list.unprocessed": "(belum diproses)",
"audio.hide": "Sembunyikan audio",
"block_modal.remote_users_caveat": "Kami akan meminta pelayan {domain} untuk menghormati keputusan anda. Bagaimanapun, pematuhan tidak dijamin kerana ada pelayan yang mungkin menangani sekatan dengan cara berbeza. Hantaran awam mungkin masih tampak kepada pengguna yang tidak log masuk.",
"block_modal.they_cant_mention": "Dia tidak boleh menyebut tentang anda atau mengikut anda.",
"block_modal.they_cant_see_posts": "Dia tidak boleh melihat hantaran anda dan sebaliknya.",
"block_modal.they_will_know": "Dia boleh lihat bahawa dia disekat.",
"block_modal.title": "Sekat pengguna?",
"block_modal.you_wont_see_mentions": "Anda tidak akan melihat hantaran yang menyebut tentangnya.",
"boost_modal.combo": "Anda boleh tekan {combo} untuk melangkauinya pada waktu lain",
"boost_modal.reblog": "Galakkan hantaran?",
"boost_modal.undo_reblog": "Nyahgalakkan hantaran?",
"bundle_column_error.copy_stacktrace": "Salin laporan ralat",
"bundle_column_error.error.body": "Halaman yang diminta gagal dipaparkan. Ini mungkin disebabkan oleh pepijat dalam kod kami, atau masalah keserasian pelayar.",
"bundle_column_error.error.title": "Alamak!",
@ -99,6 +134,7 @@
"bundle_column_error.routing.body": "Halaman tersebut tidak dapat ditemui. Adakah anda pasti URL dalam bar alamat adalah betul?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Tutup",
"bundle_modal_error.message": "Terdapat masalah yang dihadapi ketika memuat layar ini.",
"bundle_modal_error.retry": "Cuba lagi",
"closed_registrations.other_server_instructions": "Oleh sebab Mastodon terpencar, anda boleh mencipta akaun pada pelayan lain dan masih berinteraksi dengan pelayan ini.",
"closed_registrations_modal.description": "Mencipta akaun pada {domain} tidak dapat dibuat sekarang, tetapi sila ingat bahawa anda tidak memerlukan akaun khususnya pada {domain} untuk menggunakan Mastodon.",
@ -109,13 +145,16 @@
"column.blocks": "Pengguna yang disekat",
"column.bookmarks": "Tanda buku",
"column.community": "Garis masa tempatan",
"column.create_list": "Cipta senarai",
"column.direct": "Sebutan peribadi",
"column.directory": "Layari profil",
"column.domain_blocks": "Domain disekat",
"column.favourites": "Kegemaran",
"column.edit_list": "Sunting senarai",
"column.favourites": "Sukaan",
"column.firehose": "Suapan langsung",
"column.follow_requests": "Permintaan ikutan",
"column.home": "Laman Utama",
"column.list_members": "Urus ahli senarai",
"column.lists": "Senarai",
"column.mutes": "Pengguna yang dibisukan",
"column.notifications": "Pemberitahuan",
@ -128,6 +167,7 @@
"column_header.pin": "Sematkan",
"column_header.show_settings": "Tunjukkan tetapan",
"column_header.unpin": "Nyahsemat",
"column_search.cancel": "Batal",
"column_subheading.settings": "Tetapan",
"community.column_settings.local_only": "Tempatan sahaja",
"community.column_settings.media_only": "Media sahaja",
@ -146,6 +186,7 @@
"compose_form.poll.duration": "Tempoh undian",
"compose_form.poll.multiple": "Pelbagai pilihan",
"compose_form.poll.option_placeholder": "Pilihan {number}",
"compose_form.poll.single": "Satu pilihan",
"compose_form.poll.switch_to_multiple": "Ubah kepada membenarkan aneka undian",
"compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal",
"compose_form.poll.type": "Gaya",
@ -160,17 +201,26 @@
"confirmations.block.confirm": "Sekat",
"confirmations.delete.confirm": "Padam",
"confirmations.delete.message": "Adakah anda pasti anda ingin memadam hantaran ini?",
"confirmations.delete.title": "Padam hantaran?",
"confirmations.delete_list.confirm": "Padam",
"confirmations.delete_list.message": "Adakah anda pasti anda ingin memadam senarai ini secara kekal?",
"confirmations.delete_list.title": "Padam senarai?",
"confirmations.discard_edit_media.confirm": "Singkir",
"confirmations.discard_edit_media.message": "Anda belum menyimpan perubahan pada penerangan atau pratonton media. Anda ingin membuangnya?",
"confirmations.edit.confirm": "Sunting",
"confirmations.edit.message": "Mengedit sekarang akan menimpa mesej yang sedang anda karang. Adakah anda pasti mahu meneruskan?",
"confirmations.edit.title": "Tulis ganti hantaran?",
"confirmations.follow_to_list.confirm": "Ikut dan tambah ke senarai",
"confirmations.follow_to_list.message": "Anda mesti mengikuti {name} untuk tambahkannya ke senarai.",
"confirmations.follow_to_list.title": "Ikut pengguna?",
"confirmations.logout.confirm": "Log keluar",
"confirmations.logout.message": "Adakah anda pasti anda ingin log keluar?",
"confirmations.logout.title": "Log keluar?",
"confirmations.missing_alt_text.confirm": "Tambah teks alternatif",
"confirmations.missing_alt_text.message": "Hantaran anda mempunyai media tanpa teks alternatif. Kandungan anda akan lebih mudah tercapai jika anda menambah keterangan.",
"confirmations.mute.confirm": "Bisukan",
"confirmations.redraft.confirm": "Padam & rangka semula",
"confirmations.redraft.message": "Adakah anda pasti anda ingin memadam pos ini dan merangkanya semula? Kegemaran dan galakan akan hilang, dan balasan ke pos asal akan menjadi yatim.",
"confirmations.redraft.message": "Adakah anda pasti anda ingin memadam hantaran ini dan gubal semula? Sukaan dan galakan akan hilang, dan balasan ke hantaran asal akan menjadi yatim.",
"confirmations.reply.confirm": "Balas",
"confirmations.reply.message": "Membalas sekarang akan menulis ganti mesej yang anda sedang karang. Adakah anda pasti anda ingin teruskan?",
"confirmations.unfollow.confirm": "Nyahikut",
@ -182,7 +232,7 @@
"copy_icon_button.copied": "Disalin ke papan klip",
"copypaste.copied": "Disalin",
"copypaste.copy_to_clipboard": "Salin ke papan klip",
"directory.federated": "Dari fediverse yang diketahui",
"directory.federated": "Dari alam bersekutu yang diketahui",
"directory.local": "Dari {domain} sahaja",
"directory.new_arrivals": "Ketibaan baharu",
"directory.recently_active": "Aktif baru-baru ini",
@ -190,6 +240,7 @@
"disabled_account_banner.text": "Akaun anda {disabledAccount} telah dinyahaktif.",
"dismissable_banner.community_timeline": "Inilah hantaran awam terkini daripada orang yang akaun dihos oleh {domain}.",
"dismissable_banner.dismiss": "Ketepikan",
"dismissable_banner.explore_statuses": "Hantaran-hantaran dari seluruh alam bersekutu ini sedang sohor. Hantaran terbaharu dengan lebih banyak galakan dan sukaan diberi kedudukan lebih tinggi.",
"embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.",
"embed.preview": "Begini rupanya nanti:",
"emoji_button.activity": "Aktiviti",
@ -217,8 +268,8 @@
"empty_column.direct": "Anda belum mempunyai sebarang sebutan peribadi lagi. Apabila anda menghantar atau menerima satu, ia akan dipaparkan di sini.",
"empty_column.domain_blocks": "Belum ada domain yang disekat.",
"empty_column.explore_statuses": "Tiada apa-apa yang sohor kini sekarang. Semaklah kemudian!",
"empty_column.favourited_statuses": "Anda belum mempunyai sebarang pos kegemaran. Apabila anda kegemaran, ia akan dipaparkan di sini.",
"empty_column.favourites": "Tiada siapa yang menggemari pos ini lagi. Apabila seseorang melakukannya, mereka akan muncul di sini.",
"empty_column.favourited_statuses": "Anda belum mempunyai sebarang hantaran sukaan lagi. Hantaran akan muncul di sini apabila disukai oleh anda.",
"empty_column.favourites": "Hantaran ini belum disukai mana-mana pengguna lagi. Pengguna yang menyukai akan muncul di sini.",
"empty_column.follow_requests": "Anda belum mempunyai permintaan ikutan. Ia akan terpapar di sini apabila ada nanti.",
"empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.",
"empty_column.hashtag": "Belum ada apa-apa dengan tanda pagar ini.",
@ -300,9 +351,10 @@
"home.pending_critical_update.link": "Lihat pengemaskinian",
"home.pending_critical_update.title": "Kemas kini keselamatan kritikal tersedia!",
"home.show_announcements": "Tunjukkan pengumuman",
"interaction_modal.action.favourite": "Untuk sambung, anda perlu suka dari akaun anda.",
"interaction_modal.on_another_server": "Di pelayan lain",
"interaction_modal.on_this_server": "Pada pelayan ini",
"interaction_modal.title.favourite": "Pos {name} kegemaran",
"interaction_modal.title.favourite": "Suka hantaran {name}",
"interaction_modal.title.follow": "Ikuti {name}",
"interaction_modal.title.reblog": "Galak hantaran {name}",
"interaction_modal.title.reply": "Balas siaran {name}",
@ -318,8 +370,8 @@
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "Buka hantaran",
"keyboard_shortcuts.favourite": "Pos kegemaran",
"keyboard_shortcuts.favourites": "Buka senarai kegemaran",
"keyboard_shortcuts.favourite": "Suka hantaran",
"keyboard_shortcuts.favourites": "Buka senarai sukaan",
"keyboard_shortcuts.federated": "to open federated timeline",
"keyboard_shortcuts.heading": "Pintasan papan kekunci",
"keyboard_shortcuts.home": "to open home timeline",
@ -367,7 +419,7 @@
"navigation_bar.discover": "Teroka",
"navigation_bar.domain_blocks": "Domain disekat",
"navigation_bar.explore": "Teroka",
"navigation_bar.favourites": "Kegemaran",
"navigation_bar.favourites": "Sukaan",
"navigation_bar.filters": "Perkataan yang dibisukan",
"navigation_bar.follow_requests": "Permintaan ikutan",
"navigation_bar.followed_tags": "Ikuti hashtag",
@ -385,11 +437,15 @@
"not_signed_in_indicator.not_signed_in": "Anda perlu daftar masuk untuk mencapai sumber ini.",
"notification.admin.report": "{name} melaporkan {target}",
"notification.admin.sign_up": "{name} mendaftar",
"notification.favourite": "{name} menggemari pos anda",
"notification.favourite": "{name} menyukai hantaran anda",
"notification.favourite.name_and_others_with_link": "{name} dan <a>{count, plural, other {# orang lain}}</a> telah suka hantaran anda",
"notification.favourite_pm": "{name} menyukai sebutan persendirian anda",
"notification.favourite_pm.name_and_others_with_link": "{name} dan <a>{count, plural, other {# orang lain}}</a> telah suka sebutan persendirian anda",
"notification.follow": "{name} mengikuti anda",
"notification.follow_request": "{name} meminta untuk mengikuti anda",
"notification.own_poll": "Undian anda telah tamat",
"notification.reblog": "{name} menggalak hantaran anda",
"notification.reblog.name_and_others_with_link": "{name} dan <a>{count, plural, other {# orang lain}}</a> telah galakkan hantaran anda",
"notification.status": "{name} baru sahaja mengirim hantaran",
"notification.update": "{name} menyunting hantaran",
"notifications.clear": "Buang pemberitahuan",
@ -397,7 +453,7 @@
"notifications.column_settings.admin.report": "Laporan baru:",
"notifications.column_settings.admin.sign_up": "Pendaftaran baru:",
"notifications.column_settings.alert": "Pemberitahuan atas meja",
"notifications.column_settings.favourite": "Kegemaran:",
"notifications.column_settings.favourite": "Sukaan:",
"notifications.column_settings.follow": "Pengikut baharu:",
"notifications.column_settings.follow_request": "Permintaan ikutan baharu:",
"notifications.column_settings.mention": "Sebutan:",
@ -412,7 +468,7 @@
"notifications.column_settings.update": "Suntingan:",
"notifications.filter.all": "Semua",
"notifications.filter.boosts": "Galakan",
"notifications.filter.favourites": "Kegemaran",
"notifications.filter.favourites": "Sukaan",
"notifications.filter.follows": "Ikutan",
"notifications.filter.mentions": "Sebutan",
"notifications.filter.polls": "Keputusan undian",
@ -546,7 +602,7 @@
"status.admin_status": "Buka hantaran ini dalam antara muka penyederhanaan",
"status.block": "Sekat @{name}",
"status.bookmark": "Tanda buku",
"status.cancel_reblog_private": "Nyahgalak",
"status.cancel_reblog_private": "Nyahgalakkan",
"status.cannot_reblog": "Hantaran ini tidak boleh digalakkan",
"status.copy": "Salin pautan ke hantaran",
"status.delete": "Padam",
@ -555,7 +611,8 @@
"status.direct_indicator": "Sebutan peribadi",
"status.edit": "Sunting",
"status.edited_x_times": "Disunting {count, plural, other {{count} kali}}",
"status.favourite": "Kegemaran",
"status.favourite": "Suka",
"status.favourites": "{count, plural, other {sukaan}}",
"status.filter": "Tapiskan hantaran ini",
"status.history.created": "{name} mencipta pada {date}",
"status.history.edited": "{name} menyunting pada {date}",
@ -572,11 +629,13 @@
"status.pinned": "Hantaran disemat",
"status.read_more": "Baca lagi",
"status.reblog": "Galakkan",
"status.reblog_private": "Galakkan dengan kebolehlihatan asal",
"status.reblogged_by": "{name} telah menggalakkan",
"status.reblogs.empty": "Tiada sesiapa yang menggalak hantaran ini. Apabila ada yang menggalak, ia akan muncul di sini.",
"status.reblog_private": "Galakkan dengan ketampakan asal",
"status.reblogged_by": "{name} galakkan",
"status.reblogs": "{count, plural, other {galakan}}",
"status.reblogs.empty": "Tiada sesiapa yang galakkan hantaran ini. Apabila ada yang galakkan, hantaran akan muncul di sini.",
"status.redraft": "Padam & rangka semula",
"status.remove_bookmark": "Buang tanda buku",
"status.remove_favourite": "Padam dari sukaan",
"status.replied_to": "Menjawab kepada {name}",
"status.reply": "Balas",
"status.replyAll": "Balas ke bebenang",
@ -612,6 +671,8 @@
"upload_button.label": "Tambah fail imej, video atau audio",
"upload_error.limit": "Sudah melebihi had muat naik.",
"upload_error.poll": "Tidak boleh memuat naik fail bersama undian.",
"upload_form.drag_and_drop.instructions": "Untuk mengangkat lampiran media, tekan jarak atau enter. Ketika menarik, gunakan kekunci anak panah untuk menggerakkan lampiran media pada mana-mana arah. Tekan jarak atau enter untuk melepaskan lampiran media pada kedudukan baharunya, atau tekan keluar untuk batalkan.",
"upload_form.drag_and_drop.on_drag_cancel": "Seretan dibatalkan. Lampiran media {item} dilepaskan.",
"upload_form.edit": "Sunting",
"upload_progress.label": "Memuat naik...",
"upload_progress.processing": "Memproses…",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Fjern rundspørjing",
"privacy.change": "Endre personvernet på innlegg",
"privacy.direct.long": "Alle nemnde i innlegget",
"privacy.direct.short": "Privat omtale",
"privacy.private.long": "Berre dei som fylgjer deg",
"privacy.private.short": "Fylgjarar",
"privacy.public.long": "Kven som helst på og av Mastodon",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Usuń ankietę",
"privacy.change": "Dostosuj widoczność wpisów",
"privacy.direct.long": "Wszyscy wzmiankowani w tym wpisie",
"privacy.direct.short": "Wzmianka bezpośrednia",
"privacy.private.long": "Tylko obserwujący",
"privacy.private.short": "Obserwujący",
"privacy.public.long": "Każdy na i poza Mastodon",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Remover sondagem",
"privacy.change": "Alterar a privacidade da publicação",
"privacy.direct.long": "Todos os mencionados na publicação",
"privacy.direct.short": "Menção privada",
"privacy.private.long": "Apenas os teus seguidores",
"privacy.private.short": "Seguidores",
"privacy.public.long": "Qualquer pessoa no Mastodon ou não",

View file

@ -697,6 +697,7 @@
"poll_button.remove_poll": "Удалить опрос",
"privacy.change": "Изменить видимость поста",
"privacy.direct.long": "Все упомянутые в посте",
"privacy.direct.short": "Личное упоминание",
"privacy.private.long": "Только ваши подписчики",
"privacy.private.short": "Подписчики",
"privacy.public.long": "Любой, находящийся на Mastodon и вне его",

View file

@ -700,7 +700,7 @@
"privacy.direct.short": "私下提及",
"privacy.private.long": "仅限你的关注者",
"privacy.private.short": "关注者",
"privacy.public.long": "",
"privacy.public.long": "所有 Mastodon 内外的人",
"privacy.public.short": "公开",
"privacy.unlisted.additional": "此模式的行为与“公开”类似,只是嘟文不会出现在实时动态、话题、探索或 Mastodon 搜索页面中,即使您已全局开启了对应的发现设置。",
"privacy.unlisted.long": "减少算法影响",

View file

@ -0,0 +1,24 @@
interface BaseMenuItem {
text: string;
dangerous?: boolean;
}
interface ActionMenuItem extends BaseMenuItem {
action: () => void;
}
interface LinkMenuItem extends BaseMenuItem {
to: string;
}
interface ExternalLinkMenuItem extends BaseMenuItem {
href: string;
}
export type MenuItem =
| ActionMenuItem
| LinkMenuItem
| ExternalLinkMenuItem
| null;
export type DropdownMenu = MenuItem[];

View file

@ -1,6 +1,7 @@
import { createSelector } from '@reduxjs/toolkit';
import { Record as ImmutableRecord } from 'immutable';
import { me } from 'mastodon/initial_state';
import { accountDefaultValues } from 'mastodon/models/account';
import type { Account, AccountShape } from 'mastodon/models/account';
import type { Relationship } from 'mastodon/models/relationship';
@ -45,3 +46,16 @@ export function makeGetAccount() {
},
);
}
export const getAccountHidden = createSelector(
[
(state: RootState, id: string) => state.accounts.get(id)?.hidden,
(state: RootState, id: string) =>
state.relationships.get(id)?.following ||
state.relationships.get(id)?.requested,
(state: RootState, id: string) => id === me,
],
(hidden, followingOrRequested, isSelf) => {
return hidden && !(isSelf || followingOrRequested);
},
);

View file

@ -99,21 +99,17 @@ export const getAccountGallery = createSelector([
let medias = ImmutableList();
statusIds.forEach(statusId => {
const status = statuses.get(statusId).set('account', account);
let status = statuses.get(statusId);
if (status) {
status = status.set('account', account);
medias = medias.concat(status.get('media_attachments').map(media => media.set('status', status)));
}
});
return medias;
});
export const getAccountHidden = createSelector([
(state, id) => state.getIn(['accounts', id, 'hidden']),
(state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']),
(state, id) => id === me,
], (hidden, followingOrRequested, isSelf) => {
return hidden && !(isSelf || followingOrRequested);
});
export const getStatusList = createSelector([
(state, type) => state.getIn(['status_lists', type, 'items']),
], (items) => items.toList());

View file

@ -7,6 +7,10 @@ module Notification::Groups
GROUPABLE_NOTIFICATION_TYPES = %i(favourite reblog follow).freeze
MAXIMUM_GROUP_SPAN_HOURS = 12
included do
scope :by_group_key, ->(group_key) { group_key&.start_with?('ungrouped-') ? where(id: group_key.delete_prefix('ungrouped-')) : where(group_key: group_key) }
end
def set_group_key!
return if filtered? || GROUPABLE_NOTIFICATION_TYPES.exclude?(type)

View file

@ -13,6 +13,7 @@ class TermsOfService::Generator
dmca_email
domain
jurisdiction
choice_of_law
).freeze
attr_accessor(*VARIABLES)

View file

@ -22,6 +22,9 @@
.fields-group
= form.input :jurisdiction, wrapper: :with_label
.fields-group
= form.input :choice_of_law, wrapper: :with_label
.fields-group
= form.input :admin_email, wrapper: :with_label

View file

@ -122,7 +122,7 @@ class Rack::Attack
end
throttle('throttle_email_confirmations/ip', limit: 25, period: 5.minutes) do |req|
req.throttleable_remote_ip if req.post? && (req.path_matches?('/auth/confirmation') || req.path == '/api/v1/emails/confirmations')
req.throttleable_remote_ip if (req.post? && (req.path_matches?('/auth/confirmation') || req.path == '/api/v1/emails/confirmations')) || ((req.put? || req.patch?) && req.path_matches?('/auth/setup'))
end
throttle('throttle_email_confirmations/email', limit: 5, period: 30.minutes) do |req|
@ -133,6 +133,14 @@ class Rack::Attack
end
end
throttle('throttle_auth_setup/email', limit: 5, period: 10.minutes) do |req|
req.params.dig('user', 'email').presence if (req.put? || req.patch?) && req.path_matches?('/auth/setup')
end
throttle('throttle_auth_setup/account', limit: 5, period: 10.minutes) do |req|
req.warden_user_id if (req.put? || req.patch?) && req.path_matches?('/auth/setup')
end
throttle('throttle_login_attempts/ip', limit: 25, period: 5.minutes) do |req|
req.throttleable_remote_ip if req.post? && req.path_matches?('/auth/sign_in')
end

View file

@ -9,8 +9,8 @@ ast:
last_active: última actividá
nothing_here: "¡Equí nun hai nada!"
posts:
one: Artículu
other: Artículos
one: Publicación
other: Publicaciones
posts_tab_heading: Artículos
admin:
account_actions:
@ -76,7 +76,7 @@ ast:
destroy_announcement_html: "%{name} desanició l'anunciu «%{target}»"
destroy_custom_emoji_html: "%{name} desanició'l fustaxe %{target}"
destroy_domain_block_html: "%{name} desbloquió'l dominiu %{target}"
destroy_status_html: "%{name} quitó l'artículu de: %{target}"
destroy_status_html: "%{name} quitó la publicación de: %{target}"
destroy_user_role_html: "%{name} desanició'l rol %{target}"
disable_custom_emoji_html: "%{name} desactivó'l fustaxe «%{target}»"
enable_custom_emoji_html: "%{name} activó'l fustaxe «%{target}»"
@ -87,7 +87,7 @@ ast:
unblock_email_account_html: "%{name} desbloquió la direición de corréu electrónicu de: %{target}"
update_announcement_html: "%{name} anovó l'anunciu «%{target}»"
update_custom_emoji_html: "%{name} anovó'l fustaxe «%{target}»"
update_status_html: "%{name} anovó l'artículu de: %{target}"
update_status_html: "%{name} anovó la publicación de: %{target}"
update_user_role_html: "%{name} camudó'l rol %{target}"
empty: Nun s'atopó nengún rexistru.
announcements:
@ -100,7 +100,7 @@ ast:
create: Crear l'anunciu
title: Anunciu nuevu
publish: Espublizar
published_msg: "¡L'anunciu espublizóse correutamente!"
published_msg: "¡L'anunciu publicóse correutamente!"
scheduled_msg: "¡Programóse l'espublizamientu del anunciu!"
title: Anuncios
unpublish: Dexar d'espublizar
@ -347,14 +347,14 @@ ast:
back_to_account: Volver a la páxina de la cuenta
language: Llingua
metadata: Metadatos
original_status: Artículu orixinal
original_status: Publicación orixinal
visibility: Visibilidá
with_media: Con elementos multimedia
strikes:
actions:
delete_statuses: "%{name} desanició l'artículu de: %{target}"
delete_statuses: "%{name} desanició la publicación de: %{target}"
disable: "%{name} conxeló la cuenta de: %{target}"
mark_statuses_as_sensitive: "%{name} marcó l'artículu de %{target} como sensible"
mark_statuses_as_sensitive: "%{name} marcó la publicación de %{target} como sensible"
none: "%{name} unvió una alvertencia a %{target}"
sensitive: "%{name} marcó la cuenta de %{target} como sensible"
suspend: "%{name} suspendió la cuenta de: %{target}"
@ -375,8 +375,8 @@ ast:
preview_card_providers:
title: Espublizadores
statuses:
allow: Permitir l'artículu
disallow: Refugar l'artículu
allow: Permitir la publicación
disallow: Refugar la publicación
title: Artículos en tendencia
tags:
current_score: 'Puntuación total: %{score}'
@ -459,6 +459,10 @@ ast:
logout: Zarrar la sesión
migrate_account: Cambéu de cuenta
migrate_account_html: Si quies redirixir esta cuenta a otra diferente, pues <a href="%{path}">configurar esta opción equí</a>.
progress:
confirm: Confirmación del corréu electrónicu
details: Los tos detalles
rules: Aceptación de normes
providers:
cas: CAS
saml: SAML
@ -470,6 +474,8 @@ ast:
security: Seguranza
setup:
link_not_received: "¿Nun consiguiesti l'enllaz?"
sign_in:
preamble_html: Anicia la sesión coles credenciales del dominiu <strong>%{domain}</strong>. Si la to cuenta ta agospiada n'otru sirvidor, nun vas ser a aniciar la sesión equí.
sign_up:
title: 'Creación d''una cuenta en: %{domain}.'
status:
@ -515,8 +521,8 @@ ast:
created_at: Data
recipient: Dirixóse a
reject_appeal: Refugar l'apellación
status: 'Artículu #%{id}'
status_removed: L'artículu yá se quitó del sistema
status: 'Publicación #%{id}'
status_removed: La publicación yá se quitó del sistema
your_appeal_approved: Aprobóse la to apellación
your_appeal_pending: Unviesti una apellación
your_appeal_rejected: Refugóse la to apellación
@ -572,8 +578,8 @@ ast:
one: "%{count} pallabra clave"
other: "%{count} pallabres claves"
statuses:
one: "%{count} artículu"
other: "%{count} artículos"
one: "%{count} publicación"
other: "%{count} publicaciones"
title: Peñeres
new:
title: Amestar una peñera
@ -637,7 +643,7 @@ ast:
successful_sign_in_html: Anicióse correutamente la sesión col métodu «%{method}» dende %{ip} (%{browser})
media_attachments:
validations:
images_and_video: Nun se pue axuntar nengún videu a un artículu que yá contién imáxenes
images_and_video: Nun se pue axuntar nengún videu a una publicación que yá contién imáxenes
too_many: Nun se puen axuntar más de 4 ficheros
migrations:
errors:
@ -654,7 +660,7 @@ ast:
sign_up:
subject: "%{name} rexistróse"
favourite:
subject: "%{name} marcó'l to artículu como favoritu"
subject: "%{name} marcó la to publicación como favorita"
follow:
body: "¡Agora %{name} siguete!"
subject: "%{name} ta siguiéndote"
@ -666,10 +672,10 @@ ast:
subject: "%{name} mentóte"
title: Mención nueva
reblog:
body: "%{name} compartió'l to artículu:"
subject: "%{name} compartió'l to artículu"
body: "%{name} compartió la to publicación:"
subject: "%{name} compartió la to publicación"
update:
subject: "%{name} editó un artículu"
subject: "%{name} editó una publicación"
notifications:
email_events_hint: 'Seleiciona los eventos de los que quies recibir avisos:'
number:
@ -798,12 +804,12 @@ ast:
other: "%{count} vídeos"
default_language: La mesma que la de la interfaz
errors:
in_reply_not_found: L'artículu al que tentes de responder paez que nun esiste.
in_reply_not_found: La publicación a la que tentes de responder paez que nun esiste.
pin_errors:
direct: Nun se puen fixar los artículos que son visibles namás pa los usuarios mentaos
limit: Yá fixesti'l númberu máximu d'artículos
ownership: Nun se pue fixar l'artículu d'otru perfil
reblog: Nun se pue fixar un artículu compartíu
ownership: Nun se pue fixar la publicación d'otru perfil
reblog: Nun se pue fixar una publicación compartida
title: "%{name}: «%{quote}»"
visibilities:
direct: Mensaxe direutu
@ -817,12 +823,12 @@ ast:
keep_direct: Caltener los mensaxes direutos
keep_direct_hint: Nun desanicia nengún mensaxe direutu
keep_media: Caltener los artículos con elementos multimedia
keep_media_hint: Nun desanicia nengún artículu de to que contenta elementos multimedia
keep_media_hint: Nun desanicia nenguna publicación de to que contenta elementos multimedia
keep_pinned: Caltener los artículos fixaos
keep_polls: Caltener les encuestes
keep_polls_hint: Nun desanicia nenguna encuesta de to
keep_self_bookmark: Caltener los artículos que metieres en Marcadores
keep_self_bookmark_hint: Nun desanicia nengún artículu que metieres en Marcadores
keep_self_bookmark_hint: Nun desanicia nenguna publicación que metieres en Marcadores
min_age:
'1209600': 2 selmanes
'15778476': 6 meses

View file

@ -25,7 +25,7 @@ fr:
edit: Modifier
submit: Envoyer
confirmations:
destroy: En êtes-vous sûr ?
destroy: En êtes-vous certain ?
edit:
title: Modifier lapplication
form:

View file

@ -126,7 +126,7 @@ ms:
bookmarks: Penanda buku
conversations: Perbualan
crypto: Penyulitan hujung ke hujung
favourites: Kegemaran
favourites: Sukaan
filters: Penapis
follow: Ikut, Senyap dan Blok
follows: Ikutan
@ -169,7 +169,7 @@ ms:
read:accounts: lihat maklumat akaun
read:blocks: lihat blok anda
read:bookmarks: lihat penanda halaman anda
read:favourites: lihat kegemaran anda
read:favourites: lihat sukaan anda
read:filters: lihat penapis anda
read:follows: lihat senarai yang anda ikuti
read:lists: lihat senarai anda
@ -183,7 +183,7 @@ ms:
write:blocks: domain dan akaun blok
write:bookmarks: menandabuku hantaran
write:conversations: senyapkan dan padamkan perbualan
write:favourites: pos kesukaan
write:favourites: hantaran disukai
write:filters: cipta penapis
write:follows: ikut orang
write:lists: cipta senarai

View file

@ -353,7 +353,7 @@ lt:
opened_reports: atidaryti ataskaitos
pending_appeals_html:
few: "<strong>%{count}</strong> laukiantys apeliacijos"
many: "<strong>%{count}</strong> laukiama apeliacija"
many: "<strong>%{count}</strong> laukiamos apeliacijos"
one: "<strong>%{count}</strong> laukiama apeliacija"
other: "<strong>%{count}</strong> laukiančių apeliacijų"
pending_reports_html:

View file

@ -445,6 +445,7 @@ lv:
one: "%{count} mēģinājums pagājušajā nedēļā"
other: "%{count} reģistrēšanās mēģinājumi pagājušajā nedēļā"
zero: "%{count} mēģinājumu pagājušajā nedēļā"
created_msg: Sekmīgi liegts e-pasta domēns
delete: Dzēst
dns:
types:
@ -453,6 +454,7 @@ lv:
new:
create: Pievienot domēnu
resolve: Atrisināt domēnu
title: Liegt jaunu e-pasta domēnu
not_permitted: Nav atļauta
resolved_through_html: Atrisināts, izmantojot %{domain}
title: Bloķētie e-pasta domēni

View file

@ -756,7 +756,7 @@ ms:
remove_from_report: Alih keluar daripada laporan
report: Laporan
deleted: Dipadamkan
favourites: Gemaran
favourites: Sukaan
history: Sejarah versi
in_reply_to: Membalas kepada
language: Bahasa
@ -861,7 +861,7 @@ ms:
no_status_selected: Tiada pos sohor kini ditukar kerana tiada yang dipilih
not_discoverable: Pengarang tidak mengikut serta untuk dapat ditemui
shared_by:
other: Dikongsi dan digemari %{friendly_count} kali
other: Dikongsi atau disukai %{friendly_count} kali
title: Hantaran hangat
tags:
current_score: Markah semasa %{score}
@ -1283,6 +1283,9 @@ ms:
unsubscribe:
action: Ya, nyahlanggan
complete: Menyahlanggan
emails:
notification_emails:
favourite: emel pemberitahuan sukaan
title: Hentikan langganan
media_attachments:
validations:
@ -1334,9 +1337,9 @@ ms:
sign_up:
subject: "%{name} telah mendaftar"
favourite:
body: 'Pos anda telah digemari oleh %{name}:'
subject: "%{name} menggemari siaran anda"
title: Kegemaran baru
body: 'Hantaran anda disukai oleh %{name}:'
subject: "%{name} menyukai hantaran anda"
title: Sukaan baharu
follow:
body: "%{name} kini mengikuti anda!"
subject: "%{name} kini mengikuti anda"
@ -1558,7 +1561,7 @@ ms:
enabled_hint: Memadamkan pos anda secara automatik setelah mereka mencapai ambang umur yang ditentukan, melainkan ia sepadan dengan salah satu pengecualian di bawah
exceptions: Pengecualian
explanation: Oleh kerana pemadaman pos adalah operasi yang mahal, ini dilakukan perlahan-lahan dari semasa ke semasa apabila server tidak sibuk. Atas sebab ini, pos anda mungkin dipadamkan seketika selepas ia mencapai ambang umur.
ignore_favs: Abaikan kegemaran
ignore_favs: Abaikan sukaan
ignore_reblogs: Abaikan rangsangan
interaction_exceptions: Pengecualian berdasarkan interaksi
interaction_exceptions_explanation: Sila ambil perhatian bahawa tiada jaminan untuk pos dipadamkan jika ia berada di bawah ambang kegemaran atau tingkatkan selepas sekali melepasinya.

View file

@ -104,11 +104,11 @@ ast:
setting_aggregate_reblogs: Agrupar los artículos compartíos nes llinies de tiempu
setting_always_send_emails: Unviar siempre los avisos per corréu electrónicu
setting_auto_play_gif: Reproducir automáticamente los GIFs
setting_boost_modal: Amosar el diálogu de confirmación enantes de compartir un artículu
setting_boost_modal: Amosar el diálogu de confirmación enantes de compartir una publicación
setting_default_language: Llingua de los artículos
setting_default_privacy: Privacidá de los artículos
setting_default_sensitive: Marcar siempre tol conteníu como sensible
setting_delete_modal: Amosar el diálogu de confirmación enantes de desaniciar un artículu
setting_delete_modal: Amosar el diálogu de confirmación enantes de desaniciar una publicación
setting_disable_hover_cards: Desactivar la previsualización de perfiles al pasar el mur penriba
setting_disable_swiping: Desactivar el movimientu de desplazamientu
setting_display_media: Conteníu multimedia
@ -160,12 +160,12 @@ ast:
sign_up_block: Bloquiar el rexistru de cuentes nueves
sign_up_requires_approval: Llendar les cuentes rexistraes nueves
notification_emails:
favourite: Daquién marcó como favoritu'l to artículu
favourite: Daquién marcó como favorita la to publicación
follow: Daquién te sigue
follow_request: Daquién solicitó siguite
mention: Daquién te mentó
pending_account: Una cuenta nueva precisa una revisión
reblog: Daquién compartió'l to artículu
reblog: Daquién compartió la to publicación
report: Unvióse un informe nuevu
software_updates:
label: Hai disponible un anovamientu de Mastodon

View file

@ -131,6 +131,7 @@ ca:
tag:
name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible
terms_of_service_generator:
choice_of_law: Ciutat, regió, territori o estat els jutjats del qual hauran de dirimir qualsevol disputa legal.
domain: Identificació única del servei en línia que oferiu.
jurisdiction: Indiqueu el país on resideix qui paga les factures. Si és una empresa o una altra entitat, indiqueu el país en què està registrada, així com la ciutat, regió, territori o estat, segons calqui.
user:
@ -330,6 +331,7 @@ ca:
admin_email: Adreça-e per a les notificacions legals
arbitration_address: Adreça física per a les notificacions d'arbitratge
arbitration_website: Lloc web per a enviar les notificacions d'arbitratge
choice_of_law: Legislació aplicable
dmca_address: Adreça física per a les notificacions de copyright/DMCA
dmca_email: Adreça-e per a les notificacions de copyright/DMCA
domain: Domini

View file

@ -137,6 +137,7 @@ cs:
admin_email: Právní oznámení zahrnují protioznámení, soudní příkazy, žádosti o stáhnutí příspěvků a žádosti od právních vymahačů.
arbitration_address: Může být stejné jako výše uvedená fyzická adresa, nebo „N/A“, pokud používáte e-mail
arbitration_website: Může být webový formulář nebo „N/A“, pokud používáte e-mail
choice_of_law: Město, region, území nebo stát, jehož vnitřní hmotné právo se řídí všemi nároky.
dmca_address: V případě provozovatelů v USA použijte adresu zapsanou v DMCA Designated Agent Directory. Na přímou žádost je možné použít namísto domovské adresy PO box, použijte DMCA Designated Agent Post Office Box Waiver Request k e-mailovaní Copyright Office a řekněte jim, že jste malým moderátorem obsahu, který se obavá pomsty nabo odplaty za Vaši práci a potřebujete použít PO box, abyste schovali Vaši domovskou adresu před širokou veřejností.
dmca_email: Může být stejný e-mail použitý pro „E-mail adresy pro právní upozornění“
domain: Jedinečná identifikace online služby, kterou poskytujete.
@ -338,6 +339,7 @@ cs:
admin_email: E-mailová adresa pro právní upozornění
arbitration_address: Fyzická adresa pro upozornění na arbitrační řízení
arbitration_website: Webová stránka pro zasílání arbitračních upozornění
choice_of_law: Volba zákona
dmca_address: Fyzická adresa pro oznámení DMCA/porušení autorských práv
dmca_email: E-mailová adresa pro oznámení DMCA/porušení autorských práv
domain: Doména

View file

@ -137,6 +137,7 @@ da:
admin_email: Juridiske bekendtgørelser omfatter imødegåelsesbekendtgørelser, retskendelser, nedtagelses- og retshåndhævelsesanmodninger.
arbitration_address: Kan være den samme som Fysisk adresse ovenfor, eller “N/A” ved brug af e-mail
arbitration_website: Kan være en webformular, eller “N/A” ved brug af e-mail
choice_of_law: By, region, område eller angiv de interne materielle love, som vil være gældende for samtlige krav.
dmca_address: For amerikanske operatører, brug den adresse, der er registreret i DMCA Designated Agent Directory. En Postboksliste er tilgængelig på direkte anmodning, brug den DMCA Designated Agent Post Office Box Waiver Request til at e-maile Ophavsretskontoret og beskrive, at man er en hjemmebaseret indholdsmoderator, der frygter hævn eller gengældelse for sine handlinger og behøver en Postboks for at fjerne hjemmeadressen fra den offentlige visning.
dmca_email: Kan være samme e-mail, som brugt til “E-mailadresse til juridiske meddelelser” ovenfor
domain: Unik identifikation af den onlinetjeneste, man leverer.
@ -338,6 +339,7 @@ da:
admin_email: E-mailadresse til juridiske meddelelser
arbitration_address: Fysisk adresse til voldgiftsmeddelelser
arbitration_website: Websted til indsendelse af voldgiftsmeddelelser
choice_of_law: Lovvalg
dmca_address: Fysisk adresse til DMCA-/ophavsretsmeddelelser
dmca_email: E-mailadresse til DMCA-/ophavsretsmeddelelser
domain: Domæne

View file

@ -137,6 +137,7 @@ de:
admin_email: Rechtliche Hinweise umfassen Gegendarstellungen, Gerichtsbeschlüsse, Anfragen zum Herunternehmen von Inhalten und Anfragen von Strafverfolgungsbehörden.
arbitration_address: Kann wie die Anschrift hierüber sein oder „N/A“, falls eine E-Mail verwendet wird
arbitration_website: Kann ein Webformular sein oder „N/A“, falls eine E-Mail verwendet wird
choice_of_law: Stadt, Region, Gebiet oder Staat, dessen innerstaatliches materielles Recht für alle Ansprüche maßgebend ist.
dmca_address: US-Betreiber sollten die im „DMCA Designated Agent Directory“ eingetragene Adresse verwenden. Eine Postfachadresse ist auf direkte Anfrage verfügbar. Verwenden Sie die „DMCA Designated Agent Post Box Waiver“-Anfrage, um per E-Mail die Urheberrechtsbehörde darüber zu unterrichten, dass Sie Inhalte per Heimarbeit moderieren, eventuelle Rache oder Vergeltung für Ihre Handlungen befürchten und deshalb eine Postfachadresse benötigen, um Ihre Privatadresse nicht preiszugeben.
dmca_email: Kann dieselbe E-Mail wie bei „E-Mail-Adresse für rechtliche Hinweise“ sein
domain: Einzigartige Identifizierung des angebotenen Online-Services.
@ -338,6 +339,7 @@ de:
admin_email: E-Mail-Adresse für rechtliche Hinweise
arbitration_address: Anschrift für Schiedsverfahren
arbitration_website: Website zum Einreichen von Schiedsverfahren
choice_of_law: Wahl der Rechtsordnung
dmca_address: Anschrift für Urheberrechtsverletzungen
dmca_email: E-Mail-Adresse für Urheberrechtsverletzungen
domain: Domain

View file

@ -137,6 +137,7 @@ en:
admin_email: Legal notices include counternotices, court orders, takedown requests, and law enforcement requests.
arbitration_address: Can be the same as Physical address above, or “N/A” if using email
arbitration_website: Can be a web form, or “N/A” if using email
choice_of_law: City, region, territory or state the internal substantive laws of which shall govern any and all claims.
dmca_address: For US operators, use the address registered in the DMCA Designated Agent Directory. A P.O. Box listing is available upon direct request, use the DMCA Designated Agent Post Office Box Waiver Request to email the Copyright Office and describe that you are a home-based content moderator who fears revenge or retribution for your actions and need to use a P.O. Box to remove your home address from public view.
dmca_email: Can be the same email used for “Email address for legal notices” above
domain: Unique identification of the online service you are providing.
@ -338,6 +339,7 @@ en:
admin_email: Email address for legal notices
arbitration_address: Physical address for arbitration notices
arbitration_website: Website for submitting arbitration notices
choice_of_law: Choice of Law
dmca_address: Physical address for DMCA/copyright notices
dmca_email: Email address for DMCA/copyright notices
domain: Domain

View file

@ -137,6 +137,7 @@ eo:
admin_email: Legalaj sciigoj povas esti kontraŭsciigoj, postulaĵoj de tribunalo, postulaĵoj pri forigo, kaj postulaĵoj de la policaro.
arbitration_address: Povas esti la sama kiel Fizika adreso supre, aŭ "N/A" se oni uzas retpoŝton
arbitration_website: Povas esti retformo, aŭ "N/A" se oni uzas retpoŝton
choice_of_law: Urbo, regiono, teritorio aŭ ŝtato, kies internaj substantivaj leĝoj regos iujn kaj ĉiujn asertojn.
dmca_address: Por tenantoj en Usono, uzu la adreson registritan en la DMCA Designated Agenŭ Directory. Registrolibro de poŝtskatoloj haveblas per direkta postulo, uzu la DMCA Designated Agent Post Office Box Waiver Request por retpoŝti la Ofico de Kopirajto kaj priskribu, ke vi estas hejm-trovigita administranto por enhavo kaj devas uzi Poŝtskatolon por forigi vian hejmadreson de publika vido.
dmca_email: Povas esti la sama retpoŝtadreso uzita por "Retpoŝtadreso por legalaj sciigoj" supre
domain: Unika identigilo de la retaj servicoj, ke vi provizas.
@ -338,6 +339,7 @@ eo:
admin_email: Retpoŝtadreso por laŭleĝaj avizoj
arbitration_address: Fizika adreso por arbitraciaj avizoj
arbitration_website: Retejo por sendi arbitraciajn avizojn
choice_of_law: Elekto de leĝo
dmca_address: Fizika adreso por DMCA/kopirajto-avizoj
dmca_email: Retpoŝtadreso por DMCA/kopirajto-avizoj
domain: Domajno

View file

@ -137,6 +137,7 @@ es-AR:
admin_email: Los avisos legales incluyen devoluciones, órdenes judiciales, solicitudes de retiro y solicitudes de cumplimiento de la ley.
arbitration_address: Puede ser la misma que la dirección física anterior, o «N.D.» si utiliza correo electrónico
arbitration_website: Puede ser un formulario web, o «N.D.» si utiliza correo electrónico
choice_of_law: Ciudad, región, territorio o declaración de las leyes de sustancia interna de las que se regirán todas y cada una de las reclamaciones.
dmca_address: Para operadores estadounidenses, usen la dirección registrada en el Directorio de Agente Designado del DMCA. Una lista de casillas de correo está disponible bajo petición directa, usen la solicitud de exención del apartado postal del agente designado de la DMCA para enviar un correo electrónico a la Oficina de Derechos de Autor y describir que ustedes son moderadores de contenido basado en el hogar que temen venganza o represalia por sus acciones y que necesitan usar una casilla de correo para eliminar su dirección postal de la vista pública.
dmca_email: Puede ser el mismo correo electrónico utilizado para «Dirección de correo electrónico para avisos legales» de arriba
domain: Identificación única del servicio en línea que estás proporcionando.
@ -338,6 +339,7 @@ es-AR:
admin_email: Dirección de correo electrónico para avisos legales
arbitration_address: Dirección física para avisos de arbitraje
arbitration_website: Sitio web para enviar avisos de arbitraje
choice_of_law: Elección de ley
dmca_address: Dirección física para avisos de DMCA/derechos de autor
dmca_email: Dirección de correo electrónico para avisos de DMCA/derechos de autor
domain: Dominio

View file

@ -137,6 +137,7 @@ es-MX:
admin_email: Las notificaciones legales incluyen contraavisos, órdenes judiciales, solicitudes de retirada y solicitudes de aplicación de la ley.
arbitration_address: Puede ser la misma que la dirección física anterior, o “N/A” si se utiliza el correo electrónico
arbitration_website: Puede ser un formulario web, o “N/A” si se utiliza el correo electrónico
choice_of_law: Ciudad, región, territorio o estado de las leyes de sustancia interna de las que se regirán todas y cada una de las reclamaciones.
dmca_address: Para los operadores de EE. UU., utilice la dirección registrada en el Directorio de Agentes Designados de la DMCA. Un listado de apartados de correos está disponible bajo petición directa, utilice la Solicitud de Renuncia de Apartado de Correos de Agente Designado de la DMCA para enviar un correo electrónico a la Oficina de Derechos de Autor y describa que usted es un moderador de contenidos desde su casa que teme venganza o represalias por sus acciones y necesita utilizar un apartado de correos para eliminar su dirección particular de la vista del público.
dmca_email: Puede ser la misma dirección de correo electrónico usada en “Dirección de correo electrónico para notificaciones legales”
domain: Identificación única del servicio en línea que presta.
@ -338,6 +339,7 @@ es-MX:
admin_email: Dirección de correo electrónico para notificaciones legales
arbitration_address: Dirección física para notificaciones de arbitraje
arbitration_website: Sitio web para presentar notificaciones de arbitraje
choice_of_law: Elección de la ley
dmca_address: Dirección física para avisos de DMCA/derechos de autor
dmca_email: Dirección de correo electrónico para avisos de DMCA/derechos de autor
domain: Dominio

View file

@ -137,6 +137,7 @@ es:
admin_email: Los avisos legales incluyen devoluciones, órdenes judiciales, solicitudes de retiro y solicitudes de cumplimiento de la ley.
arbitration_address: Puede ser la misma que la dirección física anterior, o "N/A" si utiliza correo electrónico
arbitration_website: Puede ser un formulario web, o “N/A” si utiliza correo electrónico
choice_of_law: Ciudad, región, territorio o declaración de las leyes de sustancia interna de las que se regirán todas y cada una de las reclamaciones.
dmca_address: Para operadores estadounidenses, utilice la dirección registrada en el DMCA Designated Agent Directory. Un listado P.O. Box está disponible bajo petición directa, use la DMCA Designated Agent Post Office Box Waiver Request para enviar un correo electrónico a la Oficina de Derechos de Autor y describir que usted es un moderador de contenido basado en el hogar que teme venganza o represalia por sus acciones y que necesita usar un P.O. Box para eliminar su dirección postal de la vista pública.
dmca_email: Puede ser el mismo correo electrónico utilizado para "Dirección de correo electrónico para avisos legales" de arriba
domain: Identificación única del servicio en línea que estás proporcionando.
@ -338,6 +339,7 @@ es:
admin_email: Dirección de correo electrónico para avisos legales
arbitration_address: Dirección física para avisos de arbitraje
arbitration_website: Sitio web para enviar avisos de arbitraje
choice_of_law: Elección de la ley
dmca_address: Dirección física para avisos de DMCA/derechos de autor
dmca_email: Dirección de correo electrónico para avisos de DMCA/derechos de autor
domain: Dominio

View file

@ -137,6 +137,7 @@ fo:
admin_email: Løgfrøðisligar fráboðanir fata um rættarligar mótfráboðanir, úrskurðir, áheitanir um at taka niður og løgfrøðisligar áheitanir.
arbitration_address: Kann vera tann sami sum fysiski bústaðurin omanfyri ella "N/A", um teldupostur verður brúktur
arbitration_website: Kann vera ein vevformularur ella "N/A", um teldupostur verður brúktur
choice_of_law: Býur, øki, landspartur ella statur, hvørs innanhýsis lógir skulu stýra øllum krøvum.
dmca_address: Fyristøðufólk og -feløg í USA brúka bústaðin, ið er skrásettur í DMCA Designated Agent Directory. Ein postsmoguskráseting er tøk, um biðið verður um hana beinleiðis. Brúka DMCA Designated Agent Post Office Box Waiver Request fyri at senda teldubræv til Copyright Office og greið frá, at tú er ein kjakleiðari, sum virkar heimanifrá, og at tú er bangin fyri hevnd ella afturløning fyri tí, tú ger, og at tú hevur tørv á at brúka eina postsmogu fyri at fjala heimabústaðin fyri almenninginum.
dmca_email: Kann vera sami teldupoststaður, sum er brúktur til "Teldupoststaður fyri løgfrøðisligar fráboðanir" omanfyri
domain: Makaleys eyðmerking av nettænastuni, sum tú veitir.
@ -338,6 +339,7 @@ fo:
admin_email: Teldupoststaður fyri løgfrøðisligar fráboðanir
arbitration_address: Fysisk adressa fyri gerðarrættarfráboðanir
arbitration_website: Heimasíða har gerðarrættarfráboðanir kunnu innlatast
choice_of_law: Val av lóg
dmca_address: Fysiskur bústaður fyri DMCA/copyright fráboðanir
dmca_email: Teldubústaður fyri DMCA/copyright fráboðanir
domain: Navnaøki

View file

@ -137,6 +137,7 @@ ga:
admin_email: Áirítear le fógraí dlí frithfhógraí, orduithe cúirte, iarratais éirí anuas, agus iarratais forghníomhaithe dlí.
arbitration_address: Dfhéadfadh sé a bheith mar an gcéanna leis an seoladh fisiceach thuas, nó “N/B” má tá ríomhphost in úsáid agat
arbitration_website: Dfhéadfadh gur foirm ghréasáin í, nó “N/A” má tá ríomhphost in úsáid agat
choice_of_law: Cathair, réigiún, críoch nó stát a rialóidh a dhlíthe inmheánacha substaintiúla aon éileamh agus gach éileamh.
dmca_address: Maidir le hoibreoirí SAM, bain úsáid as an seoladh atá cláraithe in Eolaire Gníomhairí Ainmnithe DMCA. A P.O. Tá liostú boscaí ar fáil ach é a iarraidh go díreach, bain úsáid as Iarratas Tarscaoilte Bosca Gníomhaire Ainmnithe DMCA chun ríomhphost a chur chuig an Oifig Cóipchirt agus déan cur síos gur modhnóir ábhar baile thú a bhfuil eagla ort díoltas nó aisíocaíocht a fháil mar gheall ar do ghníomhartha agus a dteastaíonn uait úsáid a bhaint as P.O. Bosca chun do sheoladh baile a bhaint den radharc poiblí.
dmca_email: Is féidir gurb é an ríomhphost céanna é a úsáidtear le haghaidh “Seoladh ríomhphoist le haghaidh fógraí dlí” thuas
domain: Aitheantas uathúil na seirbhíse ar líne atá á cur ar fáil agat.
@ -338,6 +339,7 @@ ga:
admin_email: Seoladh ríomhphoist le haghaidh fógraí dlí
arbitration_address: Seoladh fisiciúil le haghaidh fógraí eadrána
arbitration_website: An láithreán gréasáin chun fógraí eadrána a chur isteach
choice_of_law: Rogha an Dlí
dmca_address: Seoladh fisiciúil le haghaidh fógraí DMCA/cóipchirt
dmca_email: Seoladh ríomhphoist le haghaidh fógraí DMCA/cóipchirt
domain: Fearann

View file

@ -137,6 +137,7 @@ gl:
admin_email: Os avisos legais inclúen ordes xudiciais, solicitudes de retirada de contido e requerimentos do cumprimento da lei.
arbitration_address: Pode ser o mesmo enderezo Físico de máis arriba, ou "N/A" se usas o correo electrónico
arbitration_website: Pode ser un formulario web ou "N/A" se usas o correo electrónico
choice_of_law: Cidade, rexión, territorio ou estado cuxas leis rexirán sobre as reclamacións e disputas.
dmca_address: Para operadores de USA, utiliza o mesmo enderezo rexistrado no DMCA Designated Agent Directory. Está dispoñible a opción de usar P.O. Box facendo a solicitude baixo a DMCA Designated Agent Post Office Box Waiver Request pedíndoa á Copyright Office e indicando que es un moderador de contidos na túa casa e temes ameazas ou violencia polas medidas que tomas e precisas usar un P.O. Box para que non sexa público o enderezo da túa casa.
dmca_email: Pode ser o mesmo enderezo de correo usado para "Enderezo para avisos legais"
domain: Identificador único do servizo en liña que proporcionas.
@ -338,6 +339,7 @@ gl:
admin_email: Enderezo de correo para avisos legais
arbitration_address: Enderezo físico para avisos de arbitraxe
arbitration_website: Páxina web para enviar avisos de arbitraxe
choice_of_law: Xurisdición
dmca_address: Enderezo físico para avisos sobre DMCA/copyright
dmca_email: Enderezo de correo electrónico para avisos sobre DMCA/copyright
domain: Dominio

View file

@ -137,6 +137,7 @@ he:
admin_email: מזכרים חוקיים כוללים הוראות בימ"ש, בקשות הסרה, תשובות להתראות ובקשות ציות לאכיפה.
arbitration_address: יכול להיות כתובת פיזית זהה לעיל, או “N/A” אם משתמשים בדואל
arbitration_website: יכול להיות טופס בדפדפן או “N/A” אם משתמשים בדואל
choice_of_law: עיר, מחוז, טריטוריה או מדינה שחוקיה חלים על כל התביעות והתלונות.
dmca_address: For US operators, use the address registered in the DMCA Designated Agent Directory. A P.O. Box listing is available upon direct request, use the DMCA Designated Agent Post Office Box Waiver Request to email the Copyright Office and describe that you are a home-based content moderator who fears revenge or retribution for your actions and need to use a P.O. Box to remove your home address from public view.
dmca_email: ניתן להשתמש באותה כתובת הדואל שעבור "כתובת דואל להודעות משפטיות" לעיל
domain: זיהוי ייחודי של השירות המקוון שאתה מספק.
@ -338,6 +339,7 @@ he:
admin_email: כתובת דוא"ל להודעות משפטיות
arbitration_address: כתובת פיזית להודעות גישור
arbitration_website: אתר רשת להגשת הודעות גישור
choice_of_law: בחירת אזור שיפוט
dmca_address: כתובת פיזית לשליחת התראות זכויות יוצרים/DMCA
dmca_email: כתובת דואל לשליחת התראות זכויות יוצרים/DMCA
domain: מתחם (דומיין)

View file

@ -137,6 +137,7 @@ hu:
admin_email: A jogi közlemények közé tartoznak az ellenkeresetek, a bírósági végzések, az eltávolítási kérelmek és a bűnüldöző szervek kérelmei is.
arbitration_address: Lehet a fent használt valós cím, vagy e-mail használata esetén „N/A”
arbitration_website: Lehet webes űrlap, vagy e-mail használata esetén „N/A”
choice_of_law: Város, régió, terület vagy állam, amely jogszabályai irányadóak az összes követelés esetén.
dmca_address: Amerikai üzemeltető esetén használja a DMCA Designated Agent Directory jegyzékében regisztrált címet. Közvetlen kérésre postafiók-jegyzék is rendelkezésre áll, használja a DMCA Designated Agent Directory postafiókról való lemondás iránti kérelmét a Copyright Office-nak küldött e-mailben, és írja le, hogy Ön egy otthoni tartalommoderátor, aki bosszútól vagy megtorlástól tart a tevékenységi miatt, és ezért egy postafiókra van szüksége, hogy ne legyen nyilvános az otthoni címe.
dmca_email: Megegyezhet a fenti „E-mail-cím a jogi nyilatkozatok benyújtásához” mezővel
domain: A nyújtott online szolgáltatás egyedi azonosítója.
@ -338,6 +339,7 @@ hu:
admin_email: E-mail-cím a jogi nyilatkozatok benyújtásához
arbitration_address: Fizikai cím a békéltető testületi nyilatkozatok benyújtásához
arbitration_website: Weboldal a békéltető testületi nyilatkozatok benyújtásához
choice_of_law: Joghatóság
dmca_address: Fizikai cím a szerzői jogi nyilatkozatokhoz
dmca_email: E-mail-cím a szerzői jogi nyilatkozatokhoz
domain: Domain

View file

@ -137,6 +137,7 @@ is:
admin_email: Löglegar tilkynningar ná yfir andsvör, dómsúrskurði, lokunarbeiðnir og beiðnir frá lögregluembættum.
arbitration_address: Má vera það sama og raunverulegt heimilisfang eða “N/A” ef tölvupóstur er notaður
arbitration_website: Má vera innfyllingarform á vefsíðu eða “N/A” ef tölvupóstur er notaður
choice_of_law: Sveitarfélög, héruð eða ríki þar sem ríkjandi lög og reglugerðir skulu stýra meðhöndlun á öllum kröfum.
dmca_address: Fyrir rekstraraðila í BNA ætti að nota heimilisfang sem skráð er í DMCA Designated Agent Directory. Hægt er að verða sér úti um A P.O. pósthólfsskráningu með beinni beiðni; notaðu DMCA Designated Agent Post Office Box Waiver Request til að senda tölvupóst á Copyright Office og lýstu því yfir að þú sért heimavinnandi efnismiðlari (home-based content moderator) sem átt á hættu refsingar eða hefndir vegna þess sem þú miðlar og þurfir því á slíku pósthólfi að halda svo þitt eigið heimilisfang sé ekki gert opinbert.
dmca_email: Má vera sama tölvupóstfang og það sem notað er í “Tölvupóstfang vegna löglegra tilkynninga” hér að ofan
domain: Einstakt auðkenni á netþjónustunni sem þú býður.
@ -338,6 +339,7 @@ is:
admin_email: Tölvupóstfang vegna löglegra tilkynninga
arbitration_address: Raunverulegt heimilisfang fyrir tilkynningar um úrskurði
arbitration_website: Vefsvæði til að senda inn tilkynningar um úrskurði
choice_of_law: Val á lagaumgjörð
dmca_address: Raunverulegt heimilisfang fyrir kröfur vegna DMCA/höfundarréttar
dmca_email: Tölvupóstfang tilkynninga vegna DMCA/höfundaréttar
domain: Lén

View file

@ -137,6 +137,7 @@ it:
admin_email: Gli avvisi legali includono controavvisi, ordinanze del tribunale, richieste di rimozione e richieste delle forze dell'ordine.
arbitration_address: Può essere lo stesso dell'indirizzo fisico sopra o "N/A" se si utilizza l'email
arbitration_website: Può essere un modulo web o "N/A" se si utilizza l'email
choice_of_law: Città, regione, territorio o Stato le cui leggi sostanziali interne regoleranno tutti i reclami.
dmca_address: Per gli operatori statunitensi, utilizzare l'indirizzo registrato nella DMCA Designated Agent Directory. L'elenco delle caselle postali è disponibile su richiesta diretta, utilizzando il DMCA Designated Agent Post Office Box Waiver Request per inviare un'email al Copyright Office e descrivendo di essere un moderatore di contenuti che lavora da casa e che teme vendette o punizioni per le proprie azioni e che hai bisogno di usare una casella postale per rimuovere il tuo indirizzo di casa dalla vista pubblica.
dmca_email: Può essere lo stesso indirizzo email utilizzato per "Indirizzo email per avvisi legali" sopra
domain: Identificazione univoca del servizio online che stai fornendo.
@ -338,6 +339,7 @@ it:
admin_email: Indirizzo email per avvisi legali
arbitration_address: Indirizzo fisico per avvisi di arbitrato
arbitration_website: Sito web per l'invio di avvisi di arbitrato
choice_of_law: Scelta della legge
dmca_address: Indirizzo fisico per gli avvisi DMCA/copyright
dmca_email: Indirizzo email per gli avvisi DMCA/copyright
domain: Dominio

View file

@ -110,6 +110,7 @@ lt:
admin_email: Teisiniai pranešimai įtraukia priešpriešinius pranešimus, teismo įsakymus, pašalinimo prašymus ir teisėsaugos institucijų prašymus.
arbitration_address: Gali būti toks pat kaip aukščiau nurodytas fizinis adresas arba „N/A“ (netaikoma), jei naudojamas el. paštas.
arbitration_website: Gali būti interneto forma arba „N/A“ (netaikoma), jei naudojamas el. paštas.
choice_of_law: Miestas, regionas, teritorija ar valstija, kurių vidaus materialinė teisė reglamentuoja visus reikalavimus.
dmca_address: JAV operatoriams naudokite DMCA paskirtojo agento kataloge užregistruotą adresą. Pašto dėžutės sąrašą galima sudaryti pateikus tiesioginį prašymą, naudokite DMCA paskirtojo agento pašto dėžutės atsisakymo prašymą, kad parašytumėte el. laišką Autorinių teisių tarnybai ir aprašytumėte, kad esate namuose įsikūręs turinio moderatorius, kuris baiminasi keršto ar bausmės už savo veiksmus ir kuriam reikia naudoti pašto dėžutę, kad jo namų adresas nebūtų viešai matomas.
dmca_email: Gali būti tas pats aukščiau nurodytas el. pašto adresas, naudojamas „El. pašto adresas, skirtas teisiniams pranešimams“.
domain: Unikalus jūsų teikiamos internetinės paslaugos identifikavimas.
@ -234,6 +235,7 @@ lt:
admin_email: El. pašto adresas, skirtas teisiniams pranešimams
arbitration_address: Fizinis adresas pranešimams apie arbitražą
arbitration_website: Svetainė pranešimams apie arbitražą
choice_of_law: Teisės pasirinkimas
dmca_address: Fizinis adresas, skirtas DMCA / autorinių teisių pranešimams
dmca_email: El. pašto adresas, skirtas DMCA / autorinių teisių pranešimams
domain: Domenas

View file

@ -3,6 +3,7 @@ lv:
simple_form:
hints:
account:
attribution_domains: Viens katrā līnijā. Aizsargā no nepatiesa attiecinājuma.
discoverable: Tavas publiskās ziņas un profils var tikt piedāvāti vai ieteikti dažādās Mastodon vietās, un tavs profils var tikt ieteikts citiem lietotājiem.
display_name: Tavs pilnais vārds vai tavs joku vārds.
fields: Tava mājas lapa, vietniekvārdi, vecums, viss, ko vēlies.
@ -59,6 +60,7 @@ lv:
setting_display_media_default: Paslēpt multividi, kas atzīmēta kā sensitīva
setting_display_media_hide_all: Vienmēr slēpt multividi
setting_display_media_show_all: Vienmēr rādīt multividi
setting_system_scrollbars_ui: Attiecas tikai uz darbvirsmas pārlūkiem, kuru pamatā ir Safari vai Chrome
setting_use_blurhash: Pāreju pamatā ir paslēpto uzskatāmo līdzekļu krāsas, bet saturs tiek padarīts neskaidrs
setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis ar automātisku plūsmas ritināšanu
username: Tu vari lietot burtus, ciparus un zemsvītras
@ -128,6 +130,9 @@ lv:
show_application: Tu vienmēr varēsi redzēt, kura lietotne publicēja tavu ziņu.
tag:
name: Tu vari mainīt tikai burtu lielumu, piemēram, lai tie būtu vieglāk lasāmi
terms_of_service:
changelog: Var veidot ar Markdown pierakstu.
text: Var veidot ar Markdown pierakstu.
user:
chosen_languages: Ja ieķeksēts, publiskos laika grafikos tiks parādītas tikai ziņas noteiktajās valodās
role: Loma nosaka, kādas lietotājam ir atļaujas.

View file

@ -77,6 +77,7 @@ ms:
bootstrap_timeline_accounts: Akaun ini akan disematkan pada bahagian atas cadangan ikutan pengguna baharu.
closed_registrations_message: Dipaparkan semasa pendaftaran ditutup
custom_css: Anda boleh menggunakan gaya tersuai pada versi web Mastodon.
favicon: WEBP, PNG, GIF, atau JPG. Arca tersuai diutamakan dari arca kegemaran Mastodon lalai.
mascot: Mengatasi ilustrasi dalam antara muka web lanjutan.
peers_api_enabled: Senarai nama domain yang pernah ditemui oleh server ini dalam fediverse. Tiada data disertakan di sini tentang sama ada anda bersekutu dengan server tertentu, cuma server anda mengetahuinya. Ini digunakan oleh perkhidmatan yang mengumpul statistik mengenai persekutuan dalam pengertian umum.
profile_directory: Direktori profil menyenaraikan semua pengguna yang telah mengikut serta untuk ditemui.
@ -236,6 +237,7 @@ ms:
bootstrap_timeline_accounts: Sentiasa mengesyorkan akaun ini kepada pengguna baharu
closed_registrations_message: Mesej tersuai apabila pendaftaran tidak tersedia
custom_css: CSS tersuai
favicon: Arca kegemaran
mascot: Maskot tersuai (warisan)
media_cache_retention_period: Tempoh pengekalan cache media
peers_api_enabled: Terbitkan senarai pelayan yang ditemui dalam API
@ -276,7 +278,7 @@ ms:
notification_emails:
appeal: Seseorang merayu keputusan moderator
digest: Hantar e-mel ringkasan
favourite: Seorang menggemarkan hantaran anda
favourite: Seseorang menyukai hantaran anda
follow: Seorang mengikuti anda
follow_request: Seorang meminta untuk mengikuti anda
mention: Seorang menyebut anda

View file

@ -137,6 +137,7 @@ nl:
admin_email: Juridische mededelingen zijn o. a. counter-notices, gerechterlijke bevelen, takedown-requests en handhavingsverzoeken.
arbitration_address: Kan hetzelfde zijn als bovenstaand vestigingsadres of "N/A" bij gebruik van e-mail
arbitration_website: Kan een webformulier zijn, of "N/A" als e-mail wordt gebruikt
choice_of_law: Stad, regio, grondgebied of staat waar de interne grondwetten van toepassing zijn op alle claims.
dmca_address: 'Gebruik voor beheerders in de VS: het adres dat is geregistreerd in de DMCA Designated Agent Directory. Op verzoek is er een postbuslijst beschikbaar. Gebruik het DMCA Designated Agent Post Office Box Waiver Request om het Copyright Office te e-mailen en te beschrijven dat je een vanaf huis opererende inhoudsmoderator bent, die wraak of vergelding vreest voor je moderator-acties en daarom een postbus moet gebruiken om jouw huisadres uit het publieke domein te houden.'
dmca_email: Kan hetzelfde e-mailadres zijn dat gebruikt wordt voor "E-mailadres voor juridische berichten" hierboven
domain: Een unieke identificatie van de online dienst die je levert.
@ -338,6 +339,7 @@ nl:
admin_email: E-mailadres voor juridische meldingen
arbitration_address: Vestigingsadres voor arbitrage-mededelingen
arbitration_website: Website voor het indienen van arbitrage-mededelingen
choice_of_law: Keuze van recht
dmca_address: Vestigingsadres voor DMCA/auteursrecht-mededelingen
dmca_email: E-mailadres voor DMCA/auteursrecht-mededelingen
domain: Domein

View file

@ -137,6 +137,7 @@ pt-PT:
admin_email: Os avisos legais incluem contra-avisos, ordens judiciais, pedidos de remoção e pedidos de aplicação da lei.
arbitration_address: Pode ser o mesmo que o endereço físico acima ou “N/A” se utilizar e-mail
arbitration_website: Pode ser um formulário web ou “N/A” se for utilizado o e-mail
choice_of_law: A legislação interna do estado, território, região ou cidade que deve regular qualquer conflito.
dmca_address: Para operadores dos EUA, utilize o endereço registado no Diretório de Agentes Designados DMCA. A listagem de uma caixa postal está disponível mediante pedido direto. Utilize o DMCA Designated Agent Post Office Box Waiver Request para enviar uma mensagem de correio eletrónico ao Copyright Office e descreva que é um moderador de conteúdos baseado em casa que receia vingança ou represálias pelas suas ações e que necessita de utilizar uma caixa postal para retirar o seu endereço de casa da vista do público.
dmca_email: Pode ser o mesmo e-mail utilizado para “Endereço de e-mail para avisos legais” acima
domain: Identificação única do serviço online que está a prestar.
@ -338,6 +339,7 @@ pt-PT:
admin_email: Endereço de e-mail para avisos legais
arbitration_address: Endereço físico para avisos de arbitragem
arbitration_website: Website para enviar avisos de arbitragem
choice_of_law: Escolha da legislação
dmca_address: Endereço físico para avisos DMCA / direitos autorais
dmca_email: Endereço de e-mail para avisos DMCA/direitos autorais
domain: Domínio

View file

@ -137,6 +137,7 @@ ru:
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты
arbitration_website: Веб-форма или «N/A» в случае электронной почты
choice_of_law: Город, регион, территория или государственное материальное право, которое регулирует любые претензии и все их требования.
dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше
domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
@ -338,6 +339,7 @@ ru:
admin_email: Адрес электронной почты для юридических уведомлений
arbitration_address: Почтовый адрес для уведомлений об арбитраже
arbitration_website: Вебсайт для подачи уведомления об арбитраже
choice_of_law: Выбор закана.
dmca_address: Почтовый адрес для обращений правообладателей
dmca_email: Адрес электронной почты для обращений правообладателей
domain: Доменное имя

View file

@ -137,6 +137,7 @@ sq:
admin_email: Njoftimet ligjore përfshijnë kundërnjoftime, vendime gjyqi, kërkesa për për nxjerrje sajti jashtë shërbimit dhe kërkesa nga organe ligjore.
arbitration_address: Mund të jetë e njëjtë me adresën Fizike më sipër, ose “N/A”, nëse përdoret email
arbitration_website: Mund të jetë një formular web, ose “N/A”, nëse përdoret email
choice_of_law: Qytet, rajon, territor ose shtet, ligjet e brendshme të të cilit do të administrojnë çfarëdo dhe tërë pretendimet.
dmca_email: Mund të jetë i njëjti email i përdorur për “Adresë email për njoftime ligjore” më sipëer
domain: Identifikues unik për shërbimin internetor që po ofroni.
jurisdiction: Vendosni vendin ku jeton cilido që paguan faturat. Nëse është një shoqëri apo tjetër njësi, vendosni vendin ku është regjistruar, si dhe qytetin, rajonin, territorin apo shtetin përkatës.
@ -337,6 +338,7 @@ sq:
admin_email: Adresë email për njoftime ligjore
arbitration_address: Adresë fizike për njoftime arbitrazhi
arbitration_website: Sajtin për parashtrim njoftime arbitrazhi
choice_of_law: Zgjedhje Ligji
dmca_address: Adresë fizike për njoftime DMCA/të drejtash kopjimi
dmca_email: Adresë email për njoftime DMCA/të drejtash kopjimi
domain: Përkatësi

View file

@ -137,6 +137,7 @@ tr:
admin_email: Yasal bildirimler arasında karşı bildirimler, mahkeme kararları, yayından kaldırma talepleri ve kolluk kuvvetleri talepleri yer alır.
arbitration_address: Yukarıdaki fiziksel adresle aynı olabilir, veya e-posta kullanıyorsanız "N/A"
arbitration_website: Web formu olabilir, veya e-posta kullanıyorsanız "N/A"
choice_of_law: Her türlü iddiayı yönetecek olan iç maddi yasalara ilişkin şehir, bölge, eyalet veya ülke.
dmca_address: ABD operatörleri için DMCA Atanmış Temsilci Dizininde kayıtlı adresi kullanın. Doğrudan taleple Posta Kutusu kullanımı mümkündür, Telif Hakkı Ofisine e-posta göndermek için DMCA Atanmış Temsilci Posta Kutusu Feragat Talebini kullanın ve eylemleriniz nedeniyle intikam veya cezalandırılmaktan çekinen ve herkese açık ev adresini kullanmamak için Posta Kutusu kullanması gereken ev tabanlı bir içerik moderatörü olduğunuzu açıklayın.
dmca_email: Yukarıdaki "Yasal bildirimler için e-posta adresi" için kullanılan e-posta ile aynı olabilir
domain: Sağladığınız çevrimiçi hizmetin benzersiz tanımlaması.
@ -338,6 +339,7 @@ tr:
admin_email: Yasal bildirimler için e-posta adresi
arbitration_address: Tahkim bildirimleri için fiziksel adres
arbitration_website: Tahkim bildirimlerini göndermek için website
choice_of_law: Yasa Tercihi
dmca_address: DMCA/telif hakkı bildirimleri için fiziksel adres
dmca_email: DMCA/telif hakkı bildirimleri için e-posta adresi
domain: Alan adı

View file

@ -137,6 +137,7 @@ uk:
admin_email: Юридичні повідомлення містять зустрічні повідомлення, ухвали суду, запити на видалення та запити правоохоронних органів.
arbitration_address: Може бути таким самим, як і фізична адреса вище, або "N/A", якщо використано електронну пошту
arbitration_website: Може бути вебформою або "N/A", якщо використано електронну пошту
choice_of_law: Місто, регіон, територія або держава внутрішні змістовні закони яких повинні керувати будь-якими та всіма твердженнями.
dmca_address: Для американських операторів використовуйте адресу, зареєстровану в довіднику призначених агентів DMCA. П.О. Перелік скриньок доступний за прямим запитом. Скористайтеся запитом на відмову від поштової скриньки призначеного агента Закону про захист авторських прав у цифрову епоху, щоб надіслати електронний лист до Бюро авторських прав, і опишіть, що ви домашній модератор вмісту, який боїться помсти чи відплати за свої дії та потребує використання P.O. Box, щоб видалити вашу домашню адресу з публічного перегляду.
dmca_email: Це може бути та сама адреса електронної пошти, яку використано в розділі «Електронна адреса для юридичних повідомлень» вище
domain: Унікальна ідентифікація онлайн-сервісу, який ви надаєте.
@ -337,6 +338,7 @@ uk:
admin_email: Адреса електронної пошти для юридичних повідомлень
arbitration_address: Фізична адреса для арбітражних повідомлень
arbitration_website: Сайт для надсилання арбітражних повідомлень
choice_of_law: Вибір права
dmca_address: Фізична адреса для сповіщень про DMCA/авторські права
dmca_email: Фізична адреса для сповіщень про DMCA/авторські права
domain: Домен

View file

@ -137,6 +137,7 @@ vi:
admin_email: Thông báo pháp lý bao gồm thông báo phản đối, lệnh của tòa án, yêu cầu gỡ bỏ và yêu cầu của cơ quan thực thi pháp luật.
arbitration_address: Có thể giống với Địa chỉ liên hệ ở trên hoặc “N/A” nếu sử dụng email
arbitration_website: Có thể dùng biểu mẫu online, hoặc “N/A” nếu dùng email
choice_of_law: Thành phố, khu vực, lãnh thổ hoặc tiểu bang có luật riêng sẽ chi phối mọi khiếu nại.
dmca_address: Đối với các quản trị viên tại Hoa Kỳ, hãy sử dụng địa chỉ đã đăng ký trong Danh bạ đại lý được chỉ định của DMCA. Danh sách hộp thư bưu điện có sẵn khi yêu cầu trực tiếp, hãy sử dụng Yêu cầu miễn trừ hộp thư bưu điện của đại lý được chỉ định của DMCA để gửi email đến Văn phòng bản quyền và mô tả rằng bạn là người kiểm duyệt nội dung tại nhà, người sợ bị trả thù hoặc trừng phạt vì hành động của mình và cần sử dụng hộp thư bưu điện để xóa địa chỉ nhà của bạn khỏi chế độ xem công khai.
dmca_email: Có thể là cùng một email được sử dụng cho “Địa chỉ email để nhận thông báo pháp lý” ở trên
domain: Mã nhận dạng duy nhất của dịch vụ trực tuyến mà bạn đang cung cấp.
@ -338,6 +339,7 @@ vi:
admin_email: Địa chỉ email để nhận thông báo pháp lý
arbitration_address: Địa chỉ thực tế để nhận thông báo trọng tài
arbitration_website: Trang web để nộp thông báo trọng tài
choice_of_law: Lựa chọn Luật pháp
dmca_address: Địa chỉ liên lạc để nhận thông báo DMCA/bản quyền
dmca_email: Địa chỉ email để nhận thông báo DMCA/bản quyền
domain: Tên miền

View file

@ -137,6 +137,7 @@ zh-CN:
admin_email: 法务通知包括反通知、法院命令、内容下架要求与执法机关的要求。
arbitration_address: 可以与上面的实际地址相同若使用邮箱则填写“N/A”
arbitration_website: 可以为网页表单若使用邮箱则填写“N/A”
choice_of_law: 适用内部实质法律以管辖任何及所有索赔的城市、地区、领土或州。
dmca_address: 如果你是位于美国的运营者,请使用在 DMCA 指定代表名录中注册的地址。如果你需要使用邮政信箱,可以直接申请。请使用 DMCA 指定代表邮政信箱豁免申请表,通过电子邮件联系版权办公室,并声明你是居家内容审核员,因担心审核操作会招致报复或打击报复,需要使用邮政信箱以避免公开家庭住址。
dmca_email: 可使用与上方“法务通知接收邮箱地址”相同的邮箱地址。
domain: 你所提供的在线服务的唯一标识。
@ -338,6 +339,7 @@ zh-CN:
admin_email: 接收法务通知的邮箱地址
arbitration_address: 仲裁通知的实际送达地址
arbitration_website: 仲裁通知的在线提交入口
choice_of_law: 法律适用选择
dmca_address: 接收DMCA/版权通知的实际地址
dmca_email: 接收DMCA/版权通知的邮箱地址
domain: 域名

View file

@ -137,6 +137,7 @@ zh-TW:
admin_email: 法律通知包含反駁通知、法院命令、刪除請求和執法單位請求。
arbitration_address: 能與上述相同之實體地址或「N/A」如使用 email
arbitration_website: 能為網路表單或「N/A」如使用 email
choice_of_law: 城市、區域、領土或州的內部實體法律應規範任何及所有權利。
dmca_address: 位於美國的運營團隊,請使用於 DMCA 指定代理目錄中註冊之地址。可直接請求 PO Box 清單,使用 DMCA 指定代理郵局信箱豁免請求向版權局發送電子郵件,並描述您是一名在家工作之內容管理員,擔心您的行為將遭報復,需要使用 PO Box 保護您的私人住址。
dmca_email: 能使用上述用於「法律通知用途電子郵件」之相同電子郵件
domain: 您所提供線上服務之唯一識別。
@ -338,6 +339,7 @@ zh-TW:
admin_email: 法律通知用途電子郵件
arbitration_address: 仲裁通知之實體地址
arbitration_website: 提交仲裁通知之網站
choice_of_law: 法律選擇
dmca_address: DMCA 或版權通知之實體地址
dmca_email: DMCA 或版權通知之電子郵件地址
domain: 網域

View file

@ -249,7 +249,7 @@ individual basis.
## Choice of Law
Any and all claims related to or arising out of your use of, or access to the
Instance shall be governed by internal substantive laws of New York in all
Instance shall be governed by internal substantive laws of %{choice_of_law} in all
respects, without regard for the jurisdiction or forum in which you are
domiciled, reside, or located at the time of such access or use.

View file

@ -59,7 +59,7 @@ services:
web:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: .
image: ghcr.io/mastodon/mastodon:v4.3.3
image: ghcr.io/mastodon/mastodon:v4.3.4
restart: always
env_file: .env.production
command: bundle exec puma -C config/puma.rb
@ -83,7 +83,7 @@ services:
# build:
# dockerfile: ./streaming/Dockerfile
# context: .
image: ghcr.io/mastodon/mastodon-streaming:v4.3.3
image: ghcr.io/mastodon/mastodon-streaming:v4.3.4
restart: always
env_file: .env.production
command: node ./streaming/index.js
@ -102,7 +102,7 @@ services:
sidekiq:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: .
image: ghcr.io/mastodon/mastodon:v4.3.3
image: ghcr.io/mastodon/mastodon:v4.3.4
restart: always
env_file: .env.production
command: bundle exec sidekiq

View file

@ -17,7 +17,7 @@ module Mastodon
end
def default_prerelease
'alpha.2'
'alpha.3'
end
def prerelease

View file

@ -131,18 +131,16 @@ class Sanitize
)
MASTODON_OEMBED = freeze_config(
elements: %w(audio embed iframe source video),
elements: %w(audio iframe source video),
attributes: {
'audio' => %w(controls),
'embed' => %w(height src type width),
'iframe' => %w(allowfullscreen frameborder height scrolling src width),
'source' => %w(src type),
'video' => %w(controls height loop width),
},
protocols: {
'embed' => { 'src' => HTTP_PROTOCOLS },
'iframe' => { 'src' => HTTP_PROTOCOLS },
'source' => { 'src' => HTTP_PROTOCOLS },
},

View file

@ -33,6 +33,7 @@ RSpec.describe Admin::TermsOfService::GeneratesController do
dmca_email: 'dmca@host.example',
domain: 'host.example',
jurisdiction: 'Europe',
choice_of_law: 'New York',
},
}
end

View file

@ -4,9 +4,10 @@ require 'rails_helper'
RSpec.describe 'Domain Blocks' do
describe 'GET /api/v1/instance/domain_blocks' do
before do
Fabricate(:domain_block)
end
let(:user) { Fabricate(:user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id).token }
before { Fabricate(:domain_block) }
context 'with domain blocks set to all' do
before { Setting.show_domain_blocks = 'all' }
@ -30,6 +31,7 @@ RSpec.describe 'Domain Blocks' do
context 'with domain blocks set to users' do
before { Setting.show_domain_blocks = 'users' }
context 'without authentication token' do
it 'returns http not found' do
get api_v1_instance_domain_blocks_path
@ -38,6 +40,89 @@ RSpec.describe 'Domain Blocks' do
end
end
context 'with authentication token' do
context 'with unapproved user' do
before { user.update(approved: false) }
it 'returns http not found' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(404)
end
end
context 'with unconfirmed user' do
before { user.update(confirmed_at: nil) }
it 'returns http not found' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(404)
end
end
context 'with disabled user' do
before { user.update(disabled: true) }
it 'returns http not found' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(404)
end
end
context 'with suspended user' do
before { user.account.update(suspended_at: Time.zone.now) }
it 'returns http not found' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(403)
end
end
context 'with moved user' do
before { user.account.update(moved_to_account_id: Fabricate(:account).id) }
it 'returns http success' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(200)
expect(response.content_type)
.to start_with('application/json')
expect(response.parsed_body)
.to be_present
.and(be_an(Array))
.and(have_attributes(size: 1))
end
end
context 'with normal user' do
it 'returns http success' do
get api_v1_instance_domain_blocks_path, headers: { 'Authorization' => "Bearer #{token}" }
expect(response)
.to have_http_status(200)
expect(response.content_type)
.to start_with('application/json')
expect(response.parsed_body)
.to be_present
.and(be_an(Array))
.and(have_attributes(size: 1))
end
end
end
end
context 'with domain blocks set to disabled' do
before { Setting.show_domain_blocks = 'disabled' }

View file

@ -365,6 +365,18 @@ RSpec.describe 'Notifications' do
.to start_with('application/json')
end
context 'with an ungrouped notification' do
let(:notification) { Fabricate(:notification, account: user.account, type: :favourite) }
it 'returns http success' do
get "/api/v2/notifications/ungrouped-#{notification.id}", headers: headers
expect(response).to have_http_status(200)
expect(response.content_type)
.to start_with('application/json')
end
end
context 'when notification belongs to someone else' do
let(:notification) { Fabricate(:notification, group_key: 'foobar') }
@ -396,6 +408,19 @@ RSpec.describe 'Notifications' do
expect { notification.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
context 'with an ungrouped notification' do
let(:notification) { Fabricate(:notification, account: user.account, type: :favourite) }
it 'destroys the notification' do
post "/api/v2/notifications/ungrouped-#{notification.id}/dismiss", headers: headers
expect(response).to have_http_status(200)
expect(response.content_type)
.to start_with('application/json')
expect { notification.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
context 'when notification belongs to someone else' do
let(:notification) { Fabricate(:notification, group_key: 'foobar') }

View file

@ -24,15 +24,4 @@ RSpec.describe 'Auth Setup' do
end
end
end
describe 'PUT /auth/setup' do
before { sign_in Fabricate(:user, confirmed_at: nil) }
it 'gracefully handles invalid nested params' do
put '/auth/setup?user=invalid'
expect(response)
.to have_http_status(400)
end
end
end

View file

@ -15526,8 +15526,8 @@ __metadata:
linkType: hard
"sass@npm:^1.62.1":
version: 1.85.0
resolution: "sass@npm:1.85.0"
version: 1.85.1
resolution: "sass@npm:1.85.1"
dependencies:
"@parcel/watcher": "npm:^2.4.1"
chokidar: "npm:^4.0.0"
@ -15538,7 +15538,7 @@ __metadata:
optional: true
bin:
sass: sass.js
checksum: 10c0/a1af0c0596ae1904f66337d0c70a684db6e12210f97be4326cc3dcf18b0f956d7bc45ab2bcc7a8422d433d3eb3c9cb2cc8e60b2dafbdd01fb1ae5a23f5424690
checksum: 10c0/f843aa1df1dca2f0e9cb2fb247e4939fd514ae4c182cdd1900a0622c0d71b40dfb1c4225f78b78e165a318287ca137ec597695db3e496408bd16a921a2bc2b3f
languageName: node
linkType: hard