mirror of
https://github.com/mastodon/mastodon.git
synced 2025-05-14 13:41:15 +00:00
Merge branch 'main' into display_name
This commit is contained in:
commit
6724b6f237
|
@ -1,6 +1,6 @@
|
||||||
# This configuration was generated by
|
# This configuration was generated by
|
||||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
|
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
|
||||||
# using RuboCop version 1.75.1.
|
# using RuboCop version 1.75.2.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the offenses are removed from the code base.
|
# one by one as the offenses are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
|
@ -58,12 +58,6 @@ Style/FormatStringToken:
|
||||||
Style/GuardClause:
|
Style/GuardClause:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
||||||
Style/HashTransformValues:
|
|
||||||
Exclude:
|
|
||||||
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
|
||||||
- 'app/services/import_service.rb'
|
|
||||||
|
|
||||||
# Configuration parameters: AllowedMethods.
|
# Configuration parameters: AllowedMethods.
|
||||||
# AllowedMethods: respond_to_missing?
|
# AllowedMethods: respond_to_missing?
|
||||||
Style/OptionalBooleanParameter:
|
Style/OptionalBooleanParameter:
|
||||||
|
|
|
@ -201,7 +201,7 @@ GEM
|
||||||
domain_name (0.6.20240107)
|
domain_name (0.6.20240107)
|
||||||
doorkeeper (5.8.2)
|
doorkeeper (5.8.2)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (3.1.7)
|
dotenv (3.1.8)
|
||||||
drb (2.2.1)
|
drb (2.2.1)
|
||||||
elasticsearch (7.17.11)
|
elasticsearch (7.17.11)
|
||||||
elasticsearch-api (= 7.17.11)
|
elasticsearch-api (= 7.17.11)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useCallback } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import {
|
||||||
muteAccount,
|
muteAccount,
|
||||||
unmuteAccount,
|
unmuteAccount,
|
||||||
} from 'mastodon/actions/accounts';
|
} from 'mastodon/actions/accounts';
|
||||||
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
import { initMuteModal } from 'mastodon/actions/mutes';
|
import { initMuteModal } from 'mastodon/actions/mutes';
|
||||||
import { Avatar } from 'mastodon/components/avatar';
|
import { Avatar } from 'mastodon/components/avatar';
|
||||||
import { Button } from 'mastodon/components/button';
|
import { Button } from 'mastodon/components/button';
|
||||||
|
@ -23,7 +24,7 @@ import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
||||||
import { ShortNumber } from 'mastodon/components/short_number';
|
import { ShortNumber } from 'mastodon/components/short_number';
|
||||||
import { Skeleton } from 'mastodon/components/skeleton';
|
import { Skeleton } from 'mastodon/components/skeleton';
|
||||||
import { VerifiedBadge } from 'mastodon/components/verified_badge';
|
import { VerifiedBadge } from 'mastodon/components/verified_badge';
|
||||||
import { me } from 'mastodon/initial_state';
|
import type { MenuItem } from 'mastodon/models/dropdown_menu';
|
||||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
|
@ -46,6 +47,14 @@ const messages = defineMessages({
|
||||||
mute: { id: 'account.mute_short', defaultMessage: 'Mute' },
|
mute: { id: 'account.mute_short', defaultMessage: 'Mute' },
|
||||||
block: { id: 'account.block_short', defaultMessage: 'Block' },
|
block: { id: 'account.block_short', defaultMessage: 'Block' },
|
||||||
more: { id: 'status.more', defaultMessage: 'More' },
|
more: { id: 'status.more', defaultMessage: 'More' },
|
||||||
|
addToLists: {
|
||||||
|
id: 'account.add_or_remove_from_list',
|
||||||
|
defaultMessage: 'Add or Remove from lists',
|
||||||
|
},
|
||||||
|
openOriginalPage: {
|
||||||
|
id: 'account.open_original_page',
|
||||||
|
defaultMessage: 'Open original page',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export const Account: React.FC<{
|
export const Account: React.FC<{
|
||||||
|
@ -60,6 +69,7 @@ export const Account: React.FC<{
|
||||||
const account = useAppSelector((state) => state.accounts.get(id));
|
const account = useAppSelector((state) => state.accounts.get(id));
|
||||||
const relationship = useAppSelector((state) => state.relationships.get(id));
|
const relationship = useAppSelector((state) => state.relationships.get(id));
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
|
const accountUrl = account?.url;
|
||||||
|
|
||||||
const handleBlock = useCallback(() => {
|
const handleBlock = useCallback(() => {
|
||||||
if (relationship?.blocking) {
|
if (relationship?.blocking) {
|
||||||
|
@ -77,13 +87,62 @@ export const Account: React.FC<{
|
||||||
}
|
}
|
||||||
}, [dispatch, id, account, relationship]);
|
}, [dispatch, id, account, relationship]);
|
||||||
|
|
||||||
const handleMuteNotifications = useCallback(() => {
|
const menu = useMemo(() => {
|
||||||
dispatch(muteAccount(id, true));
|
let arr: MenuItem[] = [];
|
||||||
}, [dispatch, id]);
|
|
||||||
|
|
||||||
const handleUnmuteNotifications = useCallback(() => {
|
if (defaultAction === 'mute') {
|
||||||
|
const handleMuteNotifications = () => {
|
||||||
|
dispatch(muteAccount(id, true));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUnmuteNotifications = () => {
|
||||||
dispatch(muteAccount(id, false));
|
dispatch(muteAccount(id, false));
|
||||||
}, [dispatch, id]);
|
};
|
||||||
|
|
||||||
|
arr = [
|
||||||
|
{
|
||||||
|
text: intl.formatMessage(
|
||||||
|
relationship?.muting_notifications
|
||||||
|
? messages.unmute_notifications
|
||||||
|
: messages.mute_notifications,
|
||||||
|
),
|
||||||
|
action: relationship?.muting_notifications
|
||||||
|
? handleUnmuteNotifications
|
||||||
|
: handleMuteNotifications,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
} else if (defaultAction !== 'block') {
|
||||||
|
const handleAddToLists = () => {
|
||||||
|
dispatch(
|
||||||
|
openModal({
|
||||||
|
modalType: 'LIST_ADDER',
|
||||||
|
modalProps: {
|
||||||
|
accountId: id,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
arr = [
|
||||||
|
{
|
||||||
|
text: intl.formatMessage(messages.addToLists),
|
||||||
|
action: handleAddToLists,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
if (accountUrl) {
|
||||||
|
arr.unshift(
|
||||||
|
{
|
||||||
|
text: intl.formatMessage(messages.openOriginalPage),
|
||||||
|
href: accountUrl,
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
}, [dispatch, intl, id, accountUrl, relationship, defaultAction]);
|
||||||
|
|
||||||
if (hidden) {
|
if (hidden) {
|
||||||
return (
|
return (
|
||||||
|
@ -94,68 +153,42 @@ export const Account: React.FC<{
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let buttons;
|
let button: React.ReactNode, dropdown: React.ReactNode;
|
||||||
|
|
||||||
if (account && account.id !== me && relationship) {
|
if (menu.length > 0) {
|
||||||
const { requested, blocking, muting } = relationship;
|
dropdown = (
|
||||||
|
|
||||||
if (requested) {
|
|
||||||
buttons = <FollowButton accountId={id} />;
|
|
||||||
} else if (blocking) {
|
|
||||||
buttons = (
|
|
||||||
<Button
|
|
||||||
text={intl.formatMessage(messages.unblock)}
|
|
||||||
onClick={handleBlock}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
} else if (muting) {
|
|
||||||
const menu = [
|
|
||||||
{
|
|
||||||
text: intl.formatMessage(
|
|
||||||
relationship.muting_notifications
|
|
||||||
? messages.unmute_notifications
|
|
||||||
: messages.mute_notifications,
|
|
||||||
),
|
|
||||||
action: relationship.muting_notifications
|
|
||||||
? handleUnmuteNotifications
|
|
||||||
: handleMuteNotifications,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
buttons = (
|
|
||||||
<>
|
|
||||||
<Dropdown
|
<Dropdown
|
||||||
items={menu}
|
items={menu}
|
||||||
icon='ellipsis-h'
|
icon='ellipsis-h'
|
||||||
iconComponent={MoreHorizIcon}
|
iconComponent={MoreHorizIcon}
|
||||||
title={intl.formatMessage(messages.more)}
|
title={intl.formatMessage(messages.more)}
|
||||||
/>
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defaultAction === 'block') {
|
||||||
|
button = (
|
||||||
<Button
|
<Button
|
||||||
text={intl.formatMessage(messages.unmute)}
|
text={intl.formatMessage(
|
||||||
onClick={handleMute}
|
relationship?.blocking ? messages.unblock : messages.block,
|
||||||
/>
|
)}
|
||||||
</>
|
|
||||||
);
|
|
||||||
} else if (defaultAction === 'mute') {
|
|
||||||
buttons = (
|
|
||||||
<Button text={intl.formatMessage(messages.mute)} onClick={handleMute} />
|
|
||||||
);
|
|
||||||
} else if (defaultAction === 'block') {
|
|
||||||
buttons = (
|
|
||||||
<Button
|
|
||||||
text={intl.formatMessage(messages.block)}
|
|
||||||
onClick={handleBlock}
|
onClick={handleBlock}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
} else if (defaultAction === 'mute') {
|
||||||
|
button = (
|
||||||
|
<Button
|
||||||
|
text={intl.formatMessage(
|
||||||
|
relationship?.muting ? messages.unmute : messages.mute,
|
||||||
|
)}
|
||||||
|
onClick={handleMute}
|
||||||
|
/>
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
buttons = <FollowButton accountId={id} />;
|
button = <FollowButton accountId={id} />;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buttons = <FollowButton accountId={id} />;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let muteTimeRemaining;
|
let muteTimeRemaining: React.ReactNode;
|
||||||
|
|
||||||
if (account?.mute_expires_at) {
|
if (account?.mute_expires_at) {
|
||||||
muteTimeRemaining = (
|
muteTimeRemaining = (
|
||||||
|
@ -165,7 +198,7 @@ export const Account: React.FC<{
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let verification;
|
let verification: React.ReactNode;
|
||||||
|
|
||||||
const firstVerifiedField = account?.fields.find((item) => !!item.verified_at);
|
const firstVerifiedField = account?.fields.find((item) => !!item.verified_at);
|
||||||
|
|
||||||
|
@ -211,7 +244,12 @@ export const Account: React.FC<{
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{!minimal && <div className='account__relationship'>{buttons}</div>}
|
{!minimal && (
|
||||||
|
<div className='account__relationship'>
|
||||||
|
{dropdown}
|
||||||
|
{button}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{account &&
|
{account &&
|
||||||
|
|
|
@ -71,6 +71,8 @@ type RenderItemFn<Item = MenuItem> = (
|
||||||
},
|
},
|
||||||
) => React.ReactNode;
|
) => React.ReactNode;
|
||||||
|
|
||||||
|
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
|
||||||
|
|
||||||
type RenderHeaderFn<Item = MenuItem> = (items: Item[]) => React.ReactNode;
|
type RenderHeaderFn<Item = MenuItem> = (items: Item[]) => React.ReactNode;
|
||||||
|
|
||||||
interface DropdownMenuProps<Item = MenuItem> {
|
interface DropdownMenuProps<Item = MenuItem> {
|
||||||
|
@ -81,10 +83,10 @@ interface DropdownMenuProps<Item = MenuItem> {
|
||||||
openedViaKeyboard: boolean;
|
openedViaKeyboard: boolean;
|
||||||
renderItem?: RenderItemFn<Item>;
|
renderItem?: RenderItemFn<Item>;
|
||||||
renderHeader?: RenderHeaderFn<Item>;
|
renderHeader?: RenderHeaderFn<Item>;
|
||||||
onItemClick: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
onItemClick?: ItemClickFn<Item>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DropdownMenu = <Item = MenuItem,>({
|
export const DropdownMenu = <Item = MenuItem,>({
|
||||||
items,
|
items,
|
||||||
loading,
|
loading,
|
||||||
scrollable,
|
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(
|
const handleItemKeyUp = useCallback(
|
||||||
(e: React.KeyboardEvent) => {
|
(e: React.KeyboardEvent) => {
|
||||||
if (e.key === 'Enter' || e.key === ' ') {
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
onItemClick(e);
|
handleItemClick(e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[onItemClick],
|
[handleItemClick],
|
||||||
);
|
|
||||||
|
|
||||||
const handleClick = useCallback(
|
|
||||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
|
||||||
onItemClick(e);
|
|
||||||
},
|
|
||||||
[onItemClick],
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const nativeRenderItem = (option: Item, i: number) => {
|
const nativeRenderItem = (option: Item, i: number) => {
|
||||||
|
@ -209,7 +226,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
||||||
element = (
|
element = (
|
||||||
<button
|
<button
|
||||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||||
onClick={handleClick}
|
onClick={handleItemClick}
|
||||||
onKeyUp={handleItemKeyUp}
|
onKeyUp={handleItemKeyUp}
|
||||||
data-index={i}
|
data-index={i}
|
||||||
>
|
>
|
||||||
|
@ -224,7 +241,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
||||||
data-method={option.method}
|
data-method={option.method}
|
||||||
rel='noopener'
|
rel='noopener'
|
||||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||||
onClick={handleClick}
|
onClick={handleItemClick}
|
||||||
onKeyUp={handleItemKeyUp}
|
onKeyUp={handleItemKeyUp}
|
||||||
data-index={i}
|
data-index={i}
|
||||||
>
|
>
|
||||||
|
@ -236,7 +253,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
||||||
<Link
|
<Link
|
||||||
to={option.to}
|
to={option.to}
|
||||||
ref={i === 0 ? handleFocusedItemRef : undefined}
|
ref={i === 0 ? handleFocusedItemRef : undefined}
|
||||||
onClick={handleClick}
|
onClick={handleItemClick}
|
||||||
onKeyUp={handleItemKeyUp}
|
onKeyUp={handleItemKeyUp}
|
||||||
data-index={i}
|
data-index={i}
|
||||||
>
|
>
|
||||||
|
@ -282,7 +299,7 @@ const DropdownMenu = <Item = MenuItem,>({
|
||||||
>
|
>
|
||||||
{items.map((option, i) =>
|
{items.map((option, i) =>
|
||||||
renderItemMethod(option, i, {
|
renderItemMethod(option, i, {
|
||||||
onClick: handleClick,
|
onClick: handleItemClick,
|
||||||
onKeyUp: handleItemKeyUp,
|
onKeyUp: handleItemKeyUp,
|
||||||
}),
|
}),
|
||||||
)}
|
)}
|
||||||
|
@ -306,7 +323,7 @@ interface DropdownProps<Item = MenuItem> {
|
||||||
renderItem?: RenderItemFn<Item>;
|
renderItem?: RenderItemFn<Item>;
|
||||||
renderHeader?: RenderHeaderFn<Item>;
|
renderHeader?: RenderHeaderFn<Item>;
|
||||||
onOpen?: () => void;
|
onOpen?: () => void;
|
||||||
onItemClick?: (arg0: Item, arg1: number) => void;
|
onItemClick?: ItemClickFn<Item>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const offset = [5, 5] as OffsetValue;
|
const offset = [5, 5] as OffsetValue;
|
||||||
|
@ -354,6 +371,28 @@ export const Dropdown = <Item = MenuItem,>({
|
||||||
dispatch(closeDropdownMenu({ id: currentId }));
|
dispatch(closeDropdownMenu({ id: currentId }));
|
||||||
}, [dispatch, currentId]);
|
}, [dispatch, currentId]);
|
||||||
|
|
||||||
|
const handleItemClick = useCallback(
|
||||||
|
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||||
|
const i = Number(e.currentTarget.getAttribute('data-index'));
|
||||||
|
const item = items?.[i];
|
||||||
|
|
||||||
|
handleClose();
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof onItemClick === 'function') {
|
||||||
|
e.preventDefault();
|
||||||
|
onItemClick(item, i);
|
||||||
|
} else if (isActionItem(item)) {
|
||||||
|
e.preventDefault();
|
||||||
|
item.action();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[handleClose, onItemClick, items],
|
||||||
|
);
|
||||||
|
|
||||||
const handleClick = useCallback(
|
const handleClick = useCallback(
|
||||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
(e: React.MouseEvent | React.KeyboardEvent) => {
|
||||||
const { type } = e;
|
const { type } = e;
|
||||||
|
@ -374,7 +413,7 @@ export const Dropdown = <Item = MenuItem,>({
|
||||||
modalProps: {
|
modalProps: {
|
||||||
status,
|
status,
|
||||||
actions: items,
|
actions: items,
|
||||||
onClick: onItemClick,
|
onClick: handleItemClick,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -394,7 +433,7 @@ export const Dropdown = <Item = MenuItem,>({
|
||||||
currentId,
|
currentId,
|
||||||
scrollKey,
|
scrollKey,
|
||||||
onOpen,
|
onOpen,
|
||||||
onItemClick,
|
handleItemClick,
|
||||||
open,
|
open,
|
||||||
status,
|
status,
|
||||||
items,
|
items,
|
||||||
|
@ -434,28 +473,6 @@ export const Dropdown = <Item = MenuItem,>({
|
||||||
[handleClick],
|
[handleClick],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleItemClick = useCallback(
|
|
||||||
(e: React.MouseEvent | React.KeyboardEvent) => {
|
|
||||||
const i = Number(e.currentTarget.getAttribute('data-index'));
|
|
||||||
const item = items?.[i];
|
|
||||||
|
|
||||||
handleClose();
|
|
||||||
|
|
||||||
if (!item) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof onItemClick === 'function') {
|
|
||||||
e.preventDefault();
|
|
||||||
onItemClick(item, i);
|
|
||||||
} else if (isActionItem(item)) {
|
|
||||||
e.preventDefault();
|
|
||||||
item.action();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[handleClose, onItemClick, items],
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return () => {
|
return () => {
|
||||||
if (currentId === openDropdownId) {
|
if (currentId === openDropdownId) {
|
||||||
|
@ -521,7 +538,7 @@ export const Dropdown = <Item = MenuItem,>({
|
||||||
openedViaKeyboard={openedViaKeyboard}
|
openedViaKeyboard={openedViaKeyboard}
|
||||||
renderItem={renderItem}
|
renderItem={renderItem}
|
||||||
renderHeader={renderHeader}
|
renderHeader={renderHeader}
|
||||||
onItemClick={handleItemClick}
|
onItemClick={onItemClick}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -36,11 +36,11 @@ export const EditedTimestamp: React.FC<{
|
||||||
}, [dispatch, statusId]);
|
}, [dispatch, statusId]);
|
||||||
|
|
||||||
const handleItemClick = useCallback(
|
const handleItemClick = useCallback(
|
||||||
(_item: HistoryItem, i: number) => {
|
(_item: HistoryItem, index: number) => {
|
||||||
dispatch(
|
dispatch(
|
||||||
openModal({
|
openModal({
|
||||||
modalType: 'COMPARE_HISTORY',
|
modalType: 'COMPARE_HISTORY',
|
||||||
modalProps: { index: i, statusId },
|
modalProps: { index, statusId },
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
@ -102,7 +102,7 @@ export interface HashtagProps {
|
||||||
description?: React.ReactNode;
|
description?: React.ReactNode;
|
||||||
history?: number[];
|
history?: number[];
|
||||||
name: string;
|
name: string;
|
||||||
people: number;
|
people?: number;
|
||||||
to: string;
|
to: string;
|
||||||
uses?: number;
|
uses?: number;
|
||||||
withGraph?: boolean;
|
withGraph?: boolean;
|
||||||
|
|
|
@ -20,6 +20,7 @@ export type StatusLike = Record<{
|
||||||
contentHTML: string;
|
contentHTML: string;
|
||||||
media_attachments: List<unknown>;
|
media_attachments: List<unknown>;
|
||||||
spoiler_text?: string;
|
spoiler_text?: string;
|
||||||
|
account: Record<{ id: string }>;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
function normalizeHashtag(hashtag: string) {
|
function normalizeHashtag(hashtag: string) {
|
||||||
|
@ -195,13 +196,19 @@ export function getHashtagBarForStatus(status: StatusLike) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
statusContentProps,
|
statusContentProps,
|
||||||
hashtagBar: <HashtagBar hashtags={hashtagsInBar} />,
|
hashtagBar: (
|
||||||
|
<HashtagBar
|
||||||
|
hashtags={hashtagsInBar}
|
||||||
|
accountId={status.getIn(['account', 'id']) as string}
|
||||||
|
/>
|
||||||
|
),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const HashtagBar: React.FC<{
|
const HashtagBar: React.FC<{
|
||||||
hashtags: string[];
|
hashtags: string[];
|
||||||
}> = ({ hashtags }) => {
|
accountId: string;
|
||||||
|
}> = ({ hashtags, accountId }) => {
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
const handleClick = useCallback(() => {
|
const handleClick = useCallback(() => {
|
||||||
setExpanded(true);
|
setExpanded(true);
|
||||||
|
@ -218,7 +225,11 @@ const HashtagBar: React.FC<{
|
||||||
return (
|
return (
|
||||||
<div className='hashtag-bar'>
|
<div className='hashtag-bar'>
|
||||||
{revealedHashtags.map((hashtag) => (
|
{revealedHashtags.map((hashtag) => (
|
||||||
<Link key={hashtag} to={`/tags/${hashtag}`}>
|
<Link
|
||||||
|
key={hashtag}
|
||||||
|
to={`/tags/${hashtag}`}
|
||||||
|
data-menu-hashtag={accountId}
|
||||||
|
>
|
||||||
#<span>{hashtag}</span>
|
#<span>{hashtag}</span>
|
||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
|
|
|
@ -1,25 +1,6 @@
|
||||||
import { Switch, Route } from 'react-router-dom';
|
|
||||||
|
|
||||||
import AccountNavigation from 'mastodon/features/account/navigation';
|
|
||||||
import Trends from 'mastodon/features/getting_started/containers/trends_container';
|
import Trends from 'mastodon/features/getting_started/containers/trends_container';
|
||||||
import { showTrends } from 'mastodon/initial_state';
|
import { showTrends } from 'mastodon/initial_state';
|
||||||
|
|
||||||
const DefaultNavigation: React.FC = () => (showTrends ? <Trends /> : null);
|
|
||||||
|
|
||||||
export const NavigationPortal: React.FC = () => (
|
export const NavigationPortal: React.FC = () => (
|
||||||
<div className='navigation-panel__portal'>
|
<div className='navigation-panel__portal'>{showTrends && <Trends />}</div>
|
||||||
<Switch>
|
|
||||||
<Route path='/@:acct' exact component={AccountNavigation} />
|
|
||||||
<Route
|
|
||||||
path='/@:acct/tagged/:tagged?'
|
|
||||||
exact
|
|
||||||
component={AccountNavigation}
|
|
||||||
/>
|
|
||||||
<Route path='/@:acct/with_replies' exact component={AccountNavigation} />
|
|
||||||
<Route path='/@:acct/followers' exact component={AccountNavigation} />
|
|
||||||
<Route path='/@:acct/following' exact component={AccountNavigation} />
|
|
||||||
<Route path='/@:acct/media' exact component={AccountNavigation} />
|
|
||||||
<Route component={DefaultNavigation} />
|
|
||||||
</Switch>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
|
|
43
app/javascript/mastodon/components/remote_hint.tsx
Normal file
43
app/javascript/mastodon/components/remote_hint.tsx
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import { useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
|
import { TimelineHint } from './timeline_hint';
|
||||||
|
|
||||||
|
interface RemoteHintProps {
|
||||||
|
accountId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const RemoteHint: React.FC<RemoteHintProps> = ({ accountId }) => {
|
||||||
|
const account = useAppSelector((state) =>
|
||||||
|
accountId ? state.accounts.get(accountId) : undefined,
|
||||||
|
);
|
||||||
|
const domain = account?.acct ? account.acct.split('@')[1] : undefined;
|
||||||
|
if (
|
||||||
|
!account ||
|
||||||
|
!account.url ||
|
||||||
|
account.acct !== account.username ||
|
||||||
|
!domain
|
||||||
|
) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TimelineHint
|
||||||
|
url={account.url}
|
||||||
|
message={
|
||||||
|
<FormattedMessage
|
||||||
|
id='hints.profiles.posts_may_be_missing'
|
||||||
|
defaultMessage='Some posts from this profile may be missing.'
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
label={
|
||||||
|
<FormattedMessage
|
||||||
|
id='hints.profiles.see_more_posts'
|
||||||
|
defaultMessage='See more posts on {domain}'
|
||||||
|
values={{ domain: <strong>{domain}</strong> }}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
|
@ -274,9 +274,8 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
|
|
||||||
if (writtenByMe && pinnableStatus) {
|
if (writtenByMe && pinnableStatus) {
|
||||||
menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
|
menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
|
||||||
}
|
|
||||||
|
|
||||||
menu.push(null);
|
menu.push(null);
|
||||||
|
}
|
||||||
|
|
||||||
if (writtenByMe || withDismiss) {
|
if (writtenByMe || withDismiss) {
|
||||||
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
|
||||||
|
|
|
@ -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] === '#')) {
|
} 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.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
|
||||||
link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`);
|
link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`);
|
||||||
|
link.setAttribute('data-menu-hashtag', this.props.status.getIn(['account', 'id']));
|
||||||
} else {
|
} else {
|
||||||
link.setAttribute('title', link.href);
|
link.setAttribute('title', link.href);
|
||||||
link.classList.add('unhandled-link');
|
link.classList.add('unhandled-link');
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
|
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
|
||||||
|
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
|
||||||
|
|
||||||
import { Hashtag } from 'mastodon/components/hashtag';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
|
||||||
lastStatusAt: { id: 'account.featured_tags.last_status_at', defaultMessage: 'Last post on {date}' },
|
|
||||||
empty: { id: 'account.featured_tags.last_status_never', defaultMessage: 'No posts' },
|
|
||||||
});
|
|
||||||
|
|
||||||
class FeaturedTags extends ImmutablePureComponent {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
account: ImmutablePropTypes.record,
|
|
||||||
featuredTags: ImmutablePropTypes.list,
|
|
||||||
tagged: PropTypes.string,
|
|
||||||
intl: PropTypes.object.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { account, featuredTags, intl } = this.props;
|
|
||||||
|
|
||||||
if (!account || account.get('suspended') || featuredTags.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className='getting-started__trends'>
|
|
||||||
<h4><FormattedMessage id='account.featured_tags.title' defaultMessage="{name}'s featured hashtags" values={{ name: <bdi dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /> }} /></h4>
|
|
||||||
|
|
||||||
{featuredTags.take(3).map(featuredTag => (
|
|
||||||
<Hashtag
|
|
||||||
key={featuredTag.get('name')}
|
|
||||||
name={featuredTag.get('name')}
|
|
||||||
to={`/@${account.get('acct')}/tagged/${featuredTag.get('name')}`}
|
|
||||||
uses={featuredTag.get('statuses_count') * 1}
|
|
||||||
withGraph={false}
|
|
||||||
description={((featuredTag.get('statuses_count') * 1) > 0) ? intl.formatMessage(messages.lastStatusAt, { date: intl.formatDate(featuredTag.get('last_status_at'), { month: 'short', day: '2-digit' }) }) : intl.formatMessage(messages.empty)}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default injectIntl(FeaturedTags);
|
|
|
@ -1,17 +0,0 @@
|
||||||
import { List as ImmutableList } from 'immutable';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import { makeGetAccount } from 'mastodon/selectors';
|
|
||||||
|
|
||||||
import FeaturedTags from '../components/featured_tags';
|
|
||||||
|
|
||||||
const mapStateToProps = () => {
|
|
||||||
const getAccount = makeGetAccount();
|
|
||||||
|
|
||||||
return (state, { accountId }) => ({
|
|
||||||
account: getAccount(state, accountId),
|
|
||||||
featuredTags: state.getIn(['user_lists', 'featured_tags', accountId, 'items'], ImmutableList()),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(FeaturedTags);
|
|
|
@ -1,52 +0,0 @@
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { PureComponent } from 'react';
|
|
||||||
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import FeaturedTags from 'mastodon/features/account/containers/featured_tags_container';
|
|
||||||
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
|
|
||||||
|
|
||||||
const mapStateToProps = (state, { match: { params: { acct } } }) => {
|
|
||||||
const accountId = state.getIn(['accounts_map', normalizeForLookup(acct)]);
|
|
||||||
|
|
||||||
if (!accountId) {
|
|
||||||
return {
|
|
||||||
isLoading: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
accountId,
|
|
||||||
isLoading: false,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class AccountNavigation extends PureComponent {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
match: PropTypes.shape({
|
|
||||||
params: PropTypes.shape({
|
|
||||||
acct: PropTypes.string,
|
|
||||||
tagged: PropTypes.string,
|
|
||||||
}).isRequired,
|
|
||||||
}).isRequired,
|
|
||||||
|
|
||||||
accountId: PropTypes.string,
|
|
||||||
isLoading: PropTypes.bool,
|
|
||||||
};
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { accountId, isLoading, match: { params: { tagged } } } = this.props;
|
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<FeaturedTags accountId={accountId} tagged={tagged} />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(AccountNavigation);
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import { LimitedAccountHint } from 'mastodon/features/account_timeline/components/limited_account_hint';
|
||||||
|
|
||||||
|
interface EmptyMessageProps {
|
||||||
|
suspended: boolean;
|
||||||
|
hidden: boolean;
|
||||||
|
blockedBy: boolean;
|
||||||
|
accountId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const EmptyMessage: React.FC<EmptyMessageProps> = ({
|
||||||
|
accountId,
|
||||||
|
suspended,
|
||||||
|
hidden,
|
||||||
|
blockedBy,
|
||||||
|
}) => {
|
||||||
|
if (!accountId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let message: React.ReactNode = null;
|
||||||
|
|
||||||
|
if (suspended) {
|
||||||
|
message = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='empty_column.account_suspended'
|
||||||
|
defaultMessage='Account suspended'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (hidden) {
|
||||||
|
message = <LimitedAccountHint accountId={accountId} />;
|
||||||
|
} else if (blockedBy) {
|
||||||
|
message = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='empty_column.account_unavailable'
|
||||||
|
defaultMessage='Profile unavailable'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
message = (
|
||||||
|
<FormattedMessage
|
||||||
|
id='empty_column.account_featured'
|
||||||
|
defaultMessage='This list is empty'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className='empty-column-indicator'>{message}</div>;
|
||||||
|
};
|
|
@ -0,0 +1,51 @@
|
||||||
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
|
|
||||||
|
import type { Map as ImmutableMap } from 'immutable';
|
||||||
|
|
||||||
|
import { Hashtag } from 'mastodon/components/hashtag';
|
||||||
|
|
||||||
|
export type TagMap = ImmutableMap<
|
||||||
|
'id' | 'name' | 'url' | 'statuses_count' | 'last_status_at' | 'accountId',
|
||||||
|
string | null
|
||||||
|
>;
|
||||||
|
|
||||||
|
interface FeaturedTagProps {
|
||||||
|
tag: TagMap;
|
||||||
|
account: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
lastStatusAt: {
|
||||||
|
id: 'account.featured_tags.last_status_at',
|
||||||
|
defaultMessage: 'Last post on {date}',
|
||||||
|
},
|
||||||
|
empty: {
|
||||||
|
id: 'account.featured_tags.last_status_never',
|
||||||
|
defaultMessage: 'No posts',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const FeaturedTag: React.FC<FeaturedTagProps> = ({ tag, account }) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
const name = tag.get('name') ?? '';
|
||||||
|
const count = Number.parseInt(tag.get('statuses_count') ?? '');
|
||||||
|
return (
|
||||||
|
<Hashtag
|
||||||
|
key={name}
|
||||||
|
name={name}
|
||||||
|
to={`/@${account}/tagged/${name}`}
|
||||||
|
uses={count}
|
||||||
|
withGraph={false}
|
||||||
|
description={
|
||||||
|
count > 0
|
||||||
|
? intl.formatMessage(messages.lastStatusAt, {
|
||||||
|
date: intl.formatDate(tag.get('last_status_at') ?? '', {
|
||||||
|
month: 'short',
|
||||||
|
day: '2-digit',
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
: intl.formatMessage(messages.empty)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
156
app/javascript/mastodon/features/account_featured/index.tsx
Normal file
156
app/javascript/mastodon/features/account_featured/index.tsx
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
|
import { useParams } from 'react-router';
|
||||||
|
|
||||||
|
import type { Map as ImmutableMap } from 'immutable';
|
||||||
|
import { List as ImmutableList } from 'immutable';
|
||||||
|
|
||||||
|
import { fetchFeaturedTags } from 'mastodon/actions/featured_tags';
|
||||||
|
import { expandAccountFeaturedTimeline } from 'mastodon/actions/timelines';
|
||||||
|
import { ColumnBackButton } from 'mastodon/components/column_back_button';
|
||||||
|
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||||
|
import { RemoteHint } from 'mastodon/components/remote_hint';
|
||||||
|
import StatusContainer from 'mastodon/containers/status_container';
|
||||||
|
import { useAccountId } from 'mastodon/hooks/useAccountId';
|
||||||
|
import { useAccountVisibility } from 'mastodon/hooks/useAccountVisibility';
|
||||||
|
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
|
import { AccountHeader } from '../account_timeline/components/account_header';
|
||||||
|
import Column from '../ui/components/column';
|
||||||
|
|
||||||
|
import { EmptyMessage } from './components/empty_message';
|
||||||
|
import { FeaturedTag } from './components/featured_tag';
|
||||||
|
import type { TagMap } from './components/featured_tag';
|
||||||
|
|
||||||
|
interface Params {
|
||||||
|
acct?: string;
|
||||||
|
id?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AccountFeatured = () => {
|
||||||
|
const accountId = useAccountId();
|
||||||
|
const { suspended, blockedBy, hidden } = useAccountVisibility(accountId);
|
||||||
|
const forceEmptyState = suspended || blockedBy || hidden;
|
||||||
|
const { acct = '' } = useParams<Params>();
|
||||||
|
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (accountId) {
|
||||||
|
void dispatch(expandAccountFeaturedTimeline(accountId));
|
||||||
|
dispatch(fetchFeaturedTags(accountId));
|
||||||
|
}
|
||||||
|
}, [accountId, dispatch]);
|
||||||
|
|
||||||
|
const isLoading = useAppSelector(
|
||||||
|
(state) =>
|
||||||
|
!accountId ||
|
||||||
|
!!(state.timelines as ImmutableMap<string, unknown>).getIn([
|
||||||
|
`account:${accountId}:pinned`,
|
||||||
|
'isLoading',
|
||||||
|
]) ||
|
||||||
|
!!state.user_lists.getIn(['featured_tags', accountId, 'isLoading']),
|
||||||
|
);
|
||||||
|
const featuredTags = useAppSelector(
|
||||||
|
(state) =>
|
||||||
|
state.user_lists.getIn(
|
||||||
|
['featured_tags', accountId, 'items'],
|
||||||
|
ImmutableList(),
|
||||||
|
) as ImmutableList<TagMap>,
|
||||||
|
);
|
||||||
|
const featuredStatusIds = useAppSelector(
|
||||||
|
(state) =>
|
||||||
|
(state.timelines as ImmutableMap<string, unknown>).getIn(
|
||||||
|
[`account:${accountId}:pinned`, 'items'],
|
||||||
|
ImmutableList(),
|
||||||
|
) as ImmutableList<string>,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<AccountFeaturedWrapper accountId={accountId}>
|
||||||
|
<div className='scrollable__append'>
|
||||||
|
<LoadingIndicator />
|
||||||
|
</div>
|
||||||
|
</AccountFeaturedWrapper>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (featuredStatusIds.isEmpty() && featuredTags.isEmpty()) {
|
||||||
|
return (
|
||||||
|
<AccountFeaturedWrapper accountId={accountId}>
|
||||||
|
<EmptyMessage
|
||||||
|
blockedBy={blockedBy}
|
||||||
|
hidden={hidden}
|
||||||
|
suspended={suspended}
|
||||||
|
accountId={accountId}
|
||||||
|
/>
|
||||||
|
<RemoteHint accountId={accountId} />
|
||||||
|
</AccountFeaturedWrapper>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Column>
|
||||||
|
<ColumnBackButton />
|
||||||
|
|
||||||
|
<div className='scrollable scrollable--flex'>
|
||||||
|
{accountId && (
|
||||||
|
<AccountHeader accountId={accountId} hideTabs={forceEmptyState} />
|
||||||
|
)}
|
||||||
|
{!featuredTags.isEmpty() && (
|
||||||
|
<>
|
||||||
|
<h4 className='column-subheading'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='account.featured.hashtags'
|
||||||
|
defaultMessage='Hashtags'
|
||||||
|
/>
|
||||||
|
</h4>
|
||||||
|
{featuredTags.map((tag) => (
|
||||||
|
<FeaturedTag key={tag.get('id')} tag={tag} account={acct} />
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{!featuredStatusIds.isEmpty() && (
|
||||||
|
<>
|
||||||
|
<h4 className='column-subheading'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='account.featured.posts'
|
||||||
|
defaultMessage='Posts'
|
||||||
|
/>
|
||||||
|
</h4>
|
||||||
|
{featuredStatusIds.map((statusId) => (
|
||||||
|
<StatusContainer
|
||||||
|
key={`f-${statusId}`}
|
||||||
|
// @ts-expect-error inferred props are wrong
|
||||||
|
id={statusId}
|
||||||
|
contextType='account'
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<RemoteHint accountId={accountId} />
|
||||||
|
</div>
|
||||||
|
</Column>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccountFeaturedWrapper = ({
|
||||||
|
children,
|
||||||
|
accountId,
|
||||||
|
}: React.PropsWithChildren<{ accountId?: string }>) => {
|
||||||
|
return (
|
||||||
|
<Column>
|
||||||
|
<ColumnBackButton />
|
||||||
|
<div className='scrollable scrollable--flex'>
|
||||||
|
{accountId && <AccountHeader accountId={accountId} />}
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</Column>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line import/no-default-export
|
||||||
|
export default AccountFeatured;
|
|
@ -2,25 +2,22 @@ import { useEffect, useCallback } from 'react';
|
||||||
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
import { useParams } from 'react-router-dom';
|
|
||||||
|
|
||||||
import { createSelector } from '@reduxjs/toolkit';
|
import { createSelector } from '@reduxjs/toolkit';
|
||||||
import type { Map as ImmutableMap } from 'immutable';
|
import type { Map as ImmutableMap } from 'immutable';
|
||||||
import { List as ImmutableList } from 'immutable';
|
import { List as ImmutableList } from 'immutable';
|
||||||
|
|
||||||
import { lookupAccount, fetchAccount } from 'mastodon/actions/accounts';
|
|
||||||
import { openModal } from 'mastodon/actions/modal';
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
import { expandAccountMediaTimeline } from 'mastodon/actions/timelines';
|
import { expandAccountMediaTimeline } from 'mastodon/actions/timelines';
|
||||||
import { ColumnBackButton } from 'mastodon/components/column_back_button';
|
import { ColumnBackButton } from 'mastodon/components/column_back_button';
|
||||||
|
import { RemoteHint } from 'mastodon/components/remote_hint';
|
||||||
import ScrollableList from 'mastodon/components/scrollable_list';
|
import ScrollableList from 'mastodon/components/scrollable_list';
|
||||||
import { TimelineHint } from 'mastodon/components/timeline_hint';
|
|
||||||
import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header';
|
import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header';
|
||||||
import { LimitedAccountHint } from 'mastodon/features/account_timeline/components/limited_account_hint';
|
import { LimitedAccountHint } from 'mastodon/features/account_timeline/components/limited_account_hint';
|
||||||
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
|
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
|
||||||
import Column from 'mastodon/features/ui/components/column';
|
import Column from 'mastodon/features/ui/components/column';
|
||||||
|
import { useAccountId } from 'mastodon/hooks/useAccountId';
|
||||||
|
import { useAccountVisibility } from 'mastodon/hooks/useAccountVisibility';
|
||||||
import type { MediaAttachment } from 'mastodon/models/media_attachment';
|
import type { MediaAttachment } from 'mastodon/models/media_attachment';
|
||||||
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
|
|
||||||
import { getAccountHidden } from 'mastodon/selectors/accounts';
|
|
||||||
import type { RootState } from 'mastodon/store';
|
import type { RootState } from 'mastodon/store';
|
||||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||||
|
|
||||||
|
@ -56,53 +53,11 @@ const getAccountGallery = createSelector(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
interface Params {
|
|
||||||
acct?: string;
|
|
||||||
id?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const RemoteHint: React.FC<{
|
|
||||||
accountId: string;
|
|
||||||
}> = ({ accountId }) => {
|
|
||||||
const account = useAppSelector((state) => state.accounts.get(accountId));
|
|
||||||
const acct = account?.acct;
|
|
||||||
const url = account?.url;
|
|
||||||
const domain = acct ? acct.split('@')[1] : undefined;
|
|
||||||
|
|
||||||
if (!url) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TimelineHint
|
|
||||||
url={url}
|
|
||||||
message={
|
|
||||||
<FormattedMessage
|
|
||||||
id='hints.profiles.posts_may_be_missing'
|
|
||||||
defaultMessage='Some posts from this profile may be missing.'
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
label={
|
|
||||||
<FormattedMessage
|
|
||||||
id='hints.profiles.see_more_posts'
|
|
||||||
defaultMessage='See more posts on {domain}'
|
|
||||||
values={{ domain: <strong>{domain}</strong> }}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const AccountGallery: React.FC<{
|
export const AccountGallery: React.FC<{
|
||||||
multiColumn: boolean;
|
multiColumn: boolean;
|
||||||
}> = ({ multiColumn }) => {
|
}> = ({ multiColumn }) => {
|
||||||
const { acct, id } = useParams<Params>();
|
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const accountId = useAppSelector(
|
const accountId = useAccountId();
|
||||||
(state) =>
|
|
||||||
id ??
|
|
||||||
(state.accounts_map.get(normalizeForLookup(acct)) as string | undefined),
|
|
||||||
);
|
|
||||||
const attachments = useAppSelector((state) =>
|
const attachments = useAppSelector((state) =>
|
||||||
accountId
|
accountId
|
||||||
? getAccountGallery(state, accountId)
|
? getAccountGallery(state, accountId)
|
||||||
|
@ -123,33 +78,15 @@ export const AccountGallery: React.FC<{
|
||||||
const account = useAppSelector((state) =>
|
const account = useAppSelector((state) =>
|
||||||
accountId ? state.accounts.get(accountId) : undefined,
|
accountId ? state.accounts.get(accountId) : undefined,
|
||||||
);
|
);
|
||||||
const blockedBy = useAppSelector(
|
|
||||||
(state) =>
|
|
||||||
state.relationships.getIn([accountId, 'blocked_by'], false) as boolean,
|
|
||||||
);
|
|
||||||
const suspended = useAppSelector(
|
|
||||||
(state) => state.accounts.getIn([accountId, 'suspended'], false) as boolean,
|
|
||||||
);
|
|
||||||
const isAccount = !!account;
|
const isAccount = !!account;
|
||||||
const remote = account?.acct !== account?.username;
|
|
||||||
const hidden = useAppSelector((state) =>
|
const { suspended, blockedBy, hidden } = useAccountVisibility(accountId);
|
||||||
accountId ? getAccountHidden(state, accountId) : false,
|
|
||||||
);
|
|
||||||
const maxId = attachments.last()?.getIn(['status', 'id']) as
|
const maxId = attachments.last()?.getIn(['status', 'id']) as
|
||||||
| string
|
| string
|
||||||
| undefined;
|
| undefined;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!accountId) {
|
|
||||||
dispatch(lookupAccount(acct));
|
|
||||||
}
|
|
||||||
}, [dispatch, accountId, acct]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (accountId && !isAccount) {
|
|
||||||
dispatch(fetchAccount(accountId));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (accountId && isAccount) {
|
if (accountId && isAccount) {
|
||||||
void dispatch(expandAccountMediaTimeline(accountId));
|
void dispatch(expandAccountMediaTimeline(accountId));
|
||||||
}
|
}
|
||||||
|
@ -233,7 +170,7 @@ export const AccountGallery: React.FC<{
|
||||||
defaultMessage='Profile unavailable'
|
defaultMessage='Profile unavailable'
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
} else if (remote && attachments.isEmpty()) {
|
} else if (attachments.isEmpty()) {
|
||||||
emptyMessage = <RemoteHint accountId={accountId} />;
|
emptyMessage = <RemoteHint accountId={accountId} />;
|
||||||
} else {
|
} else {
|
||||||
emptyMessage = (
|
emptyMessage = (
|
||||||
|
@ -259,7 +196,7 @@ export const AccountGallery: React.FC<{
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
alwaysPrepend
|
alwaysPrepend
|
||||||
append={remote && accountId && <RemoteHint accountId={accountId} />}
|
append={accountId && <RemoteHint accountId={accountId} />}
|
||||||
scrollKey='account_gallery'
|
scrollKey='account_gallery'
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
hasMore={!forceEmptyState && hasMore}
|
hasMore={!forceEmptyState && hasMore}
|
||||||
|
|
|
@ -956,6 +956,9 @@ export const AccountHeader: React.FC<{
|
||||||
|
|
||||||
{!(hideTabs || hidden) && (
|
{!(hideTabs || hidden) && (
|
||||||
<div className='account__section-headline'>
|
<div className='account__section-headline'>
|
||||||
|
<NavLink exact to={`/@${account.acct}/featured`}>
|
||||||
|
<FormattedMessage id='account.featured' defaultMessage='Featured' />
|
||||||
|
</NavLink>
|
||||||
<NavLink exact to={`/@${account.acct}`}>
|
<NavLink exact to={`/@${account.acct}`}>
|
||||||
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
<FormattedMessage id='account.posts' defaultMessage='Posts' />
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
|
|
@ -7,12 +7,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
import { TimelineHint } from 'mastodon/components/timeline_hint';
|
|
||||||
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
|
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
|
||||||
import { me } from 'mastodon/initial_state';
|
import { me } from 'mastodon/initial_state';
|
||||||
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
|
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
|
||||||
import { getAccountHidden } from 'mastodon/selectors/accounts';
|
import { getAccountHidden } from 'mastodon/selectors/accounts';
|
||||||
import { useAppSelector } from 'mastodon/store';
|
|
||||||
|
|
||||||
import { lookupAccount, fetchAccount } from '../../actions/accounts';
|
import { lookupAccount, fetchAccount } from '../../actions/accounts';
|
||||||
import { fetchFeaturedTags } from '../../actions/featured_tags';
|
import { fetchFeaturedTags } from '../../actions/featured_tags';
|
||||||
|
@ -21,6 +19,7 @@ import { ColumnBackButton } from '../../components/column_back_button';
|
||||||
import { LoadingIndicator } from '../../components/loading_indicator';
|
import { LoadingIndicator } from '../../components/loading_indicator';
|
||||||
import StatusList from '../../components/status_list';
|
import StatusList from '../../components/status_list';
|
||||||
import Column from '../ui/components/column';
|
import Column from '../ui/components/column';
|
||||||
|
import { RemoteHint } from 'mastodon/components/remote_hint';
|
||||||
|
|
||||||
import { AccountHeader } from './components/account_header';
|
import { AccountHeader } from './components/account_header';
|
||||||
import { LimitedAccountHint } from './components/limited_account_hint';
|
import { LimitedAccountHint } from './components/limited_account_hint';
|
||||||
|
@ -47,11 +46,8 @@ const mapStateToProps = (state, { params: { acct, id, tagged }, withReplies = fa
|
||||||
|
|
||||||
return {
|
return {
|
||||||
accountId,
|
accountId,
|
||||||
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
|
||||||
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
|
||||||
isAccount: !!state.getIn(['accounts', accountId]),
|
isAccount: !!state.getIn(['accounts', accountId]),
|
||||||
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
|
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
|
||||||
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, 'items'], emptyList),
|
|
||||||
isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
|
isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
|
||||||
hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
|
hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
|
||||||
suspended: state.getIn(['accounts', accountId, 'suspended'], false),
|
suspended: state.getIn(['accounts', accountId, 'suspended'], false),
|
||||||
|
@ -60,24 +56,6 @@ const mapStateToProps = (state, { params: { acct, id, tagged }, withReplies = fa
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const RemoteHint = ({ accountId, url }) => {
|
|
||||||
const acct = useAppSelector(state => state.accounts.get(accountId)?.acct);
|
|
||||||
const domain = acct ? acct.split('@')[1] : undefined;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TimelineHint
|
|
||||||
url={url}
|
|
||||||
message={<FormattedMessage id='hints.profiles.posts_may_be_missing' defaultMessage='Some posts from this profile may be missing.' />}
|
|
||||||
label={<FormattedMessage id='hints.profiles.see_more_posts' defaultMessage='See more posts on {domain}' values={{ domain: <strong>{domain}</strong> }} />}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
RemoteHint.propTypes = {
|
|
||||||
url: PropTypes.string.isRequired,
|
|
||||||
accountId: PropTypes.string.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
class AccountTimeline extends ImmutablePureComponent {
|
class AccountTimeline extends ImmutablePureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
@ -89,7 +67,6 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
accountId: PropTypes.string,
|
accountId: PropTypes.string,
|
||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
statusIds: ImmutablePropTypes.list,
|
statusIds: ImmutablePropTypes.list,
|
||||||
featuredStatusIds: ImmutablePropTypes.list,
|
|
||||||
isLoading: PropTypes.bool,
|
isLoading: PropTypes.bool,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
withReplies: PropTypes.bool,
|
withReplies: PropTypes.bool,
|
||||||
|
@ -97,8 +74,6 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
isAccount: PropTypes.bool,
|
isAccount: PropTypes.bool,
|
||||||
suspended: PropTypes.bool,
|
suspended: PropTypes.bool,
|
||||||
hidden: PropTypes.bool,
|
hidden: PropTypes.bool,
|
||||||
remote: PropTypes.bool,
|
|
||||||
remoteUrl: PropTypes.string,
|
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -161,7 +136,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props;
|
const { accountId, statusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props;
|
||||||
|
|
||||||
if (isLoading && statusIds.isEmpty()) {
|
if (isLoading && statusIds.isEmpty()) {
|
||||||
return (
|
return (
|
||||||
|
@ -191,8 +166,6 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No posts found' />;
|
emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No posts found' />;
|
||||||
}
|
}
|
||||||
|
|
||||||
const remoteMessage = remote ? <RemoteHint accountId={accountId} url={remoteUrl} /> : null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Column>
|
<Column>
|
||||||
<ColumnBackButton />
|
<ColumnBackButton />
|
||||||
|
@ -200,10 +173,9 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||||
<StatusList
|
<StatusList
|
||||||
prepend={<AccountHeader accountId={this.props.accountId} hideTabs={forceEmptyState} tagged={this.props.params.tagged} />}
|
prepend={<AccountHeader accountId={this.props.accountId} hideTabs={forceEmptyState} tagged={this.props.params.tagged} />}
|
||||||
alwaysPrepend
|
alwaysPrepend
|
||||||
append={remoteMessage}
|
append={<RemoteHint accountId={accountId} />}
|
||||||
scrollKey='account_timeline'
|
scrollKey='account_timeline'
|
||||||
statusIds={forceEmptyState ? emptyList : statusIds}
|
statusIds={forceEmptyState ? emptyList : statusIds}
|
||||||
featuredStatusIds={featuredStatusIds}
|
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
hasMore={!forceEmptyState && hasMore}
|
hasMore={!forceEmptyState && hasMore}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
|
|
|
@ -105,11 +105,10 @@ export const NotificationRequest = ({ id, accountId, notificationsCount, checked
|
||||||
|
|
||||||
<div className='notification-request__actions'>
|
<div className='notification-request__actions'>
|
||||||
<IconButton iconComponent={DeleteIcon} onClick={handleDismiss} title={intl.formatMessage(messages.dismiss)} />
|
<IconButton iconComponent={DeleteIcon} onClick={handleDismiss} title={intl.formatMessage(messages.dismiss)} />
|
||||||
<DropdownMenuContainer
|
<Dropdown
|
||||||
items={menu}
|
items={menu}
|
||||||
icons='ellipsis-h'
|
icon='ellipsis-h'
|
||||||
iconComponent={MoreHorizIcon}
|
iconComponent={MoreHorizIcon}
|
||||||
direction='right'
|
|
||||||
title={intl.formatMessage(messages.more)}
|
title={intl.formatMessage(messages.more)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -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 BundleColumnError from './components/bundle_column_error';
|
||||||
import Header from './components/header';
|
import Header from './components/header';
|
||||||
import { UploadArea } from './components/upload_area';
|
import { UploadArea } from './components/upload_area';
|
||||||
|
import { HashtagMenuController } from './components/hashtag_menu_controller';
|
||||||
import ColumnsAreaContainer from './containers/columns_area_container';
|
import ColumnsAreaContainer from './containers/columns_area_container';
|
||||||
import LoadingBarContainer from './containers/loading_bar_container';
|
import LoadingBarContainer from './containers/loading_bar_container';
|
||||||
import ModalContainer from './containers/modal_container';
|
import ModalContainer from './containers/modal_container';
|
||||||
|
@ -73,6 +74,7 @@ import {
|
||||||
About,
|
About,
|
||||||
PrivacyPolicy,
|
PrivacyPolicy,
|
||||||
TermsOfService,
|
TermsOfService,
|
||||||
|
AccountFeatured,
|
||||||
} from './util/async-components';
|
} from './util/async-components';
|
||||||
import { ColumnsContextProvider } from './util/columns_context';
|
import { ColumnsContextProvider } from './util/columns_context';
|
||||||
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
|
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
|
||||||
|
@ -236,6 +238,7 @@ class SwitchingColumnsArea extends PureComponent {
|
||||||
<WrappedRoute path={['/publish', '/statuses/new']} component={Compose} content={children} />
|
<WrappedRoute path={['/publish', '/statuses/new']} component={Compose} content={children} />
|
||||||
|
|
||||||
<WrappedRoute path={['/@:acct', '/accounts/:id']} exact component={AccountTimeline} content={children} />
|
<WrappedRoute path={['/@:acct', '/accounts/:id']} exact component={AccountTimeline} content={children} />
|
||||||
|
<WrappedRoute path={['/@:acct/featured', '/accounts/:id/featured']} component={AccountFeatured} content={children} />
|
||||||
<WrappedRoute path='/@:acct/tagged/:tagged?' exact component={AccountTimeline} content={children} />
|
<WrappedRoute path='/@:acct/tagged/:tagged?' exact component={AccountTimeline} content={children} />
|
||||||
<WrappedRoute path={['/@:acct/with_replies', '/accounts/:id/with_replies']} component={AccountTimeline} content={children} componentParams={{ withReplies: true }} />
|
<WrappedRoute path={['/@:acct/with_replies', '/accounts/:id/with_replies']} component={AccountTimeline} content={children} componentParams={{ withReplies: true }} />
|
||||||
<WrappedRoute path={['/accounts/:id/followers', '/users/:acct/followers', '/@:acct/followers']} component={Followers} content={children} />
|
<WrappedRoute path={['/accounts/:id/followers', '/users/:acct/followers', '/@:acct/followers']} component={Followers} content={children} />
|
||||||
|
@ -609,6 +612,7 @@ class UI extends PureComponent {
|
||||||
{layout !== 'mobile' && <PictureInPicture />}
|
{layout !== 'mobile' && <PictureInPicture />}
|
||||||
<AlertsController />
|
<AlertsController />
|
||||||
{!disableHoverCards && <HoverCardController />}
|
{!disableHoverCards && <HoverCardController />}
|
||||||
|
<HashtagMenuController />
|
||||||
<LoadingBarContainer className='loading-bar' />
|
<LoadingBarContainer className='loading-bar' />
|
||||||
<ModalContainer />
|
<ModalContainer />
|
||||||
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
<UploadArea active={draggingOver} onClose={this.closeUploadModal} />
|
||||||
|
|
|
@ -66,6 +66,10 @@ export function AccountGallery () {
|
||||||
return import(/* webpackChunkName: "features/account_gallery" */'../../account_gallery');
|
return import(/* webpackChunkName: "features/account_gallery" */'../../account_gallery');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function AccountFeatured() {
|
||||||
|
return import(/* webpackChunkName: "features/account_featured" */'../../account_featured');
|
||||||
|
}
|
||||||
|
|
||||||
export function Followers () {
|
export function Followers () {
|
||||||
return import(/* webpackChunkName: "features/followers" */'../../followers');
|
return import(/* webpackChunkName: "features/followers" */'../../followers');
|
||||||
}
|
}
|
||||||
|
|
37
app/javascript/mastodon/hooks/useAccountId.ts
Normal file
37
app/javascript/mastodon/hooks/useAccountId.ts
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
|
import { useParams } from 'react-router';
|
||||||
|
|
||||||
|
import { fetchAccount, lookupAccount } from 'mastodon/actions/accounts';
|
||||||
|
import { normalizeForLookup } from 'mastodon/reducers/accounts_map';
|
||||||
|
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
|
interface Params {
|
||||||
|
acct?: string;
|
||||||
|
id?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useAccountId() {
|
||||||
|
const { acct, id } = useParams<Params>();
|
||||||
|
const accountId = useAppSelector(
|
||||||
|
(state) =>
|
||||||
|
id ??
|
||||||
|
(state.accounts_map.get(normalizeForLookup(acct)) as string | undefined),
|
||||||
|
);
|
||||||
|
|
||||||
|
const account = useAppSelector((state) =>
|
||||||
|
accountId ? state.accounts.get(accountId) : undefined,
|
||||||
|
);
|
||||||
|
const isAccount = !!account;
|
||||||
|
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
useEffect(() => {
|
||||||
|
if (!accountId) {
|
||||||
|
dispatch(lookupAccount(acct));
|
||||||
|
} else if (!isAccount) {
|
||||||
|
dispatch(fetchAccount(accountId));
|
||||||
|
}
|
||||||
|
}, [dispatch, accountId, acct, isAccount]);
|
||||||
|
|
||||||
|
return accountId;
|
||||||
|
}
|
20
app/javascript/mastodon/hooks/useAccountVisibility.ts
Normal file
20
app/javascript/mastodon/hooks/useAccountVisibility.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { getAccountHidden } from 'mastodon/selectors/accounts';
|
||||||
|
import { useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
|
export function useAccountVisibility(accountId?: string) {
|
||||||
|
const blockedBy = useAppSelector(
|
||||||
|
(state) => !!state.relationships.getIn([accountId, 'blocked_by'], false),
|
||||||
|
);
|
||||||
|
const suspended = useAppSelector(
|
||||||
|
(state) => !!state.accounts.getIn([accountId, 'suspended'], false),
|
||||||
|
);
|
||||||
|
const hidden = useAppSelector((state) =>
|
||||||
|
accountId ? Boolean(getAccountHidden(state, accountId)) : false,
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
blockedBy,
|
||||||
|
suspended,
|
||||||
|
hidden,
|
||||||
|
};
|
||||||
|
}
|
|
@ -25,7 +25,6 @@
|
||||||
"account.endorse": "Amostrar en perfil",
|
"account.endorse": "Amostrar en perfil",
|
||||||
"account.featured_tags.last_status_at": "Zaguera publicación lo {date}",
|
"account.featured_tags.last_status_at": "Zaguera publicación lo {date}",
|
||||||
"account.featured_tags.last_status_never": "Sin publicacions",
|
"account.featured_tags.last_status_never": "Sin publicacions",
|
||||||
"account.featured_tags.title": "Etiquetas destacadas de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
"account.followers.empty": "Encara no sigue dengún a este usuario.",
|
"account.followers.empty": "Encara no sigue dengún a este usuario.",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "أوصِ به على صفحتك الشخصية",
|
"account.endorse": "أوصِ به على صفحتك الشخصية",
|
||||||
"account.featured_tags.last_status_at": "آخر منشور في {date}",
|
"account.featured_tags.last_status_at": "آخر منشور في {date}",
|
||||||
"account.featured_tags.last_status_never": "لا توجد رسائل",
|
"account.featured_tags.last_status_never": "لا توجد رسائل",
|
||||||
"account.featured_tags.title": "وسوم {name} المميَّزة",
|
|
||||||
"account.follow": "متابعة",
|
"account.follow": "متابعة",
|
||||||
"account.follow_back": "تابعه بالمثل",
|
"account.follow_back": "تابعه بالمثل",
|
||||||
"account.followers": "مُتابِعون",
|
"account.followers": "مُتابِعون",
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
"account.enable_notifications": "Avisame cuando @{name} espublice artículos",
|
"account.enable_notifications": "Avisame cuando @{name} espublice artículos",
|
||||||
"account.endorse": "Destacar nel perfil",
|
"account.endorse": "Destacar nel perfil",
|
||||||
"account.featured_tags.last_status_never": "Nun hai nenguna publicación",
|
"account.featured_tags.last_status_never": "Nun hai nenguna publicación",
|
||||||
"account.featured_tags.title": "Etiquetes destacaes de: {name}",
|
|
||||||
"account.follow": "Siguir",
|
"account.follow": "Siguir",
|
||||||
"account.follow_back": "Siguir tamién",
|
"account.follow_back": "Siguir tamién",
|
||||||
"account.followers": "Siguidores",
|
"account.followers": "Siguidores",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Profildə seçilmişlərə əlavə et",
|
"account.endorse": "Profildə seçilmişlərə əlavə et",
|
||||||
"account.featured_tags.last_status_at": "Son paylaşım {date} tarixində olub",
|
"account.featured_tags.last_status_at": "Son paylaşım {date} tarixində olub",
|
||||||
"account.featured_tags.last_status_never": "Paylaşım yoxdur",
|
"account.featured_tags.last_status_never": "Paylaşım yoxdur",
|
||||||
"account.featured_tags.title": "{name} istifadəçisinin seçilmiş heşteqləri",
|
|
||||||
"account.follow": "İzlə",
|
"account.follow": "İzlə",
|
||||||
"account.follow_back": "Sən də izlə",
|
"account.follow_back": "Sən də izlə",
|
||||||
"account.followers": "İzləyicilər",
|
"account.followers": "İzləyicilər",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Паказваць у профілі",
|
"account.endorse": "Паказваць у профілі",
|
||||||
"account.featured_tags.last_status_at": "Апошні допіс ад {date}",
|
"account.featured_tags.last_status_at": "Апошні допіс ад {date}",
|
||||||
"account.featured_tags.last_status_never": "Няма допісаў",
|
"account.featured_tags.last_status_never": "Няма допісаў",
|
||||||
"account.featured_tags.title": "Тэгі, выбраныя {name}",
|
|
||||||
"account.follow": "Падпісацца",
|
"account.follow": "Падпісацца",
|
||||||
"account.follow_back": "Падпісацца ў адказ",
|
"account.follow_back": "Падпісацца ў адказ",
|
||||||
"account.followers": "Падпісчыкі",
|
"account.followers": "Падпісчыкі",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Представи в профила",
|
"account.endorse": "Представи в профила",
|
||||||
"account.featured_tags.last_status_at": "Последна публикация на {date}",
|
"account.featured_tags.last_status_at": "Последна публикация на {date}",
|
||||||
"account.featured_tags.last_status_never": "Няма публикации",
|
"account.featured_tags.last_status_never": "Няма публикации",
|
||||||
"account.featured_tags.title": "Главни хаштагове на {name}",
|
|
||||||
"account.follow": "Последване",
|
"account.follow": "Последване",
|
||||||
"account.follow_back": "Последване взаимно",
|
"account.follow_back": "Последване взаимно",
|
||||||
"account.followers": "Последователи",
|
"account.followers": "Последователи",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "প্রোফাইলে ফিচার করুন",
|
"account.endorse": "প্রোফাইলে ফিচার করুন",
|
||||||
"account.featured_tags.last_status_at": "{date} এ সর্বশেষ পোস্ট",
|
"account.featured_tags.last_status_at": "{date} এ সর্বশেষ পোস্ট",
|
||||||
"account.featured_tags.last_status_never": "কোনো পোস্ট নেই",
|
"account.featured_tags.last_status_never": "কোনো পোস্ট নেই",
|
||||||
"account.featured_tags.title": "{name} এর ফিচার করা Hashtag সমূহ",
|
|
||||||
"account.follow": "অনুসরণ",
|
"account.follow": "অনুসরণ",
|
||||||
"account.follow_back": "তাকে অনুসরণ করো",
|
"account.follow_back": "তাকে অনুসরণ করো",
|
||||||
"account.followers": "অনুসরণকারী",
|
"account.followers": "অনুসরণকারী",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Lakaat war-wel war ar profil",
|
"account.endorse": "Lakaat war-wel war ar profil",
|
||||||
"account.featured_tags.last_status_at": "Toud diwezhañ : {date}",
|
"account.featured_tags.last_status_at": "Toud diwezhañ : {date}",
|
||||||
"account.featured_tags.last_status_never": "Embannadur ebet",
|
"account.featured_tags.last_status_never": "Embannadur ebet",
|
||||||
"account.featured_tags.title": "Hashtagoù pennañ {name}",
|
|
||||||
"account.follow": "Heuliañ",
|
"account.follow": "Heuliañ",
|
||||||
"account.follow_back": "Heuliañ d'ho tro",
|
"account.follow_back": "Heuliañ d'ho tro",
|
||||||
"account.followers": "Tud koumanantet",
|
"account.followers": "Tud koumanantet",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Recomana en el perfil",
|
"account.endorse": "Recomana en el perfil",
|
||||||
"account.featured_tags.last_status_at": "Darrer tut el {date}",
|
"account.featured_tags.last_status_at": "Darrer tut el {date}",
|
||||||
"account.featured_tags.last_status_never": "No hi ha tuts",
|
"account.featured_tags.last_status_never": "No hi ha tuts",
|
||||||
"account.featured_tags.title": "etiquetes destacades de {name}",
|
|
||||||
"account.follow": "Segueix",
|
"account.follow": "Segueix",
|
||||||
"account.follow_back": "Segueix tu també",
|
"account.follow_back": "Segueix tu també",
|
||||||
"account.followers": "Seguidors",
|
"account.followers": "Seguidors",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "ناساندن لە پرۆفایل",
|
"account.endorse": "ناساندن لە پرۆفایل",
|
||||||
"account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
|
"account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
|
||||||
"account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
|
"account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
|
||||||
"account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
|
|
||||||
"account.follow": "بەدواداچوون",
|
"account.follow": "بەدواداچوون",
|
||||||
"account.follow_back": "فۆڵۆو بکەنەوە",
|
"account.follow_back": "فۆڵۆو بکەنەوە",
|
||||||
"account.followers": "شوێنکەوتووان",
|
"account.followers": "شوێنکەوتووان",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Zvýraznit na profilu",
|
"account.endorse": "Zvýraznit na profilu",
|
||||||
"account.featured_tags.last_status_at": "Poslední příspěvek {date}",
|
"account.featured_tags.last_status_at": "Poslední příspěvek {date}",
|
||||||
"account.featured_tags.last_status_never": "Žádné příspěvky",
|
"account.featured_tags.last_status_never": "Žádné příspěvky",
|
||||||
"account.featured_tags.title": "Hlavní hashtagy uživatele {name}",
|
|
||||||
"account.follow": "Sledovat",
|
"account.follow": "Sledovat",
|
||||||
"account.follow_back": "Také sledovat",
|
"account.follow_back": "Také sledovat",
|
||||||
"account.followers": "Sledující",
|
"account.followers": "Sledující",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Golygu proffil",
|
"account.edit_profile": "Golygu proffil",
|
||||||
"account.enable_notifications": "Rhowch wybod i fi pan fydd @{name} yn postio",
|
"account.enable_notifications": "Rhowch wybod i fi pan fydd @{name} yn postio",
|
||||||
"account.endorse": "Dangos ar fy mhroffil",
|
"account.endorse": "Dangos ar fy mhroffil",
|
||||||
|
"account.featured": "Dethol",
|
||||||
|
"account.featured.hashtags": "Hashnodau",
|
||||||
|
"account.featured.posts": "Postiadau",
|
||||||
"account.featured_tags.last_status_at": "Y postiad olaf ar {date}",
|
"account.featured_tags.last_status_at": "Y postiad olaf ar {date}",
|
||||||
"account.featured_tags.last_status_never": "Dim postiadau",
|
"account.featured_tags.last_status_never": "Dim postiadau",
|
||||||
"account.featured_tags.title": "Prif hashnodau {name}",
|
|
||||||
"account.follow": "Dilyn",
|
"account.follow": "Dilyn",
|
||||||
"account.follow_back": "Dilyn nôl",
|
"account.follow_back": "Dilyn nôl",
|
||||||
"account.followers": "Dilynwyr",
|
"account.followers": "Dilynwyr",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Canlyniadau chwilio",
|
"emoji_button.search_results": "Canlyniadau chwilio",
|
||||||
"emoji_button.symbols": "Symbolau",
|
"emoji_button.symbols": "Symbolau",
|
||||||
"emoji_button.travel": "Teithio a Llefydd",
|
"emoji_button.travel": "Teithio a Llefydd",
|
||||||
|
"empty_column.account_featured": "Mae'r rhestr hon yn wag",
|
||||||
"empty_column.account_hides_collections": "Mae'r defnyddiwr wedi dewis i beidio rhannu'r wybodaeth yma",
|
"empty_column.account_hides_collections": "Mae'r defnyddiwr wedi dewis i beidio rhannu'r wybodaeth yma",
|
||||||
"empty_column.account_suspended": "Cyfrif wedi'i atal",
|
"empty_column.account_suspended": "Cyfrif wedi'i atal",
|
||||||
"empty_column.account_timeline": "Dim postiadau yma!",
|
"empty_column.account_timeline": "Dim postiadau yma!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Redigér profil",
|
"account.edit_profile": "Redigér profil",
|
||||||
"account.enable_notifications": "Advisér mig, når @{name} poster",
|
"account.enable_notifications": "Advisér mig, når @{name} poster",
|
||||||
"account.endorse": "Fremhæv på profil",
|
"account.endorse": "Fremhæv på profil",
|
||||||
|
"account.featured": "Fremhævet",
|
||||||
|
"account.featured.hashtags": "Hashtags",
|
||||||
|
"account.featured.posts": "Indlæg",
|
||||||
"account.featured_tags.last_status_at": "Seneste indlæg {date}",
|
"account.featured_tags.last_status_at": "Seneste indlæg {date}",
|
||||||
"account.featured_tags.last_status_never": "Ingen indlæg",
|
"account.featured_tags.last_status_never": "Ingen indlæg",
|
||||||
"account.featured_tags.title": "{name}s fremhævede etiketter",
|
|
||||||
"account.follow": "Følg",
|
"account.follow": "Følg",
|
||||||
"account.follow_back": "Følg tilbage",
|
"account.follow_back": "Følg tilbage",
|
||||||
"account.followers": "Følgere",
|
"account.followers": "Følgere",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Søgeresultater",
|
"emoji_button.search_results": "Søgeresultater",
|
||||||
"emoji_button.symbols": "Symboler",
|
"emoji_button.symbols": "Symboler",
|
||||||
"emoji_button.travel": "Rejser og steder",
|
"emoji_button.travel": "Rejser og steder",
|
||||||
|
"empty_column.account_featured": "Denne liste er tom",
|
||||||
"empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig",
|
"empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig",
|
||||||
"empty_column.account_suspended": "Konto suspenderet",
|
"empty_column.account_suspended": "Konto suspenderet",
|
||||||
"empty_column.account_timeline": "Ingen indlæg her!",
|
"empty_column.account_timeline": "Ingen indlæg her!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Profil bearbeiten",
|
"account.edit_profile": "Profil bearbeiten",
|
||||||
"account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet",
|
"account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet",
|
||||||
"account.endorse": "Im Profil empfehlen",
|
"account.endorse": "Im Profil empfehlen",
|
||||||
|
"account.featured": "Empfohlen",
|
||||||
|
"account.featured.hashtags": "Hashtags",
|
||||||
|
"account.featured.posts": "Beiträge",
|
||||||
"account.featured_tags.last_status_at": "Letzter Beitrag am {date}",
|
"account.featured_tags.last_status_at": "Letzter Beitrag am {date}",
|
||||||
"account.featured_tags.last_status_never": "Keine Beiträge",
|
"account.featured_tags.last_status_never": "Keine Beiträge",
|
||||||
"account.featured_tags.title": "Von {name} vorgestellte Hashtags",
|
|
||||||
"account.follow": "Folgen",
|
"account.follow": "Folgen",
|
||||||
"account.follow_back": "Ebenfalls folgen",
|
"account.follow_back": "Ebenfalls folgen",
|
||||||
"account.followers": "Follower",
|
"account.followers": "Follower",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Suchergebnisse",
|
"emoji_button.search_results": "Suchergebnisse",
|
||||||
"emoji_button.symbols": "Symbole",
|
"emoji_button.symbols": "Symbole",
|
||||||
"emoji_button.travel": "Reisen & Orte",
|
"emoji_button.travel": "Reisen & Orte",
|
||||||
|
"empty_column.account_featured": "Diese Liste ist leer",
|
||||||
"empty_column.account_hides_collections": "Das Konto hat sich dazu entschieden, diese Information nicht zu veröffentlichen",
|
"empty_column.account_hides_collections": "Das Konto hat sich dazu entschieden, diese Information nicht zu veröffentlichen",
|
||||||
"empty_column.account_suspended": "Konto gesperrt",
|
"empty_column.account_suspended": "Konto gesperrt",
|
||||||
"empty_column.account_timeline": "Keine Beiträge vorhanden!",
|
"empty_column.account_timeline": "Keine Beiträge vorhanden!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Προβολή στο προφίλ",
|
"account.endorse": "Προβολή στο προφίλ",
|
||||||
"account.featured_tags.last_status_at": "Τελευταία ανάρτηση στις {date}",
|
"account.featured_tags.last_status_at": "Τελευταία ανάρτηση στις {date}",
|
||||||
"account.featured_tags.last_status_never": "Καμία ανάρτηση",
|
"account.featured_tags.last_status_never": "Καμία ανάρτηση",
|
||||||
"account.featured_tags.title": "προβεβλημένες ετικέτες του/της {name}",
|
|
||||||
"account.follow": "Ακολούθησε",
|
"account.follow": "Ακολούθησε",
|
||||||
"account.follow_back": "Ακολούθησε και εσύ",
|
"account.follow_back": "Ακολούθησε και εσύ",
|
||||||
"account.followers": "Ακόλουθοι",
|
"account.followers": "Ακόλουθοι",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Feature on profile",
|
"account.endorse": "Feature on profile",
|
||||||
"account.featured_tags.last_status_at": "Last post on {date}",
|
"account.featured_tags.last_status_at": "Last post on {date}",
|
||||||
"account.featured_tags.last_status_never": "No posts",
|
"account.featured_tags.last_status_never": "No posts",
|
||||||
"account.featured_tags.title": "{name}'s featured hashtags",
|
|
||||||
"account.follow": "Follow",
|
"account.follow": "Follow",
|
||||||
"account.follow_back": "Follow back",
|
"account.follow_back": "Follow back",
|
||||||
"account.followers": "Followers",
|
"account.followers": "Followers",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Edit profile",
|
"account.edit_profile": "Edit profile",
|
||||||
"account.enable_notifications": "Notify me when @{name} posts",
|
"account.enable_notifications": "Notify me when @{name} posts",
|
||||||
"account.endorse": "Feature on profile",
|
"account.endorse": "Feature on profile",
|
||||||
|
"account.featured": "Featured",
|
||||||
|
"account.featured.hashtags": "Hashtags",
|
||||||
|
"account.featured.posts": "Posts",
|
||||||
"account.featured_tags.last_status_at": "Last post on {date}",
|
"account.featured_tags.last_status_at": "Last post on {date}",
|
||||||
"account.featured_tags.last_status_never": "No posts",
|
"account.featured_tags.last_status_never": "No posts",
|
||||||
"account.featured_tags.title": "{name}'s featured hashtags",
|
|
||||||
"account.follow": "Follow",
|
"account.follow": "Follow",
|
||||||
"account.follow_back": "Follow back",
|
"account.follow_back": "Follow back",
|
||||||
"account.followers": "Followers",
|
"account.followers": "Followers",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Search results",
|
"emoji_button.search_results": "Search results",
|
||||||
"emoji_button.symbols": "Symbols",
|
"emoji_button.symbols": "Symbols",
|
||||||
"emoji_button.travel": "Travel & Places",
|
"emoji_button.travel": "Travel & Places",
|
||||||
|
"empty_column.account_featured": "This list is empty",
|
||||||
"empty_column.account_hides_collections": "This user has chosen to not make this information available",
|
"empty_column.account_hides_collections": "This user has chosen to not make this information available",
|
||||||
"empty_column.account_suspended": "Account suspended",
|
"empty_column.account_suspended": "Account suspended",
|
||||||
"empty_column.account_timeline": "No posts here!",
|
"empty_column.account_timeline": "No posts here!",
|
||||||
|
@ -378,6 +381,8 @@
|
||||||
"generic.saved": "Saved",
|
"generic.saved": "Saved",
|
||||||
"getting_started.heading": "Getting started",
|
"getting_started.heading": "Getting started",
|
||||||
"hashtag.admin_moderation": "Open moderation interface for #{name}",
|
"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.all": "and {additional}",
|
||||||
"hashtag.column_header.tag_mode.any": "or {additional}",
|
"hashtag.column_header.tag_mode.any": "or {additional}",
|
||||||
"hashtag.column_header.tag_mode.none": "without {additional}",
|
"hashtag.column_header.tag_mode.none": "without {additional}",
|
||||||
|
@ -391,6 +396,7 @@
|
||||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} posts}}",
|
"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.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} posts}} today",
|
||||||
"hashtag.follow": "Follow hashtag",
|
"hashtag.follow": "Follow hashtag",
|
||||||
|
"hashtag.mute": "Mute #{hashtag}",
|
||||||
"hashtag.unfollow": "Unfollow hashtag",
|
"hashtag.unfollow": "Unfollow hashtag",
|
||||||
"hashtags.and_other": "…and {count, plural, other {# more}}",
|
"hashtags.and_other": "…and {count, plural, other {# more}}",
|
||||||
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
|
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
|
||||||
|
|
|
@ -27,9 +27,10 @@
|
||||||
"account.edit_profile": "Redakti la profilon",
|
"account.edit_profile": "Redakti la profilon",
|
||||||
"account.enable_notifications": "Sciigu min kiam @{name} afiŝos",
|
"account.enable_notifications": "Sciigu min kiam @{name} afiŝos",
|
||||||
"account.endorse": "Prezenti ĉe via profilo",
|
"account.endorse": "Prezenti ĉe via profilo",
|
||||||
|
"account.featured.hashtags": "Kradvortoj",
|
||||||
|
"account.featured.posts": "Afiŝoj",
|
||||||
"account.featured_tags.last_status_at": "Lasta afîŝo je {date}",
|
"account.featured_tags.last_status_at": "Lasta afîŝo je {date}",
|
||||||
"account.featured_tags.last_status_never": "Neniu afiŝo",
|
"account.featured_tags.last_status_never": "Neniu afiŝo",
|
||||||
"account.featured_tags.title": "Rekomendataj kradvortoj de {name}",
|
|
||||||
"account.follow": "Sekvi",
|
"account.follow": "Sekvi",
|
||||||
"account.follow_back": "Sekvu reen",
|
"account.follow_back": "Sekvu reen",
|
||||||
"account.followers": "Sekvantoj",
|
"account.followers": "Sekvantoj",
|
||||||
|
@ -294,6 +295,7 @@
|
||||||
"emoji_button.search_results": "Serĉaj rezultoj",
|
"emoji_button.search_results": "Serĉaj rezultoj",
|
||||||
"emoji_button.symbols": "Simboloj",
|
"emoji_button.symbols": "Simboloj",
|
||||||
"emoji_button.travel": "Vojaĝoj kaj lokoj",
|
"emoji_button.travel": "Vojaĝoj kaj lokoj",
|
||||||
|
"empty_column.account_featured": "Ĉi tiu listo estas malplena",
|
||||||
"empty_column.account_hides_collections": "Ĉi tiu uzanto elektis ne disponebligi ĉi tiu informon",
|
"empty_column.account_hides_collections": "Ĉi tiu uzanto elektis ne disponebligi ĉi tiu informon",
|
||||||
"empty_column.account_suspended": "Konto suspendita",
|
"empty_column.account_suspended": "Konto suspendita",
|
||||||
"empty_column.account_timeline": "Neniuj afiŝoj ĉi tie!",
|
"empty_column.account_timeline": "Neniuj afiŝoj ĉi tie!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Editar perfil",
|
"account.edit_profile": "Editar perfil",
|
||||||
"account.enable_notifications": "Notificarme cuando @{name} envíe mensajes",
|
"account.enable_notifications": "Notificarme cuando @{name} envíe mensajes",
|
||||||
"account.endorse": "Destacar en el perfil",
|
"account.endorse": "Destacar en el perfil",
|
||||||
|
"account.featured": "Destacados",
|
||||||
|
"account.featured.hashtags": "Etiquetas",
|
||||||
|
"account.featured.posts": "Mensajes",
|
||||||
"account.featured_tags.last_status_at": "Último mensaje: {date}",
|
"account.featured_tags.last_status_at": "Último mensaje: {date}",
|
||||||
"account.featured_tags.last_status_never": "Sin mensajes",
|
"account.featured_tags.last_status_never": "Sin mensajes",
|
||||||
"account.featured_tags.title": "Etiquetas destacadas de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir",
|
"account.follow_back": "Seguir",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Resultados de búsqueda",
|
"emoji_button.search_results": "Resultados de búsqueda",
|
||||||
"emoji_button.symbols": "Símbolos",
|
"emoji_button.symbols": "Símbolos",
|
||||||
"emoji_button.travel": "Viajes y lugares",
|
"emoji_button.travel": "Viajes y lugares",
|
||||||
|
"empty_column.account_featured": "Esta lista está vacía",
|
||||||
"empty_column.account_hides_collections": "Este usuario eligió no publicar esta información",
|
"empty_column.account_hides_collections": "Este usuario eligió no publicar esta información",
|
||||||
"empty_column.account_suspended": "Cuenta suspendida",
|
"empty_column.account_suspended": "Cuenta suspendida",
|
||||||
"empty_column.account_timeline": "¡No hay mensajes acá!",
|
"empty_column.account_timeline": "¡No hay mensajes acá!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Editar perfil",
|
"account.edit_profile": "Editar perfil",
|
||||||
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
|
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
|
||||||
"account.endorse": "Destacar en mi perfil",
|
"account.endorse": "Destacar en mi perfil",
|
||||||
|
"account.featured": "Destacado",
|
||||||
|
"account.featured.hashtags": "Etiquetas",
|
||||||
|
"account.featured.posts": "Publicaciones",
|
||||||
"account.featured_tags.last_status_at": "Última publicación el {date}",
|
"account.featured_tags.last_status_at": "Última publicación el {date}",
|
||||||
"account.featured_tags.last_status_never": "Sin publicaciones",
|
"account.featured_tags.last_status_never": "Sin publicaciones",
|
||||||
"account.featured_tags.title": "Etiquetas destacadas de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir también",
|
"account.follow_back": "Seguir también",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Resultados de búsqueda",
|
"emoji_button.search_results": "Resultados de búsqueda",
|
||||||
"emoji_button.symbols": "Símbolos",
|
"emoji_button.symbols": "Símbolos",
|
||||||
"emoji_button.travel": "Viajes y lugares",
|
"emoji_button.travel": "Viajes y lugares",
|
||||||
|
"empty_column.account_featured": "Esta lista está vacía",
|
||||||
"empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información",
|
"empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información",
|
||||||
"empty_column.account_suspended": "Cuenta suspendida",
|
"empty_column.account_suspended": "Cuenta suspendida",
|
||||||
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
|
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Editar perfil",
|
"account.edit_profile": "Editar perfil",
|
||||||
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
|
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
|
||||||
"account.endorse": "Destacar en el perfil",
|
"account.endorse": "Destacar en el perfil",
|
||||||
|
"account.featured": "Destacado",
|
||||||
|
"account.featured.hashtags": "Etiquetas",
|
||||||
|
"account.featured.posts": "Publicaciones",
|
||||||
"account.featured_tags.last_status_at": "Última publicación el {date}",
|
"account.featured_tags.last_status_at": "Última publicación el {date}",
|
||||||
"account.featured_tags.last_status_never": "Sin publicaciones",
|
"account.featured_tags.last_status_never": "Sin publicaciones",
|
||||||
"account.featured_tags.title": "Etiquetas destacadas de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir también",
|
"account.follow_back": "Seguir también",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Resultados de búsqueda",
|
"emoji_button.search_results": "Resultados de búsqueda",
|
||||||
"emoji_button.symbols": "Símbolos",
|
"emoji_button.symbols": "Símbolos",
|
||||||
"emoji_button.travel": "Viajes y lugares",
|
"emoji_button.travel": "Viajes y lugares",
|
||||||
|
"empty_column.account_featured": "Esta lista está vacía",
|
||||||
"empty_column.account_hides_collections": "Este usuario ha decidido no mostrar esta información",
|
"empty_column.account_hides_collections": "Este usuario ha decidido no mostrar esta información",
|
||||||
"empty_column.account_suspended": "Cuenta suspendida",
|
"empty_column.account_suspended": "Cuenta suspendida",
|
||||||
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
|
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Too profiilil esile",
|
"account.endorse": "Too profiilil esile",
|
||||||
"account.featured_tags.last_status_at": "Viimane postitus {date}",
|
"account.featured_tags.last_status_at": "Viimane postitus {date}",
|
||||||
"account.featured_tags.last_status_never": "Postitusi pole",
|
"account.featured_tags.last_status_never": "Postitusi pole",
|
||||||
"account.featured_tags.title": "{name} esiletõstetud sildid",
|
|
||||||
"account.follow": "Jälgi",
|
"account.follow": "Jälgi",
|
||||||
"account.follow_back": "Jälgi vastu",
|
"account.follow_back": "Jälgi vastu",
|
||||||
"account.followers": "Jälgijad",
|
"account.followers": "Jälgijad",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Nabarmendu profilean",
|
"account.endorse": "Nabarmendu profilean",
|
||||||
"account.featured_tags.last_status_at": "Azken bidalketa {date} datan",
|
"account.featured_tags.last_status_at": "Azken bidalketa {date} datan",
|
||||||
"account.featured_tags.last_status_never": "Bidalketarik ez",
|
"account.featured_tags.last_status_never": "Bidalketarik ez",
|
||||||
"account.featured_tags.title": "{name} erabiltzailearen nabarmendutako traolak",
|
|
||||||
"account.follow": "Jarraitu",
|
"account.follow": "Jarraitu",
|
||||||
"account.follow_back": "Jarraitu bueltan",
|
"account.follow_back": "Jarraitu bueltan",
|
||||||
"account.followers": "Jarraitzaileak",
|
"account.followers": "Jarraitzaileak",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "معرّفی در نمایه",
|
"account.endorse": "معرّفی در نمایه",
|
||||||
"account.featured_tags.last_status_at": "آخرین فرسته در {date}",
|
"account.featured_tags.last_status_at": "آخرین فرسته در {date}",
|
||||||
"account.featured_tags.last_status_never": "بدون فرسته",
|
"account.featured_tags.last_status_never": "بدون فرسته",
|
||||||
"account.featured_tags.title": "برچسبهای برگزیدهٔ {name}",
|
|
||||||
"account.follow": "پیگرفتن",
|
"account.follow": "پیگرفتن",
|
||||||
"account.follow_back": "دنبال کردن متقابل",
|
"account.follow_back": "دنبال کردن متقابل",
|
||||||
"account.followers": "پیگیرندگان",
|
"account.followers": "پیگیرندگان",
|
||||||
|
|
|
@ -27,9 +27,10 @@
|
||||||
"account.edit_profile": "Muokkaa profiilia",
|
"account.edit_profile": "Muokkaa profiilia",
|
||||||
"account.enable_notifications": "Ilmoita minulle, kun @{name} julkaisee",
|
"account.enable_notifications": "Ilmoita minulle, kun @{name} julkaisee",
|
||||||
"account.endorse": "Suosittele profiilissasi",
|
"account.endorse": "Suosittele profiilissasi",
|
||||||
|
"account.featured.hashtags": "Aihetunnisteet",
|
||||||
|
"account.featured.posts": "Julkaisut",
|
||||||
"account.featured_tags.last_status_at": "Viimeisin julkaisu {date}",
|
"account.featured_tags.last_status_at": "Viimeisin julkaisu {date}",
|
||||||
"account.featured_tags.last_status_never": "Ei julkaisuja",
|
"account.featured_tags.last_status_never": "Ei julkaisuja",
|
||||||
"account.featured_tags.title": "Käyttäjän {name} suosittelemat aihetunnisteet",
|
|
||||||
"account.follow": "Seuraa",
|
"account.follow": "Seuraa",
|
||||||
"account.follow_back": "Seuraa takaisin",
|
"account.follow_back": "Seuraa takaisin",
|
||||||
"account.followers": "Seuraajat",
|
"account.followers": "Seuraajat",
|
||||||
|
@ -294,6 +295,7 @@
|
||||||
"emoji_button.search_results": "Hakutulokset",
|
"emoji_button.search_results": "Hakutulokset",
|
||||||
"emoji_button.symbols": "Symbolit",
|
"emoji_button.symbols": "Symbolit",
|
||||||
"emoji_button.travel": "Matkailu ja paikat",
|
"emoji_button.travel": "Matkailu ja paikat",
|
||||||
|
"empty_column.account_featured": "Tämä lista on tyhjä",
|
||||||
"empty_column.account_hides_collections": "Käyttäjä on päättänyt pitää nämä tiedot yksityisinä",
|
"empty_column.account_hides_collections": "Käyttäjä on päättänyt pitää nämä tiedot yksityisinä",
|
||||||
"empty_column.account_suspended": "Tili jäädytetty",
|
"empty_column.account_suspended": "Tili jäädytetty",
|
||||||
"empty_column.account_timeline": "Ei viestejä täällä.",
|
"empty_column.account_timeline": "Ei viestejä täällä.",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "I-tampok sa profile",
|
"account.endorse": "I-tampok sa profile",
|
||||||
"account.featured_tags.last_status_at": "Huling post noong {date}",
|
"account.featured_tags.last_status_at": "Huling post noong {date}",
|
||||||
"account.featured_tags.last_status_never": "Walang mga post",
|
"account.featured_tags.last_status_never": "Walang mga post",
|
||||||
"account.featured_tags.title": "Nakatampok na hashtag ni {name}",
|
|
||||||
"account.follow": "Sundan",
|
"account.follow": "Sundan",
|
||||||
"account.follow_back": "Sundan pabalik",
|
"account.follow_back": "Sundan pabalik",
|
||||||
"account.followers": "Mga tagasunod",
|
"account.followers": "Mga tagasunod",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Broyt vanga",
|
"account.edit_profile": "Broyt vanga",
|
||||||
"account.enable_notifications": "Boða mær frá, tá @{name} skrivar",
|
"account.enable_notifications": "Boða mær frá, tá @{name} skrivar",
|
||||||
"account.endorse": "Víst á vangamyndini",
|
"account.endorse": "Víst á vangamyndini",
|
||||||
|
"account.featured": "Tikin fram",
|
||||||
|
"account.featured.hashtags": "Frámerki",
|
||||||
|
"account.featured.posts": "Postar",
|
||||||
"account.featured_tags.last_status_at": "Seinasta strongur skrivaður {date}",
|
"account.featured_tags.last_status_at": "Seinasta strongur skrivaður {date}",
|
||||||
"account.featured_tags.last_status_never": "Einki uppslag",
|
"account.featured_tags.last_status_never": "Einki uppslag",
|
||||||
"account.featured_tags.title": "Tvíkrossar hjá {name}",
|
|
||||||
"account.follow": "Fylg",
|
"account.follow": "Fylg",
|
||||||
"account.follow_back": "Fylg aftur",
|
"account.follow_back": "Fylg aftur",
|
||||||
"account.followers": "Fylgjarar",
|
"account.followers": "Fylgjarar",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Leitiúrslit",
|
"emoji_button.search_results": "Leitiúrslit",
|
||||||
"emoji_button.symbols": "Ímyndir",
|
"emoji_button.symbols": "Ímyndir",
|
||||||
"emoji_button.travel": "Ferðing og støð",
|
"emoji_button.travel": "Ferðing og støð",
|
||||||
|
"empty_column.account_featured": "Hesin listin er tómur",
|
||||||
"empty_column.account_hides_collections": "Hesin brúkarin hevur valt, at hesar upplýsingarnar ikki skulu vera tøkar",
|
"empty_column.account_hides_collections": "Hesin brúkarin hevur valt, at hesar upplýsingarnar ikki skulu vera tøkar",
|
||||||
"empty_column.account_suspended": "Kontan gjørd óvirkin",
|
"empty_column.account_suspended": "Kontan gjørd óvirkin",
|
||||||
"empty_column.account_timeline": "Einki uppslag her!",
|
"empty_column.account_timeline": "Einki uppslag her!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Inclure sur profil",
|
"account.endorse": "Inclure sur profil",
|
||||||
"account.featured_tags.last_status_at": "Dernière publication {date}",
|
"account.featured_tags.last_status_at": "Dernière publication {date}",
|
||||||
"account.featured_tags.last_status_never": "Aucune publication",
|
"account.featured_tags.last_status_never": "Aucune publication",
|
||||||
"account.featured_tags.title": "Hashtags inclus de {name}",
|
|
||||||
"account.follow": "Suivre",
|
"account.follow": "Suivre",
|
||||||
"account.follow_back": "Suivre en retour",
|
"account.follow_back": "Suivre en retour",
|
||||||
"account.followers": "abonné·e·s",
|
"account.followers": "abonné·e·s",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Recommander sur votre profil",
|
"account.endorse": "Recommander sur votre profil",
|
||||||
"account.featured_tags.last_status_at": "Dernier message le {date}",
|
"account.featured_tags.last_status_at": "Dernier message le {date}",
|
||||||
"account.featured_tags.last_status_never": "Aucun message",
|
"account.featured_tags.last_status_never": "Aucun message",
|
||||||
"account.featured_tags.title": "Les hashtags en vedette de {name}",
|
|
||||||
"account.follow": "Suivre",
|
"account.follow": "Suivre",
|
||||||
"account.follow_back": "Suivre en retour",
|
"account.follow_back": "Suivre en retour",
|
||||||
"account.followers": "Abonné·e·s",
|
"account.followers": "Abonné·e·s",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Op profyl werjaan",
|
"account.endorse": "Op profyl werjaan",
|
||||||
"account.featured_tags.last_status_at": "Lêste berjocht op {date}",
|
"account.featured_tags.last_status_at": "Lêste berjocht op {date}",
|
||||||
"account.featured_tags.last_status_never": "Gjin berjochten",
|
"account.featured_tags.last_status_never": "Gjin berjochten",
|
||||||
"account.featured_tags.title": "Utljochte hashtags fan {name}",
|
|
||||||
"account.follow": "Folgje",
|
"account.follow": "Folgje",
|
||||||
"account.follow_back": "Weromfolgje",
|
"account.follow_back": "Weromfolgje",
|
||||||
"account.followers": "Folgers",
|
"account.followers": "Folgers",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Cuir ar an phróifíl mar ghné",
|
"account.endorse": "Cuir ar an phróifíl mar ghné",
|
||||||
"account.featured_tags.last_status_at": "Postáil is déanaí ar {date}",
|
"account.featured_tags.last_status_at": "Postáil is déanaí ar {date}",
|
||||||
"account.featured_tags.last_status_never": "Gan aon phoist",
|
"account.featured_tags.last_status_never": "Gan aon phoist",
|
||||||
"account.featured_tags.title": "Haischlib faoi thrácht {name}",
|
|
||||||
"account.follow": "Lean",
|
"account.follow": "Lean",
|
||||||
"account.follow_back": "Leanúint ar ais",
|
"account.follow_back": "Leanúint ar ais",
|
||||||
"account.followers": "Leantóirí",
|
"account.followers": "Leantóirí",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Brosnaich air a’ phròifil",
|
"account.endorse": "Brosnaich air a’ phròifil",
|
||||||
"account.featured_tags.last_status_at": "Am post mu dheireadh {date}",
|
"account.featured_tags.last_status_at": "Am post mu dheireadh {date}",
|
||||||
"account.featured_tags.last_status_never": "Gun phost",
|
"account.featured_tags.last_status_never": "Gun phost",
|
||||||
"account.featured_tags.title": "Na tagaichean hais brosnaichte aig {name}",
|
|
||||||
"account.follow": "Lean",
|
"account.follow": "Lean",
|
||||||
"account.follow_back": "Lean air ais",
|
"account.follow_back": "Lean air ais",
|
||||||
"account.followers": "Luchd-leantainn",
|
"account.followers": "Luchd-leantainn",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Editar perfil",
|
"account.edit_profile": "Editar perfil",
|
||||||
"account.enable_notifications": "Noficarme cando @{name} publique",
|
"account.enable_notifications": "Noficarme cando @{name} publique",
|
||||||
"account.endorse": "Amosar no perfil",
|
"account.endorse": "Amosar no perfil",
|
||||||
|
"account.featured": "Destacado",
|
||||||
|
"account.featured.hashtags": "Cancelos",
|
||||||
|
"account.featured.posts": "Publicacións",
|
||||||
"account.featured_tags.last_status_at": "Última publicación o {date}",
|
"account.featured_tags.last_status_at": "Última publicación o {date}",
|
||||||
"account.featured_tags.last_status_never": "Sen publicacións",
|
"account.featured_tags.last_status_never": "Sen publicacións",
|
||||||
"account.featured_tags.title": "Cancelos destacados de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir tamén",
|
"account.follow_back": "Seguir tamén",
|
||||||
"account.followers": "Seguidoras",
|
"account.followers": "Seguidoras",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Resultados da procura",
|
"emoji_button.search_results": "Resultados da procura",
|
||||||
"emoji_button.symbols": "Símbolos",
|
"emoji_button.symbols": "Símbolos",
|
||||||
"emoji_button.travel": "Viaxes e Lugares",
|
"emoji_button.travel": "Viaxes e Lugares",
|
||||||
|
"empty_column.account_featured": "A lista está baleira",
|
||||||
"empty_column.account_hides_collections": "A usuaria decideu non facer pública esta información",
|
"empty_column.account_hides_collections": "A usuaria decideu non facer pública esta información",
|
||||||
"empty_column.account_suspended": "Conta suspendida",
|
"empty_column.account_suspended": "Conta suspendida",
|
||||||
"empty_column.account_timeline": "Non hai publicacións aquí!",
|
"empty_column.account_timeline": "Non hai publicacións aquí!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "קדם את החשבון בפרופיל",
|
"account.endorse": "קדם את החשבון בפרופיל",
|
||||||
"account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}",
|
"account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}",
|
||||||
"account.featured_tags.last_status_never": "אין חצרוצים",
|
"account.featured_tags.last_status_never": "אין חצרוצים",
|
||||||
"account.featured_tags.title": "התגיות המועדפות של {name}",
|
|
||||||
"account.follow": "לעקוב",
|
"account.follow": "לעקוב",
|
||||||
"account.follow_back": "לעקוב בחזרה",
|
"account.follow_back": "לעקוב בחזרה",
|
||||||
"account.followers": "עוקבים",
|
"account.followers": "עוקבים",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "प्रोफ़ाइल पर दिखाए",
|
"account.endorse": "प्रोफ़ाइल पर दिखाए",
|
||||||
"account.featured_tags.last_status_at": "{date} का अंतिम पोस्ट",
|
"account.featured_tags.last_status_at": "{date} का अंतिम पोस्ट",
|
||||||
"account.featured_tags.last_status_never": "कोई पोस्ट नहीं है",
|
"account.featured_tags.last_status_never": "कोई पोस्ट नहीं है",
|
||||||
"account.featured_tags.title": "{name} के चुनिंदा हैशटैग",
|
|
||||||
"account.follow": "फॉलो करें",
|
"account.follow": "फॉलो करें",
|
||||||
"account.follow_back": "फॉलो करें",
|
"account.follow_back": "फॉलो करें",
|
||||||
"account.followers": "फॉलोवर",
|
"account.followers": "फॉलोवर",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Istakni na profilu",
|
"account.endorse": "Istakni na profilu",
|
||||||
"account.featured_tags.last_status_at": "Zadnji post {date}",
|
"account.featured_tags.last_status_at": "Zadnji post {date}",
|
||||||
"account.featured_tags.last_status_never": "Nema postova",
|
"account.featured_tags.last_status_never": "Nema postova",
|
||||||
"account.featured_tags.title": "Istaknuti hashtagovi {name}",
|
|
||||||
"account.follow": "Prati",
|
"account.follow": "Prati",
|
||||||
"account.follow_back": "Slijedi natrag",
|
"account.follow_back": "Slijedi natrag",
|
||||||
"account.followers": "Pratitelji",
|
"account.followers": "Pratitelji",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Profil szerkesztése",
|
"account.edit_profile": "Profil szerkesztése",
|
||||||
"account.enable_notifications": "Figyelmeztessen, ha @{name} bejegyzést tesz közzé",
|
"account.enable_notifications": "Figyelmeztessen, ha @{name} bejegyzést tesz közzé",
|
||||||
"account.endorse": "Kiemelés a profilodon",
|
"account.endorse": "Kiemelés a profilodon",
|
||||||
|
"account.featured": "Kiemelt",
|
||||||
|
"account.featured.hashtags": "Hashtagek",
|
||||||
|
"account.featured.posts": "Bejegyzések",
|
||||||
"account.featured_tags.last_status_at": "Legutolsó bejegyzés ideje: {date}",
|
"account.featured_tags.last_status_at": "Legutolsó bejegyzés ideje: {date}",
|
||||||
"account.featured_tags.last_status_never": "Nincs bejegyzés",
|
"account.featured_tags.last_status_never": "Nincs bejegyzés",
|
||||||
"account.featured_tags.title": "{name} kiemelt hashtagjei",
|
|
||||||
"account.follow": "Követés",
|
"account.follow": "Követés",
|
||||||
"account.follow_back": "Viszontkövetés",
|
"account.follow_back": "Viszontkövetés",
|
||||||
"account.followers": "Követő",
|
"account.followers": "Követő",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Keresési találatok",
|
"emoji_button.search_results": "Keresési találatok",
|
||||||
"emoji_button.symbols": "Szimbólumok",
|
"emoji_button.symbols": "Szimbólumok",
|
||||||
"emoji_button.travel": "Utazás és helyek",
|
"emoji_button.travel": "Utazás és helyek",
|
||||||
|
"empty_column.account_featured": "Ez a lista üres",
|
||||||
"empty_column.account_hides_collections": "Ez a felhasználó úgy döntött, hogy nem teszi elérhetővé ezt az információt.",
|
"empty_column.account_hides_collections": "Ez a felhasználó úgy döntött, hogy nem teszi elérhetővé ezt az információt.",
|
||||||
"empty_column.account_suspended": "Fiók felfüggesztve",
|
"empty_column.account_suspended": "Fiók felfüggesztve",
|
||||||
"empty_column.account_timeline": "Itt nincs bejegyzés!",
|
"empty_column.account_timeline": "Itt nincs bejegyzés!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Evidentiar sur le profilo",
|
"account.endorse": "Evidentiar sur le profilo",
|
||||||
"account.featured_tags.last_status_at": "Ultime message publicate le {date}",
|
"account.featured_tags.last_status_at": "Ultime message publicate le {date}",
|
||||||
"account.featured_tags.last_status_never": "Necun message",
|
"account.featured_tags.last_status_never": "Necun message",
|
||||||
"account.featured_tags.title": "Hashtags eminente de {name}",
|
|
||||||
"account.follow": "Sequer",
|
"account.follow": "Sequer",
|
||||||
"account.follow_back": "Sequer in retorno",
|
"account.follow_back": "Sequer in retorno",
|
||||||
"account.followers": "Sequitores",
|
"account.followers": "Sequitores",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Tampilkan di profil",
|
"account.endorse": "Tampilkan di profil",
|
||||||
"account.featured_tags.last_status_at": "Kiriman terakhir pada {date}",
|
"account.featured_tags.last_status_at": "Kiriman terakhir pada {date}",
|
||||||
"account.featured_tags.last_status_never": "Tidak ada kiriman",
|
"account.featured_tags.last_status_never": "Tidak ada kiriman",
|
||||||
"account.featured_tags.title": "Tagar {name} yang difiturkan",
|
|
||||||
"account.follow": "Ikuti",
|
"account.follow": "Ikuti",
|
||||||
"account.follow_back": "Ikuti balik",
|
"account.follow_back": "Ikuti balik",
|
||||||
"account.followers": "Pengikut",
|
"account.followers": "Pengikut",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Recomandar sur profil",
|
"account.endorse": "Recomandar sur profil",
|
||||||
"account.featured_tags.last_status_at": "Ultim posta ye {date}",
|
"account.featured_tags.last_status_at": "Ultim posta ye {date}",
|
||||||
"account.featured_tags.last_status_never": "Null postas",
|
"account.featured_tags.last_status_never": "Null postas",
|
||||||
"account.featured_tags.title": "Recomandat hashtags de {name}",
|
|
||||||
"account.follow": "Sequer",
|
"account.follow": "Sequer",
|
||||||
"account.follow_back": "Sequer reciprocmen",
|
"account.follow_back": "Sequer reciprocmen",
|
||||||
"account.followers": "Sequitores",
|
"account.followers": "Sequitores",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Traito di profilo",
|
"account.endorse": "Traito di profilo",
|
||||||
"account.featured_tags.last_status_at": "Antea posto ye {date}",
|
"account.featured_tags.last_status_at": "Antea posto ye {date}",
|
||||||
"account.featured_tags.last_status_never": "Nula posti",
|
"account.featured_tags.last_status_never": "Nula posti",
|
||||||
"account.featured_tags.title": "Ekstaca gretvorti di {name}",
|
|
||||||
"account.follow": "Sequar",
|
"account.follow": "Sequar",
|
||||||
"account.follow_back": "Anke sequez",
|
"account.follow_back": "Anke sequez",
|
||||||
"account.followers": "Sequanti",
|
"account.followers": "Sequanti",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Breyta notandasniði",
|
"account.edit_profile": "Breyta notandasniði",
|
||||||
"account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
|
"account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
|
||||||
"account.endorse": "Birta á notandasniði",
|
"account.endorse": "Birta á notandasniði",
|
||||||
|
"account.featured": "Með aukið vægi",
|
||||||
|
"account.featured.hashtags": "Myllumerki",
|
||||||
|
"account.featured.posts": "Færslur",
|
||||||
"account.featured_tags.last_status_at": "Síðasta færsla þann {date}",
|
"account.featured_tags.last_status_at": "Síðasta færsla þann {date}",
|
||||||
"account.featured_tags.last_status_never": "Engar færslur",
|
"account.featured_tags.last_status_never": "Engar færslur",
|
||||||
"account.featured_tags.title": "Myllumerki hjá {name} með aukið vægi",
|
|
||||||
"account.follow": "Fylgjast með",
|
"account.follow": "Fylgjast með",
|
||||||
"account.follow_back": "Fylgjast með til baka",
|
"account.follow_back": "Fylgjast með til baka",
|
||||||
"account.followers": "Fylgjendur",
|
"account.followers": "Fylgjendur",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Leitarniðurstöður",
|
"emoji_button.search_results": "Leitarniðurstöður",
|
||||||
"emoji_button.symbols": "Tákn",
|
"emoji_button.symbols": "Tákn",
|
||||||
"emoji_button.travel": "Ferðalög og staðir",
|
"emoji_button.travel": "Ferðalög og staðir",
|
||||||
|
"empty_column.account_featured": "Þessi listi er tómur",
|
||||||
"empty_column.account_hides_collections": "Notandinn hefur valið að gera ekki tiltækar þessar upplýsingar",
|
"empty_column.account_hides_collections": "Notandinn hefur valið að gera ekki tiltækar þessar upplýsingar",
|
||||||
"empty_column.account_suspended": "Notandaaðgangur í frysti",
|
"empty_column.account_suspended": "Notandaaðgangur í frysti",
|
||||||
"empty_column.account_timeline": "Engar færslur hér!",
|
"empty_column.account_timeline": "Engar færslur hér!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Modifica profilo",
|
"account.edit_profile": "Modifica profilo",
|
||||||
"account.enable_notifications": "Avvisami quando @{name} pubblica un post",
|
"account.enable_notifications": "Avvisami quando @{name} pubblica un post",
|
||||||
"account.endorse": "In evidenza sul profilo",
|
"account.endorse": "In evidenza sul profilo",
|
||||||
|
"account.featured": "In primo piano",
|
||||||
|
"account.featured.hashtags": "Hashtag",
|
||||||
|
"account.featured.posts": "Post",
|
||||||
"account.featured_tags.last_status_at": "Ultimo post il {date}",
|
"account.featured_tags.last_status_at": "Ultimo post il {date}",
|
||||||
"account.featured_tags.last_status_never": "Nessun post",
|
"account.featured_tags.last_status_never": "Nessun post",
|
||||||
"account.featured_tags.title": "Hashtag in evidenza di {name}",
|
|
||||||
"account.follow": "Segui",
|
"account.follow": "Segui",
|
||||||
"account.follow_back": "Segui a tua volta",
|
"account.follow_back": "Segui a tua volta",
|
||||||
"account.followers": "Follower",
|
"account.followers": "Follower",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Risultati della ricerca",
|
"emoji_button.search_results": "Risultati della ricerca",
|
||||||
"emoji_button.symbols": "Simboli",
|
"emoji_button.symbols": "Simboli",
|
||||||
"emoji_button.travel": "Viaggi & Luoghi",
|
"emoji_button.travel": "Viaggi & Luoghi",
|
||||||
|
"empty_column.account_featured": "Questa lista è vuota",
|
||||||
"empty_column.account_hides_collections": "Questo utente ha scelto di non rendere disponibili queste informazioni",
|
"empty_column.account_hides_collections": "Questo utente ha scelto di non rendere disponibili queste informazioni",
|
||||||
"empty_column.account_suspended": "Profilo sospeso",
|
"empty_column.account_suspended": "Profilo sospeso",
|
||||||
"empty_column.account_timeline": "Nessun post qui!",
|
"empty_column.account_timeline": "Nessun post qui!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "プロフィールで紹介する",
|
"account.endorse": "プロフィールで紹介する",
|
||||||
"account.featured_tags.last_status_at": "最終投稿 {date}",
|
"account.featured_tags.last_status_at": "最終投稿 {date}",
|
||||||
"account.featured_tags.last_status_never": "投稿がありません",
|
"account.featured_tags.last_status_never": "投稿がありません",
|
||||||
"account.featured_tags.title": "{name}の注目ハッシュタグ",
|
|
||||||
"account.follow": "フォロー",
|
"account.follow": "フォロー",
|
||||||
"account.follow_back": "フォローバック",
|
"account.follow_back": "フォローバック",
|
||||||
"account.followers": "フォロワー",
|
"account.followers": "フォロワー",
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
"account.enable_notifications": "@{name} постары туралы ескерту",
|
"account.enable_notifications": "@{name} постары туралы ескерту",
|
||||||
"account.endorse": "Профильде ұсыну",
|
"account.endorse": "Профильде ұсыну",
|
||||||
"account.featured_tags.last_status_never": "Пост жоқ",
|
"account.featured_tags.last_status_never": "Пост жоқ",
|
||||||
"account.featured_tags.title": "{name} таңдаулы хэштегтері",
|
|
||||||
"account.follow": "Жазылу",
|
"account.follow": "Жазылу",
|
||||||
"account.followers": "Жазылушы",
|
"account.followers": "Жазылушы",
|
||||||
"account.followers.empty": "Бұл қолданушыға әлі ешкім жазылмаған.",
|
"account.followers.empty": "Бұл қолданушыға әлі ешкім жазылмаған.",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "프로필에 추천하기",
|
"account.endorse": "프로필에 추천하기",
|
||||||
"account.featured_tags.last_status_at": "{date}에 마지막으로 게시",
|
"account.featured_tags.last_status_at": "{date}에 마지막으로 게시",
|
||||||
"account.featured_tags.last_status_never": "게시물 없음",
|
"account.featured_tags.last_status_never": "게시물 없음",
|
||||||
"account.featured_tags.title": "{name} 님의 추천 해시태그",
|
|
||||||
"account.follow": "팔로우",
|
"account.follow": "팔로우",
|
||||||
"account.follow_back": "맞팔로우",
|
"account.follow_back": "맞팔로우",
|
||||||
"account.followers": "팔로워",
|
"account.followers": "팔로워",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Taybetiyên li ser profîl",
|
"account.endorse": "Taybetiyên li ser profîl",
|
||||||
"account.featured_tags.last_status_at": "Şandiya dawî di {date} de",
|
"account.featured_tags.last_status_at": "Şandiya dawî di {date} de",
|
||||||
"account.featured_tags.last_status_never": "Şandî tune ne",
|
"account.featured_tags.last_status_never": "Şandî tune ne",
|
||||||
"account.featured_tags.title": "{name}'s hashtagên taybet",
|
|
||||||
"account.follow": "Bişopîne",
|
"account.follow": "Bişopîne",
|
||||||
"account.follow_back": "Bişopîne",
|
"account.follow_back": "Bişopîne",
|
||||||
"account.followers": "Şopîner",
|
"account.followers": "Şopîner",
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
"account.domain_blocked": "Dominium impeditum",
|
"account.domain_blocked": "Dominium impeditum",
|
||||||
"account.edit_profile": "Recolere notionem",
|
"account.edit_profile": "Recolere notionem",
|
||||||
"account.featured_tags.last_status_never": "Nulla contributa",
|
"account.featured_tags.last_status_never": "Nulla contributa",
|
||||||
"account.featured_tags.title": "Hashtag notātī {name}",
|
|
||||||
"account.followers_counter": "{count, plural, one {{counter} sectator} other {{counter} sectatores}}",
|
"account.followers_counter": "{count, plural, one {{counter} sectator} other {{counter} sectatores}}",
|
||||||
"account.following_counter": "{count, plural, one {{counter} sectans} other {{counter} sectans}}",
|
"account.following_counter": "{count, plural, one {{counter} sectans} other {{counter} sectans}}",
|
||||||
"account.moved_to": "{name} significavit eum suam rationem novam nunc esse:",
|
"account.moved_to": "{name} significavit eum suam rationem novam nunc esse:",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Avalia en profil",
|
"account.endorse": "Avalia en profil",
|
||||||
"account.featured_tags.last_status_at": "Ultima publikasyon de {date}",
|
"account.featured_tags.last_status_at": "Ultima publikasyon de {date}",
|
||||||
"account.featured_tags.last_status_never": "No ay publikasyones",
|
"account.featured_tags.last_status_never": "No ay publikasyones",
|
||||||
"account.featured_tags.title": "Etiketas avaliadas de {name}",
|
|
||||||
"account.follow": "Sige",
|
"account.follow": "Sige",
|
||||||
"account.follow_back": "Sige tamyen",
|
"account.follow_back": "Sige tamyen",
|
||||||
"account.followers": "Suivantes",
|
"account.followers": "Suivantes",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Rodyti profilyje",
|
"account.endorse": "Rodyti profilyje",
|
||||||
"account.featured_tags.last_status_at": "Paskutinis įrašas {date}",
|
"account.featured_tags.last_status_at": "Paskutinis įrašas {date}",
|
||||||
"account.featured_tags.last_status_never": "Nėra įrašų",
|
"account.featured_tags.last_status_never": "Nėra įrašų",
|
||||||
"account.featured_tags.title": "{name} rodomi saitažodžiai",
|
|
||||||
"account.follow": "Sekti",
|
"account.follow": "Sekti",
|
||||||
"account.follow_back": "Sekti atgal",
|
"account.follow_back": "Sekti atgal",
|
||||||
"account.followers": "Sekėjai",
|
"account.followers": "Sekėjai",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Izcelts profilā",
|
"account.endorse": "Izcelts profilā",
|
||||||
"account.featured_tags.last_status_at": "Beidzamā ziņa {date}",
|
"account.featured_tags.last_status_at": "Beidzamā ziņa {date}",
|
||||||
"account.featured_tags.last_status_never": "Ierakstu nav",
|
"account.featured_tags.last_status_never": "Ierakstu nav",
|
||||||
"account.featured_tags.title": "{name} izceltie tēmturi",
|
|
||||||
"account.follow": "Sekot",
|
"account.follow": "Sekot",
|
||||||
"account.follow_back": "Sekot atpakaļ",
|
"account.follow_back": "Sekot atpakaļ",
|
||||||
"account.followers": "Sekotāji",
|
"account.followers": "Sekotāji",
|
||||||
|
@ -54,7 +53,7 @@
|
||||||
"account.muted": "Apklusināts",
|
"account.muted": "Apklusināts",
|
||||||
"account.mutual": "Abpusēji",
|
"account.mutual": "Abpusēji",
|
||||||
"account.no_bio": "Apraksts nav sniegts.",
|
"account.no_bio": "Apraksts nav sniegts.",
|
||||||
"account.open_original_page": "Atvērt oriģinālo lapu",
|
"account.open_original_page": "Atvērt pirmavota lapu",
|
||||||
"account.posts": "Ieraksti",
|
"account.posts": "Ieraksti",
|
||||||
"account.posts_with_replies": "Ieraksti un atbildes",
|
"account.posts_with_replies": "Ieraksti un atbildes",
|
||||||
"account.report": "Sūdzēties par @{name}",
|
"account.report": "Sūdzēties par @{name}",
|
||||||
|
@ -214,7 +213,7 @@
|
||||||
"confirmations.missing_alt_text.secondary": "Vienalga iesūtīt",
|
"confirmations.missing_alt_text.secondary": "Vienalga iesūtīt",
|
||||||
"confirmations.mute.confirm": "Apklusināt",
|
"confirmations.mute.confirm": "Apklusināt",
|
||||||
"confirmations.redraft.confirm": "Dzēst un pārrakstīt",
|
"confirmations.redraft.confirm": "Dzēst un pārrakstīt",
|
||||||
"confirmations.redraft.message": "Vai tiešām vēlies dzēst šo ziņu un no jauna noformēt to? Izlase un pastiprinājumi tiks zaudēti, un atbildes uz sākotnējo ziņu tiks atstātas bez autoratlīdzības.",
|
"confirmations.redraft.message": "Vai tiešām vēlies izdzēst šo ierakstu un veidot jaunu tā uzmetumu? Pievienošana izlasēs un pastiprinājumi tiks zaudēti, un sākotnējā ieraksta atbildes paliks bez saiknes ar to.",
|
||||||
"confirmations.redraft.title": "Dzēst un rakstīt vēlreiz?",
|
"confirmations.redraft.title": "Dzēst un rakstīt vēlreiz?",
|
||||||
"confirmations.reply.confirm": "Atbildēt",
|
"confirmations.reply.confirm": "Atbildēt",
|
||||||
"confirmations.reply.message": "Tūlītēja atbildēšana pārrakstīs pašlaik sastādīto ziņu. Vai tiešām turpināt?",
|
"confirmations.reply.message": "Tūlītēja atbildēšana pārrakstīs pašlaik sastādīto ziņu. Vai tiešām turpināt?",
|
||||||
|
@ -597,7 +596,7 @@
|
||||||
"report.close": "Darīts",
|
"report.close": "Darīts",
|
||||||
"report.comment.title": "Vai, tavuprāt, mums vēl būtu kas jāzina?",
|
"report.comment.title": "Vai, tavuprāt, mums vēl būtu kas jāzina?",
|
||||||
"report.forward": "Pārsūtīt {target}",
|
"report.forward": "Pārsūtīt {target}",
|
||||||
"report.forward_hint": "Konts ir no cita servera. Vai nosūtīt anonimizētu sūdzības kopiju arī tam?",
|
"report.forward_hint": "Konts ir no cita servera. Vai nosūtīt anonimizētu ziņojuma kopiju arī tur?",
|
||||||
"report.mute": "Apklusināt",
|
"report.mute": "Apklusināt",
|
||||||
"report.mute_explanation": "Tu neredzēsi viņu ierakstus. Viņi joprojām var Tev sekot un redzēt Tavus ierakstus un nezinās, ka viņi ir apklusināti.",
|
"report.mute_explanation": "Tu neredzēsi viņu ierakstus. Viņi joprojām var Tev sekot un redzēt Tavus ierakstus un nezinās, ka viņi ir apklusināti.",
|
||||||
"report.next": "Tālāk",
|
"report.next": "Tālāk",
|
||||||
|
@ -692,7 +691,7 @@
|
||||||
"status.pinned": "Piesprausts ieraksts",
|
"status.pinned": "Piesprausts ieraksts",
|
||||||
"status.read_more": "Lasīt vairāk",
|
"status.read_more": "Lasīt vairāk",
|
||||||
"status.reblog": "Pastiprināt",
|
"status.reblog": "Pastiprināt",
|
||||||
"status.reblog_private": "Pastiprināt, nemainot redzamību",
|
"status.reblog_private": "Pastiprināt ar sākotnējo redzamību",
|
||||||
"status.reblogged_by": "{name} pastiprināja",
|
"status.reblogged_by": "{name} pastiprināja",
|
||||||
"status.reblogs": "{count, plural, zero {pastiprinājumu} one {pastiprinājums} other {pastiprinājumi}}",
|
"status.reblogs": "{count, plural, zero {pastiprinājumu} one {pastiprinājums} other {pastiprinājumi}}",
|
||||||
"status.reblogs.empty": "Neviens šo ierakstu vēl nav pastiprinājis. Kad būs, tie parādīsies šeit.",
|
"status.reblogs.empty": "Neviens šo ierakstu vēl nav pastiprinājis. Kad būs, tie parādīsies šeit.",
|
||||||
|
@ -706,7 +705,7 @@
|
||||||
"status.share": "Kopīgot",
|
"status.share": "Kopīgot",
|
||||||
"status.show_less_all": "Rādīt mazāk visiem",
|
"status.show_less_all": "Rādīt mazāk visiem",
|
||||||
"status.show_more_all": "Rādīt vairāk visiem",
|
"status.show_more_all": "Rādīt vairāk visiem",
|
||||||
"status.show_original": "Rādīt oriģinālu",
|
"status.show_original": "Rādīt pirmavotu",
|
||||||
"status.title.with_attachments": "{user} publicējis {attachmentCount, plural, one {pielikumu} other {{attachmentCount} pielikumus}}",
|
"status.title.with_attachments": "{user} publicējis {attachmentCount, plural, one {pielikumu} other {{attachmentCount} pielikumus}}",
|
||||||
"status.translate": "Tulkot",
|
"status.translate": "Tulkot",
|
||||||
"status.translated_from_with": "Tulkots no {lang} izmantojot {provider}",
|
"status.translated_from_with": "Tulkots no {lang} izmantojot {provider}",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "प्रोफाइलवरील वैशिष्ट्य",
|
"account.endorse": "प्रोफाइलवरील वैशिष्ट्य",
|
||||||
"account.featured_tags.last_status_at": "शेवटचे पोस्ट {date} रोजी",
|
"account.featured_tags.last_status_at": "शेवटचे पोस्ट {date} रोजी",
|
||||||
"account.featured_tags.last_status_never": "पोस्ट नाहीत",
|
"account.featured_tags.last_status_never": "पोस्ट नाहीत",
|
||||||
"account.featured_tags.title": "{name} चे वैशिष्ट्यीकृत हॅशटॅग",
|
|
||||||
"account.follow": "अनुयायी व्हा",
|
"account.follow": "अनुयायी व्हा",
|
||||||
"account.follow_back": "आपणही अनुसरण करा",
|
"account.follow_back": "आपणही अनुसरण करा",
|
||||||
"account.followers": "अनुयायी",
|
"account.followers": "अनुयायी",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Tampilkan di profil",
|
"account.endorse": "Tampilkan di profil",
|
||||||
"account.featured_tags.last_status_at": "Hantaran terakhir pada {date}",
|
"account.featured_tags.last_status_at": "Hantaran terakhir pada {date}",
|
||||||
"account.featured_tags.last_status_never": "Tiada hantaran",
|
"account.featured_tags.last_status_never": "Tiada hantaran",
|
||||||
"account.featured_tags.title": "Tanda pagar pilihan {name}",
|
|
||||||
"account.follow": "Ikuti",
|
"account.follow": "Ikuti",
|
||||||
"account.follow_back": "Ikut balik",
|
"account.follow_back": "Ikut balik",
|
||||||
"account.followers": "Pengikut",
|
"account.followers": "Pengikut",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "အကောင့်ပရိုဖိုင်တွင်ဖော်ပြပါ",
|
"account.endorse": "အကောင့်ပရိုဖိုင်တွင်ဖော်ပြပါ",
|
||||||
"account.featured_tags.last_status_at": "နောက်ဆုံးပို့စ်ကို {date} တွင် တင်ခဲ့သည်။",
|
"account.featured_tags.last_status_at": "နောက်ဆုံးပို့စ်ကို {date} တွင် တင်ခဲ့သည်။",
|
||||||
"account.featured_tags.last_status_never": "ပို့စ်တင်ထားခြင်းမရှိပါ",
|
"account.featured_tags.last_status_never": "ပို့စ်တင်ထားခြင်းမရှိပါ",
|
||||||
"account.featured_tags.title": "ဖော်ပြထားသောဟက်ရှ်တက်ခ်များ",
|
|
||||||
"account.follow": "စောင့်ကြည့်",
|
"account.follow": "စောင့်ကြည့်",
|
||||||
"account.followers": "စောင့်ကြည့်သူများ",
|
"account.followers": "စောင့်ကြည့်သူများ",
|
||||||
"account.followers.empty": "ဤသူကို စောင့်ကြည့်သူ မရှိသေးပါ။",
|
"account.followers.empty": "ဤသူကို စောင့်ကြည့်သူ မရှိသေးပါ။",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "用個人資料推薦對方",
|
"account.endorse": "用個人資料推薦對方",
|
||||||
"account.featured_tags.last_status_at": "頂kái tī {date} Po文",
|
"account.featured_tags.last_status_at": "頂kái tī {date} Po文",
|
||||||
"account.featured_tags.last_status_never": "無PO文",
|
"account.featured_tags.last_status_never": "無PO文",
|
||||||
"account.featured_tags.title": "{name} ê推薦hashtag",
|
|
||||||
"account.follow": "跟tuè",
|
"account.follow": "跟tuè",
|
||||||
"account.follow_back": "Tuè tńg去",
|
"account.follow_back": "Tuè tńg去",
|
||||||
"account.followers": "跟tuè lí ê",
|
"account.followers": "跟tuè lí ê",
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
"account.enable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित गर्नुहोस्",
|
"account.enable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित गर्नुहोस्",
|
||||||
"account.endorse": "प्रोफाइलमा फिचर गर्नुहोस्",
|
"account.endorse": "प्रोफाइलमा फिचर गर्नुहोस्",
|
||||||
"account.featured_tags.last_status_never": "कुनै पोस्ट छैन",
|
"account.featured_tags.last_status_never": "कुनै पोस्ट छैन",
|
||||||
"account.featured_tags.title": "{name}का विशेष ह्यासट्यागहरू",
|
|
||||||
"account.follow": "फलो गर्नुहोस",
|
"account.follow": "फलो गर्नुहोस",
|
||||||
"account.follow_back": "फलो ब्याक गर्नुहोस्",
|
"account.follow_back": "फलो ब्याक गर्नुहोस्",
|
||||||
"account.followers": "फलोअरहरु",
|
"account.followers": "फलोअरहरु",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Profiel bewerken",
|
"account.edit_profile": "Profiel bewerken",
|
||||||
"account.enable_notifications": "Geef een melding wanneer @{name} een bericht plaatst",
|
"account.enable_notifications": "Geef een melding wanneer @{name} een bericht plaatst",
|
||||||
"account.endorse": "Op profiel weergeven",
|
"account.endorse": "Op profiel weergeven",
|
||||||
|
"account.featured": "Uitgelicht",
|
||||||
|
"account.featured.hashtags": "Hashtags",
|
||||||
|
"account.featured.posts": "Berichten",
|
||||||
"account.featured_tags.last_status_at": "Laatste bericht op {date}",
|
"account.featured_tags.last_status_at": "Laatste bericht op {date}",
|
||||||
"account.featured_tags.last_status_never": "Geen berichten",
|
"account.featured_tags.last_status_never": "Geen berichten",
|
||||||
"account.featured_tags.title": "Uitgelichte hashtags van {name}",
|
|
||||||
"account.follow": "Volgen",
|
"account.follow": "Volgen",
|
||||||
"account.follow_back": "Terugvolgen",
|
"account.follow_back": "Terugvolgen",
|
||||||
"account.followers": "Volgers",
|
"account.followers": "Volgers",
|
||||||
|
@ -294,6 +296,7 @@
|
||||||
"emoji_button.search_results": "Zoekresultaten",
|
"emoji_button.search_results": "Zoekresultaten",
|
||||||
"emoji_button.symbols": "Symbolen",
|
"emoji_button.symbols": "Symbolen",
|
||||||
"emoji_button.travel": "Reizen en locaties",
|
"emoji_button.travel": "Reizen en locaties",
|
||||||
|
"empty_column.account_featured": "Deze lijst is leeg",
|
||||||
"empty_column.account_hides_collections": "Deze gebruiker heeft ervoor gekozen deze informatie niet beschikbaar te maken",
|
"empty_column.account_hides_collections": "Deze gebruiker heeft ervoor gekozen deze informatie niet beschikbaar te maken",
|
||||||
"empty_column.account_suspended": "Account opgeschort",
|
"empty_column.account_suspended": "Account opgeschort",
|
||||||
"empty_column.account_timeline": "Hier zijn geen berichten!",
|
"empty_column.account_timeline": "Hier zijn geen berichten!",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Rediger profil",
|
"account.edit_profile": "Rediger profil",
|
||||||
"account.enable_notifications": "Varsle meg når @{name} skriv innlegg",
|
"account.enable_notifications": "Varsle meg når @{name} skriv innlegg",
|
||||||
"account.endorse": "Vis på profilen",
|
"account.endorse": "Vis på profilen",
|
||||||
|
"account.featured": "Utvald",
|
||||||
|
"account.featured.hashtags": "Emneknaggar",
|
||||||
|
"account.featured.posts": "Innlegg",
|
||||||
"account.featured_tags.last_status_at": "Sist nytta {date}",
|
"account.featured_tags.last_status_at": "Sist nytta {date}",
|
||||||
"account.featured_tags.last_status_never": "Ingen innlegg",
|
"account.featured_tags.last_status_never": "Ingen innlegg",
|
||||||
"account.featured_tags.title": "{name} sine framheva emneknaggar",
|
|
||||||
"account.follow": "Fylg",
|
"account.follow": "Fylg",
|
||||||
"account.follow_back": "Fylg tilbake",
|
"account.follow_back": "Fylg tilbake",
|
||||||
"account.followers": "Fylgjarar",
|
"account.followers": "Fylgjarar",
|
||||||
|
@ -293,6 +295,7 @@
|
||||||
"emoji_button.search_results": "Søkeresultat",
|
"emoji_button.search_results": "Søkeresultat",
|
||||||
"emoji_button.symbols": "Symbol",
|
"emoji_button.symbols": "Symbol",
|
||||||
"emoji_button.travel": "Reise & stader",
|
"emoji_button.travel": "Reise & stader",
|
||||||
|
"empty_column.account_featured": "Denne lista er tom",
|
||||||
"empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg",
|
"empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg",
|
||||||
"empty_column.account_suspended": "Kontoen er utestengd",
|
"empty_column.account_suspended": "Kontoen er utestengd",
|
||||||
"empty_column.account_timeline": "Ingen tut her!",
|
"empty_column.account_timeline": "Ingen tut her!",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Vis frem på profilen",
|
"account.endorse": "Vis frem på profilen",
|
||||||
"account.featured_tags.last_status_at": "Siste innlegg {date}",
|
"account.featured_tags.last_status_at": "Siste innlegg {date}",
|
||||||
"account.featured_tags.last_status_never": "Ingen Innlegg",
|
"account.featured_tags.last_status_never": "Ingen Innlegg",
|
||||||
"account.featured_tags.title": "{name} sine fremhevede emneknagger",
|
|
||||||
"account.follow": "Følg",
|
"account.follow": "Følg",
|
||||||
"account.follow_back": "Følg tilbake",
|
"account.follow_back": "Følg tilbake",
|
||||||
"account.followers": "Følgere",
|
"account.followers": "Følgere",
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
"account.endorse": "Mostrar pel perfil",
|
"account.endorse": "Mostrar pel perfil",
|
||||||
"account.featured_tags.last_status_at": "Darrièra publicacion lo {date}",
|
"account.featured_tags.last_status_at": "Darrièra publicacion lo {date}",
|
||||||
"account.featured_tags.last_status_never": "Cap de publicacion",
|
"account.featured_tags.last_status_never": "Cap de publicacion",
|
||||||
"account.featured_tags.title": "Etiquetas en avant de {name}",
|
|
||||||
"account.follow": "Sègre",
|
"account.follow": "Sègre",
|
||||||
"account.follow_back": "Sègre en retorn",
|
"account.follow_back": "Sègre en retorn",
|
||||||
"account.followers": "Seguidors",
|
"account.followers": "Seguidors",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Wyróżnij na profilu",
|
"account.endorse": "Wyróżnij na profilu",
|
||||||
"account.featured_tags.last_status_at": "Ostatni post {date}",
|
"account.featured_tags.last_status_at": "Ostatni post {date}",
|
||||||
"account.featured_tags.last_status_never": "Brak postów",
|
"account.featured_tags.last_status_never": "Brak postów",
|
||||||
"account.featured_tags.title": "Polecane hasztagi {name}",
|
|
||||||
"account.follow": "Obserwuj",
|
"account.follow": "Obserwuj",
|
||||||
"account.follow_back": "Również obserwuj",
|
"account.follow_back": "Również obserwuj",
|
||||||
"account.followers": "Obserwujący",
|
"account.followers": "Obserwujący",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Recomendar",
|
"account.endorse": "Recomendar",
|
||||||
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
||||||
"account.featured_tags.last_status_never": "Sem publicações",
|
"account.featured_tags.last_status_never": "Sem publicações",
|
||||||
"account.featured_tags.title": "Hashtags em destaque de {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir de volta",
|
"account.follow_back": "Seguir de volta",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Destacar no perfil",
|
"account.endorse": "Destacar no perfil",
|
||||||
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
||||||
"account.featured_tags.last_status_never": "Sem publicações",
|
"account.featured_tags.last_status_never": "Sem publicações",
|
||||||
"account.featured_tags.title": "Etiquetas destacadas por {name}",
|
|
||||||
"account.follow": "Seguir",
|
"account.follow": "Seguir",
|
||||||
"account.follow_back": "Seguir também",
|
"account.follow_back": "Seguir também",
|
||||||
"account.followers": "Seguidores",
|
"account.followers": "Seguidores",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Promovează pe profil",
|
"account.endorse": "Promovează pe profil",
|
||||||
"account.featured_tags.last_status_at": "Ultima postare pe {date}",
|
"account.featured_tags.last_status_at": "Ultima postare pe {date}",
|
||||||
"account.featured_tags.last_status_never": "Fără postări",
|
"account.featured_tags.last_status_never": "Fără postări",
|
||||||
"account.featured_tags.title": "Haștagurile recomandate de {name}",
|
|
||||||
"account.follow": "Urmărește",
|
"account.follow": "Urmărește",
|
||||||
"account.follow_back": "Urmăreşte înapoi",
|
"account.follow_back": "Urmăreşte înapoi",
|
||||||
"account.followers": "Urmăritori",
|
"account.followers": "Urmăritori",
|
||||||
|
|
|
@ -27,9 +27,9 @@
|
||||||
"account.edit_profile": "Редактировать",
|
"account.edit_profile": "Редактировать",
|
||||||
"account.enable_notifications": "Уведомлять о постах от @{name}",
|
"account.enable_notifications": "Уведомлять о постах от @{name}",
|
||||||
"account.endorse": "Рекомендовать в профиле",
|
"account.endorse": "Рекомендовать в профиле",
|
||||||
|
"account.featured": "Избранное",
|
||||||
"account.featured_tags.last_status_at": "Последний пост {date}",
|
"account.featured_tags.last_status_at": "Последний пост {date}",
|
||||||
"account.featured_tags.last_status_never": "Нет постов",
|
"account.featured_tags.last_status_never": "Нет постов",
|
||||||
"account.featured_tags.title": "Избранные хэштеги {name}",
|
|
||||||
"account.follow": "Подписаться",
|
"account.follow": "Подписаться",
|
||||||
"account.follow_back": "Подписаться в ответ",
|
"account.follow_back": "Подписаться в ответ",
|
||||||
"account.followers": "Подписчики",
|
"account.followers": "Подписчики",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Указовати на профілови",
|
"account.endorse": "Указовати на профілови",
|
||||||
"account.featured_tags.last_status_at": "Датум послідньої публикації {date}",
|
"account.featured_tags.last_status_at": "Датум послідньої публикації {date}",
|
||||||
"account.featured_tags.last_status_never": "Ниє публикацій",
|
"account.featured_tags.last_status_never": "Ниє публикацій",
|
||||||
"account.featured_tags.title": "Ублюблені гештеґы {name}",
|
|
||||||
"account.follow": "Пудписати ся",
|
"account.follow": "Пудписати ся",
|
||||||
"account.follow_back": "Пудписати ся тоже",
|
"account.follow_back": "Пудписати ся тоже",
|
||||||
"account.followers": "Пудписникы",
|
"account.followers": "Пудписникы",
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
"account.endorse": "व्यक्तिगतविवरणे वैशिष्ट्यम्",
|
"account.endorse": "व्यक्तिगतविवरणे वैशिष्ट्यम्",
|
||||||
"account.featured_tags.last_status_at": "{date} दिने गतस्थापनम्",
|
"account.featured_tags.last_status_at": "{date} दिने गतस्थापनम्",
|
||||||
"account.featured_tags.last_status_never": "न पत्रम्",
|
"account.featured_tags.last_status_never": "न पत्रम्",
|
||||||
"account.featured_tags.title": "{name} इत्यस्य विशेषहैस्टैगः",
|
|
||||||
"account.follow": "अनुस्रियताम्",
|
"account.follow": "अनुस्रियताम्",
|
||||||
"account.followers": "अनुसर्तारः",
|
"account.followers": "अनुसर्तारः",
|
||||||
"account.followers.empty": "नाऽनुसर्तारो वर्तन्ते",
|
"account.followers.empty": "नाऽनुसर्तारो वर्तन्ते",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Cussìgia in su profilu tuo",
|
"account.endorse": "Cussìgia in su profilu tuo",
|
||||||
"account.featured_tags.last_status_at": "Ùrtima publicatzione in su {date}",
|
"account.featured_tags.last_status_at": "Ùrtima publicatzione in su {date}",
|
||||||
"account.featured_tags.last_status_never": "Peruna publicatzione",
|
"account.featured_tags.last_status_never": "Peruna publicatzione",
|
||||||
"account.featured_tags.title": "Etichetas de {name} in evidèntzia",
|
|
||||||
"account.follow": "Sighi",
|
"account.follow": "Sighi",
|
||||||
"account.follow_back": "Sighi tue puru",
|
"account.follow_back": "Sighi tue puru",
|
||||||
"account.followers": "Sighiduras",
|
"account.followers": "Sighiduras",
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
"account.endorse": "Shaw oan profile",
|
"account.endorse": "Shaw oan profile",
|
||||||
"account.featured_tags.last_status_at": "Last post oan {date}",
|
"account.featured_tags.last_status_at": "Last post oan {date}",
|
||||||
"account.featured_tags.last_status_never": "Nae posts",
|
"account.featured_tags.last_status_never": "Nae posts",
|
||||||
"account.featured_tags.title": "{name}'s hielichtit hashtags",
|
|
||||||
"account.follow": "Follae",
|
"account.follow": "Follae",
|
||||||
"account.followers": "Follaers",
|
"account.followers": "Follaers",
|
||||||
"account.followers.empty": "Naebody follaes this uiser yit.",
|
"account.followers.empty": "Naebody follaes this uiser yit.",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Zobraziť na vlastnom profile",
|
"account.endorse": "Zobraziť na vlastnom profile",
|
||||||
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
|
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
|
||||||
"account.featured_tags.last_status_never": "Žiadne príspevky",
|
"account.featured_tags.last_status_never": "Žiadne príspevky",
|
||||||
"account.featured_tags.title": "Odporúčané hashtagy účtu {name}",
|
|
||||||
"account.follow": "Sledovať",
|
"account.follow": "Sledovať",
|
||||||
"account.follow_back": "Sledovať späť",
|
"account.follow_back": "Sledovať späť",
|
||||||
"account.followers": "Sledovatelia",
|
"account.followers": "Sledovatelia",
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
"account.endorse": "Izpostavi v profilu",
|
"account.endorse": "Izpostavi v profilu",
|
||||||
"account.featured_tags.last_status_at": "Zadnja objava {date}",
|
"account.featured_tags.last_status_at": "Zadnja objava {date}",
|
||||||
"account.featured_tags.last_status_never": "Ni objav",
|
"account.featured_tags.last_status_never": "Ni objav",
|
||||||
"account.featured_tags.title": "Izpostavljeni ključniki osebe {name}",
|
|
||||||
"account.follow": "Sledi",
|
"account.follow": "Sledi",
|
||||||
"account.follow_back": "Sledi nazaj",
|
"account.follow_back": "Sledi nazaj",
|
||||||
"account.followers": "Sledilci",
|
"account.followers": "Sledilci",
|
||||||
|
|
|
@ -27,9 +27,11 @@
|
||||||
"account.edit_profile": "Përpunoni profilin",
|
"account.edit_profile": "Përpunoni profilin",
|
||||||
"account.enable_notifications": "Njoftomë, kur poston @{name}",
|
"account.enable_notifications": "Njoftomë, kur poston @{name}",
|
||||||
"account.endorse": "Pasqyrojeni në profil",
|
"account.endorse": "Pasqyrojeni në profil",
|
||||||
|
"account.featured": "Të zgjedhur",
|
||||||
|
"account.featured.hashtags": "Hashtag-ë",
|
||||||
|
"account.featured.posts": "Postime",
|
||||||
"account.featured_tags.last_status_at": "Postimi i fundit më {date}",
|
"account.featured_tags.last_status_at": "Postimi i fundit më {date}",
|
||||||
"account.featured_tags.last_status_never": "Pa postime",
|
"account.featured_tags.last_status_never": "Pa postime",
|
||||||
"account.featured_tags.title": "Hashtagë të zgjedhur të {name}",
|
|
||||||
"account.follow": "Ndiqeni",
|
"account.follow": "Ndiqeni",
|
||||||
"account.follow_back": "Ndiqe gjithashtu",
|
"account.follow_back": "Ndiqe gjithashtu",
|
||||||
"account.followers": "Ndjekës",
|
"account.followers": "Ndjekës",
|
||||||
|
@ -289,6 +291,7 @@
|
||||||
"emoji_button.search_results": "Përfundime kërkimi",
|
"emoji_button.search_results": "Përfundime kërkimi",
|
||||||
"emoji_button.symbols": "Simbole",
|
"emoji_button.symbols": "Simbole",
|
||||||
"emoji_button.travel": "Udhëtime & Vende",
|
"emoji_button.travel": "Udhëtime & Vende",
|
||||||
|
"empty_column.account_featured": "Kjo listë është e zbrazët",
|
||||||
"empty_column.account_hides_collections": "Ky përdorues ka zgjedhur të mos e japë këtë informacion",
|
"empty_column.account_hides_collections": "Ky përdorues ka zgjedhur të mos e japë këtë informacion",
|
||||||
"empty_column.account_suspended": "Llogaria u pezullua",
|
"empty_column.account_suspended": "Llogaria u pezullua",
|
||||||
"empty_column.account_timeline": "S’ka mesazhe këtu!",
|
"empty_column.account_timeline": "S’ka mesazhe këtu!",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Istakni na profilu",
|
"account.endorse": "Istakni na profilu",
|
||||||
"account.featured_tags.last_status_at": "Poslednja objava {date}",
|
"account.featured_tags.last_status_at": "Poslednja objava {date}",
|
||||||
"account.featured_tags.last_status_never": "Nema objava",
|
"account.featured_tags.last_status_never": "Nema objava",
|
||||||
"account.featured_tags.title": "Istaknute heš oznake korisnika {name}",
|
|
||||||
"account.follow": "Prati",
|
"account.follow": "Prati",
|
||||||
"account.follow_back": "Uzvrati praćenje",
|
"account.follow_back": "Uzvrati praćenje",
|
||||||
"account.followers": "Pratioci",
|
"account.followers": "Pratioci",
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"account.endorse": "Истакни на профилу",
|
"account.endorse": "Истакни на профилу",
|
||||||
"account.featured_tags.last_status_at": "Последња објава {date}",
|
"account.featured_tags.last_status_at": "Последња објава {date}",
|
||||||
"account.featured_tags.last_status_never": "Нема објава",
|
"account.featured_tags.last_status_never": "Нема објава",
|
||||||
"account.featured_tags.title": "Истакнуте хеш ознаке корисника {name}",
|
|
||||||
"account.follow": "Прати",
|
"account.follow": "Прати",
|
||||||
"account.follow_back": "Узврати праћење",
|
"account.follow_back": "Узврати праћење",
|
||||||
"account.followers": "Пратиоци",
|
"account.followers": "Пратиоци",
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user