mirror of
https://github.com/glitch-soc/mastodon
synced 2025-04-24 14:14:51 +00:00
Merge pull request #3047 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to a324edabdf
This commit is contained in:
commit
e3cc4cc6a2
86 changed files with 944 additions and 190 deletions
|
@ -1 +1 @@
|
|||
3.4.2
|
||||
3.4.3
|
||||
|
|
20
Gemfile.lock
20
Gemfile.lock
|
@ -94,7 +94,7 @@ GEM
|
|||
ast (2.4.3)
|
||||
attr_required (1.0.2)
|
||||
aws-eventstream (1.3.2)
|
||||
aws-partitions (1.1080.0)
|
||||
aws-partitions (1.1087.0)
|
||||
aws-sdk-core (3.215.1)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
|
@ -120,7 +120,7 @@ GEM
|
|||
rack (>= 0.9.0)
|
||||
rouge (>= 1.0.0)
|
||||
bigdecimal (3.1.9)
|
||||
bindata (2.5.0)
|
||||
bindata (2.5.1)
|
||||
binding_of_caller (1.0.1)
|
||||
debug_inspector (>= 1.2.0)
|
||||
blurhash (0.1.8)
|
||||
|
@ -170,7 +170,7 @@ GEM
|
|||
crass (1.0.6)
|
||||
css_parser (1.21.1)
|
||||
addressable
|
||||
csv (3.3.3)
|
||||
csv (3.3.4)
|
||||
database_cleaner-active_record (2.2.0)
|
||||
activerecord (>= 5.a)
|
||||
database_cleaner-core (~> 2.0.0)
|
||||
|
@ -227,7 +227,7 @@ GEM
|
|||
fabrication (2.31.0)
|
||||
faker (3.5.1)
|
||||
i18n (>= 1.8.11, < 2)
|
||||
faraday (2.12.2)
|
||||
faraday (2.13.0)
|
||||
faraday-net_http (>= 2.0, < 3.5)
|
||||
json
|
||||
logger
|
||||
|
@ -239,7 +239,7 @@ GEM
|
|||
net-http (>= 0.5.0)
|
||||
fast_blank (1.0.1)
|
||||
fastimage (2.4.0)
|
||||
ffi (1.17.1)
|
||||
ffi (1.17.2)
|
||||
ffi-compiler (1.3.2)
|
||||
ffi (>= 1.15.5)
|
||||
rake
|
||||
|
@ -426,7 +426,7 @@ GEM
|
|||
mime-types (3.6.2)
|
||||
logger
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2025.0402)
|
||||
mime-types-data (3.2025.0408)
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.8)
|
||||
minitest (5.25.5)
|
||||
|
@ -585,8 +585,8 @@ GEM
|
|||
ostruct (0.6.1)
|
||||
ox (2.14.22)
|
||||
bigdecimal (>= 3.0)
|
||||
parallel (1.26.3)
|
||||
parser (3.3.7.4)
|
||||
parallel (1.27.0)
|
||||
parser (3.3.8.0)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
parslet (2.0.0)
|
||||
|
@ -751,7 +751,7 @@ GEM
|
|||
rubocop-ast (>= 1.44.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 4.0)
|
||||
rubocop-ast (1.44.0)
|
||||
rubocop-ast (1.44.1)
|
||||
parser (>= 3.3.7.2)
|
||||
prism (~> 1.4)
|
||||
rubocop-capybara (2.22.1)
|
||||
|
@ -1085,4 +1085,4 @@ RUBY VERSION
|
|||
ruby 3.4.1p0
|
||||
|
||||
BUNDLED WITH
|
||||
2.6.7
|
||||
2.6.8
|
||||
|
|
66
app/controllers/api/v1/accounts/endorsements_controller.rb
Normal file
66
app/controllers/api/v1/accounts/endorsements_controller.rb
Normal file
|
@ -0,0 +1,66 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Api::V1::Accounts::EndorsementsController < Api::BaseController
|
||||
include Authorization
|
||||
|
||||
before_action -> { authorize_if_got_token! :read, :'read:accounts' }, only: :index
|
||||
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, except: :index
|
||||
before_action :require_user!, except: :index
|
||||
before_action :set_account
|
||||
before_action :set_endorsed_accounts, only: :index
|
||||
after_action :insert_pagination_headers, only: :index
|
||||
|
||||
def index
|
||||
cache_if_unauthenticated!
|
||||
render json: @endorsed_accounts, each_serializer: REST::AccountSerializer
|
||||
end
|
||||
|
||||
def create
|
||||
AccountPin.find_or_create_by!(account: current_account, target_account: @account)
|
||||
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter
|
||||
end
|
||||
|
||||
def destroy
|
||||
pin = AccountPin.find_by(account: current_account, target_account: @account)
|
||||
pin&.destroy!
|
||||
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_account
|
||||
@account = Account.find(params[:account_id])
|
||||
end
|
||||
|
||||
def set_endorsed_accounts
|
||||
@endorsed_accounts = @account.unavailable? ? [] : paginated_endorsed_accounts
|
||||
end
|
||||
|
||||
def paginated_endorsed_accounts
|
||||
@account.endorsed_accounts.without_suspended.includes(:account_stat, :user).paginate_by_max_id(
|
||||
limit_param(DEFAULT_ACCOUNTS_LIMIT),
|
||||
params[:max_id],
|
||||
params[:since_id]
|
||||
)
|
||||
end
|
||||
|
||||
def relationships_presenter
|
||||
AccountRelationshipsPresenter.new([@account], current_user.account_id)
|
||||
end
|
||||
|
||||
def next_path
|
||||
api_v1_account_endorsements_url pagination_params(max_id: pagination_max_id) if records_continue?
|
||||
end
|
||||
|
||||
def prev_path
|
||||
api_v1_account_endorsements_url pagination_params(since_id: pagination_since_id) unless @endorsed_accounts.empty?
|
||||
end
|
||||
|
||||
def pagination_collection
|
||||
@endorsed_accounts
|
||||
end
|
||||
|
||||
def records_continue?
|
||||
@endorsed_accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
|
||||
end
|
||||
end
|
|
@ -17,6 +17,6 @@ class Api::V1::Accounts::FeaturedTagsController < Api::BaseController
|
|||
end
|
||||
|
||||
def set_featured_tags
|
||||
@featured_tags = @account.suspended? ? [] : @account.featured_tags
|
||||
@featured_tags = @account.unavailable? ? [] : @account.featured_tags
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Api::V1::Accounts::PinsController < Api::BaseController
|
||||
include Authorization
|
||||
|
||||
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
|
||||
before_action :require_user!
|
||||
before_action :set_account
|
||||
|
||||
def create
|
||||
AccountPin.find_or_create_by!(account: current_account, target_account: @account)
|
||||
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter
|
||||
end
|
||||
|
||||
def destroy
|
||||
pin = AccountPin.find_by(account: current_account, target_account: @account)
|
||||
pin&.destroy!
|
||||
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_account
|
||||
@account = Account.find(params[:account_id])
|
||||
end
|
||||
|
||||
def relationships_presenter
|
||||
AccountRelationshipsPresenter.new([@account], current_user.account_id)
|
||||
end
|
||||
end
|
|
@ -7,10 +7,6 @@ class Api::V1::ListsController < Api::BaseController
|
|||
before_action :require_user!
|
||||
before_action :set_list, except: [:index, :create]
|
||||
|
||||
rescue_from ArgumentError do |e|
|
||||
render json: { error: e.to_s }, status: 422
|
||||
end
|
||||
|
||||
def index
|
||||
@lists = List.where(account: current_account).all
|
||||
render json: @lists, each_serializer: REST::ListSerializer
|
||||
|
|
|
@ -71,6 +71,8 @@ type RenderItemFn<Item = MenuItem> = (
|
|||
},
|
||||
) => React.ReactNode;
|
||||
|
||||
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
|
||||
|
||||
type RenderHeaderFn<Item = MenuItem> = (items: Item[]) => React.ReactNode;
|
||||
|
||||
interface DropdownMenuProps<Item = MenuItem> {
|
||||
|
@ -81,10 +83,10 @@ interface DropdownMenuProps<Item = MenuItem> {
|
|||
openedViaKeyboard: boolean;
|
||||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onItemClick: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
const DropdownMenu = <Item = MenuItem,>({
|
||||
export const DropdownMenu = <Item = MenuItem,>({
|
||||
items,
|
||||
loading,
|
||||
scrollable,
|
||||
|
@ -176,20 +178,35 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
[],
|
||||
);
|
||||
|
||||
const handleItemClick = useCallback(
|
||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||
const i = Number(e.currentTarget.getAttribute('data-index'));
|
||||
const item = items?.[i];
|
||||
|
||||
onClose();
|
||||
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof onItemClick === 'function') {
|
||||
e.preventDefault();
|
||||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
}
|
||||
},
|
||||
[onClose, onItemClick, items],
|
||||
);
|
||||
|
||||
const handleItemKeyUp = useCallback(
|
||||
(e: React.KeyboardEvent) => {
|
||||
if (e.key === 'Enter' || e.key === ' ') {
|
||||
onItemClick(e);
|
||||
handleItemClick(e);
|
||||
}
|
||||
},
|
||||
[onItemClick],
|
||||
);
|
||||
|
||||
const handleClick = useCallback(
|
||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||
onItemClick(e);
|
||||
},
|
||||
[onItemClick],
|
||||
[handleItemClick],
|
||||
);
|
||||
|
||||
const nativeRenderItem = (option: Item, i: number) => {
|
||||
|
@ -209,7 +226,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
element = (
|
||||
<button
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -224,7 +241,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
data-method={option.method}
|
||||
rel='noopener'
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -236,7 +253,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
<Link
|
||||
to={option.to}
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -282,7 +299,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
>
|
||||
{items.map((option, i) =>
|
||||
renderItemMethod(option, i, {
|
||||
onClick: handleClick,
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
}),
|
||||
)}
|
||||
|
@ -306,7 +323,7 @@ interface DropdownProps<Item = MenuItem> {
|
|||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onOpen?: () => void;
|
||||
onItemClick?: (arg0: Item, arg1: number) => void;
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
const offset = [5, 5] as OffsetValue;
|
||||
|
@ -521,7 +538,7 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
openedViaKeyboard={openedViaKeyboard}
|
||||
renderItem={renderItem}
|
||||
renderHeader={renderHeader}
|
||||
onItemClick={handleItemClick}
|
||||
onItemClick={onItemClick}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -36,11 +36,11 @@ export const EditedTimestamp: React.FC<{
|
|||
}, [dispatch, statusId]);
|
||||
|
||||
const handleItemClick = useCallback(
|
||||
(_item: HistoryItem, i: number) => {
|
||||
(_item: HistoryItem, index: number) => {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'COMPARE_HISTORY',
|
||||
modalProps: { index: i, statusId },
|
||||
modalProps: { index, statusId },
|
||||
}),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -20,6 +20,7 @@ export type StatusLike = Record<{
|
|||
contentHTML: string;
|
||||
media_attachments: List<unknown>;
|
||||
spoiler_text?: string;
|
||||
account: Record<{ id: string }>;
|
||||
}>;
|
||||
|
||||
function normalizeHashtag(hashtag: string) {
|
||||
|
@ -195,13 +196,19 @@ export function getHashtagBarForStatus(status: StatusLike) {
|
|||
|
||||
return {
|
||||
statusContentProps,
|
||||
hashtagBar: <HashtagBar hashtags={hashtagsInBar} />,
|
||||
hashtagBar: (
|
||||
<HashtagBar
|
||||
hashtags={hashtagsInBar}
|
||||
accountId={status.getIn(['account', 'id']) as string}
|
||||
/>
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
const HashtagBar: React.FC<{
|
||||
hashtags: string[];
|
||||
}> = ({ hashtags }) => {
|
||||
accountId: string;
|
||||
}> = ({ hashtags, accountId }) => {
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
const handleClick = useCallback(() => {
|
||||
setExpanded(true);
|
||||
|
@ -218,7 +225,11 @@ const HashtagBar: React.FC<{
|
|||
return (
|
||||
<div className='hashtag-bar'>
|
||||
{revealedHashtags.map((hashtag) => (
|
||||
<Link key={hashtag} to={`/tags/${hashtag}`}>
|
||||
<Link
|
||||
key={hashtag}
|
||||
to={`/tags/${hashtag}`}
|
||||
data-menu-hashtag={accountId}
|
||||
>
|
||||
#<span>{hashtag}</span>
|
||||
</Link>
|
||||
))}
|
||||
|
|
|
@ -184,6 +184,7 @@ class StatusContent extends PureComponent {
|
|||
}
|
||||
} else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
|
||||
link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
|
||||
link.setAttribute('data-menu-hashtag', this.props.status.getIn(['account', 'id']));
|
||||
} else {
|
||||
link.setAttribute('title', link.href);
|
||||
link.classList.add('unhandled-link');
|
||||
|
|
|
@ -499,9 +499,7 @@ export const AccountHeader: React.FC<{
|
|||
|
||||
arr.push({
|
||||
text: intl.formatMessage(
|
||||
account.getIn(['relationship', 'endorsed'])
|
||||
? messages.unendorse
|
||||
: messages.endorse,
|
||||
relationship.endorsed ? messages.unendorse : messages.endorse,
|
||||
),
|
||||
action: handleEndorseToggle,
|
||||
});
|
||||
|
@ -759,7 +757,7 @@ export const AccountHeader: React.FC<{
|
|||
badges.push(<GroupBadge key='group-badge' />);
|
||||
}
|
||||
|
||||
account.get('roles', []).forEach((role) => {
|
||||
account.roles.forEach((role) => {
|
||||
badges.push(
|
||||
<Badge
|
||||
key={`role-badge-${role.get('id')}`}
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
|
||||
|
||||
import { useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
import { useLocation } from 'react-router-dom';
|
||||
|
||||
import Overlay from 'react-overlays/Overlay';
|
||||
import type {
|
||||
OffsetValue,
|
||||
UsePopperOptions,
|
||||
} from 'react-overlays/esm/usePopper';
|
||||
|
||||
import { DropdownMenu } from 'flavours/glitch/components/dropdown_menu';
|
||||
import { useAppSelector } from 'flavours/glitch/store';
|
||||
|
||||
const messages = defineMessages({
|
||||
browseHashtag: {
|
||||
id: 'hashtag.browse',
|
||||
defaultMessage: 'Browse posts in #{hashtag}',
|
||||
},
|
||||
browseHashtagFromAccount: {
|
||||
id: 'hashtag.browse_from_account',
|
||||
defaultMessage: 'Browse posts from @{name} in #{hashtag}',
|
||||
},
|
||||
muteHashtag: { id: 'hashtag.mute', defaultMessage: 'Mute #{hashtag}' },
|
||||
});
|
||||
|
||||
const offset = [5, 5] as OffsetValue;
|
||||
const popperConfig = { strategy: 'fixed' } as UsePopperOptions;
|
||||
|
||||
const isHashtagLink = (
|
||||
element: HTMLAnchorElement | null,
|
||||
): element is HTMLAnchorElement => {
|
||||
if (!element) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return element.matches('[data-menu-hashtag]');
|
||||
};
|
||||
|
||||
interface TargetParams {
|
||||
hashtag?: string;
|
||||
accountId?: string;
|
||||
}
|
||||
|
||||
export const HashtagMenuController: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const [open, setOpen] = useState(false);
|
||||
const [{ accountId, hashtag }, setTargetParams] = useState<TargetParams>({});
|
||||
const targetRef = useRef<HTMLAnchorElement | null>(null);
|
||||
const location = useLocation();
|
||||
const account = useAppSelector((state) =>
|
||||
accountId ? state.accounts.get(accountId) : undefined,
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setOpen(false);
|
||||
targetRef.current = null;
|
||||
}, [setOpen, location]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClick = (e: MouseEvent) => {
|
||||
const target = (e.target as HTMLElement).closest('a');
|
||||
|
||||
if (e.button !== 0 || e.ctrlKey || e.metaKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isHashtagLink(target)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const hashtag = target.text.replace(/^#/, '');
|
||||
const accountId = target.getAttribute('data-menu-hashtag');
|
||||
|
||||
if (!hashtag || !accountId) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
targetRef.current = target;
|
||||
setOpen(true);
|
||||
setTargetParams({ hashtag, accountId });
|
||||
};
|
||||
|
||||
document.addEventListener('click', handleClick, { capture: true });
|
||||
|
||||
return () => {
|
||||
document.removeEventListener('click', handleClick);
|
||||
};
|
||||
}, [setTargetParams, setOpen]);
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
setOpen(false);
|
||||
targetRef.current = null;
|
||||
}, [setOpen]);
|
||||
|
||||
const menu = useMemo(
|
||||
() => [
|
||||
{
|
||||
text: intl.formatMessage(messages.browseHashtag, {
|
||||
hashtag,
|
||||
}),
|
||||
to: `/tags/${hashtag}`,
|
||||
},
|
||||
{
|
||||
text: intl.formatMessage(messages.browseHashtagFromAccount, {
|
||||
hashtag,
|
||||
name: account?.username,
|
||||
}),
|
||||
to: `/@${account?.acct}/tagged/${hashtag}`,
|
||||
},
|
||||
null,
|
||||
{
|
||||
text: intl.formatMessage(messages.muteHashtag, {
|
||||
hashtag,
|
||||
}),
|
||||
href: '/filters',
|
||||
dangerous: true,
|
||||
},
|
||||
],
|
||||
[intl, hashtag, account],
|
||||
);
|
||||
|
||||
if (!open) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Overlay
|
||||
show={open}
|
||||
offset={offset}
|
||||
placement='bottom'
|
||||
flip
|
||||
target={targetRef}
|
||||
popperConfig={popperConfig}
|
||||
>
|
||||
{({ props, arrowProps, placement }) => (
|
||||
<div {...props}>
|
||||
<div className={`dropdown-animation dropdown-menu ${placement}`}>
|
||||
<div
|
||||
className={`dropdown-menu__arrow ${placement}`}
|
||||
{...arrowProps}
|
||||
/>
|
||||
|
||||
<DropdownMenu
|
||||
items={menu}
|
||||
onClose={handleClose}
|
||||
openedViaKeyboard={false}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</Overlay>
|
||||
);
|
||||
};
|
|
@ -34,6 +34,7 @@ import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding
|
|||
import BundleColumnError from './components/bundle_column_error';
|
||||
import Header from './components/header';
|
||||
import { UploadArea } from './components/upload_area';
|
||||
import { HashtagMenuController } from './components/hashtag_menu_controller';
|
||||
import ColumnsAreaContainer from './containers/columns_area_container';
|
||||
import LoadingBarContainer from './containers/loading_bar_container';
|
||||
import ModalContainer from './containers/modal_container';
|
||||
|
@ -677,6 +678,7 @@ class UI extends PureComponent {
|
|||
{layout !== 'mobile' && <PictureInPicture />}
|
||||
<AlertsController />
|
||||
{!disableHoverCards && <HoverCardController />}
|
||||
<HashtagMenuController />
|
||||
<LoadingBarContainer className='loading-bar' />
|
||||
<ModalContainer />
|
||||
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
||||
|
|
|
@ -17,7 +17,12 @@ body {
|
|||
font-weight: 400;
|
||||
color: $primary-text-color;
|
||||
text-rendering: optimizelegibility;
|
||||
font-feature-settings: 'kern';
|
||||
|
||||
// Disable kerning for Japanese text to preserve monospaced alignment for readability
|
||||
&:not(:lang(ja)) {
|
||||
font-feature-settings: 'kern';
|
||||
}
|
||||
|
||||
text-size-adjust: none;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
|
|
|
@ -71,6 +71,8 @@ type RenderItemFn<Item = MenuItem> = (
|
|||
},
|
||||
) => React.ReactNode;
|
||||
|
||||
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
|
||||
|
||||
type RenderHeaderFn<Item = MenuItem> = (items: Item[]) => React.ReactNode;
|
||||
|
||||
interface DropdownMenuProps<Item = MenuItem> {
|
||||
|
@ -81,10 +83,10 @@ interface DropdownMenuProps<Item = MenuItem> {
|
|||
openedViaKeyboard: boolean;
|
||||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onItemClick: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
const DropdownMenu = <Item = MenuItem,>({
|
||||
export const DropdownMenu = <Item = MenuItem,>({
|
||||
items,
|
||||
loading,
|
||||
scrollable,
|
||||
|
@ -176,20 +178,35 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
[],
|
||||
);
|
||||
|
||||
const handleItemClick = useCallback(
|
||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||
const i = Number(e.currentTarget.getAttribute('data-index'));
|
||||
const item = items?.[i];
|
||||
|
||||
onClose();
|
||||
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof onItemClick === 'function') {
|
||||
e.preventDefault();
|
||||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
}
|
||||
},
|
||||
[onClose, onItemClick, items],
|
||||
);
|
||||
|
||||
const handleItemKeyUp = useCallback(
|
||||
(e: React.KeyboardEvent) => {
|
||||
if (e.key === 'Enter' || e.key === ' ') {
|
||||
onItemClick(e);
|
||||
handleItemClick(e);
|
||||
}
|
||||
},
|
||||
[onItemClick],
|
||||
);
|
||||
|
||||
const handleClick = useCallback(
|
||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||
onItemClick(e);
|
||||
},
|
||||
[onItemClick],
|
||||
[handleItemClick],
|
||||
);
|
||||
|
||||
const nativeRenderItem = (option: Item, i: number) => {
|
||||
|
@ -209,7 +226,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
element = (
|
||||
<button
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -224,7 +241,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
data-method={option.method}
|
||||
rel='noopener'
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -236,7 +253,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
<Link
|
||||
to={option.to}
|
||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||
onClick={handleClick}
|
||||
onClick={handleItemClick}
|
||||
onKeyUp={handleItemKeyUp}
|
||||
data-index={i}
|
||||
>
|
||||
|
@ -282,7 +299,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
|||
>
|
||||
{items.map((option, i) =>
|
||||
renderItemMethod(option, i, {
|
||||
onClick: handleClick,
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
}),
|
||||
)}
|
||||
|
@ -306,7 +323,7 @@ interface DropdownProps<Item = MenuItem> {
|
|||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onOpen?: () => void;
|
||||
onItemClick?: (arg0: Item, arg1: number) => void;
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
const offset = [5, 5] as OffsetValue;
|
||||
|
@ -521,7 +538,7 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
openedViaKeyboard={openedViaKeyboard}
|
||||
renderItem={renderItem}
|
||||
renderHeader={renderHeader}
|
||||
onItemClick={handleItemClick}
|
||||
onItemClick={onItemClick}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -36,11 +36,11 @@ export const EditedTimestamp: React.FC<{
|
|||
}, [dispatch, statusId]);
|
||||
|
||||
const handleItemClick = useCallback(
|
||||
(_item: HistoryItem, i: number) => {
|
||||
(_item: HistoryItem, index: number) => {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'COMPARE_HISTORY',
|
||||
modalProps: { index: i, statusId },
|
||||
modalProps: { index, statusId },
|
||||
}),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -20,6 +20,7 @@ export type StatusLike = Record<{
|
|||
contentHTML: string;
|
||||
media_attachments: List<unknown>;
|
||||
spoiler_text?: string;
|
||||
account: Record<{ id: string }>;
|
||||
}>;
|
||||
|
||||
function normalizeHashtag(hashtag: string) {
|
||||
|
@ -195,13 +196,19 @@ export function getHashtagBarForStatus(status: StatusLike) {
|
|||
|
||||
return {
|
||||
statusContentProps,
|
||||
hashtagBar: <HashtagBar hashtags={hashtagsInBar} />,
|
||||
hashtagBar: (
|
||||
<HashtagBar
|
||||
hashtags={hashtagsInBar}
|
||||
accountId={status.getIn(['account', 'id']) as string}
|
||||
/>
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
const HashtagBar: React.FC<{
|
||||
hashtags: string[];
|
||||
}> = ({ hashtags }) => {
|
||||
accountId: string;
|
||||
}> = ({ hashtags, accountId }) => {
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
const handleClick = useCallback(() => {
|
||||
setExpanded(true);
|
||||
|
@ -218,7 +225,11 @@ const HashtagBar: React.FC<{
|
|||
return (
|
||||
<div className='hashtag-bar'>
|
||||
{revealedHashtags.map((hashtag) => (
|
||||
<Link key={hashtag} to={`/tags/${hashtag}`}>
|
||||
<Link
|
||||
key={hashtag}
|
||||
to={`/tags/${hashtag}`}
|
||||
data-menu-hashtag={accountId}
|
||||
>
|
||||
#<span>{hashtag}</span>
|
||||
</Link>
|
||||
))}
|
||||
|
|
|
@ -115,6 +115,7 @@ class StatusContent extends PureComponent {
|
|||
} else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
|
||||
link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
|
||||
link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`);
|
||||
link.setAttribute('data-menu-hashtag', this.props.status.getIn(['account', 'id']));
|
||||
} else {
|
||||
link.setAttribute('title', link.href);
|
||||
link.classList.add('unhandled-link');
|
||||
|
|
|
@ -495,9 +495,7 @@ export const AccountHeader: React.FC<{
|
|||
|
||||
arr.push({
|
||||
text: intl.formatMessage(
|
||||
account.getIn(['relationship', 'endorsed'])
|
||||
? messages.unendorse
|
||||
: messages.endorse,
|
||||
relationship.endorsed ? messages.unendorse : messages.endorse,
|
||||
),
|
||||
action: handleEndorseToggle,
|
||||
});
|
||||
|
@ -746,7 +744,7 @@ export const AccountHeader: React.FC<{
|
|||
badges.push(<GroupBadge key='group-badge' />);
|
||||
}
|
||||
|
||||
account.get('roles', []).forEach((role) => {
|
||||
account.roles.forEach((role) => {
|
||||
badges.push(
|
||||
<Badge
|
||||
key={`role-badge-${role.get('id')}`}
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
|
||||
|
||||
import { useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
import { useLocation } from 'react-router-dom';
|
||||
|
||||
import Overlay from 'react-overlays/Overlay';
|
||||
import type {
|
||||
OffsetValue,
|
||||
UsePopperOptions,
|
||||
} from 'react-overlays/esm/usePopper';
|
||||
|
||||
import { DropdownMenu } from 'mastodon/components/dropdown_menu';
|
||||
import { useAppSelector } from 'mastodon/store';
|
||||
|
||||
const messages = defineMessages({
|
||||
browseHashtag: {
|
||||
id: 'hashtag.browse',
|
||||
defaultMessage: 'Browse posts in #{hashtag}',
|
||||
},
|
||||
browseHashtagFromAccount: {
|
||||
id: 'hashtag.browse_from_account',
|
||||
defaultMessage: 'Browse posts from @{name} in #{hashtag}',
|
||||
},
|
||||
muteHashtag: { id: 'hashtag.mute', defaultMessage: 'Mute #{hashtag}' },
|
||||
});
|
||||
|
||||
const offset = [5, 5] as OffsetValue;
|
||||
const popperConfig = { strategy: 'fixed' } as UsePopperOptions;
|
||||
|
||||
const isHashtagLink = (
|
||||
element: HTMLAnchorElement | null,
|
||||
): element is HTMLAnchorElement => {
|
||||
if (!element) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return element.matches('[data-menu-hashtag]');
|
||||
};
|
||||
|
||||
interface TargetParams {
|
||||
hashtag?: string;
|
||||
accountId?: string;
|
||||
}
|
||||
|
||||
export const HashtagMenuController: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const [open, setOpen] = useState(false);
|
||||
const [{ accountId, hashtag }, setTargetParams] = useState<TargetParams>({});
|
||||
const targetRef = useRef<HTMLAnchorElement | null>(null);
|
||||
const location = useLocation();
|
||||
const account = useAppSelector((state) =>
|
||||
accountId ? state.accounts.get(accountId) : undefined,
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setOpen(false);
|
||||
targetRef.current = null;
|
||||
}, [setOpen, location]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClick = (e: MouseEvent) => {
|
||||
const target = (e.target as HTMLElement).closest('a');
|
||||
|
||||
if (e.button !== 0 || e.ctrlKey || e.metaKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isHashtagLink(target)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const hashtag = target.text.replace(/^#/, '');
|
||||
const accountId = target.getAttribute('data-menu-hashtag');
|
||||
|
||||
if (!hashtag || !accountId) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
targetRef.current = target;
|
||||
setOpen(true);
|
||||
setTargetParams({ hashtag, accountId });
|
||||
};
|
||||
|
||||
document.addEventListener('click', handleClick, { capture: true });
|
||||
|
||||
return () => {
|
||||
document.removeEventListener('click', handleClick);
|
||||
};
|
||||
}, [setTargetParams, setOpen]);
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
setOpen(false);
|
||||
targetRef.current = null;
|
||||
}, [setOpen]);
|
||||
|
||||
const menu = useMemo(
|
||||
() => [
|
||||
{
|
||||
text: intl.formatMessage(messages.browseHashtag, {
|
||||
hashtag,
|
||||
}),
|
||||
to: `/tags/${hashtag}`,
|
||||
},
|
||||
{
|
||||
text: intl.formatMessage(messages.browseHashtagFromAccount, {
|
||||
hashtag,
|
||||
name: account?.username,
|
||||
}),
|
||||
to: `/@${account?.acct}/tagged/${hashtag}`,
|
||||
},
|
||||
null,
|
||||
{
|
||||
text: intl.formatMessage(messages.muteHashtag, {
|
||||
hashtag,
|
||||
}),
|
||||
href: '/filters',
|
||||
dangerous: true,
|
||||
},
|
||||
],
|
||||
[intl, hashtag, account],
|
||||
);
|
||||
|
||||
if (!open) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Overlay
|
||||
show={open}
|
||||
offset={offset}
|
||||
placement='bottom'
|
||||
flip
|
||||
target={targetRef}
|
||||
popperConfig={popperConfig}
|
||||
>
|
||||
{({ props, arrowProps, placement }) => (
|
||||
<div {...props}>
|
||||
<div className={`dropdown-animation dropdown-menu ${placement}`}>
|
||||
<div
|
||||
className={`dropdown-menu__arrow ${placement}`}
|
||||
{...arrowProps}
|
||||
/>
|
||||
|
||||
<DropdownMenu
|
||||
items={menu}
|
||||
onClose={handleClose}
|
||||
openedViaKeyboard={false}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</Overlay>
|
||||
);
|
||||
};
|
|
@ -31,6 +31,7 @@ import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding
|
|||
import BundleColumnError from './components/bundle_column_error';
|
||||
import Header from './components/header';
|
||||
import { UploadArea } from './components/upload_area';
|
||||
import { HashtagMenuController } from './components/hashtag_menu_controller';
|
||||
import ColumnsAreaContainer from './containers/columns_area_container';
|
||||
import LoadingBarContainer from './containers/loading_bar_container';
|
||||
import ModalContainer from './containers/modal_container';
|
||||
|
@ -611,6 +612,7 @@ class UI extends PureComponent {
|
|||
{layout !== 'mobile' && <PictureInPicture />}
|
||||
<AlertsController />
|
||||
{!disableHoverCards && <HoverCardController />}
|
||||
<HashtagMenuController />
|
||||
<LoadingBarContainer className='loading-bar' />
|
||||
<ModalContainer />
|
||||
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "Редактиране на профила",
|
||||
"account.enable_notifications": "Известяване при публикуване от @{name}",
|
||||
"account.endorse": "Представи в профила",
|
||||
"account.featured": "Препоръчано",
|
||||
"account.featured.hashtags": "Хаштагове",
|
||||
"account.featured.posts": "Публикации",
|
||||
"account.featured_tags.last_status_at": "Последна публикация на {date}",
|
||||
"account.featured_tags.last_status_never": "Няма публикации",
|
||||
"account.follow": "Последване",
|
||||
|
@ -293,6 +296,7 @@
|
|||
"emoji_button.search_results": "Резултати от търсене",
|
||||
"emoji_button.symbols": "Символи",
|
||||
"emoji_button.travel": "Пътуване и места",
|
||||
"empty_column.account_featured": "Списъкът е празен",
|
||||
"empty_column.account_hides_collections": "Този потребител е избрал да не дава тази информация",
|
||||
"empty_column.account_suspended": "Спрян акаунт",
|
||||
"empty_column.account_timeline": "Тук няма публикации!",
|
||||
|
@ -377,6 +381,8 @@
|
|||
"generic.saved": "Запазено",
|
||||
"getting_started.heading": "Първи стъпки",
|
||||
"hashtag.admin_moderation": "Отваряне на модериращия интерфейс за #{name}",
|
||||
"hashtag.browse": "Разглеждане на публикации в #{hashtag}",
|
||||
"hashtag.browse_from_account": "Разглеждане на публикации от @{name} из #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "и {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "или {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "без {additional}",
|
||||
|
@ -390,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} публикация} other {{counter} публикации}} днес",
|
||||
"hashtag.follow": "Следване на хаштаг",
|
||||
"hashtag.mute": "Заглушаване на #{hashtag}",
|
||||
"hashtag.unfollow": "Спиране на следване на хаштаг",
|
||||
"hashtags.and_other": "…и {count, plural, other {# още}}",
|
||||
"hints.profiles.followers_may_be_missing": "Последователи за този профил може да липсват.",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "Edita el perfil",
|
||||
"account.enable_notifications": "Notifica'm els tuts de @{name}",
|
||||
"account.endorse": "Recomana en el perfil",
|
||||
"account.featured": "Destacat",
|
||||
"account.featured.hashtags": "Etiquetes",
|
||||
"account.featured.posts": "Publicacions",
|
||||
"account.featured_tags.last_status_at": "Darrer tut el {date}",
|
||||
"account.featured_tags.last_status_never": "No hi ha tuts",
|
||||
"account.follow": "Segueix",
|
||||
|
@ -293,6 +296,7 @@
|
|||
"emoji_button.search_results": "Resultats de la cerca",
|
||||
"emoji_button.symbols": "Símbols",
|
||||
"emoji_button.travel": "Viatges i llocs",
|
||||
"empty_column.account_featured": "Aquesta llista està buida",
|
||||
"empty_column.account_hides_collections": "Aquest usuari ha decidit no mostrar aquesta informació",
|
||||
"empty_column.account_suspended": "Compte suspès",
|
||||
"empty_column.account_timeline": "No hi ha tuts aquí!",
|
||||
|
@ -390,6 +394,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} tut} other {{counter} tuts}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} avui",
|
||||
"hashtag.follow": "Segueix l'etiqueta",
|
||||
"hashtag.mute": "Silencia #{hashtag}",
|
||||
"hashtag.unfollow": "Deixa de seguir l'etiqueta",
|
||||
"hashtags.and_other": "…i {count, plural, other {# més}}",
|
||||
"hints.profiles.followers_may_be_missing": "Es poden haver perdut seguidors d'aquest perfil.",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "Upravit profil",
|
||||
"account.enable_notifications": "Oznamovat mi příspěvky @{name}",
|
||||
"account.endorse": "Zvýraznit na profilu",
|
||||
"account.featured": "Doporučené",
|
||||
"account.featured.hashtags": "Hashtagy",
|
||||
"account.featured.posts": "Příspěvky",
|
||||
"account.featured_tags.last_status_at": "Poslední příspěvek {date}",
|
||||
"account.featured_tags.last_status_never": "Žádné příspěvky",
|
||||
"account.follow": "Sledovat",
|
||||
|
@ -293,6 +296,7 @@
|
|||
"emoji_button.search_results": "Výsledky hledání",
|
||||
"emoji_button.symbols": "Symboly",
|
||||
"emoji_button.travel": "Cestování a místa",
|
||||
"empty_column.account_featured": "Tento seznam je prázdný",
|
||||
"empty_column.account_hides_collections": "Tento uživatel se rozhodl tuto informaci nezveřejňovat",
|
||||
"empty_column.account_suspended": "Účet je pozastaven",
|
||||
"empty_column.account_timeline": "Nejsou tu žádné příspěvky!",
|
||||
|
@ -377,6 +381,8 @@
|
|||
"generic.saved": "Uloženo",
|
||||
"getting_started.heading": "Začínáme",
|
||||
"hashtag.admin_moderation": "Otevřít moderátorské rozhraní pro #{name}",
|
||||
"hashtag.browse": "Procházet příspěvky na #{hashtag}",
|
||||
"hashtag.browse_from_account": "Procházet příspěvky od @{name} v #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "a {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "nebo {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "bez {additional}",
|
||||
|
@ -390,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
||||
"hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
|
||||
"hashtag.follow": "Sledovat hashtag",
|
||||
"hashtag.mute": "Skrýt #{hashtag}",
|
||||
"hashtag.unfollow": "Přestat sledovat hashtag",
|
||||
"hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}",
|
||||
"hints.profiles.followers_may_be_missing": "Sledující mohou pro tento profil chybět.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Gemt",
|
||||
"getting_started.heading": "Startmenu",
|
||||
"hashtag.admin_moderation": "Åbn modereringsbrugerflade for #{name}",
|
||||
"hashtag.browse": "Gennemse indlæg i #{hashtag}",
|
||||
"hashtag.browse_from_account": "Gennemse indlæg fra @{name} i #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "og {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "eller {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "uden {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
|
||||
"hashtag.follow": "Følg etiket",
|
||||
"hashtag.mute": "Tavsgør #{hashtag}",
|
||||
"hashtag.unfollow": "Stop med at følge etiket",
|
||||
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
|
||||
"hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Gespeichert",
|
||||
"getting_started.heading": "Auf gehts!",
|
||||
"hashtag.admin_moderation": "#{name} moderieren",
|
||||
"hashtag.browse": "Beiträge mit #{hashtag} suchen",
|
||||
"hashtag.browse_from_account": "Beiträge von @{name} mit #{hashtag} suchen",
|
||||
"hashtag.column_header.tag_mode.all": "und {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "oder {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "ohne {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}} heute",
|
||||
"hashtag.follow": "Hashtag folgen",
|
||||
"hashtag.mute": "#{hashtag} stummschalten",
|
||||
"hashtag.unfollow": "Hashtag entfolgen",
|
||||
"hashtags.and_other": "… und {count, plural, one{# weiterer} other {# weitere}}",
|
||||
"hints.profiles.followers_may_be_missing": "Möglicherweise werden für dieses Profil nicht alle Follower angezeigt.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Saved",
|
||||
"getting_started.heading": "Getting started",
|
||||
"hashtag.admin_moderation": "Open moderation interface for #{name}",
|
||||
"hashtag.browse": "Browse posts in #{hashtag}",
|
||||
"hashtag.browse_from_account": "Browse posts from @{name} in #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "and {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "or {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "without {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} posts}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} posts}} today",
|
||||
"hashtag.follow": "Follow hashtag",
|
||||
"hashtag.mute": "Mute #{hashtag}",
|
||||
"hashtag.unfollow": "Unfollow hashtag",
|
||||
"hashtags.and_other": "…and {count, plural, other {# more}}",
|
||||
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Guardado",
|
||||
"getting_started.heading": "Inicio de Mastodon",
|
||||
"hashtag.admin_moderation": "Abrir interface de moderación para #{name}",
|
||||
"hashtag.browse": "Ver publicaciones con #{hashtag}",
|
||||
"hashtag.browse_from_account": "Ver publicaciones de @{name} con #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "y {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.mute": "Silenciar #{hashtag}",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"hashtags.and_other": "…y {count, plural, other {# más}}",
|
||||
"hints.profiles.followers_may_be_missing": "Es posible que falten seguidores de este perfil.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Guardado",
|
||||
"getting_started.heading": "Primeros pasos",
|
||||
"hashtag.admin_moderation": "Abrir interfaz de moderación para #{name}",
|
||||
"hashtag.browse": "Explorar publicaciones en #{hashtag}",
|
||||
"hashtag.browse_from_account": "Explorar publicaciones desde @{name} en #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "y {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.mute": "Silenciar #{hashtag}",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"hashtags.and_other": "…y {count, plural, other {# más}}",
|
||||
"hints.profiles.followers_may_be_missing": "Puede que no se muestren todos los seguidores de este perfil.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Guardado",
|
||||
"getting_started.heading": "Primeros pasos",
|
||||
"hashtag.admin_moderation": "Abrir interfaz de moderación para #{name}",
|
||||
"hashtag.browse": "Explorar publicaciones en #{hashtag}",
|
||||
"hashtag.browse_from_account": "Explorar publicaciones desde @{name} en #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "y {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.mute": "Silenciar #{hashtag}",
|
||||
"hashtag.unfollow": "Dejar de seguir etiqueta",
|
||||
"hashtags.and_other": "…y {count, plural, other {# más}}",
|
||||
"hints.profiles.followers_may_be_missing": "Puede que no se muestren todos los seguidores de este perfil.",
|
||||
|
|
|
@ -380,6 +380,8 @@
|
|||
"generic.saved": "Tallennettu",
|
||||
"getting_started.heading": "Näin pääset alkuun",
|
||||
"hashtag.admin_moderation": "Avaa tunnisteen #{name} moderointinäkymä",
|
||||
"hashtag.browse": "Selaa julkaisuja tunnisteella #{hashtag}",
|
||||
"hashtag.browse_from_account": "Selaa julkaisuja käyttäjältä @{name} tunnisteella #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "ja {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "tai {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "ilman {additional}",
|
||||
|
@ -393,6 +395,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one{{counter} julkaisu} other {{counter} julkaisua}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}} tänään",
|
||||
"hashtag.follow": "Seuraa aihetunnistetta",
|
||||
"hashtag.mute": "Mykistä #{hashtag}",
|
||||
"hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen",
|
||||
"hashtags.and_other": "…ja {count, plural, other {# lisää}}",
|
||||
"hints.profiles.followers_may_be_missing": "Tämän profiilin seuraajia saattaa puuttua.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Goymt",
|
||||
"getting_started.heading": "At byrja",
|
||||
"hashtag.admin_moderation": "Lat umsjónarmarkamót upp fyri #{name}",
|
||||
"hashtag.browse": "Blaða gjøgnum postar í #{hashtag}",
|
||||
"hashtag.browse_from_account": "Blaða gjøgnum postar frá @{name} í #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "og {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "ella {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "uttan {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} postur} other {{counter} postar}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postur} other {{counter} postar}} í dag",
|
||||
"hashtag.follow": "Fylg frámerki",
|
||||
"hashtag.mute": "Doyv @#{hashtag}",
|
||||
"hashtag.unfollow": "Gevst at fylgja frámerki",
|
||||
"hashtags.and_other": "…og {count, plural, other {# afturat}}",
|
||||
"hints.profiles.followers_may_be_missing": "Fylgjarar hjá hesum vanganum kunnu mangla.",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "Modifier le profil",
|
||||
"account.enable_notifications": "Me notifier quand @{name} publie",
|
||||
"account.endorse": "Inclure sur profil",
|
||||
"account.featured": "En vedette",
|
||||
"account.featured.hashtags": "Hashtags",
|
||||
"account.featured.posts": "Messages",
|
||||
"account.featured_tags.last_status_at": "Dernière publication {date}",
|
||||
"account.featured_tags.last_status_never": "Aucune publication",
|
||||
"account.follow": "Suivre",
|
||||
|
@ -64,6 +67,7 @@
|
|||
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"account.unblock": "Débloquer @{name}",
|
||||
"account.unblock_domain": "Débloquer le domaine {domain}",
|
||||
"account.unblock_domain_short": "Débloquer",
|
||||
"account.unblock_short": "Débloquer",
|
||||
"account.unendorse": "Ne pas inclure sur profil",
|
||||
"account.unfollow": "Ne plus suivre",
|
||||
|
@ -292,6 +296,7 @@
|
|||
"emoji_button.search_results": "Résultats",
|
||||
"emoji_button.symbols": "Symboles",
|
||||
"emoji_button.travel": "Voyage et lieux",
|
||||
"empty_column.account_featured": "Cette liste est vide",
|
||||
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
|
||||
"empty_column.account_suspended": "Compte suspendu",
|
||||
"empty_column.account_timeline": "Aucune publication ici!",
|
||||
|
@ -904,6 +909,10 @@
|
|||
"video.expand": "Agrandir la vidéo",
|
||||
"video.fullscreen": "Plein écran",
|
||||
"video.hide": "Masquer la vidéo",
|
||||
"video.mute": "Couper le son",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Lecture"
|
||||
"video.play": "Lecture",
|
||||
"video.unmute": "Rétablir le son",
|
||||
"video.volume_down": "Baisser le volume",
|
||||
"video.volume_up": "Augmenter le volume"
|
||||
}
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "Modifier le profil",
|
||||
"account.enable_notifications": "Me notifier quand @{name} publie quelque chose",
|
||||
"account.endorse": "Recommander sur votre profil",
|
||||
"account.featured": "En vedette",
|
||||
"account.featured.hashtags": "Hashtags",
|
||||
"account.featured.posts": "Messages",
|
||||
"account.featured_tags.last_status_at": "Dernier message le {date}",
|
||||
"account.featured_tags.last_status_never": "Aucun message",
|
||||
"account.follow": "Suivre",
|
||||
|
@ -64,6 +67,7 @@
|
|||
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"account.unblock": "Débloquer @{name}",
|
||||
"account.unblock_domain": "Débloquer le domaine {domain}",
|
||||
"account.unblock_domain_short": "Débloquer",
|
||||
"account.unblock_short": "Débloquer",
|
||||
"account.unendorse": "Ne plus recommander sur le profil",
|
||||
"account.unfollow": "Ne plus suivre",
|
||||
|
@ -292,6 +296,7 @@
|
|||
"emoji_button.search_results": "Résultats de la recherche",
|
||||
"emoji_button.symbols": "Symboles",
|
||||
"emoji_button.travel": "Voyage et lieux",
|
||||
"empty_column.account_featured": "Cette liste est vide",
|
||||
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
|
||||
"empty_column.account_suspended": "Compte suspendu",
|
||||
"empty_column.account_timeline": "Aucun message ici !",
|
||||
|
@ -904,6 +909,10 @@
|
|||
"video.expand": "Agrandir la vidéo",
|
||||
"video.fullscreen": "Plein écran",
|
||||
"video.hide": "Masquer la vidéo",
|
||||
"video.mute": "Couper le son",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Lecture"
|
||||
"video.play": "Lecture",
|
||||
"video.unmute": "Rétablir le son",
|
||||
"video.volume_down": "Baisser le volume",
|
||||
"video.volume_up": "Augmenter le volume"
|
||||
}
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Gardado",
|
||||
"getting_started.heading": "Primeiros pasos",
|
||||
"hashtag.admin_moderation": "Abrir interface de moderación para ##{name}",
|
||||
"hashtag.browse": "Ver publicacións con #{hashtag}",
|
||||
"hashtag.browse_from_account": "Ver as publicacións de @{name} con #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "e {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "ou {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sen {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicacións}} hoxe",
|
||||
"hashtag.follow": "Seguir cancelo",
|
||||
"hashtag.mute": "Acalar a #{hashtag}",
|
||||
"hashtag.unfollow": "Deixar de seguir cancelo",
|
||||
"hashtags.and_other": "…e {count, plural, one {}other {# máis}}",
|
||||
"hints.profiles.followers_may_be_missing": "Poderían faltar seguidoras deste perfil.",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "עריכת פרופיל",
|
||||
"account.enable_notifications": "שלח לי התראות כש@{name} מפרסם",
|
||||
"account.endorse": "קדם את החשבון בפרופיל",
|
||||
"account.featured": "מומלץ",
|
||||
"account.featured.hashtags": "תגיות",
|
||||
"account.featured.posts": "הודעות",
|
||||
"account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}",
|
||||
"account.featured_tags.last_status_never": "אין חצרוצים",
|
||||
"account.follow": "לעקוב",
|
||||
|
@ -293,6 +296,7 @@
|
|||
"emoji_button.search_results": "תוצאות חיפוש",
|
||||
"emoji_button.symbols": "סמלים",
|
||||
"emoji_button.travel": "טיולים ואתרים",
|
||||
"empty_column.account_featured": "הרשימה ריקה",
|
||||
"empty_column.account_hides_collections": "המשתמש.ת בחר.ה להסתיר מידע זה",
|
||||
"empty_column.account_suspended": "חשבון מושעה",
|
||||
"empty_column.account_timeline": "אין עדיין אף הודעה!",
|
||||
|
@ -377,6 +381,8 @@
|
|||
"generic.saved": "נשמר",
|
||||
"getting_started.heading": "בואו נתחיל",
|
||||
"hashtag.admin_moderation": "פתיחת ממשק פיקוח דיון עבור #{name}",
|
||||
"hashtag.browse": "קריאת הודעות תחת #{hashtag}",
|
||||
"hashtag.browse_from_account": "קריאת הודעות מאת @{name} תחת #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "ו- {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "או {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "ללא {additional}",
|
||||
|
@ -390,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}} היום",
|
||||
"hashtag.follow": "לעקוב אחרי תגית",
|
||||
"hashtag.mute": "להשתיק את #{hashtag}",
|
||||
"hashtag.unfollow": "להפסיק לעקוב אחרי תגית",
|
||||
"hashtags.and_other": "…{count, plural,other {ועוד #}}",
|
||||
"hints.profiles.followers_may_be_missing": "יתכן כי עוקבים של פרופיל זה חסרים.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Elmentve",
|
||||
"getting_started.heading": "Első lépések",
|
||||
"hashtag.admin_moderation": "Moderációs felület megnyitása a következőhöz: #{name}",
|
||||
"hashtag.browse": "Bejegyzések ebben: #{hashtag}",
|
||||
"hashtag.browse_from_account": "@{name} bejegyzéseinek tallózása ebben: #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "és {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "vagy {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "{additional} nélkül",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}} ma",
|
||||
"hashtag.follow": "Hashtag követése",
|
||||
"hashtag.mute": "#{hashtag} némítása",
|
||||
"hashtag.unfollow": "Hashtag követésének megszüntetése",
|
||||
"hashtags.and_other": "…és {count, plural, other {# további}}",
|
||||
"hints.profiles.followers_may_be_missing": "A profil követői lehet, hogy hiányoznak.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Vistað",
|
||||
"getting_started.heading": "Komast í gang",
|
||||
"hashtag.admin_moderation": "Opna umsjónarviðmót fyrir #{name}",
|
||||
"hashtag.browse": "Skoða færslur með #{hashtag}",
|
||||
"hashtag.browse_from_account": "Skoða færslur frá @{name} í #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "og {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "eða {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "án {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} færsla} other {{counter} færslur}} í dag",
|
||||
"hashtag.follow": "Fylgjast með myllumerki",
|
||||
"hashtag.mute": "Þagga #{hashtag}",
|
||||
"hashtag.unfollow": "Hætta að fylgjast með myllumerki",
|
||||
"hashtags.and_other": "…og {count, plural, other {# til viðbótar}}",
|
||||
"hints.profiles.followers_may_be_missing": "Fylgjendur frá þessum notanda gæti vantað.",
|
||||
|
|
|
@ -74,7 +74,7 @@
|
|||
"alert.rate_limited.title": "Aktum s talast",
|
||||
"alert.unexpected.message": "Yeḍra-d unezri ur netturaǧu ara.",
|
||||
"alert.unexpected.title": "Ayhuh!",
|
||||
"alt_text_badge.title": "Aḍris asegzan",
|
||||
"alt_text_badge.title": "Aḍris amlellay",
|
||||
"alt_text_modal.add_alt_text": "Rnu aḍris amlellay",
|
||||
"alt_text_modal.add_text_from_image": "Rnu aḍris amlellay seg tugna",
|
||||
"alt_text_modal.cancel": "Semmet",
|
||||
|
@ -172,6 +172,7 @@
|
|||
"confirmations.logout.title": "Tebɣiḍ ad teffɣeḍ ssya?",
|
||||
"confirmations.missing_alt_text.confirm": "Rnu aḍris amlellay",
|
||||
"confirmations.missing_alt_text.secondary": "Suffeɣ akken yebɣu yili",
|
||||
"confirmations.missing_alt_text.title": "Rnu aḍris amlellay?",
|
||||
"confirmations.mute.confirm": "Sgugem",
|
||||
"confirmations.redraft.confirm": "Kkes sakin ɛiwed tira",
|
||||
"confirmations.reply.confirm": "Err",
|
||||
|
@ -259,8 +260,11 @@
|
|||
"follow_request.reject": "Agi",
|
||||
"follow_suggestions.dismiss": "Dayen ur t-id-skan ara",
|
||||
"follow_suggestions.featured_longer": "Yettwafraned s ufus sɣur agraw n {domain}",
|
||||
"follow_suggestions.friends_of_friends_longer": "D aɣeṛfan ar wid i teṭṭafareḍ",
|
||||
"follow_suggestions.hints.featured": "Amaɣnu-a ifren-it-id wegraw n {domain} s ufus.",
|
||||
"follow_suggestions.popular_suggestion_longer": "Yettwassen deg {domain}",
|
||||
"follow_suggestions.hints.friends_of_friends": "Amaɣnu-a d aɣeṛfan ɣer wid i teṭṭafaṛeḍ.",
|
||||
"follow_suggestions.popular_suggestion": "Asumer aɣeṛfan",
|
||||
"follow_suggestions.popular_suggestion_longer": "D aɣeṛfan deg {domain}",
|
||||
"follow_suggestions.view_all": "Wali-ten akk",
|
||||
"follow_suggestions.who_to_follow": "Ad tḍefreḍ?",
|
||||
"followed_tags": "Ihacṭagen yettwaḍfaren",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "프로필 편집",
|
||||
"account.enable_notifications": "@{name} 의 게시물 알림 켜기",
|
||||
"account.endorse": "프로필에 추천하기",
|
||||
"account.featured": "추천",
|
||||
"account.featured.hashtags": "해시태그",
|
||||
"account.featured.posts": "게시물",
|
||||
"account.featured_tags.last_status_at": "{date}에 마지막으로 게시",
|
||||
"account.featured_tags.last_status_never": "게시물 없음",
|
||||
"account.follow": "팔로우",
|
||||
|
@ -64,6 +67,7 @@
|
|||
"account.statuses_counter": "{count, plural, other {게시물 {counter}개}}",
|
||||
"account.unblock": "차단 해제",
|
||||
"account.unblock_domain": "도메인 {domain} 차단 해제",
|
||||
"account.unblock_domain_short": "차단 해제",
|
||||
"account.unblock_short": "차단 해제",
|
||||
"account.unendorse": "프로필에 추천하지 않기",
|
||||
"account.unfollow": "언팔로우",
|
||||
|
@ -292,6 +296,7 @@
|
|||
"emoji_button.search_results": "검색 결과",
|
||||
"emoji_button.symbols": "기호",
|
||||
"emoji_button.travel": "여행과 장소",
|
||||
"empty_column.account_featured": "목록이 비어있습니다",
|
||||
"empty_column.account_hides_collections": "이 사용자는 이 정보를 사용할 수 없도록 설정했습니다",
|
||||
"empty_column.account_suspended": "계정 정지됨",
|
||||
"empty_column.account_timeline": "이곳에는 게시물이 없습니다!",
|
||||
|
@ -376,6 +381,8 @@
|
|||
"generic.saved": "저장됨",
|
||||
"getting_started.heading": "시작하기",
|
||||
"hashtag.admin_moderation": "#{name}에 대한 중재화면 열기",
|
||||
"hashtag.browse": "#{hashtag}의 게시물 둘러보기",
|
||||
"hashtag.browse_from_account": "@{name}의 #{hashtag} 게시물 둘러보기",
|
||||
"hashtag.column_header.tag_mode.all": "및 {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "또는 {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "{additional}를 제외하고",
|
||||
|
@ -389,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, other {게시물 {counter}개}}",
|
||||
"hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}",
|
||||
"hashtag.follow": "해시태그 팔로우",
|
||||
"hashtag.mute": "#{hashtag} 뮤트",
|
||||
"hashtag.unfollow": "해시태그 팔로우 해제",
|
||||
"hashtags.and_other": "…및 {count, plural,other {#개}}",
|
||||
"hints.profiles.followers_may_be_missing": "이 프로필의 팔로워 목록은 일부 누락되었을 수 있습니다.",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"about.blocks": "Pelayan yang disederhanakan",
|
||||
"about.blocks": "Pelayan yang diselaraskan",
|
||||
"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",
|
||||
|
@ -11,13 +11,13 @@
|
|||
"about.not_available": "Maklumat ini belum tersedia pada pelayan ini.",
|
||||
"about.powered_by": "Media sosial terpencar yang dikuasakan oleh {mastodon}",
|
||||
"about.rules": "Peraturan pelayan",
|
||||
"account.account_note_header": "Personal note",
|
||||
"account.account_note_header": "Catatan peribadi",
|
||||
"account.add_or_remove_from_list": "Tambah atau Buang dari senarai",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.bot": "Automatik",
|
||||
"account.badges.group": "Kumpulan",
|
||||
"account.block": "Sekat @{name}",
|
||||
"account.block_domain": "Sekat domain {domain}",
|
||||
"account.block_short": "Malay",
|
||||
"account.block_short": "Sekat",
|
||||
"account.blocked": "Disekat",
|
||||
"account.cancel_follow_request": "Batalkan permintaan ikut",
|
||||
"account.copy": "Salin pautan ke profil",
|
||||
|
@ -33,24 +33,24 @@
|
|||
"account.follow_back": "Ikut balik",
|
||||
"account.followers": "Pengikut",
|
||||
"account.followers.empty": "Belum ada yang mengikuti pengguna ini.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Diikuti} other {{counter} Diikuti}}",
|
||||
"account.following": "Mengikuti",
|
||||
"account.following_counter": "{count, plural, other {{counter} following}}",
|
||||
"account.followers_counter": "{count, plural, one {{counter} pengikut} other {{counter} pengikut}}",
|
||||
"account.following": "Ikutan",
|
||||
"account.following_counter": "{count, plural, other {{counter} ikutan}}",
|
||||
"account.follows.empty": "Pengguna ini belum mengikuti sesiapa.",
|
||||
"account.go_to_profile": "Pergi ke profil",
|
||||
"account.hide_reblogs": "Sembunyikan galakan daripada @{name}",
|
||||
"account.in_memoriam": "Dalam Memoriam.",
|
||||
"account.joined_short": "Menyertai",
|
||||
"account.languages": "Tukar bahasa yang dilanggan",
|
||||
"account.in_memoriam": "Dalam kenangan.",
|
||||
"account.joined_short": "Tarikh penyertaan",
|
||||
"account.languages": "Tukar bahasa langganan",
|
||||
"account.link_verified_on": "Pemilikan pautan ini telah disemak pada {date}",
|
||||
"account.locked_info": "Status privasi akaun ini dikunci. Pemiliknya menyaring sendiri siapa yang boleh mengikutinya.",
|
||||
"account.locked_info": "Taraf privasi akaun ini dikunci. Pemiliknya menyaring sendiri siapa yang boleh mengikutinya.",
|
||||
"account.media": "Media",
|
||||
"account.mention": "Sebut @{name}",
|
||||
"account.moved_to": "{name} telah menandakan bahawa akaun baru mereka sekarang ialah:",
|
||||
"account.mute": "Bisukan @{name}",
|
||||
"account.mute_notifications_short": "Redam pemberitahuan",
|
||||
"account.mute": "Redamkan @{name}",
|
||||
"account.mute_notifications_short": "Redamkan pemberitahuan",
|
||||
"account.mute_short": "Redam",
|
||||
"account.muted": "Dibisukan",
|
||||
"account.muted": "Diredamkan",
|
||||
"account.mutual": "Rakan kongsi",
|
||||
"account.no_bio": "Tiada penerangan diberikan.",
|
||||
"account.open_original_page": "Buka halaman asal",
|
||||
|
@ -64,12 +64,13 @@
|
|||
"account.statuses_counter": "{count, plural, other {{counter} siaran}}",
|
||||
"account.unblock": "Nyahsekat @{name}",
|
||||
"account.unblock_domain": "Nyahsekat domain {domain}",
|
||||
"account.unblock_domain_short": "Nyahsekat",
|
||||
"account.unblock_short": "Nyahsekat",
|
||||
"account.unendorse": "Jangan tampilkan di profil",
|
||||
"account.unfollow": "Nyahikut",
|
||||
"account.unmute": "Nyahbisukan @{name}",
|
||||
"account.unmute_notifications_short": "Nyahredam notifikasi",
|
||||
"account.unmute_short": "Nyahbisu",
|
||||
"account.unmute_notifications_short": "Nyahredamkan pemberitahuan",
|
||||
"account.unmute_short": "Nyahredam",
|
||||
"account_note.placeholder": "Klik untuk menambah catatan",
|
||||
"admin.dashboard.daily_retention": "Kadar pengekalan pengguna mengikut hari selepas mendaftar",
|
||||
"admin.dashboard.monthly_retention": "Kadar pengekalan pengguna mengikut bulan selepas mendaftar",
|
||||
|
@ -115,6 +116,8 @@
|
|||
"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.show_less": "Tunjuk kurang",
|
||||
"block_modal.show_more": "Tunjuk lebih",
|
||||
"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.",
|
||||
|
@ -141,13 +144,13 @@
|
|||
"closed_registrations_modal.preamble": "Mastodon adalah terpencar, oleh itu di mana-mana anda mencipta akaun anda, anda boleh mengikut dan berinteraksi dengan sesiapa pada pelayan ini. Anda juga boleh hos sendiri!",
|
||||
"closed_registrations_modal.title": "Mendaftar pada Mastodon",
|
||||
"column.about": "Perihal",
|
||||
"column.blocks": "Pengguna yang disekat",
|
||||
"column.blocks": "Pengguna tersekat",
|
||||
"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.domain_blocks": "Domain tersekat",
|
||||
"column.edit_list": "Sunting senarai",
|
||||
"column.favourites": "Sukaan",
|
||||
"column.firehose": "Suapan langsung",
|
||||
|
@ -155,7 +158,7 @@
|
|||
"column.home": "Laman Utama",
|
||||
"column.list_members": "Urus ahli senarai",
|
||||
"column.lists": "Senarai",
|
||||
"column.mutes": "Pengguna yang dibisukan",
|
||||
"column.mutes": "Pengguna teredam",
|
||||
"column.notifications": "Pemberitahuan",
|
||||
"column.pins": "Hantaran disemat",
|
||||
"column.public": "Garis masa bersekutu",
|
||||
|
@ -217,13 +220,21 @@
|
|||
"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.missing_alt_text.secondary": "Hantar saja",
|
||||
"confirmations.missing_alt_text.title": "Tambah teks alternatif?",
|
||||
"confirmations.mute.confirm": "Redamkan",
|
||||
"confirmations.redraft.confirm": "Padam & rangka semula",
|
||||
"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.redraft.title": "Padam & gubah semula hantaran?",
|
||||
"confirmations.reply.confirm": "Balas",
|
||||
"confirmations.reply.message": "Membalas sekarang akan menulis ganti mesej yang anda sedang karang. Adakah anda pasti anda ingin teruskan?",
|
||||
"confirmations.reply.title": "Tulis ganti hantaran?",
|
||||
"confirmations.unfollow.confirm": "Nyahikut",
|
||||
"confirmations.unfollow.message": "Adakah anda pasti anda ingin nyahikuti {name}?",
|
||||
"confirmations.unfollow.title": "Berhenti mengikut pengguna?",
|
||||
"content_warning.hide": "Sorok hantaran",
|
||||
"content_warning.show": "Tunjuk saja",
|
||||
"content_warning.show_more": "Tunjuk lebih",
|
||||
"conversation.delete": "Padam perbualan",
|
||||
"conversation.mark_as_read": "Tanda sudah dibaca",
|
||||
"conversation.open": "Lihat perbualan",
|
||||
|
@ -240,6 +251,22 @@
|
|||
"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.",
|
||||
"dismissable_banner.public_timeline": "Hantaran-hantaran awam terkini ini dari pengguna alam bersekutu yang diikuti oleh pengguna dari {domain}.",
|
||||
"domain_block_modal.block": "Sekat pelayan",
|
||||
"domain_block_modal.block_account_instead": "Sekat @{name} sahaja",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Pengguna dari pelayan ini boleh berinteraksi dengan hantaran lama anda.",
|
||||
"domain_block_modal.they_cant_follow": "Pengguna dari pelayan ini tidak boleh mengikuti anda.",
|
||||
"domain_block_modal.they_wont_know": "Dia tidak akan tahu bahawa dia telah disekat.",
|
||||
"domain_block_modal.title": "Sekat domain?",
|
||||
"domain_block_modal.you_will_lose_num_followers": "Anda akan kehilangan {followersCount, plural, other {{followersCountDisplay} pengikut}} dan {followingCount, plural, other {{followingCountDisplay} ikutan}}.",
|
||||
"domain_block_modal.you_will_lose_relationships": "Anda akan kehilangan semua pengikut dan ikutan anda dari pelayan ini.",
|
||||
"domain_block_modal.you_wont_see_posts": "Anda tidak akan melihat hantaran atau pemberitahuan dari pengguna pada pelayan ini.",
|
||||
"domain_pill.activitypub_lets_connect": "Hal ini membolehkan anda berhubung dan berinteraksi bukan sahaja dengan pengguna Mastodon tetapi melintasi pelbagai aplikasi sosial juga.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub adalah seperti bahasa yang digunakan oleh Mastodon untuk berhubung dengan jaringan sosial lain.",
|
||||
"domain_pill.server": "Pelayan",
|
||||
"domain_pill.your_handle": "Pemegang anda:",
|
||||
"domain_pill.your_server": "Rumah maya anda, tempatnya hantaran anda disimpan. Tidak berkenan dengan yang ini? Pindah antara pelayan pada bila-bila masa dan bawa pengikut anda sekali.",
|
||||
"domain_pill.your_username": "Pengenal unik anda pada pelayan ini. Anda mungkin akan berkongsi nama pengguna dengan pengguna daripada pelayan lain.",
|
||||
"embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.",
|
||||
"embed.preview": "Begini rupanya nanti:",
|
||||
"emoji_button.activity": "Aktiviti",
|
||||
|
@ -257,6 +284,7 @@
|
|||
"emoji_button.search_results": "Hasil carian",
|
||||
"emoji_button.symbols": "Simbol",
|
||||
"emoji_button.travel": "Kembara & Tempat",
|
||||
"empty_column.account_featured": "Senarai ini kosong",
|
||||
"empty_column.account_hides_collections": "Pengguna ini telah memilih untuk tidak menyediakan informasi tersebut",
|
||||
"empty_column.account_suspended": "Akaun digantung",
|
||||
"empty_column.account_timeline": "Tiada hantaran di sini!",
|
||||
|
@ -274,7 +302,7 @@
|
|||
"empty_column.hashtag": "Belum ada apa-apa dengan tanda pagar ini.",
|
||||
"empty_column.home": "Garis masa laman utama anda kosong! Ikuti lebih ramai orang untuk mengisinya. {suggestions}",
|
||||
"empty_column.list": "Tiada apa-apa di senarai ini lagi. Apabila ahli senarai ini menerbitkan hantaran baharu, ia akan dipaparkan di sini.",
|
||||
"empty_column.mutes": "Anda belum membisukan sesiapa.",
|
||||
"empty_column.mutes": "Anda belum meredamkan sesiapa.",
|
||||
"empty_column.notifications": "Anda belum ada sebarang pemberitahuan. Apabila orang lain berinteraksi dengan anda, ia akan muncul di sini.",
|
||||
"empty_column.public": "Tiada apa-apa di sini! Tulis sesuatu secara awam, atau ikuti pengguna daripada pelayan lain secara manual untuk mengisinya",
|
||||
"error.unexpected_crash.explanation": "Disebabkan pepijat dalam kod kami atau masalah keserasian pelayar, halaman ini tidak dapat dipaparkan dengan betulnya.",
|
||||
|
@ -341,6 +369,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, other {{counter} siaran}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, other {{counter} siaran}} hari ini",
|
||||
"hashtag.follow": "Ikuti hashtag",
|
||||
"hashtag.mute": "Redamkan #{hashtag}",
|
||||
"hashtag.unfollow": "Nyahikut tanda pagar",
|
||||
"hashtags.and_other": "…dan {count, plural, other {# more}}",
|
||||
"home.column_settings.show_reblogs": "Tunjukkan galakan",
|
||||
|
@ -361,7 +390,7 @@
|
|||
"intervals.full.hours": "{number, plural, other {# jam}}",
|
||||
"intervals.full.minutes": "{number, plural, other {# minit}}",
|
||||
"keyboard_shortcuts.back": "to navigate back",
|
||||
"keyboard_shortcuts.blocked": "to open blocked users list",
|
||||
"keyboard_shortcuts.blocked": "Buka senarai pengguna tersekat",
|
||||
"keyboard_shortcuts.boost": "to boost",
|
||||
"keyboard_shortcuts.column": "Tumpu pada lajur",
|
||||
"keyboard_shortcuts.compose": "to focus the compose textarea",
|
||||
|
@ -378,7 +407,7 @@
|
|||
"keyboard_shortcuts.legend": "to display this legend",
|
||||
"keyboard_shortcuts.local": "to open local timeline",
|
||||
"keyboard_shortcuts.mention": "to mention author",
|
||||
"keyboard_shortcuts.muted": "to open muted users list",
|
||||
"keyboard_shortcuts.muted": "Buka senarai pengguna teredam",
|
||||
"keyboard_shortcuts.my_profile": "to open your profile",
|
||||
"keyboard_shortcuts.notifications": "to open notifications column",
|
||||
"keyboard_shortcuts.open_media": "to open media",
|
||||
|
@ -408,24 +437,27 @@
|
|||
"load_pending": "{count, plural, one {# item baharu} other {# item baharu}}",
|
||||
"loading_indicator.label": "Memuatkan…",
|
||||
"moved_to_account_banner.text": "Akaun anda {disabledAccount} kini dinyahdayakan kerana anda berpindah ke {movedToAccount}.",
|
||||
"mute_modal.indefinite": "Sehingga dinyahredamkan",
|
||||
"mute_modal.they_wont_know": "Dia tidak akan tahu bahawa dia telah diredam.",
|
||||
"mute_modal.title": "Redamkan pengguna?",
|
||||
"navigation_bar.about": "Perihal",
|
||||
"navigation_bar.advanced_interface": "Buka dalam antara muka web lanjutan",
|
||||
"navigation_bar.blocks": "Pengguna yang disekat",
|
||||
"navigation_bar.blocks": "Pengguna tersekat",
|
||||
"navigation_bar.bookmarks": "Tanda buku",
|
||||
"navigation_bar.community_timeline": "Garis masa tempatan",
|
||||
"navigation_bar.compose": "Karang hantaran baharu",
|
||||
"navigation_bar.direct": "Sebutan peribadi",
|
||||
"navigation_bar.discover": "Teroka",
|
||||
"navigation_bar.domain_blocks": "Domain disekat",
|
||||
"navigation_bar.domain_blocks": "Domain tersekat",
|
||||
"navigation_bar.explore": "Teroka",
|
||||
"navigation_bar.favourites": "Sukaan",
|
||||
"navigation_bar.filters": "Perkataan yang dibisukan",
|
||||
"navigation_bar.filters": "Perkataan teredam",
|
||||
"navigation_bar.follow_requests": "Permintaan ikutan",
|
||||
"navigation_bar.followed_tags": "Ikuti hashtag",
|
||||
"navigation_bar.follows_and_followers": "Ikutan dan pengikut",
|
||||
"navigation_bar.lists": "Senarai",
|
||||
"navigation_bar.logout": "Log keluar",
|
||||
"navigation_bar.mutes": "Pengguna yang dibisukan",
|
||||
"navigation_bar.mutes": "Pengguna teredam",
|
||||
"navigation_bar.opened_in_classic_interface": "Kiriman, akaun dan halaman tertentu yang lain dibuka secara lalai di antara muka web klasik.",
|
||||
"navigation_bar.personal": "Peribadi",
|
||||
"navigation_bar.pins": "Hantaran disemat",
|
||||
|
@ -445,6 +477,8 @@
|
|||
"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.relationships_severance_event.domain_block": "Pentadbir dari {from} telah menyekat {target} termasuk {followersCount} pengikut anda dan {followingCount, plural, other {# akaun}} ikutan anda.",
|
||||
"notification.relationships_severance_event.user_domain_block": "Anda telah menyekat {target} termasuk {followersCount} pengikut anda dan {followingCount, plural, other {# akaun}} ikutan anda.",
|
||||
"notification.status": "{name} baru sahaja mengirim hantaran",
|
||||
"notification.update": "{name} menyunting hantaran",
|
||||
"notifications.clear": "Buang pemberitahuan",
|
||||
|
@ -524,7 +558,7 @@
|
|||
"reply_indicator.cancel": "Batal",
|
||||
"reply_indicator.poll": "Undian",
|
||||
"report.block": "Sekat",
|
||||
"report.block_explanation": "Anda tidak akan melihat hantaran mereka. Mereka tidak dapat melihat hantaran anda atau mengikuti anda. Mereka akan sedar bahawa mereka disekat.",
|
||||
"report.block_explanation": "Anda tidak akan melihat hantarannya. Dia tidak akan dapat melihat hantaran anda atau mengikuti anda. Dia akan sedar bahawa dia disekat.",
|
||||
"report.categories.legal": "Sah",
|
||||
"report.categories.other": "Lain-lain",
|
||||
"report.categories.spam": "Spam",
|
||||
|
@ -537,7 +571,7 @@
|
|||
"report.comment.title": "Adakah ada hal-hal lain yang perlu kita ketahui?",
|
||||
"report.forward": "Panjangkan ke {target}",
|
||||
"report.forward_hint": "Akaun ini daripada pelayan lain. Hantar salinan laporan yang ditanpanamakan ke sana juga?",
|
||||
"report.mute": "Bisukan",
|
||||
"report.mute": "Redam",
|
||||
"report.mute_explanation": "Anda tidak akan melihat siaran mereka. Mereka masih boleh mengikuti dan melihat siaran anda dan tidak akan mengetahui bahawa mereka telah dibisukan.",
|
||||
"report.next": "Seterusnya",
|
||||
"report.placeholder": "Ulasan tambahan",
|
||||
|
@ -621,8 +655,8 @@
|
|||
"status.media_hidden": "Media disembunyikan",
|
||||
"status.mention": "Sebut @{name}",
|
||||
"status.more": "Lagi",
|
||||
"status.mute": "Bisukan @{name}",
|
||||
"status.mute_conversation": "Bisukan perbualan",
|
||||
"status.mute": "Redamkan @{name}",
|
||||
"status.mute_conversation": "Redamkan perbualan",
|
||||
"status.open": "Kembangkan hantaran ini",
|
||||
"status.pin": "Semat di profil",
|
||||
"status.pinned": "Hantaran disemat",
|
||||
|
@ -648,7 +682,7 @@
|
|||
"status.translate": "Menterjemah",
|
||||
"status.translated_from_with": "Diterjemah daripada {lang} dengan {provider}",
|
||||
"status.uncached_media_warning": "Pratonton tidak tersedia",
|
||||
"status.unmute_conversation": "Nyahbisukan perbualan",
|
||||
"status.unmute_conversation": "Nyahredamkan perbualan",
|
||||
"status.unpin": "Nyahsemat daripada profil",
|
||||
"subscribed_languages.lead": "Hanya hantaran dalam bahasa-bahasa terpilih akan dipaparkan pada garis masa rumah dan senarai selepas perubahan. Pilih tiada untuk menerima hantaran dalam semua bahasa.",
|
||||
"subscribed_languages.save": "Simpan perubahan",
|
||||
|
@ -682,6 +716,8 @@
|
|||
"video.expand": "Besarkan video",
|
||||
"video.fullscreen": "Skrin penuh",
|
||||
"video.hide": "Sembunyikan video",
|
||||
"video.mute": "Redam",
|
||||
"video.pause": "Jeda",
|
||||
"video.play": "Main"
|
||||
"video.play": "Main",
|
||||
"video.unmute": "Nyahredam"
|
||||
}
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "編輯個人資料",
|
||||
"account.enable_notifications": "佇 {name} PO文ê時通知我",
|
||||
"account.endorse": "用個人資料推薦對方",
|
||||
"account.featured": "精選ê",
|
||||
"account.featured.hashtags": "Hashtag",
|
||||
"account.featured.posts": "PO文",
|
||||
"account.featured_tags.last_status_at": "頂kái tī {date} Po文",
|
||||
"account.featured_tags.last_status_never": "無PO文",
|
||||
"account.follow": "跟tuè",
|
||||
|
@ -293,6 +296,7 @@
|
|||
"emoji_button.search_results": "Tshiau-tshuē ê結果",
|
||||
"emoji_button.symbols": "符號",
|
||||
"emoji_button.travel": "旅行kap地點",
|
||||
"empty_column.account_featured": "Tsit ê列單是空ê",
|
||||
"empty_column.account_hides_collections": "Tsit位用者選擇無愛公開tsit ê資訊",
|
||||
"empty_column.account_suspended": "口座已經受停止",
|
||||
"empty_column.account_timeline": "Tsia無PO文!",
|
||||
|
@ -377,6 +381,8 @@
|
|||
"generic.saved": "儲存ah",
|
||||
"getting_started.heading": "開始用",
|
||||
"hashtag.admin_moderation": "Phah開 #{name} ê管理界面",
|
||||
"hashtag.browse": "瀏覽佇 #{hashtag} ê PO文",
|
||||
"hashtag.browse_from_account": "瀏覽 @{name} 佇 #{hashtag} 所寫ê PO文",
|
||||
"hashtag.column_header.tag_mode.all": "kap {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "á是 {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "無需要 {additional}",
|
||||
|
@ -390,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} 篇} other {{counter} 篇}} PO文",
|
||||
"hashtag.counter_by_uses_today": "Kin-á日有 {count, plural, one {{counter} 篇} other {{counter} 篇}} PO文",
|
||||
"hashtag.follow": "跟tuè hashtag",
|
||||
"hashtag.mute": "消音 #{hashtag}",
|
||||
"hashtag.unfollow": "取消跟tuè hashtag",
|
||||
"hashtags.and_other": "……kap 其他 {count, plural, other {# ê}}",
|
||||
"hints.profiles.followers_may_be_missing": "Tsit ê個人資料ê跟tuè者資訊可能有落勾ê。",
|
||||
|
@ -517,8 +524,70 @@
|
|||
"mute_modal.hide_options": "Khàm掉選項",
|
||||
"mute_modal.indefinite": "直到我取消消音",
|
||||
"mute_modal.show_options": "顯示選項",
|
||||
"mute_modal.they_can_mention_and_follow": "In iáu ē當提起á是跟tuè lí,毋過lí看buē著in。",
|
||||
"mute_modal.they_wont_know": "In buē知影in受消音。",
|
||||
"mute_modal.title": "Kā用者消音?",
|
||||
"mute_modal.you_wont_see_mentions": "Lí buē看見提起in ê PO文。",
|
||||
"mute_modal.you_wont_see_posts": "In iáu ē當看著lí ê PO文,毋過lí看bē tio̍h in ê。",
|
||||
"navigation_bar.about": "概要",
|
||||
"navigation_bar.administration": "管理",
|
||||
"navigation_bar.advanced_interface": "用進階ê網頁界面開",
|
||||
"navigation_bar.blocks": "封鎖ê用者",
|
||||
"navigation_bar.bookmarks": "冊籤",
|
||||
"navigation_bar.community_timeline": "本地ê時間線",
|
||||
"navigation_bar.compose": "寫新ê PO文",
|
||||
"navigation_bar.direct": "私人ê提起",
|
||||
"navigation_bar.discover": "發現",
|
||||
"navigation_bar.domain_blocks": "封鎖ê域名",
|
||||
"navigation_bar.explore": "探查",
|
||||
"navigation_bar.favourites": "Siōng kah意",
|
||||
"navigation_bar.filters": "消音ê詞",
|
||||
"navigation_bar.follow_requests": "跟tuè請求",
|
||||
"navigation_bar.followed_tags": "跟tuè ê hashtag",
|
||||
"navigation_bar.follows_and_followers": "Leh跟tuè ê kap跟tuè lí ê",
|
||||
"navigation_bar.lists": "列單",
|
||||
"navigation_bar.logout": "登出",
|
||||
"navigation_bar.moderation": "審核",
|
||||
"navigation_bar.mutes": "消音ê用者",
|
||||
"navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面,預設ē佇經典ê網頁界面內phah開。",
|
||||
"navigation_bar.personal": "個人",
|
||||
"navigation_bar.pins": "釘起來ê PO文",
|
||||
"navigation_bar.preferences": "偏愛ê設定",
|
||||
"navigation_bar.public_timeline": "聯邦ê時間線",
|
||||
"navigation_bar.search": "Tshiau-tshuē",
|
||||
"navigation_bar.security": "安全",
|
||||
"not_signed_in_indicator.not_signed_in": "Lí著登入來接近使用tsit ê資源。",
|
||||
"notification.admin.report": "{name} kā {target} 檢舉ah",
|
||||
"notification.admin.report_account": "{name} kā {target} 所寫ê {count, plural, other {# 篇PO文}}檢舉ah,原因是:{category}",
|
||||
"notification.admin.report_account_other": "{name} kā {target} 所寫ê {count, plural, other {# 篇PO文}}檢舉ah",
|
||||
"notification.admin.report_statuses": "{name} kā {target} 檢舉ah,原因是:{category}",
|
||||
"notification.admin.report_statuses_other": "{name} kā {target} 檢舉ah",
|
||||
"notification.admin.sign_up": "口座 {name} 有開ah。",
|
||||
"notification.admin.sign_up.name_and_others": "{name} kap {count, plural, other {其他 # ê lâng}} ê口座有開ah",
|
||||
"notification.annual_report.message": "Lí ê {year} #Wrapstodon teh等lí!緊來看tsit年lí佇Mastodon頂ê上精彩ê內容,kap難忘ê時刻!",
|
||||
"notification.annual_report.view": "Kā #Wrapstodon 看māi。",
|
||||
"notification.favourite": "{name} kah意lí ê PO文",
|
||||
"notification.favourite.name_and_others_with_link": "{name} kap<a>{count, plural, other {另外 # ê lâng}}</a>kah意lí ê PO文",
|
||||
"notification.favourite_pm": "{name} kah意lí ê私人提起",
|
||||
"notification.favourite_pm.name_and_others_with_link": "{name} kap<a>{count, plural, other {另外 # ê lâng}}</a>kah意lí ê私人提起",
|
||||
"notification.follow": "{name}跟tuè lí",
|
||||
"notification.follow.name_and_others": "{name} kap<a>{count, plural, other {另外 # ê lâng}}</a>跟tuè lí",
|
||||
"notification.follow_request": "{name} 請求跟tuè lí",
|
||||
"notification.follow_request.name_and_others": "{name} kap{count, plural, other {另外 # ê lâng}}請求跟tuè lí",
|
||||
"notification.label.mention": "提起",
|
||||
"notification.label.private_mention": "私人ê提起",
|
||||
"notification.label.private_reply": "私人ê回應",
|
||||
"notification.label.reply": "回應",
|
||||
"notification.mention": "提起",
|
||||
"notification.mentioned_you": "{name}kā lí提起",
|
||||
"notification.moderation-warning.learn_more": "看詳細",
|
||||
"notification.moderation_warning": "Lí有收著審核ê警告",
|
||||
"notification.moderation_warning.action_delete_statuses": "Lí ê一寡PO文hōo lâng thâi掉ah。",
|
||||
"notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。",
|
||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文,hōo lâng標做敏感ê內容。",
|
||||
"notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。",
|
||||
"notification_requests.edit_selection": "編輯",
|
||||
"notification_requests.exit_selection": "做好ah",
|
||||
"search_popout.language_code": "ISO語言代碼",
|
||||
"status.translated_from_with": "用 {provider} 翻譯 {lang}"
|
||||
}
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Opgeslagen",
|
||||
"getting_started.heading": "Aan de slag",
|
||||
"hashtag.admin_moderation": "Moderatie-omgeving van #{name} openen",
|
||||
"hashtag.browse": "Berichten met #{hashtag} bekijken",
|
||||
"hashtag.browse_from_account": "Berichten van @{name} met #{hashtag} bekijken",
|
||||
"hashtag.column_header.tag_mode.all": "en {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "of {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "zonder {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} bericht} other {{counter} berichten}} vandaag",
|
||||
"hashtag.follow": "Hashtag volgen",
|
||||
"hashtag.mute": "#{hashtag} negeren",
|
||||
"hashtag.unfollow": "Hashtag ontvolgen",
|
||||
"hashtags.and_other": "…en {count, plural, one {}other {# meer}}",
|
||||
"hints.profiles.followers_may_be_missing": "Volgers voor dit profiel kunnen ontbreken.",
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
"account.enable_notifications": "Уведомлять о постах от @{name}",
|
||||
"account.endorse": "Рекомендовать в профиле",
|
||||
"account.featured": "Избранное",
|
||||
"account.featured.hashtags": "Хэштеги",
|
||||
"account.featured.posts": "Посты",
|
||||
"account.featured_tags.last_status_at": "Последний пост {date}",
|
||||
"account.featured_tags.last_status_never": "Нет постов",
|
||||
"account.follow": "Подписаться",
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
"account.edit_profile": "Upraviť profil",
|
||||
"account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}",
|
||||
"account.endorse": "Zobraziť na vlastnom profile",
|
||||
"account.featured.posts": "Príspevky",
|
||||
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
|
||||
"account.featured_tags.last_status_never": "Žiadne príspevky",
|
||||
"account.follow": "Sledovať",
|
||||
|
@ -263,6 +264,7 @@
|
|||
"emoji_button.search_results": "Výsledky hľadania",
|
||||
"emoji_button.symbols": "Symboly",
|
||||
"emoji_button.travel": "Cestovanie a miesta",
|
||||
"empty_column.account_featured": "Tento zoznam je prázdny",
|
||||
"empty_column.account_hides_collections": "Tento účet sa rozhodol túto informáciu nesprístupniť",
|
||||
"empty_column.account_suspended": "Účet bol pozastavený",
|
||||
"empty_column.account_timeline": "Nie sú tu žiadne príspevky.",
|
||||
|
@ -345,6 +347,7 @@
|
|||
"generic.saved": "Uložené",
|
||||
"getting_started.heading": "Začíname",
|
||||
"hashtag.admin_moderation": "Otvor moderovacie rozhranie pre #{name}",
|
||||
"hashtag.browse": "Prehľadávať príspevky pod #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "a {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "alebo {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "bez {additional}",
|
||||
|
@ -358,6 +361,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}} dnes",
|
||||
"hashtag.follow": "Sledovať hashtag",
|
||||
"hashtag.mute": "Utlmiť #{hashtag}",
|
||||
"hashtag.unfollow": "Prestať sledovať hashtag",
|
||||
"hashtags.and_other": "…a {count, plural, other {# ďalších}}",
|
||||
"hints.profiles.followers_may_be_missing": "Nasledovatelia tohto profilu môžu chýbať.",
|
||||
|
|
|
@ -376,6 +376,8 @@
|
|||
"generic.saved": "U ruajt",
|
||||
"getting_started.heading": "Si t’ia fillohet",
|
||||
"hashtag.admin_moderation": "Hap ndërfaqe moderimi për #{name}",
|
||||
"hashtag.browse": "Shfletoni postime me #{hashtag}",
|
||||
"hashtag.browse_from_account": "Shfletoni postime nga @{name} me #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "dhe {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "ose {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "pa {additional}",
|
||||
|
@ -389,6 +391,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} postim} other {{counter} postime}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postim} other {{counter} postime}} sot",
|
||||
"hashtag.follow": "Ndiqe hashtag-un",
|
||||
"hashtag.mute": "Heshtoje #{hashtag}",
|
||||
"hashtag.unfollow": "Hiqe ndjekjen e hashtag-ut",
|
||||
"hashtags.and_other": "…dhe {count, plural, one {}other {# më tepër}}",
|
||||
"hints.profiles.followers_may_be_missing": "Mund të mungojnë ndjekës për këtë profil.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Kaydet",
|
||||
"getting_started.heading": "Başlarken",
|
||||
"hashtag.admin_moderation": "#{name} için denetim arayüzünü açın",
|
||||
"hashtag.browse": "#{hashtag} gönderilerine gözat",
|
||||
"hashtag.browse_from_account": "@{name} kişisinin #{hashtag} gönderilerine gözat",
|
||||
"hashtag.column_header.tag_mode.all": "ve {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "ya da {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "{additional} olmadan",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
|
||||
"hashtag.counter_by_uses_today": "bugün {count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
|
||||
"hashtag.follow": "Etiketi takip et",
|
||||
"hashtag.mute": "#{hashtag} gönderilerini sessize al",
|
||||
"hashtag.unfollow": "Etiketi takibi bırak",
|
||||
"hashtags.and_other": "…ve {count, plural, one {}other {# fazlası}}",
|
||||
"hints.profiles.followers_may_be_missing": "Bu profilin takipçileri eksik olabilir.",
|
||||
|
|
|
@ -394,6 +394,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}} сьогодні",
|
||||
"hashtag.follow": "Стежити за хештегом",
|
||||
"hashtag.mute": "Ігнорувати #{hashtag}",
|
||||
"hashtag.unfollow": "Не стежити за хештегом",
|
||||
"hashtags.and_other": "…і {count, plural, other {ще #}}",
|
||||
"hints.profiles.followers_may_be_missing": "Підписники цього профілю можуть бути не показані.",
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "Đã lưu",
|
||||
"getting_started.heading": "Quản lý",
|
||||
"hashtag.admin_moderation": "Mở giao diện quản trị #{name}",
|
||||
"hashtag.browse": "Tìm tút #{hashtag}",
|
||||
"hashtag.browse_from_account": "Tìm tút của @{name} có chứa #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "và {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "hoặc {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "mà không {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, other {{counter} tút}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, other {{counter} tút}} hôm nay",
|
||||
"hashtag.follow": "Theo dõi hashtag",
|
||||
"hashtag.mute": "Ẩn #{hashtag}",
|
||||
"hashtag.unfollow": "Bỏ theo dõi hashtag",
|
||||
"hashtags.and_other": "…và {count, plural, other {# nữa}}",
|
||||
"hints.profiles.followers_may_be_missing": "Số người theo dõi có thể không đầy đủ.",
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
"account.edit_profile": "修改个人资料",
|
||||
"account.enable_notifications": "当 @{name} 发布嘟文时通知我",
|
||||
"account.endorse": "在个人资料中推荐此用户",
|
||||
"account.featured": "精选",
|
||||
"account.featured.hashtags": "话题",
|
||||
"account.featured.posts": "嘟文",
|
||||
"account.featured_tags.last_status_at": "上次发言于 {date}",
|
||||
"account.featured_tags.last_status_never": "暂无嘟文",
|
||||
"account.follow": "关注",
|
||||
|
@ -64,6 +67,7 @@
|
|||
"account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}",
|
||||
"account.unblock": "取消屏蔽 @{name}",
|
||||
"account.unblock_domain": "取消屏蔽 {domain} 域名",
|
||||
"account.unblock_domain_short": "取消屏蔽",
|
||||
"account.unblock_short": "取消屏蔽",
|
||||
"account.unendorse": "不在个人资料中推荐此用户",
|
||||
"account.unfollow": "取消关注",
|
||||
|
@ -292,6 +296,7 @@
|
|||
"emoji_button.search_results": "搜索结果",
|
||||
"emoji_button.symbols": "符号",
|
||||
"emoji_button.travel": "旅行与地点",
|
||||
"empty_column.account_featured": "这个列表为空",
|
||||
"empty_column.account_hides_collections": "该用户选择不公开此信息",
|
||||
"empty_column.account_suspended": "账号已被停用",
|
||||
"empty_column.account_timeline": "这里没有嘟文!",
|
||||
|
@ -389,6 +394,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, other {{counter} 条嘟文}}",
|
||||
"hashtag.counter_by_uses_today": "今日 {count, plural, other {{counter} 条嘟文}}",
|
||||
"hashtag.follow": "关注话题",
|
||||
"hashtag.mute": "停止提醒 #{hashtag}",
|
||||
"hashtag.unfollow": "取消关注话题",
|
||||
"hashtags.and_other": "… 和另外 {count, plural, other {# 个话题}}",
|
||||
"hints.profiles.followers_may_be_missing": "该账号的关注者列表可能没有完全显示。",
|
||||
|
@ -904,6 +910,12 @@
|
|||
"video.expand": "展开视频",
|
||||
"video.fullscreen": "全屏",
|
||||
"video.hide": "隐藏视频",
|
||||
"video.mute": "停止提醒",
|
||||
"video.pause": "暂停",
|
||||
"video.play": "播放"
|
||||
"video.play": "播放",
|
||||
"video.skip_backward": "后退",
|
||||
"video.skip_forward": "前进",
|
||||
"video.unmute": "恢复提醒",
|
||||
"video.volume_down": "音量减小",
|
||||
"video.volume_up": "提高音量"
|
||||
}
|
||||
|
|
|
@ -381,6 +381,8 @@
|
|||
"generic.saved": "已儲存",
|
||||
"getting_started.heading": "開始使用",
|
||||
"hashtag.admin_moderation": "開啟 #{name} 的管理介面",
|
||||
"hashtag.browse": "瀏覽於 #{hashtag} 之嘟文",
|
||||
"hashtag.browse_from_account": "瀏覽來自 @{name} 於 #{hashtag} 之嘟文",
|
||||
"hashtag.column_header.tag_mode.all": "以及 {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "或是 {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "而無需 {additional}",
|
||||
|
@ -394,6 +396,7 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
|
||||
"hashtag.counter_by_uses_today": "本日有 {count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
|
||||
"hashtag.follow": "跟隨主題標籤",
|
||||
"hashtag.mute": "靜音 #{hashtag}",
|
||||
"hashtag.unfollow": "取消跟隨主題標籤",
|
||||
"hashtags.and_other": "…及其他 {count, plural, other {# 個}}",
|
||||
"hints.profiles.followers_may_be_missing": "此個人檔案之跟隨者或有缺失。",
|
||||
|
|
|
@ -17,7 +17,12 @@ body {
|
|||
font-weight: 400;
|
||||
color: $primary-text-color;
|
||||
text-rendering: optimizelegibility;
|
||||
font-feature-settings: 'kern';
|
||||
|
||||
// Disable kerning for Japanese text to preserve monospaced alignment for readability
|
||||
&:not(:lang(ja)) {
|
||||
font-feature-settings: 'kern';
|
||||
}
|
||||
|
||||
text-size-adjust: none;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
|
|
|
@ -33,7 +33,7 @@ class CustomFilter < ApplicationRecord
|
|||
include Expireable
|
||||
include Redisable
|
||||
|
||||
enum :action, { warn: 0, hide: 1, blur: 2 }, suffix: :action
|
||||
enum :action, { warn: 0, hide: 1, blur: 2 }, suffix: :action, validate: true
|
||||
|
||||
belongs_to :account
|
||||
has_many :keywords, class_name: 'CustomFilterKeyword', inverse_of: :custom_filter, dependent: :destroy
|
||||
|
|
|
@ -18,7 +18,7 @@ class List < ApplicationRecord
|
|||
|
||||
PER_ACCOUNT_LIMIT = 50
|
||||
|
||||
enum :replies_policy, { list: 0, followed: 1, none: 2 }, prefix: :show
|
||||
enum :replies_policy, { list: 0, followed: 1, none: 2 }, prefix: :show, validate: true
|
||||
|
||||
belongs_to :account
|
||||
|
||||
|
|
|
@ -325,6 +325,7 @@ cs:
|
|||
create: Vytvořit oznámení
|
||||
title: Nové oznámení
|
||||
preview:
|
||||
disclaimer: Vzhledem k tomu, že se od nich uživatelé nemohou odhlásit, měla by být e-mailová upozornění omezena na důležitá oznámení, jako je narušení osobních údajů nebo oznámení o uzavření serveru.
|
||||
explanation_html: 'E-mail bude odeslán <strong>%{display_count} uživatelům</strong>. Následující text bude zahrnut do onoho e-mailu:'
|
||||
title: Náhled oznámení
|
||||
publish: Zveřejnit
|
||||
|
|
|
@ -319,6 +319,7 @@ da:
|
|||
create: Opret bekendtgørelse
|
||||
title: Ny bekendtgørelse
|
||||
preview:
|
||||
disclaimer: Da brugere ikke kan fravælge e-mailnotifikationer, bør disse begrænses til vigtige emner som f.eks. personlige databrud eller serverlukninger.
|
||||
explanation_html: 'E-mailen sendes til <strong>%{display_count} brugere</strong>. Flg. tekst medtages i e-mailen:'
|
||||
title: Forhåndsvis annonceringsnotifikation
|
||||
publish: Publicér
|
||||
|
|
|
@ -319,6 +319,7 @@ de:
|
|||
create: Ankündigung erstellen
|
||||
title: Neue Ankündigung
|
||||
preview:
|
||||
disclaimer: Da sich Profile nicht davon abmelden können, sollten Benachrichtigungen per E-Mail auf wichtige Ankündigungen wie z. B. zu Datenpannen oder Serverabschaltung beschränkt sein.
|
||||
explanation_html: 'Die E-Mail wird an <strong>%{display_count} Nutzer*innen</strong> gesendet. Folgendes wird in der E-Mail enthalten sein:'
|
||||
title: Vorschau der Ankündigung
|
||||
publish: Veröffentlichen
|
||||
|
@ -497,6 +498,7 @@ de:
|
|||
registration_requested: Registrierung angefordert
|
||||
registrations:
|
||||
confirm: Bestätigen
|
||||
description: Sie haben eine Registrierung von einer FASP erhalten. Lehnen Sie ab, wenn Sie dies nicht initiiert haben. Wenn Sie dies initiiert haben, vergleichen Sie Namen und Fingerabdruck vor der Bestätigung der Registrierung.
|
||||
reject: Ablehnen
|
||||
title: FASP-Registrierung bestätigen
|
||||
save: Speichern
|
||||
|
|
|
@ -128,11 +128,11 @@ ms:
|
|||
crypto: Penyulitan hujung ke hujung
|
||||
favourites: Sukaan
|
||||
filters: Penapis
|
||||
follow: Ikut, Senyap dan Blok
|
||||
follow: Ikutan, Redaman dan Sekatan
|
||||
follows: Ikutan
|
||||
lists: Senarai
|
||||
media: Lampiran media
|
||||
mutes: Senyapkan
|
||||
mutes: Redaman
|
||||
notifications: Pemberitahuan
|
||||
push: Pemberitahuan segera
|
||||
reports: Laporan
|
||||
|
@ -173,7 +173,7 @@ ms:
|
|||
read:filters: lihat penapis anda
|
||||
read:follows: lihat senarai yang anda ikuti
|
||||
read:lists: lihat senarai anda
|
||||
read:mutes: lihat senarai yang anda senyapkan
|
||||
read:mutes: lihat redamanku
|
||||
read:notifications: lihat notifikasi anda
|
||||
read:reports: lihat laporan anda
|
||||
read:search: cari bagi pihak anda
|
||||
|
@ -182,13 +182,13 @@ ms:
|
|||
write:accounts: ubaisuai profail anda
|
||||
write:blocks: domain dan akaun blok
|
||||
write:bookmarks: menandabuku hantaran
|
||||
write:conversations: senyapkan dan padamkan perbualan
|
||||
write:conversations: redamkan dan padamkan perbualan
|
||||
write:favourites: hantaran disukai
|
||||
write:filters: cipta penapis
|
||||
write:follows: ikut orang
|
||||
write:lists: cipta senarai
|
||||
write:media: memuat naik fail media
|
||||
write:mutes: membisukan orang dan perbualan
|
||||
write:mutes: redamkan orang dan perbualan
|
||||
write:notifications: kosongkan pemberitahuan anda
|
||||
write:reports: melaporkan orang lain
|
||||
write:statuses: terbitkan hantaran
|
||||
|
|
|
@ -319,6 +319,7 @@ es-AR:
|
|||
create: Crear anuncio
|
||||
title: Nuevo anuncio
|
||||
preview:
|
||||
disclaimer: Como los usuarios no pueden excluirse de ellas, las notificaciones por correo electrónico deberían limitarse a anuncios importantes como la violación de datos personales o las notificaciones de cierre del servidor.
|
||||
explanation_html: 'El correo electrónico se enviará a <strong>%{display_count} usuarios</strong>. En el correo electrónico se incluirá el siguiente texto:'
|
||||
title: Previsualizar la notificación del anuncio
|
||||
publish: Publicar
|
||||
|
|
|
@ -319,6 +319,7 @@ es-MX:
|
|||
create: Crear anuncio
|
||||
title: Nuevo anuncio
|
||||
preview:
|
||||
disclaimer: Como los usuarios no pueden optar por no recibirlas, las notificaciones por correo electrónico deben limitarse a anuncios importantes, como la violación de datos personales o las notificaciones de cierre de servidores.
|
||||
explanation_html: 'El correo electrónico se enviará a <strong>%{display_count} usuarios</strong>. En el correo electrónico se incluirá el siguiente texto:'
|
||||
title: Vista previa de la notificación del anuncio
|
||||
publish: Publicar
|
||||
|
|
|
@ -3,7 +3,7 @@ es:
|
|||
about:
|
||||
about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!'
|
||||
contact_missing: No establecido
|
||||
contact_unavailable: No disponible
|
||||
contact_unavailable: N/D
|
||||
hosted_on: Mastodon alojado en %{domain}
|
||||
title: Acerca de
|
||||
accounts:
|
||||
|
@ -319,6 +319,7 @@ es:
|
|||
create: Crear anuncio
|
||||
title: Nuevo anuncio
|
||||
preview:
|
||||
disclaimer: Como los usuarios no pueden optar por no recibirlas, las notificaciones por correo electrónico deben limitarse a anuncios importantes, como la violación de datos personales o las notificaciones de cierre de servidores.
|
||||
explanation_html: 'El correo electrónico se enviará a <strong>%{display_count} usuarios</strong>. En el correo electrónico se incluirá el siguiente texto:'
|
||||
title: Vista previa de la notificación del anuncio
|
||||
publish: Publicar
|
||||
|
|
|
@ -319,6 +319,7 @@ fi:
|
|||
create: Luo tiedote
|
||||
title: Uusi tiedote
|
||||
preview:
|
||||
disclaimer: Koska käyttäjät eivät voi kieltäytyä niistä, sähköposti-ilmoitukset tulee rajata tärkeisiin tiedotteisiin, kuten ilmoituksiin henkilötietojen tietoturvaloukkauksista tai palvelimen sulkeutumisesta.
|
||||
explanation_html: "<strong>%{display_count} käyttäjälle</strong> lähetetään sähköpostia. Sähköpostiviestiin sisällytetään seuraava teksti:"
|
||||
title: Esikatsele tiedoteilmoitus
|
||||
publish: Julkaise
|
||||
|
|
|
@ -319,6 +319,7 @@ fo:
|
|||
create: Stovna kunngerð
|
||||
title: Nýggj kunngerð
|
||||
preview:
|
||||
disclaimer: Av tí at brúkarar ikki kunnu velja tær frá, eiga teldupostfráboðanir at vera avmarkaðar til týdningarmiklar kunngerðir, sosum trygdarbrot og boð um at ambætarin verður tikin niður.
|
||||
explanation_html: 'Teldubrævið verður sent til <strong>%{display_count} brúkarar</strong>. Fylgjandi tekstur kemur við í teldubrævið:'
|
||||
title: Undanvís fráboðan um kunngerð
|
||||
publish: Legg út
|
||||
|
|
|
@ -482,6 +482,15 @@ fr-CA:
|
|||
new:
|
||||
title: Importer des blocages de domaine
|
||||
no_file: Aucun fichier sélectionné
|
||||
fasp:
|
||||
providers:
|
||||
registrations:
|
||||
confirm: Confirmer
|
||||
reject: Rejeter
|
||||
save: Enregistrer
|
||||
select_capabilities: Sélectionnez les Capacités
|
||||
sign_in: Se connecter
|
||||
status: État
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant</strong>. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée."
|
||||
language: Pour la langue
|
||||
|
|
|
@ -482,6 +482,15 @@ fr:
|
|||
new:
|
||||
title: Importer des blocages de domaine
|
||||
no_file: Aucun fichier sélectionné
|
||||
fasp:
|
||||
providers:
|
||||
registrations:
|
||||
confirm: Confirmer
|
||||
reject: Rejeter
|
||||
save: Enregistrer
|
||||
select_capabilities: Sélectionnez les Capacités
|
||||
sign_in: Se connecter
|
||||
status: État
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant</strong>. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée."
|
||||
language: Pour la langue
|
||||
|
|
|
@ -319,6 +319,7 @@ gl:
|
|||
create: Crear anuncio
|
||||
title: Novo anuncio
|
||||
preview:
|
||||
disclaimer: As usuarias non poden omitilas, as notificiacións por correo deberían limitarse a anuncios importantes como fugas de datos personais ou notificación do cese do servizo.
|
||||
explanation_html: 'Vaise enviar o correo a <strong>%{display_count} usuarias</strong>. Incluirase o seguinte texto no correo:'
|
||||
title: Previsualización da notificación do anuncio
|
||||
publish: Publicar
|
||||
|
|
|
@ -325,6 +325,7 @@ he:
|
|||
create: יצירת הכרזה
|
||||
title: הכרזה חדשה
|
||||
preview:
|
||||
disclaimer: כיוון שהמשתמשים לא יכולים לבטל אותם, הודעות דוא"ל צריכות להיות מוגבלות בשימוש להודעות חשובות כגון הודעות על גניבת מידע אישי או הודעות על סגירת השרת.
|
||||
explanation_html: 'הדואל ישלח אל <strong>%{display_count} משתמשיםות</strong>. להלן המלל שישלח בדואל:'
|
||||
title: צפיה מקדימה בהודעה
|
||||
publish: פרסום
|
||||
|
|
|
@ -319,6 +319,7 @@ hu:
|
|||
create: Közlemény létrehozása
|
||||
title: Új közlemény
|
||||
preview:
|
||||
disclaimer: Mivel a felhasználók nem iratkozhatnak le róluk, az e-mailes értesítéseket érdemes a fontos bejelentésekre korlátozni, mint a személyes adatokat érintő adatvédelmi incidensek vagy a kiszolgáló bezárására vonatkozó értesítések.
|
||||
explanation_html: 'Az e-mail <strong>%{display_count} felhasználónak</strong> lesz elküldve. A következő szöveg fog szerepelni a levélben:'
|
||||
title: Közleményértesítés előnézete
|
||||
publish: Közzététel
|
||||
|
|
|
@ -319,6 +319,7 @@ is:
|
|||
create: Búa til auglýsingu
|
||||
title: Ný auglýsing
|
||||
preview:
|
||||
disclaimer: Þar sem notendur geta ekki afþakkað þær ætti aðeins að nota tilkynningar í tölvupósti fyrir mikilvægar upplýsingar á borð við persónuleg gagnabrot eða lokanir á netþjónum.
|
||||
explanation_html: 'Tölvupósturinn verður sendur til <strong>%{display_count} notenda</strong>. Eftirfarandi texti verður í meginmáli póstsins:'
|
||||
title: Forskoða tilkynninguna
|
||||
publish: Birta
|
||||
|
|
|
@ -316,6 +316,7 @@ ko:
|
|||
create: 공지사항 생성
|
||||
title: 새 공지사항
|
||||
preview:
|
||||
disclaimer: 사용자들은 수신설정을 끌 수 없기 때문에 이메일 알림은 개인정보 유출이나 서버 종료와 같은 중요한 공지사항에만 사용해야 합니다.
|
||||
explanation_html: "<strong>%{display_count} 명의 사용자</strong>에게 이메일이 발송됩니다. 다음 내용이 이메일에 포함됩니다:"
|
||||
title: 공지사항 알림 미리보기
|
||||
publish: 게시
|
||||
|
|
|
@ -28,6 +28,7 @@ ms:
|
|||
created_msg: Catatan penyederhanaan telah berjaya dicipta!
|
||||
destroyed_msg: Catatan penyederhanaan telah berjaya dipadam!
|
||||
accounts:
|
||||
add_email_domain_block: Sekat domain e-mel
|
||||
approve: Luluskan
|
||||
approved_msg: Berjaya meluluskan permohonan pendaftaran %{username}
|
||||
are_you_sure: Adakah anda pasti?
|
||||
|
@ -146,7 +147,7 @@ ms:
|
|||
suspension_irreversible: Data akaun ini telah dipadam secara kekal. Anda boleh nyahgantungkannya untuk membuatkan akaun ini boleh digunakan semula tetapi data lama tidak akan diperolehi.
|
||||
suspension_reversible_hint_html: Akaun ini telah digantung, dan datanya akan dibuang pada %{date}. Sebelum tarikh itu, akaun ini boleh diperoleh semula tanpa kesan buruk. Jika anda mahu memadamkan kesemua data akaun ini serta-merta, anda boleh melakukannya di bawah.
|
||||
title: Akaun
|
||||
unblock_email: Menyahsekat alamat e-mel
|
||||
unblock_email: Nyahsekat alamat e-mel
|
||||
unblocked_email_msg: Alamat e-mel %{username} berjaya dinyahsekat
|
||||
unconfirmed_email: E-mel belum disahkan
|
||||
undo_sensitized: Nyahtanda sensitif
|
||||
|
@ -169,17 +170,21 @@ ms:
|
|||
confirm_user: Sahkan Pengguna
|
||||
create_account_warning: Cipta Amaran
|
||||
create_announcement: Cipta Pengumuman
|
||||
create_canonical_email_block: Cipta Penyekatan E-mel
|
||||
create_custom_emoji: Cipta Emoji Tersendiri
|
||||
create_domain_allow: Cipta Pelepasan Domain
|
||||
create_domain_block: Cipta Penyekatan Domain
|
||||
create_email_domain_block: Cipta Penyekatan Domain E-mel
|
||||
create_ip_block: Cipta peraturan alamat IP
|
||||
create_unavailable_domain: Cipta Domain Tidak Tersedia
|
||||
create_user_role: Cipta Peranan
|
||||
demote_user: Turunkan Taraf Pengguna
|
||||
destroy_announcement: Padam Pengumuman
|
||||
destroy_canonical_email_block: Padam Penyekatan E-mel
|
||||
destroy_custom_emoji: Padam Emoji Tersendiri
|
||||
destroy_domain_allow: Padam Pelepasan Domain
|
||||
destroy_domain_block: Padam Penyekatan Domain
|
||||
destroy_email_domain_block: Padam Penyekatan Domain E-mel
|
||||
destroy_instance: Padamkan Domain
|
||||
destroy_ip_block: Padam peraturan alamat IP
|
||||
destroy_status: Padam Hantaran
|
||||
|
@ -203,7 +208,7 @@ ms:
|
|||
silence_account: Diamkan Akaun
|
||||
suspend_account: Gantungkan Akaun
|
||||
unassigned_report: Menyahtugaskan Laporan
|
||||
unblock_email_account: Menyahsekat alamat e-mel
|
||||
unblock_email_account: Nyahsekat alamat e-mel
|
||||
unsensitive_account: Nyahtanda media di akaun anda sebagai sensitif
|
||||
unsilence_account: Nyahdiamkan Akaun
|
||||
unsuspend_account: Nyahgantungkan Akaun
|
||||
|
@ -1144,7 +1149,7 @@ ms:
|
|||
csv: CSV
|
||||
domain_blocks: Domain disekat
|
||||
lists: Senarai
|
||||
mutes: Awak bisu
|
||||
mutes: Redaman anda
|
||||
storage: Storan Media
|
||||
featured_tags:
|
||||
add_new: Tambah baharu
|
||||
|
@ -1235,10 +1240,11 @@ ms:
|
|||
domain_blocking: Mengimport domain yang disekat
|
||||
following: Mengimport akaun diikuti
|
||||
lists: Mengimport senarai
|
||||
muting: Mengimport akaun diredam
|
||||
muting: Mengimport akaun teredam
|
||||
type: Jenis import
|
||||
type_groups:
|
||||
constructive: Ikutan & Penanda Halaman
|
||||
destructive: Sekatan dan redaman
|
||||
types:
|
||||
blocking: Senarai menyekat
|
||||
bookmarks: Penanda buku
|
||||
|
|
|
@ -319,6 +319,7 @@ nl:
|
|||
create: Mededeling aanmaken
|
||||
title: Nieuwe mededeling
|
||||
preview:
|
||||
disclaimer: Omdat gebruikers zich niet voor deze e-mails kunnen afmelden, moeten e-mailmeldingen worden beperkt tot belangrijke aankondigingen, zoals het lekken van gebruikersgegevens of meldingen over het sluiten van deze server.
|
||||
explanation_html: 'De e-mail wordt verzonden naar <strong>%{display_count} gebruikers</strong>. De volgende tekst wordt in het bericht opgenomen:'
|
||||
title: Voorbeeld van mededeling
|
||||
publish: Inschakelen
|
||||
|
|
|
@ -146,6 +146,7 @@ ko:
|
|||
min_age: 관할지역의 법률에서 요구하는 최저 연령보다 작으면 안 됩니다.
|
||||
user:
|
||||
chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다
|
||||
date_of_birth: 마스토돈을 사용하려면 %{age}세 이상임을 확인해야 합니다. 이 정보는 저장되지 않습니다.
|
||||
role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다.
|
||||
user_role:
|
||||
color: 색상은 사용자 인터페이스에서 역할을 나타내기 위해 사용되며, RGB 16진수 형식입니다
|
||||
|
|
|
@ -319,6 +319,7 @@ sq:
|
|||
create: Krijoni lajmërim
|
||||
title: Lajmërim i ri
|
||||
preview:
|
||||
disclaimer: Ngaqë përdoruesit s’mund të zgjedhin lënien jashtë tyre, njoftimet me email do të kufizohen te njoftime të rëndësishme, të tilla si cenim të dhënash personale, ose njoftime mbylljesh shërbyesish.
|
||||
explanation_html: 'Email-i do të dërgohet te <strong>%{display_count} përdorues</strong>. Te email-i do të përfshihet teksti vijues:'
|
||||
title: Bëni paraparje të shënimit për njoftimin
|
||||
publish: Publikoje
|
||||
|
|
|
@ -319,6 +319,7 @@ tr:
|
|||
create: Duyuru oluştur
|
||||
title: Yeni duyuru
|
||||
preview:
|
||||
disclaimer: Kullanıcılar bu bildirimleri almayı iptal edemediği için, e-posta bildirimleri kişisel veri ihlali veya sunucu kapatma bildirimleri gibi önemli duyurularla sınırlandırılmalıdır.
|
||||
explanation_html: 'E-posta, <strong>%{display_count} kullanıcıya</strong> gönderilecektir. E-posta içerisinde aşağıdaki metin yer alacaktır:'
|
||||
title: Duyuru bildiriminin önizlemesine bak
|
||||
publish: Yayınla
|
||||
|
|
|
@ -325,6 +325,7 @@ uk:
|
|||
create: Створити оголошення
|
||||
title: Нове оголошення
|
||||
preview:
|
||||
disclaimer: Оскільки користувачі не можуть відмовитися від них, сповіщення по електронній пошті повинні обмежуватися важливими оголошеннями, такими як порушення особистих даних або повідомлення про закриття серверу.
|
||||
explanation_html: 'Електронний лист буде надіслано <strong>%{display_count} користувачам</strong>. До електронного листа буде включено такий текст:'
|
||||
title: Попередній перегляд сповіщення
|
||||
publish: Опублікувати
|
||||
|
|
|
@ -316,6 +316,7 @@ vi:
|
|||
create: Tạo thông báo
|
||||
title: Tạo thông báo mới
|
||||
preview:
|
||||
disclaimer: Vì người dùng không thể chọn không nhận thông báo qua email nên thông báo qua email chỉ nên giới hạn ở những thông báo quan trọng như thông báo vi phạm dữ liệu cá nhân hoặc thông báo đóng máy chủ.
|
||||
explanation_html: 'Gửi email tới <strong>%{display_count} thành viên</strong>. Nội dung sau đây sẽ được đưa vào email:'
|
||||
title: Xem trước thông báo sẽ gửi
|
||||
publish: Đăng
|
||||
|
|
|
@ -316,6 +316,7 @@ zh-CN:
|
|||
create: 创建公告
|
||||
title: 新公告
|
||||
preview:
|
||||
disclaimer: 由于用户无法选择退出,电子邮件通知应仅限于重要公告,例如个人数据泄露或服务器关闭通知。
|
||||
explanation_html: 此电子邮件将发送给 <strong>%{display_count} 用户</strong>。电子邮件将包含以下文本:
|
||||
title: 预览公告通知
|
||||
publish: 发布
|
||||
|
@ -471,6 +472,30 @@ zh-CN:
|
|||
new:
|
||||
title: 导入域名列表
|
||||
no_file: 没有选择文件
|
||||
fasp:
|
||||
debug:
|
||||
callbacks:
|
||||
created_at: 创建于
|
||||
delete: 刪除
|
||||
ip: IP 地址
|
||||
request_body: 请求正文
|
||||
title: 调试回调
|
||||
providers:
|
||||
active: 有效
|
||||
base_url: 基础 URL
|
||||
callback: 回调
|
||||
delete: 刪除
|
||||
edit: 编辑提供商
|
||||
finish_registration: 完成注册
|
||||
name: 名称
|
||||
providers: 提供商
|
||||
public_key_fingerprint: 公钥指纹
|
||||
registrations:
|
||||
confirm: 确认
|
||||
reject: 拒绝
|
||||
save: 保存
|
||||
sign_in: 登录
|
||||
status: 状态
|
||||
follow_recommendations:
|
||||
description_html: "<strong>“关注推荐”可帮助新用户快速找到有趣的内容</strong>。 当用户与他人的互动不足以形成个性化的建议时,就会推荐关注这些账号。推荐会每日更新,基于选定语言的近期最高互动数和最多本站关注者数综合评估得出。"
|
||||
language: 选择语言
|
||||
|
|
|
@ -316,6 +316,7 @@ zh-TW:
|
|||
create: 新增公告
|
||||
title: 新增公告
|
||||
preview:
|
||||
disclaimer: 由於使用者無法選擇退出,電子郵件通知應僅限於重要公告,例如個人資料洩露或伺服器關閉通知。
|
||||
explanation_html: 此 email 將寄至 <strong>%{display_count} 名使用者</strong>。以下文字將被包含於 e-mail 中:
|
||||
title: 預覽公告通知
|
||||
publish: 發布
|
||||
|
|
|
@ -192,6 +192,7 @@ namespace :api, format: false do
|
|||
resources :lists, only: :index
|
||||
resources :identity_proofs, only: :index
|
||||
resources :featured_tags, only: :index
|
||||
resources :endorsements, only: :index
|
||||
end
|
||||
|
||||
member do
|
||||
|
@ -205,8 +206,10 @@ namespace :api, format: false do
|
|||
end
|
||||
|
||||
scope module: :accounts do
|
||||
resource :pin, only: :create
|
||||
post :unpin, to: 'pins#destroy'
|
||||
post :pin, to: 'endorsements#create'
|
||||
post :endorse, to: 'endorsements#create'
|
||||
post :unpin, to: 'endorsements#destroy'
|
||||
post :unendorse, to: 'endorsements#destroy'
|
||||
resource :note, only: :create
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@mastodon/mastodon",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"packageManager": "yarn@4.8.1",
|
||||
"packageManager": "yarn@4.9.1",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
|
|
|
@ -13,8 +13,30 @@ RSpec.describe 'Accounts Pins API' do
|
|||
kevin.account.followers << user.account
|
||||
end
|
||||
|
||||
describe 'POST /api/v1/accounts/:account_id/pin' do
|
||||
subject { post "/api/v1/accounts/#{kevin.account.id}/pin", headers: headers }
|
||||
describe 'GET /api/v1/accounts/:account_id/endorsements' do
|
||||
subject { get "/api/v1/accounts/#{user.account.id}/endorsements", headers: headers }
|
||||
|
||||
let(:scopes) { 'read:accounts' }
|
||||
|
||||
before do
|
||||
user.account.endorsed_accounts << kevin.account
|
||||
end
|
||||
|
||||
it 'returns the expected accounts', :aggregate_failures do
|
||||
subject
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response.content_type)
|
||||
.to start_with('application/json')
|
||||
expect(response.parsed_body)
|
||||
.to contain_exactly(
|
||||
hash_including(id: kevin.account_id.to_s)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'POST /api/v1/accounts/:account_id/endorse' do
|
||||
subject { post "/api/v1/accounts/#{kevin.account.id}/endorse", headers: headers }
|
||||
|
||||
it 'creates account_pin', :aggregate_failures do
|
||||
expect do
|
||||
|
@ -26,8 +48,8 @@ RSpec.describe 'Accounts Pins API' do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'POST /api/v1/accounts/:account_id/unpin' do
|
||||
subject { post "/api/v1/accounts/#{kevin.account.id}/unpin", headers: headers }
|
||||
describe 'POST /api/v1/accounts/:account_id/unendorse' do
|
||||
subject { post "/api/v1/accounts/#{kevin.account.id}/unendorse", headers: headers }
|
||||
|
||||
before do
|
||||
Fabricate(:account_pin, account: user.account, target_account: kevin.account)
|
|
@ -132,9 +132,12 @@ RSpec.describe 'Lists' do
|
|||
it 'returns http unprocessable entity' do
|
||||
subject
|
||||
|
||||
expect(response).to have_http_status(422)
|
||||
expect(response)
|
||||
.to have_http_status(422)
|
||||
expect(response.content_type)
|
||||
.to start_with('application/json')
|
||||
expect(response.parsed_body)
|
||||
.to include(error: /Replies policy is not included/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -115,6 +115,21 @@ RSpec.describe 'Filters' do
|
|||
.to start_with('application/json')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the given filter_action value is invalid' do
|
||||
let(:params) { { title: 'magic', filter_action: 'imaginary_value', keywords_attributes: [keyword: 'magic'] } }
|
||||
|
||||
it 'returns http unprocessable entity' do
|
||||
subject
|
||||
|
||||
expect(response)
|
||||
.to have_http_status(422)
|
||||
expect(response.content_type)
|
||||
.to start_with('application/json')
|
||||
expect(response.parsed_body)
|
||||
.to include(error: /Action is not included/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET /api/v2/filters/:id' do
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@mastodon/streaming",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"packageManager": "yarn@4.8.1",
|
||||
"packageManager": "yarn@4.9.1",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
|
|
61
yarn.lock
61
yarn.lock
|
@ -7284,10 +7284,10 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3":
|
||||
version: 10.4.3
|
||||
resolution: "decimal.js@npm:10.4.3"
|
||||
checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee
|
||||
"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3, decimal.js@npm:^10.5.0":
|
||||
version: 10.5.0
|
||||
resolution: "decimal.js@npm:10.5.0"
|
||||
checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -9020,7 +9020,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"form-data@npm:^4.0.0, form-data@npm:^4.0.1":
|
||||
"form-data@npm:^4.0.0":
|
||||
version: 4.0.1
|
||||
resolution: "form-data@npm:4.0.1"
|
||||
dependencies:
|
||||
|
@ -10116,8 +10116,8 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"ioredis@npm:^5.3.2":
|
||||
version: 5.6.0
|
||||
resolution: "ioredis@npm:5.6.0"
|
||||
version: 5.6.1
|
||||
resolution: "ioredis@npm:5.6.1"
|
||||
dependencies:
|
||||
"@ioredis/commands": "npm:^1.1.1"
|
||||
cluster-key-slot: "npm:^1.1.0"
|
||||
|
@ -10128,7 +10128,7 @@ __metadata:
|
|||
redis-errors: "npm:^1.2.0"
|
||||
redis-parser: "npm:^3.0.0"
|
||||
standard-as-callback: "npm:^2.1.0"
|
||||
checksum: 10c0/a885e5146640fc448706871290ef424ffa39af561f7ee3cf1590085209a509f85e99082bdaaf3cd32fa66758aea3fc2055d1109648ddca96fac4944bf2092c30
|
||||
checksum: 10c0/26ae49cf448e807e454a9bdea5a9dfdcf669e2fdbf2df341900a0fb693c5662fea7e39db3227ce8972d1bda0ba7da9b7410e5163b12d8878a579548d847220ac
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -11397,13 +11397,12 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"jsdom@npm:^26.0.0":
|
||||
version: 26.0.0
|
||||
resolution: "jsdom@npm:26.0.0"
|
||||
version: 26.1.0
|
||||
resolution: "jsdom@npm:26.1.0"
|
||||
dependencies:
|
||||
cssstyle: "npm:^4.2.1"
|
||||
data-urls: "npm:^5.0.0"
|
||||
decimal.js: "npm:^10.4.3"
|
||||
form-data: "npm:^4.0.1"
|
||||
decimal.js: "npm:^10.5.0"
|
||||
html-encoding-sniffer: "npm:^4.0.0"
|
||||
http-proxy-agent: "npm:^7.0.2"
|
||||
https-proxy-agent: "npm:^7.0.6"
|
||||
|
@ -11413,12 +11412,12 @@ __metadata:
|
|||
rrweb-cssom: "npm:^0.8.0"
|
||||
saxes: "npm:^6.0.0"
|
||||
symbol-tree: "npm:^3.2.4"
|
||||
tough-cookie: "npm:^5.0.0"
|
||||
tough-cookie: "npm:^5.1.1"
|
||||
w3c-xmlserializer: "npm:^5.0.0"
|
||||
webidl-conversions: "npm:^7.0.0"
|
||||
whatwg-encoding: "npm:^3.1.1"
|
||||
whatwg-mimetype: "npm:^4.0.0"
|
||||
whatwg-url: "npm:^14.1.0"
|
||||
whatwg-url: "npm:^14.1.1"
|
||||
ws: "npm:^8.18.0"
|
||||
xml-name-validator: "npm:^5.0.0"
|
||||
peerDependencies:
|
||||
|
@ -11426,7 +11425,7 @@ __metadata:
|
|||
peerDependenciesMeta:
|
||||
canvas:
|
||||
optional: true
|
||||
checksum: 10c0/e48725ba4027edcfc9bca5799eaec72c6561ecffe3675a8ff87fe9c3541ca4ff9f82b4eff5b3d9c527302da0d859b2f60e9364347a5d42b77f5c76c436c569dc
|
||||
checksum: 10c0/5b14a5bc32ce077a06fb42d1ab95b1191afa5cbbce8859e3b96831c5143becbbcbf0511d4d4934e922d2901443ced2cdc3b734c1cf30b5f73b3e067ce457d0f4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -12025,9 +12024,9 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"marky@npm:^1.2.5":
|
||||
version: 1.2.5
|
||||
resolution: "marky@npm:1.2.5"
|
||||
checksum: 10c0/ca8a011f287dab1ac3291df720fc32b366c4cd767347b63722966650405ce71ec6566f71d1e22e1768bf6461a7fd689b9038e7df0fcfb62eacf3a5a6dcac249e
|
||||
version: 1.3.0
|
||||
resolution: "marky@npm:1.3.0"
|
||||
checksum: 10c0/6619cdb132fdc4f7cd3e2bed6eebf81a38e50ff4b426bbfb354db68731e4adfebf35ebfd7c8e5a6e846cbf9b872588c4f76db25782caee8c1529ec9d483bf98b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -17470,12 +17469,12 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tough-cookie@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "tough-cookie@npm:5.0.0"
|
||||
"tough-cookie@npm:^5.1.1":
|
||||
version: 5.1.2
|
||||
resolution: "tough-cookie@npm:5.1.2"
|
||||
dependencies:
|
||||
tldts: "npm:^6.1.32"
|
||||
checksum: 10c0/4a69c885bf6f45c5a64e60262af99e8c0d58a33bd3d0ce5da62121eeb9c00996d0128a72df8fc4614cbde59cc8b70aa3e21e4c3c98c2bbde137d7aba7fa00124
|
||||
checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -17504,12 +17503,12 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tr46@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "tr46@npm:5.0.0"
|
||||
"tr46@npm:^5.1.0":
|
||||
version: 5.1.0
|
||||
resolution: "tr46@npm:5.1.0"
|
||||
dependencies:
|
||||
punycode: "npm:^2.3.1"
|
||||
checksum: 10c0/1521b6e7bbc8adc825c4561480f9fe48eb2276c81335eed9fa610aa4c44a48a3221f78b10e5f18b875769eb3413e30efbf209ed556a17a42aa8d690df44b7bee
|
||||
checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -18544,13 +18543,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.0":
|
||||
version: 14.1.0
|
||||
resolution: "whatwg-url@npm:14.1.0"
|
||||
"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.1":
|
||||
version: 14.2.0
|
||||
resolution: "whatwg-url@npm:14.2.0"
|
||||
dependencies:
|
||||
tr46: "npm:^5.0.0"
|
||||
tr46: "npm:^5.1.0"
|
||||
webidl-conversions: "npm:^7.0.0"
|
||||
checksum: 10c0/f00104f1c67ce086ba8ffedab529cbbd9aefd8c0a6555320026de7aeff31f91c38680f95818b140a7c9cc657cde3781e567835dda552ddb1e2b8faaba0ac3cb6
|
||||
checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue