= ({ active, onClose }) => {
},
reverse: !active,
config: config.wobbly,
- immediate: reduceMotion,
});
return (
diff --git a/app/javascript/mastodon/features/ui/components/video_modal.jsx b/app/javascript/mastodon/features/ui/components/video_modal.jsx
index ed58d642a4..03ee686942 100644
--- a/app/javascript/mastodon/features/ui/components/video_modal.jsx
+++ b/app/javascript/mastodon/features/ui/components/video_modal.jsx
@@ -5,7 +5,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import { getAverageFromBlurhash } from 'mastodon/blurhash';
-import Footer from 'mastodon/features/picture_in_picture/components/footer';
+import { Footer } from 'mastodon/features/picture_in_picture/components/footer';
import { Video } from 'mastodon/features/video';
const mapStateToProps = (state, { statusId }) => ({
diff --git a/app/javascript/mastodon/features/ui/containers/status_list_container.js b/app/javascript/mastodon/features/ui/containers/status_list_container.js
index 5ffa4353f1..a624796a08 100644
--- a/app/javascript/mastodon/features/ui/containers/status_list_container.js
+++ b/app/javascript/mastodon/features/ui/containers/status_list_container.js
@@ -17,19 +17,22 @@ const makeGetStatusIds = (pending = false) => createSelector([
if (id === null || id === 'inline-follow-suggestions') return true;
const statusForId = statuses.get(id);
- let showStatus = true;
if (statusForId.get('account') === me) return true;
- if (columnSettings.getIn(['shows', 'reblog']) === false) {
- showStatus = showStatus && statusForId.get('reblog') === null;
+ if (columnSettings.getIn(['shows', 'reblog']) === false && statusForId.get('reblog') !== null) {
+ return false;
}
- if (columnSettings.getIn(['shows', 'reply']) === false) {
- showStatus = showStatus && (statusForId.get('in_reply_to_id') === null || statusForId.get('in_reply_to_account_id') === me);
+ if (columnSettings.getIn(['shows', 'reply']) === false && statusForId.get('in_reply_to_id') !== null && statusForId.get('in_reply_to_account_id') !== me) {
+ return false;
}
- return showStatus;
+ if (columnSettings.getIn(['shows', 'quote']) === false && statusForId.get('quote') !== null) {
+ return false;
+ }
+
+ return true;
});
});
diff --git a/app/javascript/mastodon/features/ui/hooks/useBreakpoint.tsx b/app/javascript/mastodon/features/ui/hooks/useBreakpoint.tsx
new file mode 100644
index 0000000000..af96ab3766
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/hooks/useBreakpoint.tsx
@@ -0,0 +1,53 @@
+import { useState, useEffect } from 'react';
+
+const breakpoints = {
+ openable: 759, // Device width at which the sidebar becomes an openable hamburger menu
+ full: 1174, // Device width at which all 3 columns can be displayed
+};
+
+type Breakpoint = 'openable' | 'full';
+
+export const useBreakpoint = (breakpoint: Breakpoint) => {
+ const [isMatching, setIsMatching] = useState(false);
+
+ useEffect(() => {
+ const mediaWatcher = window.matchMedia(
+ `(max-width: ${breakpoints[breakpoint]}px)`,
+ );
+
+ setIsMatching(mediaWatcher.matches);
+
+ const handleChange = (e: MediaQueryListEvent) => {
+ setIsMatching(e.matches);
+ };
+
+ mediaWatcher.addEventListener('change', handleChange);
+
+ return () => {
+ mediaWatcher.removeEventListener('change', handleChange);
+ };
+ }, [breakpoint, setIsMatching]);
+
+ return isMatching;
+};
+
+interface WithBreakpointType {
+ matchesBreakpoint: boolean;
+}
+
+export function withBreakpoint(
+ Component: React.ComponentType
,
+ breakpoint: Breakpoint = 'full',
+) {
+ const displayName = `withMobileLayout(${Component.displayName ?? Component.name})`;
+
+ const ComponentWithBreakpoint = (props: P) => {
+ const matchesBreakpoint = useBreakpoint(breakpoint);
+
+ return ;
+ };
+
+ ComponentWithBreakpoint.displayName = displayName;
+
+ return ComponentWithBreakpoint;
+}
diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx
index 7d190b3ce7..d6d7b5e2e8 100644
--- a/app/javascript/mastodon/features/ui/index.jsx
+++ b/app/javascript/mastodon/features/ui/index.jsx
@@ -29,7 +29,7 @@ import { expandHomeTimeline } from '../../actions/timelines';
import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards } from '../../initial_state';
import BundleColumnError from './components/bundle_column_error';
-import Header from './components/header';
+import { NavigationBar } from './components/navigation_bar';
import { UploadArea } from './components/upload_area';
import { HashtagMenuController } from './components/hashtag_menu_controller';
import ColumnsAreaContainer from './containers/columns_area_container';
@@ -652,12 +652,11 @@ class UI extends PureComponent {
return (
-
-
{children}
+
{layout !== 'mobile' &&
}
{!disableHoverCards &&
}
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js
index 21dc902ae5..e6f838070c 100644
--- a/app/javascript/mastodon/features/ui/util/async-components.js
+++ b/app/javascript/mastodon/features/ui/util/async-components.js
@@ -1,315 +1,315 @@
export function EmojiPicker () {
- return import(/* webpackChunkName: "emoji_picker" */'../../emoji/emoji_picker');
+ return import('../../emoji/emoji_picker');
}
export function Compose () {
- return import(/* webpackChunkName: "features/compose" */'../../compose');
+ return import('../../compose');
}
export function Notifications () {
- return import(/* webpackChunkName: "features/notifications" */'../../notifications_v2');
+ return import('../../notifications_v2');
}
export function HomeTimeline () {
- return import(/* webpackChunkName: "features/home_timeline" */'../../home_timeline');
+ return import('../../home_timeline');
}
export function PublicTimeline () {
- return import(/* webpackChunkName: "features/public_timeline" */'../../public_timeline');
+ return import('../../public_timeline');
}
export function CommunityTimeline () {
- return import(/* webpackChunkName: "features/community_timeline" */'../../community_timeline');
+ return import('../../community_timeline');
}
export function Firehose () {
- return import(/* webpackChunkName: "features/firehose" */'../../firehose');
+ return import('../../firehose');
}
export function HashtagTimeline () {
- return import(/* webpackChunkName: "features/hashtag_timeline" */'../../hashtag_timeline');
+ return import('../../hashtag_timeline');
}
export function DirectTimeline() {
- return import(/* webpackChunkName: "features/direct_timeline" */'../../direct_timeline');
+ return import('../../direct_timeline');
}
export function AntennaTimeline () {
- return import(/* webpackChunkName: "features/antenna_timeline" */'../../antenna_timeline');
+ return import('../../antenna_timeline');
}
export function ListTimeline () {
- return import(/* webpackChunkName: "features/list_timeline" */'../../list_timeline');
+ return import('../../list_timeline');
}
export function Lists () {
- return import(/* webpackChunkName: "features/lists" */'../../lists');
+ return import('../../lists');
}
export function Antennas () {
- return import(/* webpackChunkName: "features/antennas" */'../../antennas');
+ return import('../../antennas');
}
export function Circles () {
- return import(/* webpackChunkName: "features/circles" */'../../circles');
+ return import('../../circles');
}
export function CircleStatuses () {
- return import(/* webpackChunkName: "features/circle_statuses" */'../../circle_statuses');
+ return import('../../circle_statuses');
}
export function Status () {
- return import(/* webpackChunkName: "features/status" */'../../status');
+ return import('../../status');
}
export function GettingStarted () {
- return import(/* webpackChunkName: "features/getting_started" */'../../getting_started');
+ return import('../../getting_started');
}
export function KeyboardShortcuts () {
- return import(/* webpackChunkName: "features/keyboard_shortcuts" */'../../keyboard_shortcuts');
+ return import('../../keyboard_shortcuts');
}
export function PinnedStatuses () {
- return import(/* webpackChunkName: "features/pinned_statuses" */'../../pinned_statuses');
+ return import('../../pinned_statuses');
}
export function AccountTimeline () {
- return import(/* webpackChunkName: "features/account_timeline" */'../../account_timeline');
+ return import('../../account_timeline');
}
export function AccountGallery () {
- return import(/* webpackChunkName: "features/account_gallery" */'../../account_gallery');
+ return import('../../account_gallery');
}
export function AccountFeatured() {
- return import(/* webpackChunkName: "features/account_featured" */'../../account_featured');
+ return import('../../account_featured');
}
export function Followers () {
- return import(/* webpackChunkName: "features/followers" */'../../followers');
+ return import('../../followers');
}
export function Following () {
- return import(/* webpackChunkName: "features/following" */'../../following');
+ return import('../../following');
}
export function Reblogs () {
- return import(/* webpackChunkName: "features/reblogs" */'../../reblogs');
+ return import('../../reblogs');
}
export function Favourites () {
- return import(/* webpackChunkName: "features/favourites" */'../../favourites');
+ return import('../../favourites');
}
export function EmojiReactions () {
- return import(/* webpackChunkName: "features/emoji_reactions" */'../../emoji_reactions');
+ return import('../../emoji_reactions');
}
export function StatusReferences () {
- return import(/* webpackChunkName: "features/status_references" */'../../status_references');
+ return import('../../status_references');
}
export function MentionedUsers () {
- return import(/* webpackChunkName: "features/mentioned_users" */'../../mentioned_users');
+ return import('../../mentioned_users');
}
export function FollowRequests () {
- return import(/* webpackChunkName: "features/follow_requests" */'../../follow_requests');
+ return import('../../follow_requests');
}
export function FavouritedStatuses () {
- return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited_statuses');
+ return import('../../favourited_statuses');
}
export function EmojiReactedStatuses () {
- return import(/* webpackChunkName: "features/emoji_reacted_statuses" */'../../emoji_reacted_statuses');
+ return import('../../emoji_reacted_statuses');
}
export function FollowedTags () {
- return import(/* webpackChunkName: "features/followed_tags" */'../../followed_tags');
+ return import('../../followed_tags');
}
export function BookmarkedStatuses () {
- return import(/* webpackChunkName: "features/bookmarked_statuses" */'../../bookmarked_statuses');
+ return import('../../bookmarked_statuses');
}
export function BookmarkCategories () {
- return import(/* webpackChunkName: "features/bookmark_categories" */'../../bookmark_categories');
+ return import('../../bookmark_categories');
}
export function BookmarkCategoryStatuses () {
- return import(/* webpackChunkName: "features/bookmark_category_statuses" */'../../bookmark_category_statuses');
+ return import('../../bookmark_category_statuses');
}
export function BookmarkCategoryAdder () {
- return import(/* webpackChunkName: "features/bookmark_category_adder" */'../../bookmark_category_adder');
+ return import('../../bookmark_category_adder');
}
export function Blocks () {
- return import(/* webpackChunkName: "features/blocks" */'../../blocks');
+ return import('../../blocks');
}
export function DomainBlocks () {
- return import(/* webpackChunkName: "features/domain_blocks" */'../../domain_blocks');
+ return import('../../domain_blocks');
}
export function Mutes () {
- return import(/* webpackChunkName: "features/mutes" */'../../mutes');
+ return import('../../mutes');
}
export function MuteModal () {
- return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal');
+ return import('../components/mute_modal');
}
export function BlockModal () {
- return import(/* webpackChunkName: "modals/block_modal" */'../components/block_modal');
+ return import('../components/block_modal');
}
export function DomainBlockModal () {
- return import(/* webpackChunkName: "modals/domain_block_modal" */'../components/domain_block_modal');
+ return import('../components/domain_block_modal');
}
export function ReportModal () {
- return import(/* webpackChunkName: "modals/report_modal" */'../components/report_modal');
+ return import('../components/report_modal');
}
export function IgnoreNotificationsModal () {
- return import(/* webpackChunkName: "modals/domain_block_modal" */'../components/ignore_notifications_modal');
+ return import('../components/ignore_notifications_modal');
}
export function MediaGallery () {
- return import(/* webpackChunkName: "status/media_gallery" */'../../../components/media_gallery');
+ return import('../../../components/media_gallery');
}
export function Video () {
- return import(/* webpackChunkName: "features/video" */'../../video');
+ return import('../../video');
}
export function EmbedModal () {
- return import(/* webpackChunkName: "modals/embed_modal" */'../components/embed_modal');
+ return import('../components/embed_modal');
}
export function ListAdder () {
- return import(/*webpackChunkName: "features/list_adder" */'../../list_adder');
+ return import('../../list_adder');
}
export function AntennaAdder () {
- return import(/*webpackChunkName: "features/antenna_adder" */'../../antenna_adder');
+ return import('../../antenna_adder');
}
export function CircleAdder () {
- return import(/*webpackChunkName: "features/circle_adder" */'../../circle_adder');
+ return import('../../circle_adder');
}
export function Tesseract () {
- return import(/*webpackChunkName: "tesseract" */'tesseract.js');
+ return import('tesseract.js');
}
export function Audio () {
- return import(/* webpackChunkName: "features/audio" */'../../audio');
+ return import('../../audio');
}
export function Directory () {
- return import(/* webpackChunkName: "features/directory" */'../../directory');
+ return import('../../directory');
}
export function OnboardingProfile () {
- return import(/* webpackChunkName: "features/onboarding" */'../../onboarding/profile');
+ return import('../../onboarding/profile');
}
export function OnboardingFollows () {
- return import(/* webpackChunkName: "features/onboarding" */'../../onboarding/follows');
+ return import('../../onboarding/follows');
}
export function ReactionDeck () {
- return import(/* webpackChunkName: "features/reaction_deck" */'../../reaction_deck');
+ return import('../../reaction_deck');
}
export function CompareHistoryModal () {
- return import(/*webpackChunkName: "modals/compare_history_modal" */'../components/compare_history_modal');
+ return import('../components/compare_history_modal');
}
export function Explore () {
- return import(/* webpackChunkName: "features/explore" */'../../explore');
+ return import('../../explore');
}
export function Search () {
- return import(/* webpackChunkName: "features/explore" */'../../search');
+ return import('../../search');
}
export function FilterModal () {
- return import(/*webpackChunkName: "modals/filter_modal" */'../components/filter_modal');
+ return import('../components/filter_modal');
}
export function InteractionModal () {
- return import(/*webpackChunkName: "modals/interaction_modal" */'../../interaction_modal');
+ return import('../../interaction_modal');
}
export function SubscribedLanguagesModal () {
- return import(/*webpackChunkName: "modals/subscribed_languages_modal" */'../../subscribed_languages_modal');
+ return import('../../subscribed_languages_modal');
}
export function ClosedRegistrationsModal () {
- return import(/*webpackChunkName: "modals/closed_registrations_modal" */'../../closed_registrations_modal');
+ return import('../../closed_registrations_modal');
}
export function About () {
- return import(/*webpackChunkName: "features/about" */'../../about');
+ return import('../../about');
}
export function PrivacyPolicy () {
- return import(/*webpackChunkName: "features/privacy_policy" */'../../privacy_policy');
+ return import('../../privacy_policy');
}
export function TermsOfService () {
- return import(/*webpackChunkName: "features/terms_of_service" */'../../terms_of_service');
+ return import('../../terms_of_service');
}
export function NotificationRequests () {
- return import(/*webpackChunkName: "features/notifications/requests" */'../../notifications/requests');
+ return import('../../notifications/requests');
}
export function NotificationRequest () {
- return import(/*webpackChunkName: "features/notifications/request" */'../../notifications/request');
+ return import('../../notifications/request');
}
export function LinkTimeline () {
- return import(/*webpackChunkName: "features/link_timeline" */'../../link_timeline');
+ return import('../../link_timeline');
}
export function AnnualReportModal () {
- return import(/*webpackChunkName: "modals/annual_report_modal" */'../components/annual_report_modal');
+ return import('../components/annual_report_modal');
}
export function ListEdit () {
- return import(/*webpackChunkName: "features/lists" */'../../lists/new');
+ return import('../../lists/new');
}
export function ListMembers () {
- return import(/* webpackChunkName: "features/lists" */'../../lists/members');
+ return import('../../lists/members');
}
export function AntennaEdit () {
- return import(/*webpackChunkName: "features/antennas" */'../../antennas/new');
+ return import('../../antennas/new');
}
export function AntennaMembers () {
- return import(/* webpackChunkName: "features/antennas" */'../../antennas/members');
+ return import('../../antennas/members');
}
export function AntennaSetting () {
- return import(/*webpackChunkName: "features/antennas/filtering" */'../../antennas/filtering');
+ return import('../../antennas/filtering');
}
export function CircleEdit () {
- return import(/*webpackChunkName: "features/circles" */'../../circles/new');
+ return import('../../circles/new');
}
export function CircleMembers () {
- return import(/* webpackChunkName: "features/circles" */'../../circles/members');
+ return import('../../circles/members');
}
export function BookmarkCategoryEdit () {
- return import(/*webpackChunkName: "features/bookmark_categories" */'../../bookmark_categories/new');
+ return import('../../bookmark_categories/new');
}
diff --git a/app/javascript/mastodon/features/video/index.tsx b/app/javascript/mastodon/features/video/index.tsx
index fca6fd0250..65f26cedad 100644
--- a/app/javascript/mastodon/features/video/index.tsx
+++ b/app/javascript/mastodon/features/video/index.tsx
@@ -27,11 +27,7 @@ import {
attachFullscreenListener,
detachFullscreenListener,
} from 'mastodon/features/ui/util/fullscreen';
-import {
- displayMedia,
- useBlurhash,
- reduceMotion,
-} from 'mastodon/initial_state';
+import { displayMedia, useBlurhash } from 'mastodon/initial_state';
import { playerSettings } from 'mastodon/settings';
import { HotkeyIndicator } from './components/hotkey_indicator';
@@ -260,7 +256,6 @@ export const Video: React.FC<{
setMuted(videoRef.current.muted);
void api.start({
volume: `${videoRef.current.volume * 100}%`,
- immediate: reduceMotion,
});
}
},
@@ -346,9 +341,10 @@ export const Video: React.FC<{
const updateProgress = () => {
nextFrame = requestAnimationFrame(() => {
if (videoRef.current) {
+ const progress =
+ videoRef.current.currentTime / videoRef.current.duration;
void api.start({
- progress: `${(videoRef.current.currentTime / videoRef.current.duration) * 100}%`,
- immediate: reduceMotion,
+ progress: isNaN(progress) ? '0%' : `${progress * 100}%`,
config: config.stiff,
});
}
@@ -736,7 +732,6 @@ export const Video: React.FC<{
if (lastTimeRange > -1) {
void api.start({
buffer: `${Math.ceil(videoRef.current.buffered.end(lastTimeRange) / videoRef.current.duration) * 100}%`,
- immediate: reduceMotion,
});
}
}, [api]);
@@ -751,7 +746,6 @@ export const Video: React.FC<{
void api.start({
volume: `${videoRef.current.muted ? 0 : videoRef.current.volume * 100}%`,
- immediate: reduceMotion,
});
persistVolume(videoRef.current.volume, videoRef.current.muted);
@@ -806,7 +800,7 @@ export const Video: React.FC<{
// The outer wrapper is necessary to avoid reflowing the layout when going into full screen
return (
-
{blurhash && (
@@ -845,7 +839,7 @@ export const Video: React.FC<{
title={alt}
lang={lang}
onClick={handleClick}
- onKeyDown={handleVideoKeyDown}
+ onKeyDownCapture={handleVideoKeyDown}
onPlay={handlePlay}
onPause={handlePause}
onLoadedData={handleLoadedData}
diff --git a/app/javascript/mastodon/hooks/useAccountId.ts b/app/javascript/mastodon/hooks/useAccountId.ts
index 1cc819ca59..af1c93d17d 100644
--- a/app/javascript/mastodon/hooks/useAccountId.ts
+++ b/app/javascript/mastodon/hooks/useAccountId.ts
@@ -11,27 +11,25 @@ interface Params {
id?: string;
}
-export function useAccountId() {
+export const useAccountId = () => {
const { acct, id } = useParams
();
+ const dispatch = useAppDispatch();
const accountId = useAppSelector(
(state) =>
- id ??
- (state.accounts_map.get(normalizeForLookup(acct)) as string | undefined),
+ id ?? (acct ? state.accounts_map[normalizeForLookup(acct)] : undefined),
);
-
const account = useAppSelector((state) =>
accountId ? state.accounts.get(accountId) : undefined,
);
- const isAccount = !!account;
+ const accountInStore = !!account;
- const dispatch = useAppDispatch();
useEffect(() => {
- if (!accountId) {
+ if (typeof accountId === 'undefined' && acct) {
dispatch(lookupAccount(acct));
- } else if (!isAccount) {
+ } else if (accountId && !accountInStore) {
dispatch(fetchAccount(accountId));
}
- }, [dispatch, accountId, acct, isAccount]);
+ }, [dispatch, accountId, acct, accountInStore]);
return accountId;
-}
+};
diff --git a/app/javascript/mastodon/hooks/useAccountVisibility.ts b/app/javascript/mastodon/hooks/useAccountVisibility.ts
index 55651af5a0..7ef98eef69 100644
--- a/app/javascript/mastodon/hooks/useAccountVisibility.ts
+++ b/app/javascript/mastodon/hooks/useAccountVisibility.ts
@@ -1,12 +1,14 @@
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),
+export function useAccountVisibility(accountId?: string | null) {
+ const blockedBy = useAppSelector((state) =>
+ accountId
+ ? !!state.relationships.getIn([accountId, 'blocked_by'], false)
+ : false,
);
- const suspended = useAppSelector(
- (state) => !!state.accounts.getIn([accountId, 'suspended'], false),
+ const suspended = useAppSelector((state) =>
+ accountId ? !!state.accounts.getIn([accountId, 'suspended'], false) : false,
);
const hidden = useAppSelector((state) =>
accountId ? Boolean(getAccountHidden(state, accountId)) : false,
diff --git a/app/javascript/mastodon/hooks/useAudioContext.ts b/app/javascript/mastodon/hooks/useAudioContext.ts
new file mode 100644
index 0000000000..84acf5ac7f
--- /dev/null
+++ b/app/javascript/mastodon/hooks/useAudioContext.ts
@@ -0,0 +1,62 @@
+import { useCallback, useEffect, useRef } from 'react';
+
+interface AudioContextOptions {
+ audioElementRef: React.MutableRefObject;
+}
+
+/**
+ * Create and return an audio context instance for a given audio element [0].
+ * Also returns an associated audio source, a gain node, and play and pause actions
+ * which should be used instead of `audioElementRef.current.play/pause()`.
+ *
+ * [0] https://developer.mozilla.org/en-US/docs/Web/API/AudioContext
+ */
+
+export const useAudioContext = ({ audioElementRef }: AudioContextOptions) => {
+ const audioContextRef = useRef();
+ const sourceRef = useRef();
+ const gainNodeRef = useRef();
+
+ useEffect(() => {
+ if (!audioElementRef.current) {
+ return;
+ }
+
+ const context = audioContextRef.current ?? new AudioContext();
+ const source =
+ sourceRef.current ??
+ context.createMediaElementSource(audioElementRef.current);
+
+ const gainNode = context.createGain();
+ gainNode.connect(context.destination);
+ source.connect(gainNode);
+
+ audioContextRef.current = context;
+ gainNodeRef.current = gainNode;
+ sourceRef.current = source;
+
+ return () => {
+ if (context.state !== 'closed') {
+ void context.close();
+ }
+ };
+ }, [audioElementRef]);
+
+ const playAudio = useCallback(() => {
+ void audioElementRef.current?.play();
+ void audioContextRef.current?.resume();
+ }, [audioElementRef]);
+
+ const pauseAudio = useCallback(() => {
+ audioElementRef.current?.pause();
+ void audioContextRef.current?.suspend();
+ }, [audioElementRef]);
+
+ return {
+ audioContextRef,
+ sourceRef,
+ gainNodeRef,
+ playAudio,
+ pauseAudio,
+ };
+};
diff --git a/app/javascript/mastodon/hooks/useAudioVisualizer.ts b/app/javascript/mastodon/hooks/useAudioVisualizer.ts
new file mode 100644
index 0000000000..efc0647d8d
--- /dev/null
+++ b/app/javascript/mastodon/hooks/useAudioVisualizer.ts
@@ -0,0 +1,89 @@
+import { useState, useEffect, useRef } from 'react';
+
+const normalizeFrequencies = (arr: Float32Array): number[] => {
+ return new Array(...arr).map((value: number) => {
+ if (value === -Infinity) {
+ return 0;
+ }
+
+ return Math.sqrt(1 - (Math.max(-100, Math.min(-10, value)) * -1) / 100);
+ });
+};
+
+interface AudioVisualiserOptions {
+ audioContextRef: React.MutableRefObject;
+ sourceRef: React.MutableRefObject;
+ numBands: number;
+}
+
+export const useAudioVisualizer = ({
+ audioContextRef,
+ sourceRef,
+ numBands,
+}: AudioVisualiserOptions) => {
+ const analyzerRef = useRef();
+
+ const [frequencyBands, setFrequencyBands] = useState(
+ new Array(numBands).fill(0),
+ );
+
+ useEffect(() => {
+ if (audioContextRef.current) {
+ analyzerRef.current = audioContextRef.current.createAnalyser();
+ analyzerRef.current.smoothingTimeConstant = 0.6;
+ analyzerRef.current.fftSize = 2048;
+ }
+ }, [audioContextRef]);
+
+ useEffect(() => {
+ if (analyzerRef.current && sourceRef.current) {
+ sourceRef.current.connect(analyzerRef.current);
+ }
+ const currentSource = sourceRef.current;
+
+ return () => {
+ if (currentSource && analyzerRef.current) {
+ currentSource.disconnect(analyzerRef.current);
+ }
+ };
+ }, [audioContextRef, sourceRef]);
+
+ useEffect(() => {
+ const analyzer = analyzerRef.current;
+ const context = audioContextRef.current;
+
+ if (!analyzer || !context) {
+ return;
+ }
+
+ const bufferLength = analyzer.frequencyBinCount;
+ const frequencyData = new Float32Array(bufferLength);
+
+ const updateProgress = () => {
+ analyzer.getFloatFrequencyData(frequencyData);
+
+ const normalizedFrequencies = normalizeFrequencies(
+ frequencyData.slice(100, 600),
+ );
+ const bands: number[] = [];
+ const chunkSize = Math.ceil(normalizedFrequencies.length / numBands);
+
+ for (let i = 0; i < numBands; i++) {
+ const sum = normalizedFrequencies
+ .slice(i * chunkSize, (i + 1) * chunkSize)
+ .reduce((sum, cur) => sum + cur, 0);
+ bands.push(sum / chunkSize);
+ }
+
+ setFrequencyBands(bands);
+ };
+
+ const updateInterval = setInterval(updateProgress, 15);
+
+ return () => {
+ clearInterval(updateInterval);
+ };
+ }, [numBands, audioContextRef]);
+
+ return frequencyBands;
+};
diff --git a/app/javascript/mastodon/hooks/useLayout.ts b/app/javascript/mastodon/hooks/useLayout.ts
new file mode 100644
index 0000000000..fc1cf136bf
--- /dev/null
+++ b/app/javascript/mastodon/hooks/useLayout.ts
@@ -0,0 +1,13 @@
+import type { LayoutType } from '../is_mobile';
+import { useAppSelector } from '../store';
+
+export const useLayout = () => {
+ const layout = useAppSelector(
+ (state) => state.meta.get('layout') as LayoutType,
+ );
+
+ return {
+ singleColumn: layout === 'single-column' || layout === 'mobile',
+ layout,
+ };
+};
diff --git a/app/javascript/mastodon/hooks/usePrevious.ts b/app/javascript/mastodon/hooks/usePrevious.ts
new file mode 100644
index 0000000000..95f42e2ed6
--- /dev/null
+++ b/app/javascript/mastodon/hooks/usePrevious.ts
@@ -0,0 +1,16 @@
+import { useRef, useEffect } from 'react';
+
+/**
+ * Returns the previous state of the passed in value.
+ * On first render, undefined is returned.
+ */
+
+export function usePrevious(value: T): T | undefined {
+ const ref = useRef();
+
+ useEffect(() => {
+ ref.current = value;
+ }, [value]);
+
+ return ref.current;
+}
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index d16d4d64ee..5e3ad55db9 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -2,14 +2,10 @@
/**
- * @typedef { 'blocking_quote'
- * | 'emoji_reaction_on_timeline'
+ * @typedef { 'emoji_reaction_on_timeline'
* | 'emoji_reaction_unavailable_server'
* | 'emoji_reaction_count'
* | 'favourite_menu'
- * | 'quote_in_home'
- * | 'quote_in_public'
- * | 'quote_unavailable_server'
* | 'recent_emojis'
* | 'relationships'
* | 'status_reference_unavailable_server'
diff --git a/app/javascript/mastodon/load_keyboard_extensions.js b/app/javascript/mastodon/load_keyboard_extensions.js
index 2dd0e45fa7..ebdf94561c 100644
--- a/app/javascript/mastodon/load_keyboard_extensions.js
+++ b/app/javascript/mastodon/load_keyboard_extensions.js
@@ -3,7 +3,7 @@
// can at least log in using KaiOS devices).
function importArrowKeyNavigation() {
- return import(/* webpackChunkName: "arrow-key-navigation" */ 'arrow-key-navigation');
+ return import('arrow-key-navigation');
}
export default function loadKeyboardExtensions() {
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index d930785658..c622989f14 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -18,7 +18,6 @@
"account.blocked": "Geblokkeer",
"account.cancel_follow_request": "Herroep volgversoek",
"account.disable_notifications": "Hou op om my van @{name} se plasings te laat weet",
- "account.domain_blocked": "Domein geblokkeer",
"account.edit_profile": "Redigeer profiel",
"account.enable_notifications": "Laat weet my wanneer @{name} iets plaas",
"account.endorse": "Toon op profiel",
@@ -263,7 +262,6 @@
"status.copy": "Kopieer skakel na hierdie plasing",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Brei hierdie plasing uit",
- "status.pinned": "Vasgemaakte plasing",
"status.reblog": "Stuur aan",
"status.reblog_private": "Stuur aan met oorspronklike sigbaarheid",
"status.reblogged_by": "Aangestuur deur {name}",
diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json
index 49b6f41eac..51d76474a1 100644
--- a/app/javascript/mastodon/locales/an.json
+++ b/app/javascript/mastodon/locales/an.json
@@ -19,7 +19,6 @@
"account.blocked": "Blocau",
"account.cancel_follow_request": "Retirar solicitut de seguimiento",
"account.disable_notifications": "Deixar de notificar-me quan @{name} publique bella cosa",
- "account.domain_blocked": "Dominio blocau",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificar-me quan @{name} publique bella cosa",
"account.endorse": "Amostrar en perfil",
@@ -454,7 +453,6 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir estau",
"status.pin": "Fixar",
- "status.pinned": "Publicación fixada",
"status.read_more": "Leyer mas",
"status.reblog": "Retutar",
"status.reblog_private": "Empentar con l'audiencia orichinal",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 326dd8fbc5..c51312c951 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -23,7 +23,6 @@
"account.copy": "نسخ الرابط إلى الملف الشخصي",
"account.direct": "إشارة خاصة لـ @{name}",
"account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
- "account.domain_blocked": "اسم النِّطاق محظور",
"account.edit_profile": "تعديل الملف الشخصي",
"account.enable_notifications": "أشعرني عندما ينشر @{name}",
"account.endorse": "أوصِ به على صفحتك الشخصية",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "كتم الإشعارات",
"account.mute_short": "اكتم",
"account.muted": "مَكتوم",
- "account.mutual": "متبادلة",
"account.no_bio": "لم يتم تقديم وصف.",
"account.open_original_page": "افتح الصفحة الأصلية",
"account.posts": "منشورات",
@@ -727,7 +725,6 @@
"status.mute_conversation": "كتم المحادثة",
"status.open": "وسّع هذا المنشور",
"status.pin": "دبّسه على الصفحة التعريفية",
- "status.pinned": "منشور مثبَّت",
"status.read_more": "اقرأ المزيد",
"status.reblog": "إعادة النشر",
"status.reblog_private": "إعادة النشر إلى الجمهور الأصلي",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 5edce9a4d8..f0ac646e9b 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -22,7 +22,6 @@
"account.copy": "Copiar l'enlllaz al perfil",
"account.direct": "Mentar a @{name} per privao",
"account.disable_notifications": "Dexar d'avisame cuando @{name} espublice artículos",
- "account.domain_blocked": "Dominiu bloquiáu",
"account.edit_profile": "Editar el perfil",
"account.enable_notifications": "Avisame cuando @{name} espublice artículos",
"account.endorse": "Destacar nel perfil",
@@ -531,7 +530,6 @@
"status.mute_conversation": "Desactivar los avisos de la conversación",
"status.open": "Espander esta publicación",
"status.pin": "Fixar nel perfil",
- "status.pinned": "Publicación fixada",
"status.read_more": "Lleer más",
"status.reblog": "Compartir",
"status.reblogged_by": "{name} compartió",
diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json
index 550312f31d..af07429f36 100644
--- a/app/javascript/mastodon/locales/az.json
+++ b/app/javascript/mastodon/locales/az.json
@@ -23,10 +23,11 @@
"account.copy": "Profil linkini kopyala",
"account.direct": "@{name} istifadəçisini fərdi olaraq etiketlə",
"account.disable_notifications": "@{name} paylaşım edəndə mənə bildiriş göndərməyi dayandır",
- "account.domain_blocked": "Domen bloklanıb",
+ "account.domain_blocking": "Domenin bloklanması",
"account.edit_profile": "Profili redaktə et",
"account.enable_notifications": "@{name} paylaşım edəndə mənə bildiriş göndər",
"account.endorse": "Profildə seçilmişlərə əlavə et",
+ "account.featured.hashtags": "Etiketler",
"account.featured_tags.last_status_at": "Son paylaşım {date} tarixində olub",
"account.featured_tags.last_status_never": "Paylaşım yoxdur",
"account.follow": "İzlə",
@@ -51,7 +52,6 @@
"account.mute_notifications_short": "Bildirişləri səssizləşdir",
"account.mute_short": "Səssizləşdir",
"account.muted": "Səssizləşdirilib",
- "account.mutual": "Ortaq",
"account.no_bio": "Təsvir göstərilməyib.",
"account.open_original_page": "Orijinal səhifəni aç",
"account.posts": "Paylaşım",
diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json
index 9011fdfd63..2d6f6579c4 100644
--- a/app/javascript/mastodon/locales/be.json
+++ b/app/javascript/mastodon/locales/be.json
@@ -23,7 +23,6 @@
"account.copy": "Скапіраваць спасылку на профіль",
"account.direct": "Згадаць асабіста @{name}",
"account.disable_notifications": "Не паведамляць мне пра публікацыі @{name}",
- "account.domain_blocked": "Дамен заблакаваны",
"account.edit_profile": "Рэдагаваць профіль",
"account.enable_notifications": "Апавяшчаць мяне пра допісы @{name}",
"account.endorse": "Паказваць у профілі",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Не апавяшчаць",
"account.mute_short": "Ігнараваць",
"account.muted": "Ігнаруецца",
- "account.mutual": "Узаемныя",
"account.no_bio": "Апісанне адсутнічае.",
"account.open_original_page": "Адкрыць арыгінальную старонку",
"account.posts": "Допісы",
@@ -785,7 +783,6 @@
"status.mute_conversation": "Ігнараваць размову",
"status.open": "Разгарнуць гэты допіс",
"status.pin": "Замацаваць у профілі",
- "status.pinned": "Замацаваны допіс",
"status.read_more": "Чытаць болей",
"status.reblog": "Пашырыць",
"status.reblog_private": "Пашырыць з першапачатковай бачнасцю",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 2e4c8593d4..6ffefbb553 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -19,17 +19,20 @@
"account.block_domain": "Блокиране на домейн {domain}",
"account.block_short": "Блокиране",
"account.blocked": "Блокирани",
+ "account.blocking": "Блокиране",
"account.cancel_follow_request": "Оттегляне на заявката за последване",
"account.copy": "Копиране на връзка към профила",
"account.direct": "Частно споменаване на @{name}",
"account.disable_notifications": "Спиране на известяване при публикуване от @{name}",
- "account.domain_blocked": "Блокиран домейн",
+ "account.domain_blocking": "Блокиране на домейн",
"account.edit_profile": "Редактиране на профила",
"account.enable_notifications": "Известяване при публикуване от @{name}",
"account.endorse": "Представи в профила",
+ "account.familiar_followers_one": "Последвано от {name1}",
+ "account.familiar_followers_two": "Последвано от {name1} и {name2}",
"account.featured": "Препоръчано",
+ "account.featured.accounts": "Профили",
"account.featured.hashtags": "Хаштагове",
- "account.featured.posts": "Публикации",
"account.featured_tags.last_status_at": "Последна публикация на {date}",
"account.featured_tags.last_status_never": "Няма публикации",
"account.follow": "Последване",
@@ -40,6 +43,7 @@
"account.following": "Последвано",
"account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
"account.follows.empty": "Потребителят още никого не следва.",
+ "account.follows_you": "Следва ви",
"account.go_to_profile": "Към профила",
"account.hide_reblogs": "Скриване на подсилвания от @{name}",
"account.in_memoriam": "В памет на.",
@@ -54,14 +58,17 @@
"account.mute_notifications_short": "Заглушаване на известията",
"account.mute_short": "Заглушаване",
"account.muted": "Заглушено",
- "account.mutual": "Взаимни",
+ "account.muting": "Заглушаване",
+ "account.mutual": "Взаимно се следвате",
"account.no_bio": "Няма представен опис.",
"account.open_original_page": "Отваряне на първообразната страница",
"account.posts": "Публикации",
"account.posts_with_replies": "Публ. и отговори",
+ "account.remove_from_followers": "Премахване на {name} от последователи",
"account.report": "Докладване на @{name}",
"account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване",
"account.requested_follow": "{name} поиска да ви последва",
+ "account.requests_to_follow_you": "Заявки да ви последват",
"account.share": "Споделяне на профила на @{name}",
"account.show_reblogs": "Показване на подсилвания от @{name}",
"account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
@@ -229,6 +236,9 @@
"confirmations.redraft.confirm": "Изтриване и преработване",
"confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.",
"confirmations.redraft.title": "Изтривате и преработвате ли публикацията?",
+ "confirmations.remove_from_followers.confirm": "Премахване на последовател",
+ "confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?",
+ "confirmations.remove_from_followers.title": "Премахвате ли последовател?",
"confirmations.reply.confirm": "Отговор",
"confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?",
"confirmations.reply.title": "Презаписвате ли публикацията?",
@@ -296,7 +306,7 @@
"emoji_button.search_results": "Резултати от търсене",
"emoji_button.symbols": "Символи",
"emoji_button.travel": "Пътуване и места",
- "empty_column.account_featured": "Списъкът е празен",
+ "empty_column.account_featured_other.unknown": "Този акаунт още не е отличил нищо.",
"empty_column.account_hides_collections": "Този потребител е избрал да не дава тази информация",
"empty_column.account_suspended": "Спрян акаунт",
"empty_column.account_timeline": "Тук няма публикации!",
@@ -502,7 +512,6 @@
"lists.exclusive": "Скриване на членуващи в Начало",
"lists.exclusive_hint": "Ако някой е в този списък, то скрийте го в инфоканала си на Начало, за да избегнете виждането на публикациите му два пъти.",
"lists.find_users_to_add": "Намерете потребители за добавяне",
- "lists.list_members": "Списък членуващи",
"lists.list_members_count": "{count, plural, one {# членуващ} other {# членуващи}}",
"lists.list_name": "Име на списък",
"lists.new_list_name": "Ново име на списък",
@@ -848,7 +857,6 @@
"status.mute_conversation": "Заглушаване на разговора",
"status.open": "Разширяване на публикацията",
"status.pin": "Закачане в профила",
- "status.pinned": "Закачена публикация",
"status.read_more": "Още за четене",
"status.reblog": "Подсилване",
"status.reblog_private": "Подсилване с оригиналната видимост",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index ec0f4eb447..f4e71d9cc9 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -23,7 +23,6 @@
"account.copy": "অবতারের সংযোগ অনুলিপি করো",
"account.direct": "গোপনে মেনশন করুন @{name}",
"account.disable_notifications": "আমাকে জানানো বন্ধ করো যখন @{name} পোস্ট করবে",
- "account.domain_blocked": "ডোমেইন ব্লক করা",
"account.edit_profile": "প্রোফাইল সম্পাদনা করুন",
"account.enable_notifications": "আমাকে জানাবে যখন @{name} পোস্ট করবে",
"account.endorse": "প্রোফাইলে ফিচার করুন",
@@ -391,7 +390,6 @@
"status.mute_conversation": "কথোপকথননের প্রজ্ঞাপন সরিয়ে ফেলতে",
"status.open": "এটার সম্পূর্ণটা দেখতে",
"status.pin": "নিজের পাতায় এটা পিন করতে",
- "status.pinned": "পিন করা টুট",
"status.read_more": "আরো পড়ুন",
"status.reblog": "সমর্থন দিতে",
"status.reblog_private": "আপনার অনুসরণকারীদের কাছে এটার সমর্থন দেখাতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 51e3723d19..49d15f9cba 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servijerioù evezhiet",
"about.contact": "Darempred :",
+ "about.default_locale": "Dre ziouer",
"about.disclaimer": "Mastodon zo ur meziant frank, open-source hag ur merk marilhet eus Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Abeg dihegerz",
"about.domain_blocks.preamble": "Gant Mastodon e c'hellit gwelet danvez hag eskemm gant implijerien·ezed eus forzh peseurt servijer er fedibed peurliesañ. Setu an nemedennoù a zo bet graet evit ar servijer-mañ e-unan.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Bevennet",
"about.domain_blocks.suspended.explanation": "Roadenn ebet eus ar servijer-mañ ne vo keweriet, kadavet pe eskemmet, ar pezh a lako an etreweriañ pe ar c'hehentiñ gant implijerien adalek ar servijer-mañ dibosupl.",
"about.domain_blocks.suspended.title": "Astalet",
+ "about.language_label": "Yezh",
"about.not_available": "An titour-mañ ne c'heller ket gwelet war ar servijer-mañ.",
"about.powered_by": "Rouedad sokial digreizenned kaset gant {mastodon}",
"about.rules": "Reolennoù ar servijer",
@@ -22,10 +24,11 @@
"account.copy": "Eilañ al liamm war-zu ho profil",
"account.direct": "Menegiñ @{name} ent-prevez",
"account.disable_notifications": "Paouez d'am c'hemenn pa vez embannet traoù gant @{name}",
- "account.domain_blocked": "Domani stanket",
"account.edit_profile": "Kemmañ ar profil",
"account.enable_notifications": "Ma c'hemenn pa vez embannet traoù gant @{name}",
"account.endorse": "Lakaat war-wel war ar profil",
+ "account.familiar_followers_one": "Heuilhet gant {name1}",
+ "account.familiar_followers_two": "Heuilhet gant {name1} ha {name2}",
"account.featured_tags.last_status_at": "Toud diwezhañ : {date}",
"account.featured_tags.last_status_never": "Embannadur ebet",
"account.follow": "Heuliañ",
@@ -33,6 +36,7 @@
"account.followers": "Tud koumanantet",
"account.followers.empty": "Den na heul an implijer·ez-mañ c'hoazh.",
"account.followers_counter": "{count, plural, one {{counter} heulier} two {{counter} heulier} few {{counter} heulier} many {{counter} heulier} other {{counter} heulier}}",
+ "account.followers_you_know_counter": "{counter} a anavezit",
"account.following": "Koumanantoù",
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
"account.go_to_profile": "Gwelet ar profil",
@@ -244,6 +248,10 @@
"explore.trending_links": "Keleier",
"explore.trending_statuses": "Embannadurioù",
"explore.trending_tags": "Hashtagoù",
+ "featured_carousel.next": "War-raok",
+ "featured_carousel.post": "Embannadenn",
+ "featured_carousel.previous": "War-gil",
+ "featured_carousel.slide": "{index} diwar {total}",
"filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !",
"filter_modal.added.expired_title": "Sil deuet d'e dermen !",
"filter_modal.added.review_and_configure_title": "Arventennoù ar sil",
@@ -293,6 +301,7 @@
"hashtag.follow": "Heuliañ ar ger-klik",
"hashtag.unfollow": "Paouez heuliañ an hashtag",
"hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}",
+ "home.column_settings.show_quotes": "Diskouez an arroudennoù",
"home.column_settings.show_reblogs": "Diskouez ar skignadennoù",
"home.column_settings.show_replies": "Diskouez ar respontoù",
"home.hide_announcements": "Kuzhat ar c'hemennoù",
@@ -580,7 +589,7 @@
"status.mute_conversation": "Kuzhat ar gaozeadenn",
"status.open": "Digeriñ ar c'hannad-mañ",
"status.pin": "Spilhennañ d'ar profil",
- "status.pinned": "Toud spilhennet",
+ "status.quote_post_author": "Embannadenn gant {name}",
"status.read_more": "Lenn muioc'h",
"status.reblog": "Skignañ",
"status.reblog_private": "Skignañ gant ar weledenn gentañ",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 60e3066d0e..9d1fdbabae 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidors moderats",
"about.contact": "Contacte:",
+ "about.default_locale": "Per defecte",
"about.disclaimer": "Mastodon és programari lliure de codi obert i una marca comercial de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "No es disposa del motiu",
"about.domain_blocks.preamble": "En general, Mastodon permet de veure el contingut i interaccionar amb els usuaris de qualsevol altre servidor del fedivers. Aquestes són les excepcions d'aquest servidor en particular.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitat",
"about.domain_blocks.suspended.explanation": "No es processaran, emmagatzemaran ni intercanviaran dades d'aquest servidor, fent impossible qualsevol interacció o comunicació amb els seus usuaris.",
"about.domain_blocks.suspended.title": "Suspès",
+ "about.language_label": "Idioma",
"about.not_available": "Aquesta informació no és disponible en aquest servidor.",
"about.powered_by": "Xarxa social descentralitzada impulsada per {mastodon}",
"about.rules": "Normes del servidor",
@@ -19,17 +21,21 @@
"account.block_domain": "Bloca el domini {domain}",
"account.block_short": "Bloca",
"account.blocked": "Blocat",
+ "account.blocking": "Blocat",
"account.cancel_follow_request": "Cancel·la el seguiment",
"account.copy": "Copia l'enllaç al perfil",
"account.direct": "Menciona privadament @{name}",
"account.disable_notifications": "Deixa de notificar-me els tuts de @{name}",
- "account.domain_blocked": "Domini blocat",
+ "account.domain_blocking": "Bloquem el domini",
"account.edit_profile": "Edita el perfil",
"account.enable_notifications": "Notifica'm els tuts de @{name}",
"account.endorse": "Recomana en el perfil",
+ "account.familiar_followers_many": "Seguit per {name1}, {name2} i {othersCount, plural, one {# altre compte} other {# altres comptes}} que coneixeu",
+ "account.familiar_followers_one": "Seguit per {name1}",
+ "account.familiar_followers_two": "Seguit per {name1} i {name2}",
"account.featured": "Destacat",
+ "account.featured.accounts": "Perfils",
"account.featured.hashtags": "Etiquetes",
- "account.featured.posts": "Publicacions",
"account.featured_tags.last_status_at": "Darrer tut el {date}",
"account.featured_tags.last_status_never": "No hi ha tuts",
"account.follow": "Segueix",
@@ -37,16 +43,18 @@
"account.followers": "Seguidors",
"account.followers.empty": "A aquest usuari encara no el segueix ningú.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidors}}",
+ "account.followers_you_know_counter": "{counter} que coneixeu",
"account.following": "Seguint",
"account.following_counter": "{count, plural, other {Seguint-ne {counter}}}",
"account.follows.empty": "Aquest usuari encara no segueix ningú.",
+ "account.follows_you": "Us segueix",
"account.go_to_profile": "Vés al perfil",
"account.hide_reblogs": "Amaga els impulsos de @{name}",
"account.in_memoriam": "En Memòria.",
"account.joined_short": "S'hi va unir",
"account.languages": "Canvia les llengües subscrites",
"account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
- "account.locked_info": "L'estat de privadesa del compte està definit com a blocat. El propietari revisa manualment qui pot seguir-lo.",
+ "account.locked_info": "L'estat de privacitat del compte està definit com a blocat. El propietari revisa manualment qui pot seguir-lo.",
"account.media": "Contingut",
"account.mention": "Menciona @{name}",
"account.moved_to": "{name} ha indicat que el seu nou compte és:",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silencia les notificacions",
"account.mute_short": "Silencia",
"account.muted": "Silenciat",
- "account.mutual": "Mutu",
+ "account.muting": "Silenciem",
+ "account.mutual": "Us seguiu l'un a l'altre",
"account.no_bio": "No s'ha proporcionat cap descripció.",
"account.open_original_page": "Obre la pàgina original",
"account.posts": "Tuts",
"account.posts_with_replies": "Tuts i respostes",
+ "account.remove_from_followers": "Elimina {name} dels seguidors",
"account.report": "Informa sobre @{name}",
"account.requested": "S'espera l'aprovació. Clica per a cancel·lar la petició de seguiment",
"account.requested_follow": "{name} ha demanat de seguir-te",
+ "account.requests_to_follow_you": "Peticions de seguir-vos",
"account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicació} other {{counter} publicacions}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Esborra i reescriu",
"confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.",
"confirmations.redraft.title": "Esborrar i reescriure la publicació?",
+ "confirmations.remove_from_followers.confirm": "Elimina el seguidor",
+ "confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?",
+ "confirmations.remove_from_followers.title": "Eliminem el seguidor?",
"confirmations.reply.confirm": "Respon",
"confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?",
"confirmations.reply.title": "Sobreescriure la publicació?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Resultats de la cerca",
"emoji_button.symbols": "Símbols",
"emoji_button.travel": "Viatges i llocs",
- "empty_column.account_featured": "Aquesta llista està buida",
+ "empty_column.account_featured.me": "Encara no heu destacat res. Sabeu que podeu destacar les etiquetes que més feu servir i fins i tot els comptes dels vostres amics al vostre perfil?",
+ "empty_column.account_featured.other": "{acct} encara no ha destacat res. Sabeu que podeu destacar les etiquetes que més feu servir i fins i tot els comptes dels vostres amics al vostre perfil?",
+ "empty_column.account_featured_other.unknown": "Aquest compte no ha destacat encara res.",
"empty_column.account_hides_collections": "Aquest usuari ha decidit no mostrar aquesta informació",
"empty_column.account_suspended": "Compte suspès",
"empty_column.account_timeline": "No hi ha tuts aquí!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Notícies",
"explore.trending_statuses": "Tuts",
"explore.trending_tags": "Etiquetes",
+ "featured_carousel.header": "{count, plural, one {Publicació fixada} other {Publicacions fixades}}",
+ "featured_carousel.next": "Següent",
+ "featured_carousel.post": "Publicació",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquest tut. Si també vols que el tut es filtri en aquest context, hauràs d'editar el filtre.",
"filter_modal.added.context_mismatch_title": "El context no coincideix!",
"filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.",
@@ -381,6 +402,8 @@
"generic.saved": "Desat",
"getting_started.heading": "Primeres passes",
"hashtag.admin_moderation": "Obre la interfície de moderació per a #{name}",
+ "hashtag.browse": "Fulleja publicacions a #{hashtag}",
+ "hashtag.browse_from_account": "Fulleja publicacions de {name} a #{hashtag}",
"hashtag.column_header.tag_mode.all": "i {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sense {additional}",
@@ -393,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} tut} other {{counter} tuts}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} avui",
+ "hashtag.feature": "Destaca al perfil",
"hashtag.follow": "Segueix l'etiqueta",
"hashtag.mute": "Silencia #{hashtag}",
+ "hashtag.unfeature": "No destaquis al perfil",
"hashtag.unfollow": "Deixa de seguir l'etiqueta",
"hashtags.and_other": "…i {count, plural, other {# més}}",
"hints.profiles.followers_may_be_missing": "Es poden haver perdut seguidors d'aquest perfil.",
@@ -405,6 +430,7 @@
"hints.profiles.see_more_posts": "Vegeu més publicacions a {domain}",
"hints.threads.replies_may_be_missing": "Es poden haver perdut respostes d'altres servidors.",
"hints.threads.see_more": "Vegeu més respostes a {domain}",
+ "home.column_settings.show_quotes": "Mostrar les cites",
"home.column_settings.show_reblogs": "Mostra els impulsos",
"home.column_settings.show_replies": "Mostra les respostes",
"home.hide_announcements": "Amaga els anuncis",
@@ -499,7 +525,6 @@
"lists.exclusive": "Amaga membres a Inici",
"lists.exclusive_hint": "Si algú és a la llista, amagueu-los de la pantalla d'inici, per a no veure'n les publicacions duplicades.",
"lists.find_users_to_add": "Troba usuaris per a afegir",
- "lists.list_members": "Membres de la llista",
"lists.list_members_count": "{count, plural, one {# membre} other {# membres}}",
"lists.list_name": "Nom de la llista",
"lists.new_list_name": "Nom de la nova llista",
@@ -710,7 +735,7 @@
"privacy.unlisted.long": "Menys fanfàrries algorísmiques",
"privacy.unlisted.short": "Públic silenciós",
"privacy_policy.last_updated": "Darrera actualització {date}",
- "privacy_policy.title": "Política de privadesa",
+ "privacy_policy.title": "Política de Privacitat",
"recommended": "Recomanat",
"refresh": "Actualitza",
"regeneration_indicator.please_stand_by": "Espereu.",
@@ -845,7 +870,13 @@
"status.mute_conversation": "Silencia la conversa",
"status.open": "Amplia el tut",
"status.pin": "Fixa en el perfil",
- "status.pinned": "Tut fixat",
+ "status.quote_error.filtered": "No es mostra a causa d'un dels vostres filtres",
+ "status.quote_error.not_found": "No es pot mostrar aquesta publicació.",
+ "status.quote_error.pending_approval": "Aquesta publicació està pendent d'aprovació per l'autor original.",
+ "status.quote_error.rejected": "No es pot mostrar aquesta publicació perquè l'autor original no en permet la citació.",
+ "status.quote_error.removed": "Aquesta publicació ha estat eliminada per l'autor.",
+ "status.quote_error.unauthorized": "No es pot mostrar aquesta publicació perquè no teniu autorització per a veure-la.",
+ "status.quote_post_author": "Publicació de {name}",
"status.read_more": "Més informació",
"status.reblog": "Impulsa",
"status.reblog_private": "Impulsa amb la visibilitat original",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index 31f2dbbc11..28308ac833 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -22,7 +22,6 @@
"account.copy": "ڕوونووسی بەستەر بۆ توت",
"account.direct": "بە شێوەیەکی تایبەت باسی @{name} بکە",
"account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
- "account.domain_blocked": "دۆمەین قەپاتکرا",
"account.edit_profile": "دەستکاری پرۆفایل",
"account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
"account.endorse": "ناساندن لە پرۆفایل",
@@ -48,7 +47,6 @@
"account.mute_notifications_short": "پاڵ بە ئاگادارکردنەوەکانەوە بنێ",
"account.mute_short": "بێدەنگ",
"account.muted": "بێ دەنگ",
- "account.mutual": "دوولایەنە",
"account.no_bio": "هیچ وەسفێک نەخراوەتەڕوو.",
"account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە",
"account.posts": "نووسراوەکان",
@@ -511,7 +509,6 @@
"status.mute_conversation": "بێدەنگی بکە",
"status.open": "ئەم توتە فراوان بکە",
"status.pin": "لکاندن لەسەر پرۆفایل",
- "status.pinned": "توتی چەسپکراو",
"status.read_more": "زیاتر بخوێنەوە",
"status.reblog": "بەهێزکردن",
"status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index c61b8484b4..38984cd4b5 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -7,7 +7,6 @@
"account.blocked": "Bluccatu",
"account.cancel_follow_request": "Withdraw follow request",
"account.disable_notifications": "Ùn mi nutificate più quandu @{name} pubblica qualcosa",
- "account.domain_blocked": "Duminiu piattatu",
"account.edit_profile": "Mudificà u prufile",
"account.enable_notifications": "Nutificate mi quandu @{name} pubblica qualcosa",
"account.endorse": "Fà figurà nant'à u prufilu",
@@ -298,7 +297,6 @@
"status.mute_conversation": "Piattà a cunversazione",
"status.open": "Apre stu statutu",
"status.pin": "Puntarulà à u prufile",
- "status.pinned": "Statutu puntarulatu",
"status.read_more": "Leghje di più",
"status.reblog": "Sparte",
"status.reblog_private": "Sparte à l'audienza uriginale",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 0d8653d412..cfc2591276 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderované servery",
"about.contact": "Kontakt:",
+ "about.default_locale": "Výchozí",
"about.disclaimer": "Mastodon je svobodný software s otevřeným zdrojovým kódem a ochranná známka společnosti Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Důvod není k dispozici",
"about.domain_blocks.preamble": "Mastodon umožňuje prohlížet obsah a komunikovat s uživateli jakéhokoliv serveru ve fediversu. Pro tento konkrétní server se vztahují následující výjimky.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Omezeno",
"about.domain_blocks.suspended.explanation": "Žádná data z tohoto serveru nebudou zpracovávána, uložena ani vyměňována, což znemožňuje jakoukoli interakci nebo komunikaci s uživateli z tohoto serveru.",
"about.domain_blocks.suspended.title": "Pozastaveno",
+ "about.language_label": "Jazyk",
"about.not_available": "Tato informace nebyla zpřístupněna na tomto serveru.",
"about.powered_by": "Decentralizovaná sociální média poháněná {mastodon}",
"about.rules": "Pravidla serveru",
@@ -19,17 +21,21 @@
"account.block_domain": "Blokovat doménu {domain}",
"account.block_short": "Zablokovat",
"account.blocked": "Blokovaný",
+ "account.blocking": "Blokovaní",
"account.cancel_follow_request": "Zrušit sledování",
"account.copy": "Kopírovat odkaz na profil",
"account.direct": "Soukromě zmínit @{name}",
"account.disable_notifications": "Přestat mě upozorňovat, když @{name} zveřejní příspěvek",
- "account.domain_blocked": "Doména blokována",
+ "account.domain_blocking": "Blokované domény",
"account.edit_profile": "Upravit profil",
"account.enable_notifications": "Oznamovat mi příspěvky @{name}",
"account.endorse": "Zvýraznit na profilu",
- "account.featured": "Doporučené",
+ "account.familiar_followers_many": "Sleduje je {name1}, {name2} a {othersCount, plural, one {jeden další, které znáte} few {# další, které znáte} many {# dalších, které znáte} other {# dalších, které znáte}}",
+ "account.familiar_followers_one": "Sleduje je {name1}",
+ "account.familiar_followers_two": "Sleduje je {name1} a {name2}",
+ "account.featured": "Zvýrazněné",
+ "account.featured.accounts": "Profily",
"account.featured.hashtags": "Hashtagy",
- "account.featured.posts": "Příspěvky",
"account.featured_tags.last_status_at": "Poslední příspěvek {date}",
"account.featured_tags.last_status_never": "Žádné příspěvky",
"account.follow": "Sledovat",
@@ -37,9 +43,11 @@
"account.followers": "Sledující",
"account.followers.empty": "Tohoto uživatele zatím nikdo nesleduje.",
"account.followers_counter": "{count, plural, one {{counter} sledující} few {{counter} sledující} many {{counter} sledujících} other {{counter} sledujících}}",
+ "account.followers_you_know_counter": "{count, one {{counter}, kterého znáte}, few {{counter}, které znáte}, many {{counter}, kterých znáte} other {{counter}, kterých znáte}}",
"account.following": "Sledujete",
"account.following_counter": "{count, plural, one {{counter} sledovaný} few {{counter} sledovaní} many {{counter} sledovaných} other {{counter} sledovaných}}",
"account.follows.empty": "Tento uživatel zatím nikoho nesleduje.",
+ "account.follows_you": "Sleduje vás",
"account.go_to_profile": "Přejít na profil",
"account.hide_reblogs": "Skrýt boosty od @{name}",
"account.in_memoriam": "In Memoriam.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Ztlumit upozornění",
"account.mute_short": "Ztlumit",
"account.muted": "Skrytý",
- "account.mutual": "Vzájemné",
+ "account.muting": "Ztlumení",
+ "account.mutual": "Sledujete se navzájem",
"account.no_bio": "Nebyl poskytnut žádný popis.",
"account.open_original_page": "Otevřít původní stránku",
"account.posts": "Příspěvky",
"account.posts_with_replies": "Příspěvky a odpovědi",
+ "account.remove_from_followers": "Odebrat {name} ze sledujících",
"account.report": "Nahlásit @{name}",
"account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
"account.requested_follow": "{name} tě požádal o sledování",
+ "account.requests_to_follow_you": "Žádosti o sledování",
"account.share": "Sdílet profil @{name}",
"account.show_reblogs": "Zobrazit boosty od @{name}",
"account.statuses_counter": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Smazat a přepsat",
"confirmations.redraft.message": "Jste si jistí, že chcete odstranit tento příspěvek a vytvořit z něj koncept? Oblíbené a boosty budou ztraceny a odpovědi na původní příspěvek ztratí kontext.",
"confirmations.redraft.title": "Smazat a přepracovat příspěvek na koncept?",
+ "confirmations.remove_from_followers.confirm": "Odstranit sledujícího",
+ "confirmations.remove_from_followers.message": "{name} vás přestane sledovat. Jste si jisti, že chcete pokračovat?",
+ "confirmations.remove_from_followers.title": "Odstranit sledujícího?",
"confirmations.reply.confirm": "Odpovědět",
"confirmations.reply.message": "Odpověď přepíše vaši rozepsanou zprávu. Opravdu chcete pokračovat?",
"confirmations.reply.title": "Přepsat příspěvek?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Výsledky hledání",
"emoji_button.symbols": "Symboly",
"emoji_button.travel": "Cestování a místa",
- "empty_column.account_featured": "Tento seznam je prázdný",
+ "empty_column.account_featured.me": "Zatím jste nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?",
+ "empty_column.account_featured.other": "{acct} zatím nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?",
+ "empty_column.account_featured_other.unknown": "Tento účet zatím nemá nic zvýrazněného.",
"empty_column.account_hides_collections": "Tento uživatel se rozhodl tuto informaci nezveřejňovat",
"empty_column.account_suspended": "Účet je pozastaven",
"empty_column.account_timeline": "Nejsou tu žádné příspěvky!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Zprávy",
"explore.trending_statuses": "Příspěvky",
"explore.trending_tags": "Hashtagy",
+ "featured_carousel.header": "{count, plural, one {{counter} zvýrazněný příspěvek} few {{counter} zvýrazněné příspěvky} many {{counter} zvýrazněných příspěvků} other {{counter} zvýrazněných příspěvků}}",
+ "featured_carousel.next": "Další",
+ "featured_carousel.post": "Příspěvek",
+ "featured_carousel.previous": "Předchozí",
+ "featured_carousel.slide": "{index} z {total}",
"filter_modal.added.context_mismatch_explanation": "Tato kategorie filtrů se nevztahuje na kontext, ve kterém jste tento příspěvek otevřeli. Pokud chcete, aby byl příspěvek filtrován i v tomto kontextu, budete muset filtr upravit.",
"filter_modal.added.context_mismatch_title": "Kontext se neshoduje!",
"filter_modal.added.expired_explanation": "Tato kategorie filtrů vypršela, budete muset změnit datum vypršení platnosti, aby mohla být použita.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník*ice} few {{counter} účastníci} other {{counter} účastníků}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
"hashtag.counter_by_uses_today": "Dnes {count, plural, one {{counter} příspěvek} few {{counter} příspěvky} other {{counter} příspěvků}}",
+ "hashtag.feature": "Zvýraznit na profilu",
"hashtag.follow": "Sledovat hashtag",
"hashtag.mute": "Skrýt #{hashtag}",
+ "hashtag.unfeature": "Nezvýrazňovat na profilu",
"hashtag.unfollow": "Přestat sledovat hashtag",
"hashtags.and_other": "…a {count, plural, one {# další} few {# další} other {# dalších}}",
"hints.profiles.followers_may_be_missing": "Sledující mohou pro tento profil chybět.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Zobrazit další příspěvky na {domain}",
"hints.threads.replies_may_be_missing": "Odpovědi z jiných serverů mohou chybět.",
"hints.threads.see_more": "Zobrazit další odpovědi na {domain}",
+ "home.column_settings.show_quotes": "Zobrazit citace",
"home.column_settings.show_reblogs": "Zobrazit boosty",
"home.column_settings.show_replies": "Zobrazit odpovědi",
"home.hide_announcements": "Skrýt oznámení",
@@ -502,7 +526,6 @@
"lists.exclusive": "Skrýt členy na domovském kanálu",
"lists.exclusive_hint": "Pokud je někdo na tomto seznamu, skryjte jej ve vašem domovském kanálu, abyste se vyhnuli dvojímu vidění jejich příspěvků.",
"lists.find_users_to_add": "Najít uživatele, které chcete přidat",
- "lists.list_members": "Členové seznamu",
"lists.list_members_count": "{count, plural, one {# člen} few {# členové} many {# členů} other {# členů}}",
"lists.list_name": "Název seznamu",
"lists.new_list_name": "Název nového seznamu",
@@ -668,7 +691,7 @@
"notifications.policy.filter_not_followers_title": "Lidé, kteří vás nesledují",
"notifications.policy.filter_not_following_hint": "Dokud je ručně neschválíte",
"notifications.policy.filter_not_following_title": "Lidé, které nesledujete",
- "notifications.policy.filter_private_mentions_hint": "Vyfiltrováno, pokud to není odpověď na vaši zmínku nebo pokud sledujete odesílatele",
+ "notifications.policy.filter_private_mentions_hint": "Filtrováno, pokud to není v odpovědi na vaši vlastní zmínku nebo pokud nesledujete odesílatele",
"notifications.policy.filter_private_mentions_title": "Nevyžádané soukromé zmínky",
"notifications.policy.title": "Spravovat oznámení od…",
"notifications_permission_banner.enable": "Povolit oznámení na ploše",
@@ -729,7 +752,7 @@
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "dnes",
- "reply_indicator.attachments": "{count, plural, one {{counter} příloha} few {{counter} přílohy} other {{counter} přilohů}}",
+ "reply_indicator.attachments": "{count, plural, one {{counter} příloha} few {{counter} přílohy} other {{counter} příloh}}",
"reply_indicator.cancel": "Zrušit",
"reply_indicator.poll": "Anketa",
"report.block": "Blokovat",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Skrýt konverzaci",
"status.open": "Rozbalit tento příspěvek",
"status.pin": "Připnout na profil",
- "status.pinned": "Připnutý příspěvek",
+ "status.quote_error.filtered": "Skryté kvůli jednomu z vašich filtrů",
+ "status.quote_error.not_found": "Tento příspěvek nelze zobrazit.",
+ "status.quote_error.pending_approval": "Tento příspěvek čeká na schválení od původního autora.",
+ "status.quote_error.rejected": "Tento příspěvek nemůže být zobrazen, protože původní autor neumožňuje, aby byl citován.",
+ "status.quote_error.removed": "Tento příspěvek byl odstraněn jeho autorem.",
+ "status.quote_error.unauthorized": "Tento příspěvek nelze zobrazit, protože nemáte oprávnění k jeho zobrazení.",
+ "status.quote_post_author": "Příspěvek od {name}",
"status.read_more": "Číst více",
"status.reblog": "Boostnout",
"status.reblog_private": "Boostnout s původní viditelností",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 3bf10be7fb..769eecb1d4 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -1,45 +1,53 @@
{
"about.blocks": "Gweinyddion wedi'u cymedroli",
"about.contact": "Cysylltwch â:",
+ "about.default_locale": "Rhagosodedig",
"about.disclaimer": "Mae Mastodon yn feddalwedd cod agored rhydd ac o dan hawlfraint Mastodon gGmbH.",
- "about.domain_blocks.no_reason_available": "Nid yw'r rheswm ar gael",
+ "about.domain_blocks.no_reason_available": "Dyw'r rheswm ddim ar gael",
"about.domain_blocks.preamble": "Fel rheol, mae Mastodon yn caniatáu i chi weld cynnwys gan unrhyw weinyddwr arall yn y ffedysawd a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn.",
"about.domain_blocks.silenced.explanation": "Fel rheol, fyddwch chi ddim yn gweld proffiliau a chynnwys o'r gweinydd hwn, oni bai eich bod yn chwilio'n benodol amdano neu yn ymuno drwy ei ddilyn.",
"about.domain_blocks.silenced.title": "Cyfyngedig",
- "about.domain_blocks.suspended.explanation": "Ni fydd data o'r gweinydd hwn yn cael ei brosesu, ei gadw na'i gyfnewid, gan wneud unrhyw ryngweithio neu gyfathrebu gyda defnyddwyr o'r gweinydd hwn yn amhosibl.",
- "about.domain_blocks.suspended.title": "Ataliwyd",
- "about.not_available": "Nid yw'r wybodaeth hon ar gael ar y gweinydd hwn.",
+ "about.domain_blocks.suspended.explanation": "Fydd data o'r gweinydd hwn ddim yn cael ei brosesu, ei gadw na'i gyfnewid, gan wneud unrhyw ryngweithio neu gyfathrebu gyda defnyddwyr o'r gweinydd hwn yn amhosibl.",
+ "about.domain_blocks.suspended.title": "Wedi'i atal",
+ "about.language_label": "Iaith",
+ "about.not_available": "Dyw'r wybodaeth yma heb ei wneud ar gael ar y gweinydd hwn.",
"about.powered_by": "Cyfrwng cymdeithasol datganoledig wedi ei yrru gan {mastodon}",
"about.rules": "Rheolau'r gweinydd",
"account.account_note_header": "Nodyn personol",
"account.add_or_remove_from_list": "Ychwanegu neu Ddileu o'r rhestrau",
"account.badges.bot": "Awtomataidd",
"account.badges.group": "Grŵp",
- "account.block": "Blocio @{name}",
- "account.block_domain": "Blocio'r parth {domain}",
- "account.block_short": "Blocio",
- "account.blocked": "Blociwyd",
+ "account.block": "Rhwystro @{name}",
+ "account.block_domain": "Rhwystro'r parth {domain}",
+ "account.block_short": "Rhwystro",
+ "account.blocked": "Wedi'i rwystro",
+ "account.blocking": "Yn Rhwystro",
"account.cancel_follow_request": "Tynnu cais i ddilyn",
"account.copy": "Copïo dolen i'r proffil",
"account.direct": "Crybwyll yn breifat @{name}",
"account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio",
- "account.domain_blocked": "Parth wedi'i rwystro",
- "account.edit_profile": "Golygu proffil",
+ "account.domain_blocking": "Parthau'n cael eu rhwystro",
+ "account.edit_profile": "Golygu'r proffil",
"account.enable_notifications": "Rhowch wybod i fi pan fydd @{name} yn postio",
"account.endorse": "Dangos ar fy mhroffil",
- "account.featured": "Dethol",
+ "account.familiar_followers_many": "Yn cael ei ddilyn gan {name1},{name2}, a {othersCount, plural, one {one other you know} other{# others you know}}",
+ "account.familiar_followers_one": "Wedi'i ddilyn gan {name1}",
+ "account.familiar_followers_two": "Wedi'i ddilyn gan {name1} a {name2}",
+ "account.featured": "Nodwedd",
+ "account.featured.accounts": "Proffilau",
"account.featured.hashtags": "Hashnodau",
- "account.featured.posts": "Postiadau",
"account.featured_tags.last_status_at": "Y postiad olaf ar {date}",
"account.featured_tags.last_status_never": "Dim postiadau",
"account.follow": "Dilyn",
"account.follow_back": "Dilyn nôl",
"account.followers": "Dilynwyr",
"account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.",
- "account.followers_counter": "{count, plural, one {{counter} dilynwr} two {{counter} ddilynwr} other {{counter} dilynwyr}}",
+ "account.followers_counter": "{count, plural, one {{counter} dilynwr} two {{counter} ddilynwr} other {{counter} dilynwr}}",
+ "account.followers_you_know_counter": "{counter} rydych chi'n adnabod",
"account.following": "Yn dilyn",
"account.following_counter": "{count, plural, one {Yn dilyn {counter}} other {Yn dilyn {counter} arall}}",
- "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
+ "account.follows.empty": "Dyw'r defnyddiwr hwn ddim yn dilyn unrhyw un eto.",
+ "account.follows_you": "Yn eich dilyn chi",
"account.go_to_profile": "Mynd i'r proffil",
"account.hide_reblogs": "Cuddio hybiau gan @{name}",
"account.in_memoriam": "Er Cof.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Diffodd hysbysiadau",
"account.mute_short": "Anwybyddu",
"account.muted": "Wedi anwybyddu",
- "account.mutual": "Cydgydnabod",
+ "account.muting": "Tewi",
+ "account.mutual": "Rydych chi'n dilyn eich gilydd",
"account.no_bio": "Dim disgrifiad wedi'i gynnig.",
"account.open_original_page": "Agor y dudalen wreiddiol",
"account.posts": "Postiadau",
"account.posts_with_replies": "Postiadau ac ymatebion",
+ "account.remove_from_followers": "Tynnu {name} o'ch dilynwyr",
"account.report": "Adrodd @{name}",
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn",
+ "account.requests_to_follow_you": "Ceisiadau i'ch dilyn",
"account.share": "Rhannu proffil @{name}",
"account.show_reblogs": "Dangos hybiau gan @{name}",
"account.statuses_counter": "{count, plural, one {{counter} postiad} two {{counter} bostiad} few {{counter} phostiad} many {{counter} postiad} other {{counter} postiad}}",
@@ -107,7 +118,7 @@
"annual_report.summary.here_it_is": "Dyma eich {year} yn gryno:",
"annual_report.summary.highlighted_post.by_favourites": "postiad wedi'i ffefrynu fwyaf",
"annual_report.summary.highlighted_post.by_reblogs": "postiad wedi'i hybu fwyaf",
- "annual_report.summary.highlighted_post.by_replies": "postiad gyda'r nifer fwyaf o atebion",
+ "annual_report.summary.highlighted_post.by_replies": "postiad gyda'r nifer fwyaf o ymatebion",
"annual_report.summary.highlighted_post.possessive": "{name}",
"annual_report.summary.most_used_app.most_used_app": "ap a ddefnyddiwyd fwyaf",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashnod a ddefnyddiwyd fwyaf",
@@ -118,7 +129,7 @@
"annual_report.summary.thanks": "Diolch am fod yn rhan o Mastodon!",
"attachments_list.unprocessed": "(heb eu prosesu)",
"audio.hide": "Cuddio sain",
- "block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.",
+ "block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystrau mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.",
"block_modal.show_less": "Dangos llai",
"block_modal.show_more": "Dangos rhagor",
"block_modal.they_cant_mention": "Dydyn nhw ddim yn gallu eich crybwyll na'ch dilyn.",
@@ -227,8 +238,11 @@
"confirmations.missing_alt_text.title": "Ychwanegu testun amgen?",
"confirmations.mute.confirm": "Tewi",
"confirmations.redraft.confirm": "Dileu ac ailddrafftio",
- "confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.",
- "confirmations.redraft.title": "Dileu & ailddraftio postiad?",
+ "confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'r postiad hwn a'i ail lunio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r postiad gwreiddiol yn mynd yn amddifad.",
+ "confirmations.redraft.title": "Dileu ac ail lunio'r postiad?",
+ "confirmations.remove_from_followers.confirm": "Dileu dilynwr",
+ "confirmations.remove_from_followers.message": "Bydd {name} yn rhoi'r gorau i'ch dilyn. A ydych yn siŵr eich bod am fwrw ymlaen?",
+ "confirmations.remove_from_followers.title": "Tynnu dilynwr?",
"confirmations.reply.confirm": "Ymateb",
"confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n siŵr eich bod am barhau?",
"confirmations.reply.title": "Trosysgrifo'r postiad?",
@@ -258,7 +272,7 @@
"dismissable_banner.explore_tags": "Mae'r hashnodau hyn ar gynnydd y ffedysawd heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o bobl amrywiol yn cael eu graddio'n uwch.",
"dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y ffedysawd y mae pobl ar {domain} yn eu dilyn.",
"domain_block_modal.block": "Blocio gweinydd",
- "domain_block_modal.block_account_instead": "Blocio @{name} yn ei le",
+ "domain_block_modal.block_account_instead": "Rhwystro @{name} yn lle hynny",
"domain_block_modal.they_can_interact_with_old_posts": "Gall pobl o'r gweinydd hwn ryngweithio â'ch hen bostiadau.",
"domain_block_modal.they_cant_follow": "All neb o'r gweinydd hwn eich dilyn.",
"domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu blocio.",
@@ -274,8 +288,8 @@
"domain_pill.their_username": "Eu dynodwr unigryw ar eu gweinydd. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
"domain_pill.username": "Enw Defnyddiwr",
"domain_pill.whats_in_a_handle": "Beth sydd mewn handlen?",
- "domain_pill.who_they_are": "Gan fod handlen yn dweud pwy yw rhywun a ble maen nhw, gallwch chi ryngweithio â phobl ar draws gwe gymdeithasol llwyfannau wedi'u pweru gan ActivityPub .",
- "domain_pill.who_you_are": "Oherwydd bod eich handlen yn dweud pwy ydych chi a ble rydych chi, gall pobl ryngweithio â chi ar draws gwe gymdeithasol llwyfannau wedi'u pweru gan ActivityPub .",
+ "domain_pill.who_they_are": "Gan fod handlen yn dweud pwy yw rhywun a ble maen nhw, gallwch chi ryngweithio â phobl ar draws gwe gymdeithasol llwyfannau wedi'u pweru gan ActivityPub .",
+ "domain_pill.who_you_are": "Oherwydd bod eich handlen yn dweud pwy ydych chi a ble rydych chi, gall pobl ryngweithio â chi ar draws gwe gymdeithasol llwyfannau wedi'u pweru gan ActivityPub .",
"domain_pill.your_handle": "Eich handlen:",
"domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.",
"domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
@@ -296,30 +310,32 @@
"emoji_button.search_results": "Canlyniadau chwilio",
"emoji_button.symbols": "Symbolau",
"emoji_button.travel": "Teithio a Llefydd",
- "empty_column.account_featured": "Mae'r rhestr hon yn wag",
+ "empty_column.account_featured.me": "Dydych chi ddim wedi cynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?",
+ "empty_column.account_featured.other": "Dyw {acct} heb gynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?",
+ "empty_column.account_featured_other.unknown": "Dyw'r cyfrif hwn heb gynnwys dim eto.",
"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_timeline": "Dim postiadau yma!",
- "empty_column.account_unavailable": "Nid yw'r proffil ar gael",
+ "empty_column.account_unavailable": "Dyw'r proffil ddim ar gael",
"empty_column.blocks": "Dydych chi heb rwystro unrhyw ddefnyddwyr eto.",
"empty_column.bookmarked_statuses": "Does gennych chi ddim unrhyw bostiad wedi'u cadw fel nod tudalen eto. Pan fyddwch yn gosod nod tudalen i un, mi fydd yn ymddangos yma.",
"empty_column.community": "Mae'r ffrwd lleol yn wag. Beth am ysgrifennu rhywbeth cyhoeddus!",
"empty_column.direct": "Does gennych chi unrhyw grybwylliadau preifat eto. Pan fyddwch chi'n anfon neu'n derbyn un, bydd yn ymddangos yma.",
- "empty_column.domain_blocks": "Nid oes unrhyw barthau wedi'u blocio eto.",
+ "empty_column.domain_blocks": "Does dim parthau wedi'u rhwystro eto.",
"empty_column.explore_statuses": "Does dim pynciau llosg ar hyn o bryd. Dewch nôl nes ymlaen!",
"empty_column.favourited_statuses": "Rydych chi heb ffafrio unrhyw bostiadau eto. Pan byddwch chi'n ffafrio un, bydd yn ymddangos yma.",
- "empty_column.favourites": "Nid oes unrhyw un wedi ffafrio'r postiad hwn eto. Pan fydd rhywun yn gwneud hynny, byddan nhw'n ymddangos yma.",
- "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan fyddwch yn derbyn un, byddan nhw'n ymddangos yma.",
- "empty_column.followed_tags": "Nid ydych wedi dilyn unrhyw hashnodau eto. Pan fyddwch chi'n gwneud hynny, byddan nhw'n ymddangos yma.",
- "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.",
- "empty_column.home": "Mae eich ffrwd gartref yn wag! Dilynwch fwy o bobl i'w llenwi.",
+ "empty_column.favourites": "Does neb wedi ffafrio'r postiad hwn eto. Pan fydd rhywun yn gwneud hynny, byddan nhw'n ymddangos yma.",
+ "empty_column.follow_requests": "Does gennych chi ddim ceisiadau dilyn eto. Pan fyddwch yn derbyn un, byddan nhw'n ymddangos yma.",
+ "empty_column.followed_tags": "Dydych chi heb ddilyn unrhyw hashnodau eto. Pan fyddwch chi'n gwneud hynny, byddan nhw'n ymddangos yma.",
+ "empty_column.hashtag": "Does dim ar yr hashnod hwn eto.",
+ "empty_column.home": "Mae eich ffrwd gartref yn wag! Dilynwch ragor o bobl i'w llenwi.",
"empty_column.list": "Does dim yn y rhestr yma eto. Pan fydd aelodau'r rhestr yn cyhoeddi postiad newydd, mi fydd yn ymddangos yma.",
- "empty_column.mutes": "Nid ydych wedi tewi unrhyw ddefnyddwyr eto.",
+ "empty_column.mutes": "Dydych chi heb dewi unrhyw ddefnyddwyr eto.",
"empty_column.notification_requests": "Dim i boeni amdano! Does dim byd yma. Pan fyddwch yn derbyn hysbysiadau newydd, byddan nhw'n ymddangos yma yn ôl eich gosodiadau.",
- "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ag eraill i ddechrau'r sgwrs.",
+ "empty_column.notifications": "Does gennych chi ddim hysbysiadau eto. Pan fyddwch chi'n rhyngweithio ag eraill, byddwch yn ei weld yma.",
"empty_column.public": "Does dim byd yma! Ysgrifennwch rywbeth cyhoeddus, neu dilynwch ddefnyddwyr o weinyddion eraill i'w lanw",
"error.unexpected_crash.explanation": "Oherwydd gwall yn ein cod neu oherwydd problem cysondeb porwr, nid oedd y dudalen hon gallu cael ei dangos yn gywir.",
- "error.unexpected_crash.explanation_addons": "Nid oes modd dangos y dudalen hon yn gywir. Mae'r gwall hwn yn debygol o gael ei achosi gan ategyn porwr neu offer cyfieithu awtomatig.",
+ "error.unexpected_crash.explanation_addons": "Does dim modd dangos y dudalen hon yn gywir. Mae'r gwall hwn yn debygol o gael ei achosi gan ategyn porwr neu offer cyfieithu awtomatig.",
"error.unexpected_crash.next_steps": "Ceisiwch ail-lwytho'r dudalen. Os nad yw hyn yn eich helpu, efallai gallwch ddefnyddio Mastodon trwy borwr neu ap brodorol gwahanol.",
"error.unexpected_crash.next_steps_addons": "Ceisiwch eu hanalluogi ac adnewyddu'r dudalen. Os nad yw hynny'n helpu, efallai y byddwch yn dal i allu defnyddio Mastodon trwy borwr neu ap cynhenid arall.",
"errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
@@ -329,7 +345,12 @@
"explore.trending_links": "Newyddion",
"explore.trending_statuses": "Postiadau",
"explore.trending_tags": "Hashnodau",
- "filter_modal.added.context_mismatch_explanation": "Nid yw'r categori hidlo hwn yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
+ "featured_carousel.header": "{count, plural, one {Postiad wedi'i binio} other {Postiadau wedi'u pinio}}",
+ "featured_carousel.next": "Nesaf",
+ "featured_carousel.post": "Postiad",
+ "featured_carousel.previous": "Blaenorol",
+ "featured_carousel.slide": "{index} o {total}",
+ "filter_modal.added.context_mismatch_explanation": "Dyw'r categori hidlo hwn ddim yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
"filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!",
"filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.",
"filter_modal.added.expired_title": "Hidlydd wedi dod i ben!",
@@ -349,11 +370,11 @@
"filtered_notifications_banner.pending_requests": "Oddi wrth {count, plural, =0 {no one} one {un person} two {# berson} few {# pherson} other {# person}} efallai eich bod yn eu hadnabod",
"filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo",
"firehose.all": "Popeth",
- "firehose.local": "Gweinydd hwn",
+ "firehose.local": "Y gweinydd hwn",
"firehose.remote": "Gweinyddion eraill",
"follow_request.authorize": "Awdurdodi",
"follow_request.reject": "Gwrthod",
- "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
+ "follow_requests.unlocked_explanation": "Er nad yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
"follow_suggestions.curated_suggestion": "Dewis staff",
"follow_suggestions.dismiss": "Peidio â dangos hwn eto",
"follow_suggestions.featured_longer": "Wedi'i ddewis â llaw gan dîm {domain}",
@@ -366,34 +387,39 @@
"follow_suggestions.personalized_suggestion": "Awgrym personol",
"follow_suggestions.popular_suggestion": "Awgrym poblogaidd",
"follow_suggestions.popular_suggestion_longer": "Yn boblogaidd ar {domain}",
- "follow_suggestions.similar_to_recently_followed_longer": "Yn debyg i broffiliau y gwnaethoch chi eu dilyn yn ddiweddar",
+ "follow_suggestions.similar_to_recently_followed_longer": "Yn debyg i broffiliau rydych wedi'u dilyn yn ddiweddar",
"follow_suggestions.view_all": "Gweld y cyfan",
"follow_suggestions.who_to_follow": "Pwy i ddilyn",
"followed_tags": "Hashnodau rydych yn eu dilyn",
"footer.about": "Ynghylch",
"footer.directory": "Cyfeiriadur proffiliau",
- "footer.get_app": "Lawrlwytho'r ap",
+ "footer.get_app": "Llwytho'r ap i lawr",
"footer.keyboard_shortcuts": "Bysellau brys",
"footer.privacy_policy": "Polisi preifatrwydd",
"footer.source_code": "Gweld y cod ffynhonnell",
"footer.status": "Statws",
"footer.terms_of_service": "Telerau gwasanaeth",
"generic.saved": "Wedi'i Gadw",
- "getting_started.heading": "Dechrau",
+ "getting_started.heading": "Dechrau arni",
"hashtag.admin_moderation": "Agor rhyngwyneb cymedroli #{name}",
+ "hashtag.browse": "Pori postiadau yn #{hashtag}",
+ "hashtag.browse_from_account": "Pori postiadau gan @{name} yn #{hashtag}",
"hashtag.column_header.tag_mode.all": "a {additional}",
"hashtag.column_header.tag_mode.any": "neu {additional}",
"hashtag.column_header.tag_mode.none": "heb {additional}",
- "hashtag.column_settings.select.no_options_message": "Dim awgrymiadau i'w weld",
+ "hashtag.column_settings.select.no_options_message": "Dim awgrymiadau i'w gweld",
"hashtag.column_settings.select.placeholder": "Mewnbynnu hashnodau…",
"hashtag.column_settings.tag_mode.all": "Pob un o'r rhain",
"hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain",
"hashtag.column_settings.tag_mode.none": "Dim o'r rhain",
- "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+ "hashtag.column_settings.tag_toggle": "Cynnwys tagiau ychwanegol ar gyfer y golofn hon",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} cyfranogwr} other {{counter} cyfranogwr}}",
"hashtag.counter_by_uses": "{count, plural, one {postiad {counter}} other {postiad {counter}}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postiad} other {{counter} postiad}} heddiw",
+ "hashtag.feature": "Nodwedd ar y proffil",
"hashtag.follow": "Dilyn hashnod",
+ "hashtag.mute": "Tewi #{hashtag}",
+ "hashtag.unfeature": "Peidio a'i gynnwys ar y proffil",
"hashtag.unfollow": "Dad-ddilyn hashnod",
"hashtags.and_other": "…a {count, plural, other {# arall}}",
"hints.profiles.followers_may_be_missing": "Mae'n bosibl bod dilynwyr y proffil hwn ar goll.",
@@ -411,7 +437,7 @@
"home.pending_critical_update.link": "Gweld diweddariadau",
"home.pending_critical_update.title": "Mae diweddariad diogelwch hanfodol ar gael!",
"home.show_announcements": "Dangos cyhoeddiadau",
- "ignore_notifications_modal.disclaimer": "Ni all Mastodon hysbysu defnyddwyr eich bod wedi anwybyddu eu hysbysiadau. Ni fydd anwybyddu hysbysiadau yn atal y negeseuon eu hunain rhag cael eu hanfon.",
+ "ignore_notifications_modal.disclaimer": "Dyw Mastodon ddim yn gallu hysbysu defnyddwyr eich bod wedi anwybyddu eu hysbysiadau. Bydd anwybyddu hysbysiadau ddim yn atal y negeseuon eu hunain rhag cael eu hanfon.",
"ignore_notifications_modal.filter_instead": "Hidlo yn lle hynny",
"ignore_notifications_modal.filter_to_act_users": "Byddwch yn dal i allu derbyn, gwrthod neu adrodd ar ddefnyddwyr",
"ignore_notifications_modal.filter_to_avoid_confusion": "Mae hidlo yn helpu i osgoi dryswch posibl",
@@ -438,12 +464,12 @@
"interaction_modal.title.reblog": "Hybu postiad {name}",
"interaction_modal.title.reply": "Ymateb i bostiad {name}",
"interaction_modal.title.vote": "Pleidleisiwch ym mhleidlais {name}",
- "interaction_modal.username_prompt": "E.e. {example}",
+ "interaction_modal.username_prompt": "e.e. {example}",
"intervals.full.days": "{number, plural, one {# diwrnod} two {# ddiwrnod} other {# diwrnod}}",
- "intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}",
- "intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}",
- "keyboard_shortcuts.back": "Llywio nôl",
- "keyboard_shortcuts.blocked": "Agor rhestr defnyddwyr a flociwyd",
+ "intervals.full.hours": "{number, plural, one {# awr} other {# awr}}",
+ "intervals.full.minutes": "{number, plural, one {# funud} other {# munud}}",
+ "keyboard_shortcuts.back": "Symud nôl",
+ "keyboard_shortcuts.blocked": "Agor rhestr defnyddwyr sydd wedi'i rwystro",
"keyboard_shortcuts.boost": "Hybu postiad",
"keyboard_shortcuts.column": "Ffocysu colofn",
"keyboard_shortcuts.compose": "Ffocysu ar ardal cyfansoddi testun",
@@ -457,7 +483,7 @@
"keyboard_shortcuts.heading": "Bysellau brys",
"keyboard_shortcuts.home": "Agor ffrwd gartref",
"keyboard_shortcuts.hotkey": "Bysell boeth",
- "keyboard_shortcuts.legend": "Dangos y rhestr hon",
+ "keyboard_shortcuts.legend": "Dangos yr allwedd hon",
"keyboard_shortcuts.local": "Agor ffrwd lleol",
"keyboard_shortcuts.mention": "Crybwyll yr awdur",
"keyboard_shortcuts.muted": "Agor rhestr defnyddwyr rydych wedi'u tewi",
@@ -466,7 +492,7 @@
"keyboard_shortcuts.open_media": "Agor cyfryngau",
"keyboard_shortcuts.pinned": "Agor rhestr postiadau wedi'u pinio",
"keyboard_shortcuts.profile": "Agor proffil yr awdur",
- "keyboard_shortcuts.reply": "Ymateb i bostiad",
+ "keyboard_shortcuts.reply": "Ateb postiad",
"keyboard_shortcuts.requests": "Agor rhestr ceisiadau dilyn",
"keyboard_shortcuts.search": "Ffocysu ar y bar chwilio",
"keyboard_shortcuts.spoilers": "Dangos/cuddio'r maes CW",
@@ -499,7 +525,6 @@
"lists.exclusive": "Cuddio aelodau yn y Cartref",
"lists.exclusive_hint": "Os oes rhywun ar y rhestr hon, cuddiwch nhw yn eich llif Cartref i osgoi gweld eu postiadau ddwywaith.",
"lists.find_users_to_add": "Canfod defnyddwyr i'w hychwanegu",
- "lists.list_members": "Aelodau rhestr",
"lists.list_members_count": "{count, plural, one {# aelod} other {# aelod}}",
"lists.list_name": "Enw rhestr",
"lists.new_list_name": "Enw rhestr newydd",
@@ -529,18 +554,18 @@
"navigation_bar.about": "Ynghylch",
"navigation_bar.administration": "Gweinyddiaeth",
"navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch",
- "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
+ "navigation_bar.blocks": "Defnyddwyr wedi'u rhwystro",
"navigation_bar.bookmarks": "Nodau Tudalen",
"navigation_bar.community_timeline": "Ffrwd leol",
"navigation_bar.compose": "Cyfansoddi post newydd",
"navigation_bar.direct": "Crybwylliadau preifat",
"navigation_bar.discover": "Darganfod",
- "navigation_bar.domain_blocks": "Parthau wedi'u blocio",
+ "navigation_bar.domain_blocks": "Parthau wedi'u rhwystro",
"navigation_bar.explore": "Darganfod",
"navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau wedi'u tewi",
"navigation_bar.follow_requests": "Ceisiadau dilyn",
- "navigation_bar.followed_tags": "Hashnodau'n cael eu dilyn",
+ "navigation_bar.followed_tags": "Hashnodau a ddilynir",
"navigation_bar.follows_and_followers": "Yn dilyn a dilynwyr",
"navigation_bar.lists": "Rhestrau",
"navigation_bar.logout": "Allgofnodi",
@@ -585,9 +610,9 @@
"notification.moderation_warning.action_none": "Mae eich cyfrif wedi derbyn rhybudd cymedroli.",
"notification.moderation_warning.action_sensitive": "Bydd eich postiadau'n cael eu marcio'n sensitif o hyn ymlaen.",
"notification.moderation_warning.action_silence": "Mae eich cyfrif wedi'i gyfyngu.",
- "notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i hatal.",
+ "notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i atal.",
"notification.own_poll": "Mae eich pleidlais wedi dod i ben",
- "notification.poll": "Mae arolwg y gwnaethoch bleidleisio ynddo wedi dod i ben",
+ "notification.poll": "Mae arolwg rydych wedi pleidleisio ynddo wedi dod i ben",
"notification.reblog": "Hybodd {name} eich post",
"notification.reblog.name_and_others_with_link": "Mae {name} a {count, plural, one {# arall} other {# arall}} wedi hybu eich postiad",
"notification.relationships_severance_event": "Wedi colli cysylltiad â {name}",
@@ -630,7 +655,7 @@
"notifications.column_settings.group": "Grŵp",
"notifications.column_settings.mention": "Crybwylliadau:",
"notifications.column_settings.poll": "Canlyniadau pleidlais:",
- "notifications.column_settings.push": "Hysbysiadau gwthiadwy",
+ "notifications.column_settings.push": "Hysbysiadau gwthio",
"notifications.column_settings.reblog": "Hybiau:",
"notifications.column_settings.show": "Dangos yn y golofn",
"notifications.column_settings.sound": "Chwarae sain",
@@ -643,25 +668,25 @@
"notifications.filter.favourites": "Ffefrynnau",
"notifications.filter.follows": "Yn dilyn",
"notifications.filter.mentions": "Crybwylliadau",
- "notifications.filter.polls": "Canlyniadau polau",
+ "notifications.filter.polls": "Canlyniadau pleidleisio",
"notifications.filter.statuses": "Diweddariadau gan bobl rydych chi'n eu dilyn",
"notifications.grant_permission": "Caniatáu.",
"notifications.group": "{count} hysbysiad",
"notifications.mark_as_read": "Marciwch bob hysbysiad wedi'i ddarllen",
- "notifications.permission_denied": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd cais am ganiatâd porwr a wrthodwyd yn flaenorol",
- "notifications.permission_denied_alert": "Nid oes modd galluogi hysbysiadau bwrdd gwaith, gan fod caniatâd porwr wedi'i wrthod o'r blaen",
- "notifications.permission_required": "Nid oes hysbysiadau bwrdd gwaith ar gael oherwydd na roddwyd y caniatâd gofynnol.",
+ "notifications.permission_denied": "Does dim hysbysiadau bwrdd gwaith ar gael oherwydd cais am ganiatâd porwr a wrthodwyd yn flaenorol",
+ "notifications.permission_denied_alert": "Does dim modd galluogi hysbysiadau bwrdd gwaith, gan fod caniatâd porwr wedi'i wrthod o'r blaen",
+ "notifications.permission_required": "Does dim hysbysiadau bwrdd gwaith ar gael oherwydd na roddwyd y caniatâd gofynnol.",
"notifications.policy.accept": "Derbyn",
"notifications.policy.accept_hint": "Dangos mewn hysbysiadau",
"notifications.policy.drop": "Anwybyddu",
"notifications.policy.drop_hint": "Anfon i'r gwagle, byth i'w gweld eto",
"notifications.policy.filter": "Hidlo",
"notifications.policy.filter_hint": "Anfon i flwch derbyn hysbysiadau wedi'u hidlo",
- "notifications.policy.filter_limited_accounts_hint": "Cyfyngedig gan gymedrolwyr gweinydd",
+ "notifications.policy.filter_limited_accounts_hint": "Cyfyngwyd gan gymedrolwyr gweinydd",
"notifications.policy.filter_limited_accounts_title": "Cyfrifon wedi'u cymedroli",
- "notifications.policy.filter_new_accounts.hint": "Crëwyd o fewn {days, lluosog, un {yr un diwrnod} arall {y # diwrnod}} diwethaf",
+ "notifications.policy.filter_new_accounts.hint": "Crëwyd o fewn {days, plural, one {yr un diwrnod} other {y # diwrnod}} diwethaf",
"notifications.policy.filter_new_accounts_title": "Cyfrifon newydd",
- "notifications.policy.filter_not_followers_hint": "Gan gynnwys pobl sydd wedi bod yn eich dilyn am llai {days, plural, un {nag un diwrnod} arall {na # diwrnod}}",
+ "notifications.policy.filter_not_followers_hint": "Gan gynnwys pobl sydd wedi bod yn eich dilyn am llai {days, plural, one {nag un diwrnod} other {na # diwrnod}}",
"notifications.policy.filter_not_followers_title": "Pobl sydd ddim yn eich dilyn",
"notifications.policy.filter_not_following_hint": "Hyd nes i chi eu cymeradwyo â llaw",
"notifications.policy.filter_not_following_title": "Pobl nad ydych yn eu dilyn",
@@ -677,7 +702,7 @@
"onboarding.follows.search": "Chwilio",
"onboarding.follows.title": "Dilynwch bobl i gychwyn arni",
"onboarding.profile.discoverable": "Gwnewch fy mhroffil yn un y gellir ei ddarganfod",
- "onboarding.profile.discoverable_hint": "Pan fyddwch yn optio i mewn i ddarganfodadwyedd ar Mastodon, gall eich postiadau ymddangos mewn canlyniadau chwilio a threndiau, ac efallai y bydd eich proffil yn cael ei awgrymu i bobl sydd â diddordebau tebyg i chi.",
+ "onboarding.profile.discoverable_hint": "Pan fyddwch yn dewis ymuno â darganfod ar Mastodon, gall eich postiadau ymddangos mewn canlyniadau chwilio a threndiau, ac efallai y bydd eich proffil yn cael ei awgrymu i bobl sydd â diddordebau tebyg i chi.",
"onboarding.profile.display_name": "Enw dangos",
"onboarding.profile.display_name_hint": "Eich enw llawn neu'ch enw hwyl…",
"onboarding.profile.note": "Bywgraffiad",
@@ -688,7 +713,7 @@
"onboarding.profile.upload_header": "Llwytho pennyn proffil",
"password_confirmation.exceeds_maxlength": "Mae'r cadarnhad cyfrinair yn fwy nag uchafswm hyd y cyfrinair",
"password_confirmation.mismatching": "Nid yw'r cadarnhad cyfrinair yn cyfateb",
- "picture_in_picture.restore": "Rhowch ef yn ôl",
+ "picture_in_picture.restore": "Rhowch e nôl",
"poll.closed": "Ar gau",
"poll.refresh": "Adnewyddu",
"poll.reveal": "Gweld y canlyniadau",
@@ -702,9 +727,9 @@
"privacy.change": "Addasu preifatrwdd y post",
"privacy.direct.long": "Pawb sydd â sôn amdanyn nhw yn y postiad",
"privacy.direct.short": "Crybwylliad preifat",
- "privacy.private.long": "Eich dilynwyr yn unig",
+ "privacy.private.long": "Dim ond eich dilynwyr",
"privacy.private.short": "Dilynwyr",
- "privacy.public.long": "Unrhyw ar ac oddi ar Mastodon",
+ "privacy.public.long": "Unrhyw un ar ac oddi ar Mastodon",
"privacy.public.short": "Cyhoeddus",
"privacy.unlisted.additional": "Mae hwn yn ymddwyn yn union fel y cyhoeddus, ac eithrio na fydd y postiad yn ymddangos mewn ffrydiau byw neu hashnodau, archwilio, neu chwiliad Mastodon, hyd yn oed os ydych wedi eich cynnwys ar draws y cyfrif.",
"privacy.unlisted.long": "Llai o ddathliadau algorithmig",
@@ -714,7 +739,7 @@
"recommended": "Argymhellwyd",
"refresh": "Adnewyddu",
"regeneration_indicator.please_stand_by": "Arhoswch am dipyn.",
- "regeneration_indicator.preparing_your_home_feed": "Paratoi eich llif cartref…",
+ "regeneration_indicator.preparing_your_home_feed": "Yn paratoi eich ffrwd gartref…",
"relative_time.days": "{number}d",
"relative_time.full.days": "{number, plural, one {# diwrnod} other {# diwrnod}} yn ôl",
"relative_time.full.hours": "{number, plural, one {# awr} other {# awr}} yn ôl",
@@ -727,16 +752,16 @@
"relative_time.seconds": "{number} eiliad",
"relative_time.today": "heddiw",
"reply_indicator.attachments": "{count, plural, one {# atodiad} other {# atodiad}}",
- "reply_indicator.cancel": "Canslo",
- "reply_indicator.poll": "Arolwg",
- "report.block": "Blocio",
+ "reply_indicator.cancel": "Diddymu",
+ "reply_indicator.poll": "Pleidlais",
+ "report.block": "Rhwystro",
"report.block_explanation": "Ni welwch chi eu postiadau. Ni allan nhw weld eich postiadau na'ch dilyn. Byddan nhw'n gallu gweld eu bod nhw wedi'u rhwystro.",
"report.categories.legal": "Cyfreithiol",
"report.categories.other": "Arall",
"report.categories.spam": "Sbam",
"report.categories.violation": "Mae cynnwys yn torri un neu fwy o reolau'r gweinydd",
"report.category.subtitle": "Dewiswch yr ateb gorau",
- "report.category.title": "Beth sy'n digwydd gyda'r {type} yma?",
+ "report.category.title": "Beth sy'n digwydd gyda'r {type} yma",
"report.category.title_account": "proffil",
"report.category.title_status": "post",
"report.close": "Iawn",
@@ -748,11 +773,11 @@
"report.next": "Nesaf",
"report.placeholder": "Sylwadau ychwanegol",
"report.reasons.dislike": "Dydw i ddim yn ei hoffi",
- "report.reasons.dislike_description": "Nid yw'n rhywbeth yr ydych am ei weld",
+ "report.reasons.dislike_description": "Dyw e ddim yn rhywbeth rydych am ei weld",
"report.reasons.legal": "Mae'n anghyfreithlon",
"report.reasons.legal_description": "Rydych chi'n credu ei fod yn torri cyfraith eich gwlad chi neu wlad y gweinydd",
"report.reasons.other": "Mae'n rhywbeth arall",
- "report.reasons.other_description": "Nid yw'r mater yn ffitio i gategorïau eraill",
+ "report.reasons.other_description": "Dyw'r mater ddim yn ffitio i gategorïau eraill",
"report.reasons.spam": "Sbam yw e",
"report.reasons.spam_description": "Dolenni maleisus, ymgysylltu ffug, neu ymatebion ailadroddus",
"report.reasons.violation": "Mae'n torri rheolau'r gweinydd",
@@ -779,7 +804,7 @@
"report_notification.categories.violation": "Torri rheol",
"report_notification.categories.violation_sentence": "torri rheolau",
"report_notification.open": "Agor adroddiad",
- "search.no_recent_searches": "Does dim chwiliadau diweddar",
+ "search.no_recent_searches": "Does dim chwilio diweddar",
"search.placeholder": "Chwilio",
"search.quick_action.account_search": "Proffiliau sy'n cyfateb i {x}",
"search.quick_action.go_to_account": "Mynd i broffil {x}",
@@ -813,13 +838,13 @@
"sign_in_banner.mastodon_is": "Mastodon yw'r ffordd orau o gadw i fyny â'r hyn sy'n digwydd.",
"sign_in_banner.sign_in": "Mewngofnodi",
"sign_in_banner.sso_redirect": "Mewngofnodi neu Gofrestru",
- "status.admin_account": "Agor rhyngwyneb cymedroli ar gyfer @{name}",
+ "status.admin_account": "Agor rhyngwyneb cymedroli @{name}",
"status.admin_domain": "Agor rhyngwyneb cymedroli {domain}",
"status.admin_status": "Agor y postiad hwn yn y rhyngwyneb cymedroli",
- "status.block": "Blocio @{name}",
- "status.bookmark": "Llyfrnodi",
+ "status.block": "Rhwystro @{name}",
+ "status.bookmark": "Nod tudalen",
"status.cancel_reblog_private": "Dadhybu",
- "status.cannot_reblog": "Nid oes modd hybu'r postiad hwn",
+ "status.cannot_reblog": "Does dim modd hybu'r postiad hwn",
"status.continued_thread": "Edefyn parhaus",
"status.copy": "Copïo dolen i'r post",
"status.delete": "Dileu",
@@ -828,7 +853,7 @@
"status.direct_indicator": "Crybwyll preifat",
"status.edit": "Golygu",
"status.edited": "Golygwyd ddiwethaf {date}",
- "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}",
+ "status.edited_x_times": "Golygwyd {count, plural, one {{count} gwaith} other {{count} gwaith}}",
"status.embed": "Cael y cod mewnblannu",
"status.favourite": "Ffafrio",
"status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}",
@@ -845,20 +870,26 @@
"status.mute_conversation": "Anwybyddu sgwrs",
"status.open": "Ehangu'r post hwn",
"status.pin": "Pinio ar y proffil",
- "status.pinned": "Postiad wedi'i binio",
+ "status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr",
+ "status.quote_error.not_found": "Does dim modd dangos y postiad hwn.",
+ "status.quote_error.pending_approval": "Mae'r postiad hwn yn aros am gymeradwyaeth yr awdur gwreiddiol.",
+ "status.quote_error.rejected": "Does dim modd dangos y postiad hwn gan nad yw'r awdur gwreiddiol yn caniatáu iddo gael ei ddyfynnu.",
+ "status.quote_error.removed": "Cafodd y postiad hwn ei ddileu gan ei awdur.",
+ "status.quote_error.unauthorized": "Does dim modd dangos y postiad hwn gan nad oes gennych awdurdod i'w weld.",
+ "status.quote_post_author": "Postiad gan {name}",
"status.read_more": "Darllen rhagor",
"status.reblog": "Hybu",
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
"status.reblogged_by": "Hybodd {name}",
"status.reblogs": "{count, plural, one {# hwb} other {# hwb}}",
"status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
- "status.redraft": "Dileu ac ailddrafftio",
+ "status.redraft": "Dileu ac ail lunio",
"status.remove_bookmark": "Tynnu nod tudalen",
"status.remove_favourite": "Tynnu o'r ffefrynnau",
- "status.replied_in_thread": "Atebodd mewn edefyn",
- "status.replied_to": "Wedi ateb {name}",
+ "status.replied_in_thread": "Wedi ateb mewn edefyn",
+ "status.replied_to": "Wedi ymateb i {name}",
"status.reply": "Ymateb",
- "status.replyAll": "Ateb i edefyn",
+ "status.replyAll": "Ateb edefyn",
"status.report": "Adrodd ar @{name}",
"status.sensitive_warning": "Cynnwys sensitif",
"status.share": "Rhannu",
@@ -882,23 +913,23 @@
"time_remaining.days": "{number, plural, one {# diwrnod} other {# diwrnod}} ar ôl",
"time_remaining.hours": "{number, plural, one {# awr} other {# awr}} ar ôl",
"time_remaining.minutes": "{number, plural, one {# munud} other {# munud}} ar ôl",
- "time_remaining.moments": "Munudau yn weddill",
+ "time_remaining.moments": "Munudau'n weddill",
"time_remaining.seconds": "{number, plural, one {# eiliad} other {# eiliad}} ar ôl",
"trends.counter_by_accounts": "{count, plural, zero {neb} one {{counter} person} two {{counter} berson} few {{counter} pherson} other {{counter} o bobl}} yn y {days, plural, one {diwrnod diwethaf} two {ddeuddydd diwethaf} other {{days} diwrnod diwethaf}}",
- "trends.trending_now": "Pynciau llosg",
+ "trends.trending_now": "Wrthi'n trendio",
"ui.beforeunload": "Byddwch yn colli eich drafft os byddwch yn gadael Mastodon.",
"units.short.billion": "{count}biliwn",
"units.short.million": "{count}miliwn",
"units.short.thousand": "{count}mil",
"upload_area.title": "Llusgwch a gollwng i lwytho",
- "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
- "upload_error.limit": "Wedi pasio'r uchafswm llwytho.",
- "upload_error.poll": "Nid oes modd llwytho ffeiliau â phleidleisiau.",
+ "upload_button.label": "Ychwanegwch delweddau, fideo neu ffeil sain",
+ "upload_error.limit": "Wedi mynd heibio'r uchafswm llwytho.",
+ "upload_error.poll": "Does dim modd llwytho ffeiliau â phleidleisiau.",
"upload_form.drag_and_drop.instructions": "I godi atodiad cyfryngau, pwyswch y space neu enter. Wrth lusgo, defnyddiwch y bysellau saeth i symud yr atodiad cyfryngau i unrhyw gyfeiriad penodol. Pwyswch space neu enter eto i ollwng yr atodiad cyfryngau yn ei safle newydd, neu pwyswch escape i ddiddymu.",
- "upload_form.drag_and_drop.on_drag_cancel": "Cafodd llusgo ei ddiddymu. Cafodd atodiad cyfryngau {item} ei ollwng.",
- "upload_form.drag_and_drop.on_drag_end": "Cafodd atodiad cyfryngau {item} ei ollwng.",
+ "upload_form.drag_and_drop.on_drag_cancel": "Cafodd llusgo ei ddiddymu. Cafodd atodi cyfryngau {item} ei ollwng.",
+ "upload_form.drag_and_drop.on_drag_end": "Cafodd atodi cyfryngau {item} ei ollwng.",
"upload_form.drag_and_drop.on_drag_over": "Symudwyd atodiad cyfryngau {item}.",
- "upload_form.drag_and_drop.on_drag_start": "Atodiad cyfryngau godwyd {item}.",
+ "upload_form.drag_and_drop.on_drag_start": "Wedi codi atodiad cyfryngau {item}.",
"upload_form.edit": "Golygu",
"upload_progress.label": "Yn llwytho...",
"upload_progress.processing": "Wrthi'n prosesu…",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index e1d8e7aec2..6053408b9b 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Modererede servere",
"about.contact": "Kontakt:",
+ "about.default_locale": "Standard",
"about.disclaimer": "Mastodon er gratis, open-source software og et varemærke tilhørende Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Begrundelse ikke tilgængelig",
"about.domain_blocks.preamble": "Mastodon tillader generelt, at man ser indhold og interagere med brugere fra enhver anden server i fediverset. Disse er undtagelserne, som er implementeret på netop denne server.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Begrænset",
"about.domain_blocks.suspended.explanation": "Data fra denne server hverken behandles, gemmes eller udveksles, hvilket umuliggør interaktion eller kommunikation med brugere fra denne server.",
"about.domain_blocks.suspended.title": "Udelukket",
+ "about.language_label": "Sprog",
"about.not_available": "Denne information er ikke blevet gjort tilgængelig på denne server.",
"about.powered_by": "Decentraliserede sociale medier drevet af {mastodon}",
"about.rules": "Serverregler",
@@ -19,17 +21,21 @@
"account.block_domain": "Blokér domænet {domain}",
"account.block_short": "Bloker",
"account.blocked": "Blokeret",
+ "account.blocking": "Blokering",
"account.cancel_follow_request": "Annullér anmodning om at følge",
"account.copy": "Kopiér link til profil",
"account.direct": "Privat omtale @{name}",
"account.disable_notifications": "Advisér mig ikke længere, når @{name} poster",
- "account.domain_blocked": "Domæne blokeret",
+ "account.domain_blocking": "Blokerer domæne",
"account.edit_profile": "Redigér profil",
"account.enable_notifications": "Advisér mig, når @{name} poster",
"account.endorse": "Fremhæv på profil",
+ "account.familiar_followers_many": "Følges af {name1}, {name2} og {othersCount, plural, one {# mere, man kender} other {# mere, man kender}}",
+ "account.familiar_followers_one": "Følges af {name1}",
+ "account.familiar_followers_two": "Følges af {name1} og {name2}",
"account.featured": "Fremhævet",
+ "account.featured.accounts": "Profiler",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Indlæg",
"account.featured_tags.last_status_at": "Seneste indlæg {date}",
"account.featured_tags.last_status_never": "Ingen indlæg",
"account.follow": "Følg",
@@ -37,9 +43,11 @@
"account.followers": "Følgere",
"account.followers.empty": "Ingen følger denne bruger endnu.",
"account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}",
+ "account.followers_you_know_counter": "{counter} man kender",
"account.following": "Følger",
"account.following_counter": "{count, plural, one {{counter} følger} other {{counter} følger}}",
"account.follows.empty": "Denne bruger følger ikke nogen endnu.",
+ "account.follows_you": "Følger dig",
"account.go_to_profile": "Gå til profil",
"account.hide_reblogs": "Skjul fremhævelser fra @{name}",
"account.in_memoriam": "Til minde om.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Sluk for notifikationer",
"account.mute_short": "Skjul",
"account.muted": "Skjult",
- "account.mutual": "Fælles",
+ "account.muting": "Tavsgørelse",
+ "account.mutual": "I følger hinanden",
"account.no_bio": "Ingen beskrivelse til rådighed.",
"account.open_original_page": "Åbn oprindelig side",
"account.posts": "Indlæg",
"account.posts_with_replies": "Indlæg og svar",
+ "account.remove_from_followers": "Fjern {name} fra følgere",
"account.report": "Anmeld @{name}",
"account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning",
"account.requested_follow": "{name} har anmodet om at følge dig",
+ "account.requests_to_follow_you": "Anmodninger om at følge dig",
"account.share": "Del @{name}s profil",
"account.show_reblogs": "Vis fremhævelser fra @{name}",
"account.statuses_counter": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Slet og omformulér",
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og fremhævelser går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
"confirmations.redraft.title": "Slet og omformulér indlæg?",
+ "confirmations.remove_from_followers.confirm": "Fjern følger",
+ "confirmations.remove_from_followers.message": "{name} vil ophøre med at være en følger. Sikker på, at man vil fortsætte?",
+ "confirmations.remove_from_followers.title": "Fjern følger?",
"confirmations.reply.confirm": "Svar",
"confirmations.reply.message": "Hvis du svarer nu, vil det overskrive den besked, du er ved at skrive. Fortsæt alligevel?",
"confirmations.reply.title": "Overskriv indlæg?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Søgeresultater",
"emoji_button.symbols": "Symboler",
"emoji_button.travel": "Rejser og steder",
- "empty_column.account_featured": "Denne liste er tom",
+ "empty_column.account_featured.me": "Intet fremhævet endnu. Vidste du, at man kan fremhæve sine mest brugte hashtags og endda en vens konti på sin profil?",
+ "empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu. Vidste du, at man kan fremhæve sine mest brugte hashtags og endda en vens konti på sin profil?",
+ "empty_column.account_featured_other.unknown": "Denne konto har ikke fremhævet noget endnu.",
"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_timeline": "Ingen indlæg her!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Nyheder",
"explore.trending_statuses": "Indlæg",
"explore.trending_tags": "Etiketter",
+ "featured_carousel.header": "{count, plural, one {Fastgjort indlæg} other {Fastgjorte indlæg}}",
+ "featured_carousel.next": "Næste",
+ "featured_carousel.post": "Indlæg",
+ "featured_carousel.previous": "Foregående",
+ "featured_carousel.slide": "{index} af {total}",
"filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.",
"filter_modal.added.context_mismatch_title": "Kontekstmisforhold!",
"filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deltager} other {{counter} deltagere}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
+ "hashtag.feature": "Fremhæv på profil",
"hashtag.follow": "Følg etiket",
"hashtag.mute": "Tavsgør #{hashtag}",
+ "hashtag.unfeature": "Fremhæv ikke på profil",
"hashtag.unfollow": "Stop med at følge etiket",
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
"hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Se flere indlæg på {domain}",
"hints.threads.replies_may_be_missing": "Der kan mangle svar fra andre servere.",
"hints.threads.see_more": "Se flere svar på {domain}",
+ "home.column_settings.show_quotes": "Vis citater",
"home.column_settings.show_reblogs": "Vis fremhævelser",
"home.column_settings.show_replies": "Vis svar",
"home.hide_announcements": "Skjul bekendtgørelser",
@@ -502,7 +526,6 @@
"lists.exclusive": "Skjul medlemmer i Hjem",
"lists.exclusive_hint": "Er nogen er på denne liste, skjul personen i hjemme-feeds for at undgå at se vedkommendes indlæg to gange.",
"lists.find_users_to_add": "Find brugere at tilføje",
- "lists.list_members": "Liste over medlemmer",
"lists.list_members_count": "{count, plural, one {# medlem} other {# medlemmer}}",
"lists.list_name": "Listetitel",
"lists.new_list_name": "Ny listetitel",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Skjul samtale",
"status.open": "Udvid dette indlæg",
"status.pin": "Fastgør til profil",
- "status.pinned": "Fastgjort indlæg",
+ "status.quote_error.filtered": "Skjult grundet et af filterne",
+ "status.quote_error.not_found": "Dette indlæg kan ikke vises.",
+ "status.quote_error.pending_approval": "Dette indlæg afventer godkendelse fra den oprindelige forfatter.",
+ "status.quote_error.rejected": "Dette indlæg kan ikke vises, da den oprindelige forfatter ikke tillader citering heraf.",
+ "status.quote_error.removed": "Dette indlæg er fjernet af forfatteren.",
+ "status.quote_error.unauthorized": "Dette indlæg kan ikke vises, da man ikke har tilladelse til at se det.",
+ "status.quote_post_author": "Indlæg fra {name}",
"status.read_more": "Læs mere",
"status.reblog": "Fremhæv",
"status.reblog_private": "Fremhæv med oprindelig synlighed",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 0d5f2f2104..695ed571da 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderierte Server",
"about.contact": "Kontakt:",
+ "about.default_locale": "Standard",
"about.disclaimer": "Mastodon ist eine freie, quelloffene Software und eine Marke der Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Grund unbekannt",
"about.domain_blocks.preamble": "Mastodon erlaubt es dir grundsätzlich, alle Inhalte von allen Nutzer*innen auf allen Servern im Fediverse zu sehen und mit ihnen zu interagieren. Für diesen Server gibt es aber ein paar Ausnahmen.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Stummgeschaltet",
"about.domain_blocks.suspended.explanation": "Es werden keine Daten von diesem Server verarbeitet, gespeichert oder ausgetauscht, sodass eine Interaktion oder Kommunikation mit Nutzer*innen dieses Servers nicht möglich ist.",
"about.domain_blocks.suspended.title": "Gesperrt",
+ "about.language_label": "Sprache",
"about.not_available": "Diese Informationen sind auf diesem Server nicht verfügbar.",
"about.powered_by": "Ein dezentralisiertes soziales Netzwerk, angetrieben von {mastodon}",
"about.rules": "Serverregeln",
@@ -19,17 +21,21 @@
"account.block_domain": "{domain} sperren",
"account.block_short": "Blockieren",
"account.blocked": "Blockiert",
+ "account.blocking": "Blockiert",
"account.cancel_follow_request": "Follower-Anfrage zurückziehen",
"account.copy": "Link zum Profil kopieren",
"account.direct": "@{name} privat erwähnen",
"account.disable_notifications": "Höre auf mich zu benachrichtigen wenn @{name} etwas postet",
- "account.domain_blocked": "Domain versteckt",
+ "account.domain_blocking": "Domain blockiert",
"account.edit_profile": "Profil bearbeiten",
"account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet",
- "account.endorse": "Im Profil empfehlen",
- "account.featured": "Empfohlen",
+ "account.endorse": "Im Profil vorstellen",
+ "account.familiar_followers_many": "Gefolgt von {name1}, {name2} und {othersCount, plural, one {einem weiteren Profil, das dir bekannt ist} other {# weiteren Profilen, die dir bekannt sind}}",
+ "account.familiar_followers_one": "Gefolgt von {name1}",
+ "account.familiar_followers_two": "Gefolgt von {name1} und {name2}",
+ "account.featured": "Vorgestellt",
+ "account.featured.accounts": "Profile",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Beiträge",
"account.featured_tags.last_status_at": "Letzter Beitrag am {date}",
"account.featured_tags.last_status_never": "Keine Beiträge",
"account.follow": "Folgen",
@@ -37,9 +43,11 @@
"account.followers": "Follower",
"account.followers.empty": "Diesem Profil folgt noch niemand.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
+ "account.followers_you_know_counter": "{counter} bekannt",
"account.following": "Folge ich",
"account.following_counter": "{count, plural, one {{counter} Folge ich} other {{counter} Folge ich}}",
"account.follows.empty": "Dieses Profil folgt noch niemandem.",
+ "account.follows_you": "Folgt dir",
"account.go_to_profile": "Profil aufrufen",
"account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden",
"account.in_memoriam": "Zum Andenken.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Benachrichtigungen stummschalten",
"account.mute_short": "Stummschalten",
"account.muted": "Stummgeschaltet",
- "account.mutual": "Gegenseitig",
+ "account.muting": "Stummgeschaltet",
+ "account.mutual": "Ihr folgt einander",
"account.no_bio": "Keine Beschreibung verfügbar.",
"account.open_original_page": "Ursprüngliche Seite öffnen",
"account.posts": "Beiträge",
"account.posts_with_replies": "Beiträge und Antworten",
+ "account.remove_from_followers": "{name} als Follower entfernen",
"account.report": "@{name} melden",
"account.requested": "Die Genehmigung steht noch aus. Klicke hier, um die Follower-Anfrage zurückzuziehen",
"account.requested_follow": "{name} möchte dir folgen",
+ "account.requests_to_follow_you": "Möchte dir folgen",
"account.share": "Profil von @{name} teilen",
"account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen",
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
@@ -69,7 +80,7 @@
"account.unblock_domain": "Blockierung von {domain} aufheben",
"account.unblock_domain_short": "Entsperren",
"account.unblock_short": "Blockierung aufheben",
- "account.unendorse": "Im Profil nicht mehr empfehlen",
+ "account.unendorse": "Im Profil nicht mehr vorstellen",
"account.unfollow": "Entfolgen",
"account.unmute": "Stummschaltung von @{name} aufheben",
"account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Löschen und neu erstellen",
"confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Alle Favoriten sowie die bisher geteilten Beiträge werden verloren gehen und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.",
"confirmations.redraft.title": "Beitrag löschen und neu erstellen?",
+ "confirmations.remove_from_followers.confirm": "Follower entfernen",
+ "confirmations.remove_from_followers.message": "{name} wird dir nicht länger folgen. Bist du dir sicher?",
+ "confirmations.remove_from_followers.title": "Follower entfernen?",
"confirmations.reply.confirm": "Antworten",
"confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?",
"confirmations.reply.title": "Beitrag überschreiben?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Suchergebnisse",
"emoji_button.symbols": "Symbole",
"emoji_button.travel": "Reisen & Orte",
- "empty_column.account_featured": "Diese Liste ist leer",
+ "empty_column.account_featured.me": "Du hast bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?",
+ "empty_column.account_featured.other": "{acct} hat bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?",
+ "empty_column.account_featured_other.unknown": "Dieses Profil hat bisher noch nichts vorgestellt.",
"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_timeline": "Keine Beiträge vorhanden!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Neuigkeiten",
"explore.trending_statuses": "Beiträge",
"explore.trending_tags": "Hashtags",
+ "featured_carousel.header": "{count, plural, one {Angehefteter Beitrag} other {Angeheftete Beiträge}}",
+ "featured_carousel.next": "Vor",
+ "featured_carousel.post": "Beitrag",
+ "featured_carousel.previous": "Zurück",
+ "featured_carousel.slide": "{index} von {total}",
"filter_modal.added.context_mismatch_explanation": "Diese Filterkategorie gilt nicht für den Kontext, in welchem du auf diesen Beitrag zugegriffen hast. Wenn der Beitrag auch in diesem Kontext gefiltert werden soll, musst du den Filter bearbeiten.",
"filter_modal.added.context_mismatch_title": "Kontext stimmt nicht überein!",
"filter_modal.added.expired_explanation": "Diese Filterkategorie ist abgelaufen. Du musst das Ablaufdatum für diese Kategorie ändern.",
@@ -346,7 +367,7 @@
"filter_modal.select_filter.title": "Diesen Beitrag filtern",
"filter_modal.title.status": "Beitrag per Filter ausblenden",
"filter_warning.matches_filter": "Übereinstimmend mit dem Filter „{title} “",
- "filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem, den} one {einer Person, die} other {# Personen, die}} du möglicherweise kennst",
+ "filtered_notifications_banner.pending_requests": "Von {count, plural, =0 {keinem Profil, das dir möglicherweise bekannt ist} one {einem Profil, das dir möglicherweise bekannt ist} other {# Profilen, die dir möglicherweise bekannt sind}}",
"filtered_notifications_banner.title": "Gefilterte Benachrichtigungen",
"firehose.all": "Alle Server",
"firehose.local": "Dieser Server",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one{{counter} Beteiligte*r} other{{counter} Beteiligte}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}} heute",
+ "hashtag.feature": "Im Profil vorstellen",
"hashtag.follow": "Hashtag folgen",
"hashtag.mute": "#{hashtag} stummschalten",
+ "hashtag.unfeature": "Im Profil nicht mehr vorstellen",
"hashtag.unfollow": "Hashtag entfolgen",
"hashtags.and_other": "… und {count, plural, one{# weiterer} other {# weitere}}",
"hints.profiles.followers_may_be_missing": "Möglicherweise werden für dieses Profil nicht alle Follower angezeigt.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Weitere Beiträge auf {domain} ansehen",
"hints.threads.replies_may_be_missing": "Möglicherweise werden nicht alle Antworten von anderen Servern angezeigt.",
"hints.threads.see_more": "Weitere Antworten auf {domain} ansehen",
+ "home.column_settings.show_quotes": "Zitierte Beiträge anzeigen",
"home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen",
"home.column_settings.show_replies": "Antworten anzeigen",
"home.hide_announcements": "Ankündigungen ausblenden",
@@ -416,7 +440,7 @@
"home.show_announcements": "Ankündigungen anzeigen",
"ignore_notifications_modal.disclaimer": "Mastodon kann anderen Nutzer*innen nicht mitteilen, dass du deren Benachrichtigungen ignorierst. Das Ignorieren von Benachrichtigungen wird nicht das Absenden der Nachricht selbst unterbinden.",
"ignore_notifications_modal.filter_instead": "Stattdessen filtern",
- "ignore_notifications_modal.filter_to_act_users": "Du wirst weiterhin die Möglichkeit haben, andere Nutzer*innen zu genehmigen, abzulehnen oder zu melden",
+ "ignore_notifications_modal.filter_to_act_users": "Du wirst weiterhin die Möglichkeit haben, andere Nutzer*innen zu akzeptieren, abzulehnen oder zu melden",
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtern hilft, mögliches Durcheinander zu vermeiden",
"ignore_notifications_modal.filter_to_review_separately": "Gefilterte Benachrichtigungen können separat überprüft werden",
"ignore_notifications_modal.ignore": "Benachrichtigungen ignorieren",
@@ -502,7 +526,6 @@
"lists.exclusive": "Mitglieder auf der Startseite ausblenden",
"lists.exclusive_hint": "Profile, die sich auf dieser Liste befinden, werden nicht auf deiner Startseite angezeigt, damit deren Beiträge nicht doppelt erscheinen.",
"lists.find_users_to_add": "Suche nach Profilen, um sie hinzuzufügen",
- "lists.list_members": "Listenmitglieder",
"lists.list_members_count": "{count, plural, one {# Mitglied} other {# Mitglieder}}",
"lists.list_name": "Titel der Liste",
"lists.new_list_name": "Neuer Listentitel",
@@ -600,11 +623,11 @@
"notification.relationships_severance_event.user_domain_block": "Du hast {target} blockiert – {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst, wurden entfernt.",
"notification.status": "{name} postete …",
"notification.update": "{name} bearbeitete einen Beitrag",
- "notification_requests.accept": "Genehmigen",
- "notification_requests.accept_multiple": "{count, plural, one {# Anfrage genehmigen …} other {# Anfragen genehmigen …}}",
- "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Anfrage genehmigen} other {Anfragen genehmigen}}",
- "notification_requests.confirm_accept_multiple.message": "Du bist dabei, {{count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} zu genehmigen. Möchtest du wirklich fortfahren?",
- "notification_requests.confirm_accept_multiple.title": "Benachrichtigungsanfragen genehmigen?",
+ "notification_requests.accept": "Akzeptieren",
+ "notification_requests.accept_multiple": "{count, plural, one {# Anfrage akzeptieren …} other {# Anfragen akzeptieren …}}",
+ "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Anfrage akzeptieren} other {Anfragen akzeptieren}}",
+ "notification_requests.confirm_accept_multiple.message": "Du bist dabei, {{count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} zu akzeptieren. Möchtest du wirklich fortfahren?",
+ "notification_requests.confirm_accept_multiple.title": "Benachrichtigungsanfragen akzeptieren?",
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Anfrage ablehnen} other {Anfragen ablehnen}}",
"notification_requests.confirm_dismiss_multiple.message": "Du bist dabei, {count, plural, one {eine Benachrichtigungsanfrage} other {# Benachrichtigungsanfragen}} abzulehnen. Du wirst nicht mehr ohne Weiteres auf {count, plural, one {sie} other {sie}} zugreifen können. Möchtest du wirklich fortfahren?",
"notification_requests.confirm_dismiss_multiple.title": "Benachrichtigungsanfragen ablehnen?",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Unterhaltung stummschalten",
"status.open": "Beitrag öffnen",
"status.pin": "Im Profil anheften",
- "status.pinned": "Angehefteter Beitrag",
+ "status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter",
+ "status.quote_error.not_found": "Dieser Beitrag kann nicht angezeigt werden.",
+ "status.quote_error.pending_approval": "Dieser Beitrag muss noch durch das ursprüngliche Profil genehmigt werden.",
+ "status.quote_error.rejected": "Dieser Beitrag kann nicht angezeigt werden, weil das ursprüngliche Profil das Zitieren nicht erlaubt.",
+ "status.quote_error.removed": "Dieser Beitrag wurde durch das Profil entfernt.",
+ "status.quote_error.unauthorized": "Dieser Beitrag kann nicht angezeigt werden, weil du zum Ansehen nicht berechtigt bist.",
+ "status.quote_post_author": "Beitrag von {name}",
"status.read_more": "Gesamten Beitrag anschauen",
"status.reblog": "Teilen",
"status.reblog_private": "Mit der ursprünglichen Zielgruppe teilen",
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 0b9e42cbe9..af4cc77dce 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -23,10 +23,11 @@
"account.copy": "Αντιγραφή συνδέσμου προφίλ",
"account.direct": "Ιδιωτική αναφορά @{name}",
"account.disable_notifications": "Σταμάτα να με ειδοποιείς όταν δημοσιεύει ο @{name}",
- "account.domain_blocked": "Ο τομέας αποκλείστηκε",
"account.edit_profile": "Επεξεργασία προφίλ",
"account.enable_notifications": "Ειδοποίησέ με όταν δημοσιεύει ο @{name}",
"account.endorse": "Προβολή στο προφίλ",
+ "account.featured": "Προτεινόμενα",
+ "account.featured.hashtags": "Ετικέτες",
"account.featured_tags.last_status_at": "Τελευταία ανάρτηση στις {date}",
"account.featured_tags.last_status_never": "Καμία ανάρτηση",
"account.follow": "Ακολούθησε",
@@ -51,7 +52,6 @@
"account.mute_notifications_short": "Σίγαση ειδοποιήσεων",
"account.mute_short": "Σίγαση",
"account.muted": "Αποσιωπημένος/η",
- "account.mutual": "Αμοιβαίοι",
"account.no_bio": "Δεν υπάρχει περιγραφή.",
"account.open_original_page": "Ανοικτό",
"account.posts": "Τουτ",
@@ -64,6 +64,7 @@
"account.statuses_counter": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}",
"account.unblock": "Άρση αποκλεισμού @{name}",
"account.unblock_domain": "Άρση αποκλεισμού του τομέα {domain}",
+ "account.unblock_domain_short": "Άρση αποκλ.",
"account.unblock_short": "Άρση αποκλεισμού",
"account.unendorse": "Να μην παρέχεται στο προφίλ",
"account.unfollow": "Άρση ακολούθησης",
@@ -376,6 +377,8 @@
"generic.saved": "Αποθηκεύτηκε",
"getting_started.heading": "Ας ξεκινήσουμε",
"hashtag.admin_moderation": "Άνοιγμα διεπαφής συντονισμού για το #{name}",
+ "hashtag.browse": "Περιήγηση αναρτήσεων με #{hashtag}",
+ "hashtag.browse_from_account": "Περιήγηση αναρτήσεων από @{name} σε #{hashtag}",
"hashtag.column_header.tag_mode.all": "και {additional}",
"hashtag.column_header.tag_mode.any": "ή {additional}",
"hashtag.column_header.tag_mode.none": "χωρίς {additional}",
@@ -389,6 +392,7 @@
"hashtag.counter_by_uses": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}} σήμερα",
"hashtag.follow": "Παρακολούθηση ετικέτας",
+ "hashtag.mute": "Σίγαση #{hashtag}",
"hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας",
"hashtags.and_other": "…και {count, plural, one {}other {# ακόμη}}",
"hints.profiles.followers_may_be_missing": "Μπορεί να λείπουν ακόλουθοι για αυτό το προφίλ.",
@@ -494,7 +498,6 @@
"lists.exclusive": "Απόκρυψη μελών από την Αρχική",
"lists.exclusive_hint": "Αν κάποιος είναι σε αυτή τη λίστα, απόκρυψέ τον στην Αρχική σου για να αποφύγεις να βλέπεις τις αναρτήσεις του δύο φορές.",
"lists.find_users_to_add": "Εύρεση χρηστών για προσθήκη",
- "lists.list_members": "Λίστα μελών",
"lists.list_members_count": "{count, plural, one {# μέλος} other {# μέλη}}",
"lists.list_name": "Όνομα λίστας",
"lists.new_list_name": "Νέο όνομα λίστας",
@@ -840,7 +843,6 @@
"status.mute_conversation": "Σίγαση συνομιλίας",
"status.open": "Επέκταση ανάρτησης",
"status.pin": "Καρφίτσωσε στο προφίλ",
- "status.pinned": "Καρφιτσωμένη ανάρτηση",
"status.read_more": "Διάβασε περισότερα",
"status.reblog": "Ενίσχυση",
"status.reblog_private": "Ενίσχυση με αρχική ορατότητα",
@@ -871,7 +873,9 @@
"subscribed_languages.target": "Αλλαγή εγγεγραμμένων γλωσσών για {target}",
"tabs_bar.home": "Αρχική",
"tabs_bar.notifications": "Ειδοποιήσεις",
+ "terms_of_service.effective_as_of": "Ενεργό από {date}",
"terms_of_service.title": "Όροι Παροχής Υπηρεσιών",
+ "terms_of_service.upcoming_changes_on": "Επερχόμενες αλλαγές στις {date}",
"time_remaining.days": "απομένουν {number, plural, one {# ημέρα} other {# ημέρες}}",
"time_remaining.hours": "απομένουν {number, plural, one {# ώρα} other {# ώρες}}",
"time_remaining.minutes": "απομένουν {number, plural, one {# λεπτό} other {# λεπτά}}",
@@ -902,6 +906,12 @@
"video.expand": "Επέκταση βίντεο",
"video.fullscreen": "Πλήρης οθόνη",
"video.hide": "Απόκρυψη βίντεο",
+ "video.mute": "Σίγαση",
"video.pause": "Παύση",
- "video.play": "Αναπαραγωγή"
+ "video.play": "Αναπαραγωγή",
+ "video.skip_backward": "Παράλειψη πίσω",
+ "video.skip_forward": "Παράλειψη εμπρός",
+ "video.unmute": "Άρση σίγασης",
+ "video.volume_down": "Μείωση έντασης",
+ "video.volume_up": "Αύξηση έντασης"
}
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index b46d02baa9..5bb855983e 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderated servers",
"about.contact": "Contact:",
+ "about.default_locale": "Default",
"about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Reason not available",
"about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the Fediverse. These are the exceptions that have been made on this particular server.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limited",
"about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
"about.domain_blocks.suspended.title": "Suspended",
+ "about.language_label": "Language",
"about.not_available": "This information has not been made available on this server.",
"about.powered_by": "Decentralised social media powered by {mastodon}",
"about.rules": "Server rules",
@@ -19,14 +21,21 @@
"account.block_domain": "Block domain {domain}",
"account.block_short": "Block",
"account.blocked": "Blocked",
+ "account.blocking": "Blocking",
"account.cancel_follow_request": "Cancel follow",
"account.copy": "Copy link to profile",
"account.direct": "Privately mention @{name}",
"account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Domain blocked",
+ "account.domain_blocking": "Blocking domain",
"account.edit_profile": "Edit profile",
"account.enable_notifications": "Notify me when @{name} posts",
"account.endorse": "Feature on profile",
+ "account.familiar_followers_many": "Followed by {name1}, {name2}, and {othersCount, plural, one {one other you know} other {# others you know}}",
+ "account.familiar_followers_one": "Followed by {name1}",
+ "account.familiar_followers_two": "Followed by {name1} and {name2}",
+ "account.featured": "Featured",
+ "account.featured.accounts": "Profiles",
+ "account.featured.hashtags": "Hashtags",
"account.featured_tags.last_status_at": "Last post on {date}",
"account.featured_tags.last_status_never": "No posts",
"account.follow": "Follow",
@@ -34,9 +43,11 @@
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
"account.followers_counter": "{count, plural, one {{counter} follower} other {{counter} followers}}",
+ "account.followers_you_know_counter": "{counter} you know",
"account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.follows_you": "Follows you",
"account.go_to_profile": "Go to profile",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.in_memoriam": "In Memoriam.",
@@ -51,19 +62,23 @@
"account.mute_notifications_short": "Mute notifications",
"account.mute_short": "Mute",
"account.muted": "Muted",
- "account.mutual": "Mutual",
+ "account.muting": "Muting",
+ "account.mutual": "You follow each other",
"account.no_bio": "No description provided.",
"account.open_original_page": "Open original page",
"account.posts": "Posts",
"account.posts_with_replies": "Posts and replies",
+ "account.remove_from_followers": "Remove {name} from followers",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
+ "account.requests_to_follow_you": "Requests to follow you",
"account.share": "Share @{name}'s profile",
"account.show_reblogs": "Show boosts from @{name}",
"account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}",
"account.unblock": "Unblock @{name}",
"account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_domain_short": "Unblock",
"account.unblock_short": "Unblock",
"account.unendorse": "Don't feature on profile",
"account.unfollow": "Unfollow",
@@ -225,6 +240,9 @@
"confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
"confirmations.redraft.title": "Delete & redraft post?",
+ "confirmations.remove_from_followers.confirm": "Remove follower",
+ "confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?",
+ "confirmations.remove_from_followers.title": "Remove follower?",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.reply.title": "Overwrite post?",
@@ -292,6 +310,9 @@
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
+ "empty_column.account_featured.me": "You have not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?",
+ "empty_column.account_featured.other": "{acct} has not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?",
+ "empty_column.account_featured_other.unknown": "This account has not featured anything yet.",
"empty_column.account_hides_collections": "This user has chosen to not make this information available",
"empty_column.account_suspended": "Account suspended",
"empty_column.account_timeline": "No posts here!",
@@ -324,6 +345,11 @@
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
+ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}",
+ "featured_carousel.next": "Next",
+ "featured_carousel.post": "Post",
+ "featured_carousel.previous": "Previous",
+ "featured_carousel.slide": "{index} of {total}",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -376,6 +402,8 @@
"generic.saved": "Saved",
"getting_started.heading": "Getting started",
"hashtag.admin_moderation": "Open moderation interface for #{name}",
+ "hashtag.browse": "Browse posts in #{hashtag}",
+ "hashtag.browse_from_account": "Browse posts from @{name} in #{hashtag}",
"hashtag.column_header.tag_mode.all": "and {additional}",
"hashtag.column_header.tag_mode.any": "or {additional}",
"hashtag.column_header.tag_mode.none": "without {additional}",
@@ -388,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"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.feature": "Feature on profile",
"hashtag.follow": "Follow hashtag",
+ "hashtag.mute": "Mute #{hashtag}",
+ "hashtag.unfeature": "Don't feature on profile",
"hashtag.unfollow": "Unfollow hashtag",
"hashtags.and_other": "…and {count, plural, one {one more} other {# more}}",
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
@@ -399,6 +430,7 @@
"hints.profiles.see_more_posts": "See more posts on {domain}",
"hints.threads.replies_may_be_missing": "Replies from other servers may be missing.",
"hints.threads.see_more": "See more replies on {domain}",
+ "home.column_settings.show_quotes": "Show quotes",
"home.column_settings.show_reblogs": "Show boosts",
"home.column_settings.show_replies": "Show replies",
"home.hide_announcements": "Hide announcements",
@@ -494,7 +526,6 @@
"lists.exclusive": "Hide members in Home",
"lists.exclusive_hint": "If someone is on this list, hide them in your Home feed to avoid seeing their posts twice.",
"lists.find_users_to_add": "Find users to add",
- "lists.list_members": "List members",
"lists.list_members_count": "{count, plural, one {# member} other {# members}}",
"lists.list_name": "List name",
"lists.new_list_name": "New list name",
@@ -840,7 +871,13 @@
"status.mute_conversation": "Mute conversation",
"status.open": "Expand this post",
"status.pin": "Pin on profile",
- "status.pinned": "Pinned post",
+ "status.quote_error.filtered": "Hidden due to one of your filters",
+ "status.quote_error.not_found": "This post cannot be displayed.",
+ "status.quote_error.pending_approval": "This post is pending approval from the original author.",
+ "status.quote_error.rejected": "This post cannot be displayed as the original author does not allow it to be quoted.",
+ "status.quote_error.removed": "This post was removed by its author.",
+ "status.quote_error.unauthorized": "This post cannot be displayed as you are not authorised",
+ "status.quote_post_author": "Post by {name}",
"status.read_more": "Read more",
"status.reblog": "Boost",
"status.reblog_private": "Boost with original visibility",
@@ -871,7 +908,9 @@
"subscribed_languages.target": "Change subscribed languages for {target}",
"tabs_bar.home": "Home",
"tabs_bar.notifications": "Notifications",
+ "terms_of_service.effective_as_of": "Effective as of {date}",
"terms_of_service.title": "Terms of Service",
+ "terms_of_service.upcoming_changes_on": "Upcoming changes on {date}",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
@@ -902,6 +941,12 @@
"video.expand": "Expand video",
"video.fullscreen": "Full screen",
"video.hide": "Hide video",
+ "video.mute": "Mute",
"video.pause": "Pause",
- "video.play": "Play"
+ "video.play": "Play",
+ "video.skip_backward": "Skip backward",
+ "video.skip_forward": "Skip forward",
+ "video.unmute": "Unmute",
+ "video.volume_down": "Volume down",
+ "video.volume_up": "Volume up"
}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index ade34591a5..da9d6f42c1 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderated servers",
"about.contact": "Contact:",
+ "about.default_locale": "Default",
"about.disabled": "Disabled",
"about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Reason not available",
@@ -15,6 +16,7 @@
"about.full_text_search": "Full text search",
"about.kmyblue_capabilities": "Features available in this server",
"about.kmyblue_capability": "This server is using kmyblue, a fork of Mastodon. On this server, kmyblues unique features are configured as follows.",
+ "about.language_label": "Language",
"about.not_available": "This information has not been made available on this server.",
"about.powered_by": "Decentralized social media powered by {mastodon}",
"about.public_visibility": "Public visibility",
@@ -30,17 +32,21 @@
"account.block_domain": "Block domain {domain}",
"account.block_short": "Block",
"account.blocked": "Blocked",
+ "account.blocking": "Blocking",
"account.cancel_follow_request": "Cancel follow",
"account.copy": "Copy link to profile",
"account.direct": "Privately mention @{name}",
"account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Domain blocked",
+ "account.domain_blocking": "Blocking domain",
"account.edit_profile": "Edit profile",
"account.enable_notifications": "Notify me when @{name} posts",
"account.endorse": "Feature on profile",
+ "account.familiar_followers_many": "Followed by {name1}, {name2}, and {othersCount, plural, one {one other you know} other {# others you know}}",
+ "account.familiar_followers_one": "Followed by {name1}",
+ "account.familiar_followers_two": "Followed by {name1} and {name2}",
"account.featured": "Featured",
+ "account.featured.accounts": "Profiles",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Posts",
"account.featured_tags.last_status_at": "Last post on {date}",
"account.featured_tags.last_status_never": "No posts",
"account.follow": "Follow",
@@ -49,9 +55,11 @@
"account.followers.empty": "No one follows this user yet.",
"account.followers.hidden_from_me": "This information is hidden by your setting.",
"account.followers_counter": "{count, plural, one {{counter} follower} other {{counter} followers}}",
+ "account.followers_you_know_counter": "{counter} you know",
"account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}",
"account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.follows_you": "Follows you",
"account.go_to_profile": "Go to profile",
"account.hide_reblogs": "Hide boosts from @{name}",
"account.in_memoriam": "In Memoriam.",
@@ -66,14 +74,17 @@
"account.mute_notifications_short": "Mute notifications",
"account.mute_short": "Mute",
"account.muted": "Muted",
- "account.mutual": "Mutual",
+ "account.muting": "Muting",
+ "account.mutual": "You follow each other",
"account.no_bio": "No description provided.",
"account.open_original_page": "Open original page",
"account.posts": "Posts",
"account.posts_with_replies": "Posts and replies",
+ "account.remove_from_followers": "Remove {name} from followers",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
+ "account.requests_to_follow_you": "Requests to follow you",
"account.share": "Share @{name}'s profile",
"account.show_reblogs": "Show boosts from @{name}",
"account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}",
@@ -325,7 +336,6 @@
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
"compose_form.poll.type": "Style",
"compose_form.publish": "Post",
- "compose_form.publish_form": "New post",
"compose_form.reply": "Reply",
"compose_form.save_changes": "Update",
"compose_form.searchability_warning": "Self only searchability is not available other mastodon servers. Others can search your post.",
@@ -368,6 +378,9 @@
"confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.",
"confirmations.redraft.title": "Delete & redraft post?",
+ "confirmations.remove_from_followers.confirm": "Remove follower",
+ "confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?",
+ "confirmations.remove_from_followers.title": "Remove follower?",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.reply.title": "Overwrite post?",
@@ -435,7 +448,9 @@
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
- "empty_column.account_featured": "This list is empty",
+ "empty_column.account_featured.me": "You have not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?",
+ "empty_column.account_featured.other": "{acct} has not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?",
+ "empty_column.account_featured_other.unknown": "This account has not featured anything yet.",
"empty_column.account_hides_collections": "This user has chosen to not make this information available",
"empty_column.account_suspended": "Account suspended",
"empty_column.account_timeline": "No posts here!",
@@ -462,7 +477,7 @@
"empty_column.notification_requests": "All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.",
"empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
- "empty_column.status_references": "No one has quotes this post yet. When someone does, they will show up here.",
+ "empty_column.status_references": "No one has links this post yet. When someone does, they will show up here.",
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
"error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
"error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
@@ -474,6 +489,11 @@
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
+ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}",
+ "featured_carousel.next": "Next",
+ "featured_carousel.post": "Post",
+ "featured_carousel.previous": "Previous",
+ "featured_carousel.slide": "{index} of {total}",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -540,8 +560,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
"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.feature": "Feature on profile",
"hashtag.follow": "Follow hashtag",
"hashtag.mute": "Mute #{hashtag}",
+ "hashtag.unfeature": "Don't feature on profile",
"hashtag.unfollow": "Unfollow hashtag",
"hashtags.and_other": "…and {count, plural, other {# more}}",
"hints.profiles.followers_may_be_missing": "Followers for this profile may be missing.",
@@ -552,6 +574,7 @@
"hints.profiles.see_more_posts": "See more posts on {domain}",
"hints.threads.replies_may_be_missing": "Replies from other servers may be missing.",
"hints.threads.see_more": "See more replies on {domain}",
+ "home.column_settings.show_quotes": "Show quotes",
"home.column_settings.show_reblogs": "Show boosts",
"home.column_settings.show_replies": "Show replies",
"home.hide_announcements": "Hide announcements",
@@ -651,7 +674,6 @@
"lists.favourite": "Favorite",
"lists.favourite_hint": "When opening the Web Client on a PC, this list appears in the navigation.",
"lists.find_users_to_add": "Find users to add",
- "lists.list_members": "List members",
"lists.list_members_count": "{count, plural, one {# member} other {# members}}",
"lists.list_name": "List name",
"lists.memo_related_antenna": "Antenna: \"{title}\"",
@@ -683,9 +705,11 @@
"mute_modal.you_wont_see_mentions": "You won't see posts that mention them.",
"mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.",
"navigation_bar.about": "About",
+ "navigation_bar.account_settings": "Password and security",
"navigation_bar.administration": "Administration",
"navigation_bar.advanced_interface": "Open in advanced web interface",
"navigation_bar.antennas": "Antenna",
+ "navigation_bar.automated_deletion": "Automated post deletion",
"navigation_bar.blocks": "Blocked users",
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.circles": "Circles",
@@ -695,26 +719,30 @@
"navigation_bar.direct": "Private mentions",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Blocked domains",
- "navigation_bar.emoji_reactions": "Stamps",
+ "navigation_bar.emoji_reactions": "Emoji reactions",
"navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorites",
"navigation_bar.filters": "Muted words",
"navigation_bar.follow_requests": "Follow requests",
"navigation_bar.followed_tags": "Followed hashtags",
"navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.import_export": "Import and export",
"navigation_bar.lists": "Lists",
"navigation_bar.logout": "Logout",
"navigation_bar.moderation": "Moderation",
+ "navigation_bar.more": "More",
"navigation_bar.mutes": "Muted users",
"navigation_bar.opened_in_classic_interface": "Posts, accounts, and other specific pages are opened by default in the classic web interface.",
"navigation_bar.personal": "Personal",
"navigation_bar.pins": "Pinned posts",
"navigation_bar.preferences": "Preferences",
+ "navigation_bar.privacy_and_reach": "Privacy and reach",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.reaction_deck": "Reaction deck",
- "navigation_bar.refresh": "Refresh",
"navigation_bar.search": "Search",
"navigation_bar.security": "Security",
+ "navigation_panel.collapse_lists": "Collapse list menu",
+ "navigation_panel.expand_lists": "Expand list menu",
"not_signed_in_indicator.not_signed_in": "You need to login to access this resource.",
"notification.admin.report": "{name} reported {target}",
"notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}",
@@ -762,7 +790,7 @@
"notification.relationships_severance_event.learn_more": "Learn more",
"notification.relationships_severance_event.user_domain_block": "You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.",
"notification.status": "{name} just posted",
- "notification.status_reference": "{name} quoted your post",
+ "notification.status_reference": "{name} linked your post",
"notification.update": "{name} edited a post",
"notification_requests.accept": "Accept",
"notification_requests.accept_multiple": "{count, plural, one {Accept # request…} other {Accept # requests…}}",
@@ -804,7 +832,7 @@
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
"notifications.column_settings.status": "New posts:",
- "notifications.column_settings.status_reference": "Quotes:",
+ "notifications.column_settings.status_reference": "Links:",
"notifications.column_settings.unread_notifications.category": "Unread notifications",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
"notifications.column_settings.update": "Edits:",
@@ -815,7 +843,7 @@
"notifications.filter.follows": "Follows",
"notifications.filter.mentions": "Mentions",
"notifications.filter.polls": "Poll results",
- "notifications.filter.status_references": "Quotes",
+ "notifications.filter.status_references": "Links",
"notifications.filter.statuses": "Updates from people you follow",
"notifications.grant_permission": "Grant permission.",
"notifications.group": "{count} notifications",
@@ -898,7 +926,6 @@
"privacy_policy.last_updated": "Last updated {date}",
"privacy_policy.title": "Privacy Policy",
"reaction_deck.add": "Add",
- "reaction_deck.remove": "Remove",
"recommended": "Recommended",
"refresh": "Refresh",
"regeneration_indicator.please_stand_by": "Please stand by.",
@@ -1060,9 +1087,14 @@
"status.mute_conversation": "Mute conversation",
"status.open": "Expand this post",
"status.pin": "Pin on profile",
- "status.pinned": "Pinned post",
- "status.quote": "Quote",
- "status.quotes": "{count, plural, one {quote} other {quotes}}",
+ "status.quote_error.filtered": "Hidden due to one of your filters",
+ "status.quote_error.not_found": "This post cannot be displayed.",
+ "status.quote_error.pending_approval": "This post is pending approval from the original author.",
+ "status.quote_error.rejected": "This post cannot be displayed as the original author does not allow it to be quoted.",
+ "status.quote_error.removed": "This post was removed by its author.",
+ "status.quote_error.unauthorized": "This post cannot be displayed as you are not authorized to view it.",
+ "status.quote_link": "Insert quote link",
+ "status.quote_post_author": "Post by {name}",
"status.read_more": "Read more",
"status.reblog": "Boost",
"status.reblog_private": "Boost with original visibility",
@@ -1071,7 +1103,8 @@
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
"status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
"status.redraft": "Delete & re-draft",
- "status.reference": "Quiet quote",
+ "status.reference": "Link",
+ "status.references": "{count, plural, one {link} other {links}}",
"status.remove_bookmark": "Remove bookmark",
"status.remove_favourite": "Remove from favorites",
"status.replied_in_thread": "Replied in thread",
@@ -1094,7 +1127,10 @@
"subscribed_languages.save": "Save changes",
"subscribed_languages.target": "Change subscribed languages for {target}",
"tabs_bar.home": "Home",
+ "tabs_bar.menu": "Menu",
"tabs_bar.notifications": "Notifications",
+ "tabs_bar.publish": "New Post",
+ "tabs_bar.search": "Search",
"terms_of_service.effective_as_of": "Effective as of {date}",
"terms_of_service.title": "Terms of Service",
"terms_of_service.upcoming_changes_on": "Upcoming changes on {date}",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 1d360e59d7..5d748731d8 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -19,16 +19,18 @@
"account.block_domain": "Bloki la domajnon {domain}",
"account.block_short": "Bloko",
"account.blocked": "Blokita",
+ "account.blocking": "Bloko",
"account.cancel_follow_request": "Nuligi peton por sekvado",
"account.copy": "Kopii ligilon al profilo",
"account.direct": "Private mencii @{name}",
"account.disable_notifications": "Ĉesu sciigi min kiam @{name} afiŝas",
- "account.domain_blocked": "Domajno blokita",
+ "account.domain_blocking": "Blokas domajnon",
"account.edit_profile": "Redakti la profilon",
"account.enable_notifications": "Sciigu min kiam @{name} afiŝos",
- "account.endorse": "Prezenti ĉe via profilo",
+ "account.endorse": "Montri en profilo",
+ "account.featured": "Montrita",
+ "account.featured.accounts": "Profiloj",
"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_never": "Neniu afiŝo",
"account.follow": "Sekvi",
@@ -39,13 +41,14 @@
"account.following": "Sekvatoj",
"account.following_counter": "{count, plural, one {{counter} sekvato} other {{counter} sekvatoj}}",
"account.follows.empty": "La uzanto ankoraŭ ne sekvas iun ajn.",
+ "account.follows_you": "Sekvas vin",
"account.go_to_profile": "Iri al profilo",
"account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
"account.in_memoriam": "Memore.",
"account.joined_short": "Aliĝis",
"account.languages": "Ŝanĝi la abonitajn lingvojn",
- "account.link_verified_on": "Propreco de tiu ligilo estis konfirmita je {date}",
- "account.locked_info": "Tiu konto estas privatigita. La posedanto mane akceptas tiun, kiu povas sekvi rin.",
+ "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}",
+ "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.",
"account.media": "Aŭdovidaĵoj",
"account.mention": "Mencii @{name}",
"account.moved_to": "{name} indikis, ke ria nova konto estas nun:",
@@ -53,14 +56,17 @@
"account.mute_notifications_short": "Silentigu sciigojn",
"account.mute_short": "Silentigu",
"account.muted": "Silentigita",
- "account.mutual": "Reciproka",
+ "account.muting": "Silentas",
+ "account.mutual": "Vi sekvas unu la alian",
"account.no_bio": "Neniu priskribo estas provizita.",
"account.open_original_page": "Malfermi la originalan paĝon",
"account.posts": "Afiŝoj",
"account.posts_with_replies": "Afiŝoj kaj respondoj",
+ "account.remove_from_followers": "Forigi {name}-n de sekvantoj",
"account.report": "Raporti @{name}",
"account.requested": "Atendo de aprobo. Klaku por nuligi la peton por sekvado",
"account.requested_follow": "{name} petis sekvi vin",
+ "account.requests_to_follow_you": "Petoj sekvi vin",
"account.share": "Diskonigi la profilon de @{name}",
"account.show_reblogs": "Montri diskonigojn de @{name}",
"account.statuses_counter": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}}",
@@ -69,24 +75,24 @@
"account.unblock_domain_short": "Malbloki",
"account.unblock_short": "Malbloki",
"account.unendorse": "Ne plu rekomendi ĉe la profilo",
- "account.unfollow": "Ĉesi sekvi",
- "account.unmute": "Ne plu silentigi @{name}",
+ "account.unfollow": "Ne plu sekvi",
+ "account.unmute": "Malsilentigi @{name}",
"account.unmute_notifications_short": "Malsilentigu sciigojn",
"account.unmute_short": "Ne plu silentigi",
"account_note.placeholder": "Alklaku por aldoni noton",
- "admin.dashboard.daily_retention": "Uzantoretenprocento lau tag post registro",
- "admin.dashboard.monthly_retention": "Uzantoretenprocento lau monato post registro",
- "admin.dashboard.retention.average": "Averaĝe",
+ "admin.dashboard.daily_retention": "Uzantoretenprocento laŭ tag post registro",
+ "admin.dashboard.monthly_retention": "Uzantoretenprocento laŭ monato post registro",
+ "admin.dashboard.retention.average": "Averaĝa",
"admin.dashboard.retention.cohort": "Monato de registriĝo",
"admin.dashboard.retention.cohort_size": "Novaj uzantoj",
- "admin.impact_report.instance_accounts": "Kontoj kaj profiloj tio forigus",
+ "admin.impact_report.instance_accounts": "Kontojn kaj profilojn tio forigus",
"admin.impact_report.instance_followers": "Sekvantojn niaj uzantoj perdus",
"admin.impact_report.instance_follows": "Sekvantojn ties uzantoj perdus",
"admin.impact_report.title": "Influa reporto",
"alert.rate_limited.message": "Bonvolu reprovi poste {retry_time, time, medium}.",
"alert.rate_limited.title": "Mesaĝkvante limigita",
"alert.unexpected.message": "Neatendita eraro okazis.",
- "alert.unexpected.title": "Aj!",
+ "alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Alt-teksto",
"alt_text_modal.add_alt_text": "Aldoni alttekston",
"alt_text_modal.add_text_from_image": "Aldoni tekston de bildo",
@@ -96,9 +102,9 @@
"alt_text_modal.describe_for_people_with_visual_impairments": "Priskribi ĉi tion por homoj kun vidaj malkapabloj…",
"alt_text_modal.done": "Farita",
"announcement.announcement": "Anonco",
- "annual_report.summary.archetype.booster": "La Ĉasanto de Mojoso",
+ "annual_report.summary.archetype.booster": "La ĉasanto de mojoso",
"annual_report.summary.archetype.lurker": "La vidanto",
- "annual_report.summary.archetype.oracle": "La Orakolo",
+ "annual_report.summary.archetype.oracle": "La orakolo",
"annual_report.summary.archetype.pollster": "La balotenketisto",
"annual_report.summary.archetype.replier": "La plej societema",
"annual_report.summary.followers.followers": "sekvantoj",
@@ -108,11 +114,11 @@
"annual_report.summary.highlighted_post.by_reblogs": "plej diskonigita afiŝo",
"annual_report.summary.highlighted_post.by_replies": "afiŝo kun la plej multaj respondoj",
"annual_report.summary.highlighted_post.possessive": "de {name}",
- "annual_report.summary.most_used_app.most_used_app": "plej uzita apo",
+ "annual_report.summary.most_used_app.most_used_app": "plej uzita aplikaĵo",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "plej uzata kradvorto",
"annual_report.summary.most_used_hashtag.none": "Nenio",
"annual_report.summary.new_posts.new_posts": "novaj afiŝoj",
- "annual_report.summary.percentile.text": "Tio metas vin en la plej de {domain} uzantoj. ",
+ "annual_report.summary.percentile.text": "Tion metas vin en la plej de {domain} uzantoj. ",
"annual_report.summary.percentile.we_wont_tell_bernie": "Ni ne diros al Zamenhof.",
"annual_report.summary.thanks": "Dankon pro esti parto de Mastodon!",
"attachments_list.unprocessed": "(neprilaborita)",
@@ -144,7 +150,7 @@
"closed_registrations_modal.description": "Krei konton ĉe {domain} aktuale ne eblas, tamen bonvole rimarku, ke vi ne bezonas konton specife ĉe {domain} por uzi Mastodon.",
"closed_registrations_modal.find_another_server": "Trovi alian servilon",
"closed_registrations_modal.preamble": "Mastodon estas malcentraliza, do sendepende de tio, kie vi kreas vian konton, vi povos sekvi kaj komuniki kun ĉiuj ajn el ĉi tiu servilo. Vi eĉ povas mem starigi propran servilon!",
- "closed_registrations_modal.title": "Krei konton en Mastodon",
+ "closed_registrations_modal.title": "Registriĝi en Mastodon",
"column.about": "Pri",
"column.blocks": "Blokitaj uzantoj",
"column.bookmarks": "Legosignoj",
@@ -163,18 +169,18 @@
"column.mutes": "Silentigitaj uzantoj",
"column.notifications": "Sciigoj",
"column.pins": "Alpinglitaj afiŝoj",
- "column.public": "Fratara templinio",
+ "column.public": "Fratara tempolinio",
"column_back_button.label": "Reveni",
- "column_header.hide_settings": "Kaŝi la agordojn",
+ "column_header.hide_settings": "Kaŝi agordojn",
"column_header.moveLeft_settings": "Movi kolumnon maldekstren",
"column_header.moveRight_settings": "Movi kolumnon dekstren",
"column_header.pin": "Fiksi",
- "column_header.show_settings": "Montri la agordojn",
+ "column_header.show_settings": "Montri agordojn",
"column_header.unpin": "Malfiksi",
"column_search.cancel": "Nuligi",
"column_subheading.settings": "Agordoj",
"community.column_settings.local_only": "Nur loka",
- "community.column_settings.media_only": "Nur vidaŭdaĵoj",
+ "community.column_settings.media_only": "Nur aŭdovidaĵoj",
"community.column_settings.remote_only": "Nur fora",
"compose.language.change": "Ŝanĝi lingvon",
"compose.language.search": "Serĉi lingvojn...",
@@ -184,18 +190,18 @@
"compose_form.direct_message_warning_learn_more": "Lerni pli",
"compose_form.encryption_warning": "La afiŝoj en Mastodon ne estas tutvoje ĉifritaj. Ne kunhavigu tiklajn informojn ĉe Mastodon.",
"compose_form.hashtag_warning": "Ĉi tiu afiŝo ne estos listigita en neniu kradvorto ĉar ĝi ne estas publika. Nur publikaj afiŝoj povas esti serĉitaj per kradvortoj.",
- "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn afiŝojn nur al la sekvantoj.",
+ "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.",
"compose_form.lock_disclaimer.lock": "ŝlosita",
- "compose_form.placeholder": "Kion vi pensas?",
+ "compose_form.placeholder": "Pri kio vi pensas?",
"compose_form.poll.duration": "Daŭro de la balotenketo",
- "compose_form.poll.multiple": "Multobla elekto",
+ "compose_form.poll.multiple": "Multebla elekto",
"compose_form.poll.option_placeholder": "Opcio {number}",
"compose_form.poll.single": "Ununura elekto",
"compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn",
"compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
"compose_form.poll.type": "Stilo",
- "compose_form.publish": "Afiŝo",
- "compose_form.publish_form": "Nova afiŝo",
+ "compose_form.publish": "Afiŝi",
+ "compose_form.publish_form": "Afiŝi",
"compose_form.reply": "Respondi",
"compose_form.save_changes": "Ĝisdatigi",
"compose_form.spoiler.marked": "Forigi la averton de enhavo",
@@ -228,6 +234,9 @@
"confirmations.redraft.confirm": "Forigi kaj reskribi",
"confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun afiŝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
"confirmations.redraft.title": "Ĉu forigi kaj redakcii afiŝon?",
+ "confirmations.remove_from_followers.confirm": "Forigi sekvanton",
+ "confirmations.remove_from_followers.message": "{name} ne plu sekvos vin. Ĉu vi certas ke vi volas daŭri?",
+ "confirmations.remove_from_followers.title": "Forigi sekvanton?",
"confirmations.reply.confirm": "Respondi",
"confirmations.reply.message": "Respondi nun anstataŭigos la skribatan afiŝon. Ĉu vi certas, ke vi volas daŭrigi?",
"confirmations.reply.title": "Ĉu superskribi afiŝon?",
@@ -252,7 +261,7 @@
"disabled_account_banner.text": "Via konto {disabledAccount} estas nune malvalidigita.",
"dismissable_banner.community_timeline": "Jen la plej novaj publikaj afiŝoj de uzantoj, kies kontojn gastigas {domain}.",
"dismissable_banner.dismiss": "Eksigi",
- "dismissable_banner.explore_links": "Ĉi tiuj revuaĵoj plejkunhaviĝas en la fediverso hodiaŭ. Pli novaj revuaĵoj afiŝis de pli da homoj metis pli alte.",
+ "dismissable_banner.explore_links": "Ĉi tiuj revuaĵoj kunhaviĝas pleje en la fediverso hodiaŭ. Pli novaj revuaĵoj afiŝis de pli da homoj metis pli alte.",
"dismissable_banner.explore_statuses": "Ĉi tiuj afiŝoj populariĝas sur la fediverso hodiaŭ. Pli novaj afiŝoj kun pli da diskonigoj kaj stemuloj estas rangigitaj pli alte.",
"dismissable_banner.explore_tags": "Ĉi tiuj kradvortoj populariĝas sur la fediverso hodiaŭ. Kradvortoj, kiuj estas uzataj de pli malsamaj homoj, estas rangigitaj pli alte.",
"dismissable_banner.public_timeline": "Ĉi tiuj estas la plej ĵusaj publikaj afiŝoj de homoj en la fediverso, kiujn la homoj en {domain} sekvas.",
@@ -261,11 +270,11 @@
"domain_block_modal.they_can_interact_with_old_posts": "Homoj de ĉi tiu servilo povas interagi kun viaj malnovaj afiŝoj.",
"domain_block_modal.they_cant_follow": "Neniu el ĉi tiu servilo povas sekvi vin.",
"domain_block_modal.they_wont_know": "Ili ne scios, ke ili estas blokitaj.",
- "domain_block_modal.title": "Ĉu bloki la domajnon?",
+ "domain_block_modal.title": "Ĉu bloki domajnon?",
"domain_block_modal.you_will_lose_num_followers": "Vi perdos {followersCount, plural, one {{followersCountDisplay} sekvanton} other {{followersCountDisplay} sekvantojn}} kaj {followingCount, plural, one {{followingCountDisplay} homon, kiu vi sekvas} other {{followingCountDisplay} homojn, kiuj vi sekvas}}.",
"domain_block_modal.you_will_lose_relationships": "Vi perdos ĉiujn sekvantojn kaj homojn, kiujn vi sekvas de ĉi tiu servilo.",
"domain_block_modal.you_wont_see_posts": "Vi ne vidos afiŝojn aŭ sciigojn de uzantoj sur ĉi tiu servilo.",
- "domain_pill.activitypub_lets_connect": "Ĝi ebligas vin konekti kaj interagi kun homoj ne nur sur Mastodon, sed ankaŭ tra diversaj sociaj apoj.",
+ "domain_pill.activitypub_lets_connect": "Ĝi ebligas vin konekti kaj interagi kun homoj ne nur sur Mastodon, sed ankaŭ tra diversaj sociaj aplikaĵoj.",
"domain_pill.activitypub_like_language": "ActivityPub estas kiel la lingvo kiun Mastodon parolas kun aliaj sociaj retoj.",
"domain_pill.server": "Servilo",
"domain_pill.their_handle": "Ilia identigo:",
@@ -295,7 +304,7 @@
"emoji_button.search_results": "Serĉaj rezultoj",
"emoji_button.symbols": "Simboloj",
"emoji_button.travel": "Vojaĝoj kaj lokoj",
- "empty_column.account_featured": "Ĉi tiu listo estas malplena",
+ "empty_column.account_featured_other.unknown": "Ĉi tiu konto ankoraŭ ne montris ion ajn.",
"empty_column.account_hides_collections": "Ĉi tiu uzanto elektis ne disponebligi ĉi tiu informon",
"empty_column.account_suspended": "Konto suspendita",
"empty_column.account_timeline": "Neniuj afiŝoj ĉi tie!",
@@ -380,6 +389,8 @@
"generic.saved": "Konservita",
"getting_started.heading": "Por komenci",
"hashtag.admin_moderation": "Malfermi fasadon de moderigado por #{name}",
+ "hashtag.browse": "Folii afiŝojn en #{hashtag}",
+ "hashtag.browse_from_account": "Folii afiŝojn de @{name} en #{hashtag}",
"hashtag.column_header.tag_mode.all": "kaj {additional}",
"hashtag.column_header.tag_mode.any": "aŭ {additional}",
"hashtag.column_header.tag_mode.none": "sen {additional}",
@@ -392,7 +403,10 @@
"hashtag.counter_by_accounts": "{count, plural,one {{counter} partoprenanto} other {{counter} partoprenantoj}}",
"hashtag.counter_by_uses": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}}",
"hashtag.counter_by_uses_today": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}} hodiaŭ",
+ "hashtag.feature": "Prezenti en profilo",
"hashtag.follow": "Sekvi la kradvorton",
+ "hashtag.mute": "Silentigi #{hashtag}",
+ "hashtag.unfeature": "Ne prezenti en profilo",
"hashtag.unfollow": "Ne plu sekvi la kradvorton",
"hashtags.and_other": "…kaj {count, plural,other {# pli}}",
"hints.profiles.followers_may_be_missing": "Sekvantoj por ĉi tiu profilo eble mankas.",
@@ -498,7 +512,6 @@
"lists.exclusive": "Kaŝi membrojn en Hejmpaĝo",
"lists.exclusive_hint": "Se iu estas en ĉi tiuj listo, kaŝu ilin en via hejmpaĝo por eviti vidi iliajn afiŝojn dufoje.",
"lists.find_users_to_add": "Trovi uzantojn por aldoni",
- "lists.list_members": "Listoj de membroj",
"lists.list_members_count": "{count, plural,one {# membro} other {# membroj}}",
"lists.list_name": "Nomo de la listo",
"lists.new_list_name": "Nomo de nova listo",
@@ -844,7 +857,6 @@
"status.mute_conversation": "Silentigi konversacion",
"status.open": "Pligrandigu ĉi tiun afiŝon",
"status.pin": "Alpingli al la profilo",
- "status.pinned": "Alpinglita afiŝo",
"status.read_more": "Legi pli",
"status.reblog": "Diskonigi",
"status.reblog_private": "Diskonigi kun la sama videbleco",
@@ -911,5 +923,9 @@
"video.mute": "Silentigi",
"video.pause": "Paŭzigi",
"video.play": "Ekigi",
- "video.unmute": "Ne plu silentigi"
+ "video.skip_backward": "Preterpasi malantaŭen",
+ "video.skip_forward": "Preterpasi antaŭen",
+ "video.unmute": "Ne plu silentigi",
+ "video.volume_down": "Laŭteco Malpliigi",
+ "video.volume_up": "Laŭteco pliigi"
}
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index bf6d620474..4c2496ec8c 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidores moderados",
"about.contact": "Contacto:",
+ "about.default_locale": "Predeterminado",
"about.disclaimer": "Mastodon es software libre y de código abierto y una marca comercial de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo no disponible",
"about.domain_blocks.preamble": "Mastodon normalmente te permite ver el contenido e interactuar con los usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitados",
"about.domain_blocks.suspended.explanation": "Ningún dato de este servidor será procesado, almacenado o intercambiado, haciendo imposible cualquier interacción o comunicación con los usuarios de este servidor.",
"about.domain_blocks.suspended.title": "Suspendidos",
+ "about.language_label": "Idioma",
"about.not_available": "Esta información no está disponible en este servidor.",
"about.powered_by": "Redes sociales descentralizadas con tecnología de {mastodon}",
"about.rules": "Reglas del servidor",
@@ -19,17 +21,21 @@
"account.block_domain": "Bloquear dominio {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueado",
+ "account.blocking": "Bloqueo",
"account.cancel_follow_request": "Dejar de seguir",
"account.copy": "Copiar enlace al perfil",
"account.direct": "Mención privada a @{name}",
"account.disable_notifications": "Dejar de notificarme cuando @{name} envíe mensajes",
- "account.domain_blocked": "Dominio bloqueado",
+ "account.domain_blocking": "Dominio bloqueado",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificarme cuando @{name} envíe mensajes",
"account.endorse": "Destacar en el perfil",
+ "account.familiar_followers_many": "Seguido por {name1}, {name2} y {othersCount, plural, one {# cuenta más que conocés} other {# cuentas más que conocés}}",
+ "account.familiar_followers_one": "Seguido por {name1}",
+ "account.familiar_followers_two": "Seguido por {name1} y {name2}",
"account.featured": "Destacados",
+ "account.featured.accounts": "Perfiles",
"account.featured.hashtags": "Etiquetas",
- "account.featured.posts": "Mensajes",
"account.featured_tags.last_status_at": "Último mensaje: {date}",
"account.featured_tags.last_status_never": "Sin mensajes",
"account.follow": "Seguir",
@@ -37,9 +43,11 @@
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.followers_you_know_counter": "{counter} seguidores que conocés",
"account.following": "Siguiendo",
"account.following_counter": "{count, plural, one {siguiendo a {counter}} other {siguiendo a {counter}}}",
"account.follows.empty": "Todavía este usuario no sigue a nadie.",
+ "account.follows_you": "Te sigue",
"account.go_to_profile": "Ir al perfil",
"account.hide_reblogs": "Ocultar adhesiones de @{name}",
"account.in_memoriam": "Cuenta conmemorativa.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silenciar notificaciones",
"account.mute_short": "Silenciar",
"account.muted": "Silenciado",
- "account.mutual": "Seguimiento mutuo",
+ "account.muting": "Silenciada",
+ "account.mutual": "Se siguen mutuamente",
"account.no_bio": "Sin descripción provista.",
"account.open_original_page": "Abrir página original",
"account.posts": "Mensajes",
"account.posts_with_replies": "Mnsjs y resp. públicas",
+ "account.remove_from_followers": "Quitar a {name} de tus seguidores",
"account.report": "Denunciar a @{name}",
"account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento",
"account.requested_follow": "{name} solicitó seguirte",
+ "account.requests_to_follow_you": "Solicita seguirte",
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar adhesiones de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Eliminar mensaje original y editarlo",
"confirmations.redraft.message": "¿Estás seguro que querés eliminar este mensaje y volver a editarlo? Se perderán las veces marcadas como favorito y sus adhesiones, y las respuestas al mensaje original quedarán huérfanas.",
"confirmations.redraft.title": "¿Eliminar y volver a redactar mensaje?",
+ "confirmations.remove_from_followers.confirm": "Quitar seguidor",
+ "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que querés continuar?",
+ "confirmations.remove_from_followers.title": "¿Quitar seguidor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
"confirmations.reply.title": "¿Sobrescribir mensaje?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Resultados de búsqueda",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viajes y lugares",
- "empty_column.account_featured": "Esta lista está vacía",
+ "empty_column.account_featured.me": "Todavía no destacaste nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?",
+ "empty_column.account_featured.other": "{acct} todavía no destacó nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?",
+ "empty_column.account_featured_other.unknown": "Esta cuenta todavía no destacó nada.",
"empty_column.account_hides_collections": "Este usuario eligió no publicar esta información",
"empty_column.account_suspended": "Cuenta suspendida",
"empty_column.account_timeline": "¡No hay mensajes acá!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Noticias",
"explore.trending_statuses": "Mensajes",
"explore.trending_tags": "Etiquetas",
+ "featured_carousel.header": "{count, plural, one {Mensaje fijado} other {Mensajes fijados}}",
+ "featured_carousel.next": "Siguiente",
+ "featured_carousel.post": "Mensaje",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que accediste a este mensaje. Si querés que el mensaje sea filtrado también en este contexto, vas a tener que editar el filtro.",
"filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro caducó; vas a necesitar cambiar la fecha de caducidad para que se aplique.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}} hoy",
+ "hashtag.feature": "Destacar en el perfil",
"hashtag.follow": "Seguir etiqueta",
"hashtag.mute": "Silenciar #{hashtag}",
+ "hashtag.unfeature": "No destacar en el perfil",
"hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"hints.profiles.followers_may_be_missing": "Es posible que falten seguidores de este perfil.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Ver más mensajes en {domain}",
"hints.threads.replies_may_be_missing": "Es posible que falten respuestas de otros servidores.",
"hints.threads.see_more": "Ver más respuestas en {domain}",
+ "home.column_settings.show_quotes": "Mostrar citas",
"home.column_settings.show_reblogs": "Mostrar adhesiones",
"home.column_settings.show_replies": "Mostrar respuestas",
"home.hide_announcements": "Ocultar anuncios",
@@ -502,7 +526,6 @@
"lists.exclusive": "Ocultar miembros en la línea temporal principal",
"lists.exclusive_hint": "Si alguien está en esta lista, ocultalo en tu línea temporal principal para evitar que aparezcan sus mensajes dos veces.",
"lists.find_users_to_add": "Buscar usuarios para agregar",
- "lists.list_members": "Miembros de lista",
"lists.list_members_count": "{count, plural,one {# miembro} other {# miembros}}",
"lists.list_name": "Nombre de la lista",
"lists.new_list_name": "Nombre de la nueva lista",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir este mensaje",
"status.pin": "Fijar en el perfil",
- "status.pinned": "Mensaje fijado",
+ "status.quote_error.filtered": "Oculto debido a uno de tus filtros",
+ "status.quote_error.not_found": "No se puede mostrar este mensaje.",
+ "status.quote_error.pending_approval": "Este mensaje está pendiente de aprobación del autor original.",
+ "status.quote_error.rejected": "No se puede mostrar este mensaje, ya que el autor original no permite que se cite.",
+ "status.quote_error.removed": "Este mensaje fue eliminado por su autor.",
+ "status.quote_error.unauthorized": "No se puede mostrar este mensaje, ya que no tenés autorización para verlo.",
+ "status.quote_post_author": "Mensaje de @{name}",
"status.read_more": "Leé más",
"status.reblog": "Adherir",
"status.reblog_private": "Adherir a la audiencia original",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index 69e20fc016..f2a8215e89 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidores moderados",
"about.contact": "Contacto:",
+ "about.default_locale": "Por defecto",
"about.disclaimer": "Mastodon es software libre de código abierto, y una marca comercial de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo no disponible",
"about.domain_blocks.preamble": "Mastodon generalmente te permite ver contenido e interactuar con usuarios de cualquier otro servidor del fediverso. Estas son las excepciones que se han hecho en este servidor en particular.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitado",
"about.domain_blocks.suspended.explanation": "Ningún dato de este servidor será procesado, almacenado o intercambiado, haciendo cualquier interacción o comunicación con los usuarios de este servidor imposible.",
"about.domain_blocks.suspended.title": "Suspendido",
+ "about.language_label": "Idioma",
"about.not_available": "Esta información no está disponible en este servidor.",
"about.powered_by": "Medio social descentralizado con tecnología de {mastodon}",
"about.rules": "Reglas del servidor",
@@ -19,17 +21,21 @@
"account.block_domain": "Bloquear dominio {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueado",
+ "account.blocking": "Bloqueando",
"account.cancel_follow_request": "Cancelar seguimiento",
"account.copy": "Copiar enlace al perfil",
"account.direct": "Mención privada @{name}",
"account.disable_notifications": "Dejar de notificarme cuando @{name} publique algo",
- "account.domain_blocked": "Dominio oculto",
+ "account.domain_blocking": "Bloqueando dominio",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
"account.endorse": "Destacar en mi perfil",
+ "account.familiar_followers_many": "Seguido por {name1}, {name2} y {othersCount, plural,one {# más que conoces}other {# más que conoces}}",
+ "account.familiar_followers_one": "Seguido por {name1}",
+ "account.familiar_followers_two": "Seguid por {name1} y {name2}",
"account.featured": "Destacado",
+ "account.featured.accounts": "Perfiles",
"account.featured.hashtags": "Etiquetas",
- "account.featured.posts": "Publicaciones",
"account.featured_tags.last_status_at": "Última publicación el {date}",
"account.featured_tags.last_status_never": "Sin publicaciones",
"account.follow": "Seguir",
@@ -37,9 +43,11 @@
"account.followers": "Seguidores",
"account.followers.empty": "Nadie sigue a este usuario todavía.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.followers_you_know_counter": "{counter} que conoces",
"account.following": "Siguiendo",
"account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}",
"account.follows.empty": "Este usuario no sigue a nadie todavía.",
+ "account.follows_you": "Te sigue",
"account.go_to_profile": "Ir al perfil",
"account.hide_reblogs": "Ocultar impulsos de @{name}",
"account.in_memoriam": "En memoria.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silenciar notificaciones",
"account.mute_short": "Silenciar",
"account.muted": "Silenciado",
- "account.mutual": "Mutuo",
+ "account.muting": "Silenciando",
+ "account.mutual": "Se siguen el uno al otro",
"account.no_bio": "Sin biografía.",
"account.open_original_page": "Abrir página original",
"account.posts": "Publicaciones",
"account.posts_with_replies": "Publicaciones y respuestas",
+ "account.remove_from_followers": "Eliminar {name} de tus seguidores",
"account.report": "Denunciar a @{name}",
"account.requested": "Esperando aprobación. Haz clic para cancelar la solicitud de seguimiento",
"account.requested_follow": "{name} ha solicitado seguirte",
+ "account.requests_to_follow_you": "Solicita seguirte",
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
+ "confirmations.remove_from_followers.confirm": "Eliminar seguidor",
+ "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?",
+ "confirmations.remove_from_followers.title": "¿Eliminar seguidor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
"confirmations.reply.title": "¿Deseas sobreescribir la publicación?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Resultados de búsqueda",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viajes y lugares",
- "empty_column.account_featured": "Esta lista está vacía",
+ "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?",
+ "empty_column.account_featured.other": "{acct} aún no ha destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?",
+ "empty_column.account_featured_other.unknown": "Esta cuenta no ha destacado nada todavía.",
"empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información",
"empty_column.account_suspended": "Cuenta suspendida",
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Noticias",
"explore.trending_statuses": "Publicaciones",
"explore.trending_tags": "Etiquetas",
+ "featured_carousel.header": "{count, plural,one {Publicación fijada} other {Publicaciones fijadas}}",
+ "featured_carousel.next": "Siguiente",
+ "featured_carousel.post": "Publicación",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que has accedido a esta publlicación. Si quieres que la publicación sea filtrada también en este contexto, tendrás que editar el filtro.",
"filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado, necesitaras cambiar la fecha de caducidad para que se aplique.",
@@ -382,7 +403,7 @@
"getting_started.heading": "Primeros pasos",
"hashtag.admin_moderation": "Abrir interfaz de moderación para #{name}",
"hashtag.browse": "Explorar publicaciones en #{hashtag}",
- "hashtag.browse_from_account": "Explorar publicaciones desde @{name} en #{hashtag}",
+ "hashtag.browse_from_account": "Explorar publicaciones de @{name} en #{hashtag}",
"hashtag.column_header.tag_mode.all": "y {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sin {additional}",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
+ "hashtag.feature": "Destacar en el perfil",
"hashtag.follow": "Seguir etiqueta",
"hashtag.mute": "Silenciar #{hashtag}",
+ "hashtag.unfeature": "No destacar en el perfil",
"hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"hints.profiles.followers_may_be_missing": "Puede que no se muestren todos los seguidores de este perfil.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Ver más publicaciones en {domain}",
"hints.threads.replies_may_be_missing": "Puede que no se muestren algunas respuestas de otros servidores.",
"hints.threads.see_more": "Ver más respuestas en {domain}",
+ "home.column_settings.show_quotes": "Mostrar citas",
"home.column_settings.show_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respuestas",
"home.hide_announcements": "Ocultar anuncios",
@@ -502,7 +526,6 @@
"lists.exclusive": "Ocultar miembros en Inicio",
"lists.exclusive_hint": "Si alguien aparece en esta lista, ocúltalo en tu página de inicio para evitar ver sus publicaciones dos veces.",
"lists.find_users_to_add": "Buscar usuarios para agregar",
- "lists.list_members": "Miembros de la lista",
"lists.list_members_count": "{count, plural,one {# miembro} other {# miembros}}",
"lists.list_name": "Nombre de la lista",
"lists.new_list_name": "Nombre de la nueva lista",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir estado",
"status.pin": "Fijar",
- "status.pinned": "Publicación fijada",
+ "status.quote_error.filtered": "Oculto debido a uno de tus filtros",
+ "status.quote_error.not_found": "No se puede mostrar esta publicación.",
+ "status.quote_error.pending_approval": "Esta publicación está pendiente de aprobación del autor original.",
+ "status.quote_error.rejected": "No se puede mostrar esta publicación, puesto que el autor original no permite que sea citado.",
+ "status.quote_error.removed": "Esta publicación fue eliminada por su autor.",
+ "status.quote_error.unauthorized": "No se puede mostrar esta publicación, puesto que no estás autorizado a verla.",
+ "status.quote_post_author": "Publicado por {name}",
"status.read_more": "Leer más",
"status.reblog": "Impulsar",
"status.reblog_private": "Implusar a la audiencia original",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 4f9d91ce11..95914b60dc 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidores moderados",
"about.contact": "Contacto:",
+ "about.default_locale": "Por defecto",
"about.disclaimer": "Mastodon es software libre, de código abierto, y una marca comercial de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Razón no disponible",
"about.domain_blocks.preamble": "Mastodon normalmente te permite ver el contenido e interactuar con los usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitado",
"about.domain_blocks.suspended.explanation": "Ningún dato de este servidor será procesado, almacenado o intercambiado, haciendo imposible cualquier interacción o comunicación con los usuarios de este servidor.",
"about.domain_blocks.suspended.title": "Suspendido",
+ "about.language_label": "Idioma",
"about.not_available": "Esta información no está disponible en este servidor.",
"about.powered_by": "Redes sociales descentralizadas con tecnología de {mastodon}",
"about.rules": "Reglas del servidor",
@@ -19,17 +21,21 @@
"account.block_domain": "Bloquear dominio {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueado",
+ "account.blocking": "Bloqueando",
"account.cancel_follow_request": "Retirar solicitud de seguimiento",
"account.copy": "Copiar enlace al perfil",
"account.direct": "Mención privada a @{name}",
"account.disable_notifications": "Dejar de notificarme cuando @{name} publique algo",
- "account.domain_blocked": "Dominio bloqueado",
+ "account.domain_blocking": "Bloqueando dominio",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificarme cuando @{name} publique algo",
"account.endorse": "Destacar en el perfil",
+ "account.familiar_followers_many": "Seguido por {name1}, {name2} y {othersCount, plural,one {# más que conoces}other {# más que conoces}}",
+ "account.familiar_followers_one": "Seguido por {name1}",
+ "account.familiar_followers_two": "Seguido por {name1} y {name2}",
"account.featured": "Destacado",
+ "account.featured.accounts": "Perfiles",
"account.featured.hashtags": "Etiquetas",
- "account.featured.posts": "Publicaciones",
"account.featured_tags.last_status_at": "Última publicación el {date}",
"account.featured_tags.last_status_never": "Sin publicaciones",
"account.follow": "Seguir",
@@ -37,9 +43,11 @@
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.followers_you_know_counter": "{counter} que conoces",
"account.following": "Siguiendo",
"account.following_counter": "{count, plural, one {{counter} siguiendo} other {{counter} siguiendo}}",
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
+ "account.follows_you": "Te sigue",
"account.go_to_profile": "Ir al perfil",
"account.hide_reblogs": "Ocultar impulsos de @{name}",
"account.in_memoriam": "Cuenta conmemorativa.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silenciar notificaciones",
"account.mute_short": "Silenciar",
"account.muted": "Silenciado",
- "account.mutual": "Mutuo",
+ "account.muting": "Silenciando",
+ "account.mutual": "Os seguís mutuamente",
"account.no_bio": "Sin biografía.",
"account.open_original_page": "Abrir página original",
"account.posts": "Publicaciones",
"account.posts_with_replies": "Publicaciones y respuestas",
+ "account.remove_from_followers": "Eliminar {name} de tus seguidores",
"account.report": "Reportar a @{name}",
"account.requested": "Esperando aprobación. Haz clic para cancelar la solicitud de seguimiento",
"account.requested_follow": "{name} ha solicitado seguirte",
+ "account.requests_to_follow_you": "Solicita seguirte",
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.",
"confirmations.redraft.title": "¿Borrar y volver a redactar la publicación?",
+ "confirmations.remove_from_followers.confirm": "Eliminar seguidor",
+ "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?",
+ "confirmations.remove_from_followers.title": "¿Eliminar seguidor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Seguro que deseas continuar?",
"confirmations.reply.title": "¿Sobrescribir publicación?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Resultados de búsqueda",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viajes y lugares",
- "empty_column.account_featured": "Esta lista está vacía",
+ "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?",
+ "empty_column.account_featured.other": "{acct} aún no ha destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?",
+ "empty_column.account_featured_other.unknown": "Esta cuenta aún no ha destacado nada.",
"empty_column.account_hides_collections": "Este usuario ha decidido no mostrar esta información",
"empty_column.account_suspended": "Cuenta suspendida",
"empty_column.account_timeline": "¡No hay publicaciones aquí!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Noticias",
"explore.trending_statuses": "Publicaciones",
"explore.trending_tags": "Etiquetas",
+ "featured_carousel.header": "{count, plural,one {Publicación fijada} other {Publicaciones fijadas}}",
+ "featured_carousel.next": "Siguiente",
+ "featured_carousel.post": "Publicación",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que ha accedido a esta publlicación. Si quieres que la publicación sea filtrada también en este contexto, tendrás que editar el filtro.",
"filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado, tendrás que cambiar la fecha de caducidad para que se aplique.",
@@ -382,7 +403,7 @@
"getting_started.heading": "Primeros pasos",
"hashtag.admin_moderation": "Abrir interfaz de moderación para #{name}",
"hashtag.browse": "Explorar publicaciones en #{hashtag}",
- "hashtag.browse_from_account": "Explorar publicaciones desde @{name} en #{hashtag}",
+ "hashtag.browse_from_account": "Explorar publicaciones de @{name} en #{hashtag}",
"hashtag.column_header.tag_mode.all": "y {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sin {additional}",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
+ "hashtag.feature": "Destacar en el perfil",
"hashtag.follow": "Seguir etiqueta",
"hashtag.mute": "Silenciar #{hashtag}",
+ "hashtag.unfeature": "No destacar en el perfil",
"hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"hints.profiles.followers_may_be_missing": "Puede que no se muestren todos los seguidores de este perfil.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Ver más publicaciones en {domain}",
"hints.threads.replies_may_be_missing": "Puede que no se muestren algunas respuestas de otros servidores.",
"hints.threads.see_more": "Ver más respuestas en {domain}",
+ "home.column_settings.show_quotes": "Mostrar citas",
"home.column_settings.show_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respuestas",
"home.hide_announcements": "Ocultar comunicaciones",
@@ -502,7 +526,6 @@
"lists.exclusive": "Ocultar miembros en Inicio",
"lists.exclusive_hint": "Si alguien está en esta lista, escóndelo en tu página de inicio para evitar ver sus publicaciones dos veces.",
"lists.find_users_to_add": "Buscar usuarios para añadir",
- "lists.list_members": "Miembros de la lista",
"lists.list_members_count": "{count, plural,one {# miembro} other {# miembros}}",
"lists.list_name": "Nombre de la lista",
"lists.new_list_name": "Nombre de la nueva lista",
@@ -571,7 +594,7 @@
"notification.favourite_pm": "{name} ha marcado como favorita tu mención privada",
"notification.favourite_pm.name_and_others_with_link": "{name} y {count, plural, one {# más} other {# más}} han marcado como favorita tu mención privada",
"notification.follow": "{name} te empezó a seguir",
- "notification.follow.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} te siguieron",
+ "notification.follow.name_and_others": "{name} y {count, plural, one {# otro} other {otros #}} te siguieron",
"notification.follow_request": "{name} ha solicitado seguirte",
"notification.follow_request.name_and_others": "{name} y {count, plural, one {# más} other {# más}} han solicitado seguirte",
"notification.label.mention": "Mención",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir publicación",
"status.pin": "Fijar",
- "status.pinned": "Publicación fijada",
+ "status.quote_error.filtered": "Oculto debido a uno de tus filtros",
+ "status.quote_error.not_found": "No se puede mostrar esta publicación.",
+ "status.quote_error.pending_approval": "Esta publicación está pendiente de aprobación del autor original.",
+ "status.quote_error.rejected": "Esta publicación no puede mostrarse porque el autor original no permite que se cite.",
+ "status.quote_error.removed": "Esta publicación fue eliminada por su autor.",
+ "status.quote_error.unauthorized": "Esta publicación no puede mostrarse, ya que no estás autorizado a verla.",
+ "status.quote_post_author": "Publicación de {name}",
"status.read_more": "Leer más",
"status.reblog": "Impulsar",
"status.reblog_private": "Impulsar a la audiencia original",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 3e0610126e..fb9673c5ea 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Modereeritavad serverid",
"about.contact": "Kontakt:",
+ "about.default_locale": "Vaikimisi",
"about.disclaimer": "Mastodon on tasuta ja vaba tarkvara ning Mastodon gGmbH kaubamärk.",
"about.domain_blocks.no_reason_available": "Põhjus teadmata",
"about.domain_blocks.preamble": "Mastodon lubab tavaliselt vaadata sisu ning suhelda kasutajatega ükskõik millisest teisest fediversumi serverist. Need on erandid, mis on paika pandud sellel kindlal serveril.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Piiratud",
"about.domain_blocks.suspended.explanation": "Mitte mingeid andmeid sellelt serverilt ei töödelda, salvestata ega vahetata, tehes igasuguse interaktsiooni või kirjavahetuse selle serveri kasutajatega võimatuks.",
"about.domain_blocks.suspended.title": "Peatatud",
+ "about.language_label": "Keel",
"about.not_available": "See info ei ole sellel serveril saadavaks tehtud.",
"about.powered_by": "Hajutatud sotsiaalmeedia, mille taga on {mastodon}",
"about.rules": "Serveri reeglid",
@@ -23,10 +25,15 @@
"account.copy": "Kopeeri profiili link",
"account.direct": "Maini privaatselt @{name}",
"account.disable_notifications": "Peata teavitused @{name} postitustest",
- "account.domain_blocked": "Domeen peidetud",
"account.edit_profile": "Muuda profiili",
"account.enable_notifications": "Teavita mind @{name} postitustest",
"account.endorse": "Too profiilil esile",
+ "account.familiar_followers_many": "Jälgijateks {name1}, {name2} ja veel {othersCount, plural, one {üks kasutaja, keda tead} other {# kasutajat, keda tead}}",
+ "account.familiar_followers_one": "Jälgijaks {name1}",
+ "account.familiar_followers_two": "Jälgijateks {name1} ja {name2}",
+ "account.featured": "Esiletõstetud",
+ "account.featured.accounts": "Profiilid",
+ "account.featured.hashtags": "Sildid",
"account.featured_tags.last_status_at": "Viimane postitus {date}",
"account.featured_tags.last_status_never": "Postitusi pole",
"account.follow": "Jälgi",
@@ -37,6 +44,7 @@
"account.following": "Jälgib",
"account.following_counter": "{count, plural, one {{counter} jälgib} other {{counter} jälgib}}",
"account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
+ "account.follows_you": "Jälgib sind",
"account.go_to_profile": "Mine profiilile",
"account.hide_reblogs": "Peida @{name} jagamised",
"account.in_memoriam": "In Memoriam.",
@@ -51,19 +59,22 @@
"account.mute_notifications_short": "Vaigista teavitused",
"account.mute_short": "Vaigista",
"account.muted": "Vaigistatud",
- "account.mutual": "Jälgite",
+ "account.mutual": "Te jälgite teineteist",
"account.no_bio": "Kirjeldust pole lisatud.",
"account.open_original_page": "Ava algne leht",
"account.posts": "Postitused",
"account.posts_with_replies": "Postitused ja vastused",
+ "account.remove_from_followers": "Eemalda {name} jälgijate seast",
"account.report": "Raporteeri @{name}",
"account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
"account.requested_follow": "{name} on taodelnud sinu jälgimist",
+ "account.requests_to_follow_you": "soovib sind jälgida",
"account.share": "Jaga @{name} profiili",
"account.show_reblogs": "Näita @{name} jagamisi",
"account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}",
"account.unblock": "Eemalda blokeering @{name}",
"account.unblock_domain": "Tee {domain} nähtavaks",
+ "account.unblock_domain_short": "Lõpeta blokeerimine",
"account.unblock_short": "Eemalda blokeering",
"account.unendorse": "Ära kuva profiilil",
"account.unfollow": "Jälgid",
@@ -225,6 +236,9 @@
"confirmations.redraft.confirm": "Kustuta & taasalusta",
"confirmations.redraft.message": "Kindel, et soovid postituse kustutada ja võtta uue aluseks? Lemmikuks märkimised ja jagamised lähevad kaotsi ning vastused jäävad ilma algse postituseta.",
"confirmations.redraft.title": "Kustudada ja luua postituse mustand?",
+ "confirmations.remove_from_followers.confirm": "Eemalda jälgija",
+ "confirmations.remove_from_followers.message": "{name} lõpetab sellega sinu jälgimise. Kas oled kindel, et soovid jätkata?",
+ "confirmations.remove_from_followers.title": "Kas eemaldame jälgija?",
"confirmations.reply.confirm": "Vasta",
"confirmations.reply.message": "Praegu vastamine kirjutab hetkel koostatava sõnumi üle. Oled kindel, et soovid jätkata?",
"confirmations.reply.title": "Kirjutada postitus üle?",
@@ -292,6 +306,9 @@
"emoji_button.search_results": "Otsitulemused",
"emoji_button.symbols": "Sümbolid",
"emoji_button.travel": "Reisimine & kohad",
+ "empty_column.account_featured.me": "Sa pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid silte või või sõbra kasutajakontot?",
+ "empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid silte või või sõbra kasutajakontot?",
+ "empty_column.account_featured_other.unknown": "See kasutajakonto pole veel midagi esile tõstnud.",
"empty_column.account_hides_collections": "See kasutaja otsustas mitte teha seda infot saadavaks",
"empty_column.account_suspended": "Konto kustutatud",
"empty_column.account_timeline": "Siin postitusi ei ole!",
@@ -324,6 +341,10 @@
"explore.trending_links": "Uudised",
"explore.trending_statuses": "Postitused",
"explore.trending_tags": "Sildid",
+ "featured_carousel.header": "{count, plural, one {Esiletõstetud postitus} other {Esiletõstetud postitust}}",
+ "featured_carousel.next": "Järgmine",
+ "featured_carousel.previous": "Eelmine",
+ "featured_carousel.slide": "{index} / {total}",
"filter_modal.added.context_mismatch_explanation": "See filtrikategooria ei rakendu kontekstis, kuidas postituseni jõudsid. Kui tahad postitust ka selles kontekstis filtreerida, pead muutma filtrit.",
"filter_modal.added.context_mismatch_title": "Konteksti mittesobivus!",
"filter_modal.added.expired_explanation": "Selle filtri kategooria on aegunud. pead muutma aegumiskuupäeva, kui tahad, et filter kehtiks.",
@@ -376,6 +397,8 @@
"generic.saved": "Salvestatud",
"getting_started.heading": "Alustamine",
"hashtag.admin_moderation": "Ava modereerimisliides #{name} jaoks",
+ "hashtag.browse": "Sirvi #{hashtag} sildiga postitusi",
+ "hashtag.browse_from_account": "Sirvi @{name} kasutaja #{hashtag} sildiga postitusi",
"hashtag.column_header.tag_mode.all": "ja {additional}",
"hashtag.column_header.tag_mode.any": "või {additional}",
"hashtag.column_header.tag_mode.none": "ilma {additional}",
@@ -388,7 +411,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} osalejaga} other {{counter} osalejaga}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} postitusega} other {{counter} postitusega}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postitust} other {{counter} postitust}} täna",
+ "hashtag.feature": "Tõsta profiilis esile",
"hashtag.follow": "Jälgi silti",
+ "hashtag.mute": "Vaigista @#{hashtag}",
+ "hashtag.unfeature": "Ära tõsta profiilis esile",
"hashtag.unfollow": "Lõpeta sildi jälgimine",
"hashtags.and_other": "…ja {count, plural, one {}other {# veel}}",
"hints.profiles.followers_may_be_missing": "Selle profiili jälgijaid võib olla puudu.",
@@ -399,6 +425,7 @@
"hints.profiles.see_more_posts": "Vaata rohkem postitusi kohas {domain}",
"hints.threads.replies_may_be_missing": "Vastuseid teistest serveritest võib olla puudu.",
"hints.threads.see_more": "Vaata rohkem vastuseid kohas {domain}",
+ "home.column_settings.show_quotes": "Näita tsiteeritut",
"home.column_settings.show_reblogs": "Näita jagamisi",
"home.column_settings.show_replies": "Näita vastuseid",
"home.hide_announcements": "Peida teadaanded",
@@ -494,7 +521,6 @@
"lists.exclusive": "Peida avalehelt liikmed",
"lists.exclusive_hint": "Kui keegi on selles loetelus, peida ta avalehe lõimest, vältimaks tema postituste kaks korda nägemist.",
"lists.find_users_to_add": "Leia kasutajaid, keda lisada",
- "lists.list_members": "Loetelu liikmed",
"lists.list_members_count": "{count, plural, one {# liige} other {# liiget}}",
"lists.list_name": "Loetelu nimi",
"lists.new_list_name": "Loetelu uus nimi",
@@ -708,6 +734,8 @@
"privacy_policy.title": "Isikuandmete kaitse",
"recommended": "Soovitatud",
"refresh": "Värskenda",
+ "regeneration_indicator.please_stand_by": "Palun oota.",
+ "regeneration_indicator.preparing_your_home_feed": "Valmistan ette sinu avalehe lõime…",
"relative_time.days": "{number}p",
"relative_time.full.days": "{number, plural, one {# päev} other {# päeva}} tagasi",
"relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi",
@@ -761,7 +789,7 @@
"report.thanks.title": "Ei taha seda näha?",
"report.thanks.title_actionable": "Täname teavitamise eest, uurime seda.",
"report.unfollow": "Lõpeta @{name} jälgimine",
- "report.unfollow_explanation": "Jälgid seda kontot. Et mitte näha tema postitusi oma koduvoos, lõpeta ta jälgimine.",
+ "report.unfollow_explanation": "Jälgid seda kontot. Et mitte näha tema postitusi oma avalehe lõimes, lõpeta ta jälgimine.",
"report_notification.attached_statuses": "{count, plural, one {{count} postitus} other {{count} postitust}} listatud",
"report_notification.categories.legal": "Õiguslik",
"report_notification.categories.legal_sentence": "ebaseaduslik sisu",
@@ -791,8 +819,11 @@
"search_results.accounts": "Profiilid",
"search_results.all": "Kõik",
"search_results.hashtags": "Sildid",
+ "search_results.no_results": "Tulemusi pole.",
+ "search_results.no_search_yet": "Proovi otsida postitusi, profiile või silte.",
"search_results.see_all": "Vaata kõiki",
"search_results.statuses": "Postitused",
+ "search_results.title": "Otsi märksõna: {q}",
"server_banner.about_active_users": "Inimesed, kes kasutavad seda serverit viimase 30 päeva jooksul (kuu aktiivsed kasutajad)",
"server_banner.active_users": "aktiivsed kasutajad",
"server_banner.administered_by": "Administraator:",
@@ -835,7 +866,13 @@
"status.mute_conversation": "Vaigista vestlus",
"status.open": "Laienda postitus",
"status.pin": "Kinnita profiilile",
- "status.pinned": "Kinnitatud postitus",
+ "status.quote_error.filtered": "Peidetud mõne kasutatud filtri tõttu",
+ "status.quote_error.not_found": "Seda postitust ei saa näidata.",
+ "status.quote_error.pending_approval": "See postitus on algse autori kinnituse ootel.",
+ "status.quote_error.rejected": "Seda postitust ei saa näidata, kuina algne autor ei luba teda tsiteerida.",
+ "status.quote_error.removed": "Autor kustutas selle postituse.",
+ "status.quote_error.unauthorized": "Kuna sul pole luba selle postituse nägemiseks, siis seda ei saa kuvada.",
+ "status.quote_post_author": "Postitajaks {name}",
"status.read_more": "Loe veel",
"status.reblog": "Jaga",
"status.reblog_private": "Jaga algse nähtavusega",
@@ -844,6 +881,7 @@
"status.reblogs.empty": "Keegi pole seda postitust veel jaganud. Kui keegi seda teeb, näeb seda siin.",
"status.redraft": "Kustuta & alga uuesti",
"status.remove_bookmark": "Eemalda järjehoidja",
+ "status.remove_favourite": "Eemalda lemmikute seast",
"status.replied_in_thread": "Vastatud lõimes",
"status.replied_to": "Vastas kasutajale {name}",
"status.reply": "Vasta",
@@ -865,7 +903,9 @@
"subscribed_languages.target": "Muuda tellitud keeli {target} jaoks",
"tabs_bar.home": "Kodu",
"tabs_bar.notifications": "Teated",
+ "terms_of_service.effective_as_of": "Kehtib alates {date}",
"terms_of_service.title": "Teenuse tingimused",
+ "terms_of_service.upcoming_changes_on": "Muudatused alates {date}",
"time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud",
"time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} jäänud",
"time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} jäänud",
@@ -896,6 +936,12 @@
"video.expand": "Suurenda video",
"video.fullscreen": "Täisekraan",
"video.hide": "Peida video",
+ "video.mute": "Vaigista",
"video.pause": "Paus",
- "video.play": "Mängi"
+ "video.play": "Mängi",
+ "video.skip_backward": "Keri tagasi",
+ "video.skip_forward": "Keri edasi",
+ "video.unmute": "Lõpeta vaigistamine",
+ "video.volume_down": "Heli vaiksemaks",
+ "video.volume_up": "Heli valjemaks"
}
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 0c73c9f540..2c05e8f639 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -23,7 +23,6 @@
"account.copy": "Kopiatu profilerako esteka",
"account.direct": "Aipatu pribatuki @{name}",
"account.disable_notifications": "Utzi jakinarazteari @{name} erabiltzaileak argitaratzean",
- "account.domain_blocked": "Ezkutatutako domeinua",
"account.edit_profile": "Editatu profila",
"account.enable_notifications": "Jakinarazi @{name} erabiltzaileak argitaratzean",
"account.endorse": "Nabarmendu profilean",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Mututu jakinarazpenak",
"account.mute_short": "Mututu",
"account.muted": "Mutututa",
- "account.mutual": "Elkarrekikoa",
"account.no_bio": "Ez da deskribapenik eman.",
"account.open_original_page": "Ireki jatorrizko orria",
"account.posts": "Bidalketa",
@@ -784,7 +782,6 @@
"status.mute_conversation": "Mututu elkarrizketa",
"status.open": "Hedatu bidalketa hau",
"status.pin": "Finkatu profilean",
- "status.pinned": "Finkatutako bidalketa",
"status.read_more": "Irakurri gehiago",
"status.reblog": "Bultzada",
"status.reblog_private": "Bultzada jatorrizko hartzaileei",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 3e31eb8a15..9f9f7aec6b 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -19,14 +19,21 @@
"account.block_domain": "انسداد دامنهٔ {domain}",
"account.block_short": "انسداد",
"account.blocked": "مسدود",
+ "account.blocking": "مسدود کرده",
"account.cancel_follow_request": "رد کردن درخواست پیگیری",
"account.copy": "رونوشت از پیوند به نمایه",
"account.direct": "اشارهٔ خصوصی به @{name}",
"account.disable_notifications": "آگاه کردن من هنگام فرستههای @{name} را متوقّف کن",
- "account.domain_blocked": "دامنه مسدود شد",
+ "account.domain_blocking": "دامنهٔ مسدود کرده",
"account.edit_profile": "ویرایش نمایه",
"account.enable_notifications": "هنگام فرستههای @{name} مرا آگاه کن",
"account.endorse": "معرّفی در نمایه",
+ "account.familiar_followers_many": "پیگرفته از سوی {name1}، {name2} و {othersCount, plural,one {یکی دیگر از پیگرفتههایتان} other {# نفر دیگر از پیگرفتههایتان}}",
+ "account.familiar_followers_one": "پیگرفته از سوی {name1}",
+ "account.familiar_followers_two": "پیگرفته از سوی {name1} و {name2}",
+ "account.featured": " پیشنهادی",
+ "account.featured.accounts": "نمایهها",
+ "account.featured.hashtags": "برچسبها",
"account.featured_tags.last_status_at": "آخرین فرسته در {date}",
"account.featured_tags.last_status_never": "بدون فرسته",
"account.follow": "پیگرفتن",
@@ -37,6 +44,7 @@
"account.following": "پی میگیرید",
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
+ "account.follows_you": "پیگیرتان است",
"account.go_to_profile": "رفتن به نمایه",
"account.hide_reblogs": "نهفتن تقویتهای @{name}",
"account.in_memoriam": "به یادبود.",
@@ -51,14 +59,17 @@
"account.mute_notifications_short": "خموشی آگاهیها",
"account.mute_short": "خموشی",
"account.muted": "خموش",
- "account.mutual": "دوطرفه",
+ "account.muting": "خموش کرده",
+ "account.mutual": "یکدیگر را پی میگیرید",
"account.no_bio": "شرحی فراهم نشده.",
"account.open_original_page": "گشودن صفحهٔ اصلی",
"account.posts": "فرسته",
"account.posts_with_replies": "فرستهها و پاسخها",
+ "account.remove_from_followers": "برداشتن {name} از پیگیران",
"account.report": "گزارش @{name}",
"account.requested": "منتظر پذیرش است. برای لغو درخواست پیگیری کلیک کنید",
"account.requested_follow": "{name} درخواست پیگیریتان را داد",
+ "account.requests_to_follow_you": "درخواست پیگیریتان را دارد",
"account.share": "همرسانی نمایهٔ @{name}",
"account.show_reblogs": "نمایش تقویتهای @{name}",
"account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
@@ -226,6 +237,9 @@
"confirmations.redraft.confirm": "حذف و بازنویسی",
"confirmations.redraft.message": "مطمئنید که میخواهید این فرسته را حذف کنید و از نو بنویسید؟ با این کار تقویتها و پسندهایش از دست رفته و پاسخها به آن بیمرجع میشود.",
"confirmations.redraft.title": "حذف و پیشنویسی دوبارهٔ فرسته؟",
+ "confirmations.remove_from_followers.confirm": "برداشتن پیگیرنده",
+ "confirmations.remove_from_followers.message": "دیگر {name} پیتان نخواهد گرفت. مطمئنید که میخواهید ادامه دهید؟",
+ "confirmations.remove_from_followers.title": "برداشتن پیگیرنده؟",
"confirmations.reply.confirm": "پاسخ",
"confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. میخواهید ادامه دهید؟",
"confirmations.reply.title": "رونویسی فرسته؟",
@@ -293,6 +307,7 @@
"emoji_button.search_results": "نتایج جستوجو",
"emoji_button.symbols": "نمادها",
"emoji_button.travel": "سفر و مکان",
+ "empty_column.account_featured_other.unknown": "این حساب هنوز چیزی را پیشنهاد نکرده.",
"empty_column.account_hides_collections": "کاربر خواسته که این اطّلاعات در دسترس نباشند",
"empty_column.account_suspended": "حساب معلق شد",
"empty_column.account_timeline": "هیچ فرستهای اینجا نیست!",
@@ -312,7 +327,7 @@
"empty_column.list": "هنوز چیزی در این سیاهه نیست. هنگامی که اعضایش فرستههای جدیدی بفرستند، اینجا ظاهر خواهند شد.",
"empty_column.mutes": "هنوز هیچ کاربری را خموش نکردهاید.",
"empty_column.notification_requests": "همه چیز تمیز است! هیچچیزی اینجا نیست. هنگامی که آگاهیهای جدیدی دریافت کنید، بسته به تنظیماتتان اینجا ظاهر خواهند شد.",
- "empty_column.notifications": "هنوز هیچ آگاهیآی ندارید. هنگامی که دیگران با شما برهمکنش داشته باشند،اینحا خواهید دیدش.",
+ "empty_column.notifications": "هنوز هیچ آگاهیای ندارید. هنگامی که دیگران با شما برهمکنش داشته باشند، اینجا خواهید دیدش.",
"empty_column.public": "اینجا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پیگیری کنید تا اینجا پُر شود",
"error.unexpected_crash.explanation": "به خاطر اشکالی در کدهای ما یا ناسازگاری با مرورگر شما، این صفحه به درستی نمایش نیافت.",
"error.unexpected_crash.explanation_addons": "این صفحه نمیتواند درست نشان داده شود. احتمالاً این خطا ناشی از یک افزونهٔ مرورگر یا ابزار ترجمهٔ خودکار است.",
@@ -377,6 +392,8 @@
"generic.saved": "ذخیره شده",
"getting_started.heading": "آغاز کنید",
"hashtag.admin_moderation": "گشودن میانای نظارت برای #{name}",
+ "hashtag.browse": "مرور فرستهها در #{hashtag}",
+ "hashtag.browse_from_account": "مرور فرستهها از @{name} در #{hashtag}",
"hashtag.column_header.tag_mode.all": "و {additional}",
"hashtag.column_header.tag_mode.any": "یا {additional}",
"hashtag.column_header.tag_mode.none": "بدون {additional}",
@@ -389,7 +406,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} مشارکت کننده} other {{counter} مشارکت کننده}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}} امروز",
+ "hashtag.feature": "معرّفی در نمایه",
"hashtag.follow": "پیگرفتن برچسب",
+ "hashtag.mute": "خموشی #{hashtag}",
+ "hashtag.unfeature": "معرّفی نکردن در نمایه",
"hashtag.unfollow": "پینگرفتن برچسب",
"hashtags.and_other": "…و {count, plural, other {# بیشتر}}",
"hints.profiles.followers_may_be_missing": "شاید پیگیرندگان این نمایه نباشند.",
@@ -495,7 +515,6 @@
"lists.exclusive": "نهفتن اعضا در خانه",
"lists.exclusive_hint": "اگر کسی در این سیاهه باشد، در خوراک خانگیتان نهفته تا از نمایش دویارهٔ فرستههایش خودداری شود.",
"lists.find_users_to_add": "یافتن کاربرانی برای افزودن",
- "lists.list_members": "اعضای سیاهه",
"lists.list_members_count": "{count, plural,one {# عضو}other {# عضو}}",
"lists.list_name": "نام سیاهه",
"lists.new_list_name": "نام سیاههٔ جدید",
@@ -841,7 +860,6 @@
"status.mute_conversation": "خموشاندن گفتوگو",
"status.open": "گسترش این فرسته",
"status.pin": "سنجاق به نمایه",
- "status.pinned": "فرستهٔ سنجاق شده",
"status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت",
"status.reblog_private": "تقویت برای مخاطبان نخستین",
@@ -905,6 +923,12 @@
"video.expand": "گسترش ویدیو",
"video.fullscreen": "تمامصفحه",
"video.hide": "نهفتن ویدیو",
+ "video.mute": "خموشی",
"video.pause": "مکث",
- "video.play": "پخش"
+ "video.play": "پخش",
+ "video.skip_backward": "پرش به پس",
+ "video.skip_forward": "پرش به پیش",
+ "video.unmute": "ناخموشی",
+ "video.volume_down": "کاهش حجم صدا",
+ "video.volume_up": "افزایش حجم صدا"
}
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index cc42780f94..2823ffd09d 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderoidut palvelimet",
"about.contact": "Yhteydenotto:",
+ "about.default_locale": "Oletus",
"about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.",
"about.domain_blocks.no_reason_available": "Syy ei ole tiedossa",
"about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Rajoitettu",
"about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta eikä vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.",
"about.domain_blocks.suspended.title": "Jäädytetty",
+ "about.language_label": "Kieli",
"about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.",
"about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}",
"about.rules": "Palvelimen säännöt",
@@ -19,16 +21,21 @@
"account.block_domain": "Estä verkkotunnus {domain}",
"account.block_short": "Estä",
"account.blocked": "Estetty",
+ "account.blocking": "Estetty",
"account.cancel_follow_request": "Peruuta seurantapyyntö",
"account.copy": "Kopioi linkki profiiliin",
"account.direct": "Mainitse @{name} yksityisesti",
"account.disable_notifications": "Lopeta ilmoittamasta minulle, kun @{name} julkaisee",
- "account.domain_blocked": "Verkkotunnus estetty",
+ "account.domain_blocking": "Verkkotunnus estetty",
"account.edit_profile": "Muokkaa profiilia",
"account.enable_notifications": "Ilmoita minulle, kun @{name} julkaisee",
- "account.endorse": "Suosittele profiilissasi",
+ "account.endorse": "Suosittele profiilissa",
+ "account.familiar_followers_many": "Seuraajina {name1}, {name2} ja {othersCount, plural, one {1 muu, jonka tunnet} other {# muuta, jotka tunnet}}",
+ "account.familiar_followers_one": "Seuraajana {name1}",
+ "account.familiar_followers_two": "Seuraajina {name1} ja {name2}",
+ "account.featured": "Suositellut",
+ "account.featured.accounts": "Profiilit",
"account.featured.hashtags": "Aihetunnisteet",
- "account.featured.posts": "Julkaisut",
"account.featured_tags.last_status_at": "Viimeisin julkaisu {date}",
"account.featured_tags.last_status_never": "Ei julkaisuja",
"account.follow": "Seuraa",
@@ -36,9 +43,11 @@
"account.followers": "Seuraajat",
"account.followers.empty": "Kukaan ei seuraa tätä käyttäjää vielä.",
"account.followers_counter": "{count, plural, one {{counter} seuraaja} other {{counter} seuraajaa}}",
+ "account.followers_you_know_counter": "{count, plural, one {{counter} tuntemasi} other {{counter} tuntemaasi}}",
"account.following": "Seurattavat",
"account.following_counter": "{count, plural, one {{counter} seurattava} other {{counter} seurattavaa}}",
"account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.",
+ "account.follows_you": "Seuraa sinua",
"account.go_to_profile": "Siirry profiiliin",
"account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset",
"account.in_memoriam": "Muistoissamme.",
@@ -53,14 +62,17 @@
"account.mute_notifications_short": "Mykistä ilmoitukset",
"account.mute_short": "Mykistä",
"account.muted": "Mykistetty",
+ "account.muting": "Mykistetty",
"account.mutual": "Seuraatte toisianne",
"account.no_bio": "Kuvausta ei ole annettu.",
"account.open_original_page": "Avaa alkuperäinen sivu",
"account.posts": "Julkaisut",
"account.posts_with_replies": "Julkaisut ja vastaukset",
+ "account.remove_from_followers": "Poista {name} seuraajista",
"account.report": "Raportoi @{name}",
"account.requested": "Odottaa hyväksyntää. Peruuta seurantapyyntö napsauttamalla",
"account.requested_follow": "{name} on pyytänyt lupaa seurata sinua",
+ "account.requests_to_follow_you": "Pyynnöt seurata sinua",
"account.share": "Jaa käyttäjän @{name} profiili",
"account.show_reblogs": "Näytä käyttäjän @{name} tehostukset",
"account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}",
@@ -68,7 +80,7 @@
"account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto",
"account.unblock_domain_short": "Kumoa esto",
"account.unblock_short": "Kumoa esto",
- "account.unendorse": "Kumoa suosittelu profiilissasi",
+ "account.unendorse": "Kumoa suosittelu profiilissa",
"account.unfollow": "Älä seuraa",
"account.unmute": "Poista käyttäjän @{name} mykistys",
"account.unmute_notifications_short": "Poista ilmoitusten mykistys",
@@ -228,6 +240,9 @@
"confirmations.redraft.confirm": "Poista ja palauta muokattavaksi",
"confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.",
"confirmations.redraft.title": "Poistetaanko julkaisu ja palautetaanko se muokattavaksi?",
+ "confirmations.remove_from_followers.confirm": "Poista seuraaja",
+ "confirmations.remove_from_followers.message": "{name} lakkaa seuraamasta sinua. Haluatko varmasti jatkaa?",
+ "confirmations.remove_from_followers.title": "Poistetaanko seuraaja?",
"confirmations.reply.confirm": "Vastaa",
"confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?",
"confirmations.reply.title": "Korvataanko julkaisu?",
@@ -295,7 +310,9 @@
"emoji_button.search_results": "Hakutulokset",
"emoji_button.symbols": "Symbolit",
"emoji_button.travel": "Matkailu ja paikat",
- "empty_column.account_featured": "Tämä lista on tyhjä",
+ "empty_column.account_featured.me": "Et suosittele vielä mitään. Tiesitkö, että voit suositella profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?",
+ "empty_column.account_featured.other": "{acct} ei suosittele vielä mitään. Tiesitkö, että voit suositella profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?",
+ "empty_column.account_featured_other.unknown": "Tämä tili ei suosittele vielä mitään.",
"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_timeline": "Ei viestejä täällä.",
@@ -328,6 +345,11 @@
"explore.trending_links": "Uutiset",
"explore.trending_statuses": "Julkaisut",
"explore.trending_tags": "Aihetunnisteet",
+ "featured_carousel.header": "{count, plural, one {Kiinnitetty julkaisu} other {Kiinnitetyt julkaisut}}",
+ "featured_carousel.next": "Seuraava",
+ "featured_carousel.post": "Julkaisu",
+ "featured_carousel.previous": "Edellinen",
+ "featured_carousel.slide": "{index} / {total}",
"filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske asiayhteyttä, jossa olet tarkastellut tätä julkaisua. Jos haluat julkaisun suodatettavan myös tässä asiayhteydessä, muokkaa suodatinta.",
"filter_modal.added.context_mismatch_title": "Asiayhteys ei täsmää!",
"filter_modal.added.expired_explanation": "Tämä suodatinluokka on vanhentunut, joten sinun on muutettava viimeistä voimassaolopäivää, jotta suodatusta käytettäisiin.",
@@ -394,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} osallistuja} other {{counter} osallistujaa}}",
"hashtag.counter_by_uses": "{count, plural, one{{counter} julkaisu} other {{counter} julkaisua}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}} tänään",
+ "hashtag.feature": "Suosittele profiilissa",
"hashtag.follow": "Seuraa aihetunnistetta",
"hashtag.mute": "Mykistä #{hashtag}",
+ "hashtag.unfeature": "Kumoa suosittelu profiilissa",
"hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen",
"hashtags.and_other": "…ja {count, plural, other {# lisää}}",
"hints.profiles.followers_may_be_missing": "Tämän profiilin seuraajia saattaa puuttua.",
@@ -406,6 +430,7 @@
"hints.profiles.see_more_posts": "Näytä lisää julkaisuja palvelimella {domain}",
"hints.threads.replies_may_be_missing": "Muiden palvelinten vastauksia saattaa puuttua.",
"hints.threads.see_more": "Näytä lisää vastauksia palvelimella {domain}",
+ "home.column_settings.show_quotes": "Näytä lainaukset",
"home.column_settings.show_reblogs": "Näytä tehostukset",
"home.column_settings.show_replies": "Näytä vastaukset",
"home.hide_announcements": "Piilota tiedotteet",
@@ -501,7 +526,6 @@
"lists.exclusive": "Piilota jäsenet kotisyötteestä",
"lists.exclusive_hint": "Jos joku on tässä listassa, piilota hänet kotisyötteestäsi, jotta et näe hänen julkaisujaan kahteen kertaan.",
"lists.find_users_to_add": "Etsi lisättäviä käyttäjiä",
- "lists.list_members": "Listan jäsenet",
"lists.list_members_count": "{count, plural, one {# jäsen} other {# jäsentä}}",
"lists.list_name": "Listan nimi",
"lists.new_list_name": "Uuden listan nimi",
@@ -847,7 +871,13 @@
"status.mute_conversation": "Mykistä keskustelu",
"status.open": "Laajenna julkaisu",
"status.pin": "Kiinnitä profiiliin",
- "status.pinned": "Kiinnitetty julkaisu",
+ "status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia",
+ "status.quote_error.not_found": "Tätä julkaisua ei voi näyttää.",
+ "status.quote_error.pending_approval": "Tämä julkaisu odottaa alkuperäisen tekijänsä hyväksyntää.",
+ "status.quote_error.rejected": "Tätä julkaisua ei voi näyttää, sillä sen alkuperäinen tekijä ei salli lainattavan julkaisua.",
+ "status.quote_error.removed": "Tekijä on poistanut julkaisun.",
+ "status.quote_error.unauthorized": "Tätä julkaisua ei voi näyttää, koska sinulla ei ole oikeutta tarkastella sitä.",
+ "status.quote_post_author": "Julkaisu käyttäjältä {name}",
"status.read_more": "Näytä enemmän",
"status.reblog": "Tehosta",
"status.reblog_private": "Tehosta alkuperäiselle yleisölle",
diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json
index c13d0a8afe..f6de1b87a8 100644
--- a/app/javascript/mastodon/locales/fil.json
+++ b/app/javascript/mastodon/locales/fil.json
@@ -23,10 +23,10 @@
"account.copy": "I-sipi ang kawing sa profile",
"account.direct": "Palihim banggitin si @{name}",
"account.disable_notifications": "I-tigil ang pagpapaalam sa akin tuwing nagpopost si @{name}",
- "account.domain_blocked": "Hinadlangan ang domain",
"account.edit_profile": "Baguhin ang profile",
"account.enable_notifications": "Ipaalam sa akin kapag nag-post si @{name}",
"account.endorse": "I-tampok sa profile",
+ "account.featured": "Itinatampok",
"account.featured_tags.last_status_at": "Huling post noong {date}",
"account.featured_tags.last_status_never": "Walang mga post",
"account.follow": "Sundan",
@@ -51,7 +51,6 @@
"account.mute_notifications_short": "I-mute ang mga abiso",
"account.mute_short": "I-mute",
"account.muted": "Naka-mute",
- "account.mutual": "Ka-mutual",
"account.no_bio": "Walang nakalaan na paglalarawan.",
"account.open_original_page": "Buksan ang pinagmulang pahina",
"account.posts": "Mga post",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index b472fd8bd2..d583ee264f 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Tálmaðir ambætarar",
"about.contact": "Samband:",
+ "about.default_locale": "Sjálvvirði",
"about.disclaimer": "Mastodon er fríur ritbúnaður við opnari keldu og eitt vørumerki hjá Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Ókent orsøk",
"about.domain_blocks.preamble": "Yvirhøvur, so loyvir Mastodon tær at síggja innihald frá og at samvirka við brúkarar frá ein og hvørjum ambætara í fediverse. Undantøkini, sum eru gjørd á júst hesum ambætaranum, eru hesi.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Avmarkað",
"about.domain_blocks.suspended.explanation": "Ongar dátur frá hesum ambætara verða viðgjørd, goymd ella deild, tað ger, at samskifti við aðrar ambætarar er iki møguligt.",
"about.domain_blocks.suspended.title": "Gjørt óvirkið",
+ "about.language_label": "Mál",
"about.not_available": "Hetta er ikki tøkt á føroyska servaranum enn.",
"about.powered_by": "Miðfirra almennur miðil koyrandi á {mastodon}",
"about.rules": "Ambætarareglur",
@@ -19,17 +21,21 @@
"account.block_domain": "Banna økisnavnið {domain}",
"account.block_short": "Blokera",
"account.blocked": "Bannað/ur",
+ "account.blocking": "Banni",
"account.cancel_follow_request": "Strika fylgjaraumbøn",
"account.copy": "Avrita leinki til vangan",
"account.direct": "Umrøð @{name} privat",
"account.disable_notifications": "Ikki boða mær frá, tá @{name} skrivar",
- "account.domain_blocked": "Økisnavn bannað",
+ "account.domain_blocking": "Banni økisnavn",
"account.edit_profile": "Broyt vanga",
"account.enable_notifications": "Boða mær frá, tá @{name} skrivar",
"account.endorse": "Víst á vangamyndini",
+ "account.familiar_followers_many": "{name1}, {name2} og {othersCount, plural, one {ein annar/onnur tú kennir} other {# onnur tú kennir}} fylgja",
+ "account.familiar_followers_one": "{name1} fylgir",
+ "account.familiar_followers_two": "{name1} og {name2} fylgja",
"account.featured": "Tikin fram",
+ "account.featured.accounts": "Vangar",
"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_never": "Einki uppslag",
"account.follow": "Fylg",
@@ -37,9 +43,11 @@
"account.followers": "Fylgjarar",
"account.followers.empty": "Ongar fylgjarar enn.",
"account.followers_counter": "{count, plural, one {{counter} fylgjari} other {{counter} fylgjarar}}",
+ "account.followers_you_know_counter": "{counter} tú kennir",
"account.following": "Fylgir",
"account.following_counter": "{count, plural, one {{counter} fylgir} other {{counter} fylgja}}",
"account.follows.empty": "Hesin brúkari fylgir ongum enn.",
+ "account.follows_you": "Fylgir tær",
"account.go_to_profile": "Far til vanga",
"account.hide_reblogs": "Fjal lyft frá @{name}",
"account.in_memoriam": "In memoriam.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Sløkk fráboðanir",
"account.mute_short": "Doyv",
"account.muted": "Sløkt/ur",
- "account.mutual": "Sínamillum",
+ "account.muting": "Doyvir",
+ "account.mutual": "Tit fylgja hvønn annan",
"account.no_bio": "Lýsing vantar.",
"account.open_original_page": "Opna upprunasíðuna",
"account.posts": "Uppsløg",
"account.posts_with_replies": "Uppsløg og svar",
+ "account.remove_from_followers": "Strika {name} av fylgjaralista",
"account.report": "Melda @{name}",
"account.requested": "Bíðar eftir góðkenning. Trýst fyri at angra umbønina",
"account.requested_follow": "{name} hevur biðið um at fylgja tær",
+ "account.requests_to_follow_you": "Umbønir um at fylgja tær",
"account.share": "Deil vanga @{name}'s",
"account.show_reblogs": "Vís lyft frá @{name}",
"account.statuses_counter": "{count, plural, one {{counter} postur} other {{counter} postar}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Sletta og skriva umaftur",
"confirmations.redraft.message": "Vilt tú veruliga strika hendan postin og í staðin gera hann til eina nýggja kladdu? Yndisfrámerki og framhevjanir blíva burtur, og svar til upprunapostin missa tilknýtið.",
"confirmations.redraft.title": "Strika & ger nýtt uppskot um post?",
+ "confirmations.remove_from_followers.confirm": "Strika fylgjara",
+ "confirmations.remove_from_followers.message": "{name} fer ikki longur at fylgja tær. Er tú vís/ur í at tú vilt halda fram?",
+ "confirmations.remove_from_followers.title": "Strika fylgjara?",
"confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Svarar tú nú, verða boðini, sum tú ert í holt við at skriva yvirskrivað. Ert tú vís/ur í, at tú vilt halda fram?",
"confirmations.reply.title": "Skriva omaná post?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Leitiúrslit",
"emoji_button.symbols": "Ímyndir",
"emoji_button.travel": "Ferðing og støð",
- "empty_column.account_featured": "Hesin listin er tómur",
+ "empty_column.account_featured.me": "Tú hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?",
+ "empty_column.account_featured.other": "{acct} hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?",
+ "empty_column.account_featured_other.unknown": "Hendan kontan hevur ikki tikið nakað fram enn.",
"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_timeline": "Einki uppslag her!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Tíðindi",
"explore.trending_statuses": "Postar",
"explore.trending_tags": "Frámerki",
+ "featured_carousel.header": "{count, plural, one {festur postur} other {festir postar}}",
+ "featured_carousel.next": "Næsta",
+ "featured_carousel.post": "Postur",
+ "featured_carousel.previous": "Fyrra",
+ "featured_carousel.slide": "{index} av {total}",
"filter_modal.added.context_mismatch_explanation": "Hesin filturbólkurin viðvíkur ikki kontekstinum, sum tú hevur fingið atgongd til hendan postin. Ynskir tú at posturin verður filtreraður í hesum kontekstinum eisini, so er neyðugt at tú rættar filtrið.",
"filter_modal.added.context_mismatch_title": "Ósamsvar við kontekst!",
"filter_modal.added.expired_explanation": "Hesin filturbólkurin er útgingin, og tú mást broyta dagfestingina fyri at hann skal virka.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} luttakari} other {{counter} luttakarar}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} postur} other {{counter} postar}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postur} other {{counter} postar}} í dag",
+ "hashtag.feature": "Vís á vanga",
"hashtag.follow": "Fylg frámerki",
"hashtag.mute": "Doyv @#{hashtag}",
+ "hashtag.unfeature": "Vís ikki á vanga",
"hashtag.unfollow": "Gevst at fylgja frámerki",
"hashtags.and_other": "…og {count, plural, other {# afturat}}",
"hints.profiles.followers_may_be_missing": "Fylgjarar hjá hesum vanganum kunnu mangla.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Sí fleiri postar á {domain}",
"hints.threads.replies_may_be_missing": "Svar frá øðrum ambætarum mangla møguliga.",
"hints.threads.see_more": "Sí fleiri svar á {domain}",
+ "home.column_settings.show_quotes": "Vís siteringar",
"home.column_settings.show_reblogs": "Vís lyft",
"home.column_settings.show_replies": "Vís svar",
"home.hide_announcements": "Fjal kunngerðir",
@@ -502,7 +526,6 @@
"lists.exclusive": "Fjal limir á heimarás",
"lists.exclusive_hint": "Um onkur er á hesum listanum, so skulu tey fjalast á heimarásini, so tú sleppir undan at síggja postar teirra tvær ferðir.",
"lists.find_users_to_add": "Finn brúkarar at leggja afturat",
- "lists.list_members": "Lista limir",
"lists.list_members_count": "{count, plural, one {# limur} other {# limir}}",
"lists.list_name": "Listanavn",
"lists.new_list_name": "Nýtt listanavn",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Doyv samrøðu",
"status.open": "Víðka henda postin",
"status.pin": "Ger fastan í vangan",
- "status.pinned": "Festur postur",
+ "status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta",
+ "status.quote_error.not_found": "Tað ber ikki til at vísa hendan postin.",
+ "status.quote_error.pending_approval": "Hesin posturin bíðar eftir góðkenning frá upprunahøvundinum.",
+ "status.quote_error.rejected": "Hesin posturin kann ikki vísast, tí upprunahøvundurin loyvir ikki at posturin verður siteraður.",
+ "status.quote_error.removed": "Hesin posturin var strikaður av høvundinum.",
+ "status.quote_error.unauthorized": "Hesin posturin kann ikki vísast, tí tú hevur ikki rættindi at síggja hann.",
+ "status.quote_post_author": "Postur hjá @{name}",
"status.read_more": "Les meira",
"status.reblog": "Stimbra",
"status.reblog_private": "Stimbra við upprunasýni",
diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json
index f63a1d2cba..683dde091f 100644
--- a/app/javascript/mastodon/locales/fr-CA.json
+++ b/app/javascript/mastodon/locales/fr-CA.json
@@ -23,13 +23,11 @@
"account.copy": "Copier le lien vers le profil",
"account.direct": "Mention privée @{name}",
"account.disable_notifications": "Ne plus me notifier quand @{name} publie",
- "account.domain_blocked": "Domaine bloqué",
"account.edit_profile": "Modifier le profil",
"account.enable_notifications": "Me notifier quand @{name} publie",
"account.endorse": "Inclure sur profil",
"account.featured": "En vedette",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Messages",
"account.featured_tags.last_status_at": "Dernière publication {date}",
"account.featured_tags.last_status_never": "Aucune publication",
"account.follow": "Suivre",
@@ -54,7 +52,6 @@
"account.mute_notifications_short": "Rendre les notifications muettes",
"account.mute_short": "Rendre muet",
"account.muted": "Masqué·e",
- "account.mutual": "Mutuel",
"account.no_bio": "Description manquante.",
"account.open_original_page": "Ouvrir la page d'origine",
"account.posts": "Publications",
@@ -296,7 +293,6 @@
"emoji_button.search_results": "Résultats",
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Voyage et lieux",
- "empty_column.account_featured": "Cette liste est vide",
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucune publication ici!",
@@ -499,7 +495,6 @@
"lists.exclusive": "Cacher les membres de la page d'accueil",
"lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil pour éviter de voir leurs messages deux fois.",
"lists.find_users_to_add": "Trouver des utilisateurs à ajouter",
- "lists.list_members": "Lister les membres",
"lists.list_members_count": "{count, plural, one {# member} other {# members}}",
"lists.list_name": "Nom de la liste",
"lists.new_list_name": "Nom de la nouvelle liste",
@@ -845,7 +840,6 @@
"status.mute_conversation": "Masquer la conversation",
"status.open": "Afficher la publication entière",
"status.pin": "Épingler sur profil",
- "status.pinned": "Message épinglé",
"status.read_more": "En savoir plus",
"status.reblog": "Booster",
"status.reblog_private": "Booster avec visibilité originale",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index f9c616627f..eccec003cc 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -23,13 +23,11 @@
"account.copy": "Copier le lien vers le profil",
"account.direct": "Mention privée @{name}",
"account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose",
- "account.domain_blocked": "Domaine bloqué",
"account.edit_profile": "Modifier le profil",
"account.enable_notifications": "Me notifier quand @{name} publie quelque chose",
"account.endorse": "Recommander sur votre profil",
"account.featured": "En vedette",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Messages",
"account.featured_tags.last_status_at": "Dernier message le {date}",
"account.featured_tags.last_status_never": "Aucun message",
"account.follow": "Suivre",
@@ -54,7 +52,6 @@
"account.mute_notifications_short": "Désactiver les notifications",
"account.mute_short": "Mettre en sourdine",
"account.muted": "Masqué·e",
- "account.mutual": "Mutuel",
"account.no_bio": "Aucune description fournie.",
"account.open_original_page": "Ouvrir la page d'origine",
"account.posts": "Messages",
@@ -296,7 +293,6 @@
"emoji_button.search_results": "Résultats de la recherche",
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Voyage et lieux",
- "empty_column.account_featured": "Cette liste est vide",
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucun message ici !",
@@ -499,7 +495,6 @@
"lists.exclusive": "Cacher les membres de la page d'accueil",
"lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil pour éviter de voir leurs messages deux fois.",
"lists.find_users_to_add": "Trouver des utilisateurs à ajouter",
- "lists.list_members": "Lister les membres",
"lists.list_members_count": "{count, plural, one {# member} other {# members}}",
"lists.list_name": "Nom de la liste",
"lists.new_list_name": "Nom de la nouvelle liste",
@@ -845,7 +840,6 @@
"status.mute_conversation": "Masquer la conversation",
"status.open": "Afficher le message entier",
"status.pin": "Épingler sur le profil",
- "status.pinned": "Message épinglé",
"status.read_more": "En savoir plus",
"status.reblog": "Partager",
"status.reblog_private": "Partager à l’audience originale",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
index e3c3222868..b93d459c32 100644
--- a/app/javascript/mastodon/locales/fy.json
+++ b/app/javascript/mastodon/locales/fy.json
@@ -19,14 +19,17 @@
"account.block_domain": "Domein {domain} blokkearje",
"account.block_short": "Blokkearje",
"account.blocked": "Blokkearre",
+ "account.blocking": "Blokkearre",
"account.cancel_follow_request": "Folchfersyk annulearje",
"account.copy": "Keppeling nei profyl kopiearje",
"account.direct": "Privee fermelde @{name}",
"account.disable_notifications": "Jou gjin melding mear wannear @{name} in berjocht pleatst",
- "account.domain_blocked": "Domein blokkearre",
+ "account.domain_blocking": "Domein blokkearre",
"account.edit_profile": "Profyl bewurkje",
"account.enable_notifications": "Jou in melding mear wannear @{name} in berjocht pleatst",
"account.endorse": "Op profyl werjaan",
+ "account.featured": "Foarsteld",
+ "account.featured.hashtags": "Hashtags",
"account.featured_tags.last_status_at": "Lêste berjocht op {date}",
"account.featured_tags.last_status_never": "Gjin berjochten",
"account.follow": "Folgje",
@@ -37,6 +40,7 @@
"account.following": "Folgjend",
"account.following_counter": "{count, plural, one {{counter} folgjend} other {{counter} folgjend}}",
"account.follows.empty": "Dizze brûker folget noch net ien.",
+ "account.follows_you": "Folget jo",
"account.go_to_profile": "Gean nei profyl",
"account.hide_reblogs": "Boosts fan @{name} ferstopje",
"account.in_memoriam": "Yn memoriam.",
@@ -51,19 +55,23 @@
"account.mute_notifications_short": "Meldingen negearje",
"account.mute_short": "Negearje",
"account.muted": "Negearre",
- "account.mutual": "Jimme folgje inoar",
+ "account.muting": "Dôve",
+ "account.mutual": "Jim folgje inoar",
"account.no_bio": "Gjin omskriuwing opjûn.",
"account.open_original_page": "Orizjinele side iepenje",
"account.posts": "Berjochten",
"account.posts_with_replies": "Berjochten en reaksjes",
+ "account.remove_from_followers": "{name} as folger fuortsmite",
"account.report": "@{name} rapportearje",
"account.requested": "Wacht op goedkarring. Klik om it folchfersyk te annulearjen",
"account.requested_follow": "{name} hat dy in folchfersyk stjoerd",
+ "account.requests_to_follow_you": "Fersiken om jo te folgjen",
"account.share": "Profyl fan @{name} diele",
"account.show_reblogs": "Boosts fan @{name} toane",
"account.statuses_counter": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}",
"account.unblock": "@{name} deblokkearje",
"account.unblock_domain": "Domein {domain} deblokkearje",
+ "account.unblock_domain_short": "Deblokkearje",
"account.unblock_short": "Deblokkearje",
"account.unendorse": "Net op profyl werjaan",
"account.unfollow": "Net mear folgje",
@@ -217,10 +225,17 @@
"confirmations.logout.confirm": "Ofmelde",
"confirmations.logout.message": "Binne jo wis dat jo ôfmelde wolle?",
"confirmations.logout.title": "Ofmelde?",
+ "confirmations.missing_alt_text.confirm": "Alt-tekst tafoegje",
+ "confirmations.missing_alt_text.message": "Jo berjocht befettet media sûnder alt-tekst. It tafoegjen fan beskriuwingen helpt jo om jo ynhâld tagonklik te meitsjen foar mear minsken.",
+ "confirmations.missing_alt_text.secondary": "Dochs pleatse",
+ "confirmations.missing_alt_text.title": "Alt-tekst tafoegje?",
"confirmations.mute.confirm": "Negearje",
"confirmations.redraft.confirm": "Fuortsmite en opnij opstelle",
"confirmations.redraft.message": "Binne jo wis dat jo dit berjocht fuortsmite en opnij opstelle wolle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht reitsje jo kwyt.",
"confirmations.redraft.title": "Berjocht fuortsmite en opnij opstelle?",
+ "confirmations.remove_from_followers.confirm": "Folger fuortsmite",
+ "confirmations.remove_from_followers.message": "{name} sil jo net mear folgje. Binne jo wis dat jo trochgean wolle?",
+ "confirmations.remove_from_followers.title": "Folger fuortsmite?",
"confirmations.reply.confirm": "Reagearje",
"confirmations.reply.message": "Troch no te reagearjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
"confirmations.reply.title": "Berjocht oerskriuwe?",
@@ -246,6 +261,9 @@
"dismissable_banner.community_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op {domain}.",
"dismissable_banner.dismiss": "Slute",
"dismissable_banner.explore_links": "Dizze nijsartikelen wurde hjoed de dei it meast dield op de fediverse. Nijere artikelen dy’t troch mear ferskate minsken pleatst binne, wurde heger rangskikt.",
+ "dismissable_banner.explore_statuses": "Dizze berjochten winne oan populariteit op de fediverse. Nijere berjochten mei mear boosts en favoriten stean heger.",
+ "dismissable_banner.explore_tags": "Dizze hashtags winne oan populariteit op de fediverse. Hashtags dy’t troch mear ferskate minsken brûkt wurde, wurde heger rangskikt.",
+ "dismissable_banner.public_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op de fediverse dy’t troch minsken op {domain} folge wurde.",
"domain_block_modal.block": "Server blokkearje",
"domain_block_modal.block_account_instead": "Yn stee hjirfan {name} blokkearje",
"domain_block_modal.they_can_interact_with_old_posts": "Minsken op dizze server kinne ynteraksje hawwe mei jo âlde berjochten.",
@@ -285,6 +303,7 @@
"emoji_button.search_results": "Sykresultaten",
"emoji_button.symbols": "Symboalen",
"emoji_button.travel": "Reizgje en lokaasjes",
+ "empty_column.account_featured_other.unknown": "Dizze account hat noch neat útljochte.",
"empty_column.account_hides_collections": "Dizze brûker hat derfoar keazen dizze ynformaasje net beskikber te meitsjen",
"empty_column.account_suspended": "Account beskoattele",
"empty_column.account_timeline": "Hjir binne gjin berjochten!",
@@ -365,8 +384,12 @@
"footer.privacy_policy": "Privacybelied",
"footer.source_code": "Boarnekoade besjen",
"footer.status": "Steat",
+ "footer.terms_of_service": "Tsjinstbetingsten",
"generic.saved": "Bewarre",
"getting_started.heading": "Uteinsette",
+ "hashtag.admin_moderation": "Moderaasje-omjouwing fan #{name} iepenje",
+ "hashtag.browse": "Berjochten mei #{hashtag} besjen",
+ "hashtag.browse_from_account": "Berjochten fan @{name} mei #{hashtag} besjen",
"hashtag.column_header.tag_mode.all": "en {additional}",
"hashtag.column_header.tag_mode.any": "of {additional}",
"hashtag.column_header.tag_mode.none": "sûnder {additional}",
@@ -380,6 +403,7 @@
"hashtag.counter_by_uses": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}} hjoed",
"hashtag.follow": "Hashtag folgje",
+ "hashtag.mute": "#{hashtag} negearje",
"hashtag.unfollow": "Hashtag ûntfolgje",
"hashtags.and_other": "…en {count, plural, one {}other {# mear}}",
"hints.profiles.followers_may_be_missing": "Folgers foar dit profyl kinne ûntbrekke.",
@@ -409,6 +433,12 @@
"ignore_notifications_modal.not_following_title": "Meldingen negearje fan minsken dy’t josels net folgje?",
"ignore_notifications_modal.private_mentions_title": "Meldingen negearje fan net frege priveeberjochten?",
"info_button.label": "Help",
+ "info_button.what_is_alt_text": "Wat is alt-tekst? Alt-tekst biedt ôfbyldingsbeskriuwingen foar minsken mei in fisuele beheining en ferbiningen mei in lege bânbreedte of foar minsken dy’t nei ekstra kontekst sykje.
Jo kinne de tagonklikheid en de begryplikheid foar elkenien ferbetterje troch dúdlik, koart en objektyf te skriuwen.
Beskriuw wichtige eleminten Fetsje tekst yn ôfbyldingen gear Brûk in normale sinsbou Mij oertallige ynformaasje Fokusje op trends en wichtige befiningen yn komplekse bylden (lykas diagrammen of kaarten) ",
+ "interaction_modal.action.favourite": "Om troch te gaan, moatte jo fan jo eigen account ôf as favoryt markearje.",
+ "interaction_modal.action.follow": "Om troch te gaan, moatte jo fan jo eigen account ôf folgje.",
+ "interaction_modal.action.reblog": "Om troch te gaan, moatte jo fan jo eigen account ôf booste.",
+ "interaction_modal.action.reply": "Om troch te gaan, moatte jo fan jo eigen account ôf reagearje.",
+ "interaction_modal.action.vote": "Om troch te gaan, moatte jo fan jo eigen account ôf as favoryt stimme.",
"interaction_modal.go": "Gean",
"interaction_modal.no_account_yet": "Hawwe jo noch gjin account?",
"interaction_modal.on_another_server": "Op een oare server",
@@ -479,7 +509,6 @@
"lists.exclusive": "Leden op jo Startside ferstopje",
"lists.exclusive_hint": "As ien op dizze list stiet, ferstopje dizze persoan dan op jo starttiidline om foar te kommen dat harren berjochten twa kear toand wurde.",
"lists.find_users_to_add": "Fyn brûkers om ta te foegjen",
- "lists.list_members": "Listleden",
"lists.list_members_count": "{count, plural, one{# lid} other{# leden}}",
"lists.list_name": "Listnamme",
"lists.new_list_name": "Nije listnamme",
@@ -681,6 +710,7 @@
"poll_button.remove_poll": "Enkête fuortsmite",
"privacy.change": "Sichtberheid fan berjocht oanpasse",
"privacy.direct.long": "Elkenien dy’ yn it berjocht fermeld wurdt",
+ "privacy.direct.short": "Priveefermelding",
"privacy.private.long": "Allinnich jo folgers",
"privacy.private.short": "Folgers",
"privacy.public.long": "Elkenien op Mastodon en dêrbûten",
@@ -824,7 +854,6 @@
"status.mute_conversation": "Petear negearje",
"status.open": "Dit berjocht útklappe",
"status.pin": "Op profylside fêstsette",
- "status.pinned": "Fêstset berjocht",
"status.read_more": "Mear ynfo",
"status.reblog": "Booste",
"status.reblog_private": "Boost nei oarspronklike ûntfangers",
@@ -855,7 +884,9 @@
"subscribed_languages.target": "Toande talen foar {target} wizigje",
"tabs_bar.home": "Startside",
"tabs_bar.notifications": "Meldingen",
+ "terms_of_service.effective_as_of": "Effektyf fan {date} ôf",
"terms_of_service.title": "Gebrûksbetingsten",
+ "terms_of_service.upcoming_changes_on": "Oankommende wizigingen op {date}",
"time_remaining.days": "{number, plural, one {# dei} other {# dagen}} te gean",
"time_remaining.hours": "{number, plural, one {# oere} other {# oeren}} te gean",
"time_remaining.minutes": "{number, plural, one {# minút} other {# minuten}} te gean",
@@ -886,6 +917,12 @@
"video.expand": "Fideo grutter meitsje",
"video.fullscreen": "Folslein skerm",
"video.hide": "Fideo ferstopje",
+ "video.mute": "Negearje",
"video.pause": "Skoft",
- "video.play": "Ofspylje"
+ "video.play": "Ofspylje",
+ "video.skip_backward": "Tebek",
+ "video.skip_forward": "Foarút",
+ "video.unmute": "Net mear negearje",
+ "video.volume_down": "Folume omleech",
+ "video.volume_up": "Folume omheech"
}
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 5935b39e2d..9782a5ea24 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Freastalaithe faoi stiúir",
"about.contact": "Teagmháil:",
+ "about.default_locale": "Réamhshocrú",
"about.disclaimer": "Bogearra foinse oscailte saor in aisce is ea Mastodon, agus is le Mastodon gGmbH an trádmharc.",
"about.domain_blocks.no_reason_available": "Níl an fáth ar fáil",
"about.domain_blocks.preamble": "Go hiondúil, tugann Mastadán cead duit a bheith ag plé le húsáideoirí as freastalaí ar bith eile sa chomhchruinne agus a gcuid inneachair a fheiceáil. Seo iad na heisceachtaí a rinneadh ar an bhfreastalaí áirithe seo.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Teoranta",
"about.domain_blocks.suspended.explanation": "Ní dhéanfar aon sonra ón fhreastalaí seo a phróiseáil, a stóráil ná a mhalartú, rud a fhágann nach féidir aon teagmháil ná aon chumarsáid a dhéanamh le húsáideoirí ón fhreastalaí seo.",
"about.domain_blocks.suspended.title": "Ar fionraí",
+ "about.language_label": "Teanga",
"about.not_available": "Níor cuireadh an t-eolas seo ar fáil ar an bhfreastalaí seo.",
"about.powered_by": "Meáin shóisialta díláraithe faoi chumhacht {mastodon}",
"about.rules": "Rialacha an fhreastalaí",
@@ -19,14 +21,21 @@
"account.block_domain": "Bac ainm fearainn {domain}",
"account.block_short": "Bloc",
"account.blocked": "Bactha",
+ "account.blocking": "Ag Blocáil",
"account.cancel_follow_request": "Éirigh as iarratas leanta",
"account.copy": "Cóipeáil nasc chuig an bpróifíl",
"account.direct": "Luaigh @{name} go príobháideach",
"account.disable_notifications": "Éirigh as ag cuir mé in eol nuair bpostálann @{name}",
- "account.domain_blocked": "Ainm fearainn bactha",
+ "account.domain_blocking": "Fearann a bhlocáil",
"account.edit_profile": "Cuir an phróifíl in eagar",
"account.enable_notifications": "Cuir mé in eol nuair bpostálann @{name}",
"account.endorse": "Cuir ar an phróifíl mar ghné",
+ "account.familiar_followers_many": "Ina dhiaidh sin ag {name1}, {name2}, agus {othersCount, plural, \n one {duine eile atá aithnid duit} \n two {# duine eile atá aithnid duit} \n few {# dhuine eile atá aithnid duit} \n many {# nduine eile atá aithnid duit} \n other {# duine eile atá aithnid duit}}",
+ "account.familiar_followers_one": "Ina dhiaidh sin {name1}",
+ "account.familiar_followers_two": "Ina dhiaidh sin tá {name1} agus {name2}",
+ "account.featured": "Faoi thrácht",
+ "account.featured.accounts": "Próifílí",
+ "account.featured.hashtags": "Haischlibeanna",
"account.featured_tags.last_status_at": "Postáil is déanaí ar {date}",
"account.featured_tags.last_status_never": "Gan aon phoist",
"account.follow": "Lean",
@@ -34,9 +43,11 @@
"account.followers": "Leantóirí",
"account.followers.empty": "Ní leanann éinne an t-úsáideoir seo fós.",
"account.followers_counter": "{count, plural, one {{counter} leantóir} other {{counter} leantóirí}}",
+ "account.followers_you_know_counter": "{counter} tá a fhios agat",
"account.following": "Ag leanúint",
"account.following_counter": "{count, plural, one {{counter} ag leanúint} other {{counter} ag leanúint}}",
"account.follows.empty": "Ní leanann an t-úsáideoir seo aon duine go fóill.",
+ "account.follows_you": "Leanann tú",
"account.go_to_profile": "Téigh go dtí próifíl",
"account.hide_reblogs": "Folaigh moltaí ó @{name}",
"account.in_memoriam": "Cuimhneachán.",
@@ -51,14 +62,17 @@
"account.mute_notifications_short": "Balbhaigh fógraí",
"account.mute_short": "Balbhaigh",
"account.muted": "Balbhaithe",
- "account.mutual": "Frithpháirteach",
+ "account.muting": "Ag balbhaigh",
+ "account.mutual": "Leanann sibh a chéile",
"account.no_bio": "Níor tugadh tuairisc.",
"account.open_original_page": "Oscail an leathanach bunaidh",
"account.posts": "Postálacha",
"account.posts_with_replies": "Postálacha agus freagraí",
+ "account.remove_from_followers": "Bain {name} de na leantóirí",
"account.report": "Tuairiscigh @{name}",
"account.requested": "Ag fanacht le ceadú. Cliceáil chun an iarratas leanúnaí a chealú",
"account.requested_follow": "D'iarr {name} ort do chuntas a leanúint",
+ "account.requests_to_follow_you": "Iarratais chun tú a leanúint",
"account.share": "Roinn próifíl @{name}",
"account.show_reblogs": "Taispeáin moltaí ó @{name}",
"account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} poist}}",
@@ -226,6 +240,9 @@
"confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh",
"confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.",
"confirmations.redraft.title": "Scrios & athdhréachtú postáil?",
+ "confirmations.remove_from_followers.confirm": "Bain leantóir",
+ "confirmations.remove_from_followers.message": "Scoirfidh {name} de bheith ag leanúint leat. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?",
+ "confirmations.remove_from_followers.title": "Bain an leantóir?",
"confirmations.reply.confirm": "Freagair",
"confirmations.reply.message": "Scriosfaidh freagra láithreach an teachtaireacht atá a chumadh anois agat. An bhfuil tú cinnte gur mhaith leat leanúint leat?",
"confirmations.reply.title": "Forscríobh postáil?",
@@ -293,6 +310,9 @@
"emoji_button.search_results": "Torthaí cuardaigh",
"emoji_button.symbols": "Comharthaí",
"emoji_button.travel": "Taisteal ⁊ Áiteanna",
+ "empty_column.account_featured.me": "Níl aon rud curtha i láthair agat go fóill. An raibh a fhios agat gur féidir leat na haischlibeanna is mó a úsáideann tú, agus fiú cuntais do chairde, a chur i láthair ar do phróifíl?",
+ "empty_column.account_featured.other": "Níl aon rud feicthe ag {acct} go fóill. An raibh a fhios agat gur féidir leat na hashtags is mó a úsáideann tú, agus fiú cuntais do chairde, a chur ar do phróifíl?",
+ "empty_column.account_featured_other.unknown": "Níl aon rud le feiceáil sa chuntas seo go fóill.",
"empty_column.account_hides_collections": "Roghnaigh an t-úsáideoir seo gan an fhaisnéis seo a chur ar fáil",
"empty_column.account_suspended": "Cuntas ar fionraí",
"empty_column.account_timeline": "Níl postálacha ar bith anseo!",
@@ -325,6 +345,11 @@
"explore.trending_links": "Nuacht",
"explore.trending_statuses": "Postálacha",
"explore.trending_tags": "Haischlibeanna",
+ "featured_carousel.header": "{count, plural, one {Postáil phinnáilte} two {Poist Phionáilte} few {Poist Phionáilte} many {Poist Phionáilte} other {Poist Phionáilte}}",
+ "featured_carousel.next": "Ar Aghaidh",
+ "featured_carousel.post": "Post",
+ "featured_carousel.previous": "Roimhe Seo",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Ní bhaineann an chatagóir scagaire seo leis an gcomhthéacs ina bhfuair tú rochtain ar an bpostáil seo. Más mian leat an postáil a scagadh sa chomhthéacs seo freisin, beidh ort an scagaire a chur in eagar.",
"filter_modal.added.context_mismatch_title": "Neamhréir comhthéacs!",
"filter_modal.added.expired_explanation": "Tá an chatagóir scagaire seo imithe in éag, beidh ort an dáta éaga a athrú chun é a chur i bhfeidhm.",
@@ -377,6 +402,8 @@
"generic.saved": "Sábháilte",
"getting_started.heading": "Ag tosú amach",
"hashtag.admin_moderation": "Oscail comhéadan modhnóireachta le haghaidh #{name}",
+ "hashtag.browse": "Brabhsáil poist i #{hashtag}",
+ "hashtag.browse_from_account": "Brabhsáil poist ó @{name} i #{hashtag}",
"hashtag.column_header.tag_mode.all": "agus {additional}",
"hashtag.column_header.tag_mode.any": "nó {additional}",
"hashtag.column_header.tag_mode.none": "gan {additional}",
@@ -389,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} rannpháirtí} two {{counter} rannpháirtí} few {{counter} rannpháirtí} many {{counter} rannpháirtí} other {{counter} rannpháirtí}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} two {{counter} post} few {{counter} post} many {{counter} post} other {{counter} poist}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post inniu} other {{counter} poist inniu}} inniu",
+ "hashtag.feature": "Gné ar phróifíl",
"hashtag.follow": "Lean haischlib",
+ "hashtag.mute": "Balbhaigh #{hashtag}",
+ "hashtag.unfeature": "Ná cuir le feiceáil ar phróifíl",
"hashtag.unfollow": "Ná lean haischlib",
"hashtags.and_other": "agus {count, plural, one {} two {# níos} few {# níos} many {# níos} other {# níos}}",
"hints.profiles.followers_may_be_missing": "Seans go bhfuil leantóirí don phróifíl seo in easnamh.",
@@ -495,7 +525,6 @@
"lists.exclusive": "Folaigh baill sa Bhaile",
"lists.exclusive_hint": "Má tá duine ar an liosta seo, cuir i bhfolach iad i do fhotha Baile ionas nach bhfeicfidh tú a bpoist faoi dhó.",
"lists.find_users_to_add": "Aimsigh úsáideoirí le cur leis",
- "lists.list_members": "Liostaigh baill",
"lists.list_members_count": "{count, plural, one {# ball} two {# bhall} few {# baill} many {# baill} other {# baill}}",
"lists.list_name": "Ainm an liosta",
"lists.new_list_name": "Ainm liosta nua",
@@ -841,7 +870,13 @@
"status.mute_conversation": "Balbhaigh comhrá",
"status.open": "Leathnaigh an post seo",
"status.pin": "Pionnáil ar do phróifíl",
- "status.pinned": "Postáil pionnáilte",
+ "status.quote_error.filtered": "I bhfolach mar gheall ar cheann de do scagairí",
+ "status.quote_error.not_found": "Ní féidir an post seo a thaispeáint.",
+ "status.quote_error.pending_approval": "Tá an post seo ag feitheamh ar cheadú ón údar bunaidh.",
+ "status.quote_error.rejected": "Ní féidir an post seo a thaispeáint mar ní cheadaíonn an t-údar bunaidh é a lua.",
+ "status.quote_error.removed": "Baineadh an post seo ag a údar.",
+ "status.quote_error.unauthorized": "Ní féidir an post seo a thaispeáint mar níl údarú agat é a fheiceáil.",
+ "status.quote_post_author": "Postáil le {name}",
"status.read_more": "Léan a thuilleadh",
"status.reblog": "Treisiú",
"status.reblog_private": "Mol le léargas bunúsach",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index f295db0b43..89fad4b5b7 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Frithealaichean fo mhaorsainneachd",
"about.contact": "Fios thugainn:",
+ "about.default_locale": "Bun-roghainn",
"about.disclaimer": "’S e bathar-bog saor le bun-tùs fosgailte a th’ ann am Mastodon agus ’na chomharra-mhalairt aig Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Chan eil an t-adhbhar ga thoirt seachad",
"about.domain_blocks.preamble": "San fharsaingeachd, leigidh Mastodon leat susbaint o fhrithealaiche sam bith sa cho-shaoghal a shealltainn agus eadar-ghìomh a ghabhail leis na cleachdaichean uapa-san. Seo na h-easgaidhean a tha an sàs air an fhrithealaiche shònraichte seo.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Cuingichte",
"about.domain_blocks.suspended.explanation": "Cha dèid dàta sam bith on fhrithealaiche seo a phròiseasadh, a stòradh no iomlaid agus chan urrainn do na cleachdaichean on fhrithealaiche sin conaltradh no eadar-ghnìomh a ghabhail an-seo.",
"about.domain_blocks.suspended.title": "À rèim",
+ "about.language_label": "Cànan",
"about.not_available": "Cha deach am fiosrachadh seo a sholar air an fhrithealaiche seo.",
"about.powered_by": "Lìonra sòisealta sgaoilte le cumhachd {mastodon}",
"about.rules": "Riaghailtean an fhrithealaiche",
@@ -19,14 +21,21 @@
"account.block_domain": "Bac an àrainn {domain}",
"account.block_short": "Bac",
"account.blocked": "’Ga bhacadh",
+ "account.blocking": "’Ga bhacadh",
"account.cancel_follow_request": "Sguir dhen leantainn",
"account.copy": "Dèan lethbhreac dhen cheangal dhan phròifil",
"account.direct": "Thoir iomradh air @{name} gu prìobhaideach",
"account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris",
- "account.domain_blocked": "Chaidh an àrainn a bhacadh",
+ "account.domain_blocking": "Àrainn ’ga bacadh",
"account.edit_profile": "Deasaich a’ phròifil",
"account.enable_notifications": "Cuir brath thugam nuair a chuireas @{name} post ris",
"account.endorse": "Brosnaich air a’ phròifil",
+ "account.familiar_followers_many": "’Ga leantainn le {name1}, {name2}, and {othersCount, plural, one {# eile air a bheil thu eòlach} other {# eile air a bheil thu eòlach}}",
+ "account.familiar_followers_one": "’Ga leantainn le {name1}",
+ "account.familiar_followers_two": "’Ga leantainn le {name1} ’s {name2}",
+ "account.featured": "’Ga bhrosnachadh",
+ "account.featured.accounts": "Pròifilean",
+ "account.featured.hashtags": "Tagaichean hais",
"account.featured_tags.last_status_at": "Am post mu dheireadh {date}",
"account.featured_tags.last_status_never": "Gun phost",
"account.follow": "Lean",
@@ -34,9 +43,11 @@
"account.followers": "Luchd-leantainn",
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}",
+ "account.followers_you_know_counter": "{counter} air a bheil thu eòlach",
"account.following": "A’ leantainn",
"account.following_counter": "{count, plural, one {A’ leantainn {counter}} other {A’ leantainn {counter}}}",
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn neach sam bith fhathast.",
+ "account.follows_you": "’Gad leantainn",
"account.go_to_profile": "Tadhail air a’ phròifil",
"account.hide_reblogs": "Falaich na brosnachaidhean o @{name}",
"account.in_memoriam": "Mar chuimhneachan.",
@@ -51,19 +62,23 @@
"account.mute_notifications_short": "Mùch na brathan",
"account.mute_short": "Mùch",
"account.muted": "’Ga mhùchadh",
- "account.mutual": "Co-dhàimh",
+ "account.muting": "’Ga mhùchadh",
+ "account.mutual": "A’ leantainn càch a chèile",
"account.no_bio": "Cha deach tuairisgeul a sholar.",
"account.open_original_page": "Fosgail an duilleag thùsail",
"account.posts": "Postaichean",
"account.posts_with_replies": "Postaichean ’s freagairtean",
+ "account.remove_from_followers": "Thoir {name} air falbh on luchd-leantainn",
"account.report": "Dèan gearan mu @{name}",
"account.requested": "A’ feitheamh air aontachadh. Briog airson sgur dhen iarrtas leantainn",
"account.requested_follow": "Dh’iarr {name} ’gad leantainn",
+ "account.requests_to_follow_you": "Iarrtasan leantainn",
"account.share": "Co-roinn a’ phròifil aig @{name}",
"account.show_reblogs": "Seall na brosnachaidhean o @{name}",
"account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
"account.unblock": "Dì-bhac @{name}",
"account.unblock_domain": "Dì-bhac an àrainn {domain}",
+ "account.unblock_domain_short": "Dì-bhac",
"account.unblock_short": "Dì-bhac",
"account.unendorse": "Na brosnaich air a’ phròifil",
"account.unfollow": "Na lean tuilleadh",
@@ -85,6 +100,13 @@
"alert.unexpected.message": "Thachair mearachd ris nach robh dùil.",
"alert.unexpected.title": "Oich!",
"alt_text_badge.title": "Roghainn teacsa",
+ "alt_text_modal.add_alt_text": "Cuir roghainn teacsa ris",
+ "alt_text_modal.add_text_from_image": "Cuir teacsa on dealbh ris",
+ "alt_text_modal.cancel": "Sguir dheth",
+ "alt_text_modal.change_thumbnail": "Atharraich an dealbhag",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Mìnich seo dhan fheadhainn air a bheil ciorram claisneachd…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Mìnich seo dhan fheadhainn air a bheil cion-lèirsinne…",
+ "alt_text_modal.done": "Deiseil",
"announcement.announcement": "Brath-fios",
"annual_report.summary.archetype.booster": "Brosnaiche",
"annual_report.summary.archetype.lurker": "Eala-bhalbh",
@@ -102,6 +124,7 @@
"annual_report.summary.most_used_hashtag.most_used_hashtag": "an taga hais a chaidh a cleachdadh as trice",
"annual_report.summary.most_used_hashtag.none": "Chan eil gin",
"annual_report.summary.new_posts.new_posts": "postaichean ùra",
+ "annual_report.summary.percentile.text": "Tha thu am measg dhen luchd-cleachdaidh as cliùitiche air {domain}. ",
"annual_report.summary.percentile.we_wont_tell_bernie": "Ainmeil ’nad latha ’s ’nad linn.",
"annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon.",
"attachments_list.unprocessed": "(gun phròiseasadh)",
@@ -127,6 +150,7 @@
"bundle_column_error.routing.body": "Cha do lorg sinn an duilleag a dh’iarr thu. A bheil thu cinnteach gu bheil an t-URL ann am bàr an t-seòlaidh mar bu chòir?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Dùin",
+ "bundle_modal_error.message": "Chaidh rudeigin ceàrr le luchdadh na sgrìn seo.",
"bundle_modal_error.retry": "Feuch ris a-rithist",
"closed_registrations.other_server_instructions": "Air sgàth ’s gu bheil Mastodon sgaoilte, ’s urrainn dhut cunntas a chruthachadh air frithealaiche eile agus conaltradh ris an fhrithealaiche seo co-dhiù.",
"closed_registrations_modal.description": "Cha ghabh cunntas a chruthachadh air {domain} aig an àm seo ach thoir an aire nach fheum thu cunntas air {domain} gu sònraichte airson Mastodon a chleachdadh.",
@@ -137,13 +161,16 @@
"column.blocks": "Cleachdaichean bacte",
"column.bookmarks": "Comharran-lìn",
"column.community": "Loidhne-ama ionadail",
+ "column.create_list": "Cruthaich liosta",
"column.direct": "Iomraidhean prìobhaideach",
"column.directory": "Rùraich sna pròifilean",
"column.domain_blocks": "Àrainnean bacte",
+ "column.edit_list": "Deasaich an liosta",
"column.favourites": "Annsachdan",
"column.firehose": "An saoghal poblach",
"column.follow_requests": "Iarrtasan leantainn",
"column.home": "Dachaigh",
+ "column.list_members": "Stiùir buill na liosta",
"column.lists": "Liostaichean",
"column.mutes": "Cleachdaichean mùchte",
"column.notifications": "Brathan",
@@ -156,6 +183,7 @@
"column_header.pin": "Prìnich",
"column_header.show_settings": "Seall na roghainnean",
"column_header.unpin": "Dì-phrìnich",
+ "column_search.cancel": "Sguir dheth",
"column_subheading.settings": "Roghainnean",
"community.column_settings.local_only": "Feadhainn ionadail a-mhàin",
"community.column_settings.media_only": "Meadhanan a-mhàin",
@@ -198,13 +226,23 @@
"confirmations.edit.confirm": "Deasaich",
"confirmations.edit.message": "Ma nì thu deasachadh an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
"confirmations.edit.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?",
+ "confirmations.follow_to_list.confirm": "Lean ’s cuir ris an liosta",
+ "confirmations.follow_to_list.message": "Feumaidh tu {name} a leantainn ron chur ri liosta.",
+ "confirmations.follow_to_list.title": "A bheil thu airson an cleachdaiche a leantainn?",
"confirmations.logout.confirm": "Clàraich a-mach",
"confirmations.logout.message": "A bheil thu cinnteach gu bheil thu airson clàradh a-mach?",
"confirmations.logout.title": "A bheil thu airson clàradh a-mach?",
+ "confirmations.missing_alt_text.confirm": "Cuir roghainn teacsa ris",
+ "confirmations.missing_alt_text.message": "Tha meadhan sa phost seo aig nach eil roghainn teacsa. Ma chuireas tu tuairisgeul ris, ’s urrainn do bharrachd daoine an t-susbaint agad a ruigsinn.",
+ "confirmations.missing_alt_text.secondary": "Postaich e co-dhiù",
+ "confirmations.missing_alt_text.title": "A bheil thu airson roghainn teacsa a chur ris?",
"confirmations.mute.confirm": "Mùch",
"confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr",
"confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.",
"confirmations.redraft.title": "A bheil thu airson am post a sguabadh às ⁊ dreachd ùr a dhèanamh dheth?",
+ "confirmations.remove_from_followers.confirm": "Thoir an neach-leantainn air falbh",
+ "confirmations.remove_from_followers.message": "Cha lean {name} thu tuilleadh. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
+ "confirmations.remove_from_followers.title": "A bheil thu airson an neach-leantainn a thoirt air falbh?",
"confirmations.reply.confirm": "Freagair",
"confirmations.reply.message": "Ma bheir thu freagairt an-dràsta, thèid seo a sgrìobhadh thairis air an teachdaireachd a tha thu a’ sgrìobhadh an-dràsta. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?",
"confirmations.reply.title": "A bheil thu airson sgrìobhadh thairis air a’ phost?",
@@ -229,6 +267,10 @@
"disabled_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas aig an àm seo.",
"dismissable_banner.community_timeline": "Seo na postaichean poblach as ùire o dhaoine aig a bheil cunntas air {domain}.",
"dismissable_banner.dismiss": "Leig seachad",
+ "dismissable_banner.explore_links": "Tha na naidheachdan seo gan co-roinneadh as trice air a’ cho-shaoghal an-diugh. Gheibh sgeulachdan-naidheachd nas ùire a chaidh a cho-roinneadh le barrachd dhaoine eadar-dhealaichte rangachadh nas àirde.",
+ "dismissable_banner.explore_statuses": "Tha fèill air na postaichean seo a’ fàs thar a’ cho-shaoghail an-diugh. Gheibh postaichean nas ùire le barrachd brosnaichean is annsachdan rangachadh nas àirde.",
+ "dismissable_banner.explore_tags": "Tha fèill air na tagaichean hais seo a’ fàs air a’ cho-shaoghal an-diugh. Gheibh tagaichean hais a tha gan cleachdadh le daoine eadar-dhealaichte rangachadh nas àirde.",
+ "dismissable_banner.public_timeline": "Seo na postaichean poblach as ùire o dhaoine air a’ cho-shaoghal tha ’gan leantainn le daoine air {domain}.",
"domain_block_modal.block": "Bac am frithealaiche",
"domain_block_modal.block_account_instead": "Bac @{name} ’na àite",
"domain_block_modal.they_can_interact_with_old_posts": "’S urrainn do dhaoine a th’ air an fhrithealaiche seo eadar-ghabhail leis na seann-phostaichean agad.",
@@ -268,6 +310,9 @@
"emoji_button.search_results": "Toraidhean an luirg",
"emoji_button.symbols": "Samhlaidhean",
"emoji_button.travel": "Siubhal ⁊ àitichean",
+ "empty_column.account_featured.me": "Chan eil thu a’ brosnachadh dad fhathast. An robh fios agad gur urrainn dhut na tagaichean hais a chleachdas tu as trice agus fiù ’s cunntasan do charaidean a bhrosnachadh air a’ phròifil agad?",
+ "empty_column.account_featured.other": "Chan eil {acct} a’ brosnachadh dad fhathast. An robh fios agad gur urrainn dhut na tagaichean hais a chleachdas tu as trice agus fiù ’s cunntasan do charaidean a bhrosnachadh air a’ phròifil agad?",
+ "empty_column.account_featured_other.unknown": "Chan eil an cunntas seo a’ brosnachadh dad fhathast.",
"empty_column.account_hides_collections": "Chuir an cleachdaiche seo roimhe nach eil am fiosrachadh seo ri fhaighinn",
"empty_column.account_suspended": "Chaidh an cunntas a chur à rèim",
"empty_column.account_timeline": "Chan eil post an-seo!",
@@ -300,6 +345,11 @@
"explore.trending_links": "Naidheachdan",
"explore.trending_statuses": "Postaichean",
"explore.trending_tags": "Tagaichean hais",
+ "featured_carousel.header": "{count, plural, one {Post prìnichte} two {Postaichean prìnichte} few {Postaichean prìnichte} other {Postaichean prìnichte}}",
+ "featured_carousel.next": "Air adhart",
+ "featured_carousel.post": "Post",
+ "featured_carousel.previous": "Air ais",
+ "featured_carousel.slide": "{index} à {total}",
"filter_modal.added.context_mismatch_explanation": "Chan eil an roinn-seòrsa criathraidh iom seo chaidh dhan cho-theacs san do dh’inntrig thu am post seo. Ma tha thu airson am post a chriathradh sa cho-theacs seo cuideachd, feumaidh tu a’ chriathrag a dheasachadh.",
"filter_modal.added.context_mismatch_title": "Co-theacsa neo-iomchaidh!",
"filter_modal.added.expired_explanation": "Dh’fhalbh an ùine air an roinn-seòrsa criathraidh seo agus feumaidh tu an ceann-là crìochnachaidh atharrachadh mus cuir thu an sàs i.",
@@ -348,8 +398,12 @@
"footer.privacy_policy": "Poileasaidh prìobhaideachd",
"footer.source_code": "Seall am bun-tùs",
"footer.status": "Staid",
+ "footer.terms_of_service": "Teirmichean na seirbheise",
"generic.saved": "Chaidh a shàbhaladh",
"getting_started.heading": "Toiseach",
+ "hashtag.admin_moderation": "Fosgail eadar-aghaidh na maorsainneachd dha #{name}",
+ "hashtag.browse": "Rùraich na postaichean sa bheil #{hashtag}",
+ "hashtag.browse_from_account": "Rùraich na postaichean aig @{name} ’s #{hashtag} annta",
"hashtag.column_header.tag_mode.all": "agus {additional}",
"hashtag.column_header.tag_mode.any": "no {additional}",
"hashtag.column_header.tag_mode.none": "às aonais {additional}",
@@ -362,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} chom-pàirtiche} two {{counter} chom-pàirtiche} few {{counter} com-pàirtiche} other {{counter} com-pàirtiche}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}} an-diugh",
+ "hashtag.feature": "Brosnaich air a’ phròifil",
"hashtag.follow": "Lean an taga hais",
+ "hashtag.mute": "Mùch #{hashtag}",
+ "hashtag.unfeature": "Na brosnaich air a’ phròifil",
"hashtag.unfollow": "Na lean an taga hais tuilleadh",
"hashtags.and_other": "…agus {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}",
"hints.profiles.followers_may_be_missing": "Dh’fhaoidte gu bheil cuid dhen luchd-leantainn na pròifil seo a dhìth.",
@@ -391,6 +448,15 @@
"ignore_notifications_modal.not_followers_title": "A bheil thu airson na brathan o dhaoine nach eil ’gad leantainn a leigeil seachad?",
"ignore_notifications_modal.not_following_title": "A bheil thu airson na brathan o dhaoine nach eil thu a’ leantainn a leigeil seachad?",
"ignore_notifications_modal.private_mentions_title": "A bheil thu airson na brathan o iomraidhean phrìobhaideach gun iarraidh a leigeil seachad?",
+ "info_button.label": "Cobhair",
+ "info_button.what_is_alt_text": "Dè a th’ ann an roghainn teacsa? Bheir roghainn teacsa tuairisgeulan dhealbhan dhan fheadhainn air a bheil cion lèirsinne, aig a bheil ceangal air leud-banna cumhang no a tha a’ sireadh barrachd co-theacsa.
’S urrainn dhut piseach a thoirt air an t-so-ruigsinneachd is an tuigse dhan a h-uile duine ma sgrìobhas tu roghainn teacsa a tha soilleir, goirid is cuspaireach.
Gabh a-steach na nithean cudromach Dèan geàrr-chunntas dhen teacsa sna dealbhan Cleachd structar sheantansan àbhaisteach \\nSeachainn fiosrachadh anabarrach Cùm an aire air treandaichean is puingean cudromach ann an dealbhan iom-fhillte (mar diagram no mapa) ",
+ "interaction_modal.action.favourite": "Airson leantainn air adhart, feumaidh tu a chur ris na h-annsachdan on chunntas agad.",
+ "interaction_modal.action.follow": "Airson leantainn air adhart, feumaidh tu a leantainn on chunntas agad.",
+ "interaction_modal.action.reblog": "Airson leantainn air adhart, feumaidh tu a bhrosnachadh on chunntas agad.",
+ "interaction_modal.action.reply": "Airson leantainn air adhart, feumaidh tu fhreagairt on chunntas agad.",
+ "interaction_modal.action.vote": "Airson leantainn air adhart, feumaidh tu bhòtadh on chunntas agad.",
+ "interaction_modal.go": "Siuthad",
+ "interaction_modal.no_account_yet": "Nach eil cunntas agad fhathast?",
"interaction_modal.on_another_server": "Air frithealaiche eile",
"interaction_modal.on_this_server": "Air an frithealaiche seo",
"interaction_modal.title.favourite": "Cuir am post aig {name} ris na h-annsachdan",
@@ -398,6 +464,7 @@
"interaction_modal.title.reblog": "Brosnaich am post aig {name}",
"interaction_modal.title.reply": "Freagair dhan phost aig {name}",
"interaction_modal.title.vote": "Bhòt sa chunntas-bheachd aig {name}",
+ "interaction_modal.username_prompt": "M.e. {example}",
"intervals.full.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}",
"intervals.full.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}}",
"intervals.full.minutes": "{number, plural, one {# mhionaid} two {# mhionaid} few {# mionaidean} other {# mionaid}}",
@@ -433,6 +500,7 @@
"keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte",
"keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan",
"keyboard_shortcuts.toot": "Tòisich air post ùr",
+ "keyboard_shortcuts.translate": "airson post eadar-theangachadh",
"keyboard_shortcuts.unfocus": "Thoir am fòcas far raon teacsa an sgrìobhaidh/an luirg",
"keyboard_shortcuts.up": "Gluais suas air an liosta",
"lightbox.close": "Dùin",
@@ -445,11 +513,31 @@
"link_preview.author": "Le {name}",
"link_preview.more_from_author": "Barrachd le {name}",
"link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
+ "lists.add_member": "Cuir ris",
+ "lists.add_to_list": "Cuir ris an liosta",
+ "lists.add_to_lists": "Cuir {name} ri liostaichean",
+ "lists.create": "Cruthaich",
+ "lists.create_a_list_to_organize": "Cruthaich liosta ùr airson rian a chur air do dhachaigh",
+ "lists.create_list": "Cruthaich liosta",
"lists.delete": "Sguab às an liosta",
+ "lists.done": "Deiseil",
"lists.edit": "Deasaich an liosta",
+ "lists.exclusive": "Falaich na buill san dachaigh",
+ "lists.exclusive_hint": "Falaich an fheadhainn a tha air an liosta seo air loidhne-ama na dachaigh ach nach fhaic thu na postaichean aca dà thuras.",
+ "lists.find_users_to_add": "Lorg cleachdaichean ri chur ris",
+ "lists.list_members_count": "{count, plural, one {# bhall} two {# bhall} few {# buill} other {# ball}}",
+ "lists.list_name": "Ainm na liosta",
+ "lists.new_list_name": "Ainm na liosta ùire",
+ "lists.no_lists_yet": "Chan eil liosta ann fhathast.",
+ "lists.no_members_yet": "Chan eil ball ann fhathast.",
+ "lists.no_results_found": "Cha deach toradh a lorg.",
+ "lists.remove_member": "Thoir air falbh",
"lists.replies_policy.followed": "Cleachdaiche sam bith a leanas mi",
"lists.replies_policy.list": "Buill na liosta",
"lists.replies_policy.none": "Na seall idir",
+ "lists.save": "Sàbhail",
+ "lists.search": "Lorg",
+ "lists.show_replies_to": "Gabh a-staigh freagairtean o bhuill na liosta gu",
"load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}",
"loading_indicator.label": "’Ga luchdadh…",
"media_gallery.hide": "Falaich",
@@ -502,6 +590,8 @@
"notification.annual_report.view": "Seall #Wrapstodon",
"notification.favourite": "Is annsa le {name} am post agad",
"notification.favourite.name_and_others_with_link": "Is annsa le {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} am post agad",
+ "notification.favourite_pm": "Is annsa le {name} an t-iomradh prìobhaideach agad",
+ "notification.favourite_pm.name_and_others_with_link": "Is annsa le {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} an t-iomradh prìobhaideach agad",
"notification.follow": "Tha {name} ’gad leantainn a-nis",
"notification.follow.name_and_others": "Lean {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} thu",
"notification.follow_request": "Dh’iarr {name} ’gad leantainn",
@@ -606,7 +696,10 @@
"notifications_permission_banner.enable": "Cuir brathan deasga an comas",
"notifications_permission_banner.how_to_control": "Airson brathan fhaighinn nuair nach eil Mastodon fosgailte, cuir na brathan deasga an comas. Tha an smachd agad fhèin air dè na seòrsaichean de chonaltradh a ghineas brathan deasga leis a’ phutan {icon} gu h-àrd nuair a bhios iad air an cur an comas.",
"notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh",
+ "onboarding.follows.done": "Deiseil",
"onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.",
+ "onboarding.follows.search": "Lorg",
+ "onboarding.follows.title": "Lean daoine airson tòiseachadh",
"onboarding.profile.discoverable": "Bu mhath leam gun gabh a’ phròifil agam a rùrachadh",
"onboarding.profile.discoverable_hint": "Ma chuir thu romhad gun gabh a’ phròifil agad a rùrachadh air Mastodon, faodaidh na postaichean agad nochdadh ann an toraidhean luirg agus treandaichean agus dh’fhaoidte gun dèid a’ phròifil agad a mholadh dhan fheadhainn aig a bheil ùidhean coltach ri d’ ùidhean-sa.",
"onboarding.profile.display_name": "Ainm-taisbeanaidh",
@@ -632,6 +725,7 @@
"poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd",
"privacy.change": "Cuir gleus air prìobhaideachd a’ phuist",
"privacy.direct.long": "A h-uile duine air a bheil iomradh sa phost",
+ "privacy.direct.short": "Iomradh prìobhaideach",
"privacy.private.long": "An luchd-leantainn agad a-mhàin",
"privacy.private.short": "Luchd-leantainn",
"privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon",
@@ -643,6 +737,8 @@
"privacy_policy.title": "Poileasaidh prìobhaideachd",
"recommended": "Molta",
"refresh": "Ath-nuadhaich",
+ "regeneration_indicator.please_stand_by": "Fuirich ort.",
+ "regeneration_indicator.preparing_your_home_feed": "Ag ullachadh do dhachaighe…",
"relative_time.days": "{number}l",
"relative_time.full.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} air ais",
"relative_time.full.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}} air ais",
@@ -726,8 +822,11 @@
"search_results.accounts": "Pròifilean",
"search_results.all": "Na h-uile",
"search_results.hashtags": "Tagaichean hais",
+ "search_results.no_results": "Gun toradh.",
+ "search_results.no_search_yet": "Feuch an lorg thu postaichean, pròifilean no tagaichean hais.",
"search_results.see_all": "Seall na h-uile",
"search_results.statuses": "Postaichean",
+ "search_results.title": "Lorg “{q}”",
"server_banner.about_active_users": "Daoine a chleachd am frithealaiche seo rè an 30 latha mu dheireadh (Cleachdaichean gnìomhach gach mìos)",
"server_banner.active_users": "cleachdaichean gnìomhach",
"server_banner.administered_by": "Rianachd le:",
@@ -770,7 +869,13 @@
"status.mute_conversation": "Mùch an còmhradh",
"status.open": "Leudaich am post seo",
"status.pin": "Prìnich ris a’ phròifil",
- "status.pinned": "Post prìnichte",
+ "status.quote_error.filtered": "Falaichte le criathrag a th’ agad",
+ "status.quote_error.not_found": "Chan urrainn dhuinn am post seo a shealltainn.",
+ "status.quote_error.pending_approval": "Tha am post seo a’ feitheamh air aontachadh leis an ùghdar tùsail.",
+ "status.quote_error.rejected": "Chan urrainn dhuinn am post seo a shealltainn air sgàth ’s nach ceadaich an t-ùghdar tùsail aige gun dèid a luaidh.",
+ "status.quote_error.removed": "Chaidh am post seo a thoirt air falbh le ùghdar.",
+ "status.quote_error.unauthorized": "Chan urrainn dhuinn am post seo a shealltainn air sgàth ’s nach eil cead agad fhaicinn.",
+ "status.quote_post_author": "Post le {name}",
"status.read_more": "Leugh an còrr",
"status.reblog": "Brosnaich",
"status.reblog_private": "Brosnaich leis an t-so-fhaicsinneachd tùsail",
@@ -779,6 +884,7 @@
"status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.",
"status.redraft": "Sguab às ⁊ dèan dreachd ùr",
"status.remove_bookmark": "Thoir an comharra-lìn air falbh",
+ "status.remove_favourite": "Thoir air falbh o na h-annsachdan",
"status.replied_in_thread": "Freagairt do shnàithlean",
"status.replied_to": "Air {name} fhreagairt",
"status.reply": "Freagair",
@@ -800,6 +906,9 @@
"subscribed_languages.target": "Atharraich fo-sgrìobhadh nan cànan airson {target}",
"tabs_bar.home": "Dachaigh",
"tabs_bar.notifications": "Brathan",
+ "terms_of_service.effective_as_of": "Èifeachdach on {date}",
+ "terms_of_service.title": "Teirmichean na seirbheise",
+ "terms_of_service.upcoming_changes_on": "Tha atharraichean ri thighinn air {date}",
"time_remaining.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} air fhàgail",
"time_remaining.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}} air fhàgail",
"time_remaining.minutes": "{number, plural, one {# mhionaid} two {# mhionaid} few {# mionaidean} other {# mionaid}} air fhàgail",
@@ -830,6 +939,12 @@
"video.expand": "Leudaich a’ video",
"video.fullscreen": "Làn-sgrìn",
"video.hide": "Falaich a’ video",
+ "video.mute": "Mùch",
"video.pause": "Cuir ’na stad",
- "video.play": "Cluich"
+ "video.play": "Cluich",
+ "video.skip_backward": "Geàrr leum air ais",
+ "video.skip_forward": "Geàrr leum air adhart",
+ "video.unmute": "Dì-mhùch",
+ "video.volume_down": "Lùghdaich an fhuaim",
+ "video.volume_up": "Cuir an fhuaim an àirde"
}
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 50dc2437c6..6a70c8b750 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidores suxeitos a moderación",
"about.contact": "Contacto:",
+ "about.default_locale": "Por defecto",
"about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo non indicado",
"about.domain_blocks.preamble": "Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitado",
"about.domain_blocks.suspended.explanation": "Non se procesarán, almacenarán nin intercambiarán datos con este servidor, o que fai imposible calquera interacción ou comunicación coas usuarias deste servidor.",
"about.domain_blocks.suspended.title": "Suspendido",
+ "about.language_label": "Idioma",
"about.not_available": "Esta información non está dispoñible neste servidor.",
"about.powered_by": "Comunicación social descentralizada grazas a {mastodon}",
"about.rules": "Regras do servidor",
@@ -19,17 +21,21 @@
"account.block_domain": "Agochar todo de {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueada",
+ "account.blocking": "Bloqueos",
"account.cancel_follow_request": "Desbotar a solicitude de seguimento",
"account.copy": "Copiar ligazón ao perfil",
"account.direct": "Mencionar de xeito privado a @{name}",
"account.disable_notifications": "Deixar de notificarme cando @{name} publica",
- "account.domain_blocked": "Dominio agochado",
+ "account.domain_blocking": "Bloqueo do dominio",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Noficarme cando @{name} publique",
"account.endorse": "Amosar no perfil",
+ "account.familiar_followers_many": "Seguida por {name1}, {name2}, e {othersCount, plural, one {outra conta que coñeces} other {outras # contas que coñeces}}",
+ "account.familiar_followers_one": "Seguida por {name1}",
+ "account.familiar_followers_two": "Seguida por {name1} e {name2}",
"account.featured": "Destacado",
+ "account.featured.accounts": "Perfís",
"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_never": "Sen publicacións",
"account.follow": "Seguir",
@@ -37,9 +43,11 @@
"account.followers": "Seguidoras",
"account.followers.empty": "Aínda ninguén segue esta usuaria.",
"account.followers_counter": "{count, plural, one {{counter} seguidora} other {{counter} seguidoras}}",
+ "account.followers_you_know_counter": "{counter} que coñeces",
"account.following": "Seguindo",
"account.following_counter": "{count, plural, one {{counter} seguimento} other {{counter} seguimentos}}",
"account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
+ "account.follows_you": "Séguete",
"account.go_to_profile": "Ir ao perfil",
"account.hide_reblogs": "Agochar promocións de @{name}",
"account.in_memoriam": "Lembranzas.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silenciar notificacións",
"account.mute_short": "Acalar",
"account.muted": "Acalada",
- "account.mutual": "Mutuo",
+ "account.muting": "Silenciamento",
+ "account.mutual": "Seguimento mútuo",
"account.no_bio": "Sen descrición.",
"account.open_original_page": "Abrir páxina orixinal",
"account.posts": "Publicacións",
"account.posts_with_replies": "Publicacións e respostas",
+ "account.remove_from_followers": "Retirar a {name} das seguidoras",
"account.report": "Informar sobre @{name}",
"account.requested": "Agardando aprobación. Preme para desbotar a solicitude",
"account.requested_follow": "{name} solicitou seguirte",
+ "account.requests_to_follow_you": "Solicita seguirte",
"account.share": "Compartir o perfil de @{name}",
"account.show_reblogs": "Amosar compartidos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Eliminar e reescribir",
"confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.",
"confirmations.redraft.title": "Eliminar e reescribir a publicación?",
+ "confirmations.remove_from_followers.confirm": "Quitar seguidora",
+ "confirmations.remove_from_followers.message": "{name} vai deixar de seguirte. É isto o que queres?",
+ "confirmations.remove_from_followers.title": "Quitar seguidora?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
"confirmations.reply.title": "Editar a publicación?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Resultados da procura",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viaxes e Lugares",
- "empty_column.account_featured": "A lista está baleira",
+ "empty_column.account_featured.me": "Aínda non destacaches nada. Sabías que podes facer destacar no teu perfil os cancelos que máis usas, incluso as contas das túas amizades?",
+ "empty_column.account_featured.other": "{acct} aínda non escolleu nada para destacar. Sabías que podes facer destacatar no teu perfil os cancelos que máis usas, incluso os perfís das túas amizades?",
+ "empty_column.account_featured_other.unknown": "Esta conta aínda non destacou nada.",
"empty_column.account_hides_collections": "A usuaria decideu non facer pública esta información",
"empty_column.account_suspended": "Conta suspendida",
"empty_column.account_timeline": "Non hai publicacións aquí!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Novas",
"explore.trending_statuses": "Publicacións",
"explore.trending_tags": "Cancelos",
+ "featured_carousel.header": "{count, plural, one {Publicación fixada} other {Publicacións fixadas}}",
+ "featured_carousel.next": "Seguinte",
+ "featured_carousel.post": "Publicación",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro non se aplica ao contexto no que accedeches a esta publicación. Se queres que a publicación se filtre nese contexto tamén, terás que editar o filtro.",
"filter_modal.added.context_mismatch_title": "Non concorda o contexto!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro caducou, terás que cambiar a data de caducidade para que se aplique.",
@@ -377,7 +398,7 @@
"footer.privacy_policy": "Política de privacidade",
"footer.source_code": "Ver código fonte",
"footer.status": "Estado",
- "footer.terms_of_service": "Termos do servizo",
+ "footer.terms_of_service": "Condicións do servizo",
"generic.saved": "Gardado",
"getting_started.heading": "Primeiros pasos",
"hashtag.admin_moderation": "Abrir interface de moderación para ##{name}",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicacións}} hoxe",
+ "hashtag.feature": "Destacar no perfil",
"hashtag.follow": "Seguir cancelo",
"hashtag.mute": "Acalar a #{hashtag}",
+ "hashtag.unfeature": "Non destacar no perfil",
"hashtag.unfollow": "Deixar de seguir cancelo",
"hashtags.and_other": "…e {count, plural, one {}other {# máis}}",
"hints.profiles.followers_may_be_missing": "Poderían faltar seguidoras deste perfil.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Mira máis publicacións en {domain}",
"hints.threads.replies_may_be_missing": "Poderían faltar respostas desde outros servidores.",
"hints.threads.see_more": "Mira máis respostas en {domain}",
+ "home.column_settings.show_quotes": "Mostrar citas",
"home.column_settings.show_reblogs": "Amosar compartidos",
"home.column_settings.show_replies": "Amosar respostas",
"home.hide_announcements": "Agochar anuncios",
@@ -502,7 +526,6 @@
"lists.exclusive": "Ocultar membros no Inicio",
"lists.exclusive_hint": "Se alguén está nesta lista non aparerá na cronoloxía de Inicio para evitar duplicidades das publicacións.",
"lists.find_users_to_add": "Buscar persoas que engadir",
- "lists.list_members": "Membros da lista",
"lists.list_members_count": "{count, plural, one {# membro} other {# membros}}",
"lists.list_name": "Nome da lista",
"lists.new_list_name": "Novo nome da lista",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Silenciar conversa",
"status.open": "Estender esta publicación",
"status.pin": "Fixar no perfil",
- "status.pinned": "Publicación fixada",
+ "status.quote_error.filtered": "Oculto debido a un dos teus filtros",
+ "status.quote_error.not_found": "Non se pode mostrar a publicación.",
+ "status.quote_error.pending_approval": "A publicación está pendente da aprobación pola autora orixinal.",
+ "status.quote_error.rejected": "Non se pode mostrar esta publicación xa que a autora orixinal non permite que se cite.",
+ "status.quote_error.removed": "Publicación eliminada pola autora.",
+ "status.quote_error.unauthorized": "Non se pode mostrar esta publicación porque non tes permiso para vela.",
+ "status.quote_post_author": "Publicación de {name}",
"status.read_more": "Ler máis",
"status.reblog": "Promover",
"status.reblog_private": "Compartir coa audiencia orixinal",
@@ -880,7 +909,7 @@
"tabs_bar.home": "Inicio",
"tabs_bar.notifications": "Notificacións",
"terms_of_service.effective_as_of": "Con efecto desde o {date}",
- "terms_of_service.title": "Termos do Servizo",
+ "terms_of_service.title": "Condicións do Servizo",
"terms_of_service.upcoming_changes_on": "Cambios por vir o {date}",
"time_remaining.days": "Remata en {number, plural, one {# día} other {# días}}",
"time_remaining.hours": "Remata en {number, plural, one {# hora} other {# horas}}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index d1a2c014a5..c3b549033a 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -1,6 +1,7 @@
{
"about.blocks": "שרתים תחת פיקוח תוכן",
"about.contact": "יצירת קשר:",
+ "about.default_locale": "ברירת המחדל",
"about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "הסיבה אינה זמינה",
"about.domain_blocks.preamble": "ככלל מסטודון מאפשרת לך לצפות בתוכן ולתקשר עם משתמשים מכל שרת בפדיברס. אלו הם היוצאים מן הכלל שהוגדרו עבור השרת המסוים הזה.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "מוגבלים",
"about.domain_blocks.suspended.explanation": "שום מידע משרת זה לא יעובד, יישמר או יוחלף, מה שהופך כל תקשורת עם משתמשים משרת זה לבלתי אפשרית.",
"about.domain_blocks.suspended.title": "מושעים",
+ "about.language_label": "שפה",
"about.not_available": "המידע אינו זמין על שרת זה.",
"about.powered_by": "רשת חברתית מבוזרת המופעלת על ידי {mastodon}",
"about.rules": "כללי השרת",
@@ -18,18 +20,22 @@
"account.block": "חסמי את @{name}",
"account.block_domain": "חסמו את קהילת {domain}",
"account.block_short": "לחסום",
- "account.blocked": "לחסום",
+ "account.blocked": "חסום",
+ "account.blocking": "רשימת החשבונות החסומים",
"account.cancel_follow_request": "משיכת בקשת מעקב",
"account.copy": "להעתיק קישור לפרופיל",
"account.direct": "הודעה פרטית אל @{name}",
"account.disable_notifications": "הפסק לשלוח לי התראות כש@{name} מפרסמים",
- "account.domain_blocked": "הדומיין חסום",
+ "account.domain_blocking": "רשימת השרתים החסומים",
"account.edit_profile": "עריכת פרופיל",
"account.enable_notifications": "שלח לי התראות כש@{name} מפרסם",
"account.endorse": "קדם את החשבון בפרופיל",
+ "account.familiar_followers_many": "החשבון נעקב על ידי {name1}, {name2} ועוד {othersCount, plural,one {אחד נוסף שמוכר לך}other {# נוספים שמוכרים לך}}",
+ "account.familiar_followers_one": "החשבון נעקב על ידי {name1}",
+ "account.familiar_followers_two": "החשבון נעקב על ידי {name1} ו־{name2}",
"account.featured": "מומלץ",
+ "account.featured.accounts": "פרופילים",
"account.featured.hashtags": "תגיות",
- "account.featured.posts": "הודעות",
"account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}",
"account.featured_tags.last_status_never": "אין חצרוצים",
"account.follow": "לעקוב",
@@ -37,9 +43,11 @@
"account.followers": "עוקבים",
"account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
"account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
+ "account.followers_you_know_counter": "{counter} שמוכרים לך",
"account.following": "נעקבים",
"account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {counter}}}",
"account.follows.empty": "משתמש זה עדיין לא עוקב אחרי אף אחד.",
+ "account.follows_you": "במעקב אחריך",
"account.go_to_profile": "מעבר לפרופיל",
"account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
"account.in_memoriam": "פרופיל זכרון.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "השתקת התראות",
"account.mute_short": "השתקה",
"account.muted": "מושתק",
- "account.mutual": "הדדיים",
+ "account.muting": "רשימת החשבונות המושתקים",
+ "account.mutual": "אתם עוקביםות הדדית",
"account.no_bio": "לא סופק תיאור.",
"account.open_original_page": "לפתיחת העמוד המקורי",
"account.posts": "פוסטים",
"account.posts_with_replies": "הודעות ותגובות",
+ "account.remove_from_followers": "הסרת {name} מעוקבי",
"account.report": "דווח על @{name}",
"account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב",
"account.requested_follow": "{name} ביקשו לעקוב אחריך",
+ "account.requests_to_follow_you": "ביקשו לעקוב אחריך",
"account.share": "שתף את הפרופיל של @{name}",
"account.show_reblogs": "הצג הדהודים מאת @{name}",
"account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "מחיקה ועריכה מחדש",
"confirmations.redraft.message": "למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.",
"confirmations.redraft.title": "מחיקה ועריכה מחדש?",
+ "confirmations.remove_from_followers.confirm": "הסרת עוקב",
+ "confirmations.remove_from_followers.message": "{name} יוסר/תוסר ממעקב אחריך. האם להמשיך?",
+ "confirmations.remove_from_followers.title": "להסיר עוקב/עוקבת?",
"confirmations.reply.confirm": "תגובה",
"confirmations.reply.message": "תגובה עכשיו תמחק את ההודעה שכבר התחלת לכתוב. להמשיך?",
"confirmations.reply.title": "לבצע החלפת תוכן?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "תוצאות חיפוש",
"emoji_button.symbols": "סמלים",
"emoji_button.travel": "טיולים ואתרים",
- "empty_column.account_featured": "הרשימה ריקה",
+ "empty_column.account_featured.me": "עוד לא קידמת תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?",
+ "empty_column.account_featured.other": "{acct} עוד לא קידם תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?",
+ "empty_column.account_featured_other.unknown": "חשבון זה עוד לא קידם תכנים.",
"empty_column.account_hides_collections": "המשתמש.ת בחר.ה להסתיר מידע זה",
"empty_column.account_suspended": "חשבון מושעה",
"empty_column.account_timeline": "אין עדיין אף הודעה!",
@@ -329,6 +345,11 @@
"explore.trending_links": "חדשות",
"explore.trending_statuses": "הודעות",
"explore.trending_tags": "תגיות",
+ "featured_carousel.header": "{count, plural, one {הודעה אחת נעוצה} two {הודעותיים נעוצות} many {הודעות נעוצות} other {הודעות נעוצות}}",
+ "featured_carousel.next": "הבא",
+ "featured_carousel.post": "הודעה",
+ "featured_carousel.previous": "הקודם",
+ "featured_carousel.slide": "{index} מתוך {total}",
"filter_modal.added.context_mismatch_explanation": "קטגוריית המסנן הזאת לא חלה על ההקשר שממנו הגעת אל ההודעה הזו. אם תרצה/י שההודעה תסונן גם בהקשר זה, תצטרך/י לערוך את הסנן.",
"filter_modal.added.context_mismatch_title": "אין התאמה להקשר!",
"filter_modal.added.expired_explanation": "פג תוקפה של קטגוריית הסינון הזו, יש צורך לשנות את תאריך התפוגה כדי שהסינון יוחל.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{counter} משתתפיםות}}",
"hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
"hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}} היום",
+ "hashtag.feature": "מובלט בפרופיל",
"hashtag.follow": "לעקוב אחרי תגית",
"hashtag.mute": "להשתיק את #{hashtag}",
+ "hashtag.unfeature": "לא להבליט בפרופיל",
"hashtag.unfollow": "להפסיק לעקוב אחרי תגית",
"hashtags.and_other": "…{count, plural,other {ועוד #}}",
"hints.profiles.followers_may_be_missing": "יתכן כי עוקבים של פרופיל זה חסרים.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "צפיה בעוד פרסומים בשרת {domain}",
"hints.threads.replies_may_be_missing": "תגובות משרתים אחרים עלולות להיות חסרות.",
"hints.threads.see_more": "צפיה בעוד תגובות משרת {domain}",
+ "home.column_settings.show_quotes": "הצגת ציטוטים",
"home.column_settings.show_reblogs": "הצגת הדהודים",
"home.column_settings.show_replies": "הצגת תגובות",
"home.hide_announcements": "הסתר הכרזות",
@@ -502,7 +526,6 @@
"lists.exclusive": "הסתרת החברים בפיד הבית",
"lists.exclusive_hint": "אם שם כלשהו ברשימה זו, נסתיר אותי בפיד הבית כדי למנוע כפילות.",
"lists.find_users_to_add": "חיפוש משתמשים להוספה",
- "lists.list_members": "פירוט חברי הרשימה",
"lists.list_members_count": "{count, plural, one {חבר רשימה אחד} other {# חברי רשימה}}",
"lists.list_name": "שם הרשימה",
"lists.new_list_name": "שם רשימה חדשה",
@@ -848,7 +871,13 @@
"status.mute_conversation": "השתקת שיחה",
"status.open": "הרחבת הודעה זו",
"status.pin": "הצמדה לפרופיל שלי",
- "status.pinned": "חצרוץ נעוץ",
+ "status.quote_error.filtered": "מוסתר בהתאם לסננים שלך",
+ "status.quote_error.not_found": "לא ניתן להציג הודעה זו.",
+ "status.quote_error.pending_approval": "הודעה זו מחכה לאישור מידי היוצר המקורי.",
+ "status.quote_error.rejected": "לא ניתן להציג הודעה זו שכן המחבר.ת המקוריים לא הרשו לצטט אותה.",
+ "status.quote_error.removed": "הודעה זו הוסרה על ידי השולחים המקוריים.",
+ "status.quote_error.unauthorized": "הודעה זו לא מוצגת כיוון שאין לך רשות לראותה.",
+ "status.quote_post_author": "פרסום מאת {name}",
"status.read_more": "לקרוא עוד",
"status.reblog": "הדהוד",
"status.reblog_private": "להדהד ברמת הנראות המקורית",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index a3eec9544c..bd5042a44c 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -22,7 +22,6 @@
"account.copy": "प्रोफाइल पर लिंक कॉपी करें",
"account.direct": "निजि तरीके से उल्लेख करे @{name}",
"account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो",
- "account.domain_blocked": "छिपा हुआ डोमेन",
"account.edit_profile": "प्रोफ़ाइल संपादित करें",
"account.enable_notifications": "जब @{name} पोस्ट मौजूद हो सूचित करें",
"account.endorse": "प्रोफ़ाइल पर दिखाए",
@@ -48,7 +47,6 @@
"account.mute_notifications_short": "सूचनाओ को शांत करे",
"account.mute_short": "शांत करे",
"account.muted": "म्यूट है",
- "account.mutual": "आपसी",
"account.no_bio": "कोई विवरण नहि दिया गया हे",
"account.open_original_page": "ओरिजिनल पोस्ट खोलें",
"account.posts": "टूट्स",
@@ -465,7 +463,6 @@
"status.mute_conversation": "इस वार्तालाप को म्यूट करें",
"status.open": "Expand this status",
"status.pin": "प्रोफ़ाइल पर पिन करें",
- "status.pinned": "Pinned toot",
"status.read_more": "और पढ़ें",
"status.reblog": "बूस्ट",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 38807b28b2..531aba689b 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -22,7 +22,6 @@
"account.copy": "Kopiraj vezu u profil",
"account.direct": "Privatno spomeni @{name}",
"account.disable_notifications": "Nemoj me obavjestiti kada @{name} napravi objavu",
- "account.domain_blocked": "Domena je blokirana",
"account.edit_profile": "Uredi profil",
"account.enable_notifications": "Obavjesti me kada @{name} napravi objavu",
"account.endorse": "Istakni na profilu",
@@ -47,7 +46,6 @@
"account.mute_notifications_short": "Utišaj obavijesti",
"account.mute_short": "Utišaj",
"account.muted": "Utišano",
- "account.mutual": "Uzajamno",
"account.no_bio": "Nije dan opis.",
"account.open_original_page": "Otvori originalnu stranicu",
"account.posts": "Objave",
@@ -435,7 +433,6 @@
"status.mute_conversation": "Utišaj razgovor",
"status.open": "Proširi ovaj toot",
"status.pin": "Prikvači na profil",
- "status.pinned": "Pinned toot",
"status.read_more": "Pročitajte više",
"status.reblog": "Boostaj",
"status.reblog_private": "Boostaj s izvornom vidljivošću",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index b311dffa72..f7f2fce2a0 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderált kiszolgálók",
"about.contact": "Kapcsolat:",
+ "about.default_locale": "Alapértelmezett",
"about.disclaimer": "A Mastodon ingyenes, nyílt forráskódú szoftver, a Mastodon gGmbH védjegye.",
"about.domain_blocks.no_reason_available": "Nem áll rendelkezésre indoklás",
"about.domain_blocks.preamble": "A Mastodon általában mindenféle tartalomcserét és interakciót lehetővé tesz bármelyik másik kiszolgálóval a födiverzumban. Ezek azok a kivételek, amelyek a mi kiszolgálónkon érvényben vannak.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Korlátozott",
"about.domain_blocks.suspended.explanation": "A kiszolgáló adatai nem lesznek feldolgozva, tárolva vagy megosztva, lehetetlenné téve mindennemű interakciót és kommunikációt a kiszolgáló felhasználóival.",
"about.domain_blocks.suspended.title": "Felfüggesztett",
+ "about.language_label": "Nyelv",
"about.not_available": "Ez az információ nem lett közzétéve ezen a kiszolgálón.",
"about.powered_by": "Decentralizált közösségi média a {mastodon} segítségével",
"about.rules": "Kiszolgáló szabályai",
@@ -19,17 +21,21 @@
"account.block_domain": "Domain letiltása: {domain}",
"account.block_short": "Letiltás",
"account.blocked": "Letiltva",
+ "account.blocking": "Tiltás",
"account.cancel_follow_request": "Követési kérés visszavonása",
"account.copy": "Hivatkozás másolása a profilba",
"account.direct": "@{name} személyes említése",
"account.disable_notifications": "Ne figyelmeztessen, ha @{name} bejegyzést tesz közzé",
- "account.domain_blocked": "Letiltott domain",
+ "account.domain_blocking": "Domain tiltás",
"account.edit_profile": "Profil szerkesztése",
"account.enable_notifications": "Figyelmeztessen, ha @{name} bejegyzést tesz közzé",
"account.endorse": "Kiemelés a profilodon",
+ "account.familiar_followers_many": "{name1}, {name2} és még {othersCount, plural, one {egy valaki} other {# valaki}}, akit ismersz",
+ "account.familiar_followers_one": "{name1} követi",
+ "account.familiar_followers_two": "{name1} és {name2} követi",
"account.featured": "Kiemelt",
+ "account.featured.accounts": "Profilok",
"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_never": "Nincs bejegyzés",
"account.follow": "Követés",
@@ -37,9 +43,11 @@
"account.followers": "Követő",
"account.followers.empty": "Ezt a felhasználót még senki sem követi.",
"account.followers_counter": "{count, plural, one {{counter} követő} other {{counter} követő}}",
+ "account.followers_you_know_counter": "{counter} ismerős",
"account.following": "Követve",
"account.following_counter": "{count, plural, one {{counter} követett} other {{counter} követett}}",
"account.follows.empty": "Ez a felhasználó még senkit sem követ.",
+ "account.follows_you": "Követ téged",
"account.go_to_profile": "Ugrás a profilhoz",
"account.hide_reblogs": "@{name} megtolásainak elrejtése",
"account.in_memoriam": "Emlékünkben.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Értesítések némítása",
"account.mute_short": "Némítás",
"account.muted": "Némítva",
- "account.mutual": "Kölcsönös",
+ "account.muting": "Némítás",
+ "account.mutual": "Követitek egymást",
"account.no_bio": "Leírás nincs megadva.",
"account.open_original_page": "Eredeti oldal megnyitása",
"account.posts": "Bejegyzések",
"account.posts_with_replies": "Bejegyzések és válaszok",
+ "account.remove_from_followers": "{name} eltávolítása a követők közül",
"account.report": "@{name} jelentése",
"account.requested": "Jóváhagyásra vár. Kattints a követési kérés visszavonásához",
"account.requested_follow": "{name} kérte, hogy követhessen",
+ "account.requests_to_follow_you": "Kéri, hogy követhessen",
"account.share": "@{name} profiljának megosztása",
"account.show_reblogs": "@{name} megtolásainak mutatása",
"account.statuses_counter": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Törlés és újraírás",
"confirmations.redraft.message": "Biztos, hogy ezt a bejegyzést szeretnéd törölni és újraírni? Minden megtolást és kedvencnek jelölést elvesztesz, az eredetire adott válaszok pedig elárvulnak.",
"confirmations.redraft.title": "Törlöd és újraírod a bejegyzést?",
+ "confirmations.remove_from_followers.confirm": "Követő eltávolítása",
+ "confirmations.remove_from_followers.message": "{name} követ téged. Biztos, hogy folytatod?",
+ "confirmations.remove_from_followers.title": "Követő eltávolítása?",
"confirmations.reply.confirm": "Válasz",
"confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?",
"confirmations.reply.title": "Felülírod a bejegyzést?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Keresési találatok",
"emoji_button.symbols": "Szimbólumok",
"emoji_button.travel": "Utazás és helyek",
- "empty_column.account_featured": "Ez a lista üres",
+ "empty_column.account_featured.me": "Még semmit sem emeltél ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?",
+ "empty_column.account_featured.other": "{acct} még semmit sem emelt ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?",
+ "empty_column.account_featured_other.unknown": "Ez a fiók még semmit sem emelt ki.",
"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_timeline": "Itt nincs bejegyzés!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Hírek",
"explore.trending_statuses": "Bejegyzések",
"explore.trending_tags": "Hashtagek",
+ "featured_carousel.header": "{count, plural, one {Kiemelt bejegyzés} other {Kiemelt bejegyzések}}",
+ "featured_carousel.next": "Következő",
+ "featured_carousel.post": "Bejegyzés",
+ "featured_carousel.previous": "Előző",
+ "featured_carousel.slide": "{index} / {total}",
"filter_modal.added.context_mismatch_explanation": "Ez a szűrőkategória nem érvényes abban a környezetben, amelyből elérted ezt a bejegyzést. Ha ebben a környezetben is szűrni szeretnéd a bejegyzést, akkor szerkesztened kell a szűrőt.",
"filter_modal.added.context_mismatch_title": "Környezeti eltérés.",
"filter_modal.added.expired_explanation": "Ez a szűrőkategória elévült, a használatához módosítanod kell az elévülési dátumot.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} résztvevő} other {{counter} résztvevő}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}} ma",
+ "hashtag.feature": "Kiemelés a profilodon",
"hashtag.follow": "Hashtag követése",
"hashtag.mute": "#{hashtag} némítása",
+ "hashtag.unfeature": "Ne legyen kiemelve a profilodon",
"hashtag.unfollow": "Hashtag követésének megszüntetése",
"hashtags.and_other": "…és {count, plural, other {# további}}",
"hints.profiles.followers_may_be_missing": "A profil követői lehet, hogy hiányoznak.",
@@ -502,7 +525,6 @@
"lists.exclusive": "Tagok elrejtése a kezdőlapon",
"lists.exclusive_hint": "Ha valaki szerepel ezen a listán, el lesz rejtve a kezdőlapod hírfolyamán, hogy ne lásd kétszer a bejegyzéseit.",
"lists.find_users_to_add": "Hozzáadandó felhasználók keresése",
- "lists.list_members": "Tagok listázása",
"lists.list_members_count": "{count, plural, one {# tag} other {# tag}}",
"lists.list_name": "Lista neve",
"lists.new_list_name": "Új lista neve",
@@ -848,7 +870,13 @@
"status.mute_conversation": "Beszélgetés némítása",
"status.open": "Bejegyzés kibontása",
"status.pin": "Kitűzés a profilodra",
- "status.pinned": "Kitűzött bejegyzés",
+ "status.quote_error.filtered": "A szűrőid miatt rejtett",
+ "status.quote_error.not_found": "Ez a bejegyzés nem jeleníthető meg.",
+ "status.quote_error.pending_approval": "Ez a bejegyzés az eredeti szerző jóváhagyására vár.",
+ "status.quote_error.rejected": "Ez a bejegyzés nem jeleníthető meg, mert az eredeti szerzője nem engedélyezi az idézését.",
+ "status.quote_error.removed": "Ezt a bejegyzés eltávolította a szerzője.",
+ "status.quote_error.unauthorized": "Ez a bejegyzés nem jeleníthető meg, mert nem jogosult a megtekintésére.",
+ "status.quote_post_author": "Szerző: {name}",
"status.read_more": "Bővebben",
"status.reblog": "Megtolás",
"status.reblog_private": "Megtolás az eredeti közönségnek",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 9882d575b2..c7c68ff5b6 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -17,7 +17,6 @@
"account.cancel_follow_request": "Withdraw follow request",
"account.direct": "Մասնաւոր յիշատակում @{name}",
"account.disable_notifications": "Ծանուցումները անջատել @{name} գրառումների համար",
- "account.domain_blocked": "Տիրոյթը արգելափակուած է",
"account.edit_profile": "Խմբագրել հաշիւը",
"account.enable_notifications": "Ծանուցել ինձ @{name} գրառումների մասին",
"account.endorse": "Ցուցադրել անձնական էջում",
@@ -425,7 +424,6 @@
"status.mute_conversation": "Լռեցնել խօսակցութիւնը",
"status.open": "Ընդարձակել այս գրառումը",
"status.pin": "Ամրացնել անձնական էջում",
- "status.pinned": "Ամրացուած գրառում",
"status.read_more": "Կարդալ աւելին",
"status.reblog": "Տարածել",
"status.reblog_private": "Տարածել սեփական լսարանին",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 7f4f66796e..3fdc33d520 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -19,14 +19,21 @@
"account.block_domain": "Blocar dominio {domain}",
"account.block_short": "Blocar",
"account.blocked": "Blocate",
+ "account.blocking": "Blocate",
"account.cancel_follow_request": "Cancellar sequimento",
"account.copy": "Copiar ligamine a profilo",
"account.direct": "Mentionar privatemente @{name}",
"account.disable_notifications": "Non plus notificar me quando @{name} publica",
- "account.domain_blocked": "Dominio blocate",
+ "account.domain_blocking": "Dominio blocate",
"account.edit_profile": "Modificar profilo",
"account.enable_notifications": "Notificar me quando @{name} publica",
"account.endorse": "Evidentiar sur le profilo",
+ "account.familiar_followers_many": "Sequite per {name1}, {name2}, e {othersCount, plural, one {un altere que tu cognosce} other {# alteres que tu cognosce}}",
+ "account.familiar_followers_one": "Sequite per {name1}",
+ "account.familiar_followers_two": "Sequite per {name1} e {name2}",
+ "account.featured": "In evidentia",
+ "account.featured.accounts": "Profilos",
+ "account.featured.hashtags": "Hashtags",
"account.featured_tags.last_status_at": "Ultime message publicate le {date}",
"account.featured_tags.last_status_never": "Necun message",
"account.follow": "Sequer",
@@ -37,6 +44,7 @@
"account.following": "Sequente",
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
"account.follows.empty": "Iste usator non seque ancora alcuno.",
+ "account.follows_you": "Te seque",
"account.go_to_profile": "Vader al profilo",
"account.hide_reblogs": "Celar impulsos de @{name}",
"account.in_memoriam": "In memoriam.",
@@ -51,19 +59,23 @@
"account.mute_notifications_short": "Silentiar le notificationes",
"account.mute_short": "Silentiar",
"account.muted": "Silentiate",
- "account.mutual": "Mutue",
+ "account.muting": "Silentiate",
+ "account.mutual": "Sequimento mutue",
"account.no_bio": "Nulle description fornite.",
"account.open_original_page": "Aperir le pagina original",
"account.posts": "Messages",
"account.posts_with_replies": "Messages e responsas",
+ "account.remove_from_followers": "Remover {name} del sequitores",
"account.report": "Reportar @{name}",
"account.requested": "Attendente le approbation. Clicca pro cancellar le requesta de sequer",
"account.requested_follow": "{name} ha requestate de sequer te",
+ "account.requests_to_follow_you": "Requestas de sequer te",
"account.share": "Compartir profilo de @{name}",
"account.show_reblogs": "Monstrar impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
"account.unblock": "Disblocar @{name}",
"account.unblock_domain": "Disblocar dominio {domain}",
+ "account.unblock_domain_short": "Disblocar",
"account.unblock_short": "Disblocar",
"account.unendorse": "Non evidentiar sur le profilo",
"account.unfollow": "Non plus sequer",
@@ -225,6 +237,9 @@
"confirmations.redraft.confirm": "Deler e rescriber",
"confirmations.redraft.message": "Es tu secur de voler deler iste message e rescriber lo? Le favorites e le impulsos essera perdite, e le responsas al message original essera orphanate.",
"confirmations.redraft.title": "Deler e rescriber le message?",
+ "confirmations.remove_from_followers.confirm": "Remover sequitor",
+ "confirmations.remove_from_followers.message": "{name} non plus te sequera. Es tu secur de voler continuar?",
+ "confirmations.remove_from_followers.title": "Remover sequitor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Si tu responde ora, le message in curso de composition essera perdite. Es tu secur de voler continuar?",
"confirmations.reply.title": "Superscriber le message?",
@@ -292,6 +307,7 @@
"emoji_button.search_results": "Resultatos de recerca",
"emoji_button.symbols": "Symbolos",
"emoji_button.travel": "Viages e locos",
+ "empty_column.account_featured_other.unknown": "Iste conto non ha ancora mittite alcun cosa in evidentia.",
"empty_column.account_hides_collections": "Le usator non ha rendite iste information disponibile",
"empty_column.account_suspended": "Conto suspendite",
"empty_column.account_timeline": "Nulle messages hic!",
@@ -388,7 +404,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} hodie",
+ "hashtag.feature": "Evidentiar sur le profilo",
"hashtag.follow": "Sequer hashtag",
+ "hashtag.mute": "Silentiar #{hashtag}",
+ "hashtag.unfeature": "Non evidentiar sur le profilo",
"hashtag.unfollow": "Non sequer plus le hashtag",
"hashtags.and_other": "…e {count, plural, one {un altere} other {# alteres}}",
"hints.profiles.followers_may_be_missing": "Le sequitores de iste profilo pote mancar.",
@@ -494,7 +513,6 @@
"lists.exclusive": "Celar memberos in Initio",
"lists.exclusive_hint": "Si alcuno es sur iste lista, celar iste persona in tu fluxo de initio pro evitar de vider su messages duo vices.",
"lists.find_users_to_add": "Trovar usatores a adder",
- "lists.list_members": "Membros del lista",
"lists.list_members_count": "{count, plural, one {# membro} other {# membros}}",
"lists.list_name": "Nomine del lista",
"lists.new_list_name": "Nove nomine de lista",
@@ -840,7 +858,6 @@
"status.mute_conversation": "Silentiar conversation",
"status.open": "Expander iste message",
"status.pin": "Fixar sur profilo",
- "status.pinned": "Message fixate",
"status.read_more": "Leger plus",
"status.reblog": "Impulsar",
"status.reblog_private": "Impulsar con visibilitate original",
@@ -871,6 +888,7 @@
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
"tabs_bar.home": "Initio",
"tabs_bar.notifications": "Notificationes",
+ "terms_of_service.effective_as_of": "In vigor a partir de {date}",
"terms_of_service.title": "Conditiones de servicio",
"time_remaining.days": "{number, plural, one {# die} other {# dies}} restante",
"time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante",
@@ -902,6 +920,11 @@
"video.expand": "Expander video",
"video.fullscreen": "Schermo plen",
"video.hide": "Celar video",
+ "video.mute": "Silentiar",
"video.pause": "Pausa",
- "video.play": "Reproducer"
+ "video.play": "Reproducer",
+ "video.skip_backward": "Saltar a retro",
+ "video.unmute": "Non plus silentiar",
+ "video.volume_down": "Abassar le volumine",
+ "video.volume_up": "Augmentar le volumine"
}
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 102e547d40..6f591dd8a4 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -19,11 +19,12 @@
"account.block_domain": "Blokir domain {domain}",
"account.block_short": "Blokir",
"account.blocked": "Terblokir",
+ "account.blocking": "Memblokir",
"account.cancel_follow_request": "Batalkan permintaan ikut",
"account.copy": "Salin tautan ke profil",
"account.direct": "Sebut secara pribadi @{name}",
"account.disable_notifications": "Berhenti memberitahu saya ketika @{name} memposting",
- "account.domain_blocked": "Domain diblokir",
+ "account.domain_blocking": "Memblokir domain",
"account.edit_profile": "Ubah profil",
"account.enable_notifications": "Beritahu saya saat @{name} memposting",
"account.endorse": "Tampilkan di profil",
@@ -37,6 +38,7 @@
"account.following": "Mengikuti",
"account.following_counter": "{count, plural, other {{counter} following}}",
"account.follows.empty": "Pengguna ini belum mengikuti siapa pun.",
+ "account.follows_you": "Mengikuti Anda",
"account.go_to_profile": "Buka profil",
"account.hide_reblogs": "Sembunyikan boosts dari @{name}",
"account.in_memoriam": "Mengenang.",
@@ -51,7 +53,6 @@
"account.mute_notifications_short": "Senyapkan Notifikasi",
"account.mute_short": "Senyapkan",
"account.muted": "Dibisukan",
- "account.mutual": "Saling ikuti",
"account.no_bio": "Tidak ada deskripsi yang diberikan.",
"account.open_original_page": "Buka halaman asli",
"account.posts": "Kiriman",
@@ -558,7 +559,6 @@
"status.mute_conversation": "Bisukan percakapan",
"status.open": "Tampilkan kiriman ini",
"status.pin": "Sematkan di profil",
- "status.pinned": "Kiriman tersemat",
"status.read_more": "Baca lebih banyak",
"status.reblog": "Boost",
"status.reblog_private": "Boost dengan visibilitas asli",
diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json
index 7cd463727f..bc6f9059ed 100644
--- a/app/javascript/mastodon/locales/ie.json
+++ b/app/javascript/mastodon/locales/ie.json
@@ -22,7 +22,6 @@
"account.copy": "Copiar ligament al profil",
"account.direct": "Privatmen mentionar @{name}",
"account.disable_notifications": "Cessa notificar me quande @{name} posta",
- "account.domain_blocked": "Dominia bloccat",
"account.edit_profile": "Redacter profil",
"account.enable_notifications": "Notificar me quande @{name} posta",
"account.endorse": "Recomandar sur profil",
@@ -48,7 +47,6 @@
"account.mute_notifications_short": "Silentiar notificationes",
"account.mute_short": "Silentiar",
"account.muted": "Silentiat",
- "account.mutual": "Reciproc",
"account.no_bio": "Null descrition providet.",
"account.open_original_page": "Aperter li págine original",
"account.posts": "Postas",
@@ -650,7 +648,6 @@
"status.mute_conversation": "Silentiar conversation",
"status.open": "Expander ti-ci posta",
"status.pin": "Pinglar sur profil",
- "status.pinned": "Pinglat posta",
"status.read_more": "Leer plu",
"status.reblog": "Boostar",
"status.reblog_private": "Boostar con li original visibilitá",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 596ca4c3fe..e8670b01aa 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -23,7 +23,6 @@
"account.copy": "Kopiez ligilo al profilo",
"account.direct": "Private mencionez @{name}",
"account.disable_notifications": "Cesez avizar me kande @{name} postas",
- "account.domain_blocked": "Domain hidden",
"account.edit_profile": "Redaktar profilo",
"account.enable_notifications": "Avizez me kande @{name} postas",
"account.endorse": "Traito di profilo",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Silencigez avizi",
"account.mute_short": "Silencigez",
"account.muted": "Silencigata",
- "account.mutual": "Mutuala",
"account.no_bio": "Deskriptajo ne provizesis.",
"account.open_original_page": "Apertez originala pagino",
"account.posts": "Mesaji",
@@ -494,7 +492,6 @@
"lists.exclusive": "Celar membri sur Hemo",
"lists.exclusive_hint": "Se ulu es en ca listo, celez lu sur vua hemfluo por evitar vidar lua afishi denove.",
"lists.find_users_to_add": "Serchi uzanti por adjuntar",
- "lists.list_members": "Listigar membri",
"lists.list_members_count": "{count, plural,one {# membro} other {#membri}}",
"lists.list_name": "Listonomo",
"lists.new_list_name": "Nova listonomo",
@@ -840,7 +837,6 @@
"status.mute_conversation": "Silencigez konverso",
"status.open": "Detaligar ca mesajo",
"status.pin": "Pinglagez che profilo",
- "status.pinned": "Adpinglita afisho",
"status.read_more": "Lektez plu",
"status.reblog": "Repetez",
"status.reblog_private": "Repetez kun originala videbleso",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 50f31dd623..01b575decb 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Netþjónar með efnisumsjón",
"about.contact": "Hafa samband:",
+ "about.default_locale": "Sjálfgefið",
"about.disclaimer": "Mastodon er frjáls hugbúnaður með opinn grunnkóða og er skrásett vörumerki í eigu Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Ástæða ekki tiltæk",
"about.domain_blocks.preamble": "Mastodon leyfir þér almennt að skoða og eiga við efni frá notendum frá hvaða vefþjóni sem er í vefþjónasambandinu. Þetta eru þær undantekningar sem hafa verið gerðar á þessum tiltekna vefþjóni.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Takmarkað",
"about.domain_blocks.suspended.explanation": "Engin gögn frá þessum vefþjóni verða unnin, geymd eða skipst á, sem gerir samskipti við notendur frá þessum vefþjóni ómöguleg.",
"about.domain_blocks.suspended.title": "Í frysti",
+ "about.language_label": "Tungumál",
"about.not_available": "Þessar upplýsingar hafa ekki verið gerðar aðgengilegar á þessum netþjóni.",
"about.powered_by": "Dreifhýstur samskiptamiðill keyrður með {mastodon}",
"about.rules": "Reglur netþjónsins",
@@ -19,17 +21,21 @@
"account.block_domain": "Útiloka lénið {domain}",
"account.block_short": "Útiloka",
"account.blocked": "Útilokaður",
+ "account.blocking": "Útilokun",
"account.cancel_follow_request": "Taka fylgjendabeiðni til baka",
"account.copy": "Afrita tengil í notandasnið",
"account.direct": "Einkaspjall við @{name}",
"account.disable_notifications": "Hætta að láta mig vita þegar @{name} sendir inn",
- "account.domain_blocked": "Lén útilokað",
+ "account.domain_blocking": "Útiloka lén",
"account.edit_profile": "Breyta notandasniði",
"account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
"account.endorse": "Birta á notandasniði",
+ "account.familiar_followers_many": "Fylgt af {name1}, {name2} og {othersCount, plural, one {einum öðrum sem þú þekkir} other {# öðrum sem þú þekkir}}",
+ "account.familiar_followers_one": "Fylgt af {name1}",
+ "account.familiar_followers_two": "Fylgt af {name1} og {name2}",
"account.featured": "Með aukið vægi",
+ "account.featured.accounts": "Notendasnið",
"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_never": "Engar færslur",
"account.follow": "Fylgjast með",
@@ -37,9 +43,11 @@
"account.followers": "Fylgjendur",
"account.followers.empty": "Ennþá fylgist enginn með þessum notanda.",
"account.followers_counter": "{count, plural, one {Fylgjandi: {counter}} other {Fylgjendur: {counter}}}",
+ "account.followers_you_know_counter": "{counter} sem þú þekkir",
"account.following": "Fylgist með",
"account.following_counter": "{count, plural, one {Fylgist með: {counter}} other {Fylgist með: {counter}}}",
"account.follows.empty": "Þessi notandi fylgist ennþá ekki með neinum.",
+ "account.follows_you": "Fylgir þér",
"account.go_to_profile": "Fara í notandasnið",
"account.hide_reblogs": "Fela endurbirtingar fyrir @{name}",
"account.in_memoriam": "Minning.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Þagga í tilkynningum",
"account.mute_short": "Þagga niður",
"account.muted": "Þaggaður",
- "account.mutual": "Sameiginlegir",
+ "account.muting": "Þöggun",
+ "account.mutual": "Þið fylgist með hvor öðrum",
"account.no_bio": "Engri lýsingu útvegað.",
"account.open_original_page": "Opna upprunalega síðu",
"account.posts": "Færslur",
"account.posts_with_replies": "Færslur og svör",
+ "account.remove_from_followers": "Fjarlægja {name} úr fylgjendum",
"account.report": "Kæra @{name}",
"account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
"account.requested_follow": "{name} hefur beðið um að fylgjast með þér",
+ "account.requests_to_follow_you": "Bað um að fylgjast með þér",
"account.share": "Deila notandasniði fyrir @{name}",
"account.show_reblogs": "Sýna endurbirtingar frá @{name}",
"account.statuses_counter": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Eyða og endurvinna drög",
"confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
"confirmations.redraft.title": "Eyða og byrja ný drög að færslu?",
+ "confirmations.remove_from_followers.confirm": "Fjarlægja fylgjanda",
+ "confirmations.remove_from_followers.message": "{name} mun hætta að fylgjast með þér. Ertu viss um að þú viljir halda áfram?",
+ "confirmations.remove_from_followers.title": "Fjarlægja fylgjanda?",
"confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
"confirmations.reply.title": "Skrifa yfir færslu?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Leitarniðurstöður",
"emoji_button.symbols": "Tákn",
"emoji_button.travel": "Ferðalög og staðir",
- "empty_column.account_featured": "Þessi listi er tómur",
+ "empty_column.account_featured.me": "Þú hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?",
+ "empty_column.account_featured.other": "{acct} hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?",
+ "empty_column.account_featured_other.unknown": "Þessi notandi hefur enn ekki sett neitt sem áberandi.",
"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_timeline": "Engar færslur hér!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Fréttir",
"explore.trending_statuses": "Færslur",
"explore.trending_tags": "Myllumerki",
+ "featured_carousel.header": "{count, plural, one {Fest færsla} other {Festar færslur}}",
+ "featured_carousel.next": "Næsta",
+ "featured_carousel.post": "Færsla",
+ "featured_carousel.previous": "Fyrra",
+ "featured_carousel.slide": "{index} af {total}",
"filter_modal.added.context_mismatch_explanation": "Þessi síuflokkur á ekki við í því samhengi sem aðgangur þinn að þessari færslu felur í sér. Ef þú vilt að færslan sé einnig síuð í þessu samhengi, þá þarftu að breyta síunni.",
"filter_modal.added.context_mismatch_title": "Misræmi í samhengi!",
"filter_modal.added.expired_explanation": "Þessi síuflokkur er útrunninn, þú þarft að breyta gidistímanum svo hann geti átt við.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} þátttakandi} other {{counter} þátttakendur}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} færsla} other {{counter} færslur}} í dag",
+ "hashtag.feature": "Birta á notandasniði",
"hashtag.follow": "Fylgjast með myllumerki",
"hashtag.mute": "Þagga #{hashtag}",
+ "hashtag.unfeature": "Ekki birta á notandasniði",
"hashtag.unfollow": "Hætta að fylgjast með myllumerki",
"hashtags.and_other": "…og {count, plural, other {# til viðbótar}}",
"hints.profiles.followers_may_be_missing": "Fylgjendur frá þessum notanda gæti vantað.",
@@ -502,7 +525,6 @@
"lists.exclusive": "Fela meðlimi í heimastreyminu",
"lists.exclusive_hint": "Ef einhver er á þessum lista, geturðu falið viðkomandi í heimastreyminu þínu til að komast hjá því að sjá færslurnar þeirra í tvígang.",
"lists.find_users_to_add": "Finndu notendur til að bæta við",
- "lists.list_members": "Meðlimir lista",
"lists.list_members_count": "{count, plural, one {# meðlimur} other {# meðlimir}}",
"lists.list_name": "Heiti lista",
"lists.new_list_name": "Heiti á nýjum lista",
@@ -848,7 +870,13 @@
"status.mute_conversation": "Þagga niður í samtali",
"status.open": "Opna þessa færslu",
"status.pin": "Festa á notandasnið",
- "status.pinned": "Fest færsla",
+ "status.quote_error.filtered": "Falið vegna einnar síu sem er virk",
+ "status.quote_error.not_found": "Þessa færslu er ekki hægt að birta.",
+ "status.quote_error.pending_approval": "Þessi færsla bíður eftir samþykki frá upprunalegum höfundi hennar.",
+ "status.quote_error.rejected": "Þessa færslu er ekki hægt að birta þar sem upphaflegur höfundur hennar leyfir ekki að vitnað sé til hennar.",
+ "status.quote_error.removed": "Þessi færsla var fjarlægð af höfundi hennar.",
+ "status.quote_error.unauthorized": "Þessa færslu er ekki hægt að birta þar sem þú hefur ekki heimild til að skoða hana.",
+ "status.quote_post_author": "Færsla frá {name}",
"status.read_more": "Lesa meira",
"status.reblog": "Endurbirting",
"status.reblog_private": "Endurbirta til upphaflegra lesenda",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 36770c675f..e84fd2fbb6 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Server moderati",
"about.contact": "Contatti:",
+ "about.default_locale": "Predefinito",
"about.disclaimer": "Mastodon è un software libero e open-source e un marchio di Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo non disponibile",
"about.domain_blocks.preamble": "Mastodon, generalmente, ti consente di visualizzare i contenuti e interagire con gli utenti da qualsiasi altro server nel fediverso. Queste sono le eccezioni che sono state fatte su questo particolare server.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitato",
"about.domain_blocks.suspended.explanation": "Nessun dato proveniente da questo server verrà elaborato, conservato o scambiato, rendendo impossibile qualsiasi interazione o comunicazione con gli utenti da questo server.",
"about.domain_blocks.suspended.title": "Sospeso",
+ "about.language_label": "Lingua",
"about.not_available": "Queste informazioni non sono state rese disponibili su questo server.",
"about.powered_by": "Social media decentralizzato alimentato da {mastodon}",
"about.rules": "Regole del server",
@@ -19,17 +21,21 @@
"account.block_domain": "Blocca dominio {domain}",
"account.block_short": "Blocca",
"account.blocked": "Bloccato",
+ "account.blocking": "Account bloccato",
"account.cancel_follow_request": "Annulla la richiesta di seguire",
"account.copy": "Copia link del profilo",
"account.direct": "Menziona privatamente @{name}",
"account.disable_notifications": "Smetti di avvisarmi quando @{name} pubblica un post",
- "account.domain_blocked": "Dominio bloccato",
+ "account.domain_blocking": "Account di un dominio bloccato",
"account.edit_profile": "Modifica profilo",
"account.enable_notifications": "Avvisami quando @{name} pubblica un post",
"account.endorse": "In evidenza sul profilo",
+ "account.familiar_followers_many": "Seguito da {name1}, {name2}, e {othersCount, plural, one {un altro che conosci} other {# altri che conosci}}",
+ "account.familiar_followers_one": "Seguito da {name1}",
+ "account.familiar_followers_two": "Seguito da {name1} e {name2}",
"account.featured": "In primo piano",
+ "account.featured.accounts": "Profili",
"account.featured.hashtags": "Hashtag",
- "account.featured.posts": "Post",
"account.featured_tags.last_status_at": "Ultimo post il {date}",
"account.featured_tags.last_status_never": "Nessun post",
"account.follow": "Segui",
@@ -37,9 +43,11 @@
"account.followers": "Follower",
"account.followers.empty": "Ancora nessuno segue questo utente.",
"account.followers_counter": "{count, plural, one {{counter} seguace} other {{counter} seguaci}}",
+ "account.followers_you_know_counter": "{counter} che conosci",
"account.following": "Seguiti",
"account.following_counter": "{count, plural, one {{counter} segui} other {{counter} seguiti}}",
"account.follows.empty": "Questo utente non segue ancora nessuno.",
+ "account.follows_you": "Ti segue",
"account.go_to_profile": "Vai al profilo",
"account.hide_reblogs": "Nascondi condivisioni da @{name}",
"account.in_memoriam": "In memoria.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Silenzia notifiche",
"account.mute_short": "Silenzia",
"account.muted": "Mutato",
- "account.mutual": "Reciproco",
+ "account.muting": "Account silenziato",
+ "account.mutual": "Vi seguite a vicenda",
"account.no_bio": "Nessuna descrizione fornita.",
"account.open_original_page": "Apri la pagina originale",
"account.posts": "Post",
"account.posts_with_replies": "Post e risposte",
+ "account.remove_from_followers": "Rimuovi {name} dai seguaci",
"account.report": "Segnala @{name}",
"account.requested": "In attesa d'approvazione. Clicca per annullare la richiesta di seguire",
"account.requested_follow": "{name} ha richiesto di seguirti",
+ "account.requests_to_follow_you": "Richieste di seguirti",
"account.share": "Condividi il profilo di @{name}",
"account.show_reblogs": "Mostra condivisioni da @{name}",
"account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} post}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Elimina e riscrivi",
"confirmations.redraft.message": "Sei sicuro di voler eliminare questo post e riscriverlo? I preferiti e i boost andranno persi e le risposte al post originale non saranno più collegate.",
"confirmations.redraft.title": "Eliminare e riformulare il post?",
+ "confirmations.remove_from_followers.confirm": "Rimuovi il seguace",
+ "confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?",
+ "confirmations.remove_from_followers.title": "Rimuovi il seguace?",
"confirmations.reply.confirm": "Rispondi",
"confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?",
"confirmations.reply.title": "Sovrascrivere il post?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Risultati della ricerca",
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Viaggi & Luoghi",
- "empty_column.account_featured": "Questa lista è vuota",
+ "empty_column.account_featured.me": "Non hai ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?",
+ "empty_column.account_featured.other": "{acct} non ha ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?",
+ "empty_column.account_featured_other.unknown": "Questo account non ha ancora pubblicato nulla.",
"empty_column.account_hides_collections": "Questo utente ha scelto di non rendere disponibili queste informazioni",
"empty_column.account_suspended": "Profilo sospeso",
"empty_column.account_timeline": "Nessun post qui!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Notizie",
"explore.trending_statuses": "Post",
"explore.trending_tags": "Hashtag",
+ "featured_carousel.header": "{count, plural, one {Post appuntato} other {Post appuntati}}",
+ "featured_carousel.next": "Successivo",
+ "featured_carousel.post": "Post",
+ "featured_carousel.previous": "Precedente",
+ "featured_carousel.slide": "{index} di {total}",
"filter_modal.added.context_mismatch_explanation": "La categoria di questo filtro non si applica al contesto in cui hai acceduto a questo post. Se desideri che il post sia filtrato anche in questo contesto, dovrai modificare il filtro.",
"filter_modal.added.context_mismatch_title": "Contesto non corrispondente!",
"filter_modal.added.expired_explanation": "La categoria di questo filtro è scaduta, dovrvai modificarne la data di scadenza per applicarlo.",
@@ -381,6 +402,8 @@
"generic.saved": "Salvato",
"getting_started.heading": "Per iniziare",
"hashtag.admin_moderation": "Apri l'interfaccia di moderazione per #{name}",
+ "hashtag.browse": "Sfoglia i post con #{hashtag}",
+ "hashtag.browse_from_account": "Sfoglia i post da @{name} con #{hashtag}",
"hashtag.column_header.tag_mode.all": "e {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "senza {additional}",
@@ -393,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} partecipante} other {{counter} partecipanti}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} post}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} post}} oggi",
+ "hashtag.feature": "In evidenza sul profilo",
"hashtag.follow": "Segui l'hashtag",
+ "hashtag.mute": "Silenzia #{hashtag}",
+ "hashtag.unfeature": "Non mettere in evidenza sul profilo",
"hashtag.unfollow": "Smetti di seguire l'hashtag",
"hashtags.and_other": "…e {count, plural, other {# in più}}",
"hints.profiles.followers_may_be_missing": "I seguaci per questo profilo potrebbero essere mancanti.",
@@ -499,7 +525,6 @@
"lists.exclusive": "Nascondi i membri in Home",
"lists.exclusive_hint": "Se qualcuno è presente in questa lista, nascondilo nel tuo feed Home per evitare di vedere i suoi post due volte.",
"lists.find_users_to_add": "Trova utenti da aggiungere",
- "lists.list_members": "Membri della lista",
"lists.list_members_count": "{count, plural, one {# membro} other {# membri}}",
"lists.list_name": "Nome della lista",
"lists.new_list_name": "Nuovo nome della lista",
@@ -845,7 +870,13 @@
"status.mute_conversation": "Silenzia conversazione",
"status.open": "Espandi questo post",
"status.pin": "Fissa in cima sul profilo",
- "status.pinned": "Post fissato",
+ "status.quote_error.filtered": "Nascosto a causa di uno dei tuoi filtri",
+ "status.quote_error.not_found": "Questo post non può essere visualizzato.",
+ "status.quote_error.pending_approval": "Questo post è in attesa di approvazione dell'autore originale.",
+ "status.quote_error.rejected": "Questo post non può essere visualizzato perché l'autore originale non consente che venga citato.",
+ "status.quote_error.removed": "Questo post è stato rimosso dal suo autore.",
+ "status.quote_error.unauthorized": "Questo post non può essere visualizzato in quanto non sei autorizzato a visualizzarlo.",
+ "status.quote_post_author": "Post di @{name}",
"status.read_more": "Leggi di più",
"status.reblog": "Reblog",
"status.reblog_private": "Reblog con visibilità originale",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index a2328401f4..dacff16bbc 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -2,6 +2,7 @@
"about.blocks": "制限中のサーバー",
"about.contact": "連絡先",
"about.disabled": "無効",
+ "about.default_locale": "デフォルト",
"about.disclaimer": "Mastodonは自由なオープンソースソフトウェアであり、Mastodon gGmbHの商標です。",
"about.domain_blocks.no_reason_available": "理由未記載",
"about.domain_blocks.preamble": "Mastodonでは原則的にあらゆるサーバー同士で交流したり、互いの投稿を読んだりできますが、当サーバーでは例外的に次のような制限を設けています。",
@@ -15,6 +16,7 @@
"about.full_text_search": "全文検索",
"about.kmyblue_capabilities": "このサーバーで利用可能な機能",
"about.kmyblue_capability": "このサーバーは、kmyblueというMastodonフォークを利用しています。kmyblue独自機能の一部は、サーバー管理者によって有効・無効を切り替えることができます。",
+ "about.language_label": "言語",
"about.not_available": "この情報はこのサーバーでは利用できません。",
"about.powered_by": "{mastodon}による分散型ソーシャルメディア",
"about.public_visibility": "公開投稿を許可",
@@ -30,14 +32,21 @@
"account.block_domain": "{domain}全体をブロック",
"account.block_short": "ブロック",
"account.blocked": "ブロック済み",
+ "account.blocking": "ブロック中",
"account.cancel_follow_request": "フォローリクエストの取り消し",
"account.copy": "プロフィールへのリンクをコピー",
"account.direct": "@{name}さんに非公開でメンション",
"account.disable_notifications": "@{name}さんの投稿時の通知を停止",
- "account.domain_blocked": "ドメインブロック中",
+ "account.domain_blocking": "ブロックしているドメイン",
"account.edit_profile": "プロフィール編集",
"account.enable_notifications": "@{name}さんの投稿時に通知",
"account.endorse": "プロフィールで紹介する",
+ "account.familiar_followers_many": "{name1}、{name2}、他{othersCount, plural, one {one other you know} other {# others you know}}人のユーザーにフォローされています",
+ "account.familiar_followers_one": "{name1} さんがフォローしています",
+ "account.familiar_followers_two": "{name1} さんと {name2} さんもフォローしています",
+ "account.featured": "注目",
+ "account.featured.accounts": "プロフィール",
+ "account.featured.hashtags": "ハッシュタグ",
"account.featured_tags.last_status_at": "最終投稿 {date}",
"account.featured_tags.last_status_never": "投稿がありません",
"account.follow": "フォロー",
@@ -45,9 +54,11 @@
"account.followers": "フォロワー",
"account.followers.empty": "まだ誰もフォローしていません。",
"account.followers_counter": "{count, plural, other {{counter} フォロワー}}",
+ "account.followers_you_know_counter": "あなたと知り合いの{counter}人",
"account.following": "フォロー中",
"account.following_counter": "{count, plural, other {{counter} フォロー}}",
"account.follows.empty": "まだ誰もフォローしていません。",
+ "account.follows_you": "フォローされています",
"account.go_to_profile": "プロフィールページへ",
"account.hide_reblogs": "@{name}さんからのブーストを非表示",
"account.in_memoriam": "故人を偲んで。",
@@ -62,19 +73,23 @@
"account.mute_notifications_short": "通知をオフにする",
"account.mute_short": "ミュート",
"account.muted": "ミュート済み",
+ "account.muting": "ミュート中",
"account.mutual": "相互フォロー中",
"account.no_bio": "説明が提供されていません。",
"account.open_original_page": "元のページを開く",
"account.posts": "投稿",
"account.posts_with_replies": "投稿と返信",
+ "account.remove_from_followers": "{name}さんをフォロワーから削除",
"account.report": "@{name}さんを通報",
"account.requested": "フォロー承認待ちです。クリックしてキャンセル",
"account.requested_follow": "{name}さんがあなたにフォローリクエストしました",
+ "account.requests_to_follow_you": "フォローリクエスト",
"account.share": "@{name}さんのプロフィールを共有する",
"account.show_reblogs": "@{name}さんからのブーストを表示",
"account.statuses_counter": "{count, plural, other {{counter} 投稿}}",
"account.unblock": "@{name}さんのブロックを解除",
"account.unblock_domain": "{domain}のブロックを解除",
+ "account.unblock_domain_short": "ブロックを解除",
"account.unblock_short": "ブロック解除",
"account.unendorse": "プロフィールから外す",
"account.unfollow": "フォロー解除",
@@ -196,8 +211,8 @@
"bookmark_categories.status.remove": "分類から削除",
"bookmark_categories.subheading": "あなたの分類",
"block_modal.remote_users_caveat": "このサーバーはあなたのブロックの意思を尊重するように {domain} へ通知します。しかし、サーバーによってはブロック機能の扱いが異なる場合もありえるため、相手のサーバー側で求める通りの処理が行われる確証はありません。また、公開投稿はユーザーがログアウト状態であれば閲覧できる可能性があります。",
- "block_modal.show_less": "注意事項を閉じる",
- "block_modal.show_more": "注意事項",
+ "block_modal.show_less": "表示を減らす",
+ "block_modal.show_more": "続きを表示",
"block_modal.they_cant_mention": "相手はあなたへの返信やフォローができなくなります。",
"block_modal.they_cant_see_posts": "相手はあなたの投稿を閲覧できなくなり、あなたも相手の投稿を閲覧できなくなります。",
"block_modal.they_will_know": "ブロックは相手からわかります。",
@@ -344,6 +359,9 @@
"confirmations.redraft.confirm": "削除して下書きに戻す",
"confirmations.redraft.message": "投稿を削除して下書きに戻します。この投稿へのお気に入り登録やブーストは失われ、返信は孤立することになります。よろしいですか?",
"confirmations.redraft.title": "投稿の削除と下書きの再作成",
+ "confirmations.remove_from_followers.confirm": "フォロワーを削除",
+ "confirmations.remove_from_followers.message": "{name}さんはあなたをフォローしなくなります。本当によろしいですか?",
+ "confirmations.remove_from_followers.title": "フォロワーを削除しますか?",
"confirmations.reply.confirm": "返信",
"confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?",
"confirmations.reply.title": "作成中の内容を上書きしようとしています",
@@ -411,6 +429,9 @@
"emoji_button.search_results": "検索結果",
"emoji_button.symbols": "記号",
"emoji_button.travel": "旅行と場所",
+ "empty_column.account_featured.me": "まだ何もフィーチャーしていません。最もよく使うハッシュタグや、更には友達のアカウントまでプロフィール上でフィーチャーできると知っていましたか?",
+ "empty_column.account_featured.other": "{acct}ではまだ何もフィーチャーされていません。最もよく使うハッシュタグや、更には友達のアカウントまでプロフィール上でフィーチャーできると知っていましたか?",
+ "empty_column.account_featured_other.unknown": "このアカウントにはまだ何も投稿されていません。",
"empty_column.account_hides_collections": "このユーザーはこの情報を開示しないことにしています。",
"empty_column.account_suspended": "アカウントは停止されています",
"empty_column.account_timeline": "投稿がありません!",
@@ -438,7 +459,7 @@
"empty_column.notification_requests": "ここに表示するものはありません。新しい通知を受け取ったとき、フィルタリング設定で通知がブロックされたアカウントがある場合はここに表示されます。",
"empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。",
"empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のサーバーのユーザーをフォローしたりしていっぱいにしましょう",
- "empty_column.status_references": "まだ誰も引用していません。引用されるとここに表示されます。",
+ "empty_column.status_references": "まだ誰もリンクしていません。リンクされるとここに表示されます。",
"error.unexpected_crash.explanation": "不具合かブラウザの互換性問題のため、このページを正しく表示できませんでした。",
"error.unexpected_crash.explanation_addons": "このページは正しく表示できませんでした。このエラーはブラウザのアドオンや自動翻訳ツールによって引き起こされることがあります。",
"error.unexpected_crash.next_steps": "ページの再読み込みをお試しください。それでも解決しない場合、別のブラウザかアプリを使えば使用できることがあります。",
@@ -450,6 +471,10 @@
"explore.trending_links": "ニュース",
"explore.trending_statuses": "投稿",
"explore.trending_tags": "ハッシュタグ",
+ "featured_carousel.next": "次へ",
+ "featured_carousel.post": "投稿",
+ "featured_carousel.previous": "前へ",
+ "featured_carousel.slide": "{index} / {total}",
"filter_modal.added.context_mismatch_explanation": "このフィルターカテゴリーはあなたがアクセスした投稿のコンテキストには適用されません。この投稿のコンテキストでもフィルターを適用するにはフィルターを編集する必要があります。",
"filter_modal.added.context_mismatch_title": "コンテキストが一致しません!",
"filter_modal.added.expired_explanation": "このフィルターカテゴリーは有効期限が切れています。適用するには有効期限を更新してください。",
@@ -502,6 +527,8 @@
"generic.saved": "保存しました",
"getting_started.heading": "スタート",
"hashtag.admin_moderation": "#{name}のモデレーション画面を開く",
+ "hashtag.browse": "#{hashtag}が付いた投稿を閲覧する",
+ "hashtag.browse_from_account": "#{hashtag}が付いた{name}の投稿を閲覧する",
"hashtag.column_header.tag_mode.all": "と{additional}",
"hashtag.column_header.tag_mode.any": "か{additional}",
"hashtag.column_header.tag_mode.none": "({additional} を除く)",
@@ -514,7 +541,10 @@
"hashtag.counter_by_accounts": "{count, plural, other {{counter}人投稿}}",
"hashtag.counter_by_uses": "{count, plural, other {{counter}件}}",
"hashtag.counter_by_uses_today": "本日{count, plural, other {#件}}",
+ "hashtag.feature": "プロフィールで紹介する",
"hashtag.follow": "ハッシュタグをフォローする",
+ "hashtag.mute": "#{hashtag}をミュート",
+ "hashtag.unfeature": "プロフィールから外す",
"hashtag.unfollow": "ハッシュタグのフォローを解除",
"hashtags.and_other": "ほか{count, plural, other {#個}}",
"hints.profiles.followers_may_be_missing": "フォロワーの一覧は不正確な場合があります。",
@@ -624,7 +654,6 @@
"lists.favourite": "お気に入りに登録",
"lists.favourite_hint": "お気に入りに登録したリストは、PCのWebクライアントでナビゲーションに表示されます",
"lists.find_users_to_add": "追加するユーザーを探しましょう",
- "lists.list_members": "リストのメンバー",
"lists.list_members_count": "{count, plural, other{#人のメンバー}}",
"lists.list_name": "リスト名",
"lists.memo_related_antenna": "アンテナ: {title}",
@@ -733,7 +762,7 @@
"notification.relationships_severance_event.learn_more": "詳細を確認",
"notification.relationships_severance_event.user_domain_block": "{target} のブロックにより{followersCount}フォロワーと{followingCount, plural, other {#フォロー}}が解除されました。",
"notification.status": "{name}さんが投稿しました",
- "notification.status_reference": "{name}さんがあなたの投稿を引用しました",
+ "notification.status_reference": "{name}さんがあなたの投稿をリンクしました",
"notification.update": "{name}さんが投稿を編集しました",
"notification_requests.accept": "受け入れる",
"notification_requests.accept_multiple": "{count, plural, other {選択中の#件を受け入れる}}",
@@ -774,7 +803,7 @@
"notifications.column_settings.show": "カラムに表示",
"notifications.column_settings.sound": "通知音を再生",
"notifications.column_settings.status": "新しい投稿:",
- "notifications.column_settings.status_reference": "引用",
+ "notifications.column_settings.status_reference": "リンク",
"notifications.column_settings.unread_notifications.category": "未読の通知:",
"notifications.column_settings.unread_notifications.highlight": "未読の通知を強調表示",
"notifications.column_settings.update": "編集:",
@@ -786,7 +815,7 @@
"notifications.filter.mentions": "返信",
"notifications.filter.polls": "アンケート結果",
"notifications.filter.statuses": "フォローしている人の新着情報",
- "notifications.filter.status_references": "引用",
+ "notifications.filter.status_references": "リンク",
"notifications.grant_permission": "権限の付与",
"notifications.group": "{count}件の通知",
"notifications.mark_as_read": "すべて既読にする",
@@ -1030,9 +1059,15 @@
"status.mute_conversation": "会話をミュート",
"status.open": "詳細を表示",
"status.pin": "プロフィールに固定表示",
- "status.pinned": "固定された投稿",
- "status.quote": "引用",
- "status.quotes": "{count, plural, one {引用} other {引用}}",
+ "status.quote": "リンク",
+ "status.quote_link": "引用リンクを挿入",
+ "status.quote_error.filtered": "あなたのフィルター設定によって非表示になっています",
+ "status.quote_error.not_found": "この投稿は表示できません。",
+ "status.quote_error.pending_approval": "この投稿は投稿者の承認待ちです。",
+ "status.quote_error.rejected": "この投稿は、オリジナルの投稿者が引用することを許可していないため、表示できません。",
+ "status.quote_error.removed": "この投稿は投稿者によって削除されました。",
+ "status.quote_error.unauthorized": "この投稿を表示する権限がないため、表示できません。",
+ "status.quote_post_author": "{name} の投稿",
"status.read_more": "もっと見る",
"status.reblog": "ブースト",
"status.reblog_private": "ブースト",
@@ -1041,7 +1076,8 @@
"status.reblogs": "{count, plural, one {ブースト} other {ブースト}}",
"status.reblogs.empty": "まだ誰もブーストしていません。ブーストされるとここに表示されます。",
"status.redraft": "削除して下書きに戻す",
- "status.reference": "ひかえめな引用",
+ "status.reference": "リンク",
+ "status.references": "{count, plural, one {リンク} other {リンク}}",
"status.remove_bookmark": "ブックマークを削除",
"status.remove_favourite": "お気に入りから削除",
"status.replied_in_thread": "ほかのユーザーへ",
@@ -1065,7 +1101,9 @@
"subscribed_languages.target": "{target}さんの購読言語を変更します",
"tabs_bar.home": "ホーム",
"tabs_bar.notifications": "通知",
+ "terms_of_service.effective_as_of": "{date}より有効",
"terms_of_service.title": "サービス利用規約",
+ "terms_of_service.upcoming_changes_on": "{date}から適用される変更",
"time_remaining.days": "残り{number}日",
"time_remaining.hours": "残り{number}時間",
"time_remaining.minutes": "残り{number}分",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index d078ef5cab..519c778907 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -8,7 +8,6 @@
"account.block_domain": "დაიმალოს ყველაფერი დომენიდან {domain}",
"account.blocked": "დაბლოკილია",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "დომენი დამალულია",
"account.edit_profile": "პროფილის ცვლილება",
"account.endorse": "გამორჩევა პროფილზე",
"account.featured_tags.last_status_never": "პოსტების გარეშე",
@@ -206,7 +205,6 @@
"status.mute_conversation": "გააჩუმე საუბარი",
"status.open": "ამ სტატუსის გაფართოება",
"status.pin": "აპინე პროფილზე",
- "status.pinned": "აპინული ტუტი",
"status.reblog": "ბუსტი",
"status.reblog_private": "დაიბუსტოს საწყის აუდიტორიაზე",
"status.reblogged_by": "{name} დაიბუსტა",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index bb97a18bd2..b8dbb2ae10 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -21,10 +21,11 @@
"account.copy": "Nɣel assaɣ ɣer umaɣnu",
"account.direct": "Bder-d @{name} weḥd-s",
"account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}",
- "account.domain_blocked": "Taɣult yeffren",
"account.edit_profile": "Ẓreg amaɣnu",
"account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}",
"account.endorse": "Welleh fell-as deg umaɣnu-inek",
+ "account.featured.accounts": "Imeɣna",
+ "account.featured.hashtags": "Ihacṭagen",
"account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}",
"account.featured_tags.last_status_never": "Ulac tisuffaɣ",
"account.follow": "Ḍfer",
@@ -35,6 +36,7 @@
"account.following": "Yeṭṭafaṛ",
"account.following_counter": "{count, plural, one {{counter} yettwaḍfaren} other {{counter} yettwaḍfaren}}",
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
+ "account.follows_you": "Yeṭṭafaṛ-ik·em-id",
"account.go_to_profile": "Ddu ɣer umaɣnu",
"account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
"account.joined_short": "Izeddi da seg ass n",
@@ -48,7 +50,6 @@
"account.mute_notifications_short": "Susem ilɣa",
"account.mute_short": "Sgugem",
"account.muted": "Yettwasgugem",
- "account.mutual": "Temṭafarem",
"account.no_bio": "Ulac aglam i d-yettunefken.",
"account.open_original_page": "Ldi asebter anasli",
"account.posts": "Tisuffaɣ",
@@ -278,6 +279,8 @@
"footer.terms_of_service": "Tiwtilin n useqdec",
"generic.saved": "Yettwasekles",
"getting_started.heading": "Bdu",
+ "hashtag.browse": "Snirem tisuffaɣ yesɛan #{hashtag}",
+ "hashtag.browse_from_account": "Snirem tisuffaɣ sɣur @{name} yesɛan #{hashtag}",
"hashtag.column_header.tag_mode.all": "d {additional}",
"hashtag.column_header.tag_mode.any": "neɣ {additional}",
"hashtag.column_header.tag_mode.none": "war {additional}",
@@ -291,6 +294,7 @@
"hashtag.counter_by_uses": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}} ass-a",
"hashtag.follow": "Ḍfeṛ ahacṭag",
+ "hashtag.mute": "Sgugem #{hashtag}",
"hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}",
"hints.threads.replies_may_be_missing": "Tiririyin d-yusan deg iqeddacen nniḍen, yezmer ur d-ddant ara.",
"hints.threads.see_more": "Wali ugar n tririt deg {domain}",
@@ -415,6 +419,7 @@
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
"notification.admin.report": "Yemla-t-id {name} {target}",
"notification.admin.sign_up": "Ijerred {name}",
+ "notification.annual_report.view": "Wali #Wrapstodon",
"notification.favourite": "{name} yesmenyaf addad-ik·im",
"notification.follow": "iṭṭafar-ik·em-id {name}",
"notification.follow.name_and_others": "{name} akked {count, plural, one {# nniḍen} other {# nniḍen}} iḍfeṛ-k·m-id",
@@ -466,6 +471,7 @@
"notifications.group": "{count} n yilɣa",
"notifications.mark_as_read": "Creḍ akk ilɣa am wakken ttwaɣran",
"notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel",
+ "notifications.policy.accept": "Qbel",
"notifications.policy.drop": "Anef-as",
"notifications.policy.filter": "Sizdeg",
"notifications.policy.filter_new_accounts.hint": "Imiḍanen imaynuten i d-yennulfan deg {days, plural, one {yiwen n wass} other {# n wussan}} yezrin",
@@ -580,6 +586,7 @@
"search_results.all": "Akk",
"search_results.hashtags": "Ihacṭagen",
"search_results.no_results": "Ulac igemmaḍ.",
+ "search_results.no_search_yet": "Ɛreḍ ad d-tnadiḍ ɣef iznan, imaɣnuten neɣ ihacṭagen.",
"search_results.see_all": "Wali-ten akk",
"search_results.statuses": "Tisuffaɣ",
"search_results.title": "Igemmaḍ n unadi ɣef \"{q}\"",
@@ -618,7 +625,6 @@
"status.mute_conversation": "Sgugem adiwenni",
"status.open": "Semɣeṛ tasuffeɣt-ayi",
"status.pin": "Senteḍ-itt deg umaɣnu",
- "status.pinned": "Tisuffaɣ yettwasentḍen",
"status.read_more": "Issin ugar",
"status.reblog": "Bḍu",
"status.reblogged_by": "Yebḍa-tt {name}",
@@ -639,6 +645,7 @@
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.translate": "Suqel",
"status.translated_from_with": "Yettwasuqel seg {lang} s {provider}",
+ "status.uncached_media_warning": "Ulac taskant",
"status.unmute_conversation": "Kkes asgugem n udiwenni",
"status.unpin": "Kkes asenteḍ seg umaɣnu",
"subscribed_languages.save": "Sekles ibeddilen",
@@ -670,6 +677,8 @@
"video.expand": "Semɣeṛ tavidyut",
"video.fullscreen": "Agdil aččuran",
"video.hide": "Ffer tabidyutt",
+ "video.mute": "Sgugem",
"video.pause": "Sgunfu",
- "video.play": "Seddu"
+ "video.play": "Seddu",
+ "video.unmute": "Kkes asgugem"
}
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index adc3cdc230..2ba9d35e02 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -19,40 +19,74 @@
"account.block_short": "Бұғаттау",
"account.blocked": "Бұғатталған",
"account.cancel_follow_request": "Withdraw follow request",
+ "account.direct": "@{name} жеке айту",
"account.disable_notifications": "@{name} постары туралы ескертпеу",
- "account.domain_blocked": "Домен бұғатталған",
+ "account.domain_blocking": "Доменді бұғаттау",
"account.edit_profile": "Профильді өңдеу",
"account.enable_notifications": "@{name} постары туралы ескерту",
"account.endorse": "Профильде ұсыну",
+ "account.familiar_followers_many": "{name1}, {name2} және {othersCount, plural, one {сіз білетін тағы бір адам} other {сіз білетін тағы # адам}} жазылған",
+ "account.familiar_followers_one": "{name1} жазылған",
+ "account.familiar_followers_two": "{name1} мен {name2} жазылған",
+ "account.featured": "Ерекшеленген",
+ "account.featured.accounts": "Профильдер",
+ "account.featured.hashtags": "Хэштегтер",
+ "account.featured_tags.last_status_at": "Соңғы жазба {date} күні",
"account.featured_tags.last_status_never": "Пост жоқ",
"account.follow": "Жазылу",
+ "account.follow_back": "Кері жазылу",
"account.followers": "Жазылушы",
"account.followers.empty": "Бұл қолданушыға әлі ешкім жазылмаған.",
+ "account.followers_counter": "{count, plural, one {{counter} жазылушы} other {{counter} жазылушы}}",
"account.following": "Жазылым",
+ "account.following_counter": "{count, plural, one {{counter} жазылған} other {{counter} жазылған}}",
"account.follows.empty": "Бұл қолданушы әлі ешкімге жазылмаған.",
+ "account.follows_you": "Сізге жазылған",
"account.go_to_profile": "Профиліне өту",
"account.hide_reblogs": "@{name} бустарын жасыру",
+ "account.in_memoriam": "Естелік ретінде.",
"account.joined_short": "Қосылған",
"account.languages": "Жазылған тілдерді өзгерту",
"account.link_verified_on": "Сілтеме меншігі расталған күн {date}",
"account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.",
"account.media": "Медиа",
"account.mention": "@{name} дегенді атау",
+ "account.moved_to": "{name} өзінің жаңа аккаунты енді мынау екенін көрсетті:",
"account.mute": "@{name} дегенді елемеу",
+ "account.mute_notifications_short": "Хабарландыруларды өшіру",
+ "account.mute_short": "Өшіру",
"account.muted": "Еленбейді",
+ "account.muting": "Өшіру",
+ "account.mutual": "Сіздер бір-біріңізге жазылғансыздар",
+ "account.no_bio": "Сипаттама берілмеген.",
"account.open_original_page": "Бастапқы бетті ашу",
"account.posts": "Пост",
"account.posts_with_replies": "Постар мен жауаптар",
+ "account.remove_from_followers": "{name} жазылушылардан жою",
"account.report": "Шағымдану @{name}",
"account.requested": "Растауын күтіңіз. Жазылудан бас тарту үшін басыңыз",
+ "account.requested_follow": "{name} сізге жазылуға сұраныс жіберді",
+ "account.requests_to_follow_you": "Сізге жазылу сұраныстары",
"account.share": "@{name} профилін бөлісу\"",
"account.show_reblogs": "@{name} бөліскендерін көрсету",
+ "account.statuses_counter": "{count, plural, one {{counter} жазба} other {{counter} жазба}}",
"account.unblock": "Бұғаттан шығару @{name}",
"account.unblock_domain": "Бұғаттан шығару {domain}",
+ "account.unblock_domain_short": "Бұғаттауды алу",
+ "account.unblock_short": "Бұғаттауды алу",
"account.unendorse": "Профильде рекомендемеу",
"account.unfollow": "Оқымау",
"account.unmute": "@{name} ескертпелерін қосу",
+ "account.unmute_notifications_short": "Хабарландыруларды қосу",
+ "account.unmute_short": "Қосу",
"account_note.placeholder": "Жазба қалдыру үшін бас",
+ "admin.dashboard.daily_retention": "Тіркелгеннен кейінгі күн бойынша пайдаланушыларды сақтау көрсеткіші",
+ "admin.dashboard.monthly_retention": "Тіркелгеннен кейінгі ай бойынша пайдаланушыларды сақтау көрсеткіші",
+ "admin.dashboard.retention.average": "Орташа",
+ "admin.dashboard.retention.cohort": "Тіркелу айы",
+ "admin.dashboard.retention.cohort_size": "Жаңа пайдаланушылар",
+ "admin.impact_report.instance_accounts": "Бұл жоятын аккаунт профильдері",
+ "admin.impact_report.instance_followers": "Біздің пайдаланушылар жоғалтатын жазылушылар",
"alert.rate_limited.message": "Қайтадан көріңіз {retry_time, time, medium} кейін.",
"alert.rate_limited.title": "Бағалау шектеулі",
"alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
@@ -296,7 +330,6 @@
"status.mute_conversation": "Пікірталасты үнсіз қылу",
"status.open": "Жазбаны ашу",
"status.pin": "Профильде жабыстыру",
- "status.pinned": "Жабыстырылған жазба",
"status.read_more": "Әрі қарай",
"status.reblog": "Бөлісу",
"status.reblog_private": "Негізгі аудиторияға бөлісу",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index c7ba9e3916..85eee0a443 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -9,7 +9,6 @@
"account.badges.group": "ಗುಂಪು",
"account.block_domain": "Hide everything from {domain}",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "Domain hidden",
"account.follow": "ಹಿಂಬಾಲಿಸಿ",
"account.followers": "ಹಿಂಬಾಲಕರು",
"account.posts": "ಟೂಟ್ಗಳು",
@@ -83,7 +82,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 544278e519..f2e5a2c486 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -1,6 +1,7 @@
{
"about.blocks": "제한된 서버들",
"about.contact": "연락처:",
+ "about.default_locale": "기본",
"about.disclaimer": "Mastodon은 자유 오픈소스 소프트웨어이며, Mastodon gGmbH의 상표입니다",
"about.domain_blocks.no_reason_available": "사유를 밝히지 않음",
"about.domain_blocks.preamble": "마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 사용자와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "제한됨",
"about.domain_blocks.suspended.explanation": "이 서버의 어떤 데이터도 처리되거나, 저장 되거나 공유되지 않고, 이 서버의 어떤 유저와도 상호작용 하거나 대화할 수 없습니다.",
"about.domain_blocks.suspended.title": "정지됨",
+ "about.language_label": "언어",
"about.not_available": "이 정보는 이 서버에서 사용할 수 없습니다.",
"about.powered_by": "{mastodon}으로 구동되는 분산 소셜 미디어",
"about.rules": "서버 규칙",
@@ -19,17 +21,21 @@
"account.block_domain": "{domain} 도메인 차단",
"account.block_short": "차단",
"account.blocked": "차단함",
+ "account.blocking": "차단함",
"account.cancel_follow_request": "팔로우 취소",
"account.copy": "프로필 링크 복사",
"account.direct": "@{name} 님에게 개인적으로 멘션",
"account.disable_notifications": "@{name} 의 게시물 알림 끄기",
- "account.domain_blocked": "도메인 차단함",
+ "account.domain_blocking": "도메인 차단함",
"account.edit_profile": "프로필 편집",
"account.enable_notifications": "@{name} 의 게시물 알림 켜기",
"account.endorse": "프로필에 추천하기",
+ "account.familiar_followers_many": "{name1}, {name2} 님 외 내가 아는 {othersCount, plural, other {#}} 명이 팔로우함",
+ "account.familiar_followers_one": "{name1} 님이 팔로우함",
+ "account.familiar_followers_two": "{name1}, {name2} 님이 팔로우함",
"account.featured": "추천",
+ "account.featured.accounts": "프로필",
"account.featured.hashtags": "해시태그",
- "account.featured.posts": "게시물",
"account.featured_tags.last_status_at": "{date}에 마지막으로 게시",
"account.featured_tags.last_status_never": "게시물 없음",
"account.follow": "팔로우",
@@ -37,9 +43,11 @@
"account.followers": "팔로워",
"account.followers.empty": "아직 아무도 이 사용자를 팔로우하고 있지 않습니다.",
"account.followers_counter": "{count, plural, other {팔로워 {counter}명}}",
+ "account.followers_you_know_counter": "내가 아는 {counter} 명",
"account.following": "팔로잉",
"account.following_counter": "{count, plural, other {팔로잉 {counter}명}}",
"account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.",
+ "account.follows_you": "나를 팔로우",
"account.go_to_profile": "프로필로 이동",
"account.hide_reblogs": "@{name}의 부스트를 숨기기",
"account.in_memoriam": "고인의 계정입니다.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "알림 뮤트",
"account.mute_short": "뮤트",
"account.muted": "뮤트됨",
- "account.mutual": "맞팔로우 중",
+ "account.muting": "뮤트함",
+ "account.mutual": "맞팔로우 중입니다",
"account.no_bio": "제공된 설명이 없습니다.",
"account.open_original_page": "원본 페이지 열기",
"account.posts": "게시물",
"account.posts_with_replies": "게시물과 답장",
+ "account.remove_from_followers": "팔로워에서 {name} 제거",
"account.report": "@{name} 신고",
"account.requested": "승인 대기 중. 클릭해서 취소하기",
"account.requested_follow": "{name} 님이 팔로우 요청을 보냈습니다",
+ "account.requests_to_follow_you": "팔로우 요청",
"account.share": "@{name}의 프로필 공유",
"account.show_reblogs": "@{name}의 부스트 보기",
"account.statuses_counter": "{count, plural, other {게시물 {counter}개}}",
@@ -222,13 +233,16 @@
"confirmations.logout.message": "정말로 로그아웃 하시겠습니까?",
"confirmations.logout.title": "로그아웃 할까요?",
"confirmations.missing_alt_text.confirm": "대체 텍스트 추가",
- "confirmations.missing_alt_text.message": "대체 텍스트가 없는 미디어를 포함하고 있습니다. 설명을 추가하면 더 많은 사람들이 내 콘텐츠에 접근할 수 있습니다.",
+ "confirmations.missing_alt_text.message": "대체 텍스트가 없는 미디어를 포함하고 있습니다. 설명을 추가하면 더 많은 사람들이 내 콘텐츠에 접근할 수 있습니다. ",
"confirmations.missing_alt_text.secondary": "그냥 게시하기",
- "confirmations.missing_alt_text.title": "대체 텍스트를 추가할까요?",
+ "confirmations.missing_alt_text.title": "대체 텍스트를 추가할까요? ",
"confirmations.mute.confirm": "뮤트",
"confirmations.redraft.confirm": "삭제하고 다시 쓰기",
"confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
"confirmations.redraft.title": "삭제하고 다시 작성할까요?",
+ "confirmations.remove_from_followers.confirm": "팔로워 제거",
+ "confirmations.remove_from_followers.message": "{name} 님이 나를 팔로우하지 않게 됩니다. 계속할까요?",
+ "confirmations.remove_from_followers.title": "팔로워를 제거할까요?",
"confirmations.reply.confirm": "답글",
"confirmations.reply.message": "지금 답장하면 작성 중인 메시지를 덮어쓰게 됩니다. 정말 진행합니까?",
"confirmations.reply.title": "게시물을 덮어쓸까요?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "검색 결과",
"emoji_button.symbols": "기호",
"emoji_button.travel": "여행과 장소",
- "empty_column.account_featured": "목록이 비어있습니다",
+ "empty_column.account_featured.me": "아직 아무 것도 추천하지 않았습니다. 자주 사용하는 해시태그, 친구의 계정까지 내 계정에서 추천할 수 있다는 것을 알고 계셨나요?",
+ "empty_column.account_featured.other": "{acct} 님은 아직 아무 것도 추천하지 않았습니다. 자주 사용하는 해시태그, 친구의 계정까지 내 계정에서 추천할 수 있다는 것을 알고 계셨나요?",
+ "empty_column.account_featured_other.unknown": "이 계정은 아직 아무 것도 추천하지 않았습니다.",
"empty_column.account_hides_collections": "이 사용자는 이 정보를 사용할 수 없도록 설정했습니다",
"empty_column.account_suspended": "계정 정지됨",
"empty_column.account_timeline": "이곳에는 게시물이 없습니다!",
@@ -329,6 +345,11 @@
"explore.trending_links": "소식",
"explore.trending_statuses": "게시물",
"explore.trending_tags": "해시태그",
+ "featured_carousel.header": "{count, plural, other {고정된 게시물}}",
+ "featured_carousel.next": "다음",
+ "featured_carousel.post": "게시물",
+ "featured_carousel.previous": "이전",
+ "featured_carousel.slide": "{total} 중 {index}",
"filter_modal.added.context_mismatch_explanation": "이 필터 카테고리는 당신이 이 게시물에 접근한 문맥에 적용되지 않습니다. 만약 이 문맥에서도 필터되길 원한다면, 필터를 수정해야 합니다.",
"filter_modal.added.context_mismatch_title": "문맥 불일치!",
"filter_modal.added.expired_explanation": "이 필터 카테고리는 만료되었습니다, 적용하려면 만료 일자를 변경할 필요가 있습니다.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, other {참여자 {counter}명}}",
"hashtag.counter_by_uses": "{count, plural, other {게시물 {counter}개}}",
"hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}",
+ "hashtag.feature": "프로필에 추천하기",
"hashtag.follow": "해시태그 팔로우",
"hashtag.mute": "#{hashtag} 뮤트",
+ "hashtag.unfeature": "프로필에 추천하지 않기",
"hashtag.unfollow": "해시태그 팔로우 해제",
"hashtags.and_other": "…및 {count, plural,other {#개}}",
"hints.profiles.followers_may_be_missing": "이 프로필의 팔로워 목록은 일부 누락되었을 수 있습니다.",
@@ -426,7 +449,7 @@
"ignore_notifications_modal.not_following_title": "내가 팔로우하지 않는 사람들의 알림을 무시할까요?",
"ignore_notifications_modal.private_mentions_title": "요청하지 않은 개인 멘션 알림을 무시할까요?",
"info_button.label": "도움말",
- "info_button.what_is_alt_text": "대체 텍스트가 무었인가요? 대체 텍스트는 저시력자, 낮은 인터넷 대역폭 사용자, 더 자세한 문맥을 위해 이미지에 대한 설명을 제공하는 것입니다.
깔끔하고 간결하고 객관적인 대체 텍스트를 작성해 모두가 이해하기 쉽게 만들고 접근성이 높아질 수 있습니다.
중요한 요소에 중점을 두세요 이미지 안의 글자를 요약하세요 정형화된 문장 구조를 사용하세요 중복된 정보를 피하세요 복잡한 시각자료(도표나 지도 같은)에선 추세와 주요 결과에 중점을 두세요 ",
+ "info_button.what_is_alt_text": "대체 텍스트가 무엇인가요? 대체 텍스트는 저시력자, 낮은 인터넷 대역폭 사용자, 더 자세한 문맥을 위해 이미지에 대한 설명을 제공하는 것입니다.
깔끔하고 간결하고 객관적인 대체 텍스트를 작성해 모두가 이해하기 쉽게 만들고 접근성이 높아질 수 있습니다.
중요한 요소에 중점을 두세요 이미지 안의 글자를 요약하세요 정형화된 문장 구조를 사용하세요 중복된 정보를 피하세요 복잡한 시각자료(도표나 지도 같은)에선 추세와 주요 결과에 중점을 두세요 ",
"interaction_modal.action.favourite": "계속하려면 내 계정으로 즐겨찾기해야 합니다.",
"interaction_modal.action.follow": "계속하려면 내 계정으로 팔로우해야 합니다.",
"interaction_modal.action.reblog": "계속하려면 내 계정으로 리블로그해야 합니다.",
@@ -502,7 +525,6 @@
"lists.exclusive": "구성원을 홈에서 숨기기",
"lists.exclusive_hint": "누군가가 이 리스트에 있으면 홈 피드에서는 숨겨 게시물을 두 번 보는 것을 방지합니다.",
"lists.find_users_to_add": "추가할 사용자 검색",
- "lists.list_members": "리스트 구성원",
"lists.list_members_count": "{count, plural, other {# 명}}",
"lists.list_name": "리스트 이름",
"lists.new_list_name": "새 리스트 이름",
@@ -746,12 +768,12 @@
"report.comment.title": "우리가 더 알아야 할 내용이 있나요?",
"report.forward": "{target}에 전달",
"report.forward_hint": "이 계정은 다른 서버에 있습니다. 익명화 된 사본을 해당 서버에도 전송할까요?",
- "report.mute": "침묵",
+ "report.mute": "뮤트",
"report.mute_explanation": "당신은 해당 계정의 게시물을 보지 않게 됩니다. 해당 계정은 여전히 당신을 팔로우 하거나 당신의 게시물을 볼 수 있으며 해당 계정은 자신이 뮤트 되었는지 알지 못합니다.",
"report.next": "다음",
- "report.placeholder": "코멘트",
+ "report.placeholder": "추가 정보 입력",
"report.reasons.dislike": "마음에 안 듭니다",
- "report.reasons.dislike_description": "내가 보기 싫은 종류에 속합니다",
+ "report.reasons.dislike_description": "원치 않는 게시물입니다",
"report.reasons.legal": "불법입니다",
"report.reasons.legal_description": "내 서버가 속한 국가의 법률을 위반한다고 생각합니다",
"report.reasons.other": "기타",
@@ -836,19 +858,25 @@
"status.favourite": "좋아요",
"status.favourites": "{count, plural, other {좋아요}}",
"status.filter": "이 게시물을 필터",
- "status.history.created": "{name} 님이 {date}에 처음 게시함",
+ "status.history.created": "{name} 님이 {date}에 게시함",
"status.history.edited": "{name} 님이 {date}에 수정함",
- "status.load_more": "더 보기",
+ "status.load_more": "더보기",
"status.media.open": "클릭하여 열기",
"status.media.show": "클릭하여 보기",
"status.media_hidden": "미디어 숨겨짐",
"status.mention": "@{name} 님에게 멘션",
"status.more": "자세히",
"status.mute": "@{name} 뮤트",
- "status.mute_conversation": "이 대화를 뮤트",
+ "status.mute_conversation": "대화 뮤트",
"status.open": "상세 정보 표시",
"status.pin": "고정",
- "status.pinned": "고정된 게시물",
+ "status.quote_error.filtered": "필터에 의해 가려짐",
+ "status.quote_error.not_found": "이 게시물은 표시할 수 없습니다.",
+ "status.quote_error.pending_approval": "이 게시물은 원작자의 승인을 기다리고 있습니다.",
+ "status.quote_error.rejected": "이 게시물은 원작자가 인용을 허용하지 않았기 때문에 표시할 수 없습니다.",
+ "status.quote_error.removed": "이 게시물은 작성자에 의해 삭제되었습니다.",
+ "status.quote_error.unauthorized": "이 게시물은 권한이 없기 때문에 볼 수 없습니다.",
+ "status.quote_post_author": "{name} 님의 게시물",
"status.read_more": "더 보기",
"status.reblog": "부스트",
"status.reblog_private": "원래의 수신자들에게 부스트",
@@ -890,9 +918,9 @@
"trends.counter_by_accounts": "이전 {days}일 동안 {counter} 명의 사용자",
"trends.trending_now": "지금 유행 중",
"ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}B",
- "units.short.thousand": "{count}K",
+ "units.short.billion": "{count}십억",
+ "units.short.million": "{count}백만",
+ "units.short.thousand": "{count}천",
"upload_area.title": "드래그 & 드롭으로 업로드",
"upload_button.label": "이미지, 영상, 오디오 파일 추가",
"upload_error.limit": "파일 업로드 제한에 도달했습니다.",
@@ -905,7 +933,7 @@
"upload_form.edit": "수정",
"upload_progress.label": "업로드 중...",
"upload_progress.processing": "처리 중...",
- "username.taken": "이미 쓰인 사용자명입니다. 다른 것으로 시도해보세요",
+ "username.taken": "이미 사용중인 사용자명입니다. 다시 시도해보세요",
"video.close": "동영상 닫기",
"video.download": "파일 다운로드",
"video.exit_fullscreen": "전체화면 나가기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 23ee9fc932..9d4f7eaa17 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -23,7 +23,6 @@
"account.copy": "Girêdanê bo profîlê jê bigire",
"account.direct": "Bi taybetî qale @{name} bike",
"account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
- "account.domain_blocked": "Navper hate astengkirin",
"account.edit_profile": "Profîlê serrast bike",
"account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
"account.endorse": "Taybetiyên li ser profîl",
@@ -37,6 +36,7 @@
"account.following": "Dişopîne",
"account.following_counter": "{count, plural, one {{counter} dişopîne} other {{counter} dişopîne}}",
"account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.",
+ "account.follows_you": "Te dişopîne",
"account.go_to_profile": "Biçe bo profîlê",
"account.hide_reblogs": "Bilindkirinên ji @{name} veşêre",
"account.in_memoriam": "Di bîranînê de.",
@@ -51,7 +51,8 @@
"account.mute_notifications_short": "Agahdariyan bêdeng bike",
"account.mute_short": "Bêdeng bike",
"account.muted": "Bêdengkirî",
- "account.mutual": "Hevpar",
+ "account.muting": "Bêdengkirin",
+ "account.mutual": "Hûn hevdû dişopînin",
"account.no_bio": "Ti danasîn nehatiye tevlîkirin.",
"account.open_original_page": "Rûpela resen veke",
"account.posts": "Şandî",
@@ -64,6 +65,7 @@
"account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}",
"account.unblock": "Astengê li ser @{name} rake",
"account.unblock_domain": "Astengê li ser navperê {domain} rake",
+ "account.unblock_domain_short": "Astengiyê rake",
"account.unblock_short": "Astengiyê rake",
"account.unendorse": "Li ser profîl nîşan neke",
"account.unfollow": "Neşopîne",
@@ -86,6 +88,7 @@
"announcement.announcement": "Daxuyanî",
"annual_report.summary.followers.followers": "şopîner",
"annual_report.summary.followers.total": "{count} tevahî",
+ "annual_report.summary.most_used_hashtag.none": "Ne yek",
"annual_report.summary.new_posts.new_posts": "şandiyên nû",
"attachments_list.unprocessed": "(bêpêvajo)",
"audio.hide": "Dengê veşêre",
@@ -113,9 +116,10 @@
"column.blocks": "Bikarhênerên astengkirî",
"column.bookmarks": "Şûnpel",
"column.community": "Demnameya herêmî",
- "column.direct": "Qalkirinên taybet",
+ "column.direct": "Payemên taybet",
"column.directory": "Li profîlan bigere",
"column.domain_blocks": "Navperên astengkirî",
+ "column.firehose": "Rojevên zindî",
"column.follow_requests": "Daxwazên şopandinê",
"column.home": "Rûpela sereke",
"column.lists": "Lîste",
@@ -130,6 +134,7 @@
"column_header.pin": "Bi derzî bike",
"column_header.show_settings": "Sazkariyan nîşan bide",
"column_header.unpin": "Bi derzî neke",
+ "column_search.cancel": "Têk bibe",
"column_subheading.settings": "Sazkarî",
"community.column_settings.local_only": "Tenê herêmî",
"community.column_settings.media_only": "Tenê media",
@@ -145,13 +150,18 @@
"compose_form.poll.duration": "Dema rapirsî yê",
"compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
"compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
+ "compose_form.poll.type": "Şêwaz",
+ "compose_form.publish": "Şandî",
"compose_form.publish_form": "Biweşîne",
+ "compose_form.reply": "Bersivê bide",
+ "compose_form.save_changes": "Rojane bike",
"compose_form.spoiler.marked": "Hişyariya naverokê rake",
"compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
"confirmation_modal.cancel": "Dev jê berde",
"confirmations.block.confirm": "Asteng bike",
"confirmations.delete.confirm": "Jê bibe",
"confirmations.delete.message": "Ma tu dixwazî vê şandiyê jê bibî?",
+ "confirmations.delete.title": "Şandiyê jê bibe?",
"confirmations.delete_list.confirm": "Jê bibe",
"confirmations.delete_list.message": "Tu ji dil dixwazî vê lîsteyê bi awayekî mayînde jê bibî?",
"confirmations.discard_edit_media.confirm": "Biavêje",
@@ -241,14 +251,18 @@
"filter_modal.select_filter.subtitle": "Beşeke nû ya heyî bi kar bîne an jî yekî nû biafirîne",
"filter_modal.select_filter.title": "Vê şandiyê parzûn bike",
"filter_modal.title.status": "Şandiyekê parzûn bike",
+ "firehose.all": "Tevahî",
+ "firehose.local": "Ev rajekar",
+ "firehose.remote": "Rajekarên din",
"follow_request.authorize": "Mafê bide",
"follow_request.reject": "Nepejirîne",
"follow_requests.unlocked_explanation": "Tevlî ku ajimêra te ne kilît kiriye, karmendên {domain} digotin qey tu dixwazî ku pêşdîtina daxwazên şopandinê bi destan bike.",
+ "follow_suggestions.view_all": "Tevahiyan nîşan bide",
"footer.about": "Derbar",
"footer.directory": "Pelrêça profîlan",
- "footer.get_app": "Bernamokê bistîne",
+ "footer.get_app": "Bernameyê bistîne",
"footer.keyboard_shortcuts": "Kurteriyên klavyeyê",
- "footer.privacy_policy": "Peymana nepeniyê",
+ "footer.privacy_policy": "Politîka taybetiyê",
"footer.source_code": "Koda çavkanî nîşan bide",
"footer.status": "Rewş",
"generic.saved": "Tomarkirî",
@@ -264,6 +278,7 @@
"hashtag.column_settings.tag_toggle": "Ji bo vê stûnê hin pêvekan tevlî bike",
"hashtag.follow": "Hashtagê bişopîne",
"hashtag.unfollow": "Hashtagê neşopîne",
+ "hints.threads.replies_may_be_missing": "Beriv ji rajekarên din dibe ku wendayî bin.",
"home.column_settings.show_reblogs": "Bilindkirinan nîşan bike",
"home.column_settings.show_replies": "Bersivan nîşan bide",
"home.hide_announcements": "Reklaman veşêre",
@@ -282,7 +297,7 @@
"keyboard_shortcuts.column": "Stûna balkişandinê",
"keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
"keyboard_shortcuts.description": "Danasîn",
- "keyboard_shortcuts.direct": "ji bo vekirina stûna qalkirinên taybet",
+ "keyboard_shortcuts.direct": "ji bo vekirina stûna payemên taybet",
"keyboard_shortcuts.down": "Di lîsteyê de dakêşe jêr",
"keyboard_shortcuts.enter": "Şandiyê veke",
"keyboard_shortcuts.federated": "Demnameya giştî veke",
@@ -319,13 +334,14 @@
"lists.replies_policy.list": "Endamên lîsteyê",
"lists.replies_policy.none": "Ne yek",
"load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}",
+ "media_gallery.hide": "Veşêre",
"moved_to_account_banner.text": "Ajimêrê te {disabledAccount} niha neçalak e ji ber ku te bar kir bo {movedToAccount}.",
"navigation_bar.about": "Derbar",
"navigation_bar.blocks": "Bikarhênerên astengkirî",
"navigation_bar.bookmarks": "Şûnpel",
"navigation_bar.community_timeline": "Demnameya herêmî",
"navigation_bar.compose": "Şandiyeke nû binivsîne",
- "navigation_bar.direct": "Qalkirinên taybet",
+ "navigation_bar.direct": "Payemên taybet",
"navigation_bar.discover": "Vekolê",
"navigation_bar.domain_blocks": "Navperên astengkirî",
"navigation_bar.explore": "Vekole",
@@ -356,9 +372,10 @@
"notifications.column_settings.admin.report": "Ragihandinên nû:",
"notifications.column_settings.admin.sign_up": "Tomarkirinên nû:",
"notifications.column_settings.alert": "Agahdariyên sermaseyê",
+ "notifications.column_settings.filter_bar.advanced": "Hemû beşan nîşan bide",
"notifications.column_settings.follow": "Şopînerên nû:",
"notifications.column_settings.follow_request": "Daxwazên şopandinê nû:",
- "notifications.column_settings.mention": "Qalkirin:",
+ "notifications.column_settings.mention": "Gotin:",
"notifications.column_settings.poll": "Encamên rapirsiyê:",
"notifications.column_settings.push": "Agahdarîyên yekser",
"notifications.column_settings.reblog": "Bilindkirî:",
@@ -371,7 +388,7 @@
"notifications.filter.all": "Hemû",
"notifications.filter.boosts": "Bilindkirî",
"notifications.filter.follows": "Dişopîne",
- "notifications.filter.mentions": "Qalkirin",
+ "notifications.filter.mentions": "Gotin",
"notifications.filter.polls": "Encamên rapirsiyê",
"notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
"notifications.grant_permission": "Destûrê bide.",
@@ -393,7 +410,10 @@
"poll.votes": "{votes, plural, one {# deng} other {# deng}}",
"poll_button.add_poll": "Rapirsîyek zêde bike",
"poll_button.remove_poll": "Rapirsî yê rake",
- "privacy.change": "Nepênîtiya şandiyan biguherîne",
+ "privacy.change": "Taybetiya şandiyê biguherîne",
+ "privacy.direct.short": "Payemên taybet",
+ "privacy.private.long": "Tenê şopînerên te",
+ "privacy.private.short": "Şopîner",
"privacy.public.short": "Gelemperî",
"privacy_policy.last_updated": "Rojanekirina dawî {date}",
"privacy_policy.title": "Politîka taybetiyê",
@@ -468,10 +488,11 @@
"search_results.statuses": "Şandî",
"server_banner.about_active_users": "Kesên ku di van 30 rojên dawî de vê rajekarê bi kar tînin (Bikarhênerên Çalak ên Mehane)",
"server_banner.active_users": "bikarhênerên çalak",
- "server_banner.administered_by": "Tê bi rêvebirin ji aliyê:",
+ "server_banner.administered_by": "Tê birêvebirin ji aliyê:",
"server_banner.server_stats": "Amarên rajekar:",
"sign_in_banner.create_account": "Ajimêr biafirîne",
"sign_in_banner.sign_in": "Têkeve",
+ "sign_in_banner.sso_redirect": "Têkeve yan tomar bibe",
"status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
"status.admin_domain": "Navrûya bikarhêneriyê ji bo {domain} veke",
"status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
@@ -483,7 +504,7 @@
"status.delete": "Jê bibe",
"status.detailed_status": "Dîtina axaftina berfireh",
"status.direct": "Bi taybetî qale @{name} bike",
- "status.direct_indicator": "Qalkirinê taybet",
+ "status.direct_indicator": "Payemên taybet",
"status.edit": "Serrast bike",
"status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
"status.filter": "Vê şandiyê parzûn bike",
@@ -497,7 +518,6 @@
"status.mute_conversation": "Axaftinê bêdeng bike",
"status.open": "Vê şandiyê berferh bike",
"status.pin": "Li ser profîlê derzî bike",
- "status.pinned": "Şandiya derzîkirî",
"status.read_more": "Bêtir bixwîne",
"status.reblog": "Bilind bike",
"status.reblog_private": "Bi dîtina resen bilind bike",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 2cd7a3eb0e..b0b44f1684 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -8,7 +8,6 @@
"account.blocked": "Lettys",
"account.cancel_follow_request": "Withdraw follow request",
"account.disable_notifications": "Hedhi ow gwarnya pan wra @{name} postya",
- "account.domain_blocked": "Gorfarth lettys",
"account.edit_profile": "Golegi profil",
"account.enable_notifications": "Gwra ow gwarnya pan wra @{name} postya",
"account.endorse": "Diskwedhes yn profil",
@@ -296,7 +295,6 @@
"status.mute_conversation": "Tawhe kesklapp",
"status.open": "Efani'n post ma",
"status.pin": "Fastya yn profil",
- "status.pinned": "Postow fastys",
"status.read_more": "Redya moy",
"status.reblog": "Kenertha",
"status.reblog_private": "Kenertha gans gweladewder derowel",
diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json
index c6e5d85c07..5e221e614c 100644
--- a/app/javascript/mastodon/locales/la.json
+++ b/app/javascript/mastodon/locales/la.json
@@ -19,10 +19,27 @@
"account.block_domain": "Imperire dominium {domain}",
"account.block_short": "Imperire",
"account.blocked": "Impeditum est",
+ "account.blocking": "Clausus",
"account.cancel_follow_request": "Petitio sequī retrāhere",
- "account.domain_blocked": "Dominium impeditum",
+ "account.copy": "Transcribo connexi ut catagraphum",
+ "account.direct": "Callim loqui @{name}",
+ "account.disable_notifications": "Desine me certiorem facere cum @{name} scribit",
+ "account.domain_blocking": "Domenium obstructum",
"account.edit_profile": "Recolere notionem",
+ "account.enable_notifications": "Desine me certiorem facere cum @{name} scribit",
+ "account.endorse": "Notatio in profilo",
+ "account.familiar_followers_many": "Secuti sunt {name1}, {name2}, et {othersCount, plural, one {alius quem nosti} other {# alii quos nosti}}",
+ "account.familiar_followers_one": "Sequitur {name1}",
+ "account.familiar_followers_two": "Sequitur {name1} et {name2}",
+ "account.featured": "Praeclara",
+ "account.featured.accounts": "Profilia",
+ "account.featured.hashtags": "Hashtags",
+ "account.featured_tags.last_status_at": "Ultimum nuntium die {date}",
"account.featured_tags.last_status_never": "Nulla contributa",
+ "account.follow": "Sequere",
+ "account.follow_back": "Sequere retro",
+ "account.followers": "Sectatores",
+ "account.followers.empty": "Nemo hunc usorem adhuc sequitur.",
"account.followers_counter": "{count, plural, one {{counter} sectator} other {{counter} sectatores}}",
"account.following_counter": "{count, plural, one {{counter} sectans} other {{counter} sectans}}",
"account.moved_to": "{name} significavit eum suam rationem novam nunc esse:",
diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json
index f67ef676ad..62b27c5dfb 100644
--- a/app/javascript/mastodon/locales/lad.json
+++ b/app/javascript/mastodon/locales/lad.json
@@ -19,14 +19,16 @@
"account.block_domain": "Bloka el domeno {domain}",
"account.block_short": "Bloka",
"account.blocked": "Blokado",
+ "account.blocking": "Blokando",
"account.cancel_follow_request": "Anula solisitud de segir",
"account.copy": "Kopia atadijo de profil",
"account.direct": "Enmenta a @{name} en privado",
"account.disable_notifications": "Desha de avizarme sovre publikasyones de @{name}",
- "account.domain_blocked": "Domeno blokado",
+ "account.domain_blocking": "Blokando el domeno",
"account.edit_profile": "Edita profil",
"account.enable_notifications": "Avizame kuando @{name} publike",
"account.endorse": "Avalia en profil",
+ "account.featured.hashtags": "Etiketas",
"account.featured_tags.last_status_at": "Ultima publikasyon de {date}",
"account.featured_tags.last_status_never": "No ay publikasyones",
"account.follow": "Sige",
@@ -37,6 +39,7 @@
"account.following": "Sigiendo",
"account.following_counter": "{count, plural, other {Sigiendo a {counter}}}",
"account.follows.empty": "Este utilizador ainda no sige a dingun.",
+ "account.follows_you": "Te sige",
"account.go_to_profile": "Va al profil",
"account.hide_reblogs": "Eskonde repartajasyones de @{name}",
"account.in_memoriam": "De bendicha memoria.",
@@ -51,7 +54,7 @@
"account.mute_notifications_short": "Silensia avizos",
"account.mute_short": "Silensia",
"account.muted": "Silensiado",
- "account.mutual": "Mutual",
+ "account.muting": "Silensyando",
"account.no_bio": "No ay deskripsion.",
"account.open_original_page": "Avre pajina orijnala",
"account.posts": "Publikasyones",
@@ -59,6 +62,7 @@
"account.report": "Raporta @{name}",
"account.requested": "Asperando achetasion. Klika para anular la solisitud de segimiento",
"account.requested_follow": "{name} tiene solisitado segirte",
+ "account.requests_to_follow_you": "Solisita segirte",
"account.share": "Partaja el profil de @{name}",
"account.show_reblogs": "Amostra repartajasyones de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}",
@@ -729,7 +733,6 @@
"status.mute_conversation": "Silensia konversasyon",
"status.open": "Espande publikasyon",
"status.pin": "Fiksa en profil",
- "status.pinned": "Publikasyon fiksada",
"status.read_more": "Melda mas",
"status.reblog": "Repartaja",
"status.reblog_private": "Repartaja kon vizibilita orijinala",
diff --git a/app/javascript/mastodon/locales/load_locale.ts b/app/javascript/mastodon/locales/load_locale.ts
index d21675b179..94c7db1141 100644
--- a/app/javascript/mastodon/locales/load_locale.ts
+++ b/app/javascript/mastodon/locales/load_locale.ts
@@ -5,6 +5,10 @@ import { isLocaleLoaded, setLocale } from './global_locale';
const localeLoadingSemaphore = new Semaphore(1);
+const localeFiles = import.meta.glob<{ default: LocaleData['messages'] }>([
+ './*.json',
+]);
+
export async function loadLocale() {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- we want to match empty strings
const locale = document.querySelector('html')?.lang || 'en';
@@ -17,13 +21,14 @@ export async function loadLocale() {
// if the locale is already set, then do nothing
if (isLocaleLoaded()) return;
- const localeData = (await import(
- /* webpackMode: "lazy" */
- /* webpackChunkName: "locale/[request]" */
- /* webpackInclude: /\.json$/ */
- /* webpackPreload: true */
- `mastodon/locales/${locale}.json`
- )) as LocaleData['messages'];
+ // If there is no locale file, then fallback to english
+ const localeFile = Object.hasOwn(localeFiles, `./${locale}.json`)
+ ? localeFiles[`./${locale}.json`]
+ : localeFiles['./en.json'];
+
+ if (!localeFile) throw new Error('Could not load the locale JSON file');
+
+ const { default: localeData } = await localeFile();
setLocale({ messages: localeData, locale });
});
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 7110e809c1..22594fd895 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -19,14 +19,18 @@
"account.block_domain": "Blokuoti serverį {domain}",
"account.block_short": "Blokuoti",
"account.blocked": "Užblokuota",
+ "account.blocking": "Blokavimas",
"account.cancel_follow_request": "Atšaukti sekimą",
"account.copy": "Kopijuoti nuorodą į profilį",
"account.direct": "Privačiai paminėti @{name}",
"account.disable_notifications": "Nustoti man pranešti, kai @{name} paskelbia",
- "account.domain_blocked": "Užblokuotas serveris",
+ "account.domain_blocking": "Blokuoti domeną",
"account.edit_profile": "Redaguoti profilį",
"account.enable_notifications": "Pranešti man, kai @{name} paskelbia",
"account.endorse": "Rodyti profilyje",
+ "account.featured": "Rodomi",
+ "account.featured.accounts": "Profiliai",
+ "account.featured.hashtags": "Saitažodžiai",
"account.featured_tags.last_status_at": "Paskutinis įrašas {date}",
"account.featured_tags.last_status_never": "Nėra įrašų",
"account.follow": "Sekti",
@@ -37,6 +41,7 @@
"account.following": "Sekama",
"account.following_counter": "{count, plural, one {{counter} sekimas} few {{counter} sekimai} many {{counter} sekimo} other {{counter} sekimų}}",
"account.follows.empty": "Šis naudotojas dar nieko neseka.",
+ "account.follows_you": "Seka tave",
"account.go_to_profile": "Eiti į profilį",
"account.hide_reblogs": "Slėpti pasidalinimus iš @{name}",
"account.in_memoriam": "Atminimui.",
@@ -51,19 +56,23 @@
"account.mute_notifications_short": "Nutildyti pranešimus",
"account.mute_short": "Nutildyti",
"account.muted": "Nutildytas",
- "account.mutual": "Bendri",
+ "account.muting": "Užtildymas",
+ "account.mutual": "Jūs sekate vienas kitą",
"account.no_bio": "Nėra pateikto aprašymo.",
"account.open_original_page": "Atidaryti originalų puslapį",
"account.posts": "Įrašai",
"account.posts_with_replies": "Įrašai ir atsakymai",
+ "account.remove_from_followers": "Šalinti {name} iš sekėjų",
"account.report": "Pranešti apie @{name}",
"account.requested": "Laukiama patvirtinimo. Spustelėk, kad atšauktum sekimo prašymą",
"account.requested_follow": "{name} paprašė tave sekti",
+ "account.requests_to_follow_you": "Prašymai sekti jus",
"account.share": "Bendrinti @{name} profilį",
"account.show_reblogs": "Rodyti pasidalinimus iš @{name}",
"account.statuses_counter": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}}",
"account.unblock": "Atblokuoti @{name}",
"account.unblock_domain": "Atblokuoti serverį {domain}",
+ "account.unblock_domain_short": "Atblokuoti",
"account.unblock_short": "Atblokuoti",
"account.unendorse": "Nerodyti profilyje",
"account.unfollow": "Nebesekti",
@@ -225,6 +234,9 @@
"confirmations.redraft.confirm": "Ištrinti ir iš naujo parengti",
"confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo? Bus prarasti mėgstami ir pasidalinimai, o atsakymai į originalų įrašą bus panaikinti.",
"confirmations.redraft.title": "Ištrinti ir iš naujo parengti įrašą?",
+ "confirmations.remove_from_followers.confirm": "Šalinti sekėją",
+ "confirmations.remove_from_followers.message": "{name} nustos jus sekti. Ar tikrai norite tęsti?",
+ "confirmations.remove_from_followers.title": "Šalinti sekėją?",
"confirmations.reply.confirm": "Atsakyti",
"confirmations.reply.message": "Atsakant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?",
"confirmations.reply.title": "Perrašyti įrašą?",
@@ -249,6 +261,7 @@
"disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta.",
"dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai iš žmonių, kurių paskyros talpinamos {domain}.",
"dismissable_banner.dismiss": "Atmesti",
+ "dismissable_banner.explore_links": "Šiomis naujienų istorijomis šiandien \"Fediverse\" dalijamasi dažniausiai. Naujesnės istorijos, kurias paskelbė daugiau skirtingų žmonių, užima aukštesnę vietą.",
"domain_block_modal.block": "Blokuoti serverį",
"domain_block_modal.block_account_instead": "Blokuoti @{name} vietoj to",
"domain_block_modal.they_can_interact_with_old_posts": "Žmonės iš šio serverio gali bendrauti su tavo senomis įrašomis.",
@@ -455,7 +468,7 @@
"keyboard_shortcuts.my_profile": "Atidaryti savo profilį",
"keyboard_shortcuts.notifications": "Atidaryti pranešimų stulpelį",
"keyboard_shortcuts.open_media": "Atidaryti mediją",
- "keyboard_shortcuts.pinned": "Atidaryti prisegtų įrašų sąrašą",
+ "keyboard_shortcuts.pinned": "Atverti prisegtų įrašų sąrašą",
"keyboard_shortcuts.profile": "Atidaryti autoriaus (-ės) profilį",
"keyboard_shortcuts.reply": "Atsakyti į įrašą",
"keyboard_shortcuts.requests": "Atidaryti sekimo prašymų sąrašą",
@@ -490,7 +503,6 @@
"lists.exclusive": "Slėpti narius pagrindiniame",
"lists.exclusive_hint": "Jei kas nors yra šiame sąraše, paslėpkite juos pagrindinio srauto laiko skalėje, kad nematytumėte jų įrašus dukart.",
"lists.find_users_to_add": "Raskite naudotojų, kurių pridėti",
- "lists.list_members": "Sąrašo nariai",
"lists.list_members_count": "{count, plural, one {# narys} few {# nariai} many {# nario} other {# narių}}",
"lists.list_name": "Sąrašo pavadinimas",
"lists.new_list_name": "Naujas sąrašo pavadinimas",
@@ -826,7 +838,6 @@
"status.mute_conversation": "Nutildyti pokalbį",
"status.open": "Išplėsti šį įrašą",
"status.pin": "Prisegti prie profilio",
- "status.pinned": "Prisegtas įrašas",
"status.read_more": "Skaityti daugiau",
"status.reblog": "Pakelti",
"status.reblog_private": "Pakelti su originaliu matomumu",
@@ -889,6 +900,8 @@
"video.expand": "Išplėsti vaizdo įrašą",
"video.fullscreen": "Visas ekranas",
"video.hide": "Slėpti vaizdo įrašą",
+ "video.mute": "Išjungti garsą",
"video.pause": "Pristabdyti",
- "video.play": "Leisti"
+ "video.play": "Leisti",
+ "video.skip_backward": "Praleisti atgal"
}
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 27760c59ff..3492d83cfa 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -6,10 +6,10 @@
"about.domain_blocks.preamble": "Mastodon parasti ļauj apskatīt saturu un mijiedarboties ar lietotājiem no jebkura cita fediversa servera. Šie ir izņēmumi, kas veikti tieši šajā serverī.",
"about.domain_blocks.silenced.explanation": "Parasti tu neredzēsi profilus un saturu no šī servera, ja vien tu nepārprotami izvēlēsies to pārskatīt vai sekot.",
"about.domain_blocks.silenced.title": "Ierobežotie",
- "about.domain_blocks.suspended.explanation": "Nekādi dati no šī servera netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu mijiedarbību vai saziņu ar lietotājiem no šī servera.",
+ "about.domain_blocks.suspended.explanation": "Nekādi dati no šī servera netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu jebkādu mijiedarbību vai saziņu ar šī servera lietotājiem.",
"about.domain_blocks.suspended.title": "Apturētie",
"about.not_available": "Šī informācija nav padarīta pieejama šajā serverī.",
- "about.powered_by": "Decentralizētu sociālo tīklu nodrošina {mastodon}",
+ "about.powered_by": "Decentralizētu sabiedrisko tīklu darbina {mastodon}",
"about.rules": "Servera noteikumi",
"account.account_note_header": "Personīga piezīme",
"account.add_or_remove_from_list": "Pievienot vai Noņemt no sarakstiem",
@@ -19,24 +19,33 @@
"account.block_domain": "Bloķēt domēnu {domain}",
"account.block_short": "Bloķēt",
"account.blocked": "Bloķēts",
+ "account.blocking": "Bloķēts",
"account.cancel_follow_request": "Atsaukt sekošanas pieprasījumu",
"account.copy": "Ievietot saiti uz profilu starpliktuvē",
"account.direct": "Pieminēt @{name} privāti",
- "account.disable_notifications": "Pārtraukt man paziņot, kad @{name} publicē ierakstu",
- "account.domain_blocked": "Domēns ir bloķēts",
+ "account.disable_notifications": "Pārtraukt man paziņot, kad @{name} izveido ierakstu",
+ "account.domain_blocking": "Bloķēts domēns",
"account.edit_profile": "Labot profilu",
- "account.enable_notifications": "Paziņot man, kad @{name} publicē ierakstu",
+ "account.enable_notifications": "Paziņot man, kad @{name} izveido ierakstu",
"account.endorse": "Izcelts profilā",
- "account.featured_tags.last_status_at": "Beidzamā ziņa {date}",
- "account.featured_tags.last_status_never": "Ierakstu nav",
+ "account.familiar_followers_many": "Kam seko {name1}, {name2}, un {othersCount, plural, zero {pārējie # jums pazīstami} one {vēl viens jums pazīstams} other {pārējie # jums pazīstami}}",
+ "account.familiar_followers_one": "Kam seko {name1}",
+ "account.familiar_followers_two": "Kam seko {name1} un {name2}",
+ "account.featured": "Izcelts",
+ "account.featured.accounts": "Profili",
+ "account.featured.hashtags": "Tēmturi",
+ "account.featured_tags.last_status_at": "Pēdējais ieraksts {date}",
+ "account.featured_tags.last_status_never": "Nav ierakstu",
"account.follow": "Sekot",
"account.follow_back": "Sekot atpakaļ",
"account.followers": "Sekotāji",
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
"account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
+ "account.followers_you_know_counter": "{counter} jūs pazīstiet",
"account.following": "Seko",
"account.following_counter": "{count, plural, one {seko {counter}} other {seko {counter}}}",
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
+ "account.follows_you": "Seko Tev",
"account.go_to_profile": "Doties uz profilu",
"account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus",
"account.in_memoriam": "Piemiņai.",
@@ -48,27 +57,31 @@
"account.mention": "Pieminēt @{name}",
"account.moved_to": "{name} norādīja, ka viņu jaunais konts tagad ir:",
"account.mute": "Apklusināt @{name}",
- "account.mute_notifications_short": "Izslēgt paziņojumu skaņu",
+ "account.mute_notifications_short": "Apklusināt paziņojumus",
"account.mute_short": "Apklusināt",
"account.muted": "Apklusināts",
- "account.mutual": "Abpusēji",
+ "account.muting": "Apklusināts",
+ "account.mutual": "Jūs sekojat viens otram",
"account.no_bio": "Apraksts nav sniegts.",
"account.open_original_page": "Atvērt pirmavota lapu",
"account.posts": "Ieraksti",
"account.posts_with_replies": "Ieraksti un atbildes",
- "account.report": "Sūdzēties par @{name}",
+ "account.remove_from_followers": "Dzēst sekotāju {name}",
+ "account.report": "Ziņot par @{name}",
"account.requested": "Gaida apstiprinājumu. Nospied, lai atceltu sekošanas pieparasījumu",
"account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu",
+ "account.requests_to_follow_you": "Sekošanas pieprasījumi",
"account.share": "Dalīties ar @{name} profilu",
"account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus",
"account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}",
"account.unblock": "Atbloķēt @{name}",
"account.unblock_domain": "Atbloķēt domēnu {domain}",
+ "account.unblock_domain_short": "Atbloķēt",
"account.unblock_short": "Atbloķēt",
"account.unendorse": "Neizcelt profilā",
"account.unfollow": "Pārstāt sekot",
"account.unmute": "Noņemt apklusinājumu @{name}",
- "account.unmute_notifications_short": "Ieslēgt paziņojumu skaņu",
+ "account.unmute_notifications_short": "Atcelet paziņojumu apklusināšanu",
"account.unmute_short": "Noņemt apklusinājumu",
"account_note.placeholder": "Noklikšķini, lai pievienotu piezīmi",
"admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās",
@@ -85,6 +98,7 @@
"alert.unexpected.message": "Radās negaidīta kļūda.",
"alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Alt teksts",
+ "alt_text_modal.add_alt_text": "Pievienot aprakstošo tekstu",
"alt_text_modal.add_text_from_image": "Pievienot tekstu no attēla",
"alt_text_modal.cancel": "Atcelt",
"alt_text_modal.change_thumbnail": "Nomainīt sīktēlu",
@@ -92,12 +106,13 @@
"alt_text_modal.describe_for_people_with_visual_impairments": "Aprakstīt šo cilvēkiem ar redzes traucējumiem…",
"alt_text_modal.done": "Gatavs",
"announcement.announcement": "Paziņojums",
+ "annual_report.summary.archetype.lurker": "Glūņa",
"annual_report.summary.archetype.oracle": "Orākuls",
"annual_report.summary.archetype.replier": "Sabiedriskais tauriņš",
"annual_report.summary.followers.followers": "sekotāji",
"annual_report.summary.followers.total": "pavisam {count}",
"annual_report.summary.here_it_is": "Šeit ir {year}. gada pārskats:",
- "annual_report.summary.highlighted_post.by_favourites": "izlasēs visvairāk ievietotais ieraksts",
+ "annual_report.summary.highlighted_post.by_favourites": "izlasēm visvairāk pievienotais ieraksts",
"annual_report.summary.highlighted_post.by_reblogs": "vispastiprinātākais ieraksts",
"annual_report.summary.highlighted_post.by_replies": "ieraksts ar vislielāko atbilžu skaitu",
"annual_report.summary.highlighted_post.possessive": "{name}",
@@ -110,16 +125,17 @@
"annual_report.summary.thanks": "Paldies, ka esi daļa no Mastodon!",
"attachments_list.unprocessed": "(neapstrādāti)",
"audio.hide": "Slēpt audio",
- "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.",
+ "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri liegšanu var apstrādāt citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.",
"block_modal.show_less": "Rādīt mazāk",
"block_modal.show_more": "Parādīt mazāk",
"block_modal.they_cant_mention": "Nevar Tevi pieminēt vai sekot Tev.",
- "block_modal.they_cant_see_posts": "Nevar redzēt Tavus ierakstus, un Tu neredzēsi lietotāja.",
+ "block_modal.they_cant_see_posts": "Lietotajs nevarēs redzēt Tavus ierakstus, un Tu neredzēsi lietotāja.",
"block_modal.title": "Bloķēt lietotāju?",
+ "block_modal.you_wont_see_mentions": "Tu neredzēsi ierakstus, kuros ir minēts šis lietotājs.",
"boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu",
"boost_modal.reblog": "Pastiprināt ierakstu?",
"boost_modal.undo_reblog": "Atcelt ieraksta pastiprināšanu?",
- "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu",
+ "bundle_column_error.copy_stacktrace": "Ievietot kļūdu ziņojumu starpliktuvē",
"bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.",
"bundle_column_error.error.title": "Ak vai!",
"bundle_column_error.network.body": "Mēģinot ielādēt šo lapu, radās kļūda. Tas varētu būt saistīts ar īslaicīgu interneta savienojuma vai šī servera problēmu.",
@@ -144,7 +160,7 @@
"column.directory": "Pārlūkot profilus",
"column.domain_blocks": "Bloķētie domēni",
"column.edit_list": "Labot sarakstu",
- "column.favourites": "Iecienītie",
+ "column.favourites": "Izlase",
"column.firehose": "Tiešraides plūsmas",
"column.follow_requests": "Sekošanas pieprasījumi",
"column.home": "Sākums",
@@ -168,9 +184,9 @@
"community.column_settings.remote_only": "Tikai attālinātie",
"compose.language.change": "Mainīt valodu",
"compose.language.search": "Meklēt valodas...",
- "compose.published.body": "Ieraksts izveidots.",
+ "compose.published.body": "Ieraksts pievienots.",
"compose.published.open": "Atvērt",
- "compose.saved.body": "Ziņa saglabāta.",
+ "compose.saved.body": "Ieraksts saglabāts.",
"compose_form.direct_message_warning_learn_more": "Uzzināt vairāk",
"compose_form.encryption_warning": "Mastodon ieraksti nav pilnībā šifrēti. Nedalies ar jebkādu jūtīgu informāciju caur Mastodon!",
"compose_form.hashtag_warning": "Šis ieraksts netiks uzrādīts nevienā tēmturī, jo tas nav redzams visiem. Tikai visiem redzamos ierakstus var meklēt pēc tēmtura.",
@@ -194,7 +210,7 @@
"confirmation_modal.cancel": "Atcelt",
"confirmations.block.confirm": "Bloķēt",
"confirmations.delete.confirm": "Dzēst",
- "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?",
+ "confirmations.delete.message": "Vai tiešām izdzēst šo ierakstu?",
"confirmations.delete.title": "Izdzēst ierakstu?",
"confirmations.delete_list.confirm": "Dzēst",
"confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?",
@@ -207,14 +223,20 @@
"confirmations.follow_to_list.confirm": "Sekot un pievienot sarakstam",
"confirmations.follow_to_list.message": "Ir jāseko {name}, lai pievienotu sarakstam.",
"confirmations.follow_to_list.title": "Sekot lietotājam?",
- "confirmations.logout.confirm": "Iziet",
- "confirmations.logout.message": "Vai tiešām vēlies izrakstīties?",
+ "confirmations.logout.confirm": "Atteikties",
+ "confirmations.logout.message": "Vai tiešām atteikties?",
"confirmations.logout.title": "Atteikties?",
+ "confirmations.missing_alt_text.confirm": "Pievienot aprakstošo tekstu",
+ "confirmations.missing_alt_text.message": "Tavs ieraksts satur informācijas nesējus bez paskaidrojošā teksta. Aprakstu pievienošana palīdz padarīt saturu pieejamāku vairāk cilvēku.",
"confirmations.missing_alt_text.secondary": "Vienalga iesūtīt",
+ "confirmations.missing_alt_text.title": "Pievienot aprakstošo tekstu?",
"confirmations.mute.confirm": "Apklusināt",
"confirmations.redraft.confirm": "Dzēst un pārrakstīt",
"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": "Izdzēst un rakstīt ierakstu no jauna?",
+ "confirmations.remove_from_followers.confirm": "Dzēst sekotāju",
+ "confirmations.remove_from_followers.message": "{name} pārstās sekot jums. Vai tiešām vēlaties turpināt?",
+ "confirmations.remove_from_followers.title": "Vai dzēst sekotāju?",
"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.title": "Pārrakstīt ierakstu?",
@@ -230,7 +252,7 @@
"conversation.with": "Ar {names}",
"copy_icon_button.copied": "Ievietots starpliktuvē",
"copypaste.copied": "Nokopēts",
- "copypaste.copy_to_clipboard": "Kopēt uz starpliktuvi",
+ "copypaste.copy_to_clipboard": "Ievietot starpliktuvē",
"directory.federated": "No zināma fediversa",
"directory.local": "Tikai no {domain}",
"directory.new_arrivals": "Jaunpienācēji",
@@ -239,14 +261,24 @@
"disabled_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots.",
"dismissable_banner.community_timeline": "Šie ir jaunākie publiskie ieraksti no cilvēkiem, kuru konti ir mitināti {domain}.",
"dismissable_banner.dismiss": "Atcelt",
+ "dismissable_banner.explore_links": "Šie jaunumi šodien Fediversā tiek visvairāk kopīgoti. Jaunākas ziņas, kuras pievienoši vairāki dažādi cilvēki, tiek novietotas augstāk.",
+ "dismissable_banner.explore_statuses": "Šie ieraksti šodien gūst uzmanību fediversā. Jaunāki ieraksti ar vairāk pastirpinājumiem un pievienošanām izlasē tiek kārtoti augstāk.",
+ "dismissable_banner.public_timeline": "Šie ir jaunākie Fediverse lietotāju publiskie ieraksti, kuriem {domain} seko cilvēki.",
"domain_block_modal.block": "Bloķēt serveri",
"domain_block_modal.block_account_instead": "Tā vietā liegt @{name}",
"domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.",
"domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši bloķēti.",
"domain_block_modal.title": "Bloķēt domēnu?",
+ "domain_pill.activitypub_lets_connect": "Tas ļauj savienoties un mijiedarboties ar cilvēkiem ne tikai no Mastodon, bet arī starp dažādām sabiedriskajām lietotnēm.",
+ "domain_pill.activitypub_like_language": "ActivityPub ir kā valoda, kurā Mastodon sazināš ar citiem sabiedriskajiem tīkliem.",
"domain_pill.server": "Serveris",
+ "domain_pill.their_handle": "Turis:",
"domain_pill.username": "Lietotājvārds",
- "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzamo kodu.",
+ "domain_pill.whats_in_a_handle": "Kas ir turī?",
+ "domain_pill.who_they_are": "Tā kā turi norāda, kas kāds ir un kur viņi ir atrodami, Tu vari mijiedarboties ar cilvēkiem viscaur sabiedriskajā tīklā no ar ActivityPub darbinātām platformām .",
+ "domain_pill.who_you_are": "Tā kā Tavs turis norāda, kas Tu esi un kur atrodies, cilvēki var mijiedarboties ar Tevi viscaur sabiedriskajā tīklā no ar ActivityPub darbinātām platformām .",
+ "domain_pill.your_handle": "Tavs turis:",
+ "embed.instructions": "Iekļauj šo ierakstu savā tīmekļvietnē, ievietojot zemāk redzamo kodu starpliktuvē!",
"embed.preview": "Tas izskatīsies šādi:",
"emoji_button.activity": "Aktivitāte",
"emoji_button.clear": "Notīrīt",
@@ -263,22 +295,23 @@
"emoji_button.search_results": "Meklēšanas rezultāti",
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Ceļošana un vietas",
+ "empty_column.account_featured_other.unknown": "Šis lietotājs vēl neko nav licis attēlot savā profilā.",
"empty_column.account_hides_collections": "Šis lietotājs ir izvēlējies nedarīt šo informāciju pieejamu",
"empty_column.account_suspended": "Konta darbība ir apturēta",
- "empty_column.account_timeline": "Šeit ziņojumu nav!",
+ "empty_column.account_timeline": "Šeit nav ierakstu.",
"empty_column.account_unavailable": "Profils nav pieejams",
"empty_column.blocks": "Pašreiz tu neesi nevienu bloķējis.",
"empty_column.bookmarked_statuses": "Pašlaik Tev nav neviena grāmatzīmēs pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.",
- "empty_column.community": "Vietējā laika līnija ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!",
+ "empty_column.community": "Vietējā laika līnija ir tukša. Uzraksti kaut ko publiski, lai iekustinātu visu!",
"empty_column.direct": "Tev vēl nav privātu pieminēšanu. Kad Tu nosūtīsi vai saņemsi kādu, tā pārādīsies šeit.",
"empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
"empty_column.explore_statuses": "Pašlaik nav nekā aktuāla. Ieskaties šeit vēlāk!",
- "empty_column.favourited_statuses": "Tev vēl nav iecienītāko ierakstu. Kad pievienosi kādu izlasei, tas tiks parādīts šeit.",
- "empty_column.favourites": "Šo ziņu neviens vēl nav pievienojis izlasei. Kad kāds to izdarīs, tas parādīsies šeit.",
+ "empty_column.favourited_statuses": "Tev vēl nav izlasei pievienotu ierakstu. Kad pievienosi kādu, tas tiks parādīts šeit.",
+ "empty_column.favourites": "Šo ierakstu vēl neviens nav pievienojis izlasei. Kad kāds to izdarīs, tas parādīsies šeit.",
"empty_column.follow_requests": "Šobrīd Tev nav sekošanas pieprasījumu. Kad saņemsi kādu, tas parādīsies šeit.",
"empty_column.followed_tags": "Tu vēl neseko nevienam tēmturim. Kad to izdarīsi, tie tiks parādīti šeit.",
"empty_column.hashtag": "Ar šo tēmturi nekas nav atrodams.",
- "empty_column.home": "Tava mājas laikjosla ir tukša. Seko vairāk cilvēkiem, lai to piepildītu!",
+ "empty_column.home": "Tava mājas laika līnija ir tukša. Seko vairāk cilvēkiem, lai to piepildītu!",
"empty_column.list": "Pagaidām šajā sarakstā nekā nav. Kad šī saraksta dalībnieki ievietos jaunus ierakstus, tie parādīsies šeit.",
"empty_column.mutes": "Neviens lietotājs vēl nav apklusināts.",
"empty_column.notifications": "Tev vēl nav paziņojumu. Kad citi cilvēki ar Tevi mijiedarbosies, Tu to redzēsi šeit.",
@@ -294,6 +327,9 @@
"explore.trending_links": "Jaunumi",
"explore.trending_statuses": "Ieraksti",
"explore.trending_tags": "Tēmturi",
+ "featured_carousel.next": "Tālāk",
+ "featured_carousel.previous": "Atpakaļ",
+ "featured_carousel.slide": "{index} / {total}",
"filter_modal.added.context_mismatch_explanation": "Šī atlases kategorija neattiecas uz kontekstu, kurā esi piekļuvis šim ierakstam. Ja vēlies, lai ieraksts tiktu atlasīts arī šajā kontekstā, Tev būs jālabo atlase.",
"filter_modal.added.context_mismatch_title": "Konteksta neatbilstība!",
"filter_modal.added.expired_explanation": "Šai atlases kategorijai ir beidzies derīguma termiņš. Lai to lietotu, Tev būs jāmaina derīguma termiņš.",
@@ -301,20 +337,20 @@
"filter_modal.added.review_and_configure": "Lai pārskatītu un tālāk konfigurētu šo filtru kategoriju, dodies uz {settings_link}.",
"filter_modal.added.review_and_configure_title": "Filtra iestatījumi",
"filter_modal.added.settings_link": "iestatījumu lapu",
- "filter_modal.added.short_explanation": "Šī ziņa ir pievienota šai filtra kategorijai: {title}.",
+ "filter_modal.added.short_explanation": "Šis ieraksts tika pievienots šai atlasīšanas kategorijai: {title}.",
"filter_modal.added.title": "Filtrs pievienots!",
"filter_modal.select_filter.context_mismatch": "neattiecas uz šo kontekstu",
"filter_modal.select_filter.expired": "beidzies",
"filter_modal.select_filter.prompt_new": "Jauna kategorija: {name}",
"filter_modal.select_filter.search": "Meklēt vai izveidot",
"filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu",
- "filter_modal.select_filter.title": "Filtrēt šo ziņu",
- "filter_modal.title.status": "Filtrēt ziņu",
+ "filter_modal.select_filter.title": "Atlasīt šo ierakstu",
+ "filter_modal.title.status": "Atlasīt ziņu",
"filtered_notifications_banner.title": "Filtrētie paziņojumi",
"firehose.all": "Visi",
"firehose.local": "Šis serveris",
"firehose.remote": "Citi serveri",
- "follow_request.authorize": "Autorizēt",
+ "follow_request.authorize": "Pilnvarot",
"follow_request.reject": "Noraidīt",
"follow_requests.unlocked_explanation": "Lai gan Tavs konts nav slēgts, {domain} darbinieki iedomājās, ka Tu varētu vēlēties pašrocīgi pārskatīt sekošanas pieprasījumus no šiem kontiem.",
"follow_suggestions.curated_suggestion": "Darbinieku izvēle",
@@ -338,6 +374,8 @@
"generic.saved": "Saglabāts",
"getting_started.heading": "Darba sākšana",
"hashtag.admin_moderation": "Atvērt #{name} satura pārraudzības saskarni",
+ "hashtag.browse": "Pārlūkot #{hashtag} ierakstus",
+ "hashtag.browse_from_account": "Pārlūkot @{name} #{hashtag} ierakstus",
"hashtag.column_header.tag_mode.all": "un {additional}",
"hashtag.column_header.tag_mode.any": "vai {additional}",
"hashtag.column_header.tag_mode.none": "bez {additional}",
@@ -350,7 +388,10 @@
"hashtag.counter_by_accounts": "{count, plural, zero{{counter} dalībnieku} one {{counter} dalībnieks} other {{counter} dalībnieki}}",
"hashtag.counter_by_uses": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}",
"hashtag.counter_by_uses_today": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}} šodien",
+ "hashtag.feature": "Attēlot profilā",
"hashtag.follow": "Sekot tēmturim",
+ "hashtag.mute": "Apklusināt #{hashtag}",
+ "hashtag.unfeature": "Neattēlot profilā",
"hashtag.unfollow": "Pārstāt sekot tēmturim",
"hashtags.and_other": "… un {count, plural, other {vēl #}}",
"hints.profiles.see_more_followers": "Skatīt vairāk sekotāju {domain}",
@@ -358,6 +399,7 @@
"hints.profiles.see_more_posts": "Skatīt vairāk ierakstu {domain}",
"hints.threads.replies_may_be_missing": "Var trūkt atbilžu no citiem serveriem.",
"hints.threads.see_more": "Skatīt vairāk atbilžu {domain}",
+ "home.column_settings.show_quotes": "Rādīt citātus",
"home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
"home.column_settings.show_replies": "Rādīt atbildes",
"home.hide_announcements": "Slēpt paziņojumus",
@@ -366,12 +408,22 @@
"home.pending_critical_update.title": "Ir pieejams būtisks drošības atjauninājums.",
"home.show_announcements": "Rādīt paziņojumus",
"ignore_notifications_modal.ignore": "Neņemt vērā paziņojumus",
+ "ignore_notifications_modal.not_following_title": "Neņemt vērā paziņojumus no cilvēkiem, kuriem neseko?",
+ "info_button.label": "Palīdzība",
+ "interaction_modal.action.favourite": "Lai turpinātu, nepieciešams pievienot sava konta izlasei.",
+ "interaction_modal.action.follow": "Lai turpinātu, nepieciešams sekot no sava konta.",
+ "interaction_modal.action.reblog": "Lai turpinātu, nepieciešams pastiprināt no sava konta.",
+ "interaction_modal.action.reply": "Lai turpinātu, nepieciešams atbildēt no sava konta.",
+ "interaction_modal.action.vote": "Lai turpinātu, nepieciešams balsot no sava konta.",
+ "interaction_modal.go": "Aiziet",
+ "interaction_modal.no_account_yet": "Vēl nav konta?",
"interaction_modal.on_another_server": "Citā serverī",
"interaction_modal.on_this_server": "Šajā serverī",
- "interaction_modal.title.favourite": "Pievienot {name} ziņu izlasei",
+ "interaction_modal.title.favourite": "Pievienot {name} ierakstu izlasei",
"interaction_modal.title.follow": "Sekot {name}",
"interaction_modal.title.reblog": "Pastiprināt {name} ierakstu",
- "interaction_modal.title.reply": "Atbildēt uz {name} ziņu",
+ "interaction_modal.title.reply": "Atbildēt uz {name} ierakstu",
+ "interaction_modal.username_prompt": "Piem., {example}",
"intervals.full.days": "{number, plural, one {# diena} other {# dienas}}",
"intervals.full.hours": "{number, plural, one {# stunda} other {# stundas}}",
"intervals.full.minutes": "{number, plural, one {# minūte} other {# minūtes}}",
@@ -383,9 +435,9 @@
"keyboard_shortcuts.description": "Apraksts",
"keyboard_shortcuts.direct": "lai atvērtu privāto pieminējumu sleju",
"keyboard_shortcuts.down": "Pārvietoties lejup sarakstā",
- "keyboard_shortcuts.enter": "Atvērt ziņu",
- "keyboard_shortcuts.favourite": "Pievienot izlasei",
- "keyboard_shortcuts.favourites": "Atvērt izlašu sarakstu",
+ "keyboard_shortcuts.enter": "Atvērt ierakstu",
+ "keyboard_shortcuts.favourite": "Pievienot ierakstu izlasei",
+ "keyboard_shortcuts.favourites": "Atvērt izlases sarakstu",
"keyboard_shortcuts.federated": "Atvērt apvienoto laika līniju",
"keyboard_shortcuts.heading": "Īsinājumtaustiņi",
"keyboard_shortcuts.home": "Atvērt mājas laika līniju",
@@ -397,7 +449,7 @@
"keyboard_shortcuts.my_profile": "Atvērt savu profilu",
"keyboard_shortcuts.notifications": "Atvērt paziņojumu kolonnu",
"keyboard_shortcuts.open_media": "Atvērt multividi",
- "keyboard_shortcuts.pinned": "Atvērt piesprausto ziņu sarakstu",
+ "keyboard_shortcuts.pinned": "Atvērt piesprausto ierakstu sarakstu",
"keyboard_shortcuts.profile": "Atvērt autora profilu",
"keyboard_shortcuts.reply": "Atbildēt",
"keyboard_shortcuts.requests": "Atvērt sekošanas pieprasījumu sarakstu",
@@ -406,28 +458,34 @@
"keyboard_shortcuts.start": "Atvērt kolonnu “Darba sākšana”",
"keyboard_shortcuts.toggle_hidden": "Rādīt/slēpt tekstu aiz satura brīdinājuma",
"keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt multividi",
- "keyboard_shortcuts.toot": "Sākt jaunu ziņu",
+ "keyboard_shortcuts.toot": "Uzsākt jaunu ierakstu",
+ "keyboard_shortcuts.translate": "tulkot ierakstu",
"keyboard_shortcuts.unfocus": "Atfokusēt veidojamā teksta/meklēšanas lauku",
"keyboard_shortcuts.up": "Pārvietoties augšup sarakstā",
"lightbox.close": "Aizvērt",
"lightbox.next": "Tālāk",
"lightbox.previous": "Iepriekšējais",
+ "lightbox.zoom_in": "Tālummainīt līdz patiesajam izmēram",
+ "lightbox.zoom_out": "Tālummainīt, lai ietilpinātu",
"limited_account_hint.action": "Tik un tā rādīt profilu",
"limited_account_hint.title": "{domain} moderatori ir paslēpuši šo profilu.",
"link_preview.author": "No {name}",
"link_preview.more_from_author": "Vairāk no {name}",
"lists.add_member": "Pievienot",
"lists.add_to_list": "Pievienot sarakstam",
+ "lists.add_to_lists": "Pievienot {name} sarakstiem",
"lists.create": "Izveidot",
"lists.create_list": "Izveidot sarakstu",
"lists.delete": "Izdzēst sarakstu",
"lists.done": "Gatavs",
"lists.edit": "Labot sarakstu",
+ "lists.list_name": "Saraksta nosaukums",
"lists.remove_member": "Noņemt",
"lists.replies_policy.followed": "Jebkuram sekotajam lietotājam",
"lists.replies_policy.list": "Saraksta dalībniekiem",
"lists.replies_policy.none": "Nevienam",
"lists.save": "Saglabāt",
+ "lists.search": "Meklēt",
"load_pending": "{count, plural, zero{# jaunu vienumu} one {# jauns vienums} other {# jauni vienumi}}",
"loading_indicator.label": "Ielādē…",
"media_gallery.hide": "Paslēpt",
@@ -442,7 +500,7 @@
"navigation_bar.blocks": "Bloķētie lietotāji",
"navigation_bar.bookmarks": "Grāmatzīmes",
"navigation_bar.community_timeline": "Vietējā laika līnija",
- "navigation_bar.compose": "Veidot jaunu ziņu",
+ "navigation_bar.compose": "Izveidot jaunu ierakstu",
"navigation_bar.direct": "Privātas pieminēšanas",
"navigation_bar.discover": "Atklāt",
"navigation_bar.domain_blocks": "Bloķētie domēni",
@@ -458,17 +516,23 @@
"navigation_bar.mutes": "Apklusinātie lietotāji",
"navigation_bar.opened_in_classic_interface": "Ieraksti, konti un citas noteiktas lapas pēc noklusējuma tiek atvērtas klasiskajā tīmekļa saskarnē.",
"navigation_bar.personal": "Personīgie",
- "navigation_bar.pins": "Piespraustās ziņas",
+ "navigation_bar.pins": "Piespraustie ieraksti",
"navigation_bar.preferences": "Iestatījumi",
"navigation_bar.public_timeline": "Apvienotā laika līnija",
"navigation_bar.search": "Meklēt",
"navigation_bar.security": "Drošība",
"not_signed_in_indicator.not_signed_in": "Ir jāpiesakās, lai piekļūtu šim resursam.",
"notification.admin.report": "{name} ziņoja par {target}",
+ "notification.admin.report_account": "{name} ziņoja par {count, plural, one {# ierakstu} other {# ierakstiem}} no {target} ar iemeslu: {category}",
+ "notification.admin.report_statuses": "{name} ziņoja par {target} ar iemeslu: {category}",
"notification.admin.sign_up": "{name} pierakstījās",
- "notification.favourite": "{name} pievienoja tavu ziņu izlasei",
+ "notification.favourite": "{name} pievienoja izlasei Tavu ierakstu",
+ "notification.favourite.name_and_others_with_link": "{name} un {count, plural, one {# cits} other {# citi}} pievienoja Tavu ierakstu izlasē",
+ "notification.favourite_pm": "{name} pievienoja izlasē Tavu privāto pieminējumu",
+ "notification.favourite_pm.name_and_others_with_link": "{name} un {count, plural, one {# cits} other {# citi}} pievienoja Tavu privāto pieminējumu izlasē",
"notification.follow": "{name} uzsāka Tev sekot",
"notification.follow_request": "{name} nosūtīja Tev sekošanas pieprasījumu",
+ "notification.mentioned_you": "{name} pieminēja jūs",
"notification.moderation-warning.learn_more": "Uzzināt vairāk",
"notification.moderation_warning": "Ir saņemts satura pārraudzības brīdinājums",
"notification.moderation_warning.action_delete_statuses": "Daži no Taviem ierakstiem tika noņemti.",
@@ -482,7 +546,7 @@
"notification.reblog": "{name} pastiprināja Tavu ierakstu",
"notification.relationships_severance_event": "Zaudēti savienojumi ar {name}",
"notification.relationships_severance_event.learn_more": "Uzzināt vairāk",
- "notification.status": "{name} tikko publicēja",
+ "notification.status": "{name} tikko pievienoja ierakstu",
"notification.update": "{name} laboja ierakstu",
"notification_requests.accept": "Pieņemt",
"notification_requests.dismiss": "Noraidīt",
@@ -490,6 +554,7 @@
"notification_requests.exit_selection": "Gatavs",
"notification_requests.notifications_from": "Paziņojumi no {name}",
"notification_requests.title": "Atlasītie paziņojumi",
+ "notification_requests.view": "Skatīt paziņojumus",
"notifications.clear": "Notīrīt paziņojumus",
"notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?",
"notifications.column_settings.admin.report": "Jauni ziņojumi:",
@@ -513,7 +578,7 @@
"notifications.column_settings.update": "Labojumi:",
"notifications.filter.all": "Visi",
"notifications.filter.boosts": "Pastiprinātie ieraksti",
- "notifications.filter.favourites": "Izlases",
+ "notifications.filter.favourites": "Izlase",
"notifications.filter.follows": "Seko",
"notifications.filter.mentions": "Pieminēšanas",
"notifications.filter.polls": "Aptaujas rezultāti",
@@ -535,6 +600,7 @@
"notifications_permission_banner.title": "Nekad nepalaid neko garām",
"onboarding.follows.back": "Atpakaļ",
"onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.",
+ "onboarding.follows.search": "Meklēt",
"onboarding.profile.discoverable": "Padarīt manu profilu atklājamu",
"onboarding.profile.display_name": "Attēlojamais vārds",
"onboarding.profile.display_name_hint": "Tavs pilnais vārds vai Tavs joku vārds…",
@@ -584,15 +650,15 @@
"reply_indicator.cancel": "Atcelt",
"reply_indicator.poll": "Aptauja",
"report.block": "Bloķēt",
- "report.block_explanation": "Tu neredzēsi viņu ierakstus. Viņi nevarēs redzēt Tavus ierakstus vai sekot tev. Viņi varēs saprast, ka ir bloķēti.",
+ "report.block_explanation": "Tu neredzēsi viņu ierakstus. Viņi nevarēs redzēt Tavus ierakstus vai sekot tev. Viņi varēs saprast, ka ir liegti.",
"report.categories.legal": "Tiesisks",
"report.categories.other": "Citi",
- "report.categories.spam": "Spams",
+ "report.categories.spam": "Mēstule",
"report.categories.violation": "Saturs pārkāpj vienu vai vairākus servera noteikumus",
"report.category.subtitle": "Izvēlieties labāko atbilstību",
"report.category.title": "Pastāsti mums, kas notiek ar šo {type}",
"report.category.title_account": "profilu",
- "report.category.title_status": "ziņu",
+ "report.category.title_status": "ierakstu",
"report.close": "Darīts",
"report.comment.title": "Vai, tavuprāt, mums vēl būtu kas jāzina?",
"report.forward": "Pārsūtīt {target}",
@@ -607,7 +673,7 @@
"report.reasons.legal_description": "Tu uzskati, ka tas pārkāpj tavus vai servera valsts likumus",
"report.reasons.other": "Tas ir kaut kas cits",
"report.reasons.other_description": "Šī sūdzība neatbilst pārējām kategorijām",
- "report.reasons.spam": "Tas ir spams",
+ "report.reasons.spam": "Tā ir mēstule",
"report.reasons.spam_description": "Ļaunprātīgas saites, viltus iesaistīšana vai atkārtotas atbildes",
"report.reasons.violation": "Tas pārkāpj servera noteikumus",
"report.reasons.violation_description": "Tu zini, ka tas pārkāpj īpašus noteikumus",
@@ -617,17 +683,21 @@
"report.statuses.title": "Vai ir kādi ieraksti, kas apstiprina šo ziņojumu?",
"report.submit": "Iesniegt",
"report.target": "Ziņošana par: {target}",
- "report.thanks.take_action": "Šeit ir iespējas, lai pārvaldītu Mastodon redzamo saturu:",
+ "report.thanks.take_action": "Šeit ir iespējas Mastodon redzamā satura pārvaldīšanai:",
"report.thanks.take_action_actionable": "Kamēr mēs to izskatām, tu vari veikt darbības pret @{name}:",
- "report.thanks.title": "Vai nevēlies to redzēt?",
+ "report.thanks.title": "Nevēlies to redzēt?",
"report.thanks.title_actionable": "Paldies, ka ziņoji, mēs to izskatīsim.",
"report.unfollow": "Pārtraukt sekot @{name}",
"report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu tā ierakstus savā mājas plūsmā, pārtrauc sekot tam!",
- "report_notification.attached_statuses": "Pievienoti {count, plural,one {{count} sūtījums} other {{count} sūtījumi}}",
+ "report_notification.attached_statuses": "{count, plural, zero {Pievienoti {count} ierakstu} one {Pievienots {count} ieraksts} other {Pievienoti {count} ieraksti}}",
"report_notification.categories.legal": "Tiesisks",
+ "report_notification.categories.legal_sentence": "nelikumīgs saturs",
"report_notification.categories.other": "Cita",
- "report_notification.categories.spam": "Spams",
+ "report_notification.categories.other_sentence": "cits",
+ "report_notification.categories.spam": "Mēstule",
+ "report_notification.categories.spam_sentence": "mēstule",
"report_notification.categories.violation": "Noteikumu pārkāpums",
+ "report_notification.categories.violation_sentence": "noteikumu pārkāpums",
"report_notification.open": "Atvērt ziņojumu",
"search.no_recent_searches": "Nav nesen veiktu meklējumu",
"search.placeholder": "Meklēšana",
@@ -655,6 +725,7 @@
"server_banner.administered_by": "Pārvalda:",
"server_banner.server_stats": "Servera statistika:",
"sign_in_banner.create_account": "Izveidot kontu",
+ "sign_in_banner.follow_anyone": "Seko ikvienam Fediversā un redzi visu pievienošanas secībā! Nekādu algoritmu, reklāmu vai klikšķēsmu.",
"sign_in_banner.sign_in": "Pieteikties",
"sign_in_banner.sso_redirect": "Piesakies vai Reģistrējies",
"status.admin_account": "Atvērt @{name} satura pārraudzības saskarni",
@@ -663,7 +734,7 @@
"status.block": "Bloķēt @{name}",
"status.bookmark": "Grāmatzīme",
"status.cancel_reblog_private": "Nepastiprināt",
- "status.cannot_reblog": "Šo ziņu nevar izcelt",
+ "status.cannot_reblog": "Šo ierakstu nevar pastiprināt",
"status.continued_thread": "Turpināts pavediens",
"status.copy": "Ievietot ieraksta saiti starpliktuvē",
"status.delete": "Dzēst",
@@ -674,8 +745,8 @@
"status.edited": "Pēdējoreiz labots {date}",
"status.edited_x_times": "Labots {count, plural, zero {{count} reižu} one {{count} reizi} other {{count} reizes}}",
"status.favourite": "Izlasē",
- "status.favourites": "{count, plural, zero {izlasēs} one {izlasē} other {izlasēs}}",
- "status.filter": "Filtrē šo ziņu",
+ "status.favourites": "{count, plural, one {izlasē} other {izlasēs}}",
+ "status.filter": "Atlasīt šo ierakstu",
"status.history.created": "{name} izveidoja {date}",
"status.history.edited": "{name} laboja {date}",
"status.load_more": "Ielādēt vairāk",
@@ -686,17 +757,23 @@
"status.more": "Vairāk",
"status.mute": "Apklusināt @{name}",
"status.mute_conversation": "Apklusināt sarunu",
- "status.open": "Paplašināt šo ziņu",
+ "status.open": "Izvērst šo ierakstu",
"status.pin": "Piespraust profilam",
- "status.pinned": "Piesprausts ieraksts",
+ "status.quote_error.not_found": "Šo ierakstu nevar parādīt.",
+ "status.quote_error.pending_approval": "Šis ieraksts gaida apstiprinājumu no tā autora.",
+ "status.quote_error.rejected": "Šo ierakstu nevar parādīt, jo tā autors neļauj to citēt.",
+ "status.quote_error.removed": "Šo ierakstu noņēma tā autors.",
+ "status.quote_error.unauthorized": "Šo ierakstu nevar parādīt, jo jums nav atļaujas to skatīt.",
+ "status.quote_post_author": "Publicēja {name}",
"status.read_more": "Lasīt vairāk",
"status.reblog": "Pastiprināt",
"status.reblog_private": "Pastiprināt ar sākotnējo redzamību",
"status.reblogged_by": "{name} pastiprināja",
"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 vēl nav pastiprinājis šo ierakstu. Kad kāds to izdarīs, šeit tiks parādīti lietotāji.",
"status.redraft": "Dzēst un pārrakstīt",
"status.remove_bookmark": "Noņemt grāmatzīmi",
+ "status.remove_favourite": "Noņemt no izlases",
"status.replied_to": "Atbildēja {name}",
"status.reply": "Atbildēt",
"status.replyAll": "Atbildēt uz tematu",
@@ -706,17 +783,18 @@
"status.show_less_all": "Rādīt mazāk visiem",
"status.show_more_all": "Rādīt vairāk visiem",
"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} pievienoja {attachmentCount, plural, zero {{attachmentCount} pielikumu} one {{attachmentCount} pielikumu} other {{attachmentCount} pielikumus}}",
"status.translate": "Tulkot",
"status.translated_from_with": "Tulkots no {lang} izmantojot {provider}",
"status.uncached_media_warning": "Priekšskatījums nav pieejams",
"status.unmute_conversation": "Noņemt sarunas apklusinājumu",
"status.unpin": "Noņemt profila piespraudumu",
- "subscribed_languages.lead": "Pēc izmaiņu veikšanas Tavā mājas un sarakstu laika līnijā tiks rādīti tikai tie ieraksti atlasītajās valodās. Neatlasīt nevienu, lai saņemtu ierakstus visās valodās.",
+ "subscribed_languages.lead": "Pēc izmaiņu veikšanas Tavā mājas un sarakstu laika līnijā tiks rādīti tikai ieraksti atlasītajās valodās. Neatlasīt nevienu, lai saņemtu ierakstus visās valodās.",
"subscribed_languages.save": "Saglabāt izmaiņas",
"subscribed_languages.target": "Mainīt abonētās valodas priekš {target}",
"tabs_bar.home": "Sākums",
"tabs_bar.notifications": "Paziņojumi",
+ "terms_of_service.title": "Pakalpojuma izmantošanas noteikumi",
"time_remaining.days": "{number, plural, one {Atlikusi # diena} other {Atlikušas # dienas}}",
"time_remaining.hours": "{number, plural, one {Atlikusi # stunda} other {Atlikušas # stundas}}",
"time_remaining.minutes": "{number, plural, one {Atlikusi # minūte} other {Atlikušas # minūtes}}",
@@ -742,6 +820,12 @@
"video.expand": "Paplašināt video",
"video.fullscreen": "Pilnekrāns",
"video.hide": "Slēpt video",
+ "video.mute": "Izslēgt skaņu",
"video.pause": "Pauze",
- "video.play": "Atskaņot"
+ "video.play": "Atskaņot",
+ "video.skip_backward": "Tīt atpakaļ",
+ "video.skip_forward": "Tīt uz priekšu",
+ "video.unmute": "Ieslēgt skaņu",
+ "video.volume_down": "Pagriezt klusāk",
+ "video.volume_up": "Pagriezt skaļāk"
}
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 63851de700..ec6f302e81 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -17,7 +17,6 @@
"account.block_domain": "Сокријај се од {domain}",
"account.blocked": "Блокиран",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "Скриен домен",
"account.edit_profile": "Измени профил",
"account.endorse": "Карактеристики на профилот",
"account.follow": "Следи",
@@ -217,7 +216,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"tabs_bar.home": "Дома",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index b865f1aa6e..36a0d829c9 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -17,7 +17,6 @@
"account.copy": "രൂപരേഖയിന്റെ വിലാസം പകർത്തുക",
"account.direct": "സ്വകാരൃമായിട്ടു് @{name}-ന് സൂചനപിക്കുക",
"account.disable_notifications": "@{name} പോസ്റ്റുചെയ്യുന്നത് എന്നെ അറിയിക്കുന്നത് നിർത്തുക",
- "account.domain_blocked": "മേഖല തടഞ്ഞു",
"account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
"account.enable_notifications": "@{name} പോസ്റ്റ് ചെയ്യുമ്പോൾ എന്നെ അറിയിക്കുക",
"account.endorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കുക",
@@ -375,7 +374,6 @@
"status.mute": "@{name}-നെ നിശ്ശബ്ദമാക്കുക",
"status.open": "Expand this status",
"status.pin": "പ്രൊഫൈലിൽ പിൻ ചെയ്യൂ",
- "status.pinned": "Pinned toot",
"status.read_more": "കൂടുതൽ വായിക്കുക",
"status.reblog": "ബൂസ്റ്റ്",
"status.reblogged_by": "{name} ബൂസ്റ്റ് ചെയ്തു",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 919a34532f..5c01c319a4 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -22,7 +22,6 @@
"account.copy": "दुवा कॉपी करा",
"account.direct": "खाजगीरित्या उल्लेखीत @{name}",
"account.disable_notifications": "जेव्हा @{name} पोस्ट करतात तेव्हा मला सूचित करणे थांबवा",
- "account.domain_blocked": "Domain hidden",
"account.edit_profile": "प्रोफाइल एडिट करा",
"account.enable_notifications": "जेव्हा @{name} पोस्ट करते तेव्हा मला सूचित करा",
"account.endorse": "प्रोफाइलवरील वैशिष्ट्य",
@@ -202,7 +201,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 483261da6b..785d643fc7 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -19,14 +19,16 @@
"account.block_domain": "Sekat domain {domain}",
"account.block_short": "Sekat",
"account.blocked": "Disekat",
+ "account.blocking": "Blocking",
"account.cancel_follow_request": "Batalkan permintaan ikut",
"account.copy": "Salin pautan ke profil",
"account.direct": "Sebut secara persendirian @{name}",
"account.disable_notifications": "Berhenti maklumkan saya apabila @{name} mengirim hantaran",
- "account.domain_blocked": "Domain disekat",
+ "account.domain_blocking": "Blocking domain",
"account.edit_profile": "Sunting profil",
"account.enable_notifications": "Maklumi saya apabila @{name} mengirim hantaran",
"account.endorse": "Tampilkan di profil",
+ "account.familiar_followers_one": "melayuikutikut{name1}",
"account.featured_tags.last_status_at": "Hantaran terakhir pada {date}",
"account.featured_tags.last_status_never": "Tiada hantaran",
"account.follow": "Ikuti",
@@ -51,7 +53,6 @@
"account.mute_notifications_short": "Redamkan pemberitahuan",
"account.mute_short": "Redam",
"account.muted": "Diredamkan",
- "account.mutual": "Rakan kongsi",
"account.no_bio": "Tiada penerangan diberikan.",
"account.open_original_page": "Buka halaman asal",
"account.posts": "Hantaran",
@@ -284,7 +285,6 @@
"emoji_button.search_results": "Hasil carian",
"emoji_button.symbols": "Simbol",
"emoji_button.travel": "Kembara & Tempat",
- "empty_column.account_featured": "Senarai ini kosong",
"empty_column.account_hides_collections": "Pengguna ini telah memilih untuk tidak menyediakan informasi tersebut",
"empty_column.account_suspended": "Akaun digantung",
"empty_column.account_timeline": "Tiada hantaran di sini!",
@@ -659,7 +659,6 @@
"status.mute_conversation": "Redamkan perbualan",
"status.open": "Kembangkan hantaran ini",
"status.pin": "Semat di profil",
- "status.pinned": "Hantaran disemat",
"status.read_more": "Baca lagi",
"status.reblog": "Galakkan",
"status.reblog_private": "Galakkan dengan ketampakan asal",
diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json
index 362537edeb..8eb89dac71 100644
--- a/app/javascript/mastodon/locales/my.json
+++ b/app/javascript/mastodon/locales/my.json
@@ -22,7 +22,6 @@
"account.copy": "လင့်ခ်ကို ပရိုဖိုင်သို့ ကူးယူပါ",
"account.direct": "@{name} သီးသန့် သိရှိနိုင်အောင် မန်းရှင်းခေါ်မည်",
"account.disable_notifications": "@{name} ပို့စ်တင်သည့်အခါ ကျွန်ုပ်ထံ အသိပေးခြင်း မပြုလုပ်ရန်။",
- "account.domain_blocked": "ဒိုမိန်း ပိတ်ပင်ထားခဲ့သည်",
"account.edit_profile": "ကိုယ်ရေးမှတ်တမ်းပြင်ဆင်မည်",
"account.enable_notifications": "@{name} ပို့စ်တင်သည့်အခါ ကျွန်ုပ်ကို အကြောင်းကြားပါ။",
"account.endorse": "အကောင့်ပရိုဖိုင်တွင်ဖော်ပြပါ",
@@ -544,7 +543,6 @@
"status.mute_conversation": "စကားဝိုင်းကို ပိတ်ထားရန်",
"status.open": "ပို့စ်ကိုချဲ့ထွင်မည်",
"status.pin": "ပရိုဖိုင်တွင် ပင်ထားပါ",
- "status.pinned": "ပင်တွဲထားသောပို့စ်",
"status.read_more": "ပိုမိုဖတ်ရှုရန်",
"status.reblog": "Boost",
"status.reblog_private": "မူရင်းပုံစံဖြင့် Boost လုပ်ပါ",
diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json
index 2c5af1d406..38f0790499 100644
--- a/app/javascript/mastodon/locales/nan.json
+++ b/app/javascript/mastodon/locales/nan.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Siū 管制 ê 服侍器",
"about.contact": "聯絡lâng:",
+ "about.default_locale": "預設",
"about.disclaimer": "Mastodon是自由、開放原始碼ê軟體,mā是Mastodon gGmbH ê商標。",
"about.domain_blocks.no_reason_available": "原因bē-tàng用",
"about.domain_blocks.preamble": "Mastodon一般ē允准lí看別ê fediverse 服侍器來ê聯絡人kap hām用者交流。Tsiah ê 是本服侍器建立ê例外。",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "有限制",
"about.domain_blocks.suspended.explanation": "Uì tsit ê服侍器來ê資料lóng bē處理、儲存á是交換,無可能kap tsit ê服侍器ê用者互動á是溝通。.",
"about.domain_blocks.suspended.title": "權限中止",
+ "about.language_label": "言語",
"about.not_available": "Tsit ê資訊bē-tàng tī tsit ê服侍器使用。",
"about.powered_by": "由 {mastodon} 提供ê非中心化社群媒體",
"about.rules": "服侍器ê規則",
@@ -19,17 +21,21 @@
"account.block_domain": "封鎖網域 {domain}",
"account.block_short": "封鎖",
"account.blocked": "Hőng封鎖",
+ "account.blocking": "Teh封鎖",
"account.cancel_follow_request": "取消跟tuè",
- "account.copy": "Khóo-pih kàu個人資料ê連結",
+ "account.copy": "Khóo-pih個人資料ê連結",
"account.direct": "私人提起 @{name}",
"account.disable_notifications": "停止佇 {name} PO文ê時通知我",
- "account.domain_blocked": "封鎖ê網域",
+ "account.domain_blocking": "Teh封鎖ê網域",
"account.edit_profile": "編輯個人資料",
"account.enable_notifications": "佇 {name} PO文ê時通知我",
"account.endorse": "用個人資料推薦對方",
+ "account.familiar_followers_many": "Hōo {name1}、{name2},kap {othersCount, plural, other {其他 lí熟似ê # ê lâng}} 跟tuè",
+ "account.familiar_followers_one": "Hōo {name1} 跟tuè",
+ "account.familiar_followers_two": "Hōo {name1} kap {name2} 跟tuè",
"account.featured": "精選ê",
+ "account.featured.accounts": "個人資料",
"account.featured.hashtags": "Hashtag",
- "account.featured.posts": "PO文",
"account.featured_tags.last_status_at": "頂kái tī {date} Po文",
"account.featured_tags.last_status_never": "無PO文",
"account.follow": "跟tuè",
@@ -37,9 +43,11 @@
"account.followers": "跟tuè lí ê",
"account.followers.empty": "Tsit ê用者iáu bô lâng跟tuè。",
"account.followers_counter": "Hōo {count, plural, other {{count} ê lâng}}跟tuè",
+ "account.followers_you_know_counter": "Lí所知影ê {counter} ê lâng",
"account.following": "Lí跟tuè ê",
"account.following_counter": "Teh跟tuè {count,plural,other {{count} ê lâng}}",
"account.follows.empty": "Tsit ê用者iáu buē跟tuè別lâng。",
+ "account.follows_you": "跟tuè lí",
"account.go_to_profile": "行kàu個人資料",
"account.hide_reblogs": "Tshàng tuì @{name} 來ê轉PO",
"account.in_memoriam": "佇tsia追悼。",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Kā通知消音",
"account.mute_short": "消音",
"account.muted": "消音ah",
- "account.mutual": "相跟tuè",
+ "account.muting": "消音",
+ "account.mutual": "Lín sio跟tuè",
"account.no_bio": "Bô提供敘述。",
"account.open_original_page": "開原來ê頁",
"account.posts": "PO文",
"account.posts_with_replies": "PO文kap回應",
+ "account.remove_from_followers": "Kā {name} tuì跟tuè lí ê ê內底suá掉",
"account.report": "檢舉 @{name}",
"account.requested": "Teh等待審查。Tshi̍h tsi̍t-ē 通取消跟tuè請求",
"account.requested_follow": "{name} 請求跟tuè lí",
+ "account.requests_to_follow_you": "請求跟tuè lí",
"account.share": "分享 @{name} ê個人資料",
"account.show_reblogs": "顯示uì @{name} 來ê轉PO",
"account.statuses_counter": "{count, plural, other {{count} ê PO文}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Thâi掉了後重寫",
"confirmations.redraft.message": "Lí kám確定behthâi掉tsit篇PO文了後koh重寫?收藏kap轉PO ē無去,而且原底ê PO文ê回應ē變孤立。",
"confirmations.redraft.title": "Kám beh thâi掉koh重寫PO文?",
+ "confirmations.remove_from_followers.confirm": "Suá掉跟tuè lí ê",
+ "confirmations.remove_from_followers.message": "{name} ē停止跟tuè lí。Lí kám確定beh繼續?",
+ "confirmations.remove_from_followers.title": "Kám beh suá掉跟tuè lí ê?",
"confirmations.reply.confirm": "回應",
"confirmations.reply.message": "Tsit-má回應ē khàm掉lí tng-leh編寫ê訊息。Lí kám確定beh繼續án-ne做?",
"confirmations.reply.title": "Kám beh khàm掉PO文?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Tshiau-tshuē ê結果",
"emoji_button.symbols": "符號",
"emoji_button.travel": "旅行kap地點",
- "empty_column.account_featured": "Tsit ê列單是空ê",
+ "empty_column.account_featured.me": "Lí iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?",
+ "empty_column.account_featured.other": "{acct} iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?",
+ "empty_column.account_featured_other.unknown": "Tsit ê口座iáu無任何ê特色內容。",
"empty_column.account_hides_collections": "Tsit位用者選擇無愛公開tsit ê資訊",
"empty_column.account_suspended": "口座已經受停止",
"empty_column.account_timeline": "Tsia無PO文!",
@@ -329,6 +345,11 @@
"explore.trending_links": "新聞",
"explore.trending_statuses": "PO文",
"explore.trending_tags": "Hashtag",
+ "featured_carousel.header": "{count, plural, one {{counter} 篇} other {{counter} 篇}} 釘起來ê PO文",
+ "featured_carousel.next": "下tsi̍t ê",
+ "featured_carousel.post": "PO文",
+ "featured_carousel.previous": "頂tsi̍t ê",
+ "featured_carousel.slide": "{total} 內底ê {index}",
"filter_modal.added.context_mismatch_explanation": "Tsit ê過濾器類別bē當適用佇lí所接近使用ê PO文ê情境。若是lí mā beh佇tsit ê情境過濾tsit ê PO文,lí著編輯過濾器。.",
"filter_modal.added.context_mismatch_title": "本文無sio合!",
"filter_modal.added.expired_explanation": "Tsit ê過濾器類別過期ah,lí需要改到期ê日期來繼續用。",
@@ -343,7 +364,7 @@
"filter_modal.select_filter.prompt_new": "新ê類別:{name}",
"filter_modal.select_filter.search": "Tshiau-tshuē á是加添",
"filter_modal.select_filter.subtitle": "用有ê類別á是建立新ê",
- "filter_modal.select_filter.title": "過濾tsit ê PO文",
+ "filter_modal.select_filter.title": "過濾tsit篇PO文",
"filter_modal.title.status": "過濾PO文",
"filter_warning.matches_filter": "合過濾器「{title} 」",
"filtered_notifications_banner.pending_requests": "Tuì lí可能熟sāi ê {count, plural, =0 {0 ê人} other {# ê人}}",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} ê} other {{counter} ê}}參與ê",
"hashtag.counter_by_uses": "{count, plural, one {{counter} 篇} other {{counter} 篇}} PO文",
"hashtag.counter_by_uses_today": "Kin-á日有 {count, plural, one {{counter} 篇} other {{counter} 篇}} PO文",
+ "hashtag.feature": "Tī個人資料推薦",
"hashtag.follow": "跟tuè hashtag",
"hashtag.mute": "消音 #{hashtag}",
+ "hashtag.unfeature": "Mài tī個人資料推薦",
"hashtag.unfollow": "取消跟tuè hashtag",
"hashtags.and_other": "……kap 其他 {count, plural, other {# ê}}",
"hints.profiles.followers_may_be_missing": "Tsit ê個人資料ê跟tuè者資訊可能有落勾ê。",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "佇 {domain} 看koh khah tsē ê PO文",
"hints.threads.replies_may_be_missing": "Tuì其他ê服侍器來ê回應可能有phah m̄見。",
"hints.threads.see_more": "佇 {domain} 看koh khah tsē ê回應",
+ "home.column_settings.show_quotes": "顯示引用",
"home.column_settings.show_reblogs": "顯示轉PO",
"home.column_settings.show_replies": "顯示回應",
"home.hide_announcements": "Khàm掉公告",
@@ -502,7 +526,6 @@
"lists.exclusive": "佇tshù ê時間線kā成員tshàng起來。",
"lists.exclusive_hint": "Nā bóo-mi̍h口座佇tsit ê列單,ē tuì lí tshù ê時間線kā tsit ê口座tshàng起來,避免koh看見in ê PO文。",
"lists.find_users_to_add": "Tshuē beh加添ê用者",
- "lists.list_members": "列單ê成員",
"lists.list_members_count": "{count, plural, other {# 位成員}}",
"lists.list_name": "列單ê名",
"lists.new_list_name": "新ê列單ê名",
@@ -586,8 +609,342 @@
"notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文,hōo lâng標做敏感ê內容。",
"notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。",
+ "notification.moderation_warning.action_sensitive": "Tuì tsit-má開始,lí êPO文ē標做敏感ê內容。",
+ "notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。",
+ "notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。",
+ "notification.own_poll": "Lí ê投票結束ah",
+ "notification.poll": "Lí bat投ê投票結束ah",
+ "notification.reblog": "{name} 轉送lí ê PO文",
+ "notification.reblog.name_and_others_with_link": "{name} kap{count, plural, other {另外 # ê lâng}} 轉送lí ê PO文",
+ "notification.relationships_severance_event": "Kap {name} ê結連無去",
+ "notification.relationships_severance_event.account_suspension": "{from} ê管理員kā {target} 停止權限ah,意思是lí bē koh再接受tuì in 來ê更新,á是hām in互動。",
+ "notification.relationships_severance_event.domain_block": "{from} ê 管理員kā {target} 封鎖ah,包含 {followersCount} 位跟tuè lí ê lâng,kap {followingCount, plural, other {#}} 位lí跟tuè ê口座。",
+ "notification.relationships_severance_event.learn_more": "看詳細",
+ "notification.relationships_severance_event.user_domain_block": "Lí已經kā {target} 封鎖ah,ē suá走 {followersCount} 位跟tuè lí ê lâng,kap {followingCount, plural, other {#}} 位lí跟tuè ê口座。",
+ "notification.status": "{name} tú-á PO",
+ "notification.update": "{name}有編輯PO文",
+ "notification_requests.accept": "接受",
+ "notification_requests.accept_multiple": "{count, plural, other {接受 # ê請求……}}",
+ "notification_requests.confirm_accept_multiple.button": "{count, plural, other {接受請求}}",
+ "notification_requests.confirm_accept_multiple.message": "Lí teh-beh接受 {count, plural, other {# ê 通知ê請求}}。Lí kám確定beh繼續?",
+ "notification_requests.confirm_accept_multiple.title": "接受通知ê請求?",
+ "notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {忽略請求}}",
+ "notification_requests.confirm_dismiss_multiple.message": "Lí teh-beh忽略 {count, plural, other {# ê 通知ê請求}}。Lí bē當koh容易the̍h著{count, plural, other {tsiah-ê}} 通知。Lí kám確定beh繼續?",
+ "notification_requests.confirm_dismiss_multiple.title": "忽略通知ê請求?",
+ "notification_requests.dismiss": "忽略",
+ "notification_requests.dismiss_multiple": "{count, plural, other {忽略 # ê請求……}}",
"notification_requests.edit_selection": "編輯",
"notification_requests.exit_selection": "做好ah",
+ "notification_requests.explainer_for_limited_account": "因為管理員限制tsit ê口座,tuì tsit ê口座來ê通知已經hōo過濾ah。",
+ "notification_requests.explainer_for_limited_remote_account": "因為管理員限制tsit ê口座á是伊ê服侍器,tuì tsit ê口座來ê通知已經hōo過濾ah。",
+ "notification_requests.maximize": "上大化",
+ "notification_requests.minimize_banner": "上細化受過濾ê通知ê條á",
+ "notification_requests.notifications_from": "Tuì {name} 來ê通知",
+ "notification_requests.title": "受過濾ê通知",
+ "notification_requests.view": "看通知",
+ "notifications.clear": "清掉通知",
+ "notifications.clear_confirmation": "Lí kám確定beh永永清掉lí所有ê通知?",
+ "notifications.clear_title": "清掉通知?",
+ "notifications.column_settings.admin.report": "新ê檢舉:",
+ "notifications.column_settings.admin.sign_up": "新註冊ê口座:",
+ "notifications.column_settings.alert": "桌面ê通知",
+ "notifications.column_settings.favourite": "收藏:",
+ "notifications.column_settings.filter_bar.advanced": "顯示逐ê類別",
+ "notifications.column_settings.filter_bar.category": "快速ê過濾器",
+ "notifications.column_settings.follow": "新ê跟tuè者:",
+ "notifications.column_settings.follow_request": "新ê跟tuè請求:",
+ "notifications.column_settings.group": "群組",
+ "notifications.column_settings.mention": "提起:",
+ "notifications.column_settings.poll": "投票ê結果:",
+ "notifications.column_settings.push": "Sak通知",
+ "notifications.column_settings.reblog": "轉送:",
+ "notifications.column_settings.show": "佇欄內底顯示",
+ "notifications.column_settings.sound": "播放聲音",
+ "notifications.column_settings.status": "新ê PO文:",
+ "notifications.column_settings.unread_notifications.category": "Iáu bē讀ê通知",
+ "notifications.column_settings.unread_notifications.highlight": "強調iáu bē讀ê通知",
+ "notifications.column_settings.update": "編輯:",
+ "notifications.filter.all": "Kui ê",
+ "notifications.filter.boosts": "轉送",
+ "notifications.filter.favourites": "收藏",
+ "notifications.filter.follows": "跟tuè",
+ "notifications.filter.mentions": "提起",
+ "notifications.filter.polls": "投票結果",
+ "notifications.filter.statuses": "Lí跟tuè ê lâng ê更新",
+ "notifications.grant_permission": "賦予權限。",
+ "notifications.group": "{count} 條通知",
+ "notifications.mark_as_read": "Kā ta̍k條通知lóng標做有讀",
+ "notifications.permission_denied": "因為khah早有拒絕瀏覽器權限ê請求,桌面通知bē當用。",
+ "notifications.permission_denied_alert": "桌面通知bē當phah開來用,因為khah早瀏覽器ê權限受拒絕",
+ "notifications.permission_required": "因為需要ê權限iáu無提供,桌面通知bē當用。",
+ "notifications.policy.accept": "接受",
+ "notifications.policy.accept_hint": "佇通知內底顯示",
+ "notifications.policy.drop": "忽略",
+ "notifications.policy.drop_hint": "送去虛空,bē koh看見",
+ "notifications.policy.filter": "過濾器",
+ "notifications.policy.filter_hint": "送kàu受過濾ê通知ê收件kheh-á",
+ "notifications.policy.filter_limited_accounts_hint": "Hōo服侍器ê管理員限制",
+ "notifications.policy.filter_limited_accounts_title": "受管制ê口座",
+ "notifications.policy.filter_new_accounts.hint": "建立tī最近 {days, plural, other {# kang}}內",
+ "notifications.policy.filter_new_accounts_title": "新ê口座",
+ "notifications.policy.filter_not_followers_hint": "包含最近{days, plural, other {# kang}}內跟tuè lí ê lâng",
+ "notifications.policy.filter_not_followers_title": "無跟tuè lí ê lâng",
+ "notifications.policy.filter_not_following_hint": "直到lí手動允准in",
+ "notifications.policy.filter_not_following_title": "Lí無跟tuè ê lâng",
+ "notifications.policy.filter_private_mentions_hint": "通知ē受過濾,除非是tī lí ê提起ê回應內底,á是lí跟tuè送PO文ê lâng",
+ "notifications.policy.filter_private_mentions_title": "家kī直接送來ê私人提起",
+ "notifications.policy.title": "管理通知tuì……",
+ "notifications_permission_banner.enable": "啟用桌面ê通知",
+ "notifications_permission_banner.how_to_control": "Nā beh佇Mastodon關起來ê時陣收通知,請啟用桌面通知。若準啟用,Lí ē當通過面頂ê {icon} 鈕á,準準控制siánn物互動ê類型ē生桌面通知。",
+ "notifications_permission_banner.title": "逐ê著看",
+ "onboarding.follows.back": "轉去",
+ "onboarding.follows.done": "做好ah",
+ "onboarding.follows.empty": "可惜,tsit-má無半條結果通顯示。Lí ē當試用tshiau-tshuē á是瀏覽探索ê頁,來tshuē beh跟tuè ê lâng,或者是sió等leh koh試。",
+ "onboarding.follows.search": "Tshiau-tshuē",
+ "onboarding.follows.title": "請跟tuè lâng來開始。",
+ "onboarding.profile.discoverable": "Hōo我ê個人資料通tshuē著",
+ "onboarding.profile.discoverable_hint": "Nā lí揀beh佇Mastodon開hōo lâng發現ê功能,lí ê PO文通顯示佇tshiau-tshuē結果kap趨勢,而且你ê個人資料可能ē推薦hōo kap lí有相siâng興趣ê別lâng。",
+ "onboarding.profile.display_name": "顯示ê名",
+ "onboarding.profile.display_name_hint": "Lí ê全名á是別號……",
+ "onboarding.profile.note": "個人紹介",
+ "onboarding.profile.note_hint": "Lí ē當 @mention 別lâng á是用 #hashtag……",
+ "onboarding.profile.save_and_continue": "儲存了後繼續",
+ "onboarding.profile.title": "個人資料ê設定",
+ "onboarding.profile.upload_avatar": "Kā個人資料ê相片傳起去。",
+ "onboarding.profile.upload_header": "Kā個人資料ê橫條á ê圖傳起去",
+ "password_confirmation.exceeds_maxlength": "密碼確認超過上大ê密碼長度",
+ "password_confirmation.mismatching": "密碼確認kap密碼無合",
+ "picture_in_picture.restore": "復原",
+ "poll.closed": "關ah",
+ "poll.refresh": "Koh更新",
+ "poll.reveal": "看結果",
+ "poll.total_people": "{count, plural, other {# ê人}}",
+ "poll.total_votes": "{count, plural, other {# 張票}}",
+ "poll.vote": "投票",
+ "poll.voted": "Lí kā tse投票ah",
+ "poll.votes": "{votes, plural, other {# 張票}}",
+ "poll_button.add_poll": "加投票",
+ "poll_button.remove_poll": "Thâi掉投票",
+ "privacy.change": "改變PO文公開ê範圍",
+ "privacy.direct.long": "逐位tsit篇PO文所提起ê",
+ "privacy.direct.short": "私人ê提起",
+ "privacy.private.long": "Kan-ta hōo跟tuè lí ê看",
+ "privacy.private.short": "跟tuè lí ê",
+ "privacy.public.long": "逐ê lâng(無論佇Mastodon以內á是以外)",
+ "privacy.public.short": "公開ê",
+ "privacy.unlisted.additional": "Tse ê行為kap公開相siâng,m̄-koh 就算lí佇口座設定phah開有關ê公開功能,PO文mā bē顯示佇即時ê動態、hashtag、探索kap Mastodon ê搜尋結果。",
+ "privacy.unlisted.long": "減少演算法ê宣傳",
+ "privacy.unlisted.short": "恬靜ê公開",
+ "privacy_policy.last_updated": "上尾更新tī:{date}",
+ "privacy_policy.title": "隱私權政策",
+ "recommended": "推薦",
+ "refresh": "Koh更新",
+ "regeneration_indicator.please_stand_by": "請sió等leh。",
+ "regeneration_indicator.preparing_your_home_feed": "Leh準備lí ê厝ê時間線……",
+ "relative_time.days": "{number} kang進前",
+ "relative_time.full.days": "{number, plural, other {# kang}}進前",
+ "relative_time.full.hours": "{number, plural, other {# 點鐘}}進前",
+ "relative_time.full.just_now": "頭tú-á",
+ "relative_time.full.minutes": "{number, plural, other {# 分鐘}}進前",
+ "relative_time.full.seconds": "{number, plural, other {# 秒}}進前",
+ "relative_time.hours": "{number}點鐘前",
+ "relative_time.just_now": "頭tú-á",
+ "relative_time.minutes": "{number} 分進前",
+ "relative_time.seconds": "{number} 秒進前",
+ "relative_time.today": "今á日",
+ "reply_indicator.attachments": "{count, plural, other {# ê附件}}",
+ "reply_indicator.cancel": "取消",
+ "reply_indicator.poll": "投票",
+ "report.block": "封鎖",
+ "report.block_explanation": "Lí bē koh看著in ê PO文。In bē當看tio̍h lí ê PO文kap跟tuè lí。In ē發現家kī受著封鎖。",
+ "report.categories.legal": "法律ê問題",
+ "report.categories.other": "其他",
+ "report.categories.spam": "Pùn-sò訊息",
+ "report.categories.violation": "內容違反tsi̍t ê以上服侍器ê規則",
+ "report.category.subtitle": "揀上合ê選項",
+ "report.category.title": "Kā guán講tsit ê {type} 有siánn-mih代誌",
+ "report.category.title_account": "個人資料",
+ "report.category.title_status": "PO文",
+ "report.close": "完成",
+ "report.comment.title": "Lí敢有別ê想beh hōo guán知ê?",
+ "report.forward": "轉送kàu {target}",
+ "report.forward_hint": "Tsit ê口座是別ê服侍器ê。Kám iā beh送bô落名ê檢舉ê khóo-pih?",
+ "report.mute": "消音",
+ "report.mute_explanation": "Lí bē koh看著in ê PO文。In iáu是ē當跟tuè lí,看lí ê PO文,而且m̄知in受消音。",
+ "report.next": "繼續",
+ "report.placeholder": "其他ê註釋",
+ "report.reasons.dislike": "我無kah意",
+ "report.reasons.dislike_description": "Tse是lí無愛看ê",
+ "report.reasons.legal": "Tse無合法",
+ "report.reasons.legal_description": "Lí相信伊違反lí ê國,á是服侍器所tiàm ê國ê法律",
+ "report.reasons.other": "其他原因",
+ "report.reasons.other_description": "Tsit ê問題bē當歸tī其他ê類別",
+ "report.reasons.spam": "Tse是pùn-sò訊息",
+ "report.reasons.spam_description": "Pháinn意ê連結、假互動,á是重複ê回應",
+ "report.reasons.violation": "伊違反服侍器ê規定",
+ "report.reasons.violation_description": "Lí明知伊違反特定ê規定",
+ "report.rules.subtitle": "請揀所有符合ê選項",
+ "report.rules.title": "違反siánn-mih規則?",
+ "report.statuses.subtitle": "請揀所有符合ê選項",
+ "report.statuses.title": "Kám有任何PO文證明tsit ê檢舉?",
+ "report.submit": "送出",
+ "report.target": "檢舉 {target}",
+ "report.thanks.take_action": "下kha是你控制所beh 佇Mastodon看ê內容ê選項:",
+ "report.thanks.take_action_actionable": "佇guán leh審核ê時陣,lí ē當tuì @{name} 做下kha ê行動:",
+ "report.thanks.title": "無想beh看著tse?",
+ "report.thanks.title_actionable": "多謝lí ê檢舉,guán ē處理。",
+ "report.unfollow": "取消跟tuè @{name}",
+ "report.unfollow_explanation": "Lí teh跟tuè tsit ê口座。Nā無beh佇頭頁ê時間線koh看見in ê PO文,請取消跟tuè。",
+ "report_notification.attached_statuses": "附 {count, plural, one {{count} 篇PO文} other {{count} 篇PO文}}ah",
+ "report_notification.categories.legal": "法規",
+ "report_notification.categories.legal_sentence": "違法ê內容",
+ "report_notification.categories.other": "其他",
+ "report_notification.categories.other_sentence": "其他",
+ "report_notification.categories.spam": "Pùn-sò訊息",
+ "report_notification.categories.spam_sentence": "pùn-sò訊息",
+ "report_notification.categories.violation": "違反規則",
+ "report_notification.categories.violation_sentence": "違反規則",
+ "report_notification.open": "Phah開檢舉",
+ "search.no_recent_searches": "無最近ê tshiau-tshuē",
+ "search.placeholder": "Tshiau-tshuē",
+ "search.quick_action.account_search": "合 {x} ê個人檔案",
+ "search.quick_action.go_to_account": "行去個人資料 {x}",
+ "search.quick_action.go_to_hashtag": "行去hashtag {x}",
+ "search.quick_action.open_url": "佇Mastodon來phah開URL",
+ "search.quick_action.status_search": "合 {x} ê PO文",
+ "search.search_or_paste": "Tshiau-tshuē á是貼URL",
+ "search_popout.full_text_search_disabled_message": "{domain} 頂bē當用。",
+ "search_popout.full_text_search_logged_out_message": "Kan-ta佇登入ê時通用。",
"search_popout.language_code": "ISO語言代碼",
- "status.translated_from_with": "用 {provider} 翻譯 {lang}"
+ "search_popout.options": "Tshiau-tshuē ê選項",
+ "search_popout.quick_actions": "快速ê行動",
+ "search_popout.recent": "最近ê tshiau-tshuē",
+ "search_popout.specific_date": "特定ê日",
+ "search_popout.user": "用者",
+ "search_results.accounts": "個人資料",
+ "search_results.all": "全部",
+ "search_results.hashtags": "Hashtag",
+ "search_results.no_results": "無結果。",
+ "search_results.no_search_yet": "請試tshiau-tshuē PO文、個人資料á是hashtag。",
+ "search_results.see_all": "看全部",
+ "search_results.statuses": "PO文",
+ "search_results.title": "Tshiau-tshuē「{q}」",
+ "server_banner.about_active_users": "最近30kang用本站êlâng(月ê活動ê用者)",
+ "server_banner.active_users": "活動ê用者",
+ "server_banner.administered_by": "管理員:",
+ "server_banner.is_one_of_many": "{domain} 屬佇tsē-tsē獨立ê Mastodonê服侍器,lí ē當用tse參與聯邦宇宙。",
+ "server_banner.server_stats": "服侍器ê統計:",
+ "sign_in_banner.create_account": "開口座",
+ "sign_in_banner.follow_anyone": "跟tuè聯邦宇宙ê任何tsi̍t ê,用時間ê順序看所有ê內容。無演算法、廣告、點滑鼠ê餌(clickbait)。",
+ "sign_in_banner.mastodon_is": "Mastodon是跟tuè siánn物當teh發生ê上贊ê方法。",
+ "sign_in_banner.sign_in": "登入",
+ "sign_in_banner.sso_redirect": "登入á是註冊",
+ "status.admin_account": "Phah開 @{name} ê管理界面",
+ "status.admin_domain": "Phah開 {domain} ê管理界面",
+ "status.admin_status": "Tī管理界面內底看tsit篇PO文",
+ "status.block": "封鎖 @{name}",
+ "status.bookmark": "冊籤",
+ "status.cancel_reblog_private": "取消轉送",
+ "status.cannot_reblog": "Tsit篇PO文bē當轉送",
+ "status.continued_thread": "接續ê討論線",
+ "status.copy": "Khóo-pih PO文ê連結",
+ "status.delete": "Thâi掉",
+ "status.detailed_status": "對話ê詳細",
+ "status.direct": "私人提起 @{name}",
+ "status.direct_indicator": "私人ê提起",
+ "status.edit": "編輯",
+ "status.edited": "上尾編輯tī:{date}",
+ "status.edited_x_times": "有編輯 {count, plural, one {{count} kái} other {{count} kái}}",
+ "status.embed": "The̍h相tàu ê (embed)程式碼",
+ "status.favourite": "收藏",
+ "status.favourites": "{count, plural, other {# 篇收藏}}",
+ "status.filter": "過濾tsit 篇 PO文",
+ "status.history.created": "{name} 佇 {date} 建立",
+ "status.history.edited": "{name} 佇 {date} 編輯",
+ "status.load_more": "載入其他ê內容",
+ "status.media.open": "點來開",
+ "status.media.show": "點來顯示",
+ "status.media_hidden": "Khàm起來ê媒體",
+ "status.mention": "提起 @{name}",
+ "status.more": "詳細",
+ "status.mute": "消音 @{name}",
+ "status.mute_conversation": "Kā對話消音",
+ "status.open": "Kā PO文展開",
+ "status.quote_error.filtered": "Lí所設定ê過濾器kā tse khàm起來",
+ "status.quote_error.not_found": "Tsit篇PO文bē當顯示。",
+ "status.quote_error.pending_approval": "Tsit篇PO文teh等原作者審查。",
+ "status.quote_error.rejected": "因為原作者無允准引用,tsit篇PO文bē當顯示。",
+ "status.quote_error.removed": "Tsit篇hōo作者thâi掉ah。",
+ "status.quote_error.unauthorized": "因為lí無得著讀tse ê權限,tsit篇PO文bē當顯示。",
+ "status.quote_post_author": "{name} 所PO ê",
+ "status.read_more": "讀詳細",
+ "status.reblog": "轉送",
+ "status.reblog_private": "照原PO ê通看見ê範圍轉送",
+ "status.reblogged_by": "{name} kā轉送ah",
+ "status.reblogs": "{count, plural, other {# ê 轉送}}",
+ "status.reblogs.empty": "Iáu無lâng轉送tsit篇PO文。Nā是有lâng轉送,ē佇tsia顯示。",
+ "status.redraft": "Thâi掉了後重寫",
+ "status.remove_bookmark": "Thâi掉冊籤",
+ "status.remove_favourite": "Tuì收藏內suá掉",
+ "status.replied_in_thread": "佇討論線內應",
+ "status.replied_to": "回應 {name}",
+ "status.reply": "回應",
+ "status.replyAll": "應討論線",
+ "status.report": "檢舉 @{name}",
+ "status.sensitive_warning": "敏感ê內容",
+ "status.share": "分享",
+ "status.show_less_all": "Lóng收起來",
+ "status.show_more_all": "Lóng展開",
+ "status.show_original": "顯示原文",
+ "status.title.with_attachments": "{user} 有PO {attachmentCount, plural, other {{attachmentCount} ê附件}}",
+ "status.translate": "翻譯",
+ "status.translated_from_with": "用 {provider} 翻譯 {lang}",
+ "status.uncached_media_warning": "Bē當先看māi",
+ "status.unmute_conversation": "Kā對話取消消音",
+ "subscribed_languages.lead": "Tī改變了後,kan-ta所揀ê語言ê PO文tsiah ē顯示佇lí ê厝ê時間線kap列單。揀「無」來接受所有語言êPO文。",
+ "subscribed_languages.save": "儲存改變",
+ "subscribed_languages.target": "改 {target} ê訂ê語言",
+ "tabs_bar.home": "頭頁",
+ "tabs_bar.notifications": "通知",
+ "terms_of_service.effective_as_of": "{date} 起實施",
+ "terms_of_service.title": "服務規定",
+ "terms_of_service.upcoming_changes_on": "Ē tī {date} 改變",
+ "time_remaining.days": "Tshun {number, plural, other {# kang}}",
+ "time_remaining.hours": "Tshun {number, plural, other {# 點鐘}}",
+ "time_remaining.minutes": "Tshun {number, plural, other {# 分鐘}}",
+ "time_remaining.moments": "Tshun ê時間",
+ "time_remaining.seconds": "Tshun {number, plural, other {# 秒}}",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} ê} other {{counter} ê}} lâng tī過去 {days, plural, one {kang} other {{days} kang}}內底",
+ "trends.trending_now": "Tsit-má ê趨勢",
+ "ui.beforeunload": "Nā離開Mastodon,lí ê草稿ē無去。",
+ "units.short.billion": "{count}B",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}K",
+ "upload_area.title": "Giú放來傳起去",
+ "upload_button.label": "加圖片、影片á是聲音檔",
+ "upload_error.limit": "超過檔案傳起去ê限制",
+ "upload_error.poll": "Bô允準佇投票ê時kā檔案傳起去。",
+ "upload_form.drag_and_drop.instructions": "Nā beh選媒體附件,請tshi̍h空白key á是Enter key。Giú ê時,請用方向key照指定ê方向suá媒體附件。Beh khǹg媒體附件佇伊ê新位置,請koh tshi̍h空白key á是Enter key,或者tshi̍h Esc key來取消。",
+ "upload_form.drag_and_drop.on_drag_cancel": "Suá位取消ah,媒體附件 {item} khǹg落來ah。",
+ "upload_form.drag_and_drop.on_drag_end": "媒體附件 {item} khǹg落來ah。",
+ "upload_form.drag_and_drop.on_drag_over": "媒體附件 {item} suá tín動ah。",
+ "upload_form.drag_and_drop.on_drag_start": "媒體附件 {item} 揀起來ah。",
+ "upload_form.edit": "編輯",
+ "upload_progress.label": "Teh傳起去……",
+ "upload_progress.processing": "Teh處理……",
+ "username.taken": "Tsit ê口座hōo lâng註冊ah,試別ê",
+ "video.close": "關影片",
+ "video.download": "Kā檔案載落去",
+ "video.exit_fullscreen": "離開全螢幕",
+ "video.expand": "展開影片",
+ "video.fullscreen": "全螢幕",
+ "video.hide": "Tshàng影片",
+ "video.mute": "消音",
+ "video.pause": "暫停",
+ "video.play": "播出",
+ "video.skip_backward": "跳kah後壁",
+ "video.skip_forward": "跳kah頭前",
+ "video.unmute": "取消消音",
+ "video.volume_down": "變khah細聲",
+ "video.volume_up": "變khah大聲"
}
diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json
index af2c922cbd..3cc33e95ca 100644
--- a/app/javascript/mastodon/locales/ne.json
+++ b/app/javascript/mastodon/locales/ne.json
@@ -20,7 +20,6 @@
"account.copy": "प्रोफाइलको लिङ्क प्रतिलिपि गर्नुहोस्",
"account.direct": "@{name} लाई निजी रूपमा उल्लेख गर्नुहोस्",
"account.disable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित नगर्नुहोस्",
- "account.domain_blocked": "डोमेन ब्लक गरिएको छ",
"account.edit_profile": "प्रोफाइल सम्पादन गर्नुहोस्",
"account.enable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित गर्नुहोस्",
"account.endorse": "प्रोफाइलमा फिचर गर्नुहोस्",
@@ -43,7 +42,6 @@
"account.mute_notifications_short": "सूचनाहरू म्यूट गर्नुहोस्",
"account.mute_short": "म्युट",
"account.muted": "म्युट गरिएको",
- "account.mutual": "आपसी",
"account.no_bio": "कुनै विवरण प्रदान गरिएको छैन।",
"account.posts": "पोस्टहरू",
"account.posts_with_replies": "पोस्ट र जवाफहरू",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 30f4777f61..e28506f4fa 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Beperkte en opgeschorte servers",
"about.contact": "Contact:",
+ "about.default_locale": "Standaard",
"about.disclaimer": "Mastodon is vrije, opensourcesoftware en een handelsmerk van Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Reden niet beschikbaar",
"about.domain_blocks.preamble": "In het algemeen kun je met Mastodon berichten ontvangen van, en interactie hebben met gebruikers van elke server in de fediverse. Dit zijn de uitzonderingen die op deze specifieke server gelden.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Beperkt",
"about.domain_blocks.suspended.explanation": "Er worden geen gegevens van deze server verwerkt, opgeslagen of uitgewisseld, wat interactie of communicatie met gebruikers van deze server onmogelijk maakt.",
"about.domain_blocks.suspended.title": "Opgeschort",
+ "about.language_label": "Taal",
"about.not_available": "Deze informatie is niet beschikbaar gemaakt op deze server.",
"about.powered_by": "Gedecentraliseerde sociale media mogelijk gemaakt door {mastodon}",
"about.rules": "Serverregels",
@@ -19,17 +21,21 @@
"account.block_domain": "Alles van {domain} blokkeren",
"account.block_short": "Blokkeren",
"account.blocked": "Geblokkeerd",
+ "account.blocking": "Geblokkeerd",
"account.cancel_follow_request": "Ontvolgen",
"account.copy": "Link naar profiel kopiëren",
"account.direct": "@{name} een privébericht sturen",
"account.disable_notifications": "Geen melding meer geven wanneer @{name} een bericht plaatst",
- "account.domain_blocked": "Domein geblokkeerd",
+ "account.domain_blocking": "Server geblokkeerd",
"account.edit_profile": "Profiel bewerken",
"account.enable_notifications": "Geef een melding wanneer @{name} een bericht plaatst",
"account.endorse": "Op profiel weergeven",
+ "account.familiar_followers_many": "Gevolgd door {name1}, {name2} en {othersCount, plural, one {één ander bekend account} other {# andere bekende accounts}}",
+ "account.familiar_followers_one": "Gevolgd door {name1}",
+ "account.familiar_followers_two": "Gevolgd door {name1} en {name2}",
"account.featured": "Uitgelicht",
+ "account.featured.accounts": "Profielen",
"account.featured.hashtags": "Hashtags",
- "account.featured.posts": "Berichten",
"account.featured_tags.last_status_at": "Laatste bericht op {date}",
"account.featured_tags.last_status_never": "Geen berichten",
"account.follow": "Volgen",
@@ -37,9 +43,11 @@
"account.followers": "Volgers",
"account.followers.empty": "Deze gebruiker heeft nog geen volgers of heeft deze verborgen.",
"account.followers_counter": "{count, plural, one {{counter} volger} other {{counter} volgers}}",
+ "account.followers_you_know_counter": "{counter} die je kent",
"account.following": "Volgend",
"account.following_counter": "{count, plural, one {{counter} volgend} other {{counter} volgend}}",
"account.follows.empty": "Deze gebruiker volgt nog niemand of heeft deze verborgen.",
+ "account.follows_you": "Volgt jou",
"account.go_to_profile": "Ga naar profiel",
"account.hide_reblogs": "Boosts van @{name} verbergen",
"account.in_memoriam": "In memoriam.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Meldingen negeren",
"account.mute_short": "Negeren",
"account.muted": "Genegeerd",
+ "account.muting": "Genegeerd",
"account.mutual": "Jullie volgen elkaar",
"account.no_bio": "Geen beschrijving opgegeven.",
"account.open_original_page": "Originele pagina openen",
"account.posts": "Berichten",
- "account.posts_with_replies": "Berichten en reacties",
+ "account.posts_with_replies": "Reacties",
+ "account.remove_from_followers": "{name} als volger verwijderen",
"account.report": "@{name} rapporteren",
"account.requested": "Wachten op goedkeuring. Klik om het volgverzoek te annuleren",
- "account.requested_follow": "{name} wil je graag volgen",
+ "account.requested_follow": "{name} wil jou graag volgen",
+ "account.requests_to_follow_you": "Wil jou graag volgen",
"account.share": "Account van @{name} delen",
"account.show_reblogs": "Boosts van @{name} tonen",
"account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Verwijderen en herschrijven",
"confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.",
"confirmations.redraft.title": "Bericht verwijderen en herschrijven?",
+ "confirmations.remove_from_followers.confirm": "Volger verwijderen",
+ "confirmations.remove_from_followers.message": "{name} zal je niet meer volgen. Weet je zeker dat je wilt doorgaan?",
+ "confirmations.remove_from_followers.title": "Volger verwijderen?",
"confirmations.reply.confirm": "Reageren",
"confirmations.reply.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
"confirmations.reply.title": "Bericht overschrijven?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Zoekresultaten",
"emoji_button.symbols": "Symbolen",
"emoji_button.travel": "Reizen en locaties",
- "empty_column.account_featured": "Deze lijst is leeg",
+ "empty_column.account_featured.me": "Je hebt nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?",
+ "empty_column.account_featured.other": "{acct} heeft nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?",
+ "empty_column.account_featured_other.unknown": "Dit account heeft nog niets uitgelicht.",
"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_timeline": "Hier zijn geen berichten!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Nieuws",
"explore.trending_statuses": "Berichten",
"explore.trending_tags": "Hashtags",
+ "featured_carousel.header": "{count, plural, one {Vastgezet bericht} other {Vastgezette berichten}}",
+ "featured_carousel.next": "Volgende",
+ "featured_carousel.post": "Bericht",
+ "featured_carousel.previous": "Vorige",
+ "featured_carousel.slide": "{index} van {total}",
"filter_modal.added.context_mismatch_explanation": "Deze filtercategorie is niet van toepassing op de context waarin je dit bericht hebt benaderd. Als je wilt dat het bericht ook in deze context wordt gefilterd, moet je het filter bewerken.",
"filter_modal.added.context_mismatch_title": "Context komt niet overeen!",
"filter_modal.added.expired_explanation": "Deze filtercategorie is verlopen. Je moet de vervaldatum wijzigen om de categorie toe te kunnen passen.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deelnemer} other {{counter} deelnemers}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} bericht} other {{counter} berichten}} vandaag",
+ "hashtag.feature": "Op profiel uitlichten",
"hashtag.follow": "Hashtag volgen",
"hashtag.mute": "#{hashtag} negeren",
+ "hashtag.unfeature": "Niet op profiel uitlichten",
"hashtag.unfollow": "Hashtag ontvolgen",
"hashtags.and_other": "…en {count, plural, one {}other {# meer}}",
"hints.profiles.followers_may_be_missing": "Volgers voor dit profiel kunnen ontbreken.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Bekijk meer berichten op {domain}",
"hints.threads.replies_may_be_missing": "Antwoorden van andere servers kunnen ontbreken.",
"hints.threads.see_more": "Bekijk meer reacties op {domain}",
+ "home.column_settings.show_quotes": "Citaten tonen",
"home.column_settings.show_reblogs": "Boosts tonen",
"home.column_settings.show_replies": "Reacties tonen",
"home.hide_announcements": "Mededelingen verbergen",
@@ -502,7 +526,6 @@
"lists.exclusive": "Leden op je Startpagina verbergen",
"lists.exclusive_hint": "Als iemand op deze lijst staat, verberg deze persoon dan op je starttijdlijn om te voorkomen dat zijn berichten twee keer worden getoond.",
"lists.find_users_to_add": "Vind gebruikers om toe te voegen",
- "lists.list_members": "Lijstleden",
"lists.list_members_count": "{count, plural, one{# lid} other{# leden}}",
"lists.list_name": "Lijstnaam",
"lists.new_list_name": "Nieuwe lijstnaam",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Gesprek negeren",
"status.open": "Volledig bericht tonen",
"status.pin": "Aan profielpagina vastmaken",
- "status.pinned": "Vastgemaakt bericht",
+ "status.quote_error.filtered": "Verborgen door een van je filters",
+ "status.quote_error.not_found": "Dit bericht kan niet worden weergegeven.",
+ "status.quote_error.pending_approval": "Dit bericht is in afwachting van goedkeuring door de oorspronkelijke auteur.",
+ "status.quote_error.rejected": "Dit bericht kan niet worden weergegeven omdat de oorspronkelijke auteur niet toestaat dat het wordt geciteerd.",
+ "status.quote_error.removed": "Dit bericht is verwijderd door de auteur.",
+ "status.quote_error.unauthorized": "Dit bericht kan niet worden weergegeven omdat je niet bevoegd bent om het te bekijken.",
+ "status.quote_post_author": "Bericht van {name}",
"status.read_more": "Meer lezen",
"status.reblog": "Boosten",
"status.reblog_private": "Boost naar oorspronkelijke ontvangers",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index ab867017a9..67bf02c1ec 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Modererte tenarar",
"about.contact": "Kontakt:",
+ "about.default_locale": "Standard",
"about.disclaimer": "Mastodon er gratis programvare med open kjeldekode, og eit varemerke frå Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Årsaka er ikkje tilgjengeleg",
"about.domain_blocks.preamble": "Mastodon gjev deg som regel lov til å sjå innhald og samhandla med brukarar frå alle andre tenarar i allheimen. Dette er unntaka som er valde for akkurat denne tenaren.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Avgrensa",
"about.domain_blocks.suspended.explanation": "Ingen data frå denne tenaren vert handsama, lagra eller sende til andre, noko som gjer det umogeleg å samhandla eller kommunisera med brukarar på denne tenaren.",
"about.domain_blocks.suspended.title": "Utestengd",
+ "about.language_label": "Språk",
"about.not_available": "Denne informasjonen er ikkje gjort tilgjengeleg på denne tenaren.",
"about.powered_by": "Desentraliserte sosiale medium drive av {mastodon}",
"about.rules": "Tenarreglar",
@@ -19,27 +21,33 @@
"account.block_domain": "Skjul alt frå {domain}",
"account.block_short": "Blokker",
"account.blocked": "Blokkert",
+ "account.blocking": "Blokkerer",
"account.cancel_follow_request": "Trekk attende fylgeførespurnad",
"account.copy": "Kopier lenka til profilen",
"account.direct": "Nevn @{name} privat",
"account.disable_notifications": "Slutt å varsle meg når @{name} skriv innlegg",
- "account.domain_blocked": "Domenet er sperra",
+ "account.domain_blocking": "Blokkerer domenet",
"account.edit_profile": "Rediger profil",
"account.enable_notifications": "Varsle meg når @{name} skriv innlegg",
"account.endorse": "Vis på profilen",
+ "account.familiar_followers_many": "Fylgt av {name1}, {name2}, og {othersCount, plural, one {ein annan du kjenner} other {# andre du kjenner}}",
+ "account.familiar_followers_one": "Fylgt av {name1}",
+ "account.familiar_followers_two": "Fylgt av {name1} og {name2}",
"account.featured": "Utvald",
+ "account.featured.accounts": "Profilar",
"account.featured.hashtags": "Emneknaggar",
- "account.featured.posts": "Innlegg",
"account.featured_tags.last_status_at": "Sist nytta {date}",
"account.featured_tags.last_status_never": "Ingen innlegg",
"account.follow": "Fylg",
"account.follow_back": "Fylg tilbake",
"account.followers": "Fylgjarar",
"account.followers.empty": "Ingen fylgjer denne brukaren enno.",
- "account.followers_counter": "{count, plural, one {{counter} følgjar} other {{counter} følgjarar}}",
+ "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
+ "account.followers_you_know_counter": "{counter} du kjenner",
"account.following": "Fylgjer",
- "account.following_counter": "{count, plural, one {{counter} følgjer} other {{counter} følgjer}}",
+ "account.following_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
"account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
+ "account.follows_you": "Fylgjer deg",
"account.go_to_profile": "Gå til profil",
"account.hide_reblogs": "Gøym framhevingar frå @{name}",
"account.in_memoriam": "Til minne om.",
@@ -54,19 +62,23 @@
"account.mute_notifications_short": "Demp varslingar",
"account.mute_short": "Demp",
"account.muted": "Målbunden",
- "account.mutual": "Felles",
+ "account.muting": "Dempa",
+ "account.mutual": "De fylgjer kvarandre",
"account.no_bio": "Inga skildring er gjeven.",
"account.open_original_page": "Opne originalsida",
"account.posts": "Tut",
"account.posts_with_replies": "Tut og svar",
+ "account.remove_from_followers": "Fjern {name} frå fylgjarane dine",
"account.report": "Rapporter @{name}",
"account.requested": "Ventar på aksept. Klikk for å avbryta fylgjeførespurnaden",
"account.requested_follow": "{name} har bedt om å få fylgja deg",
+ "account.requests_to_follow_you": "Folk som vil fylgja deg",
"account.share": "Del @{name} sin profil",
"account.show_reblogs": "Vis framhevingar frå @{name}",
"account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}",
"account.unblock": "Stopp blokkering av @{name}",
"account.unblock_domain": "Stopp blokkering av domenet {domain}",
+ "account.unblock_domain_short": "Fjern blokkering",
"account.unblock_short": "Stopp blokkering",
"account.unendorse": "Ikkje vis på profil",
"account.unfollow": "Slutt å fylgja",
@@ -117,7 +129,7 @@
"annual_report.summary.thanks": "Takk for at du er med i Mastodon!",
"attachments_list.unprocessed": "(ubehandla)",
"audio.hide": "Gøym lyd",
- "block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektere di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.",
+ "block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektera di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.",
"block_modal.show_less": "Vis mindre",
"block_modal.show_more": "Vis meir",
"block_modal.they_cant_mention": "Dei kan ikkje nemna eller fylgja deg.",
@@ -228,6 +240,9 @@
"confirmations.redraft.confirm": "Slett & skriv på nytt",
"confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opprinnelege innlegget vert foreldrelause.",
"confirmations.redraft.title": "Slett og skriv på nytt?",
+ "confirmations.remove_from_followers.confirm": "Fjern fylgjar",
+ "confirmations.remove_from_followers.message": "{name} vil ikkje fylgja deg meir. Vil du halda fram?",
+ "confirmations.remove_from_followers.title": "Fjern fylgjar?",
"confirmations.reply.confirm": "Svar",
"confirmations.reply.message": "Å svara no vil overskriva den meldinga du er i ferd med å skriva. Er du sikker på at du vil halda fram?",
"confirmations.reply.title": "Overskriv innlegget?",
@@ -276,7 +291,7 @@
"domain_pill.who_they_are": "Sidan handtak seier kven nokon er og kvar dei er, kan du interagere med folk på tvers av det sosiale nettverket av plattformar som støttar ActivityPub .",
"domain_pill.who_you_are": "Sidan handtaket ditt seier kven du er og kvar du er, kan folk interagere med deg på tvers av det sosiale nettverket av plattformar som støttar ActivityPub .",
"domain_pill.your_handle": "Handtaket ditt:",
- "domain_pill.your_server": "Din digitale heim, der alle innlegga dine bur i. Liker du ikkje dette? Byt til ein ny tenar når som helst og ta med fylgjarane dine òg.",
+ "domain_pill.your_server": "Din digitale heim, der alle innlegga dine bur. Liker du ikkje dette? Byt til ein ny tenar når som helst og ta med fylgjarane dine òg.",
"domain_pill.your_username": "Din unike identifikator på denne tenaren. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.",
"embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden nedanfor.",
"embed.preview": "Slik kjem det til å sjå ut:",
@@ -295,7 +310,9 @@
"emoji_button.search_results": "Søkeresultat",
"emoji_button.symbols": "Symbol",
"emoji_button.travel": "Reise & stader",
- "empty_column.account_featured": "Denne lista er tom",
+ "empty_column.account_featured.me": "Du har ikkje valt ut noko enno. Visste du at du kan velja ut merkelappar du bruker mykje, og til og med venekontoar på profilen din?",
+ "empty_column.account_featured.other": "{acct} har ikkje valt ut noko enno. Visste du at du kan velja ut merkelappar du bruker mykje, og til og med venekontoar på profilen din?",
+ "empty_column.account_featured_other.unknown": "Denne kontoen har ikkje valt ut noko enno.",
"empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg",
"empty_column.account_suspended": "Kontoen er utestengd",
"empty_column.account_timeline": "Ingen tut her!",
@@ -328,6 +345,11 @@
"explore.trending_links": "Nytt",
"explore.trending_statuses": "Innlegg",
"explore.trending_tags": "Emneknaggar",
+ "featured_carousel.header": "{count, plural, one {Festa innlegg} other {Festa innlegg}}",
+ "featured_carousel.next": "Neste",
+ "featured_carousel.post": "Innlegg",
+ "featured_carousel.previous": "Førre",
+ "featured_carousel.slide": "{index} av {total}",
"filter_modal.added.context_mismatch_explanation": "Denne filterkategorien gjeld ikkje i den samanhengen du har lese dette innlegget. Viss du vil at innlegget skal filtrerast i denne samanhengen òg, må du endra filteret.",
"filter_modal.added.context_mismatch_title": "Konteksten passar ikkje!",
"filter_modal.added.expired_explanation": "Denne filterkategorien har gått ut på dato. Du må endre best før datoen for at den skal gjelde.",
@@ -380,6 +402,8 @@
"generic.saved": "Lagra",
"getting_started.heading": "Kom i gang",
"hashtag.admin_moderation": "Opne moderasjonsgrensesnitt for #{name}",
+ "hashtag.browse": "Bla gjennom innlegg i #{hashtag}",
+ "hashtag.browse_from_account": "Bla gjennom innlegg frå @{name} i #{hashtag}",
"hashtag.column_header.tag_mode.all": "og {additional}",
"hashtag.column_header.tag_mode.any": "eller {additional}",
"hashtag.column_header.tag_mode.none": "utan {additional}",
@@ -392,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural,one {{counter} deltakar} other {{counter} deltakarar}}",
"hashtag.counter_by_uses": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}}",
"hashtag.counter_by_uses_today": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}} i dag",
+ "hashtag.feature": "Vis på profilen",
"hashtag.follow": "Fylg emneknagg",
+ "hashtag.mute": "Demp @#{hashtag}",
+ "hashtag.unfeature": "Ikkje vis på profilen",
"hashtag.unfollow": "Slutt å fylgje emneknaggen",
"hashtags.and_other": "…og {count, plural, one {}other {# fleire}}",
"hints.profiles.followers_may_be_missing": "Kven som fylgjer denne profilen manglar kanskje.",
@@ -403,6 +430,7 @@
"hints.profiles.see_more_posts": "Sjå fleire innlegg på {domain}",
"hints.threads.replies_may_be_missing": "Svar frå andre tenarar manglar kanskje.",
"hints.threads.see_more": "Sjå fleire svar på {domain}",
+ "home.column_settings.show_quotes": "Vis sitat",
"home.column_settings.show_reblogs": "Vis framhevingar",
"home.column_settings.show_replies": "Vis svar",
"home.hide_announcements": "Skjul kunngjeringar",
@@ -498,7 +526,6 @@
"lists.exclusive": "Gøym medlemer frå startskjermen",
"lists.exclusive_hint": "Viss nokon er på denne lista, blir dei gøymde frå startskjermen slik at du slepp sjå innlegga deira to gonger.",
"lists.find_users_to_add": "Finn brukarar å leggja til",
- "lists.list_members": "Syn medlemer",
"lists.list_members_count": "{count, plural, one {# medlem} other {# medlemer}}",
"lists.list_name": "Namn på lista",
"lists.new_list_name": "Namn på den nye lista",
@@ -805,11 +832,11 @@
"server_banner.about_active_users": "Personar som har brukt denne tenaren dei siste 30 dagane (Månadlege Aktive Brukarar)",
"server_banner.active_users": "aktive brukarar",
"server_banner.administered_by": "Administrert av:",
- "server_banner.is_one_of_many": "{domain} er ein av dei mange uavhengige Mastodon-serverane du kan bruke til å delta i Fødiverset.",
+ "server_banner.is_one_of_many": "{domain} er ein av dei mange uavhengige Mastodon-tenarane du kan bruka til å delta i Allheimen.",
"server_banner.server_stats": "Tenarstatistikk:",
"sign_in_banner.create_account": "Opprett konto",
- "sign_in_banner.follow_anyone": "Følg kven som helst på tvers av Fødiverset og sjå alt i kronologisk rekkjefølgje. Ingen algoritmar, reklamar eller clickbait i sikte.",
- "sign_in_banner.mastodon_is": "Mastodon er den beste måten å følgje med på det som skjer.",
+ "sign_in_banner.follow_anyone": "Fylg kven som helst på tvers av Allheimen og sjå alt i kronologisk rekkjefylgje. Ingen algoritmar, reklame eller klikkfeller.",
+ "sign_in_banner.mastodon_is": "Mastodon er den beste måten å fylgja med på det som skjer.",
"sign_in_banner.sign_in": "Logg inn",
"sign_in_banner.sso_redirect": "Logg inn eller registrer deg",
"status.admin_account": "Opne moderasjonsgrensesnitt for @{name}",
@@ -844,7 +871,13 @@
"status.mute_conversation": "Demp samtale",
"status.open": "Utvid denne statusen",
"status.pin": "Fest på profil",
- "status.pinned": "Festa tut",
+ "status.quote_error.filtered": "Gøymt på grunn av eitt av filtra dine",
+ "status.quote_error.not_found": "Du kan ikkje visa dette innlegget.",
+ "status.quote_error.pending_approval": "Dette innlegget ventar på at skribenten skal godkjenna det.",
+ "status.quote_error.rejected": "Du kan ikkje visa dette innlegget fordi skribenten ikkje vil at det skal siterast.",
+ "status.quote_error.removed": "Skribenten sletta dette innlegget.",
+ "status.quote_error.unauthorized": "Du kan ikkje visa dette innlegget fordi du ikkje har løyve til det.",
+ "status.quote_post_author": "Innlegg av {name}",
"status.read_more": "Les meir",
"status.reblog": "Framhev",
"status.reblog_private": "Framhev til dei originale mottakarane",
@@ -875,7 +908,9 @@
"subscribed_languages.target": "Endre abonnerte språk for {target}",
"tabs_bar.home": "Heim",
"tabs_bar.notifications": "Varsel",
+ "terms_of_service.effective_as_of": "I kraft frå {date}",
"terms_of_service.title": "Bruksvilkår",
+ "terms_of_service.upcoming_changes_on": "Komande endringar {date}",
"time_remaining.days": "{number, plural, one {# dag} other {# dagar}} igjen",
"time_remaining.hours": "{number, plural, one {# time} other {# timar}} igjen",
"time_remaining.minutes": "{number, plural, one {# minutt} other {# minutt}} igjen",
@@ -906,6 +941,12 @@
"video.expand": "Utvid video",
"video.fullscreen": "Fullskjerm",
"video.hide": "Gøym video",
+ "video.mute": "Demp",
"video.pause": "Pause",
- "video.play": "Spel av"
+ "video.play": "Spel av",
+ "video.skip_backward": "Hopp bakover",
+ "video.skip_forward": "Hopp framover",
+ "video.unmute": "Opphev demping",
+ "video.volume_down": "Volum ned",
+ "video.volume_up": "Volum opp"
}
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index a18ccdc0dc..c9c8e794de 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Modererte servere",
"about.contact": "Kontakt:",
+ "about.default_locale": "Standard",
"about.disclaimer": "Mastodon er gratis, åpen kildekode-programvare og et varemerke fra Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Årsak ikke tilgjengelig",
"about.domain_blocks.preamble": "Mastodon lar deg normalt sett se innholdet fra og samhandle med brukere fra enhver annen tjener i fødiverset. Dette er unntakene som har blitt lagt inn på denne tjeneren.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Begrenset",
"about.domain_blocks.suspended.explanation": "Ikke noe innhold fra denne tjeneren vil bli behandlet, lagret eller utvekslet. Det gjør det umulig å samhandle eller kommunisere med brukere fra denne tjeneren.",
"about.domain_blocks.suspended.title": "Suspendert",
+ "about.language_label": "Språk",
"about.not_available": "Denne informasjonen er ikke gjort tilgjengelig på denne tjeneren.",
"about.powered_by": "Desentraliserte sosiale medier drevet av {mastodon}",
"about.rules": "Regler for serveren",
@@ -19,14 +21,21 @@
"account.block_domain": "Blokker domenet {domain}",
"account.block_short": "Blokker",
"account.blocked": "Blokkert",
+ "account.blocking": "Blokkerer",
"account.cancel_follow_request": "Avbryt følgeforespørselen",
"account.copy": "Kopier lenke til profil",
"account.direct": "Nevn @{name} privat",
"account.disable_notifications": "Slutt å varsle meg når @{name} legger ut innlegg",
- "account.domain_blocked": "Domene blokkert",
+ "account.domain_blocking": "Blokkerer domene",
"account.edit_profile": "Rediger profil",
"account.enable_notifications": "Varsle meg når @{name} legger ut innlegg",
"account.endorse": "Vis frem på profilen",
+ "account.familiar_followers_many": "Fulgt av {name1}, {name2}, og {othersCount, plural, one {en annen du kjenner} other {# andre du kjenner}}",
+ "account.familiar_followers_one": "Fulgt av {name1}",
+ "account.familiar_followers_two": "Fulgt av {name1} og {name2}",
+ "account.featured": "Utvalgt",
+ "account.featured.accounts": "Profiler",
+ "account.featured.hashtags": "Emneknagger",
"account.featured_tags.last_status_at": "Siste innlegg {date}",
"account.featured_tags.last_status_never": "Ingen Innlegg",
"account.follow": "Følg",
@@ -34,9 +43,11 @@
"account.followers": "Følgere",
"account.followers.empty": "Ingen følger denne brukeren ennå.",
"account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}",
+ "account.followers_you_know_counter": "{counter} du kjenner",
"account.following": "Følger",
"account.following_counter": "{count, plural, one {{counter} som følges} other {{counter} som følges}}",
"account.follows.empty": "Denne brukeren følger ikke noen enda.",
+ "account.follows_you": "Følger deg",
"account.go_to_profile": "Gå til profil",
"account.hide_reblogs": "Skjul fremhevinger fra @{name}",
"account.in_memoriam": "Til minne om.",
@@ -51,19 +62,23 @@
"account.mute_notifications_short": "Demp varsler",
"account.mute_short": "Demp",
"account.muted": "Dempet",
- "account.mutual": "Gjensidig",
+ "account.muting": "Demper",
+ "account.mutual": "Dere følger hverandre",
"account.no_bio": "Ingen beskrivelse oppgitt.",
"account.open_original_page": "Gå til originalsiden",
"account.posts": "Innlegg",
"account.posts_with_replies": "Innlegg med svar",
+ "account.remove_from_followers": "Fjern {name} fra følgere",
"account.report": "Rapporter @{name}",
"account.requested": "Venter på godkjennelse. Klikk for å avbryte forespørselen",
"account.requested_follow": "{name} har bedt om å få følge deg",
+ "account.requests_to_follow_you": "Forespørsler om å følge deg",
"account.share": "Del @{name} sin profil",
"account.show_reblogs": "Vis fremhevinger fra @{name}",
"account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}",
"account.unblock": "Opphev blokkering av @{name}",
"account.unblock_domain": "Opphev blokkering av {domain}",
+ "account.unblock_domain_short": "Opphev blokkering",
"account.unblock_short": "Opphev blokkering",
"account.unendorse": "Ikke vis frem på profilen",
"account.unfollow": "Slutt å følge",
@@ -109,6 +124,9 @@
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brukte evne knagg",
"annual_report.summary.most_used_hashtag.none": "Ingen",
"annual_report.summary.new_posts.new_posts": "nye innlegg",
+ "annual_report.summary.percentile.text": "Det gjør at du er i topp av brukere på {domain}. ",
+ "annual_report.summary.percentile.we_wont_tell_bernie": "Vi skal ikke si noe til Bernie.",
+ "annual_report.summary.thanks": "Takk for at du er med på Mastodon!",
"attachments_list.unprocessed": "(ubehandlet)",
"audio.hide": "Skjul lyd",
"block_modal.remote_users_caveat": "Vi vil be serveren {domain} om å respektere din beslutning. Det er imidlertid ingen garanti at det blir overholdt, siden noen servere kan håndtere blokkeringer på forskjellig vis. Offentlige innlegg kan fortsatt være synlige for ikke-innloggede brukere.",
@@ -132,6 +150,7 @@
"bundle_column_error.routing.body": "Den forespurte siden ble ikke funnet. Er du sikker på at URL-en i adresselinjen er riktig?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Lukk",
+ "bundle_modal_error.message": "Noe gikk galt mens denne komponenten ble lastet inn.",
"bundle_modal_error.retry": "Prøv igjen",
"closed_registrations.other_server_instructions": "Siden Mastodon er desentralizert, kan du opprette en konto på en annen server og fortsatt kommunisere med denne.",
"closed_registrations_modal.description": "Opprettelse av en konto på {domain} er for tiden ikke mulig, men vær oppmerksom på at du ikke trenger en konto spesifikt på {domain} for å kunne bruke Mastodon.",
@@ -142,6 +161,7 @@
"column.blocks": "Blokkerte brukere",
"column.bookmarks": "Bokmerker",
"column.community": "Lokal tidslinje",
+ "column.create_list": "Opprett liste",
"column.direct": "Private omtaler",
"column.directory": "Bla gjennom profiler",
"column.domain_blocks": "Skjulte domener",
@@ -150,6 +170,7 @@
"column.firehose": "Tidslinjer",
"column.follow_requests": "Følgeforespørsler",
"column.home": "Hjem",
+ "column.list_members": "Administrer listemedlemmer",
"column.lists": "Lister",
"column.mutes": "Dempede brukere",
"column.notifications": "Varsler",
@@ -181,6 +202,7 @@
"compose_form.poll.duration": "Avstemningens varighet",
"compose_form.poll.multiple": "Flervalg",
"compose_form.poll.option_placeholder": "Valg {number}",
+ "compose_form.poll.single": "Enkelt valg",
"compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
"compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
"compose_form.poll.type": "Stil",
@@ -204,14 +226,23 @@
"confirmations.edit.confirm": "Redigér",
"confirmations.edit.message": "Å redigere nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?",
"confirmations.edit.title": "Overskriv innlegg?",
+ "confirmations.follow_to_list.confirm": "Følg og legg til i liste",
+ "confirmations.follow_to_list.message": "Du må følge {name} for å kunne legge vedkommende til i en liste.",
+ "confirmations.follow_to_list.title": "Følg bruker?",
"confirmations.logout.confirm": "Logg ut",
"confirmations.logout.message": "Er du sikker på at du vil logge ut?",
"confirmations.logout.title": "Logg ut?",
+ "confirmations.missing_alt_text.confirm": "Legg til bildebeskrivelse",
+ "confirmations.missing_alt_text.message": "Innlegget ditt mangler bildebeskrivelse. Legg til en tekst for å gjøre innholdet ditt tilgjengelig for flere brukere.",
"confirmations.missing_alt_text.secondary": "Legg ut likevel",
+ "confirmations.missing_alt_text.title": "Legg til bildebeskrivelse?",
"confirmations.mute.confirm": "Demp",
"confirmations.redraft.confirm": "Slett og skriv på nytt",
"confirmations.redraft.message": "Er du sikker på at du vil slette dette innlegget og lagre det på nytt? Favoritter og fremhevinger vil gå tapt, og svar til det originale innlegget vil bli foreldreløse.",
"confirmations.redraft.title": "Slett og skriv på nytt?",
+ "confirmations.remove_from_followers.confirm": "Fjern følger",
+ "confirmations.remove_from_followers.message": "{name} vil ikke lenger følge deg. Er du sikker på at du vil fortsette?",
+ "confirmations.remove_from_followers.title": "Fjern følger?",
"confirmations.reply.confirm": "Svar",
"confirmations.reply.message": "Å svare nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?",
"confirmations.reply.title": "Overskriv innlegg?",
@@ -228,7 +259,7 @@
"copy_icon_button.copied": "Kopiert til utklippstavlen",
"copypaste.copied": "Kopiert",
"copypaste.copy_to_clipboard": "Kopier til utklippstavle",
- "directory.federated": "Fra det kjente strømiverset",
+ "directory.federated": "Fra det kjente fødiverset",
"directory.local": "Kun fra {domain}",
"directory.new_arrivals": "Nye ankomster",
"directory.recently_active": "Nylig aktiv",
@@ -236,12 +267,18 @@
"disabled_account_banner.text": "Din konto {disabledAccount} er for øyeblikket deaktivert.",
"dismissable_banner.community_timeline": "Dette er de nyeste offentlige innleggene fra personer med kontoer på {domain}.",
"dismissable_banner.dismiss": "Avvis",
+ "dismissable_banner.explore_links": "Disse nyhetene snakker folk om akkurat nå på denne og andre servere i det desentraliserte nettverket.",
+ "dismissable_banner.explore_statuses": "Disse innleggene fra denne og andre servere i det desentraliserte nettverket får økt oppmerksomhet på denne serveren akkurat nå. Nyere innlegg med flere fremhevinger og favoritter er rangert høyere.",
+ "dismissable_banner.explore_tags": "Disse emneknaggene snakker folk om akkurat nå på det desentraliserte nettverket. Emneknagger brukt av flere rangeres høyere.",
+ "dismissable_banner.public_timeline": "Dette er de nyeste offentlige innleggene fra folk brukerne av {domain} følger på det desentraliserte nettverket.",
"domain_block_modal.block": "Blokker server",
"domain_block_modal.block_account_instead": "Blokker @{name} i stedet",
"domain_block_modal.they_can_interact_with_old_posts": "Personer fra denne serveren kan samhandle med dine gamle innlegg.",
"domain_block_modal.they_cant_follow": "Ingen fra denne serveren kan følge deg.",
"domain_block_modal.they_wont_know": "De kommer ikke til å få vite at du har valgt å blokkere dem.",
"domain_block_modal.title": "Blokker domenet?",
+ "domain_block_modal.you_will_lose_num_followers": "Du kommer til å miste {followersCount, plural, one {{followersCountDisplay} følger} other {{followersCountDisplay} følgere}} og {followingCount, plural, one {{followingCountDisplay} du følger} other {{followingCountDisplay} du følger}}.",
+ "domain_block_modal.you_will_lose_relationships": "Du vil miste alle følgere og folk du følger fra denne serveren.",
"domain_block_modal.you_wont_see_posts": "Du vil ikke se innlegg eller få varsler fra brukere på denne serveren.",
"domain_pill.activitypub_lets_connect": "Den lar deg koble til og samhandle med folk ikke bare på Mastodon, men også på tvers av forskjellige sosiale apper.",
"domain_pill.activitypub_like_language": "ActivityPub er liksom språket Mastodon snakker med andre sosiale nettverk.",
@@ -273,6 +310,9 @@
"emoji_button.search_results": "Søkeresultat",
"emoji_button.symbols": "Symboler",
"emoji_button.travel": "Reise & steder",
+ "empty_column.account_featured.me": "Du har ikke fremhevet noe ennå. Visste du at du kan fremheve emneknaggene du bruker mest, eller til og med dine venners profilsider?",
+ "empty_column.account_featured.other": "{acct} har ikke fremhevet noe ennå. Visste du at du kan fremheve emneknaggene du bruker mest, eller til og med dine venners profilsider?",
+ "empty_column.account_featured_other.unknown": "Denne kontoen har ikke fremhevet noe ennå.",
"empty_column.account_hides_collections": "Denne brukeren har valgt å ikke gjøre denne informasjonen tilgjengelig",
"empty_column.account_suspended": "Kontoen er suspendert",
"empty_column.account_timeline": "Ingen innlegg her!",
@@ -305,6 +345,11 @@
"explore.trending_links": "Nyheter",
"explore.trending_statuses": "Innlegg",
"explore.trending_tags": "Emneknagger",
+ "featured_carousel.header": "{count, plural, one {{counter} festet innlegg} other {{counter} festede innlegg}}",
+ "featured_carousel.next": "Neste",
+ "featured_carousel.post": "Innlegg",
+ "featured_carousel.previous": "Forrige",
+ "featured_carousel.slide": "{index} av {total}",
"filter_modal.added.context_mismatch_explanation": "Denne filterkategorien gjelder ikke for den konteksten du har åpnet dette innlegget i. Hvis du vil at innlegget skal filtreres i denne konteksten også, må du redigere filteret.",
"filter_modal.added.context_mismatch_title": "Feil sammenheng!",
"filter_modal.added.expired_explanation": "Denne filterkategorien er utløpt, du må endre utløpsdato for at den skal gjelde.",
@@ -321,6 +366,7 @@
"filter_modal.select_filter.subtitle": "Bruk en eksisterende kategori eller opprett en ny",
"filter_modal.select_filter.title": "Filtrer dette innlegget",
"filter_modal.title.status": "Filtrer et innlegg",
+ "filter_warning.matches_filter": "Treff på filter \"{title} \"",
"filtered_notifications_banner.pending_requests": "Fra {count, plural, =0 {ingen} one {en person} other {# folk}} du kanskje kjenner",
"filtered_notifications_banner.title": "Filtrerte varsler",
"firehose.all": "Alt",
@@ -354,6 +400,9 @@
"footer.status": "Status",
"generic.saved": "Lagret",
"getting_started.heading": "Kom i gang",
+ "hashtag.admin_moderation": "Åpne modereringsgrensesnitt for #{name}",
+ "hashtag.browse": "Utforsk poster i #{hashtag}",
+ "hashtag.browse_from_account": "Utforsk poster av @{name} i #{hashtag}",
"hashtag.column_header.tag_mode.all": "og {additional}",
"hashtag.column_header.tag_mode.any": "eller {additional}",
"hashtag.column_header.tag_mode.none": "uten {additional}",
@@ -366,7 +415,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deltaker} other {{counter} deltakere}}",
"hashtag.counter_by_uses": "{count, plural, one {ett innlegg} other {{counter} innlegg}}",
"hashtag.counter_by_uses_today": "{count, plural, one {ett innlegg} other {{counter} innlegg}} i dag",
+ "hashtag.feature": "Fremhev på din profil",
"hashtag.follow": "Følg emneknagg",
+ "hashtag.mute": "Demp #{hashtag}",
+ "hashtag.unfeature": "Ikke fremhev på din profil",
"hashtag.unfollow": "Slutt å følge emneknagg",
"hashtags.and_other": "…og {count, plural, one{en til} other {# til}}",
"hints.profiles.followers_may_be_missing": "Følgere for denne profilen mangler kanskje.",
@@ -377,6 +429,7 @@
"hints.profiles.see_more_posts": "Se flere innlegg på {domain}",
"hints.threads.replies_may_be_missing": "Svar fra andre servere mangler kanskje.",
"hints.threads.see_more": "Se flere svar på {domain}",
+ "home.column_settings.show_quotes": "Vis sitater",
"home.column_settings.show_reblogs": "Vis fremhevinger",
"home.column_settings.show_replies": "Vis svar",
"home.hide_announcements": "Skjul kunngjøring",
@@ -396,6 +449,11 @@
"ignore_notifications_modal.not_following_title": "Overse varsler fra folk du ikke følger?",
"ignore_notifications_modal.private_mentions_title": "Overse varsler fra uoppfordrede private omtaler?",
"info_button.label": "Hjelp",
+ "info_button.what_is_alt_text": "Hva er alternativ tekst? Alternativ tekst gir en bildebeskrivelse til folk med nedsatt syn, lav båndbredde eller de som vil ha mer kontekst.
Du kan forbedre tilgjengeligheten og forståelsen for alle ved å skive en tydelig, konsis og objektiv alternativ tekst.
Få med deg viktige elementer Summér tekst i bilder Bruk vanlige setningsstrukturer Unngå overflødig informasjon Fokuser på trender og viktige funn i komplekse grafiske fremstillinger (som diagram og kart) ",
+ "interaction_modal.action.favourite": "Favoriser fra din konto for å fortsette.",
+ "interaction_modal.action.follow": "Følg fra din konto for å fortsette.",
+ "interaction_modal.action.reply": "Svar fra kontoen din for å fortsette.",
+ "interaction_modal.action.vote": "Stem fra kontoen din for å fortsette.",
"interaction_modal.go": "Gå",
"interaction_modal.no_account_yet": "Har du ikke en konto ennå?",
"interaction_modal.on_another_server": "På en annen server",
@@ -404,6 +462,8 @@
"interaction_modal.title.follow": "Følg {name}",
"interaction_modal.title.reblog": "Fremhev {name} sitt innlegg",
"interaction_modal.title.reply": "Svar på {name} sitt innlegg",
+ "interaction_modal.title.vote": "Stem på {name}s avstemning",
+ "interaction_modal.username_prompt": "For eksempel {example}",
"intervals.full.days": "{number, plural,one {# dag} other {# dager}}",
"intervals.full.hours": "{number, plural, one {# time} other {# timer}}",
"intervals.full.minutes": "{number, plural, one {# minutt} other {# minutter}}",
@@ -439,6 +499,7 @@
"keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bak innholdsvarsel",
"keyboard_shortcuts.toggle_sensitivity": "Vis/skjul media",
"keyboard_shortcuts.toot": "Start et nytt innlegg",
+ "keyboard_shortcuts.translate": "for å oversette et innlegg",
"keyboard_shortcuts.unfocus": "Fjern fokus fra komponerings-/søkefeltet",
"keyboard_shortcuts.up": "Flytt oppover i listen",
"lightbox.close": "Lukk",
@@ -451,10 +512,18 @@
"link_preview.shares": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}",
"lists.add_member": "Legg til",
"lists.add_to_list": "Legg til i listen",
+ "lists.add_to_lists": "Legg til {name} i liste",
"lists.create": "Opprett",
+ "lists.create_a_list_to_organize": "Lag en ny liste for å organisere hjemmetidslinjen",
+ "lists.create_list": "Lag liste",
"lists.delete": "Slett listen",
"lists.done": "Ferdig",
"lists.edit": "Rediger listen",
+ "lists.find_users_to_add": "Fin brukere å legge til",
+ "lists.list_name": "Listenavn",
+ "lists.new_list_name": "Nytt listenavn",
+ "lists.no_lists_yet": "Ingen lister ennå.",
+ "lists.no_members_yet": "Ingen medlemmer ennå.",
"lists.no_results_found": "Ingen treff.",
"lists.remove_member": "Fjern",
"lists.replies_policy.followed": "Enhver fulgt bruker",
@@ -505,15 +574,24 @@
"not_signed_in_indicator.not_signed_in": "Du må logge inn for å få tilgang til denne ressursen.",
"notification.admin.report": "{name} rapporterte {target}",
"notification.admin.report_account": "{name} rapporterte {count, plural, one {et innlegg} other {# innlegg}} fra {target} for {category}",
+ "notification.admin.report_statuses": "{name} rapporterte {target} for {category}",
+ "notification.admin.report_statuses_other": "{name} rapporterte {target}",
"notification.admin.sign_up": "{name} registrerte seg",
"notification.favourite": "{name} favorittmarkerte innlegget ditt",
"notification.follow": "{name} fulgte deg",
"notification.follow_request": "{name} har bedt om å få følge deg",
"notification.label.mention": "Nevn",
+ "notification.label.private_mention": "Private omtaler",
+ "notification.label.private_reply": "Private svar",
"notification.label.reply": "Svar",
"notification.mention": "Nevn",
"notification.mentioned_you": "{name} nevnte deg",
"notification.moderation-warning.learn_more": "Lær mer",
+ "notification.moderation_warning": "Du har fått en advarsel fra en moderator",
+ "notification.moderation_warning.action_delete_statuses": "Noen av innleggene dine har blitt fjernet.",
+ "notification.moderation_warning.action_disable": "Kontoen din har blitt deaktivert.",
+ "notification.moderation_warning.action_mark_statuses_as_sensitive": "Noen av innleggene dine har blitt markert som sensitive.",
+ "notification.moderation_warning.action_none": "Kontoen din har fått en advarsel fra en moderator.",
"notification.own_poll": "Avstemningen din er ferdig",
"notification.reblog": "{name} fremhevet ditt innlegg",
"notification.relationships_severance_event.learn_more": "Lær mer",
@@ -523,7 +601,11 @@
"notification_requests.dismiss": "Lukk",
"notification_requests.edit_selection": "Redigér",
"notification_requests.exit_selection": "Ferdig",
+ "notification_requests.explainer_for_limited_remote_account": "Varsler fra denne kontoen har blitt filtrert bort fordi kontoen eller serveren den er på har blitt sensurert av en moderator.",
+ "notification_requests.maximize": "Maksimer",
"notification_requests.minimize_banner": "Minimer banneret for filtrerte varsler",
+ "notification_requests.notifications_from": "Varsler fra {name}",
+ "notification_requests.title": "Filtrerte varlser",
"notification_requests.view": "Vis varsler",
"notifications.clear": "Fjern varsler",
"notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
@@ -583,6 +665,7 @@
"onboarding.follows.done": "Ferdig",
"onboarding.follows.empty": "Dessverre kan ingen resultater vises akkurat nå. Du kan prøve å bruke søk eller bla gjennom utforske-siden for å finne folk å følge, eller prøve igjen senere.",
"onboarding.follows.search": "Søk",
+ "onboarding.follows.title": "Følg folk for å komme i gang",
"onboarding.profile.discoverable": "Gjør min profil synlig",
"onboarding.profile.display_name": "Visningsnavn",
"onboarding.profile.display_name_hint": "Ditt fulle navn eller ditt morsomme navn…",
@@ -676,6 +759,7 @@
"report_notification.categories.other": "Annet",
"report_notification.categories.other_sentence": "annet",
"report_notification.categories.spam": "Søppelpost",
+ "report_notification.categories.spam_sentence": "spam",
"report_notification.categories.violation": "Regelbrudd",
"report_notification.open": "Åpne rapport",
"search.no_recent_searches": "Ingen søk nylig",
@@ -700,11 +784,14 @@
"search_results.no_results": "Ingen resultater.",
"search_results.see_all": "Se alle",
"search_results.statuses": "Innlegg",
+ "search_results.title": "Søk etter \"{q}\"",
"server_banner.about_active_users": "Personer som har brukt denne serveren i løpet av de siste 30 dagene (aktive brukere månedlig)",
"server_banner.active_users": "aktive brukere",
"server_banner.administered_by": "Administrert av:",
+ "server_banner.is_one_of_many": "{domain} er en av mange uavhengige Mastodon-servere du kan bruke for å delta i det desentraliserte sosiale nettet.",
"server_banner.server_stats": "Serverstatistikk:",
"sign_in_banner.create_account": "Opprett konto",
+ "sign_in_banner.follow_anyone": "Følg hvem som helst på tvers av det desentraliserte sosiale nettet. Ingen algoritmer, reklamer eller clickbait.",
"sign_in_banner.sign_in": "Logg inn",
"sign_in_banner.sso_redirect": "Logg inn eller registrer deg",
"status.admin_account": "Åpne moderatorgrensesnittet for @{name}",
@@ -714,12 +801,14 @@
"status.bookmark": "Bokmerke",
"status.cancel_reblog_private": "Fjern fremheving",
"status.cannot_reblog": "Denne posten kan ikke fremheves",
+ "status.continued_thread": "Fortsettelse av samtale",
"status.copy": "Kopier lenken til innlegget",
"status.delete": "Slett",
"status.detailed_status": "Detaljert samtalevisning",
"status.direct": "Nevn @{name} privat",
"status.direct_indicator": "Privat omtale",
"status.edit": "Rediger",
+ "status.edited": "Sist endret {date}",
"status.edited_x_times": "Redigert {count, plural,one {{count} gang} other {{count} ganger}}",
"status.favourite": "Favoritt",
"status.filter": "Filtrer dette innlegget",
@@ -735,7 +824,10 @@
"status.mute_conversation": "Demp samtale",
"status.open": "Utvid dette innlegget",
"status.pin": "Fest på profilen",
- "status.pinned": "Festet innlegg",
+ "status.quote_error.filtered": "Skjult på grunn av et av filterne dine",
+ "status.quote_error.not_found": "Dette innlegget kan ikke vises.",
+ "status.quote_error.pending_approval": "Dette innlegget venter på godkjenning fra den opprinnelige forfatteren.",
+ "status.quote_error.rejected": "Dette innlegget kan ikke vises fordi den opprinnelige forfatteren ikke har tillatt at det blir sitert.",
"status.read_more": "Les mer",
"status.reblog": "Fremhev",
"status.reblog_private": "Fremhev til det opprinnelige publikummet",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 74ae8fad4d..f328f2eef3 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -20,7 +20,6 @@
"account.copy": "Copiar lo ligam del perfil",
"account.direct": "Mencionar @{name} en privat",
"account.disable_notifications": "Quitar de m’avisar quand @{name} publica quicòm",
- "account.domain_blocked": "Domeni amagat",
"account.edit_profile": "Modificar lo perfil",
"account.enable_notifications": "M’avisar quand @{name} publica quicòm",
"account.endorse": "Mostrar pel perfil",
@@ -46,7 +45,6 @@
"account.mute_notifications_short": "Amudir las notificacions",
"account.mute_short": "Amudir",
"account.muted": "Mes en silenci",
- "account.mutual": "Mutual",
"account.no_bio": "Cap de descripcion pas fornida.",
"account.open_original_page": "Dobrir la pagina d’origina",
"account.posts": "Tuts",
@@ -496,7 +494,6 @@
"status.mute_conversation": "Rescondre la conversacion",
"status.open": "Desplegar aqueste estatut",
"status.pin": "Penjar al perfil",
- "status.pinned": "Tut penjat",
"status.read_more": "Ne legir mai",
"status.reblog": "Partejar",
"status.reblog_private": "Partejar a l’audiéncia d’origina",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index c294bcbddb..c4ac296d26 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -15,7 +15,6 @@
"account.cancel_follow_request": "ਫ਼ਾਲੋ ਕਰਨ ਨੂੰ ਰੱਦ ਕਰੋ",
"account.copy": "ਪਰੋਫਾਇਲ ਲਈ ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
"account.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ @{name}",
- "account.domain_blocked": "ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ",
"account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ",
"account.enable_notifications": "ਜਦੋਂ {name} ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਦਿਓ",
"account.endorse": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਫ਼ੀਚਰ",
@@ -35,7 +34,6 @@
"account.mute_notifications_short": "ਨੋਟਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਮੌਨ ਕਰੋ",
"account.mute_short": "ਮੌਨ ਕਰੋ",
"account.muted": "ਮੌਨ ਕੀਤੀਆਂ",
- "account.mutual": "ਸਾਂਝੇ",
"account.no_bio": "ਕੋਈ ਵਰਣਨ ਨਹੀਂ ਦਿੱਤਾ।",
"account.open_original_page": "ਅਸਲ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹੋ",
"account.posts": "ਪੋਸਟਾਂ",
@@ -323,7 +321,6 @@
"lists.done": "ਮੁਕੰਮਲ",
"lists.edit": "ਸੂਚੀ ਨੂੰ ਸੋਧੋ",
"lists.find_users_to_add": "ਜੋੜਨ ਲਈ ਵਰਤੋਂਕਾਰ ਲੱਭੋ",
- "lists.list_members": "ਮੈਂਬਰਾਂ ਦੀ ਸੂਚੀ",
"lists.list_members_count": "{count, plural, one {# ਮੈਂਬਰ} other {# ਮੈਂਬਰ}}",
"lists.list_name": "ਸੂਚੀ ਦਾ ਨਾਂ",
"lists.new_list_name": "ਨਵੀਂ ਸੂਚੀਂ ਦਾ ਨਾਂ",
@@ -531,7 +528,6 @@
"status.mute_conversation": "ਗੱਲਬਾਤ ਨੂੰ ਮੌਨ ਕਰੋ",
"status.open": "ਇਹ ਪੋਸਟ ਨੂੰ ਫੈਲਾਓ",
"status.pin": "ਪਰੋਫਾਈਲ ਉੱਤੇ ਟੰਗੋ",
- "status.pinned": "ਟੰਗੀ ਹੋਈ ਪੋਸਟ",
"status.read_more": "ਹੋਰ ਪੜ੍ਹੋ",
"status.reblog": "ਵਧਾਓ",
"status.reblogged_by": "{name} ਨੇ ਬੂਸਟ ਕੀਤਾ",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index ed827bcf29..ecf52b963c 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -23,7 +23,6 @@
"account.copy": "Skopiuj link do profilu",
"account.direct": "Napisz bezpośrednio do @{name}",
"account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}",
- "account.domain_blocked": "Ukryto domenę",
"account.edit_profile": "Edytuj profil",
"account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}",
"account.endorse": "Wyróżnij na profilu",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Wycisz powiadomienia",
"account.mute_short": "Wycisz",
"account.muted": "Wyciszony",
- "account.mutual": "Znajomi",
"account.no_bio": "Brak opisu.",
"account.open_original_page": "Otwórz stronę oryginalną",
"account.posts": "Wpisy",
@@ -494,7 +492,6 @@
"lists.exclusive": "Nie pokazuj w mojej osi czasu",
"lists.exclusive_hint": "Wpisy osób znajdujących się na tej liście nie będą wyświetlane w twojej osi czasu, aby uniknąć duplikowania tych samych wpisów.",
"lists.find_users_to_add": "Znajdź kogoś, aby dodać",
- "lists.list_members": "Lista osób",
"lists.list_members_count": "{count, plural, one {# osoba} few {# osoby} many {# osób} other {# osób}}",
"lists.list_name": "Nazwa listy",
"lists.new_list_name": "Nazwa nowej listy",
@@ -840,7 +837,6 @@
"status.mute_conversation": "Wycisz konwersację",
"status.open": "Rozszerz ten wpis",
"status.pin": "Przypnij do profilu",
- "status.pinned": "Przypięty wpis",
"status.read_more": "Czytaj dalej",
"status.reblog": "Podbij",
"status.reblog_private": "Podbij dla odbiorców oryginalnego wpisu",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 55cfeea582..d539607e44 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -19,14 +19,21 @@
"account.block_domain": "Bloquear domínio {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueado",
+ "account.blocking": "Bloqueando",
"account.cancel_follow_request": "Cancelar solicitação para seguir",
"account.copy": "Copiar link do perfil",
"account.direct": "Mencione em privado @{name}",
"account.disable_notifications": "Cancelar notificações de @{name}",
- "account.domain_blocked": "Domínio bloqueado",
+ "account.domain_blocking": "Bloqueando domínio",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificar novos toots de @{name}",
"account.endorse": "Recomendar",
+ "account.familiar_followers_many": "Seguido por {name1}, {name2}, e {othersCount, plural, one {um outro que você conhece} other {# outros que você conhece}}",
+ "account.familiar_followers_one": "Seguido por {name1}",
+ "account.familiar_followers_two": "Seguido por {name1} e {name2}",
+ "account.featured": "Em destaque",
+ "account.featured.accounts": "Perfis",
+ "account.featured.hashtags": "Hashtags",
"account.featured_tags.last_status_at": "Última publicação em {date}",
"account.featured_tags.last_status_never": "Sem publicações",
"account.follow": "Seguir",
@@ -34,9 +41,11 @@
"account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.followers_you_know_counter": "{counter} que você sabe",
"account.following": "Seguindo",
"account.following_counter": "{count, plural, one {{counter} seguindo} other {{counter} seguindo}}",
"account.follows.empty": "Nada aqui.",
+ "account.follows_you": "Segue você",
"account.go_to_profile": "Ir ao perfil",
"account.hide_reblogs": "Ocultar boosts de @{name}",
"account.in_memoriam": "Em memória.",
@@ -51,14 +60,17 @@
"account.mute_notifications_short": "Silenciar notificações",
"account.mute_short": "Silenciar",
"account.muted": "Silenciado",
- "account.mutual": "Mútuo",
+ "account.muting": "Silenciando",
+ "account.mutual": "Vocês se seguem",
"account.no_bio": "Nenhuma descrição fornecida.",
"account.open_original_page": "Abrir a página original",
"account.posts": "Toots",
"account.posts_with_replies": "Com respostas",
+ "account.remove_from_followers": "Remover {name} dos seguidores",
"account.report": "Denunciar @{name}",
"account.requested": "Aguardando aprovação. Clique para cancelar a solicitação",
"account.requested_follow": "{name} quer te seguir",
+ "account.requests_to_follow_you": "Pediu para seguir você",
"account.share": "Compartilhar perfil de @{name}",
"account.show_reblogs": "Mostrar boosts de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
@@ -226,6 +238,9 @@
"confirmations.redraft.confirm": "Excluir e rascunhar",
"confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.",
"confirmations.redraft.title": "Excluir e rascunhar publicação?",
+ "confirmations.remove_from_followers.confirm": "Remover seguidor",
+ "confirmations.remove_from_followers.message": "{name} vai parar de te seguir. Tem certeza de que deseja continuar?",
+ "confirmations.remove_from_followers.title": "Remover seguidor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder agora sobrescreverá o toot que você está compondo. Deseja continuar?",
"confirmations.reply.title": "Sobrescrever o post?",
@@ -293,6 +308,7 @@
"emoji_button.search_results": "Resultado da pesquisa",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viagem e Lugares",
+ "empty_column.account_featured_other.unknown": "Esta conta ainda não destacou nada.",
"empty_column.account_hides_collections": "A pessoa optou por não disponibilizar esta informação",
"empty_column.account_suspended": "Conta suspensa",
"empty_column.account_timeline": "Nada aqui.",
@@ -377,6 +393,8 @@
"generic.saved": "Salvo",
"getting_started.heading": "Primeiros passos",
"hashtag.admin_moderation": "Abrir interface de moderação para #{name}",
+ "hashtag.browse": "Buscar postagens em #{hashtag}",
+ "hashtag.browse_from_account": "Procurar mensagens de @{name} em #{hashtag}",
"hashtag.column_header.tag_mode.all": "e {additional}",
"hashtag.column_header.tag_mode.any": "ou {additional}",
"hashtag.column_header.tag_mode.none": "sem {additional}",
@@ -389,7 +407,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicação} other {{counter} publicações}} hoje",
+ "hashtag.feature": "Destacar no perfil",
"hashtag.follow": "Seguir hashtag",
+ "hashtag.mute": "Silenciar #{hashtag}",
+ "hashtag.unfeature": "Não destacar no perfil",
"hashtag.unfollow": "Parar de seguir hashtag",
"hashtags.and_other": "…e {count, plural, one {}other {outros #}}",
"hints.profiles.followers_may_be_missing": "Os seguidores deste perfil podem estar faltando.",
@@ -495,7 +516,6 @@
"lists.exclusive": "Ocultar membros no início",
"lists.exclusive_hint": "Se existe alguém nesta lista, oculte-os no seu feed inicial para evitar ver suas publicações duas vezes.",
"lists.find_users_to_add": "Encontrar usuários para adicionar",
- "lists.list_members": "Membros da lista",
"lists.list_members_count": "{count, plural, one {# membro} other {# membros}}",
"lists.list_name": "Nome da lista",
"lists.new_list_name": "Nome novo da lista",
@@ -841,7 +861,13 @@
"status.mute_conversation": "Silenciar conversa",
"status.open": "Abrir toot",
"status.pin": "Fixar",
- "status.pinned": "Toot fixado",
+ "status.quote_error.filtered": "Oculto devido a um dos seus filtros",
+ "status.quote_error.not_found": "Esta postagem não pode ser exibida.",
+ "status.quote_error.pending_approval": "Esta postagem está pendente de aprovação do autor original.",
+ "status.quote_error.rejected": "Esta publicação não pode ser exibida porque o autor original não permite que seja citada.",
+ "status.quote_error.removed": "Esta postagem foi removida pelo autor.",
+ "status.quote_error.unauthorized": "Esta publicação não pode ser exibida, pois, você não está autorizado a vê-la.",
+ "status.quote_post_author": "Publicação por {name}",
"status.read_more": "Ler mais",
"status.reblog": "Dar boost",
"status.reblog_private": "Dar boost para o mesmo público",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 87c9e5846a..d3078108d2 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -1,13 +1,15 @@
{
"about.blocks": "Servidores moderados",
"about.contact": "Contacto:",
- "about.disclaimer": "O Mastodon é um software livre, de código aberto e uma marca registada de Mastodon gGmbH.",
+ "about.default_locale": "Padrão",
+ "about.disclaimer": "O Mastodon é um ‘software’ livre, de código aberto e uma marca registada de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Motivo não disponível",
- "about.domain_blocks.preamble": "O Mastodon geralmente permite ver e interagir com o conteúdo de utilizadores de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.",
+ "about.domain_blocks.preamble": "O Mastodon ver e interagir com o conteúdo de utilizadores de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.",
"about.domain_blocks.silenced.explanation": "Normalmente não verás perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou optes por segui-los.",
"about.domain_blocks.silenced.title": "Limitados",
"about.domain_blocks.suspended.explanation": "Nenhum dado deste servidor será processado, armazenado ou trocado, tornando impossível qualquer interação ou comunicação com os utilizadores a partir deste servidor.",
"about.domain_blocks.suspended.title": "Suspensos",
+ "about.language_label": "Idioma",
"about.not_available": "Esta informação não foi disponibilizada neste servidor.",
"about.powered_by": "Rede social descentralizada baseada no {mastodon}",
"about.rules": "Regras do servidor",
@@ -19,14 +21,21 @@
"account.block_domain": "Bloquear domínio {domain}",
"account.block_short": "Bloquear",
"account.blocked": "Bloqueado",
+ "account.blocking": "A bloquear",
"account.cancel_follow_request": "Retirar pedido para seguir",
"account.copy": "Copiar hiperligação do perfil",
"account.direct": "Mencionar @{name} em privado",
"account.disable_notifications": "Parar de me notificar das publicações de @{name}",
- "account.domain_blocked": "Domínio bloqueado",
+ "account.domain_blocking": "A bloquear domínio",
"account.edit_profile": "Editar perfil",
"account.enable_notifications": "Notificar-me das publicações de @{name}",
"account.endorse": "Destacar no perfil",
+ "account.familiar_followers_many": "Seguido por {name1}, {name2} e {othersCount, plural,one {mais uma pessoa que conhece} other {# outras pessoas que conhece}}",
+ "account.familiar_followers_one": "Seguido por {name1}",
+ "account.familiar_followers_two": "Seguido por {name1} e {name2}",
+ "account.featured": "Destaques",
+ "account.featured.accounts": "Perfis",
+ "account.featured.hashtags": "Etiquetas",
"account.featured_tags.last_status_at": "Última publicação em {date}",
"account.featured_tags.last_status_never": "Sem publicações",
"account.follow": "Seguir",
@@ -34,9 +43,11 @@
"account.followers": "Seguidores",
"account.followers.empty": "Ainda ninguém segue este utilizador.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
+ "account.followers_you_know_counter": "{counter} que conhece",
"account.following": "A seguir",
"account.following_counter": "{count, plural, one {A seguir {counter}} other {A seguir {counter}}}",
"account.follows.empty": "Este utilizador ainda não segue ninguém.",
+ "account.follows_you": "Segue-te",
"account.go_to_profile": "Ir para o perfil",
"account.hide_reblogs": "Esconder partilhas impulsionadas de @{name}",
"account.in_memoriam": "Em Memória.",
@@ -51,14 +62,17 @@
"account.mute_notifications_short": "Ocultar notificações",
"account.mute_short": "Ocultar",
"account.muted": "Ocultada",
- "account.mutual": "Mútuo",
+ "account.muting": "A silenciar",
+ "account.mutual": "Seguem-se mutuamente",
"account.no_bio": "Nenhuma descrição fornecida.",
"account.open_original_page": "Abrir a página original",
"account.posts": "Publicações",
"account.posts_with_replies": "Publicações e respostas",
+ "account.remove_from_followers": "Remover {name} dos seguidores",
"account.report": "Denunciar @{name}",
"account.requested": "A aguardar aprovação. Clica para cancelar o pedido para seguir",
"account.requested_follow": "{name} pediu para seguir-te",
+ "account.requests_to_follow_you": "Pediu para seguir-te",
"account.share": "Partilhar o perfil @{name}",
"account.show_reblogs": "Mostrar partilhas impulsionadas de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
@@ -118,8 +132,8 @@
"block_modal.remote_users_caveat": "Vamos pedir ao servidor {domain} para respeitar a tua decisão. No entanto, não é garantido o seu cumprimento, uma vez que alguns servidores podem tratar os bloqueios de forma diferente. As publicações públicas podem continuar a ser visíveis para utilizadores não autenticados.",
"block_modal.show_less": "Mostrar menos",
"block_modal.show_more": "Mostrar mais",
- "block_modal.they_cant_mention": "Ele não te pode mencionar nem seguir.",
- "block_modal.they_cant_see_posts": "Não verás as publicações dele e ele não poderá ver as tuas publicações.",
+ "block_modal.they_cant_mention": "Ele não o pode mencionar nem seguir.",
+ "block_modal.they_cant_see_posts": "Eles não podem ver as suas publicações e você não verá as deles.",
"block_modal.they_will_know": "Ele pode ver que o bloqueaste.",
"block_modal.title": "Bloquear utilizador?",
"block_modal.you_wont_see_mentions": "Não verás publicações que mencionem este utilizador.",
@@ -226,6 +240,9 @@
"confirmations.redraft.confirm": "Eliminar e reescrever",
"confirmations.redraft.message": "Tens a certeza de que queres eliminar e tornar a escrever esta publicação? Os favoritos e as publicações impulsionadas perder-se-ão e as respostas à publicação original ficarão órfãs.",
"confirmations.redraft.title": "Eliminar e reescrever publicação?",
+ "confirmations.remove_from_followers.confirm": "Remover seguidor",
+ "confirmations.remove_from_followers.message": "{name} vai parar de seguir-te. Tens a certeza que prentedes continuar?",
+ "confirmations.remove_from_followers.title": "Remover seguidor?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Se responderes agora, a mensagem que estás a escrever será substituída. Tens a certeza que pretendes continuar?",
"confirmations.reply.title": "Substituir publicação?",
@@ -293,6 +310,9 @@
"emoji_button.search_results": "Resultados da pesquisa",
"emoji_button.symbols": "Símbolos",
"emoji_button.travel": "Viagens e lugares",
+ "empty_column.account_featured.me": "Ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?",
+ "empty_column.account_featured.other": "{acct} ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?",
+ "empty_column.account_featured_other.unknown": "Esta conta ainda não colocou nada em destaque.",
"empty_column.account_hides_collections": "Este utilizador escolheu não disponibilizar esta informação",
"empty_column.account_suspended": "Conta suspensa",
"empty_column.account_timeline": "Sem publicações por aqui!",
@@ -325,6 +345,11 @@
"explore.trending_links": "Notícias",
"explore.trending_statuses": "Publicações",
"explore.trending_tags": "#Etiquetas",
+ "featured_carousel.header": "{count, plural, one {Publicação Afixada} other {Publicações Afixadas}}",
+ "featured_carousel.next": "Seguinte",
+ "featured_carousel.post": "Publicação",
+ "featured_carousel.previous": "Anterior",
+ "featured_carousel.slide": "{index} de {total}",
"filter_modal.added.context_mismatch_explanation": "Esta categoria de filtro não se aplica ao contexto em que acedeste a esta publicação. Se pretenderes que esta publicação seja filtrada também neste contexto, terás que editar o filtro.",
"filter_modal.added.context_mismatch_title": "O contexto não coincide!",
"filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, tens de alterar a data de validade para que ele seja aplicado.",
@@ -377,6 +402,8 @@
"generic.saved": "Guardado",
"getting_started.heading": "Primeiros passos",
"hashtag.admin_moderation": "Abrir interface de moderação para #{name}",
+ "hashtag.browse": "Ver publicações em #{hashtag}",
+ "hashtag.browse_from_account": "Ver publicações de @{name} em #{hashtag}",
"hashtag.column_header.tag_mode.all": "e {additional}",
"hashtag.column_header.tag_mode.any": "ou {additional}",
"hashtag.column_header.tag_mode.none": "sem {additional}",
@@ -389,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural,one {{counter} participante} other {{counter} participantes}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicação} other {{counter} publicações}} hoje",
+ "hashtag.feature": "Destacar no perfil",
"hashtag.follow": "Seguir #etiqueta",
+ "hashtag.mute": "Silenciar #{hashtag}",
+ "hashtag.unfeature": "Não destacar no perfil",
"hashtag.unfollow": "Deixar de seguir #etiqueta",
"hashtags.and_other": "…e {count, plural, other {mais #}}",
"hints.profiles.followers_may_be_missing": "É possível que não estejam a ser mostrados todos os seguidores deste perfil.",
@@ -400,6 +430,7 @@
"hints.profiles.see_more_posts": "Ver mais publicações em {domain}",
"hints.threads.replies_may_be_missing": "É possível que não estejam a ser mostradas todas as respostas de outros servidores.",
"hints.threads.see_more": "Ver mais respostas em {domain}",
+ "home.column_settings.show_quotes": "Mostrar citações",
"home.column_settings.show_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respostas",
"home.hide_announcements": "Ocultar mensagens de manutenção",
@@ -495,7 +526,6 @@
"lists.exclusive": "Ocultar membros na página inicial",
"lists.exclusive_hint": "Se alguém estiver nesta lista, oculta-o na cronologia da tua página inicial para evitar veres as publicações dessa pessoa duas vezes.",
"lists.find_users_to_add": "Encontrar utilizadores para adicionar",
- "lists.list_members": "Membros da lista",
"lists.list_members_count": "{count, plural, one {# membro} other {# membros}}",
"lists.list_name": "Nome da lista",
"lists.new_list_name": "Nome da nova lista",
@@ -841,7 +871,13 @@
"status.mute_conversation": "Ocultar conversa",
"status.open": "Expandir esta publicação",
"status.pin": "Afixar no perfil",
- "status.pinned": "Publicação afixada",
+ "status.quote_error.filtered": "Oculto devido a um dos seus filtros",
+ "status.quote_error.not_found": "Esta publicação não pode ser exibida.",
+ "status.quote_error.pending_approval": "Esta publicação está a aguardar a aprovação do autor original.",
+ "status.quote_error.rejected": "Esta publicação não pode ser exibida porque o autor original não permite que seja citada.",
+ "status.quote_error.removed": "Esta publicação foi removida pelo seu autor.",
+ "status.quote_error.unauthorized": "Esta publicação não pode ser exibida porque o utilizador não está autorizado a visualizá-la.",
+ "status.quote_post_author": "Publicação de {name}",
"status.read_more": "Ler mais",
"status.reblog": "Impulsionar",
"status.reblog_private": "Impulsionar com a visibilidade original",
@@ -905,6 +941,12 @@
"video.expand": "Expandir vídeo",
"video.fullscreen": "Ecrã completo",
"video.hide": "Ocultar vídeo",
+ "video.mute": "Silenciar",
"video.pause": "Pausar",
- "video.play": "Reproduzir"
+ "video.play": "Reproduzir",
+ "video.skip_backward": "Saltar para trás",
+ "video.skip_forward": "Saltar para a frente",
+ "video.unmute": "Ativar som",
+ "video.volume_down": "Diminuir volume",
+ "video.volume_up": "Aumentar volume"
}
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 8fec42bbd0..83d1c4ba5a 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -23,7 +23,6 @@
"account.copy": "Copiază link-ul profilului",
"account.direct": "Menționează pe @{name} în privat",
"account.disable_notifications": "Nu îmi mai trimite notificări când postează @{name}",
- "account.domain_blocked": "Domeniu blocat",
"account.edit_profile": "Modifică profilul",
"account.enable_notifications": "Trimite-mi o notificare când postează @{name}",
"account.endorse": "Promovează pe profil",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Amuțește notificările",
"account.mute_short": "Ignoră",
"account.muted": "Pus pe silențios",
- "account.mutual": "Mutual",
"account.no_bio": "Nicio descriere furnizată.",
"account.open_original_page": "Deschide pagina originală",
"account.posts": "Postări",
@@ -543,7 +541,6 @@
"status.mute_conversation": "Ignoră conversația",
"status.open": "Extinde această stare",
"status.pin": "Fixează pe profil",
- "status.pinned": "Postare fixată",
"status.read_more": "Citește mai mult",
"status.reblog": "Impuls",
"status.reblog_private": "Impulsionează către audiența originală",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index aaa73f51be..9eed6ab1dc 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -4,7 +4,7 @@
"about.disclaimer": "Mastodon — свободное программное обеспечение с открытым исходным кодом и торговая марка Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Причина не указана",
"about.domain_blocks.preamble": "Mastodon обычно позволяет просматривать содержимое и взаимодействовать с пользователями любых других серверов в федивёрсе. Вот исключения, сделанные конкретно для этого сервера.",
- "about.domain_blocks.silenced.explanation": "Как правило, вы не увидите профили и контент с этого сервера, если вы специально не будете их искать или не подпишетесь на них.",
+ "about.domain_blocks.silenced.explanation": "Как правило, вы не увидите профили и контент с этого сервера, если специально не будете их искать или не подпишетесь на них.",
"about.domain_blocks.silenced.title": "Ограничивается",
"about.domain_blocks.suspended.explanation": "Никакие данные с этого сервера не будут обрабатываться, храниться или обмениваться, что делает невозможным любое взаимодействие или связь с пользователями с этого сервера.",
"about.domain_blocks.suspended.title": "Заблокирован",
@@ -19,17 +19,18 @@
"account.block_domain": "Заблокировать {domain}",
"account.block_short": "Заблокировать",
"account.blocked": "Заблокирован(а)",
+ "account.blocking": "Заблокирован(а)",
"account.cancel_follow_request": "Отозвать запрос на подписку",
"account.copy": "Копировать ссылку на профиль",
"account.direct": "Упомянуть @{name} лично",
"account.disable_notifications": "Не уведомлять о постах от @{name}",
- "account.domain_blocked": "Домен заблокирован",
+ "account.domain_blocking": "Домен заблокирован",
"account.edit_profile": "Редактировать",
"account.enable_notifications": "Уведомлять о постах от @{name}",
"account.endorse": "Рекомендовать в профиле",
- "account.featured": "Избранное",
- "account.featured.hashtags": "Хэштеги",
- "account.featured.posts": "Посты",
+ "account.featured": "Закреплённые…",
+ "account.featured.accounts": "Профили",
+ "account.featured.hashtags": "Хештеги",
"account.featured_tags.last_status_at": "Последний пост {date}",
"account.featured_tags.last_status_never": "Нет постов",
"account.follow": "Подписаться",
@@ -40,6 +41,7 @@
"account.following": "Подписки",
"account.following_counter": "{count, plural, one {# подписка} many {# подписок} other {# подписки}}",
"account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
+ "account.follows_you": "Подписан(а) на вас",
"account.go_to_profile": "Перейти к профилю",
"account.hide_reblogs": "Скрыть продвижения от @{name}",
"account.in_memoriam": "In Memoriam.",
@@ -54,14 +56,17 @@
"account.mute_notifications_short": "Отключить уведомления",
"account.mute_short": "Игнорировать",
"account.muted": "Игнорируется",
- "account.mutual": "Взаимные подписки",
+ "account.muting": "Игнорируется",
+ "account.mutual": "Вы подписаны друг на друга",
"account.no_bio": "Описание профиля отсутствует.",
"account.open_original_page": "Открыть исходную страницу",
"account.posts": "Посты",
"account.posts_with_replies": "Посты и ответы",
+ "account.remove_from_followers": "Убрать {name} из подписчиков",
"account.report": "Пожаловаться на @{name}",
"account.requested": "Ожидает подтверждения. Нажмите для отмены запроса",
"account.requested_follow": "{name} отправил(а) вам запрос на подписку",
+ "account.requests_to_follow_you": "Отправил(а) вам запрос на подписку",
"account.share": "Поделиться профилем @{name}",
"account.show_reblogs": "Показывать продвижения от @{name}",
"account.statuses_counter": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}",
@@ -80,10 +85,10 @@
"admin.dashboard.retention.average": "В среднем",
"admin.dashboard.retention.cohort": "Месяц регистрации",
"admin.dashboard.retention.cohort_size": "Новые пользователи",
- "admin.impact_report.instance_accounts": "Профили учетных записей, которые будут удалены",
- "admin.impact_report.instance_followers": "Подписчики, которых потеряют наши пользователи",
- "admin.impact_report.instance_follows": "Подписчики, которых потеряют их пользователи",
- "admin.impact_report.title": "Резюме воздействия",
+ "admin.impact_report.instance_accounts": "Число профилей, которые будут удалены",
+ "admin.impact_report.instance_followers": "Число подписчиков, которых лишатся наши пользователи",
+ "admin.impact_report.instance_follows": "Число подписчиков, которых лишатся их пользователи",
+ "admin.impact_report.title": "Сводка последствий",
"alert.rate_limited.message": "Подождите до {retry_time, time, medium}, прежде чем делать что-либо ещё.",
"alert.rate_limited.title": "Слишком много запросов",
"alert.unexpected.message": "Произошла непредвиденная ошибка.",
@@ -93,8 +98,8 @@
"alt_text_modal.add_text_from_image": "Добавить текст из изображения",
"alt_text_modal.cancel": "Отмена",
"alt_text_modal.change_thumbnail": "Изменить обложку",
- "alt_text_modal.describe_for_people_with_hearing_impairments": "Опишите то, что слышите, для людей с нарушениями слуха…",
- "alt_text_modal.describe_for_people_with_visual_impairments": "Опишите то, что видите, для людей с нарушениями зрения…",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Добавьте описание для людей с нарушениями слуха…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Добавьте описание для людей с нарушениями зрения…",
"alt_text_modal.done": "Готово",
"announcement.announcement": "Объявление",
"annual_report.summary.archetype.booster": "Репостер",
@@ -110,7 +115,7 @@
"annual_report.summary.highlighted_post.by_replies": "пост с наибольшим количеством ответов",
"annual_report.summary.highlighted_post.possessive": "{name}",
"annual_report.summary.most_used_app.most_used_app": "наиболее часто используемое приложение",
- "annual_report.summary.most_used_hashtag.most_used_hashtag": "наиболее часто используемый хэштег",
+ "annual_report.summary.most_used_hashtag.most_used_hashtag": "наиболее часто используемый хештег",
"annual_report.summary.most_used_hashtag.none": "Нет",
"annual_report.summary.new_posts.new_posts": "новых постов",
"annual_report.summary.percentile.text": "Всё это помещает вас в топ пользователей {domain}. ",
@@ -184,7 +189,7 @@
"compose.saved.body": "Пост отредактирован.",
"compose_form.direct_message_warning_learn_more": "Узнать больше",
"compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.",
- "compose_form.hashtag_warning": "Этот пост не появится в поиске по хэштегам, так как он не обозначен как публичный. Только публичные посты можно найти по хэштегу.",
+ "compose_form.hashtag_warning": "Этот пост не появится в поиске по хештегам, так как он не обозначен как публичный. Только публичные посты можно найти по хештегу.",
"compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "не закрыта",
"compose_form.placeholder": "О чём думаете?",
@@ -211,7 +216,7 @@
"confirmations.delete_list.message": "Вы уверены, что хотите навсегда удалить этот список?",
"confirmations.delete_list.title": "Удалить список?",
"confirmations.discard_edit_media.confirm": "Сбросить",
- "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения, касающиеся описания медиа или области предпросмотра, сбросить их?",
+ "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения, касающиеся описания медиа или области предпросмотра. Сбросить их?",
"confirmations.edit.confirm": "Редактировать",
"confirmations.edit.message": "Если вы начнёте редактировать сейчас, то набираемый в данный момент пост будет стёрт. Вы уверены, что хотите продолжить?",
"confirmations.edit.title": "Стереть несохранённый черновик поста?",
@@ -229,6 +234,9 @@
"confirmations.redraft.confirm": "Удалить и исправить",
"confirmations.redraft.message": "Вы уверены, что хотите удалить этот пост и создать его заново? Взаимодействия, такие как добавление в избранное или продвижение, будут потеряны, а ответы к оригинальному посту перестанут на него ссылаться.",
"confirmations.redraft.title": "Удалить и создать пост заново?",
+ "confirmations.remove_from_followers.confirm": "Убрать подписчика",
+ "confirmations.remove_from_followers.message": "Пользователь {name} перестанет быть подписан на вас. Продолжить?",
+ "confirmations.remove_from_followers.title": "Убрать подписчика?",
"confirmations.reply.confirm": "Ответить",
"confirmations.reply.message": "Если вы начнёте составлять ответ сейчас, то набираемый в данный момент пост будет стёрт. Вы уверены, что хотите продолжить?",
"confirmations.reply.title": "Стереть несохранённый черновик поста?",
@@ -255,7 +263,7 @@
"dismissable_banner.dismiss": "Закрыть",
"dismissable_banner.explore_links": "Об этих новостях говорят в федивёрсе прямо сейчас. Свежие новости, опубликованные несколькими разными людьми, ранжируются выше.",
"dismissable_banner.explore_statuses": "Эти посты со всего федивёрса прямо сейчас набирают популярность. Более новые посты с более высоким количеством взаимодействий ранжируются выше.",
- "dismissable_banner.explore_tags": "Эти хэштеги набирают популярность в федивёрсе прямо сейчас. Хэштеги, используемые несколькими разными людьми, ранжируются выше.",
+ "dismissable_banner.explore_tags": "Эти хештеги набирают популярность в федивёрсе прямо сейчас. Хештеги, используемые несколькими разными людьми, ранжируются выше.",
"dismissable_banner.public_timeline": "Это самые новые публичные посты от всех тех людей в федивёрсе, на которых подписаны пользователи {domain}.",
"domain_block_modal.block": "Заблокировать сервер",
"domain_block_modal.block_account_instead": "Заблокировать @{name}",
@@ -275,7 +283,7 @@
"domain_pill.username": "Имя пользователя",
"domain_pill.whats_in_a_handle": "Что это значит?",
"domain_pill.who_they_are": "Поскольку адрес позволяет однозначно определить, кто и где находится, вы можете взаимодействовать с пользователями социальной сети платформ, работающих на протоколе ActivityPub .",
- "domain_pill.who_you_are": "Поскольку ваш адрес позволяет однозначно определить, кто вы и где находитесь, пользователи социальной сети платформ, работающих на протоколе ActivityPub могут взаимодействовать с вами.",
+ "domain_pill.who_you_are": "Поскольку ваш адрес позволяет однозначно определить, кто вы и где находитесь, пользователи социальной сети платформ, работающих на протоколе ActivityPub , могут взаимодействовать с вами.",
"domain_pill.your_handle": "Ваш адрес:",
"domain_pill.your_server": "Ваш цифровой дом, где находятся все ваши посты. Если вам не нравится этот сервер, вы можете в любое время перенести свою учётную запись на другой сервер, не теряя подписчиков.",
"domain_pill.your_username": "Ваш уникальный идентификатор на этом сервере. На разных серверах могут встречаться люди с тем же именем пользователя.",
@@ -296,6 +304,7 @@
"emoji_button.search_results": "Результаты поиска",
"emoji_button.symbols": "Символы",
"emoji_button.travel": "Путешествия и места",
+ "empty_column.account_featured_other.unknown": "Этот пользователь ещё ничего не закрепил в своём профиле.",
"empty_column.account_hides_collections": "Пользователь предпочёл не раскрывать эту информацию",
"empty_column.account_suspended": "Учётная запись заблокирована",
"empty_column.account_timeline": "Здесь нет постов!",
@@ -303,72 +312,72 @@
"empty_column.blocks": "Вы ещё никого не заблокировали.",
"empty_column.bookmarked_statuses": "У вас пока нет закладок. Когда вы добавляете пост в закладки, он появляется здесь.",
"empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!",
- "empty_column.direct": "У вас пока нет личных сообщений. Как только вы отправите или получите сообщение, оно появится здесь.",
+ "empty_column.direct": "Вы ещё не упоминали кого-либо и сами не были ни разу упомянуты лично. Все личные упоминания будут показаны здесь.",
"empty_column.domain_blocks": "Заблокированных доменов пока нет.",
- "empty_column.explore_statuses": "Нет актуального. Проверьте позже!",
- "empty_column.favourited_statuses": "Вы не добавили ни один пост в «Избранное». Как только вы это сделаете, он появится здесь.",
- "empty_column.favourites": "Никто ещё не добавил этот пост в «Избранное». Как только кто-то это сделает, это отобразится здесь.",
+ "empty_column.explore_statuses": "Сейчас нет популярных постов. Проверьте позже!",
+ "empty_column.favourited_statuses": "Вы ещё не добавили ни один пост в избранное. Все добавленные вами в избранное посты будут показаны здесь.",
+ "empty_column.favourites": "Никто ещё не добавил этот пост в избранное. Все пользователи, добавившие этот пост в избранное, будут показаны здесь.",
"empty_column.follow_requests": "Вам ещё не приходили запросы на подписку. Все новые запросы будут показаны здесь.",
- "empty_column.followed_tags": "Вы еще не подписались ни на один хэштег. Когда вы это сделаете, они появятся здесь.",
- "empty_column.hashtag": "С этим хэштегом пока ещё ничего не публиковали.",
- "empty_column.home": "Ваша лента совсем пуста! Подписывайтесь на других, чтобы заполнить её.",
- "empty_column.list": "В этом списке пока ничего нет. Когда пользователи в списке публикуют новые посты, они появляются здесь.",
- "empty_column.mutes": "Вы ещё никого не добавляли в список игнорируемых.",
+ "empty_column.followed_tags": "Вы ещё не подписались ни на один хештег. Все хештеги, на которые вы подписаны, будут показаны здесь.",
+ "empty_column.hashtag": "С этим хештегом пока ещё никто ничего не опубликовал.",
+ "empty_column.home": "Ваша домашняя лента совсем пуста! Подпишитесь на кого-нибудь, чтобы заполнить её.",
+ "empty_column.list": "В этом списке пока ничего нет. Все новые посты, опубликованные пользователями в списке, будут появляться здесь.",
+ "empty_column.mutes": "Вы пока что никого не игнорируете.",
"empty_column.notification_requests": "Здесь ничего нет! Когда вы получите новые уведомления, они здесь появятся согласно вашим настройкам.",
"empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.",
"empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других серверов, чтобы заполнить ленту",
- "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде, эта страница не может быть корректно отображена.",
- "error.unexpected_crash.explanation_addons": "Эта страница не может быть корректно отображена. Скорее всего, эта ошибка вызвана расширением браузера или инструментом автоматического перевода.",
- "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если проблема не исчезает, используйте Mastodon из-под другого браузера или приложения.",
- "error.unexpected_crash.next_steps_addons": "Попробуйте их отключить и перезагрузить страницу. Если это не поможет, вы по-прежнему сможете войти в Mastodon через другой браузер или приложение.",
+ "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде эта страница не может быть корректно отображена.",
+ "error.unexpected_crash.explanation_addons": "Эта страница не может быть корректно отображена. Скорее всего, ошибка вызвана расширением браузера или инструментом автоматического перевода.",
+ "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если это не поможет, вы, возможно, всё ещё сможете использовать Mastodon в другом браузере или приложении.",
+ "error.unexpected_crash.next_steps_addons": "Попробуйте их отключить и обновить страницу. Если это не поможет, вы, возможно, всё ещё сможете использовать Mastodon в другом браузере или приложении.",
"errors.unexpected_crash.copy_stacktrace": "Скопировать диагностическую информацию",
"errors.unexpected_crash.report_issue": "Сообщить о проблеме",
"explore.suggested_follows": "Люди",
"explore.title": "Обзор",
"explore.trending_links": "Новости",
"explore.trending_statuses": "Посты",
- "explore.trending_tags": "Хэштеги",
- "filter_modal.added.context_mismatch_explanation": "Эта категория не применяется к контексту, в котором вы получили доступ к этому посту. Если вы хотите, чтобы пост был отфильтрован в этом контексте, вам придётся отредактировать фильтр.",
+ "explore.trending_tags": "Хештеги",
+ "filter_modal.added.context_mismatch_explanation": "Этот фильтр не применяется в том контексте, в котором вы видели этот пост. Если вы хотите, чтобы пост был отфильтрован в этом контексте, необходимо редактировать фильтр.",
"filter_modal.added.context_mismatch_title": "Несоответствие контекста!",
- "filter_modal.added.expired_explanation": "Эта категория фильтра устарела, вам нужно изменить дату окончания фильтра, чтобы применить его.",
+ "filter_modal.added.expired_explanation": "Этот фильтр истёк. Чтобы он был применён, вам нужно изменить срок действия фильтра.",
"filter_modal.added.expired_title": "Истёкший фильтр!",
- "filter_modal.added.review_and_configure": "Для просмотра и настройки этой категории фильтра, перейдите в {settings_link}.",
+ "filter_modal.added.review_and_configure": "Для просмотра или редактирования этого фильтра перейдите в {settings_link}.",
"filter_modal.added.review_and_configure_title": "Настройки фильтра",
"filter_modal.added.settings_link": "настройки",
- "filter_modal.added.short_explanation": "Этот пост был добавлен в следующую категорию фильтра: {title}.",
+ "filter_modal.added.short_explanation": "Этот пост был добавлен к фильтру «{title}».",
"filter_modal.added.title": "Фильтр добавлен!",
- "filter_modal.select_filter.context_mismatch": "не применяется к этому контексту",
+ "filter_modal.select_filter.context_mismatch": "не применяется в этом контексте",
"filter_modal.select_filter.expired": "истёкший",
- "filter_modal.select_filter.prompt_new": "Новая категория: {name}",
- "filter_modal.select_filter.search": "Поиск или создание",
- "filter_modal.select_filter.subtitle": "Используйте существующую категорию или создайте новую",
+ "filter_modal.select_filter.prompt_new": "Новый фильтр: {name}",
+ "filter_modal.select_filter.search": "Поиск или название нового фильтра",
+ "filter_modal.select_filter.subtitle": "Используйте существующий фильтр или создайте новый",
"filter_modal.select_filter.title": "Фильтровать этот пост",
"filter_modal.title.status": "Фильтровать пост",
- "filter_warning.matches_filter": "Соответствует фильтру \"{title} \"",
- "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {не известных вам людей} one {# возможно вам известного человека} other {# возможно вам известных человек}}",
+ "filter_warning.matches_filter": "Соответствует фильтру «{title} »",
+ "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {не знакомых вам людей} one {# человека, которого вы можете знать} other {# человек, которых вы можете знать}}",
"filtered_notifications_banner.title": "Отфильтрованные уведомления",
"firehose.all": "Всё вместе",
"firehose.local": "Этот сервер",
"firehose.remote": "Другие серверы",
- "follow_request.authorize": "Авторизовать",
+ "follow_request.authorize": "Разрешить",
"follow_request.reject": "Отказать",
- "follow_requests.unlocked_explanation": "Хотя ваша учетная запись не закрыта, команда {domain} подумала, что вы захотите просмотреть запросы от этих учетных записей вручную.",
- "follow_suggestions.curated_suggestion": "Выбор администрации",
- "follow_suggestions.dismiss": "Больше не показывать",
- "follow_suggestions.featured_longer": "Отобранные командой {domain} вручную",
+ "follow_requests.unlocked_explanation": "Хотя ваша учётная запись не закрыта, команда сервера {domain} подумала, что вы захотите рассмотреть запросы на подписку от этих учётных записей вручную.",
+ "follow_suggestions.curated_suggestion": "Выбор команды сервера",
+ "follow_suggestions.dismiss": "Не показывать снова",
+ "follow_suggestions.featured_longer": "Вручную выбрано командой сервера {domain}",
"follow_suggestions.friends_of_friends_longer": "Популярно среди людей, на которых вы подписаны",
- "follow_suggestions.hints.featured": "Этот профиль был вручную выбран командой {domain}.",
+ "follow_suggestions.hints.featured": "Этот профиль был вручную выбран командой сервера {domain}.",
"follow_suggestions.hints.friends_of_friends": "Этот профиль популярен среди людей, на которых вы подписаны.",
- "follow_suggestions.hints.most_followed": "Этот профиль один из самых отслеживаемых на {domain}.",
- "follow_suggestions.hints.most_interactions": "Этот профиль в последнее время привлекает много внимания на {domain}.",
+ "follow_suggestions.hints.most_followed": "Этот профиль лидирует по числу подписчиков с сервера {domain}.",
+ "follow_suggestions.hints.most_interactions": "Этот профиль в последнее время привлекает много внимания на сервере {domain}.",
"follow_suggestions.hints.similar_to_recently_followed": "Этот профиль похож на другие профили, на которые вы подписывались в последнее время.",
- "follow_suggestions.personalized_suggestion": "Персонализированное предложение",
+ "follow_suggestions.personalized_suggestion": "Персональное предложение",
"follow_suggestions.popular_suggestion": "Популярное предложение",
- "follow_suggestions.popular_suggestion_longer": "Популярное на {domain}",
- "follow_suggestions.similar_to_recently_followed_longer": "Похоже на профили, на которые вы недавно подписались",
+ "follow_suggestions.popular_suggestion_longer": "Популярно на сервере {domain}",
+ "follow_suggestions.similar_to_recently_followed_longer": "Похоже на профили, на которые вы подписывались в последнее время",
"follow_suggestions.view_all": "Посмотреть все",
"follow_suggestions.who_to_follow": "На кого подписаться",
- "followed_tags": "Отслеживаемые хэштеги",
+ "followed_tags": "Подписки на хештеги",
"footer.about": "О проекте",
"footer.directory": "Каталог профилей",
"footer.get_app": "Скачать приложение",
@@ -380,28 +389,33 @@
"generic.saved": "Сохранено",
"getting_started.heading": "Добро пожаловать",
"hashtag.admin_moderation": "Открыть интерфейс модератора для #{name}",
+ "hashtag.browse": "Обзор постов с хештегом #{hashtag}",
+ "hashtag.browse_from_account": "Обзор постов от @{name} с хештегом #{hashtag}",
"hashtag.column_header.tag_mode.all": "и {additional}",
"hashtag.column_header.tag_mode.any": "или {additional}",
"hashtag.column_header.tag_mode.none": "без {additional}",
"hashtag.column_settings.select.no_options_message": "Предложений не найдено",
- "hashtag.column_settings.select.placeholder": "Введите хэштеги…",
+ "hashtag.column_settings.select.placeholder": "Введите хештеги…",
"hashtag.column_settings.tag_mode.all": "Все из списка",
"hashtag.column_settings.tag_mode.any": "Любой из списка",
"hashtag.column_settings.tag_mode.none": "Ни один из списка",
- "hashtag.column_settings.tag_toggle": "Включить дополнительные теги для этой колонки",
+ "hashtag.column_settings.tag_toggle": "Включить дополнительные теги для этого столбца",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} пользователь} few {{counter} пользователя} other {{counter} пользователей}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}} сегодня",
+ "hashtag.feature": "Закрепить в профиле",
"hashtag.follow": "Подписаться на новые посты",
- "hashtag.unfollow": "Отписаться",
+ "hashtag.mute": "Игнорировать #{hashtag}",
+ "hashtag.unfeature": "Открепить от профиля",
+ "hashtag.unfollow": "Отписаться от новых постов",
"hashtags.and_other": "…и {count, plural, other {ещё #}}",
- "hints.profiles.followers_may_be_missing": "Подписчики этого профиля могут отсутствовать.",
- "hints.profiles.follows_may_be_missing": "Подписки этого профиля могут отсутствовать.",
- "hints.profiles.posts_may_be_missing": "Некоторые сообщения этого профиля могут отсутствовать.",
+ "hints.profiles.followers_may_be_missing": "Некоторые подписчики этого профиля могут отсутствовать.",
+ "hints.profiles.follows_may_be_missing": "Некоторые подписки этого профиля могут отсутствовать.",
+ "hints.profiles.posts_may_be_missing": "Некоторые посты в этом профиле могут отсутствовать.",
"hints.profiles.see_more_followers": "Перейдите на {domain}, чтобы увидеть всех подписчиков",
"hints.profiles.see_more_follows": "Перейдите на {domain}, чтобы увидеть все подписки",
"hints.profiles.see_more_posts": "Перейдите на {domain}, чтобы увидеть все посты",
- "hints.threads.replies_may_be_missing": "Ответы с других серверов могут отсутствовать.",
+ "hints.threads.replies_may_be_missing": "Некоторые ответы с других серверов могут отсутствовать.",
"hints.threads.see_more": "Перейдите на {domain}, чтобы увидеть все ответы",
"home.column_settings.show_reblogs": "Показывать продвижения",
"home.column_settings.show_replies": "Показывать ответы",
@@ -422,7 +436,7 @@
"ignore_notifications_modal.not_following_title": "Игнорировать уведомления от людей, на которых вы не подписаны?",
"ignore_notifications_modal.private_mentions_title": "Игнорировать уведомления о нежелательных личных упоминаниях?",
"info_button.label": "Помощь",
- "info_button.what_is_alt_text": "Что это такое? Альтернативный текст содержит описание изображения для людей с ограничениями зрения, медленным интернетом и для тех, кому нужен дополнительный контекст.
Вы можете улучшить доступность и понимание для всех, написав четкий, краткий и объективный альтернативный текст.
Уловите важные элементы Перескажите текстовую информацию на изображении Используйте правильную структуру предложений Избегайте избыточной информации Сосредоточьтесь на тенденциях и ключевых выводах при описании сложных визуализаций (таких как диаграммы или карты) ",
+ "info_button.what_is_alt_text": "Что это такое? Альтернативный текст содержит описание изображения для людей с ограничениями зрения, медленным интернетом и для тех, кому нужен дополнительный контекст.
Вы можете улучшить доступность и понимание для всех, написав чёткий, краткий и объективный альтернативный текст.
Уловите важные элементы Перескажите текстовую информацию на изображении Используйте правильную структуру предложений Избегайте избыточной информации Сосредоточьтесь на тенденциях и ключевых выводах при описании сложных визуализаций, таких как диаграммы или карты ",
"interaction_modal.action.favourite": "Вы можете добавить этот пост в избранное со своей учётной записью.",
"interaction_modal.action.follow": "Вы можете подписаться со своей учётной записью.",
"interaction_modal.action.reblog": "Вы можете продвинуть этот пост со своей учётной записью.",
@@ -437,41 +451,41 @@
"interaction_modal.title.reblog": "Продвинуть пост {name}",
"interaction_modal.title.reply": "Ответить на пост {name}",
"interaction_modal.title.vote": "Голосовать в опросе {name}",
- "interaction_modal.username_prompt": "Например {example}",
+ "interaction_modal.username_prompt": "Например, {example}",
"intervals.full.days": "{number, plural, one {# день} few {# дня} other {# дней}}",
"intervals.full.hours": "{number, plural, one {# час} few {# часа} other {# часов}}",
"intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}",
"keyboard_shortcuts.back": "перейти назад",
- "keyboard_shortcuts.blocked": "чтобы открыть список заблокированных",
+ "keyboard_shortcuts.blocked": "открыть список заблокированных",
"keyboard_shortcuts.boost": "продвинуть пост",
"keyboard_shortcuts.column": "фокус на одном из столбцов",
"keyboard_shortcuts.compose": "фокус на поле ввода",
"keyboard_shortcuts.description": "Описание",
- "keyboard_shortcuts.direct": "чтобы открыть столбец личных упоминаний",
+ "keyboard_shortcuts.direct": "перейти к личным упоминаниям",
"keyboard_shortcuts.down": "вниз по списку",
"keyboard_shortcuts.enter": "открыть пост",
"keyboard_shortcuts.favourite": "добавить пост в избранное",
- "keyboard_shortcuts.favourites": "открыть «Избранные»",
+ "keyboard_shortcuts.favourites": "перейти к избранным постам",
"keyboard_shortcuts.federated": "перейти к глобальной ленте",
"keyboard_shortcuts.heading": "Сочетания клавиш",
"keyboard_shortcuts.home": "перейти к домашней ленте",
- "keyboard_shortcuts.hotkey": "Гор. клавиша",
- "keyboard_shortcuts.legend": "показать это окно",
+ "keyboard_shortcuts.hotkey": "Горячая клавиша",
+ "keyboard_shortcuts.legend": "показать эту справку",
"keyboard_shortcuts.local": "перейти к локальной ленте",
"keyboard_shortcuts.mention": "упомянуть автора поста",
"keyboard_shortcuts.muted": "открыть список игнорируемых",
"keyboard_shortcuts.my_profile": "перейти к своему профилю",
"keyboard_shortcuts.notifications": "перейти к уведомлениям",
- "keyboard_shortcuts.open_media": "открыть вложение",
+ "keyboard_shortcuts.open_media": "открыть медиа",
"keyboard_shortcuts.pinned": "перейти к закреплённым постам",
"keyboard_shortcuts.profile": "перейти к профилю автора",
"keyboard_shortcuts.reply": "ответить",
"keyboard_shortcuts.requests": "перейти к запросам на подписку",
"keyboard_shortcuts.search": "перейти к поиску",
"keyboard_shortcuts.spoilers": "показать/скрыть поле предупреждения о содержании",
- "keyboard_shortcuts.start": "перейти к разделу \"добро пожаловать\"",
+ "keyboard_shortcuts.start": "перейти к разделу «Добро пожаловать»",
"keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением",
- "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиафайлы",
+ "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиа",
"keyboard_shortcuts.toot": "начать писать новый пост",
"keyboard_shortcuts.translate": "перевести пост",
"keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
@@ -481,42 +495,41 @@
"lightbox.previous": "Назад",
"lightbox.zoom_in": "Масштаб до фактического размера",
"lightbox.zoom_out": "Масштаб по размеру экрана",
- "limited_account_hint.action": "Все равно показать профиль",
- "limited_account_hint.title": "Этот профиль был скрыт модераторами {domain}.",
+ "limited_account_hint.action": "Всё равно показать",
+ "limited_account_hint.title": "Этот профиль был скрыт модераторами сервера {domain}.",
"link_preview.author": "Автор: {name}",
- "link_preview.more_from_author": "Больше от {name}",
- "link_preview.shares": "{count, plural, one {{counter} пост} other {{counter} посты}}",
+ "link_preview.more_from_author": "Автор: {name}",
+ "link_preview.shares": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}",
"lists.add_member": "Добавить",
"lists.add_to_list": "Добавить в список",
"lists.add_to_lists": "Добавить {name} в списки",
"lists.create": "Создать",
- "lists.create_a_list_to_organize": "Создать новый список, чтобы упорядочить домашнюю ленту",
+ "lists.create_a_list_to_organize": "Создайте новый список, чтобы упорядочить домашнюю ленту.",
"lists.create_list": "Создать список",
"lists.delete": "Удалить список",
"lists.done": "Готово",
- "lists.edit": "Изменить список",
- "lists.exclusive": "Не показывать участников в домашней ленте",
- "lists.exclusive_hint": "Если кто-то есть в этом списке, скрыть его в домашней ленте, чтобы не видеть его посты дважды.",
- "lists.find_users_to_add": "Найти пользователей для добавления",
- "lists.list_members": "Пользователи в списке",
+ "lists.edit": "Редактировать список",
+ "lists.exclusive": "Скрывать пользователей в этом списке из домашней ленты",
+ "lists.exclusive_hint": "Не показывать посты пользователей в этом списке в домашней ленте, чтобы не видеть их дважды.",
+ "lists.find_users_to_add": "Воспользуйтесь поиском, чтобы добавить пользователей в список.",
"lists.list_members_count": "{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}",
"lists.list_name": "Название списка",
"lists.new_list_name": "Новый список",
- "lists.no_lists_yet": "Пока нет списков.",
- "lists.no_members_yet": "Пока нет пользователей в списке.",
- "lists.no_results_found": "Не найдено.",
+ "lists.no_lists_yet": "Вы ещё не создали ни одного списка.",
+ "lists.no_members_yet": "В этом списке пока нет ни одного человека.",
+ "lists.no_results_found": "Ничего не найдено.",
"lists.remove_member": "Удалить",
"lists.replies_policy.followed": "Все пользователи, на которых вы подписаны",
"lists.replies_policy.list": "Другие пользователи в списке",
- "lists.replies_policy.none": "Никого",
+ "lists.replies_policy.none": "Никто",
"lists.save": "Сохранить",
"lists.search": "Поиск",
- "lists.show_replies_to": "Показывать ответы пользователей в списке на посты",
+ "lists.show_replies_to": "Пользователи, ответы которым будут включены в список",
"load_pending": "{count, plural, one {# новый элемент} few {# новых элемента} other {# новых элементов}}",
"loading_indicator.label": "Загрузка…",
"media_gallery.hide": "Скрыть",
- "moved_to_account_banner.text": "Ваша учетная запись {disabledAccount} в настоящее время заморожена, потому что вы переехали на {movedToAccount}.",
- "mute_modal.hide_from_notifications": "Скрыть из уведомлений",
+ "moved_to_account_banner.text": "Ваша учётная запись {disabledAccount} в настоящее время отключена, потому что вы переехали на {movedToAccount}.",
+ "mute_modal.hide_from_notifications": "Скрывать уведомления",
"mute_modal.hide_options": "Скрыть опции",
"mute_modal.indefinite": "Бессрочно",
"mute_modal.show_options": "Показать опции",
@@ -533,43 +546,43 @@
"navigation_bar.community_timeline": "Локальная лента",
"navigation_bar.compose": "Создать новый пост",
"navigation_bar.direct": "Личные упоминания",
- "navigation_bar.discover": "Изучайте",
+ "navigation_bar.discover": "Обзор",
"navigation_bar.domain_blocks": "Заблокированные домены",
"navigation_bar.explore": "Обзор",
"navigation_bar.favourites": "Избранное",
"navigation_bar.filters": "Игнорируемые слова",
"navigation_bar.follow_requests": "Запросы на подписку",
- "navigation_bar.followed_tags": "Отслеживаемые хэштеги",
+ "navigation_bar.followed_tags": "Подписки на хештеги",
"navigation_bar.follows_and_followers": "Подписки и подписчики",
"navigation_bar.lists": "Списки",
"navigation_bar.logout": "Выйти",
"navigation_bar.moderation": "Модерация",
"navigation_bar.mutes": "Игнорируемые пользователи",
- "navigation_bar.opened_in_classic_interface": "Сообщения, учётные записи и другие специфические страницы по умолчанию открываются в классическом веб-интерфейсе.",
+ "navigation_bar.opened_in_classic_interface": "Посты, профили пользователей и некоторые другие страницы по умолчанию открываются в классическом веб-интерфейсе.",
"navigation_bar.personal": "Личное",
"navigation_bar.pins": "Закреплённые посты",
"navigation_bar.preferences": "Настройки",
"navigation_bar.public_timeline": "Глобальная лента",
"navigation_bar.search": "Поиск",
"navigation_bar.security": "Безопасность",
- "not_signed_in_indicator.not_signed_in": "Вам нужно войти, чтобы иметь доступ к этому ресурсу.",
- "notification.admin.report": "{name} пожаловался на {target}",
- "notification.admin.report_account": "{name} пожаловался на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target} по причине: {category}",
- "notification.admin.report_account_other": "{name} пожаловался на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target}",
- "notification.admin.report_statuses": "{name} пожаловался на {target} по причине: {category}",
- "notification.admin.report_statuses_other": "{name} пожаловался на {target}",
- "notification.admin.sign_up": "{name} зарегистрировался",
- "notification.admin.sign_up.name_and_others": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} зарегистрировались",
+ "not_signed_in_indicator.not_signed_in": "Эта страница доступна только авторизованным пользователям.",
+ "notification.admin.report": "{name} пожаловался (-лась) на {target}",
+ "notification.admin.report_account": "{name} пожаловался (-лась) на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target} по причине «{category}»",
+ "notification.admin.report_account_other": "{name} пожаловался (-лась) на {count, plural, one {# пост} few {# поста} other {# постов}} от пользователя {target}",
+ "notification.admin.report_statuses": "{name} пожаловался (-лась) на {target} по причине «{category}»",
+ "notification.admin.report_statuses_other": "{name} пожаловался (-лась) на {target}",
+ "notification.admin.sign_up": "{name} зарегистрировался (-лась) на сервере",
+ "notification.admin.sign_up.name_and_others": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} зарегистрировались на сервере",
"notification.annual_report.message": "#Wrapstodon за {year} год ждёт вас! Откройте для себя итоги и памятные моменты этого года в Mastodon!",
"notification.annual_report.view": "Перейти к #Wrapstodon",
"notification.favourite": "{name} добавил(а) ваш пост в избранное",
"notification.favourite.name_and_others_with_link": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} добавили ваш пост в избранное",
- "notification.favourite_pm": "{name} добавил(а) ваше личное сообщение в избранное",
- "notification.favourite_pm.name_and_others_with_link": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} добавили ваше личное сообщение в избранное",
+ "notification.favourite_pm": "{name} добавил(а) ваше личное упоминание в избранное",
+ "notification.favourite_pm.name_and_others_with_link": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} добавили ваше личное упоминание в избранное",
"notification.follow": "{name} подписался (-лась) на вас",
"notification.follow.name_and_others": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} подписались на вас",
- "notification.follow_request": "{name} отправил запрос на подписку",
- "notification.follow_request.name_and_others": "{name} и ещё {count, plural, one {#} other {# других}} подписались на вас",
+ "notification.follow_request": "{name} отправил(а) вам запрос на подписку",
+ "notification.follow_request.name_and_others": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} подписались на вас",
"notification.label.mention": "Упоминание",
"notification.label.private_mention": "Личное упоминание",
"notification.label.private_reply": "Приватный ответ",
@@ -589,13 +602,12 @@
"notification.poll": "Опрос, в котором вы приняли участие, завершился",
"notification.reblog": "{name} продвинул(а) ваш пост",
"notification.reblog.name_and_others_with_link": "{name} и ещё {count, plural, one {# пользователь} few {# пользователя} other {# пользователей}} продвинули ваш пост",
- "notification.relationships_severance_event": "Потеряно соединение с {name}",
- "notification.relationships_severance_event.account_suspension": "Администратор {from} заблокировал {target}, что означает, что вы больше не сможете получать обновления от них или взаймодествовать с ними.",
- "notification.relationships_severance_event.domain_block": "Администратор {from} заблокировал {target} включая {followersCount} ваших подписчиков и {followingCount, plural, one {# аккаунт} few {# аккаунта} other {# аккаунтов}}, на которые вы подписаны.",
+ "notification.relationships_severance_event.account_suspension": "Администратор сервера {from} заблокировал сервер {target}, поэтому вы больше не сможете получать обновления от людей с этого сервера или взаимодействовать с ними.",
+ "notification.relationships_severance_event.domain_block": "Администратор сервера {from} заблокировал сервер {target}, где размещены учётные записи у {followersCount} ваших подписчиков и {followingCount, plural, one {# пользователя, на которого вы подписаны} other {# пользователей, на которых вы подписаны}}.",
"notification.relationships_severance_event.learn_more": "Узнать больше",
- "notification.relationships_severance_event.user_domain_block": "Вы заблокировали {target} включая {followersCount} ваших подписчиков и {followingCount, plural, one {# аккаунт} few {# аккаунта} other {# аккаунтов}}, на которые вы подписаны.",
+ "notification.relationships_severance_event.user_domain_block": "Вы заблокировали сервер {target}, где размещены учётные записи у {followersCount} ваших подписчиков и {followingCount, plural, one {# пользователя, на которого вы подписаны} other {# пользователей, на которых вы подписаны}}.",
"notification.status": "{name} опубликовал(а) новый пост",
- "notification.update": "{name} изменил(а) пост",
+ "notification.update": "{name} отредактировал(а) пост",
"notification_requests.accept": "Принять",
"notification_requests.accept_multiple": "{count, plural, one {Принять # запрос…} few {Принять # запроса…} other {Принять # запросов…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, other {Принять запросы}}",
@@ -622,7 +634,7 @@
"notifications.column_settings.admin.sign_up": "Новые регистрации:",
"notifications.column_settings.alert": "Уведомления на рабочем столе",
"notifications.column_settings.favourite": "Ваш пост добавили в избранное:",
- "notifications.column_settings.filter_bar.advanced": "Показать все категории",
+ "notifications.column_settings.filter_bar.advanced": "Показывать все категории",
"notifications.column_settings.filter_bar.category": "Панель быстрых фильтров",
"notifications.column_settings.follow": "У вас новый подписчик:",
"notifications.column_settings.follow_request": "Новые запросы на подписку:",
@@ -645,7 +657,7 @@
"notifications.filter.polls": "Результаты опросов",
"notifications.filter.statuses": "Обновления от людей, на которых вы подписаны",
"notifications.grant_permission": "Предоставить разрешение.",
- "notifications.group": "{count} уведомл.",
+ "notifications.group": "{count} уведомлений",
"notifications.mark_as_read": "Отметить все уведомления прочитанными",
"notifications.permission_denied": "Уведомления на рабочем столе недоступны, так как вы запретили их отправку в браузере. Проверьте настройки для сайта, чтобы включить их обратно.",
"notifications.permission_denied_alert": "Уведомления на рабочем столе недоступны, так как вы ранее отклонили запрос на их отправку.",
@@ -770,6 +782,7 @@
"report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
"report_notification.attached_statuses": "{count, plural, one {{count} сообщение} few {{count} сообщения} many {{count} сообщений} other {{count} сообщений}} вложено",
"report_notification.categories.legal": "Нарушение закона",
+ "report_notification.categories.legal_sentence": "запрещённый контент",
"report_notification.categories.other": "Другое",
"report_notification.categories.other_sentence": "другое",
"report_notification.categories.spam": "Спам",
@@ -780,28 +793,28 @@
"search.no_recent_searches": "Недавние запросы отсутствуют",
"search.placeholder": "Поиск",
"search.quick_action.account_search": "Профили, соответствующие {x}",
- "search.quick_action.go_to_account": "Перейти в профиль {x}",
- "search.quick_action.go_to_hashtag": "Перейти к хэштегу {x}",
+ "search.quick_action.go_to_account": "Перейти к профилю {x}",
+ "search.quick_action.go_to_hashtag": "Перейти к хештегу {x}",
"search.quick_action.open_url": "Открыть URL в Mastodon",
"search.quick_action.status_search": "Посты, соответствующие {x}",
"search.search_or_paste": "Поиск (или вставьте URL)",
- "search_popout.full_text_search_disabled_message": "Недоступно на {domain}.",
- "search_popout.full_text_search_logged_out_message": "Доступно только при авторизации.",
- "search_popout.language_code": "Код языка по стандарту ISO",
+ "search_popout.full_text_search_disabled_message": "Недоступно на сервере {domain}.",
+ "search_popout.full_text_search_logged_out_message": "Доступно только авторизованным пользователям.",
+ "search_popout.language_code": "ISO-код языка",
"search_popout.options": "Параметры поиска",
"search_popout.quick_actions": "Быстрые действия",
"search_popout.recent": "Недавние запросы",
- "search_popout.specific_date": "конкретная дата",
+ "search_popout.specific_date": "дата",
"search_popout.user": "пользователь",
"search_results.accounts": "Профили",
"search_results.all": "Все",
- "search_results.hashtags": "Хэштеги",
+ "search_results.hashtags": "Хештеги",
"search_results.no_results": "Ничего не найдено.",
"search_results.no_search_yet": "Попробуйте поискать посты, профили или хэштеги.",
"search_results.see_all": "Показать все",
"search_results.statuses": "Посты",
"search_results.title": "Поиск \"{q}\"",
- "server_banner.about_active_users": "Люди, заходившие на этот сервер за последние 30 дней (ежемесячные активные пользователи)",
+ "server_banner.about_active_users": "Число зарегистрированных пользователей, заходивших на этот сервер за последние 30 дней (MAU-метрика)",
"server_banner.active_users": "активные пользователи",
"server_banner.administered_by": "Управляется:",
"server_banner.is_one_of_many": "{domain} — это один из многих независимых серверов Mastodon, которые вы можете использовать, чтобы присоединиться к сети Fediverse.",
@@ -810,7 +823,7 @@
"sign_in_banner.follow_anyone": "Подписывайтесь на кого угодно в федивёрсе и читайте ленту в хронологическом порядке. Никаких алгоритмов, рекламы или кликбейта.",
"sign_in_banner.mastodon_is": "Mastodon — лучший способ быть в курсе всего происходящего.",
"sign_in_banner.sign_in": "Войти",
- "sign_in_banner.sso_redirect": "Войдите или Зарегистрируйтесь",
+ "sign_in_banner.sso_redirect": "Вход/Регистрация",
"status.admin_account": "Открыть интерфейс модератора для @{name}",
"status.admin_domain": "Открыть интерфейс модератора для {domain}",
"status.admin_status": "Открыть этот пост в интерфейсе модератора",
@@ -829,41 +842,40 @@
"status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
"status.embed": "Встроить на свой сайт",
"status.favourite": "Добавить в избранное",
- "status.favourites": "{count, plural, other {в избранном}}",
+ "status.favourites": "{count, plural, one {звёздочка} few {звёздочки} other {звёздочек}}",
"status.filter": "Фильтровать этот пост",
"status.history.created": "{name} создал(а) {date}",
"status.history.edited": "{name} отредактировал(а) {date}",
- "status.load_more": "Загрузить остальное",
+ "status.load_more": "Загрузить ещё",
"status.media.open": "Нажмите, чтобы открыть.",
- "status.media.show": "Нажмите для просмотра",
- "status.media_hidden": "Файл скрыт",
+ "status.media.show": "Нажмите, чтобы показать",
+ "status.media_hidden": "Вложения скрыты",
"status.mention": "Упомянуть @{name}",
"status.more": "Ещё",
"status.mute": "Игнорировать @{name}",
"status.mute_conversation": "Игнорировать обсуждение",
"status.open": "Открыть пост",
"status.pin": "Закрепить в профиле",
- "status.pinned": "Закреплённый пост",
- "status.read_more": "Ещё",
+ "status.read_more": "Читать далее",
"status.reblog": "Продвинуть",
"status.reblog_private": "Продвинуть для своей аудитории",
"status.reblogged_by": "{name} продвинул(а)",
"status.reblogs": "{count, plural, one {продвижение} few {продвижения} other {продвижений}}",
- "status.reblogs.empty": "Никто ещё не продвинул этот пост. Как только кто-то это сделает, они появятся здесь.",
- "status.redraft": "Создать заново",
+ "status.reblogs.empty": "Никто ещё не продвинул этот пост. Все пользователи, продвинувшие этот пост, будут показаны здесь.",
+ "status.redraft": "Удалить и исправить",
"status.remove_bookmark": "Убрать из закладок",
"status.remove_favourite": "Убрать из избранного",
- "status.replied_in_thread": "Ответил(а) в треде",
+ "status.replied_in_thread": "Ответил(а) в обсуждении",
"status.replied_to": "Ответил(а) {name}",
"status.reply": "Ответить",
- "status.replyAll": "Ответить всем",
+ "status.replyAll": "Ответить в обсуждении",
"status.report": "Пожаловаться на @{name}",
- "status.sensitive_warning": "Содержимое «деликатного характера»",
+ "status.sensitive_warning": "Медиа деликатного содержания",
"status.share": "Поделиться",
"status.show_less_all": "Свернуть все спойлеры в ветке",
"status.show_more_all": "Развернуть все спойлеры в ветке",
"status.show_original": "Показать оригинал",
- "status.title.with_attachments": "{user} опубликовал {attachmentCount, plural, one {{attachmentCount} вложение} few {{attachmentCount} вложения} other {{attachmentCount} вложений}}",
+ "status.title.with_attachments": "{user} опубликовал(а) {attachmentCount, plural, one {{attachmentCount} вложение} few {{attachmentCount} вложения} other {{attachmentCount} вложений}}",
"status.translate": "Перевод",
"status.translated_from_with": "Переведено с {lang} с помощью {provider}",
"status.uncached_media_warning": "Предварительный просмотр недоступен",
@@ -884,19 +896,19 @@
"time_remaining.seconds": "{number, plural, one {# секунда} many {# секунд} other {# секунды}}",
"trends.counter_by_accounts": "{count, plural, few {{counter} человека} other {{counter} человек}} за {days, plural, one {последний {days} день} few {последние {days} дня} other {последние {days} дней}}",
"trends.trending_now": "Самое актуальное",
- "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
+ "ui.beforeunload": "Ваш черновик будет утрачен, если вы покинете Mastodon.",
"units.short.billion": "{count} млрд",
"units.short.million": "{count} млн",
"units.short.thousand": "{count} тыс.",
"upload_area.title": "Перетащите сюда, чтобы загрузить",
"upload_button.label": "Прикрепить фото, видео или аудио",
- "upload_error.limit": "Достигнут лимит загруженных файлов.",
+ "upload_error.limit": "Превышено максимальное количество вложений.",
"upload_error.poll": "К опросам нельзя прикреплять файлы.",
- "upload_form.drag_and_drop.instructions": "Чтобы подобрать прикрепленный файл, нажмите \"Пробел\" (Space) или \"Ввод\" (Enter). При перетаскивании используйте клавиши со стрелками, чтобы переместить прикрепленные файлы в любом направлении. Нажмите \"Пробел\" (Space) или \"Ввод\" (Enter) еще раз, чтобы переместить вложение в новое место, или нажмите кнопку \"Выйти\" (Escape), чтобы отменить.",
- "upload_form.drag_and_drop.on_drag_cancel": "Перетаскивание было отменено. Вложение медиа {item} было удалено.",
- "upload_form.drag_and_drop.on_drag_end": "Медиа вложение {item} было удалено.",
- "upload_form.drag_and_drop.on_drag_over": "Медиа вложение {item} было перемещено.",
- "upload_form.drag_and_drop.on_drag_start": "Загружается медиафайл {item}.",
+ "upload_form.drag_and_drop.instructions": "Чтобы выбрать вложение, нажмите \"Пробел\" (Space) или \"Ввод\" (Enter). Используйте клавиши со стрелками, чтобы передвинуть вложение в любом направлении. Нажмите \"Пробел\" (Space) или \"Ввод\" (Enter) ещё раз, чтобы переместить вложение на новое место, либо нажмите кнопку \"Выйти\" (Escape), чтобы отменить перемещение.",
+ "upload_form.drag_and_drop.on_drag_cancel": "Перемещение отменено. Вложение {item} было оставлено на прежнем месте.",
+ "upload_form.drag_and_drop.on_drag_end": "Вложение {item} было перемещено.",
+ "upload_form.drag_and_drop.on_drag_over": "Вложение {item} было передвинуто.",
+ "upload_form.drag_and_drop.on_drag_start": "Выбрано вложение {item}.",
"upload_form.edit": "Редактировать",
"upload_progress.label": "Загрузка...",
"upload_progress.processing": "Обработка…",
@@ -910,9 +922,9 @@
"video.mute": "Выключить звук",
"video.pause": "Пауза",
"video.play": "Пуск",
- "video.skip_backward": "Промотать назад",
- "video.skip_forward": "Промотать вперёд",
+ "video.skip_backward": "Перемотка назад",
+ "video.skip_forward": "Перемотка вперёд",
"video.unmute": "Включить звук",
- "video.volume_down": "Уменьшить громкость",
- "video.volume_up": "Увеличить громкость"
+ "video.volume_down": "Громкость уменьшена",
+ "video.volume_up": "Громкость увеличена"
}
diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json
index ed9751634e..79f6093e53 100644
--- a/app/javascript/mastodon/locales/ry.json
+++ b/app/javascript/mastodon/locales/ry.json
@@ -22,7 +22,6 @@
"account.copy": "Зкопіровати удкликованя на профіл",
"account.direct": "Пошептати @{name}",
"account.disable_notifications": "Бульше не сповіщати ми коли {name} пише",
- "account.domain_blocked": "Домен заблокованый",
"account.edit_profile": "Управити профіл",
"account.enable_notifications": "Уповістити ня, кой {name} пише",
"account.endorse": "Указовати на профілови",
@@ -47,7 +46,6 @@
"account.mute_notifications_short": "Стишити голошіня",
"account.mute_short": "Стишити",
"account.muted": "Стишено",
- "account.mutual": "Взайомно",
"account.no_bio": "Описа ниє.",
"account.open_original_page": "Удоперти ориґіналну сторунку",
"account.posts": "Публикації",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index ce88bda740..9c4e0db610 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -20,7 +20,6 @@
"account.cancel_follow_request": "अनुसरणयाचनामपनय",
"account.direct": "गोपनीयरूपेण उल्लेखित-@{name}",
"account.disable_notifications": "यदा @{name} स्थापयति तदा माम्मा ज्ञापय",
- "account.domain_blocked": "प्रदेशो निषिद्धः",
"account.edit_profile": "सम्पाद्यताम्",
"account.enable_notifications": "यदा @{name} स्थापयति तदा मां ज्ञापय",
"account.endorse": "व्यक्तिगतविवरणे वैशिष्ट्यम्",
@@ -467,7 +466,6 @@
"status.mute_conversation": "वार्तालापं मूकीकुरु",
"status.open": "पत्रमिदं विस्तारय",
"status.pin": "प्रोफैलि कीलीकुरु",
- "status.pinned": "कीलितपत्रम्",
"status.read_more": "अधिकं पठ्यताम्",
"status.reblog": "बुस्त्",
"status.reblogs.empty": "न केनापि पत्रमिदं बुस्त्कृतम्। यदा कोऽपि करोति, तानि इह दृश्यन्ते।",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 79ef6f6ef5..3b852b5251 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -23,7 +23,6 @@
"account.copy": "Còpia su ligòngiu a su profilu",
"account.direct": "Mèntova a @{name} in privadu",
"account.disable_notifications": "Non mi notìfiches prus cando @{name} pùblichet messàgios",
- "account.domain_blocked": "Domìniu blocadu",
"account.edit_profile": "Modìfica profilu",
"account.enable_notifications": "Notìfica·mi cando @{name} pùblicat messàgios",
"account.endorse": "Cussìgia in su profilu tuo",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Pone is notìficas a sa muda",
"account.mute_short": "A sa muda",
"account.muted": "A sa muda",
- "account.mutual": "Pari-pari",
"account.no_bio": "Peruna descritzione frunida.",
"account.open_original_page": "Aberi sa pàgina originale",
"account.posts": "Publicatziones",
@@ -644,7 +642,6 @@
"status.mute_conversation": "Pone s'arresonada a sa muda",
"status.open": "Ismànnia custa publicatzione",
"status.pin": "Apica in su profilu",
- "status.pinned": "Publicatzione apicada",
"status.read_more": "Leghe·nde àteru",
"status.reblog": "Cumpartzi",
"status.reblog_private": "Cumpartzi cun is utentes originales",
diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json
index 872a61a8a2..0d2b3c5aef 100644
--- a/app/javascript/mastodon/locales/sco.json
+++ b/app/javascript/mastodon/locales/sco.json
@@ -19,7 +19,6 @@
"account.blocked": "Dingied",
"account.cancel_follow_request": "Resile follae requeest",
"account.disable_notifications": "Stap notifyin me whan @{name} posts",
- "account.domain_blocked": "Domain dingied",
"account.edit_profile": "Edit profile",
"account.enable_notifications": "Notify me whan @{name} posts",
"account.endorse": "Shaw oan profile",
@@ -457,7 +456,6 @@
"status.mute_conversation": "Wheesht conversation",
"status.open": "Expand this post",
"status.pin": "Preen tae profile",
- "status.pinned": "Preenit post",
"status.read_more": "Read mair",
"status.reblog": "Heeze",
"status.reblog_private": "Heeze wi original visibility",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 7d909dbe1a..6d519de906 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -2,8 +2,16 @@
"about.blocks": "මැදිහත්කරණ සේවාදායක",
"about.contact": "සබඳතාව:",
"about.disclaimer": "මාස්ටඩන් යනු නිදහස් විවෘත මූලාශ්ර මෘදුකාංගයකි. එය මාස්ටඩන් gGmbH හි වෙළඳ නාමයකි.",
+ "about.domain_blocks.no_reason_available": "හේතුව ලබා ගත නොහැක.",
+ "about.domain_blocks.preamble": "Mastodon සාමාන්යයෙන් ඔබට fediverse හි වෙනත් ඕනෑම සේවාදායකයකින් අන්තර්ගතයන් බැලීමට සහ පරිශීලකයින් සමඟ අන්තර් ක්රියා කිරීමට ඉඩ සලසයි. මෙම විශේෂිත සේවාදායකයේ සිදු කර ඇති ව්යතිරේක මේවාය.",
+ "about.domain_blocks.silenced.explanation": "ඔබ එය පැහැදිලිව සොයා බැලුවහොත් හෝ අනුගමනය කිරීමෙන් එයට සම්බන්ධ නොවන්නේ නම්, සාමාන්යයෙන් ඔබට මෙම සේවාදායකයෙන් පැතිකඩ සහ අන්තර්ගතයන් නොපෙනේ.",
+ "about.domain_blocks.silenced.title": "සීමිතයි",
+ "about.domain_blocks.suspended.explanation": "මෙම සේවාදායකයෙන් ලැබෙන කිසිදු දත්තයක් සැකසීම, ගබඩා කිරීම හෝ හුවමාරු කිරීම සිදු නොකෙරේ, මෙම සේවාදායකයෙන් පැමිණෙන පරිශීලකයින් සමඟ කිසිදු අන්තර්ක්රියාවක් හෝ සන්නිවේදනයක් කළ නොහැකි වේ.",
"about.domain_blocks.suspended.title": "අත්හිටුවා ඇත",
+ "about.not_available": "මෙම තොරතුරු මෙම සේවාදායකයේ ලබා ගත හැකි කර නොමැත.",
+ "about.powered_by": "{mastodon}මගින් බල ගැන්වෙන විමධ්යගත සමාජ මාධ්ය",
"about.rules": "සේවාදායකයේ නීති",
+ "account.account_note_header": "පුද්ගලික සටහන",
"account.add_or_remove_from_list": "ලැයිස්තු වලින් එකතු හෝ ඉවත් කරන්න",
"account.badges.bot": "ස්වයංක්රියයි",
"account.badges.group": "සමූහය",
@@ -11,71 +19,155 @@
"account.block_domain": "{domain} වසම අවහිර කරන්න",
"account.block_short": "අවහිර",
"account.blocked": "අවහිර කර ඇත",
+ "account.blocking": "අවහිර කිරීම",
+ "account.cancel_follow_request": "අනුගමනය කිරීම අවලංගු කරන්න",
+ "account.copy": "පැතිකඩට සබැඳිය පිටපත් කරන්න",
+ "account.direct": "පෞද්ගලිකව @{name}සඳහන් කරන්න",
"account.disable_notifications": "@{name} පළ කරන විට මට දැනුම් නොදෙන්න",
- "account.domain_blocked": "වසම අවහිර කර ඇත",
+ "account.domain_blocking": "වසම අවහිර කිරීම",
"account.edit_profile": "පැතිකඩ සංස්කරණය",
"account.enable_notifications": "@{name} පළ කරන විට මට දැනුම් දෙන්න",
"account.endorse": "පැතිකඩෙහි විශේෂාංගය",
+ "account.familiar_followers_many": "{name1}, {name2}, සහ {othersCount, plural, one {ඔබ දන්නා තවත් එකක්} other {# ඔබ දන්නා තවත්}}අනුගමනය කෙරේ.",
+ "account.familiar_followers_one": "{name1}අනුගමනය කෙරේ",
+ "account.familiar_followers_two": "පසුව {name1} සහ {name2}",
+ "account.featured": "විශේෂාංග සහිත",
+ "account.featured.accounts": "පැතිකඩ",
+ "account.featured.hashtags": "හැෂ් ටැග්",
"account.featured_tags.last_status_at": "අවසාන ලිපිය: {date}",
"account.featured_tags.last_status_never": "ලිපි නැත",
"account.follow": "අනුගමනය",
+ "account.follow_back": "ආපසු අනුගමනය කරන්න",
"account.followers": "අනුගාමිකයින්",
"account.followers.empty": "කිසිවෙක් අනුගමනය කර නැත.",
+ "account.followers_counter": "{count, plural, one {{counter} අනුගාමිකයා} other {{counter} අනුගාමිකයින්}}",
"account.following": "අනුගමන",
+ "account.following_counter": "{count, plural, one {{counter} අනුගමනය කරනවා} other {{counter} අනුගමනය කරනවා}}",
"account.follows.empty": "තවමත් කිසිවෙක් අනුගමනය නොකරයි.",
+ "account.follows_you": "ඔබව අනුගමනය කරයි",
"account.go_to_profile": "පැතිකඩට යන්න",
+ "account.hide_reblogs": "@{name}වෙතින් බූස්ට් සඟවන්න",
+ "account.in_memoriam": "මතකයේ.",
"account.joined_short": "එක් වූ දිනය",
+ "account.languages": "දායක වූ භාෂා වෙනස් කරන්න",
"account.link_verified_on": "මෙම සබැඳියේ අයිතිය {date} දී පරීක්ෂා කෙරිණි",
+ "account.locked_info": "මෙම ගිණුමේ රහස්යතා තත්ත්වය අගුළු දමා ඇත. හිමිකරු ඔවුන් අනුගමනය කළ හැක්කේ කාටද යන්න හස්තීයව සමාලෝචනය කරයි.",
"account.media": "මාධ්ය",
"account.mention": "@{name} සඳහන් කරන්ක",
+ "account.moved_to": "{name} ඔවුන්ගේ නව ගිණුම දැන්:",
"account.mute": "@{name} නිහඬ කරන්න",
+ "account.mute_notifications_short": "දැනුම්දීම් නිහඬ කරන්න",
"account.mute_short": "නිහඬ",
"account.muted": "නිහඬ කළා",
+ "account.muting": "නිහඬ කිරීම",
+ "account.mutual": "ඔබ එකිනෙකා අනුගමනය කරන්න.",
+ "account.no_bio": "විස්තරයක් සපයා නැත.",
"account.open_original_page": "මුල් පිටුව අරින්න",
"account.posts": "ලිපි",
"account.posts_with_replies": "ලිපි සහ පිළිතුරු",
+ "account.remove_from_followers": "අනුගාමිකයින්ගෙන් {name} ඉවත් කරන්න",
"account.report": "@{name} වාර්තා කරන්න",
+ "account.requested": "අනුමැතිය බලාපොරොත්තුවෙන්. අනුගමනය කිරීමේ ඉල්ලීම අවලංගු කිරීමට ක්ලික් කරන්න.",
+ "account.requested_follow": "{name} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත.",
+ "account.requests_to_follow_you": "ඔබව අනුගමනය කිරීමට ඉල්ලීම්",
"account.share": "@{name} ගේ පැතිකඩ බෙදාගන්න",
+ "account.show_reblogs": "@{name}වෙතින් බූස්ට් පෙන්වන්න",
+ "account.statuses_counter": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}}",
"account.unblock": "@{name} අනවහිර කරන්න",
"account.unblock_domain": "{domain} වසම අනවහිර කරන්න",
+ "account.unblock_domain_short": "අවහිර කිරීම ඉවත් කරන්න",
"account.unblock_short": "අනවහිර",
"account.unendorse": "පැතිකඩෙහි විශේෂාංග නොකරන්න",
+ "account.unfollow": "අනුගමනය නොකරන්න",
+ "account.unmute": "නිහඬ නොකරන්න @{name}",
+ "account.unmute_notifications_short": "දැනුම්දීම් නිහඬ නොකරන්න",
"account.unmute_short": "නොනිහඬ",
"account_note.placeholder": "සටහන යෙදීමට ඔබන්න",
+ "admin.dashboard.daily_retention": "ලියාපදිංචි වීමෙන් පසු දිනෙන් දින පරිශීලක රඳවා ගැනීමේ අනුපාතය",
+ "admin.dashboard.monthly_retention": "ලියාපදිංචි වීමෙන් පසු මාසය අනුව පරිශීලක රඳවා ගැනීමේ අනුපාතය",
+ "admin.dashboard.retention.average": "සාමාන්යය",
"admin.dashboard.retention.cohort": "ලියාපදිංචි මාසය",
"admin.dashboard.retention.cohort_size": "නව පරිශ්රීලකයින්",
+ "admin.impact_report.instance_accounts": "මෙය මකා දමන ගිණුම් පැතිකඩ",
+ "admin.impact_report.instance_followers": "අපගේ පරිශීලකයින්ට අහිමි වන අනුගාමිකයින්",
+ "admin.impact_report.instance_follows": "ඔවුන්ගේ පරිශීලකයින්ට අහිමි වන අනුගාමිකයින්",
+ "admin.impact_report.title": "බලපෑම් සාරාංශය",
"alert.rate_limited.message": "{retry_time, time, medium} කට පසුව උත්සාහ කරන්න.",
"alert.rate_limited.title": "අනුපාතනය වී ඇත",
"alert.unexpected.message": "අනපේක්ෂිත දෝෂයක් සිදු විය.",
"alert.unexpected.title": "අපොයි!",
+ "alt_text_badge.title": "විකල්ප පෙළ",
+ "alt_text_modal.add_alt_text": "විකල්ප පෙළ එක් කරන්න",
+ "alt_text_modal.add_text_from_image": "රූපයෙන් පෙළ එක් කරන්න",
+ "alt_text_modal.cancel": "අවලංගු කරන්න",
+ "alt_text_modal.change_thumbnail": "සිඟිති රුව වෙනස් කරන්න",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "ශ්රවණාබාධ ඇති පුද්ගලයින් සඳහා මෙය විස්තර කරන්න…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "දෘශ්යාබාධිත පුද්ගලයින් සඳහා මෙය විස්තර කරන්න…",
+ "alt_text_modal.done": "කළා",
"announcement.announcement": "නිවේදනය",
+ "annual_report.summary.archetype.booster": "සිසිල් දඩයක්කාරයා",
+ "annual_report.summary.archetype.lurker": "සැඟවී සිටින්නා",
+ "annual_report.summary.archetype.oracle": "ඔරකල්",
+ "annual_report.summary.archetype.pollster": "ඡන්ද විමසන්නා",
+ "annual_report.summary.archetype.replier": "සමාජ සමනලයා",
+ "annual_report.summary.followers.followers": "අනුගාමිකයින්",
+ "annual_report.summary.followers.total": "මුළු {count}",
+ "annual_report.summary.here_it_is": "මෙන්න ඔබේ {year} සමාලෝචනය:",
+ "annual_report.summary.highlighted_post.by_favourites": "වඩාත්ම කැමති පළ කිරීම",
+ "annual_report.summary.highlighted_post.by_reblogs": "වඩාත්ම ප්රවර්ධනය කරන ලද පළ කිරීම",
+ "annual_report.summary.highlighted_post.by_replies": "වැඩිම පිළිතුරු සහිත පළ කිරීම",
+ "annual_report.summary.highlighted_post.possessive": "{name}ගේ",
+ "annual_report.summary.most_used_app.most_used_app": "වැඩිපුරම භාවිතා කරන යෙදුම",
+ "annual_report.summary.most_used_hashtag.most_used_hashtag": "වැඩිපුරම භාවිතා කරන ලද හැෂ් ටැගය",
+ "annual_report.summary.most_used_hashtag.none": "කිසිවක් නැත",
+ "annual_report.summary.new_posts.new_posts": "නව පළ කිරීම්",
+ "annual_report.summary.percentile.text": "එය ඔබව {domain} පරිශීලකයින්ගෙන් ඉහළම අතරට ගෙන එයි. ",
+ "annual_report.summary.percentile.we_wont_tell_bernie": "අපි බර්නිට කියන්නේ නැහැ.",
+ "annual_report.summary.thanks": "මැස්ටෝඩන් හි කොටසක් වීම ගැන ස්තූතියි!",
+ "attachments_list.unprocessed": "(සකසා නැති)",
"audio.hide": "හඬපටය සඟවන්න",
+ "block_modal.remote_users_caveat": "ඔබගේ තීරණයට ගරු කරන ලෙස අපි සේවාදායකයාගෙන් {domain} ඉල්ලා සිටිමු. කෙසේ වෙතත්, සමහර සේවාදායකයන් අවහිර කිරීම් වෙනස් ලෙස හසුරුවන බැවින් අනුකූලතාව සහතික නොවේ. පොදු පළ කිරීම් තවමත් ලොග් වී නොමැති පරිශීලකයින්ට දෘශ්යමාන විය හැකිය.",
"block_modal.show_less": "අඩුවෙන් පෙන්වන්න",
"block_modal.show_more": "තව පෙන්වන්න",
+ "block_modal.they_cant_mention": "ඔවුන්ට ඔබව සඳහන් කිරීමට හෝ අනුගමනය කිරීමට නොහැකිය.",
+ "block_modal.they_cant_see_posts": "ඔවුන්ට ඔබේ සටහන් දැකිය නොහැකි අතර ඔබට ඔවුන්ගේ සටහන් නොපෙනේ.",
"block_modal.they_will_know": "අවහිර කළ බව දකිනු ඇත.",
"block_modal.title": "අවහිර කරන්නද?",
+ "block_modal.you_wont_see_mentions": "ඒවා සඳහන් කරන සටහන් ඔබට නොපෙනේ.",
"boost_modal.combo": "ඊළඟ වතාවේ මෙය මඟ හැරීමට {combo} එබීමට හැකිය",
+ "boost_modal.reblog": "පළ කිරීම වැඩි කරන්නද?",
+ "boost_modal.undo_reblog": "පළ කිරීම බූස්ට් නොකරන්නද?",
"bundle_column_error.copy_stacktrace": "දෝෂ වාර්තාවේ පිටපතක්",
+ "bundle_column_error.error.body": "ඉල්ලූ පිටුව විදැහුම් කළ නොහැකි විය. එය අපගේ කේතයේ දෝෂයක් හෝ බ්රව්සර් අනුකූලතා ගැටලුවක් නිසා විය හැකිය.",
"bundle_column_error.error.title": "අපොයි!",
+ "bundle_column_error.network.body": "මෙම පිටුව පූරණය කිරීමට උත්සාහ කිරීමේදී දෝෂයක් ඇති විය. මෙය ඔබගේ අන්තර්ජාල සම්බන්ධතාවයේ හෝ මෙම සේවාදායකයේ තාවකාලික ගැටළුවක් නිසා විය හැකිය.",
"bundle_column_error.network.title": "ජාලයේ දෝෂයකි",
"bundle_column_error.retry": "නැවත උත්සාහ කරන්න",
"bundle_column_error.return": "ආපසු මුලට යන්න",
+ "bundle_column_error.routing.body": "ඉල්ලූ පිටුව සොයාගත නොහැකි විය. ලිපින තීරුවේ ඇති URL එක නිවැරදි බව ඔබට විශ්වාසද?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "වසන්න",
+ "bundle_modal_error.message": "මෙම තිරය පූරණය කිරීමේදී යමක් වැරදී ඇත.",
"bundle_modal_error.retry": "නැවත උත්සාහ කරන්න",
+ "closed_registrations.other_server_instructions": "Mastodon විමධ්යගත කර ඇති බැවින්, ඔබට වෙනත් සේවාදායකයක ගිණුමක් සාදා මෙම සේවාදායකය සමඟ අන්තර් ක්රියා කළ හැකිය.",
+ "closed_registrations_modal.description": "{domain} හි ගිණුමක් නිර්මාණය කිරීම දැනට කළ නොහැකි නමුත්, Mastodon භාවිතා කිරීමට ඔබට {domain} හි නිශ්චිත ගිණුමක් අවශ්ය නොවන බව කරුණාවෙන් සලකන්න.",
"closed_registrations_modal.find_another_server": "වෙනත් සේවාදායක",
+ "closed_registrations_modal.preamble": "Mastodon විමධ්යගත කර ඇත, එබැවින් ඔබ ඔබේ ගිණුම කොතැනක නිර්මාණය කළත්, ඔබට මෙම සේවාදායකයේ ඕනෑම අයෙකු අනුගමනය කිරීමට සහ අන්තර් ක්රියා කිරීමට හැකි වනු ඇත. ඔබට එය ස්වයං-සත්කාරක කිරීමට පවා හැකිය!",
"closed_registrations_modal.title": "මාස්ටඩන් හි ලියාපදිංචි වන්න",
"column.about": "පිලිබඳව",
"column.blocks": "අවහිර කළ අය",
"column.bookmarks": "පොත්යොමු",
"column.community": "ස්ථානීය කාලරේඛාව",
+ "column.create_list": "ලැයිස්තුවක් සාදන්න",
"column.direct": "පෞද්ගලික සැඳහුම්",
"column.directory": "පැතිකඩ පිරික්සන්න",
"column.domain_blocks": "අවහිර කළ වසම්",
+ "column.edit_list": "ලැයිස්තුව සංස්කරණය කරන්න",
"column.favourites": "ප්රියතමයන්",
"column.firehose": "සජීව සංග්රහ",
"column.follow_requests": "අනුගමන ඉල්ලීම්",
"column.home": "මුල් පිටුව",
+ "column.list_members": "ලැයිස්තු සාමාජිකයන් කළමනාකරණය කරන්න",
"column.lists": "ලැයිස්තු",
"column.mutes": "නිහඬ කළ අය",
"column.notifications": "දැනුම්දීම්",
@@ -88,6 +180,7 @@
"column_header.pin": "අමුණන්න",
"column_header.show_settings": "සැකසුම් පෙන්වන්න",
"column_header.unpin": "ගළවන්න",
+ "column_search.cancel": "අවලංගු කරන්න",
"column_subheading.settings": "සැකසුම්",
"community.column_settings.local_only": "ස්ථානීයව පමණයි",
"community.column_settings.media_only": "මාධ්ය පමණයි",
@@ -99,31 +192,63 @@
"compose.saved.body": "ලිපිය සුරැකිණි.",
"compose_form.direct_message_warning_learn_more": "තව දැනගන්න",
"compose_form.encryption_warning": "මාස්ටඩන් වෙත පළ කරන දෑ අන්ත සංකේතනයෙන් ආරක්ෂා නොවේ. මාස්ටඩන් හරහා කිසිදු සංවේදී තොරතුරක් බෙදා නොගන්න.",
+ "compose_form.hashtag_warning": "මෙම සටහන පොදු නොවන බැවින් කිසිදු හැෂ් ටැග් එකක් යටතේ ලැයිස්තුගත නොකෙරේ. හැෂ් ටැග් භාවිතයෙන් සෙවිය හැක්කේ පොදු පළ කිරීම් පමණි.",
+ "compose_form.lock_disclaimer": "ඔබේ ගිණුම {locked}නොවේ. ඕනෑම කෙනෙකුට ඔබේ අනුගාමිකයින්ට පමණක් වන සටහන් බැලීමට ඔබව අනුගමනය කළ හැක.",
"compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත",
"compose_form.placeholder": "ඔබගේ සිතුවිලි මොනවාද?",
"compose_form.poll.duration": "මත විමසීමේ කාලය",
+ "compose_form.poll.multiple": "බහුවරණ",
"compose_form.poll.option_placeholder": "විකල්පය {number}",
+ "compose_form.poll.single": "තනි තේරීම",
"compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට මත විමසුම වෙනස් කරන්න",
"compose_form.poll.switch_to_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න",
"compose_form.poll.type": "ශෛලිය",
"compose_form.publish": "ප්රකාශනය",
"compose_form.publish_form": "නව ලිපිය",
"compose_form.reply": "පිළිතුරු",
+ "compose_form.save_changes": "යාවත්කාලීන කරන්න",
"compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න",
"compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න",
+ "compose_form.spoiler_placeholder": "අන්තර්ගත අනතුරු ඇඟවීම (විකල්ප)",
"confirmation_modal.cancel": "අවලංගු",
"confirmations.block.confirm": "අවහිර",
"confirmations.delete.confirm": "මකන්න",
"confirmations.delete.message": "ඔබට මෙම ලිපිය මැකීමට වුවමනා ද?",
+ "confirmations.delete.title": "පළ කිරීම මකන්නද?",
"confirmations.delete_list.confirm": "මකන්න",
"confirmations.delete_list.message": "ඔබට මෙම ලැයිස්තුව සදහටම මැකීමට වුවමනා ද?",
+ "confirmations.delete_list.title": "ලැයිස්තුව මකන්නද?",
"confirmations.discard_edit_media.confirm": "ඉවත ලන්න",
"confirmations.discard_edit_media.message": "ඔබට මාධ්ය විස්තරයට හෝ පෙරදසුනට නොසුරකින ලද වෙනස්කම් තිබේ, කෙසේ වෙතත් ඒවා ඉවත දමන්නද?",
"confirmations.edit.confirm": "සංස්කරණය",
+ "confirmations.edit.message": "දැන් සංස්කරණය කිරීමෙන් ඔබ දැනට රචනා කරමින් සිටින පණිවිඩය උඩින් ලියනු ඇත. ඔබට ඉදිරියට යාමට අවශ්ය බව විශ්වාසද?",
+ "confirmations.edit.title": "පළ කිරීම උඩින් ලියන්නද?",
+ "confirmations.follow_to_list.confirm": "අනුගමනය කර ලැයිස්තුවට එක් කරන්න",
+ "confirmations.follow_to_list.message": "ඒවා ලැයිස්තුවකට එකතු කිරීමට ඔබ {name} අනුගමනය කළ යුතුය.",
+ "confirmations.follow_to_list.title": "පරිශීලකයා අනුගමනය කරන්නද?",
"confirmations.logout.confirm": "නික්මෙන්න",
"confirmations.logout.message": "ඔබට නික්මෙන්න අවශ්ය බව විශ්වාසද?",
+ "confirmations.logout.title": "ඉවත් වන්නද?",
+ "confirmations.missing_alt_text.confirm": "විකල්ප පෙළ එක් කරන්න",
+ "confirmations.missing_alt_text.message": "ඔබගේ සටහනේ විකල්ප පෙළ නොමැතිව මාධ්ය අඩංගු වේ. විස්තර එකතු කිරීම ඔබේ අන්තර්ගතයට වැඩි පිරිසකට ප්රවේශ විය හැකි කිරීමට උපකාරී වේ.",
+ "confirmations.missing_alt_text.secondary": "කෙසේ වෙතත් පළ කරන්න",
+ "confirmations.missing_alt_text.title": "විකල්ප පෙළ එක් කරන්නද?",
"confirmations.mute.confirm": "නිශ්ශබ්ද",
+ "confirmations.redraft.confirm": "& නැවත කෙටුම්පත මකන්න",
+ "confirmations.redraft.message": "ඔබට මෙම පළ කිරීම මකා දමා නැවත කෙටුම්පත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද? ප්රියතමයන් සහ වැඩි කිරීම් අහිමි වනු ඇති අතර, මුල් පළ කිරීමට පිළිතුරු අනාථ වනු ඇත.",
+ "confirmations.redraft.title": "& නැවත කෙටුම්පත් කළ පළ කිරීම මකන්නද?",
+ "confirmations.remove_from_followers.confirm": "අනුගාමිකයා ඉවත් කරන්න",
+ "confirmations.remove_from_followers.message": "{name} ඔබව අනුගමනය කිරීම නවත්වනු ඇත. ඔබට ඉදිරියට යාමට අවශ්ය බව විශ්වාසද?",
+ "confirmations.remove_from_followers.title": "අනුගාමිකයා ඉවත් කරන්නද?",
"confirmations.reply.confirm": "පිළිතුර",
+ "confirmations.reply.message": "දැන් පිළිතුරු දීමෙන් ඔබ දැනට රචනා කරමින් සිටින පණිවිඩය උඩින් ලියනු ඇත. ඔබට ඉදිරියට යාමට අවශ්ය බව විශ්වාසද?",
+ "confirmations.reply.title": "පළ කිරීම උඩින් ලියන්නද?",
+ "confirmations.unfollow.confirm": "අනුගමනය නොකරන්න",
+ "confirmations.unfollow.message": "ඔබට {name}අනුගමනය කිරීම නවත්වන්න අවශ්ය බව ඔබට විශ්වාසද?",
+ "confirmations.unfollow.title": "පරිශීලකයා අනුගමනය නොකරන්නද?",
+ "content_warning.hide": "සටහන සඟවන්න",
+ "content_warning.show": "කෙසේ වෙතත් පෙන්වන්න",
+ "content_warning.show_more": "තවත් පෙන්වන්න",
"conversation.delete": "සංවාදය මකන්න",
"conversation.mark_as_read": "කියවූ බව යොදන්න",
"conversation.open": "සංවාදය බලන්න",
@@ -136,14 +261,41 @@
"directory.new_arrivals": "නව පැමිණීම්",
"directory.recently_active": "මෑත දී සක්රියයි",
"disabled_account_banner.account_settings": "ගිණුමේ සැකසුම්",
+ "disabled_account_banner.text": "ඔබගේ {disabledAccount} ගිණුම දැනට අක්රිය කර ඇත.",
+ "dismissable_banner.community_timeline": "මේවා {domain}විසින් සත්කාරකත්වය දරන ගිණුම් ඇති පුද්ගලයින්ගේ නවතම පොදු සටහන් වේ.",
"dismissable_banner.dismiss": "ඉවතලන්න",
+ "dismissable_banner.explore_links": "මෙම පුවත් අද fediverse හි වැඩිපුරම බෙදා ගනු ලැබේ. වඩාත් වෙනස් පුද්ගලයින් විසින් පළ කරන ලද නව පුවත් ඉහළ ශ්රේණිගත කර ඇත.",
+ "dismissable_banner.explore_statuses": "ෆෙඩිවර්ස් හරහා මෙම පළ කිරීම් අද ආකර්ෂණය ලබා ගනිමින් පවතී. වැඩි දියුණු කිරීම් සහ ප්රියතමයන් සහිත නව පළ කිරීම් ඉහළින් ශ්රේණිගත කර ඇත.",
+ "dismissable_banner.explore_tags": "මෙම හැෂ් ටැග් අද ෆෙඩිවර්ස් හි ආකර්ෂණය ලබා ගනිමින් පවතී. වඩාත් වෙනස් පුද්ගලයින් විසින් භාවිතා කරන හැෂ් ටැග් ඉහළ ශ්රේණිගත කර ඇත.",
+ "dismissable_banner.public_timeline": "මේවා {domain} හි පුද්ගලයින් අනුගමනය කරන fediverse හි පුද්ගලයින්ගේ නවතම ප්රසිද්ධ සටහන් වේ.",
+ "domain_block_modal.block": "සේවාදායකය අවහිර කරන්න",
+ "domain_block_modal.block_account_instead": "ඒ වෙනුවට @{name} අවහිර කරන්න",
+ "domain_block_modal.they_can_interact_with_old_posts": "මෙම සේවාදායකයේ පුද්ගලයින්ට ඔබගේ පැරණි සටහන් සමඟ අන්තර් ක්රියා කළ හැක.",
+ "domain_block_modal.they_cant_follow": "මෙම සේවාදායකයෙන් කිසිවෙකුට ඔබව අනුගමනය කළ නොහැක.",
+ "domain_block_modal.they_wont_know": "ඔවුන් අවහිර කර ඇති බව ඔවුන් නොදනී.",
+ "domain_block_modal.title": "වසම අවහිර කරන්නද?",
+ "domain_block_modal.you_will_lose_num_followers": "ඔබ {followersCount, plural, one {{followersCountDisplay} අනුගාමිකයා} other {{followersCountDisplay} අනුගාමිකයින්}} සහ {followingCount, plural, one {{followingCountDisplay} ඔබ අනුගමනය කරන පුද්ගලයා} other {{followingCountDisplay} ඔබ අනුගමනය කරන පුද්ගලයින්}}අහිමි වනු ඇත.",
+ "domain_block_modal.you_will_lose_relationships": "මෙම සේවාදායකයෙන් ඔබ අනුගමනය කරන සියලුම අනුගාමිකයින් සහ පුද්ගලයින් ඔබට අහිමි වනු ඇත.",
+ "domain_block_modal.you_wont_see_posts": "මෙම සේවාදායකයේ පරිශීලකයින්ගෙන් ඔබට සටහන් හෝ දැනුම්දීම් නොපෙනේ.",
+ "domain_pill.activitypub_lets_connect": "එය ඔබට Mastodon හි පමණක් නොව, විවිධ සමාජ යෙදුම් හරහාද පුද්ගලයින් සමඟ සම්බන්ධ වීමට සහ අන්තර් ක්රියා කිරීමට ඉඩ සලසයි.",
+ "domain_pill.activitypub_like_language": "ActivityPub යනු Mastodon අනෙකුත් සමාජ ජාල සමඟ කතා කරන භාෂාවට සමානය.",
"domain_pill.server": "සේවාදායකය",
+ "domain_pill.their_handle": "ඔවුන්ගේ හසුරුව:",
+ "domain_pill.their_server": "ඔවුන්ගේ සියලුම සටහන් අඩංගු ඩිජිටල් නිවස.",
+ "domain_pill.their_username": "ඔවුන්ගේ සේවාදායකයේ ඔවුන්ගේ අනන්ය හඳුනාගැනීමේ යන්ත්රය. විවිධ සේවාදායකයන්හි එකම පරිශීලක නාමයක් ඇති පරිශීලකයින් සොයා ගැනීමට හැකිය.",
"domain_pill.username": "පරිශ්රීලක නාමය",
+ "domain_pill.whats_in_a_handle": "හසුරුවක ඇත්තේ කුමක්ද?",
+ "domain_pill.who_they_are": "හැන්ඩ්ල් මඟින් කෙනෙකු කවුද සහ ඔවුන් සිටින්නේ කොහේද යන්න පවසන බැවින්, ඔබට ActivityPub-බලගැන්වූ වේදිකා හි සමාජ වෙබ් අඩවි හරහා පුද්ගලයින් සමඟ අන්තර් ක්රියා කළ හැකිය.",
+ "domain_pill.who_you_are": "ඔබේ හැන්ඩ්ල් එක ඔබ කවුද සහ ඔබ සිටින ස්ථානය පවසන නිසා, ActivityPub-බලගැන්වූ වේදිකා හි සමාජ වෙබ් අඩවි හරහා පුද්ගලයින්ට ඔබ සමඟ අන්තර් ක්රියා කළ හැකිය.",
+ "domain_pill.your_handle": "ඔබේ හසුරුව:",
+ "domain_pill.your_server": "ඔබේ සියලුම සටහන් තිබෙන ඔබේ ඩිජිටල් නිවස. මේකට කැමති නැද්ද? ඕනෑම වේලාවක සේවාදායක මාරු කර ඔබේ අනුගාමිකයින් ද රැගෙන එන්න.",
+ "domain_pill.your_username": "මෙම සේවාදායකයේ ඔබගේ අනන්ය හඳුනාගැනීමේ අංකය. විවිධ සේවාදායකයන්හි එකම පරිශීලක නාමය ඇති පරිශීලකයින් සොයා ගැනීමට හැකිය.",
"embed.instructions": "පහත කේතය පිටපත් කිරීමෙන් මෙම ලිපිය ඔබගේ අඩවියට කාවද්දන්න.",
"embed.preview": "මෙන්න එය පෙනෙන අන්දම:",
"emoji_button.activity": "ක්රියාකාරකම",
"emoji_button.clear": "මකන්න",
"emoji_button.custom": "අභිරුචි",
+ "emoji_button.flags": "කොඩි",
"emoji_button.food": "ආහාර සහ පාන",
"emoji_button.label": "ඉමොජි යොදන්න",
"emoji_button.nature": "සොබාදහම",
@@ -155,43 +307,80 @@
"emoji_button.search_results": "සෙවුම් ප්රතිඵල",
"emoji_button.symbols": "සංකේත",
"emoji_button.travel": "චාරිකා සහ ස්ථාන",
+ "empty_column.account_featured_other.unknown": "මෙම ගිණුමේ තවමත් කිසිවක් විශේෂාංගගත කර නොමැත.",
+ "empty_column.account_hides_collections": "මෙම පරිශීලකයා මෙම තොරතුරු ලබා ගත නොහැකි ලෙස සකස් කර ඇත.",
"empty_column.account_suspended": "ගිණුම අත්හිටුවා ඇත",
"empty_column.account_timeline": "මෙහි ලිපි නැත!",
"empty_column.account_unavailable": "පැතිකඩ නොතිබේ",
"empty_column.blocks": "කිසිදු පරිශීලකයෙකු අවහිර කර නැත.",
"empty_column.bookmarked_statuses": "ඔබ සතුව පොත්යොමු තබන ලද ලිපි කිසිවක් නැත. ඔබ පොත්යොමුවක් තබන විට, එය මෙහි දිස්වනු ඇත.",
+ "empty_column.community": "දේශීය කාලරේඛාව හිස්. පන්දුව පෙරළීමට ප්රසිද්ධියේ යමක් ලියන්න!",
+ "empty_column.direct": "ඔබට තවම කිසිදු පෞද්ගලික සඳහන් කිරීමක් නොමැත. ඔබ එකක් යවන විට හෝ ලැබෙන විට, එය මෙහි පෙන්වනු ඇත.",
"empty_column.domain_blocks": "අවහිර කරන ලද වසම් නැත.",
"empty_column.explore_statuses": "දැන් කිසිවක් නැඹුරු නොවේ. පසුව නැවත පරීක්ෂා කරන්න!",
"empty_column.favourited_statuses": "ඔබ සතුව ප්රියතම ලිපි කිසිවක් නැත. ඔබ යමකට ප්රිය කළ විට එය මෙහි පෙන්වනු ඇත.",
+ "empty_column.favourites": "මෙම සටහනට තවමත් කිසිවෙකු ප්රියතම එකක් දමා නැත. යමෙකු එසේ කළ විට, ඔවුන් මෙහි පෙන්වනු ඇත.",
"empty_column.follow_requests": "ඔබට තවමත් අනුගමන ඉල්ලීම් ලැබී නැත. ඉල්ලීමක් ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.",
+ "empty_column.followed_tags": "ඔබ තවමත් කිසිදු හැෂ් ටැගයක් අනුගමනය කර නැත. ඔබ එසේ කළ විට, ඒවා මෙහි පෙන්වනු ඇත.",
+ "empty_column.hashtag": "මෙම හැෂ් ටැගයේ තවමත් කිසිවක් නොමැත.",
"empty_column.home": "මුල් පිටුව හිස් ය! මෙය පිරවීමට බොහෝ පුද්ගලයින් අනුගමනය කරන්න.",
+ "empty_column.list": "මෙම ලැයිස්තුවේ තවමත් කිසිවක් නොමැත. මෙම ලැයිස්තුවේ සාමාජිකයින් නව සටහන් ප්රකාශයට පත් කරන විට, ඒවා මෙහි දිස්වනු ඇත.",
"empty_column.mutes": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු නිහඬ කර නැත.",
+ "empty_column.notification_requests": "සියල්ල පැහැදිලියි! මෙහි කිසිවක් නැත. ඔබට නව දැනුම්දීම් ලැබුණු විට, ඒවා ඔබගේ සැකසුම් අනුව මෙහි දිස්වනු ඇත.",
"empty_column.notifications": "ඔබට දැනුම්දීම් ලැබී නැත. අන් අය සහ ඔබ අතර අන්යෝන්ය බලපවත්වන දෑ මෙහි දිස්වනු ඇත.",
+ "empty_column.public": "මෙහි කිසිවක් නැත! ප්රසිද්ධියේ යමක් ලියන්න, නැතහොත් එය පිරවීම සඳහා වෙනත් සේවාදායකයන්ගෙන් පරිශීලකයින් අතින් අනුගමනය කරන්න.",
"error.unexpected_crash.explanation": "අපගේ කේතයේ දෝෂයක් හෝ බ්රවුසර ගැළපුම් ගැටලුවක් හේතුවෙන්, මෙම පිටුව නිවැරදිව ප්රදර්ශනය කළ නොහැක.",
"error.unexpected_crash.explanation_addons": "මෙම පිටුව නිවැරදිව ප්රදර්ශනය කළ නොහැක. මෙම දෝෂය බ්රවුසර ඇඩෝනයක් හෝ ස්වයංක්රීය පරිවර්තන මෙවලම් නිසා ඇති විය හැක.",
"error.unexpected_crash.next_steps": "පිටුව නැවුම් කර බලන්න. එයින් ඵලක් නොවේ නම්, වෙනත් අතිරික්සුවක් හෝ නිසග යෙදුමක් හරහා මාස්ටඩන් භාවිතා කරන්න.",
"error.unexpected_crash.next_steps_addons": "ඒවා අබල කර පිටුව නැවුම් කරන්න. එයින් ඵලක් නොවේ නම්, වෙනත් අතිරික්සුවක් හෝ නිසග යෙදුමක් හරහා මාස්ටඩන් භාවිතා කරන්න.",
+ "errors.unexpected_crash.copy_stacktrace": "stacktrace පසුරු පුවරුවට පිටපත් කරන්න",
"errors.unexpected_crash.report_issue": "ගැටළුව වාර්තාව",
"explore.suggested_follows": "පුද්ගලයින්",
"explore.title": "ගවේශනය",
"explore.trending_links": "පුවත්",
"explore.trending_statuses": "ලිපි",
+ "explore.trending_tags": "හැෂ් ටැග්",
+ "filter_modal.added.context_mismatch_explanation": "මෙම පෙරහන් කාණ්ඩය ඔබ මෙම සටහනට ප්රවේශ වූ සන්දර්භයට අදාළ නොවේ. මෙම සන්දර්භය තුළද සටහන පෙරහන් කිරීමට ඔබට අවශ්ය නම්, ඔබට පෙරහන සංස්කරණය කිරීමට සිදුවේ.",
+ "filter_modal.added.context_mismatch_title": "සන්දර්භය නොගැලපීම!",
+ "filter_modal.added.expired_explanation": "මෙම පෙරහන් කාණ්ඩය කල් ඉකුත් වී ඇත, එය යෙදීම සඳහා ඔබට කල් ඉකුත් වීමේ දිනය වෙනස් කිරීමට අවශ්ය වනු ඇත.",
"filter_modal.added.expired_title": "පෙරහන ඉකුත්ය!",
+ "filter_modal.added.review_and_configure": "මෙම පෙරහන් කාණ්ඩය සමාලෝචනය කිරීමට සහ තවදුරටත් වින්යාස කිරීමට, {settings_link}වෙත යන්න.",
"filter_modal.added.review_and_configure_title": "පෙරහන් සැකසුම්",
"filter_modal.added.settings_link": "සැකසුම් පිටුව",
+ "filter_modal.added.short_explanation": "මෙම සටහන පහත පෙරහන් කාණ්ඩයට එක් කර ඇත: {title}.",
"filter_modal.added.title": "පෙරහන එක් කළා!",
+ "filter_modal.select_filter.context_mismatch": "මෙම සන්දර්භයට අදාළ නොවේ.",
"filter_modal.select_filter.expired": "ඉකුත්ය",
"filter_modal.select_filter.prompt_new": "නව ප්රවර්ගය: {name}",
"filter_modal.select_filter.search": "සොයන්න හෝ සාදන්න",
+ "filter_modal.select_filter.subtitle": "පවතින ප්රවර්ගයක් භාවිතා කරන්න හෝ අලුත් එකක් සාදන්න",
"filter_modal.select_filter.title": "මෙම ලිපිය පෙරන්න",
"filter_modal.title.status": "ලිපියක් පෙරන්න",
+ "filter_warning.matches_filter": "ගැලපීම් පෙරහන “{title} ”",
+ "filtered_notifications_banner.pending_requests": "{count, plural, =0 {කිසිවෙකුගෙන්} one {එක් පුද්ගලයෙකුගෙන්} other {# පුද්ගලයින්}} ඔබ දන්නවා ඇති",
"filtered_notifications_banner.title": "පෙරූ දැනුම්දීම්",
"firehose.all": "සියල්ල",
"firehose.local": "මෙම සේවාදායකය",
"firehose.remote": "වෙනත් සේවාදායක",
+ "follow_request.authorize": "අවසර දෙන්න",
"follow_request.reject": "ප්රතික්ෂේප",
+ "follow_requests.unlocked_explanation": "ඔබගේ ගිණුම අගුළු දමා නොමැති වුවද, {domain} කාර්ය මණ්ඩලය සිතුවේ ඔබට මෙම ගිණුම් වලින් ලැබෙන අනුගමන ඉල්ලීම් අතින් සමාලෝචනය කිරීමට අවශ්ය විය හැකි බවයි.",
+ "follow_suggestions.curated_suggestion": "කාර්ය මණ්ඩල තේරීම",
"follow_suggestions.dismiss": "නැවත පෙන්වන්න එපා",
+ "follow_suggestions.featured_longer": "{domain} කණ්ඩායම විසින් අතින් තෝරා ගන්නා ලදී.",
+ "follow_suggestions.friends_of_friends_longer": "ඔබ අනුගමනය කරන පුද්ගලයින් අතර ජනප්රිය",
+ "follow_suggestions.hints.featured": "මෙම පැතිකඩ {domain} කණ්ඩායම විසින් අතින් තෝරාගෙන ඇත.",
+ "follow_suggestions.hints.friends_of_friends": "මෙම පැතිකඩ ඔබ අනුගමනය කරන පුද්ගලයින් අතර ජනප්රියයි.",
+ "follow_suggestions.hints.most_followed": "මෙම පැතිකඩ {domain}හි වැඩිපුරම අනුගමනය කරන ලද එකකි.",
+ "follow_suggestions.hints.most_interactions": "මෙම පැතිකඩ මෑතකදී {domain}හි විශාල අවධානයක් ලබා ගනිමින් පවතී.",
+ "follow_suggestions.hints.similar_to_recently_followed": "මෙම පැතිකඩ ඔබ මෑතකදී අනුගමනය කළ පැතිකඩවලට සමානය.",
+ "follow_suggestions.personalized_suggestion": "පුද්ගලාරෝපිත යෝජනාව",
+ "follow_suggestions.popular_suggestion": "ජනප්රිය යෝජනාව",
+ "follow_suggestions.popular_suggestion_longer": "{domain}හි ජනප්රියයි",
+ "follow_suggestions.similar_to_recently_followed_longer": "ඔබ මෑතකදී අනුගමනය කළ පැතිකඩවලට සමානයි",
"follow_suggestions.view_all": "සියල්ල බලන්න",
+ "follow_suggestions.who_to_follow": "කාවද අනුගමනය කරන්න ඕනේ",
+ "followed_tags": "අනුගමනය කළ හැෂ් ටැග්",
"footer.about": "පිළිබඳව",
"footer.directory": "පැතිකඩ නාමාවලිය",
"footer.get_app": "යෙදුම ගන්න",
@@ -199,34 +388,92 @@
"footer.privacy_policy": "රහස්යතා ප්රතිපත්තිය",
"footer.source_code": "මූලාශ්ර කේතය බලන්න",
"footer.status": "තත්වය",
+ "footer.terms_of_service": "සේවා කොන්දේසි",
"generic.saved": "සුරැකිණි",
"getting_started.heading": "පටන් ගන්න",
+ "hashtag.admin_moderation": "#{name}සඳහා මධ්යස්ථකරණ අතුරුමුහුණත විවෘත කරන්න",
+ "hashtag.browse": "#{hashtag}හි සටහන් පිරික්සන්න",
+ "hashtag.browse_from_account": "#{hashtag}හි @{name} සිට සටහන් බ්රවුස් කරන්න",
"hashtag.column_header.tag_mode.all": "සහ {additional}",
"hashtag.column_header.tag_mode.any": "හෝ {additional}",
+ "hashtag.column_header.tag_mode.none": "{additional}නොමැතිව",
"hashtag.column_settings.select.no_options_message": "යෝජනා හමු නොවිණි",
+ "hashtag.column_settings.select.placeholder": "…හැෂ් ටැග් ඇතුළත් කරන්න",
"hashtag.column_settings.tag_mode.all": "මේ සියල්ලම",
+ "hashtag.column_settings.tag_mode.any": "මේවායින් ඕනෑම එකක්",
"hashtag.column_settings.tag_mode.none": "මේ කිසිවක් නැත",
"hashtag.column_settings.tag_toggle": "මෙම තීරුවේ අමතර ටැග් ඇතුළත් කරන්න",
+ "hashtag.counter_by_accounts": "{count, plural, one {{counter} සහභාගිවන්නන්} other {{counter} සහභාගිවන්නන්}}",
+ "hashtag.counter_by_uses": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}}",
+ "hashtag.counter_by_uses_today": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}} අද",
+ "hashtag.feature": "පැතිකඩෙහි විශේෂාංගය",
+ "hashtag.follow": "හැෂ් ටැගය අනුගමනය කරන්න",
+ "hashtag.mute": "නිහඬ කරන්න #{hashtag}",
+ "hashtag.unfeature": "පැතිකඩෙහි විශේෂාංගගත නොකරන්න.",
+ "hashtag.unfollow": "හැෂ් ටැගය අනුගමනය නොකරන්න",
+ "hashtags.and_other": "…සහ {count, plural, other {# තව}}",
+ "hints.profiles.followers_may_be_missing": "මෙම පැතිකඩ සඳහා අනුගාමිකයින් අතුරුදහන් විය හැකිය.",
+ "hints.profiles.follows_may_be_missing": "මෙම පැතිකඩ සඳහා අනුගාමිකයින් අතුරුදහන් විය හැකිය.",
+ "hints.profiles.posts_may_be_missing": "මෙම පැතිකඩෙන් සමහර සටහන් අස්ථානගත වී තිබිය හැක.",
+ "hints.profiles.see_more_followers": "{domain}හි තවත් අනුගාමිකයින් බලන්න",
+ "hints.profiles.see_more_follows": "{domain}හි තවත් පහත ඒවා බලන්න.",
+ "hints.profiles.see_more_posts": "{domain}හි තවත් සටහන් බලන්න",
+ "hints.threads.replies_may_be_missing": "අනෙකුත් සේවාදායකයන්ගෙන් ලැබෙන පිළිතුරු අස්ථානගත වී තිබිය හැක.",
+ "hints.threads.see_more": "{domain}හි තවත් පිළිතුරු බලන්න.",
+ "home.column_settings.show_reblogs": "බූස්ට් පෙන්වන්න",
"home.column_settings.show_replies": "පිළිතුරු පෙන්වන්න",
"home.hide_announcements": "නිවේදන සඟවන්න",
+ "home.pending_critical_update.body": "කරුණාකර හැකි ඉක්මනින් ඔබේ Mastodon සේවාදායකය යාවත්කාලීන කරන්න!",
"home.pending_critical_update.link": "යාවත්කාල බලන්න",
+ "home.pending_critical_update.title": "වැදගත් ආරක්ෂක යාවත්කාලීනයක් තිබේ!",
"home.show_announcements": "නිවේදන පෙන්වන්න",
+ "ignore_notifications_modal.disclaimer": "ඔබ ඔවුන්ගේ දැනුම්දීම් නොසලකා හැර ඇති බව Mastodon හට පරිශීලකයින්ට දැනුම් දිය නොහැක. දැනුම්දීම් නොසලකා හැරීමෙන් පණිවිඩ යැවීම නතර නොවේ.",
+ "ignore_notifications_modal.filter_instead": "ඒ වෙනුවට පෙරහන් කරන්න",
+ "ignore_notifications_modal.filter_to_act_users": "ඔබට තවමත් පරිශීලකයින් පිළිගැනීමට, ප්රතික්ෂේප කිරීමට හෝ වාර්තා කිරීමට හැකි වනු ඇත.",
+ "ignore_notifications_modal.filter_to_avoid_confusion": "පෙරහන් කිරීම විය හැකි ව්යාකූලත්වය වළක්වා ගැනීමට උපකාරී වේ",
+ "ignore_notifications_modal.filter_to_review_separately": "ඔබට පෙරහන් කළ දැනුම්දීම් වෙන වෙනම සමාලෝචනය කළ හැකිය.",
+ "ignore_notifications_modal.ignore": "දැනුම්දීම් නොසලකා හරින්න",
+ "ignore_notifications_modal.limited_accounts_title": "මධ්යස්ථ ගිණුම් වලින් ලැබෙන දැනුම්දීම් නොසලකා හරින්නද?",
+ "ignore_notifications_modal.new_accounts_title": "නව ගිණුම් වලින් ලැබෙන දැනුම්දීම් නොසලකා හරින්නද?",
+ "ignore_notifications_modal.not_followers_title": "ඔබව අනුගමනය නොකරන පුද්ගලයින්ගෙන් ලැබෙන දැනුම්දීම් නොසලකා හරින්නද?",
+ "ignore_notifications_modal.not_following_title": "ඔබ අනුගමනය නොකරන පුද්ගලයින්ගෙන් ලැබෙන දැනුම්දීම් නොසලකා හරින්නද?",
+ "ignore_notifications_modal.private_mentions_title": "අයාචිත පෞද්ගලික සඳහන් කිරීම් වලින් ලැබෙන දැනුම්දීම් නොසලකා හරින්නද?",
+ "info_button.label": "උදව්",
+ "info_button.what_is_alt_text": "alt පෙළ යනු කුමක්ද? දෘශ්යාබාධිත, අඩු කලාප පළල සම්බන්ධතා ඇති පුද්ගලයින් හෝ අමතර සන්දර්භයක් සොයන අය සඳහා Alt පෙළ රූප විස්තර සපයයි.
පැහැදිලි, සංක්ෂිප්ත සහ වෛෂයික alt පෙළ ලිවීමෙන් ඔබට සැමට ප්රවේශ්යතාව සහ අවබෝධය වැඩි දියුණු කළ හැකිය.
වැදගත් අංග ග්රහණය කරගන්න රූපවල පෙළ සාරාංශ කරන්න නිත්ය වාක්ය ව්යුහය භාවිතා කරන්න අතිරික්ත තොරතුරු වලින් වළකින්න සංකීර්ණ දෘශ්යවල (රූප සටහන් හෝ සිතියම් වැනි) ප්රවණතා සහ ප්රධාන සොයාගැනීම් කෙරෙහි අවධානය යොමු කරන්න ",
+ "interaction_modal.action.favourite": "ඉදිරියට යාමට, ඔබ ඔබේ ගිණුමෙන් ප්රියතම කළ යුතුය.",
+ "interaction_modal.action.follow": "ඉදිරියට යාමට, ඔබ ඔබේ ගිණුමෙන් අනුගමනය කළ යුතුය.",
+ "interaction_modal.action.reblog": "ඉදිරියට යාමට, ඔබ ඔබේ ගිණුමෙන් නැවත බ්ලොග් කළ යුතුය.",
+ "interaction_modal.action.reply": "ඉදිරියට යාමට, ඔබ ඔබේ ගිණුමෙන් පිළිතුරු දිය යුතුය.",
+ "interaction_modal.action.vote": "ඉදිරියට යාමට, ඔබ ඔබේ ගිණුමෙන් ඡන්දය දිය යුතුය.",
+ "interaction_modal.go": "යන්න",
+ "interaction_modal.no_account_yet": "තවම ගිණුමක් නැද්ද?",
"interaction_modal.on_another_server": "වෙනත් සේවාදායකයක",
"interaction_modal.on_this_server": "මෙම සේවාදායකයෙහි",
"interaction_modal.title.favourite": "{name}ගේ ලිපිය ප්රිය කරන්න",
"interaction_modal.title.follow": "{name} අනුගමනය",
+ "interaction_modal.title.reblog": "{name}ගේ සටහන වැඩි කරන්න",
"interaction_modal.title.reply": "{name}ගේ ලිපියට පිළිතුරු",
+ "interaction_modal.title.vote": "{name}ගේ මත විමසුමට ඡන්දය දෙන්න",
+ "interaction_modal.username_prompt": "උදා {example}",
"intervals.full.days": "{number, plural, one {දවස් #} other {දවස් #}}",
"intervals.full.hours": "{number, plural, one {පැය #} other {පැය #}}",
"intervals.full.minutes": "{number, plural, one {විනාඩි #} other {විනාඩි #}}",
"keyboard_shortcuts.back": "ආපසු යාත්රණය",
+ "keyboard_shortcuts.blocked": "අවහිර කළ පරිශීලක ලැයිස්තුව විවෘත කරන්න",
+ "keyboard_shortcuts.boost": "පළ කිරීම වැඩි කරන්න",
+ "keyboard_shortcuts.column": "තීරුව අවධානය යොමු කරන්න",
+ "keyboard_shortcuts.compose": "පෙළ ප්රදේශය රචනා කිරීමට අවධානය යොමු කරන්න",
"keyboard_shortcuts.description": "සවිස්තරය",
+ "keyboard_shortcuts.direct": "පෞද්ගලික සඳහන් තීරුව විවෘත කිරීමට",
"keyboard_shortcuts.down": "ලැයිස්තුවේ පහළට ගෙනයන්න",
"keyboard_shortcuts.enter": "ලිපිය අරින්න",
+ "keyboard_shortcuts.favourite": "ප්රියතම පළ කිරීම",
"keyboard_shortcuts.favourites": "ප්රියතමයන් ලැයිස්තුව අරින්න",
"keyboard_shortcuts.federated": "ෆෙඩරේටඩ් කාලරාමුව විවෘත කිරීමට",
"keyboard_shortcuts.heading": "යතුරුපුවරු කෙටිමං",
+ "keyboard_shortcuts.home": "මුල් පිටුව කාලරේඛාව විවෘත කරන්න",
"keyboard_shortcuts.hotkey": "උණු යතුර",
+ "keyboard_shortcuts.legend": "මෙම පුරාවෘත්තය පෙන්වන්න",
"keyboard_shortcuts.local": "දේශීය කාලරේඛාව විවෘත කිරීමට",
"keyboard_shortcuts.mention": "කතුවරයා සඳහන් කිරීමට",
"keyboard_shortcuts.muted": "නිහඬ කළ අය පෙන්වන්න",
@@ -236,34 +483,85 @@
"keyboard_shortcuts.pinned": "ඇමිණූ ලිපි ලැයිස්තුව අරින්න",
"keyboard_shortcuts.profile": "කතෘගේ පැතිකඩ අරින්න",
"keyboard_shortcuts.reply": "පිළිතුරු දීමට",
+ "keyboard_shortcuts.requests": "අනුගමනය කිරීමේ ඉල්ලීම් ලැයිස්තුව විවෘත කරන්න",
+ "keyboard_shortcuts.search": "සෙවුම් තීරුව කෙරෙහි අවධානය යොමු කරන්න",
"keyboard_shortcuts.spoilers": "CW ක්ෂේත්රය පෙන්වන්න/සඟවන්න",
"keyboard_shortcuts.start": "\"පටන් ගන්න\" තීරුව අරින්න",
+ "keyboard_shortcuts.toggle_hidden": "CW පිටුපස පෙළ පෙන්වන්න/සඟවන්න",
"keyboard_shortcuts.toggle_sensitivity": "මාධ්ය පෙන්වන්න/සඟවන්න",
"keyboard_shortcuts.toot": "නව ලිපියක් අරඹන්න",
+ "keyboard_shortcuts.translate": "සටහනක් පරිවර්තනය කිරීමට",
+ "keyboard_shortcuts.unfocus": "පෙළ ප්රදේශය/සෙවීම රචනා කිරීම නාභිගත නොකරන්න",
"keyboard_shortcuts.up": "ලැයිස්තුවේ ඉහළට ගෙනයන්න",
"lightbox.close": "වසන්න",
"lightbox.next": "ඊළඟ",
"lightbox.previous": "පෙර",
+ "lightbox.zoom_in": "සැබෑ ප්රමාණයට විශාලනය කරන්න",
+ "lightbox.zoom_out": "ගැළපීමට විශාලනය කරන්න",
"limited_account_hint.action": "කෙසේ හෝ පැතිකඩ පෙන්වන්න",
+ "limited_account_hint.title": "මෙම පැතිකඩ {domain}හි මධ්යස්ථකරුවන් විසින් සඟවා ඇත.",
+ "link_preview.author": "{name}විසිනි",
+ "link_preview.more_from_author": "{name}වෙතින් තවත්",
+ "link_preview.shares": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}}",
+ "lists.add_member": "එකතු කරන්න",
+ "lists.add_to_list": "ලැයිස්තුවට එක් කරන්න",
+ "lists.add_to_lists": "ලැයිස්තු වලට {name} එකතු කරන්න",
+ "lists.create": "නිර්මාණය කරන්න",
+ "lists.create_a_list_to_organize": "ඔබේ මුල් පිටුව සංග්රහය සංවිධානය කිරීමට නව ලැයිස්තුවක් සාදන්න",
+ "lists.create_list": "ලැයිස්තුවක් සාදන්න",
"lists.delete": "ලැයිස්තුව මකන්න",
+ "lists.done": "කළා",
"lists.edit": "ලැයිස්තුව සංස්කරණය",
+ "lists.exclusive": "මුල් පිටුවේ සාමාජිකයන් සඟවන්න",
+ "lists.exclusive_hint": "මෙම ලැයිස්තුවේ කෙනෙකු සිටී නම්, ඔවුන්ගේ සටහන් දෙවරක් නොදැකීමට ඔවුන්ව ඔබේ මුල් පිටුවේ සඟවන්න.",
+ "lists.find_users_to_add": "එකතු කිරීමට පරිශීලකයින් සොයන්න",
+ "lists.list_members_count": "{count, plural, one {# සාමාජිකයා} other {# සාමාජිකයා}}",
+ "lists.list_name": "ලැයිස්තුවේ නම",
+ "lists.new_list_name": "නව ලැයිස්තු නම",
+ "lists.no_lists_yet": "තවම ලැයිස්තු නොමැත.",
+ "lists.no_members_yet": "තවම සාමාජිකයන් නැත.",
+ "lists.no_results_found": "ප්රතිඵල හමු නොවීය.",
+ "lists.remove_member": "ඉවත් කරන්න",
+ "lists.replies_policy.followed": "අනුගමනය කරන ඕනෑම පරිශීලකයෙක්",
"lists.replies_policy.list": "ලැයිස්තුවේ සාමාජිකයින්",
"lists.replies_policy.none": "කිසිවෙක් නැත",
+ "lists.save": "සුරකින්න",
+ "lists.search": "සෙවීම",
+ "lists.show_replies_to": "ලැයිස්තු සාමාජිකයින්ගෙන් පිළිතුරු ඇතුළත් කරන්න",
+ "load_pending": "{count, plural, one {# අලුත් අයිතමය} other {# අලුත් අයිතම}}",
+ "loading_indicator.label": "…පූරණය වෙමින් පවතී",
+ "media_gallery.hide": "සඟවන්න",
+ "moved_to_account_banner.text": "ඔබ {movedToAccount}වෙත මාරු වූ නිසා ඔබගේ {disabledAccount} ගිණුම දැනට අක්රිය කර ඇත.",
+ "mute_modal.hide_from_notifications": "දැනුම්දීම් වලින් සඟවන්න",
+ "mute_modal.hide_options": "විකල්ප සඟවන්න",
+ "mute_modal.indefinite": "මම ඒවා නිහඬ නොකරන තුරු",
+ "mute_modal.show_options": "විකල්ප පෙන්වන්න",
+ "mute_modal.they_can_mention_and_follow": "ඔවුන්ට ඔබව සඳහන් කර අනුගමනය කළ හැකිය, නමුත් ඔබට ඔවුන් නොපෙනේ.",
+ "mute_modal.they_wont_know": "ඔවුන් නිහඬ කර ඇති බව ඔවුන් නොදනී.",
+ "mute_modal.title": "පරිශීලකයා නිහඬ කරන්නද?",
+ "mute_modal.you_wont_see_mentions": "ඒවා සඳහන් කරන සටහන් ඔබට නොපෙනේ.",
+ "mute_modal.you_wont_see_posts": "ඔවුන්ට තවමත් ඔබේ සටහන් දැකිය හැකි නමුත්, ඔබට ඔවුන්ගේ සටහන් නොපෙනේ.",
"navigation_bar.about": "පිළිබඳව",
+ "navigation_bar.administration": "පරිපාලනය",
+ "navigation_bar.advanced_interface": "උසස් වෙබ් අතුරු මුහුණතකින් විවෘත කරන්න",
"navigation_bar.blocks": "අවහිර කළ අය",
"navigation_bar.bookmarks": "පොත්යොමු",
"navigation_bar.community_timeline": "ස්ථානීය කාලරේඛාව",
"navigation_bar.compose": "නව ලිපියක් ලියන්න",
"navigation_bar.direct": "පෞද්ගලික සැඳහුම්",
+ "navigation_bar.discover": "සොයා ගන්න",
"navigation_bar.domain_blocks": "අවහිර කළ වසම්",
"navigation_bar.explore": "ගවේශනය",
"navigation_bar.favourites": "ප්රියතමයන්",
"navigation_bar.filters": "නිහඬ කළ වචන",
"navigation_bar.follow_requests": "අනුගමන ඉල්ලීම්",
+ "navigation_bar.followed_tags": "අනුගමනය කළ හැෂ් ටැග්",
"navigation_bar.follows_and_followers": "අනුගමන හා අනුගාමික",
"navigation_bar.lists": "ලැයිස්තු",
"navigation_bar.logout": "නික්මෙන්න",
+ "navigation_bar.moderation": "මධ්යස්ථභාවය",
"navigation_bar.mutes": "නිහඬ කළ අය",
+ "navigation_bar.opened_in_classic_interface": "සම්භාව්ය වෙබ් අතුරුමුහුණත තුළ පළ කිරීම්, ගිණුම් සහ අනෙකුත් නිශ්චිත පිටු පෙරනිමියෙන් විවෘත වේ.",
"navigation_bar.personal": "පුද්ගලික",
"navigation_bar.pins": "ඇමිණූ ලිපි",
"navigation_bar.preferences": "අභිප්රේත",
@@ -271,22 +569,82 @@
"navigation_bar.search": "සොයන්න",
"navigation_bar.security": "ආරක්ෂාව",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
+ "notification.admin.report": "{name} වාර්තා කර ඇත {target}",
+ "notification.admin.report_statuses": "{category}සඳහා {name} {target} වාර්තා කරන ලදී",
+ "notification.admin.report_statuses_other": "{name} වාර්තා කර ඇත {target}",
+ "notification.admin.sign_up": "{name} ලියාපදිංචි විය",
+ "notification.admin.sign_up.name_and_others": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ලියාපදිංචි විය",
+ "notification.annual_report.message": "ඔබේ {year} #Wrapstodon බලා සිටී! Mastodon හි ඔබේ වසරේ කැපී පෙනෙන අවස්ථා සහ අමතක නොවන අවස්ථා එළිදක්වන්න!",
+ "notification.annual_report.view": "#රැප්ස්ටෝඩන් බලන්න",
"notification.favourite": "{name} ඔබගේ ලිපියට ප්රිය කළා",
+ "notification.favourite.name_and_others_with_link": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ඔබේ සටහන ප්රියතම කළා.",
+ "notification.favourite_pm": "{name} ඔබේ පෞද්ගලික සඳහන ප්රියතම කළා",
+ "notification.favourite_pm.name_and_others_with_link": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ඔබේ පුද්ගලික සඳහන ප්රියතම කළා",
"notification.follow": "{name} ඔබව අනුගමනය කළා",
+ "notification.follow.name_and_others": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ඔබව අනුගමනය කළා",
+ "notification.follow_request": "{name} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත.",
+ "notification.follow_request.name_and_others": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත.",
+ "notification.label.mention": "සඳහන් කිරීම",
+ "notification.label.private_mention": "පුද්ගලික සඳහන",
+ "notification.label.private_reply": "පුද්ගලික පිළිතුර",
+ "notification.label.reply": "පිළිතුරු දෙන්න",
+ "notification.mention": "සඳහන් කිරීම",
+ "notification.mentioned_you": "{name} ඔබව සඳහන් කළා",
+ "notification.moderation-warning.learn_more": "තවත් හදාරන්න",
+ "notification.moderation_warning": "ඔබට මධ්යස්ථකරණ අනතුරු ඇඟවීමක් ලැබී ඇත.",
+ "notification.moderation_warning.action_delete_statuses": "ඔබගේ සමහර සටහන් ඉවත් කර ඇත.",
+ "notification.moderation_warning.action_disable": "ඔබගේ ගිණුම අක්රිය කර ඇත.",
+ "notification.moderation_warning.action_mark_statuses_as_sensitive": "ඔබගේ සමහර සටහන් සංවේදී ලෙස සලකුණු කර ඇත.",
+ "notification.moderation_warning.action_none": "ඔබගේ ගිණුමට මධ්යස්ථකරණ අනතුරු ඇඟවීමක් ලැබී ඇත.",
+ "notification.moderation_warning.action_sensitive": "මෙතැන් සිට ඔබගේ සටහන් සංවේදී ලෙස සලකුණු කෙරේ.",
+ "notification.moderation_warning.action_silence": "ඔබගේ ගිණුම සීමා කර ඇත.",
+ "notification.moderation_warning.action_suspend": "ඔබගේ ගිණුම අත්හිටුවා ඇත.",
"notification.own_poll": "ඔබගේ මත විමසුම නිමයි",
+ "notification.poll": "ඔබ ඡන්දය දුන් මත විමසුමක් අවසන් විය.",
+ "notification.reblog": "{name} ඔබේ සටහන වැඩි කළා",
+ "notification.reblog.name_and_others_with_link": "{name} සහ {count, plural, one {# වෙනත්} other {# වෙනත්}} ඔබේ සටහන බූස්ට් කළා",
+ "notification.relationships_severance_event": "{name}සමඟ සම්බන්ධතා නැති විය",
+ "notification.relationships_severance_event.account_suspension": "{from} හි පරිපාලකයෙකු {target}අත්හිටුවා ඇත, එයින් අදහස් වන්නේ ඔබට තවදුරටත් ඔවුන්ගෙන් යාවත්කාලීන ලබා ගැනීමට හෝ ඔවුන් සමඟ අන්තර් ක්රියා කිරීමට නොහැකි බවයි.",
+ "notification.relationships_severance_event.domain_block": "{from} හි පරිපාලකයෙකු {target}අවහිර කර ඇත, එයට ඔබගේ අනුගාමිකයින් {followersCount} සහ ඔබ අනුගමනය කරන {followingCount, plural, one {# ගිණුම} other {# ගිණුම්}} ඇතුළත් වේ.",
+ "notification.relationships_severance_event.learn_more": "තවත් හදාරන්න",
+ "notification.relationships_severance_event.user_domain_block": "ඔබ {target}අවහිර කර ඇති අතර, ඔබගේ අනුගාමිකයින් {followersCount} ක් සහ ඔබ අනුගමනය කරන {followingCount, plural, one {# ගිණුම} other {# ගිණුම්}} ක් ඉවත් කර ඇත.",
"notification.status": "{name} දැන් පළ කළා",
"notification.update": "{name} ලිපියක් සංස්කරණය කළා",
+ "notification_requests.accept": "පිළිගන්න",
+ "notification_requests.accept_multiple": "{count, plural, one {# ඉල්ලීම පිළිගන්න…} other {ඉල්ලීම් # පිළිගන්න…}}",
+ "notification_requests.confirm_accept_multiple.button": "{count, plural, one {ඉල්ලීම පිළිගන්න} other {ඉල්ලීම් පිළිගන්න}}",
+ "notification_requests.confirm_accept_multiple.message": "ඔබ {count, plural, one {එක දැනුම්දීමේ ඉල්ලීමක්} other {පිළිගැනීමට ආසන්නයි # දැනුම්දීම් ඉල්ලීම්}}. ඔබට ඉදිරියට යාමට අවශ්ය බව විශ්වාසද?",
+ "notification_requests.confirm_accept_multiple.title": "දැනුම්දීම් ඉල්ලීම් පිළිගන්නවාද?",
+ "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {ඉල්ලීම ඉවත ලන්න} other {ඉල්ලීම් ඉවත ලන්න}}",
+ "notification_requests.confirm_dismiss_multiple.message": "ඔබ {count, plural, one {එක් දැනුම්දීමේ ඉල්ලීමක්} other {# දැනුම්දීම් ඉල්ලීම්}}ඉවත දැමීමට ආසන්නයි. ඔබට {count, plural, one {එය} other {ඒවා}} වෙත නැවත පහසුවෙන් ප්රවේශ වීමට නොහැකි වනු ඇත. ඔබට ඉදිරියට යාමට අවශ්ය බව ඔබට විශ්වාසද?",
+ "notification_requests.confirm_dismiss_multiple.title": "දැනුම්දීම් ඉල්ලීම් ඉවත දමන්නද?",
+ "notification_requests.dismiss": "ඉවතලන්න",
+ "notification_requests.dismiss_multiple": "{count, plural, one {ඉවත ලන්න # ඉල්ලීම…} other {ඉවත ලන්න # ඉල්ලීම්…}}",
+ "notification_requests.edit_selection": "සංස්කරණය කරන්න",
+ "notification_requests.exit_selection": "කළා",
+ "notification_requests.explainer_for_limited_account": "ගිණුම මධ්යස්ථකරුවෙකු විසින් සීමා කර ඇති බැවින් මෙම ගිණුමෙන් ලැබෙන දැනුම්දීම් පෙරහන් කර ඇත.",
+ "notification_requests.explainer_for_limited_remote_account": "ගිණුම හෝ එහි සේවාදායකය මධ්යස්ථකරුවෙකු විසින් සීමා කර ඇති බැවින් මෙම ගිණුමෙන් ලැබෙන දැනුම්දීම් පෙරහන් කර ඇත.",
+ "notification_requests.maximize": "උපරිම කරන්න",
+ "notification_requests.minimize_banner": "පෙරහන් කළ දැනුම්දීම් බැනරය අවම කරන්න",
+ "notification_requests.notifications_from": "{name}වෙතින් දැනුම්දීම්",
+ "notification_requests.title": "පෙරහන් කළ දැනුම්දීම්",
+ "notification_requests.view": "දැනුම්දීම් බලන්න",
"notifications.clear": "දැනුම්දීම් මකන්න",
"notifications.clear_confirmation": "දැනුම්දීම් සියල්ල හිස් කිරීමට වුවමනා ද?",
+ "notifications.clear_title": "දැනුම්දීම් හිස් කරන්නද?",
"notifications.column_settings.admin.report": "නව වාර්තා:",
"notifications.column_settings.admin.sign_up": "නව ලියාපදිංචි:",
"notifications.column_settings.alert": "වැඩතල දැනුම්දීම්",
"notifications.column_settings.favourite": "ප්රියතමයන්:",
+ "notifications.column_settings.filter_bar.advanced": "සියලුම කාණ්ඩ පෙන්වන්න",
+ "notifications.column_settings.filter_bar.category": "ඉක්මන් පෙරහන් තීරුව",
"notifications.column_settings.follow": "නව අනුගාමිකයින්:",
"notifications.column_settings.follow_request": "නව අනුගමන ඉල්ලීම්:",
+ "notifications.column_settings.group": "සමූහය",
"notifications.column_settings.mention": "සැඳහුම්:",
"notifications.column_settings.poll": "මත විමසුමේ ප්රතිඵල:",
"notifications.column_settings.push": "තල්ලු දැනුම්දීම්",
+ "notifications.column_settings.reblog": "බූස්ට්:",
"notifications.column_settings.show": "තීරුවෙහි පෙන්වන්න",
"notifications.column_settings.sound": "ශබ්දය වාදනය",
"notifications.column_settings.status": "නව ලිපි:",
@@ -294,25 +652,82 @@
"notifications.column_settings.unread_notifications.highlight": "නොකියවූ දැනුම්දීම් ඉස්මතු කරන්න",
"notifications.column_settings.update": "සංශෝධන:",
"notifications.filter.all": "සියල්ල",
+ "notifications.filter.boosts": "වැඩි කරයි",
"notifications.filter.favourites": "ප්රියතමයන්",
"notifications.filter.follows": "අනුගමනය",
"notifications.filter.mentions": "සැඳහුම්",
"notifications.filter.polls": "මත විමසුමේ ප්රතිඵල",
+ "notifications.filter.statuses": "ඔබ අනුගමනය කරන පුද්ගලයින්ගෙන් යාවත්කාලීන කිරීම්",
+ "notifications.grant_permission": "අවසර දෙන්න.",
"notifications.group": "දැනුම්දීම් {count}",
"notifications.mark_as_read": "සියළු දැනුම්දීම් කියවූ බව යොදන්න",
+ "notifications.permission_denied": "කලින් ප්රතික්ෂේප කරන ලද බ්රව්සර් අවසර ඉල්ලීම නිසා ඩෙස්ක්ටොප් දැනුම්දීම් ලබා ගත නොහැක.",
+ "notifications.permission_denied_alert": "බ්රවුසර අවසරය කලින් ප්රතික්ෂේප කර ඇති බැවින්, ඩෙස්ක්ටොප් දැනුම්දීම් සක්රීය කළ නොහැක.",
+ "notifications.permission_required": "අවශ්ය අවසරය ලබා දී නොමැති නිසා ඩෙස්ක්ටොප් දැනුම්දීම් ලබා ගත නොහැක.",
+ "notifications.policy.accept": "පිළිගන්න",
+ "notifications.policy.accept_hint": "දැනුම්දීම් තුළ පෙන්වන්න",
+ "notifications.policy.drop": "නොසලකා හරින්න",
+ "notifications.policy.drop_hint": "නැවත කිසිදා නොපෙනී, හිස්තැනට යවන්න.",
+ "notifications.policy.filter": "පෙරහන",
+ "notifications.policy.filter_hint": "පෙරහන් කළ දැනුම්දීම් එන ලිපි වෙත යවන්න",
+ "notifications.policy.filter_limited_accounts_hint": "සේවාදායක මධ්යස්ථකරුවන් විසින් සීමා කර ඇත.",
+ "notifications.policy.filter_limited_accounts_title": "මධ්යස්ථ ගිණුම්",
+ "notifications.policy.filter_new_accounts.hint": "අතීතය තුළ නිර්මාණය කරන ලදී {days, plural, one {එක් දිනක්} other {# දින}}",
+ "notifications.policy.filter_new_accounts_title": "නව ගිණුම්",
+ "notifications.policy.filter_not_followers_hint": "{days, plural, one {ට වඩා අඩුවෙන් ඔබව අනුගමනය කරන පුද්ගලයින් ඇතුළුව, එක් දිනක්} other {# දින}}",
+ "notifications.policy.filter_not_followers_title": "ඔබව අනුගමනය නොකරන පුද්ගලයින්",
+ "notifications.policy.filter_not_following_hint": "ඔබ ඒවා හස්තීයව අනුමත කරන තුරු",
+ "notifications.policy.filter_not_following_title": "ඔබ අනුගමනය නොකරන පුද්ගලයින්",
+ "notifications.policy.filter_private_mentions_hint": "ඔබේම සඳහන් කිරීමට පිළිතුරක් ලෙස හෝ ඔබ යවන්නා අනුගමනය කරන්නේ නම් මිස පෙරහන් කර ඇත.",
+ "notifications.policy.filter_private_mentions_title": "අයාචිත පෞද්ගලික සඳහන් කිරීම්",
+ "notifications.policy.title": "…සිට දැනුම්දීම් කළමනාකරණය කරන්න",
"notifications_permission_banner.enable": "වැඩතල දැනුම්දීම් සබල කරන්න",
+ "notifications_permission_banner.how_to_control": "Mastodon විවෘතව නොමැති විට දැනුම්දීම් ලබා ගැනීමට, ඩෙස්ක්ටොප් දැනුම්දීම් සක්රීය කරන්න. ඒවා සක්රීය කළ පසු ඉහත {icon} බොත්තම හරහා ඩෙස්ක්ටොප් දැනුම්දීම් ජනනය කරන්නේ කුමන ආකාරයේ අන්තර්ක්රියාද යන්න ඔබට නිශ්චිතවම පාලනය කළ හැකිය.",
"notifications_permission_banner.title": "කිසිවක් අතපසු නොකරන්න",
+ "onboarding.follows.back": "ආපසු",
+ "onboarding.follows.done": "කළා",
+ "onboarding.follows.empty": "අවාසනාවකට, දැන් ප්රතිඵල කිසිවක් පෙන්විය නොහැක. අනුගමනය කිරීමට පුද්ගලයින් සොයා ගැනීමට ඔබට සෙවීම භාවිතා කිරීමට හෝ ගවේෂණ පිටුව බ්රවුස් කිරීමට උත්සාහ කළ හැකිය, නැතහොත් පසුව නැවත උත්සාහ කරන්න.",
+ "onboarding.follows.search": "සෙවීම",
+ "onboarding.follows.title": "ආරම්භ කිරීමට පුද්ගලයින් අනුගමනය කරන්න",
+ "onboarding.profile.discoverable": "මගේ පැතිකඩ සොයා ගත හැකි කරන්න",
+ "onboarding.profile.discoverable_hint": "ඔබ Mastodon හි සොයාගැනීමේ හැකියාව තෝරා ගත් විට, ඔබේ සටහන් සෙවුම් ප්රතිඵලවල සහ ප්රවණතාවල දිස්විය හැකි අතර, ඔබට සමාන උනන්දුවක් ඇති පුද්ගලයින්ට ඔබේ පැතිකඩ යෝජනා කළ හැකිය.",
+ "onboarding.profile.display_name": "ප්රදර්ශන නාමය",
+ "onboarding.profile.display_name_hint": "ඔබේ සම්පූර්ණ නම හෝ ඔබේ විනෝදජනක නම…",
+ "onboarding.profile.note": "ජෛව",
+ "onboarding.profile.note_hint": "ඔබට වෙනත් පුද්ගලයින් හෝ #හැෂ් ටැග්…@සඳහන් කළ හැක.",
+ "onboarding.profile.save_and_continue": "සුරකින්න සහ ඉදිරියට යන්න",
+ "onboarding.profile.title": "පැතිකඩ සැකසුම",
+ "onboarding.profile.upload_avatar": "පැතිකඩ පින්තූරය උඩුගත කරන්න",
+ "onboarding.profile.upload_header": "පැතිකඩ ශීර්ෂය උඩුගත කරන්න",
+ "password_confirmation.exceeds_maxlength": "මුරපද තහවුරු කිරීම උපරිම මුරපදයේ දිග ඉක්මවයි.",
+ "password_confirmation.mismatching": "මුරපද තහවුරු කිරීම නොගැලපේ.",
+ "picture_in_picture.restore": "ඒක ආපහු දාන්න.",
"poll.closed": "වසා ඇත",
"poll.refresh": "නැවුම් කරන්න",
"poll.reveal": "ප්රතිඵල බලන්න",
+ "poll.total_people": "{count, plural, one {# පුද්ගලයා} other {# පුද්ගලයින්}}",
+ "poll.total_votes": "{count, plural, one {# ඡන්දය} other {# ඡන්ද}}",
"poll.vote": "ඡන්දය",
"poll.voted": "ඔබ මෙම උත්තරයට ඡන්දය දී ඇත",
+ "poll.votes": "{votes, plural, one {# ඡන්දය} other {# ඡන්ද}}",
"poll_button.add_poll": "මත විමසුමක් අරඹන්න",
"poll_button.remove_poll": "මත විමසුම ඉවතලන්න",
"privacy.change": "ලිපියේ රහස්යතාව සංශෝධනය",
+ "privacy.direct.long": "සටහනේ සඳහන් කළ සියලු දෙනාම",
+ "privacy.direct.short": "පුද්ගලික සඳහන",
+ "privacy.private.long": "ඔබේ අනුගාමිකයින් පමණයි",
+ "privacy.private.short": "අනුගාමිකයින්",
+ "privacy.public.long": "මැස්ටෝඩන් වල සහ ඉන් පිටත ඕනෑම අයෙක්",
"privacy.public.short": "ප්රසිද්ධ",
+ "privacy.unlisted.additional": "මෙය හරියටම පොදු ලෙසම ක්රියා කරයි, ඔබ ගිණුම පුරා තෝරාගෙන සිටියත්, සජීවී සංග්රහ හෝ හැෂ් ටැග්, ගවේෂණය හෝ මැස්ටෝඩන් සෙවුම තුළ පළ කිරීම දිස් නොවේ.",
+ "privacy.unlisted.long": "ඇල්ගොරිතම රසික ගාස්තු අඩුයි",
+ "privacy.unlisted.short": "නිහඬ මහජනතාව",
+ "privacy_policy.last_updated": "අවසන් වරට යාවත්කාලීන කරන ලද්දේ {date}",
"privacy_policy.title": "රහස්යතා ප්රතිපත්තිය",
+ "recommended": "නිර්දේශිත",
"refresh": "නැවුම් කරන්න",
+ "regeneration_indicator.please_stand_by": "කරුණාකර රැඳී සිටින්න.",
+ "regeneration_indicator.preparing_your_home_feed": "ඔබේ නිවසේ සංග්රහය සූදානම් කරමින්…",
"relative_time.days": "ද. {number}",
"relative_time.full.days": "{number, plural, one {දවස් #} other {දවස් #}} කට පෙර",
"relative_time.full.hours": "{number, plural, one {පැය #} other {පැය #}} කට පෙර",
@@ -324,8 +739,12 @@
"relative_time.minutes": "වි. {number}",
"relative_time.seconds": "තත්. {number}",
"relative_time.today": "අද",
+ "reply_indicator.attachments": "{count, plural, one {# ඇමුණුම} other {# ඇමුණුම්}}",
"reply_indicator.cancel": "අවලංගු කරන්න",
+ "reply_indicator.poll": "මත විමසුම",
"report.block": "අවහිර",
+ "report.block_explanation": "ඔබට ඔවුන්ගේ සටහන් නොපෙනේ. ඔවුන්ට ඔබේ සටහන් දැකීමට හෝ ඔබව අනුගමනය කිරීමට නොහැකි වනු ඇත. ඔවුන් අවහිර කර ඇති බව ඔවුන්ට දැනගත හැකි වනු ඇත.",
+ "report.categories.legal": "නීතිමය",
"report.categories.other": "වෙනත්",
"report.categories.spam": "ආයාචිත",
"report.categories.violation": "අන්තර්ගතය නිසා සේවාදායකයේ නීතියක් හෝ කිහිපයක් කඩ වේ",
@@ -343,6 +762,8 @@
"report.placeholder": "අමතර අදහස්",
"report.reasons.dislike": "මම එයට අකැමතියි",
"report.reasons.dislike_description": "ඒක බලන්න ඕන දෙයක් නෙවෙයි",
+ "report.reasons.legal": "එය නීති විරෝධීයි.",
+ "report.reasons.legal_description": "එය ඔබගේ හෝ සේවාදායකයාගේ රටේ නීතිය උල්ලංඝනය කරන බව ඔබ විශ්වාස කරයි නම්",
"report.reasons.other": "එය වෙනත් දෙයක්",
"report.reasons.other_description": "ගැටළුව වෙනත් වර්ග වලට නොගැලපේ",
"report.reasons.spam": "එය අයාචිතයි",
@@ -362,17 +783,26 @@
"report.unfollow": "@{name}අනුගමනය නොකරන්න",
"report.unfollow_explanation": "ඔබ මෙම ගිණුම අනුගමනය කරයි. ඔබගේ මුල් පිටුවේ ඔවුන්ගේ ලිපි නොදැකීමට, ඔවුන්ව තවදුරටත් අනුගමනය නොකරන්න.",
"report_notification.attached_statuses": "{count, plural, one {ලිපි {count}} other {ලිපි {count} ක්}} අමුණා ඇත",
+ "report_notification.categories.legal": "නීතිමය",
+ "report_notification.categories.legal_sentence": "නීති විරෝධී අන්තර්ගතය",
"report_notification.categories.other": "වෙනත්",
+ "report_notification.categories.other_sentence": "වෙනත්",
"report_notification.categories.spam": "ආයාචිත",
+ "report_notification.categories.spam_sentence": "ආයාචිත තැපැල්",
"report_notification.categories.violation": "නීතිය කඩ කිරීම",
+ "report_notification.categories.violation_sentence": "නීති උල්ලංඝනය",
"report_notification.open": "විවෘත වාර්තාව",
"search.no_recent_searches": "මෑත සෙවීම් නැත",
"search.placeholder": "සොයන්න",
"search.quick_action.account_search": "ගැළපෙන පැතිකඩ {x}",
"search.quick_action.go_to_account": "{x} පැතිකඩ වෙත යන්න",
+ "search.quick_action.go_to_hashtag": "{x}හැෂ් ටැගය වෙත යන්න",
"search.quick_action.open_url": "ලිපිනය මාස්ටඩන්හි අරින්න",
"search.quick_action.status_search": "ගැළපෙන ලිපි {x}",
"search.search_or_paste": "සොයන්න හෝ ඒ.ස.නි. අලවන්න",
+ "search_popout.full_text_search_disabled_message": "{domain}හි නොමැත.",
+ "search_popout.full_text_search_logged_out_message": "පුරනය වූ විට පමණක් ලබා ගත හැක.",
+ "search_popout.language_code": "ISO භාෂා කේතය",
"search_popout.options": "සෙවුම් විකල්ප",
"search_popout.quick_actions": "ඉක්මන් ක්රියාමාර්ග",
"search_popout.recent": "මෑත සෙවීම්",
@@ -380,23 +810,47 @@
"search_popout.user": "පරිශ්රීලකයා",
"search_results.accounts": "පැතිකඩ",
"search_results.all": "සියල්ල",
+ "search_results.hashtags": "හැෂ් ටැග්",
+ "search_results.no_results": "ප්රති results ල නැහැ.",
+ "search_results.no_search_yet": "සටහන්, පැතිකඩ හෝ හැෂ් ටැග් සෙවීමට උත්සාහ කරන්න.",
"search_results.see_all": "සියල්ල බලන්න",
"search_results.statuses": "ලිපි",
+ "search_results.title": "\"{q}\" සඳහා සොයන්න",
+ "server_banner.about_active_users": "පසුගිය දින 30 තුළ මෙම සේවාදායකය භාවිතා කළ පුද්ගලයින් (මාසික ක්රියාකාරී පරිශීලකයින්)",
"server_banner.active_users": "සක්රිය පරිශ්රීලකයින්",
+ "server_banner.administered_by": "පරිපාලනය කරනු ලබන්නේ:",
+ "server_banner.is_one_of_many": "{domain} යනු ඔබට fediverse එකට සහභාගී වීමට භාවිතා කළ හැකි බොහෝ ස්වාධීන Mastodon සේවාදායකයන්ගෙන් එකකි.",
+ "server_banner.server_stats": "සේවාදායක සංඛ්යාලේඛන:",
"sign_in_banner.create_account": "ගිණුමක් සාදන්න",
+ "sign_in_banner.follow_anyone": "ෆෙඩිවර්ස් හරහා ඕනෑම අයෙකු අනුගමනය කර ඒ සියල්ල කාලානුක්රමික අනුපිළිවෙලින් බලන්න. ඇල්ගොරිතම, දැන්වීම් හෝ ක්ලික්බයිට් කිසිවක් පෙනෙන්නට නැත.",
+ "sign_in_banner.mastodon_is": "සිදුවන දේ පිළිබඳව දැනුවත් වීමට හොඳම ක්රමය මැස්ටෝඩන් ය.",
"sign_in_banner.sign_in": "පිවිසෙන්න",
+ "sign_in_banner.sso_redirect": "පුරනය වන්න හෝ ලියාපදිංචි වන්න",
+ "status.admin_account": "@{name}සඳහා මධ්යස්ථකරණ අතුරුමුහුණත විවෘත කරන්න",
+ "status.admin_domain": "{domain}සඳහා මධ්යස්ථකරණ අතුරුමුහුණත විවෘත කරන්න",
"status.admin_status": "මෙම ලිපිය මැදිහත්කරණ අතුරුමුහුණතෙහි අරින්න",
"status.block": "@{name} අවහිර",
"status.bookmark": "පොත්යොමුවක්",
+ "status.cancel_reblog_private": "බූස්ට් ඉවත් කරන්න",
+ "status.cannot_reblog": "මෙම පළ කිරීම වැඩි කළ නොහැක.",
+ "status.continued_thread": "අඛණ්ඩ නූල",
"status.copy": "ලිපියට සබැඳියේ පිටපතක්",
"status.delete": "මකන්න",
"status.detailed_status": "විස්තරාත්මක සංවාද දැක්ම",
+ "status.direct": "පෞද්ගලිකව @{name}සඳහන් කරන්න",
+ "status.direct_indicator": "පුද්ගලික සඳහන",
"status.edit": "සංස්කරණය",
+ "status.edited": "අවසන් වරට සංස්කරණය කරන ලද්දේ {date}",
"status.edited_x_times": "සංශෝධිතයි {count, plural, one {වාර {count}} other {වාර {count}}}",
+ "status.embed": "කාවැද්දූ කේතය ලබා ගන්න",
+ "status.favourite": "ප්රියතම",
+ "status.favourites": "{count, plural, one {ප්රියතම} other {ප්රියතම}}",
"status.filter": "මෙම ලිපිය පෙරන්න",
"status.history.created": "{name} නිර්මාණය {date}",
"status.history.edited": "{name} සංස්කරණය {date}",
"status.load_more": "තව පූරණය",
+ "status.media.open": "විවෘත කිරීමට ක්ලික් කරන්න",
+ "status.media.show": "පෙන්වීමට ක්ලික් කරන්න",
"status.media_hidden": "මාධ්ය සඟවා ඇත",
"status.mention": "@{name} සඳහන් කරන්ක",
"status.more": "තව",
@@ -404,9 +858,17 @@
"status.mute_conversation": "සංවාදය නිහඬව",
"status.open": "මෙම ලිපිය විහිදන්න",
"status.pin": "පැතිකඩට අමුණන්න",
- "status.pinned": "ඇමිණූ ලිපියකි",
"status.read_more": "තව කියවන්න",
+ "status.reblog": "බූස්ට් කරන්න",
+ "status.reblog_private": "මුල් දෘශ්යතාව සමඟ වැඩි කරන්න",
+ "status.reblogged_by": "{name} වැඩි කරන ලදී",
+ "status.reblogs": "{count, plural, one {බූස්ට්} other {බූස්ට්}}",
+ "status.reblogs.empty": "මෙම සටහන තවම කිසිවෙකු බූස්ට් කර නැත. යමෙකු එසේ කළ විට, ඔවුන් මෙහි පෙන්වනු ඇත.",
+ "status.redraft": "& නැවත කෙටුම්පත මකන්න",
"status.remove_bookmark": "පොත්යොමුව ඉවතලන්න",
+ "status.remove_favourite": "ප්රියතමයන්ගෙන් ඉවත් කරන්න",
+ "status.replied_in_thread": "නූලෙහි පිළිතුරු දෙන ලදී",
+ "status.replied_to": "{name}ට පිළිතුරු දුන්නා",
"status.reply": "පිළිතුරු",
"status.replyAll": "නූලට පිළිතුරු දෙන්න",
"status.report": "@{name} වාර්තා කරන්න",
@@ -414,18 +876,27 @@
"status.share": "බෙදාගන්න",
"status.show_less_all": "සියල්ල අඩුවෙන් පෙන්වන්න",
"status.show_more_all": "සියල්ල වැඩියෙන් පෙන්වන්න",
+ "status.show_original": "මුල් පිටපත පෙන්වන්න",
+ "status.title.with_attachments": "{user} පළ කරන ලදී {attachmentCount, plural, one {ඇමුණුමක්} other {{attachmentCount} ඇමුණුම්}}",
"status.translate": "පරිවර්තනය",
"status.translated_from_with": "{provider} මගින් {lang} භාෂාවෙන් පරිවර්තනය කර ඇත",
"status.uncached_media_warning": "පෙරදසුන නැත",
"status.unmute_conversation": "සංවාදය නොනිහඬ",
"status.unpin": "පැතිකඩෙන් ගළවන්න",
+ "subscribed_languages.lead": "වෙනස් කිරීමෙන් පසු තෝරාගත් භාෂාවලින් පළ කිරීම් පමණක් ඔබගේ මුල් පිටුවේ සහ ලැයිස්තු කාලරේඛාවල දිස්වනු ඇත. සියලුම භාෂාවලින් පළ කිරීම් ලැබීමට කිසිවක් තෝරන්න.",
"subscribed_languages.save": "වෙනස්කම් සුරකින්න",
+ "subscribed_languages.target": "{target}සඳහා දායක වූ භාෂා වෙනස් කරන්න.",
"tabs_bar.home": "මුල් පිටුව",
"tabs_bar.notifications": "දැනුම්දීම්",
+ "terms_of_service.effective_as_of": "{date}සිට ක්රියාත්මක වේ",
+ "terms_of_service.title": "සේවා කොන්දේසි",
+ "terms_of_service.upcoming_changes_on": "{date}දින ඉදිරියේදී සිදුවන වෙනස්කම්",
"time_remaining.days": "{number, plural, one {දවස් #} other {දවස් #}} ක් ඉතිරිය",
"time_remaining.hours": "{number, plural, one {පැය #} other {පැය #}} ක් ඉතිරිය",
"time_remaining.minutes": "{number, plural, one {විනාඩි #} other {විනාඩි #}} ක් ඉතිරිය",
+ "time_remaining.moments": "ඉතිරිව ඇති මොහොත",
"time_remaining.seconds": "{number, plural, one {තත්පර #} other {තත්පර #}} ක් ඉතිරිය",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} පුද්ගලයා} other {{counter} අතීතයේ පුද්ගලයින්}} දින {days, plural, one {දින} other {{days} දින}}",
"trends.trending_now": "දැන් නැගී එන",
"ui.beforeunload": "ඔබ මාස්ටඩන් හැර ගියහොත් කටුපිටපත අහිමි වේ.",
"units.short.billion": "{count}බී",
@@ -435,6 +906,11 @@
"upload_button.label": "රූප, දෘශ්යක හෝ හඬපට අමුණන්න",
"upload_error.limit": "සීමාව ඉක්මවා ඇත.",
"upload_error.poll": "මත විමසුම් සමඟ ගොනු යෙදීමට ඉඩ නොදේ.",
+ "upload_form.drag_and_drop.instructions": "මාධ්ය ඇමුණුමක් ලබා ගැනීමට, space හෝ enter ඔබන්න. ඇදගෙන යන අතරතුර, ඊතල යතුරු භාවිතා කර මාධ්ය ඇමුණුම ඕනෑම දිශාවකට ගෙන යන්න. මාධ්ය ඇමුණුම එහි නව ස්ථානයට දැමීමට space හෝ enter ඔබන්න, නැතහොත් අවලංගු කිරීමට escape ඔබන්න.",
+ "upload_form.drag_and_drop.on_drag_cancel": "ඇදගෙන යාම අවලංගු කරන ලදී. මාධ්ය ඇමුණුම {item} ඉවත් කරන ලදී.",
+ "upload_form.drag_and_drop.on_drag_end": "මාධ්ය ඇමුණුම {item} ඉවත් කරන ලදී.",
+ "upload_form.drag_and_drop.on_drag_over": "මාධ්ය ඇමුණුම {item} ගෙන යන ලදී.",
+ "upload_form.drag_and_drop.on_drag_start": "මාධ්ය ඇමුණුම {item}ලබා ගත්තා.",
"upload_form.edit": "සංස්කරණය",
"upload_progress.label": "උඩුගත වෙමින්...",
"upload_progress.processing": "සැකසෙමින්…",
@@ -445,6 +921,12 @@
"video.expand": "දෘශ්යකය විහිදන්න",
"video.fullscreen": "පූර්ණ තිරය",
"video.hide": "දෘශ්යකය සඟවන්න",
+ "video.mute": "නිහඬ කරන්න",
"video.pause": "විරාමය",
- "video.play": "ධාවනය"
+ "video.play": "ධාවනය",
+ "video.skip_backward": "පසුපසට මඟ හරින්න",
+ "video.skip_forward": "ඉදිරියට මඟ හරින්න",
+ "video.unmute": "නිහඬ නොකරන්න",
+ "video.volume_down": "ශබ්දය අඩු කරන්න",
+ "video.volume_up": "ශබ්දය වැඩි කරන්න"
}
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 6cbf799328..d69be9ed9c 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -8,6 +8,7 @@
"about.domain_blocks.silenced.title": "Obmedzený",
"about.domain_blocks.suspended.explanation": "Žiadne údaje z tohto servera nebudú spracovávané, ukladané ani vymieňané, čo znemožní akúkoľvek interakciu alebo komunikáciu s používateľmi z tohto servera.",
"about.domain_blocks.suspended.title": "Vylúčený",
+ "about.language_label": "Jazyk",
"about.not_available": "Tieto informácie neboli sprístupnené na tomto serveri.",
"about.powered_by": "Decentralizovaná sociálna sieť na základe technológie {mastodon}",
"about.rules": "Pravidlá servera",
@@ -23,11 +24,11 @@
"account.copy": "Skopírovať odkaz na profil",
"account.direct": "Súkromne označiť @{name}",
"account.disable_notifications": "Zrušiť upozornenia na príspevky od @{name}",
- "account.domain_blocked": "Doména blokovaná",
"account.edit_profile": "Upraviť profil",
"account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}",
"account.endorse": "Zobraziť na vlastnom profile",
- "account.featured.posts": "Príspevky",
+ "account.featured.accounts": "Profily",
+ "account.featured.hashtags": "Hashtagy",
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
"account.featured_tags.last_status_never": "Žiadne príspevky",
"account.follow": "Sledovať",
@@ -38,6 +39,7 @@
"account.following": "Sledovaný účet",
"account.following_counter": "{count, plural, one {{counter} sledovaných} other {{counter} sledovaných}}",
"account.follows.empty": "Tento účet ešte nikoho nesleduje.",
+ "account.follows_you": "Nasleduje ťa",
"account.go_to_profile": "Prejsť na profil",
"account.hide_reblogs": "Skryť zdieľania od @{name}",
"account.in_memoriam": "In memoriam.",
@@ -52,7 +54,7 @@
"account.mute_notifications_short": "Stíšiť upozornenia",
"account.mute_short": "Stíšiť",
"account.muted": "Účet stíšený",
- "account.mutual": "Spoločné",
+ "account.mutual": "Nasledujete sa navzájom",
"account.no_bio": "Nie je uvedený žiadny popis.",
"account.open_original_page": "Otvoriť pôvodnú stránku",
"account.posts": "Príspevky",
@@ -211,6 +213,7 @@
"confirmations.redraft.confirm": "Vymazať a prepísať",
"confirmations.redraft.message": "Určite chcete tento príspevok vymazať a prepísať? Prídete o jeho zdieľania a ohviezdičkovania a odpovede na pôvodný príspevok budú odlúčené.",
"confirmations.redraft.title": "Vymazať a prepísať príspevok?",
+ "confirmations.remove_from_followers.confirm": "Odstrániť nasledovateľa",
"confirmations.reply.confirm": "Odpovedať",
"confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?",
"confirmations.reply.title": "Prepísať príspevok?",
@@ -264,7 +267,6 @@
"emoji_button.search_results": "Výsledky hľadania",
"emoji_button.symbols": "Symboly",
"emoji_button.travel": "Cestovanie a miesta",
- "empty_column.account_featured": "Tento zoznam je prázdny",
"empty_column.account_hides_collections": "Tento účet sa rozhodol túto informáciu nesprístupniť",
"empty_column.account_suspended": "Účet bol pozastavený",
"empty_column.account_timeline": "Nie sú tu žiadne príspevky.",
@@ -462,7 +464,6 @@
"lists.exclusive": "Skryť členov na Domovskej osi",
"lists.exclusive_hint": "Ak je niekto na tomto zozname, skry ich na tvojej Domácej osi, aby si ich príspevky nevidel/a dvakrát.",
"lists.find_users_to_add": "Nájdi užívateľov na pridanie",
- "lists.list_members": "Členovia zoznamu",
"lists.list_name": "Názov zoznamu",
"lists.new_list_name": "Názov nového zoznamu",
"lists.no_lists_yet": "Ešte žiadne zoznamy.",
@@ -774,7 +775,6 @@
"status.mute_conversation": "Stíšiť konverzáciu",
"status.open": "Rozbaliť príspevok",
"status.pin": "Pripnúť na profil",
- "status.pinned": "Pripnutý príspevok",
"status.read_more": "Čítaj ďalej",
"status.reblog": "Zdieľať",
"status.reblog_private": "Zdieľať pôvodnému publiku",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index eef20456de..4b67bb1727 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -23,7 +23,6 @@
"account.copy": "Kopiraj povezavo do profila",
"account.direct": "Zasebno omeni @{name}",
"account.disable_notifications": "Ne obveščaj me več, ko ima @{name} novo objavo",
- "account.domain_blocked": "Blokirana domena",
"account.edit_profile": "Uredi profil",
"account.enable_notifications": "Obvesti me, ko ima @{name} novo objavo",
"account.endorse": "Izpostavi v profilu",
@@ -51,7 +50,6 @@
"account.mute_notifications_short": "Utišaj obvestila",
"account.mute_short": "Utišaj",
"account.muted": "Utišan",
- "account.mutual": "Vzajemno",
"account.no_bio": "Ni opisa.",
"account.open_original_page": "Odpri izvirno stran",
"account.posts": "Objave",
@@ -494,7 +492,6 @@
"lists.exclusive": "Skrij člane v domovanju",
"lists.exclusive_hint": "Objave vseh, ki so na tem seznamu, se ne pokažejo v vašem domačem viru. Tako se izognete podvojenim objavam.",
"lists.find_users_to_add": "Poišči člane za dodajanje",
- "lists.list_members": "Člani seznama",
"lists.list_members_count": "{count, plural, one {# član} two {# člana} few {# člani} other {# članov}}",
"lists.list_name": "Ime seznama",
"lists.new_list_name": "Novo ime seznama",
@@ -840,7 +837,6 @@
"status.mute_conversation": "Utišaj pogovor",
"status.open": "Razširi to objavo",
"status.pin": "Pripni na profil",
- "status.pinned": "Pripeta objava",
"status.read_more": "Preberi več",
"status.reblog": "Izpostavi",
"status.reblog_private": "Izpostavi z izvirno vidljivostjo",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index a42a25b374..92cca9e41d 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Shërbyes të moderuar",
"about.contact": "Kontakt:",
+ "about.default_locale": "Parazgjedhje",
"about.disclaimer": "Mastodon-i është software i lirë, me burim të hapët dhe shenjë tregtare e Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "S’ka arsye",
"about.domain_blocks.preamble": "Mastodon-i ju lë përgjithësisht të shihni lëndë prej përdoruesish dhe të ndërveproni me ta nga cilido shërbyes tjetër qofshin në fedivers. Ka përjashtime që janë bërë në këtë shërbyes të dhënë.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "E kufizuar",
"about.domain_blocks.suspended.explanation": "S’do të përpunohen, depozitohen apo shkëmbehen të dhëna të këtij shërbyesi, duke e bërë të pamundur çfarëdo ndërveprimi apo komunikimi me përdorues nga ky shërbyes.",
"about.domain_blocks.suspended.title": "E pezulluar",
+ "about.language_label": "Gjuhë",
"about.not_available": "Ky informacion, në këtë shërbyes, nuk jepet.",
"about.powered_by": "Media shoqërore e decentralizuar, bazuar në {mastodon}",
"about.rules": "Rregulla shërbyesi",
@@ -19,17 +21,21 @@
"account.block_domain": "Blloko përkatësinë {domain}",
"account.block_short": "Bllokoje",
"account.blocked": "E bllokuar",
+ "account.blocking": "Bllokim",
"account.cancel_follow_request": "Tërhiq mbrapsht kërkesë për ndjekje",
"account.copy": "Kopjoje lidhjen te profili",
"account.direct": "Përmendje private për @{name}",
"account.disable_notifications": "Resht së njoftuari mua, kur poston @{name}",
- "account.domain_blocked": "Përkatësia u bllokua",
+ "account.domain_blocking": "Bllokim përkatësie",
"account.edit_profile": "Përpunoni profilin",
"account.enable_notifications": "Njoftomë, kur poston @{name}",
"account.endorse": "Pasqyrojeni në profil",
+ "account.familiar_followers_many": "Ndjekur nga {name1}, {name2} dhe {othersCount, plural, one {një tjetër që njihni} other {# të tjerë që njihni}}",
+ "account.familiar_followers_one": "Ndjekur nga {name1}",
+ "account.familiar_followers_two": "Ndjekur nga {name1} dhe {name2}",
"account.featured": "Të zgjedhur",
+ "account.featured.accounts": "Profile",
"account.featured.hashtags": "Hashtag-ë",
- "account.featured.posts": "Postime",
"account.featured_tags.last_status_at": "Postimi i fundit më {date}",
"account.featured_tags.last_status_never": "Pa postime",
"account.follow": "Ndiqeni",
@@ -37,9 +43,11 @@
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende s’e ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} ndjekës} other {{counter} ndjekës}}",
+ "account.followers_you_know_counter": "{counter} që njihni",
"account.following": "Ndjekje",
"account.following_counter": "{count, plural, one {{counter} i ndjekur} other {{counter} të ndjekur}}",
"account.follows.empty": "Ky përdorues ende s’ndjek kënd.",
+ "account.follows_you": "Ju ndjek",
"account.go_to_profile": "Kalo te profili",
"account.hide_reblogs": "Fshih përforcime nga @{name}",
"account.in_memoriam": "In Memoriam.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Mos shfaq njoftime",
"account.mute_short": "Mos i shfaq",
"account.muted": "Heshtuar",
- "account.mutual": "Reciproke",
+ "account.muting": "Heshtim",
+ "account.mutual": "Ndiqni njëri-tjetrin",
"account.no_bio": "S’u dha përshkrim.",
"account.open_original_page": "Hap faqen origjinale",
"account.posts": "Mesazhe",
"account.posts_with_replies": "Mesazhe dhe përgjigje",
+ "account.remove_from_followers": "Hiqe {name} nga ndjekësit",
"account.report": "Raportojeni @{name}",
"account.requested": "Në pritje të miratimit. Që të anuloni kërkesën për ndjekje, klikojeni",
"account.requested_follow": "{name} ka kërkuar t’ju ndjekë",
+ "account.requests_to_follow_you": "Kërkesa për t’ju ndjekur",
"account.share": "Ndajeni profilin e @{name} me të tjerët",
"account.show_reblogs": "Shfaq përforcime nga @{name}",
"account.statuses_counter": "{count, plural, one {{counter} postim} other {{counter} postime}}",
@@ -224,6 +235,9 @@
"confirmations.redraft.confirm": "Fshijeni & rihartojeni",
"confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Të parapëlqyerit dhe përforcimet do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.",
"confirmations.redraft.title": "Të fshihet & riharothet postimi?",
+ "confirmations.remove_from_followers.confirm": "Hiqe ndjekësin",
+ "confirmations.remove_from_followers.message": "{name} do të reshtë së ndjekuri ju. Jeni i sigurt se doni të vazhdohet?",
+ "confirmations.remove_from_followers.title": "Të hiqet ndjekësi?",
"confirmations.reply.confirm": "Përgjigjuni",
"confirmations.reply.message": "Po të përgjigjeni tani, mesazhi që po hartoni, do të mbishkruhet. Jeni i sigurt se doni të vazhdohet më tej?",
"confirmations.reply.title": "Të mbishkruhet postimi?",
@@ -291,7 +305,9 @@
"emoji_button.search_results": "Përfundime kërkimi",
"emoji_button.symbols": "Simbole",
"emoji_button.travel": "Udhëtime & Vende",
- "empty_column.account_featured": "Kjo listë është e zbrazët",
+ "empty_column.account_featured.me": "S’keni ende të zgjedhur diçka. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?",
+ "empty_column.account_featured.other": "{acct} s’ka të zgjedhur ende ndonjë gjë. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?",
+ "empty_column.account_featured_other.unknown": "Kjo llogari s’ka ende gjë të zgjedhur.",
"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_timeline": "S’ka mesazhe këtu!",
@@ -324,6 +340,11 @@
"explore.trending_links": "Lajme",
"explore.trending_statuses": "Postime",
"explore.trending_tags": "Hashtagë",
+ "featured_carousel.header": "{count, plural, one {Postim i Fiksuar} other {Postime të Fiksuar}}",
+ "featured_carousel.next": "Pasuesi",
+ "featured_carousel.post": "Postim",
+ "featured_carousel.previous": "I mëparshmi",
+ "featured_carousel.slide": "{index} nga {total}",
"filter_modal.added.context_mismatch_explanation": "Kjo kategori filtrash nuk aplikohet për kontekstin nën të cilin po merreni me këtë postim. Nëse doni që postimi të filtrohet edhe në këtë kontekst, do t’ju duhet të përpunoni filtrin.",
"filter_modal.added.context_mismatch_title": "Mospërputhje kontekstesh!",
"filter_modal.added.expired_explanation": "Kjo kategori filtrash ka skaduar, do t’ju duhet të ndryshoni datën e skadimit për të, pa të aplikohet.",
@@ -390,8 +411,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} pjesëmarrës} other {{counter} pjesëmarrës}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} postim} other {{counter} postime}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postim} other {{counter} postime}} sot",
+ "hashtag.feature": "Pasqyrojeni në profil",
"hashtag.follow": "Ndiqe hashtag-un",
"hashtag.mute": "Heshtoje #{hashtag}",
+ "hashtag.unfeature": "Mos e përfshi në profil",
"hashtag.unfollow": "Hiqe ndjekjen e hashtag-ut",
"hashtags.and_other": "…dhe {count, plural, one {}other {# më tepër}}",
"hints.profiles.followers_may_be_missing": "Mund të mungojnë ndjekës për këtë profil.",
@@ -402,6 +425,7 @@
"hints.profiles.see_more_posts": "Shihni më tepër postime në {domain}",
"hints.threads.replies_may_be_missing": "Mund të mungojnë përgjigje nga shërbyes të tjerë.",
"hints.threads.see_more": "Shihni më tepër përgjigje në {domain}",
+ "home.column_settings.show_quotes": "Shfaq thonjëza",
"home.column_settings.show_reblogs": "Shfaq përforcime",
"home.column_settings.show_replies": "Shfaq përgjigje",
"home.hide_announcements": "Fshihi lajmërimet",
@@ -497,7 +521,6 @@
"lists.exclusive": "Fshihni anëtarët në Krye",
"lists.exclusive_hint": "Nëse dikush gjendje në këtë listë, fshihini ata te prurja juaj e Kreut, që të shmangni parjen dy herë të postimeve të tyre.",
"lists.find_users_to_add": "Gjeni përdorues për t’i shtuar",
- "lists.list_members": "Shfaq anëtarë",
"lists.list_members_count": "{count, plural, one {# anëtar} other {# anëtarë}}",
"lists.list_name": "Emër liste",
"lists.new_list_name": "Emër liste të re",
@@ -843,7 +866,13 @@
"status.mute_conversation": "Heshtoje bisedën",
"status.open": "Zgjeroje këtë mesazh",
"status.pin": "Fiksoje në profil",
- "status.pinned": "Mesazh i fiksuar",
+ "status.quote_error.filtered": "Fshehur për shkak të njërit nga filtrat tuaj",
+ "status.quote_error.not_found": "Ky postim s’mund të shfaqet.",
+ "status.quote_error.pending_approval": "Ky postim është në pritje të miratimit nga autori origjinal.",
+ "status.quote_error.rejected": "Ky postim s’mund të shfaqet, ngaqë autori origjinal nuk lejon citim të tij.",
+ "status.quote_error.removed": "Ky postim u hoq nga autori i tij.",
+ "status.quote_error.unauthorized": "Ky postim s’mund të shfaqet, ngaqë s’jeni i autorizuar ta shihni.",
+ "status.quote_post_author": "Postim nga {name}",
"status.read_more": "Lexoni më tepër",
"status.reblog": "Përforcojeni",
"status.reblog_private": "Përforcim për publikun origjinal",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 2d00533e0e..6346afb6c6 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -22,7 +22,6 @@
"account.copy": "Kopiraj vezu u profil",
"account.direct": "Privatno pomeni @{name}",
"account.disable_notifications": "Zaustavi obaveštavanje za objave korisnika @{name}",
- "account.domain_blocked": "Domen je blokiran",
"account.edit_profile": "Uredi profil",
"account.enable_notifications": "Obavesti me kada @{name} objavi",
"account.endorse": "Istakni na profilu",
@@ -50,7 +49,6 @@
"account.mute_notifications_short": "Isključi obaveštenja",
"account.mute_short": "Isključi",
"account.muted": "Ignorisan",
- "account.mutual": "Zajednički",
"account.no_bio": "Nema opisa.",
"account.open_original_page": "Otvori originalnu stranicu",
"account.posts": "Objave",
@@ -658,7 +656,6 @@
"status.mute_conversation": "Ignoriši razgovor",
"status.open": "Proširi ovu objavu",
"status.pin": "Zakači na profil",
- "status.pinned": "Zakačene objave",
"status.read_more": "Pročitajte više",
"status.reblog": "Podrži",
"status.reblog_private": "Podrži sa originalnom vidljivošću",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index af323bed27..1ac43aa3a1 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -22,7 +22,6 @@
"account.copy": "Копирај везу у профил",
"account.direct": "Приватно помени @{name}",
"account.disable_notifications": "Заустави обавештавање за објаве корисника @{name}",
- "account.domain_blocked": "Домен је блокиран",
"account.edit_profile": "Уреди профил",
"account.enable_notifications": "Обавести ме када @{name} објави",
"account.endorse": "Истакни на профилу",
@@ -50,7 +49,6 @@
"account.mute_notifications_short": "Искључи обавештења",
"account.mute_short": "Искључи",
"account.muted": "Игнорисан",
- "account.mutual": "Заједнички",
"account.no_bio": "Нема описа.",
"account.open_original_page": "Отвори оригиналну страницу",
"account.posts": "Објаве",
@@ -658,7 +656,6 @@
"status.mute_conversation": "Игнориши разговор",
"status.open": "Прошири ову објаву",
"status.pin": "Закачи на профил",
- "status.pinned": "Закачене објаве",
"status.read_more": "Прочитајте више",
"status.reblog": "Подржи",
"status.reblog_private": "Подржи са оригиналном видљивошћу",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index c23a645135..5a8d1a693c 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Modererade servrar",
"about.contact": "Kontakt:",
+ "about.default_locale": "Standard",
"about.disclaimer": "Mastodon är fri programvara med öppen källkod och ett varumärke tillhörande Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Okänd orsak",
"about.domain_blocks.preamble": "Som regel låter Mastodon dig interagera med användare från andra servrar i fediversumet och se deras innehåll. Detta är de undantag som gjorts på just denna server.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Begränsat",
"about.domain_blocks.suspended.explanation": "Inga data från denna server kommer behandlas, lagras eller bytas ut, vilket omöjliggör kommunikation med användare på denna server.",
"about.domain_blocks.suspended.title": "Avstängd",
+ "about.language_label": "Språk",
"about.not_available": "Denna information har inte gjorts tillgänglig på denna server.",
"about.powered_by": "En decentraliserad plattform for sociala medier, drivet av {mastodon}",
"about.rules": "Serverregler",
@@ -19,14 +21,21 @@
"account.block_domain": "Blockera domänen {domain}",
"account.block_short": "Blockera",
"account.blocked": "Blockerad",
+ "account.blocking": "Blockerar",
"account.cancel_follow_request": "Återkalla din begäran om att få följa",
"account.copy": "Kopiera länk till profil",
"account.direct": "Nämn @{name} privat",
"account.disable_notifications": "Sluta meddela mig när @{name} skriver ett inlägg",
- "account.domain_blocked": "Domän blockerad",
+ "account.domain_blocking": "Blockerad domän",
"account.edit_profile": "Redigera profil",
"account.enable_notifications": "Notifiera mig när @{name} gör inlägg",
"account.endorse": "Visa på profil",
+ "account.familiar_followers_many": "Följs av {name1},{name2} och {othersCount, plural, one {en till du känner} other {# andra du känner}}",
+ "account.familiar_followers_one": "Följs av {name1}",
+ "account.familiar_followers_two": "Följs av {name1} och {name2}",
+ "account.featured": "Utvalda",
+ "account.featured.accounts": "Profiler",
+ "account.featured.hashtags": "Fyrkantstaggar",
"account.featured_tags.last_status_at": "Senaste inlägg den {date}",
"account.featured_tags.last_status_never": "Inga inlägg",
"account.follow": "Följ",
@@ -34,9 +43,11 @@
"account.followers": "Följare",
"account.followers.empty": "Ingen följer denna användare än.",
"account.followers_counter": "{count, plural, one {{counter} följare} other {{counter} följare}}",
+ "account.followers_you_know_counter": "{counter} du känner",
"account.following": "Följer",
"account.following_counter": "{count, plural, one {{counter} följer} other {{counter} följer}}",
"account.follows.empty": "Denna användare följer inte någon än.",
+ "account.follows_you": "Följer dig",
"account.go_to_profile": "Gå till profilen",
"account.hide_reblogs": "Dölj boostar från @{name}",
"account.in_memoriam": "Till minne av.",
@@ -51,14 +62,17 @@
"account.mute_notifications_short": "Stäng av aviseringsljud",
"account.mute_short": "Tysta",
"account.muted": "Tystad",
- "account.mutual": "Ömsesidig",
+ "account.muting": "Stänger av ljud",
+ "account.mutual": "Ni följer varandra",
"account.no_bio": "Ingen beskrivning angiven.",
"account.open_original_page": "Öppna den ursprungliga sidan",
"account.posts": "Inlägg",
"account.posts_with_replies": "Inlägg och svar",
+ "account.remove_from_followers": "Ta bort {name} från följare",
"account.report": "Rapportera @{name}",
"account.requested": "Inväntar godkännande. Klicka för att ta tillbaka din begäran om att få följa",
"account.requested_follow": "{name} har begärt att följa dig",
+ "account.requests_to_follow_you": "Fråga om att följa dig",
"account.share": "Dela @{name}s profil",
"account.show_reblogs": "Visa boostar från @{name}",
"account.statuses_counter": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}",
@@ -93,7 +107,7 @@
"alt_text_modal.describe_for_people_with_hearing_impairments": "Beskriv detta för personer med hörselnedsättning…",
"alt_text_modal.describe_for_people_with_visual_impairments": "Beskriv detta för personer med synnedsättning…",
"alt_text_modal.done": "Klar",
- "announcement.announcement": "Meddelande",
+ "announcement.announcement": "Kungörelse",
"annual_report.summary.archetype.booster": "Häftighetsjägaren",
"annual_report.summary.archetype.lurker": "Smygaren",
"annual_report.summary.archetype.oracle": "Oraklet",
@@ -226,6 +240,9 @@
"confirmations.redraft.confirm": "Radera & gör om",
"confirmations.redraft.message": "Är du säker på att du vill radera detta inlägg och göra om det? Favoritmarkeringar, boostar och svar till det ursprungliga inlägget kommer förlora sitt sammanhang.",
"confirmations.redraft.title": "Ta bort & gör om inlägget?",
+ "confirmations.remove_from_followers.confirm": "Ta bort följare",
+ "confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?",
+ "confirmations.remove_from_followers.title": "Ta bort följare?",
"confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skapa. Är du säker på att du vill fortsätta?",
"confirmations.reply.title": "Skriva över inlägget?",
@@ -293,6 +310,9 @@
"emoji_button.search_results": "Sökresultat",
"emoji_button.symbols": "Symboler",
"emoji_button.travel": "Resor & platser",
+ "empty_column.account_featured.me": "Du har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar du använder mest och även din väns konton på din profil?",
+ "empty_column.account_featured.other": "{acct} har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar som du använder mest och även din väns konton på din profil?",
+ "empty_column.account_featured_other.unknown": "Detta konto har inte presenterat något ännu.",
"empty_column.account_hides_collections": "Användaren har valt att inte göra denna information tillgänglig",
"empty_column.account_suspended": "Kontot är avstängt",
"empty_column.account_timeline": "Inga inlägg här!",
@@ -325,6 +345,11 @@
"explore.trending_links": "Nyheter",
"explore.trending_statuses": "Inlägg",
"explore.trending_tags": "Hashtaggar",
+ "featured_carousel.header": "{count, plural,one {Fäst inlägg} other {Fästa inlägg}}",
+ "featured_carousel.next": "Nästa",
+ "featured_carousel.post": "Inlägg",
+ "featured_carousel.previous": "Föregående",
+ "featured_carousel.slide": "{index} av {total}",
"filter_modal.added.context_mismatch_explanation": "Denna filterkategori gäller inte för det sammanhang där du har tillgång till det här inlägget. Om du vill att inlägget ska filtreras även i detta sammanhang måste du redigera filtret.",
"filter_modal.added.context_mismatch_title": "Misspassning av sammanhang!",
"filter_modal.added.expired_explanation": "Denna filterkategori har utgått, du måste ändra utgångsdatum för att den ska kunna tillämpas.",
@@ -377,6 +402,8 @@
"generic.saved": "Sparad",
"getting_started.heading": "Kom igång",
"hashtag.admin_moderation": "Öppet modereringsgränssnittet för #{name}",
+ "hashtag.browse": "Bläddra bland inlägg i #{hashtag}",
+ "hashtag.browse_from_account": "Bläddra bland inlägg från @{name} i #{hashtag}",
"hashtag.column_header.tag_mode.all": "och {additional}",
"hashtag.column_header.tag_mode.any": "eller {additional}",
"hashtag.column_header.tag_mode.none": "utan {additional}",
@@ -389,7 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deltagare} other {{counter} deltagare}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}} i dag",
+ "hashtag.feature": "Visa på profil",
"hashtag.follow": "Följ hashtagg",
+ "hashtag.mute": "Tysta #{hashtag}",
+ "hashtag.unfeature": "Visa inte på profil",
"hashtag.unfollow": "Avfölj hashtagg",
"hashtags.and_other": "…och {count, plural, one {}other {# mer}}",
"hints.profiles.followers_may_be_missing": "Det kan saknas vissa följare av denna profil.",
@@ -495,7 +525,6 @@
"lists.exclusive": "Dölj medlemmar i Hem flödet",
"lists.exclusive_hint": "Om någon är med på den här listan, göm dem i ditt Hemtidlinje för att undvika att se deras inlägg två gånger.",
"lists.find_users_to_add": "Hitta användare att lägga till",
- "lists.list_members": "Lista medlemmar",
"lists.list_members_count": "{count, plural, one {# medlem} other {# medlemmar}}",
"lists.list_name": "Listnamn",
"lists.new_list_name": "Nytt listnamn",
@@ -841,7 +870,13 @@
"status.mute_conversation": "Tysta konversation",
"status.open": "Utvidga detta inlägg",
"status.pin": "Fäst i profil",
- "status.pinned": "Fästa inlägg",
+ "status.quote_error.filtered": "Dolt på grund av ett av dina filter",
+ "status.quote_error.not_found": "Detta inlägg kan inte boostas.",
+ "status.quote_error.pending_approval": "Det här inlägget väntar på godkännande från originalförfattaren.",
+ "status.quote_error.rejected": "Det här inlägget kan inte visas eftersom originalförfattaren inte tillåter att det citeras.",
+ "status.quote_error.removed": "Detta inlägg har tagits bort av författaren.",
+ "status.quote_error.unauthorized": "Det här inlägget kan inte visas eftersom du inte har behörighet att se det.",
+ "status.quote_post_author": "Inlägg av @{name}",
"status.read_more": "Läs mer",
"status.reblog": "Boosta",
"status.reblog_private": "Boosta med ursprunglig synlighet",
@@ -872,7 +907,9 @@
"subscribed_languages.target": "Ändra språkprenumerationer för {target}",
"tabs_bar.home": "Hem",
"tabs_bar.notifications": "Aviseringar",
+ "terms_of_service.effective_as_of": "Gäller från och med {date}",
"terms_of_service.title": "Användarvillkor",
+ "terms_of_service.upcoming_changes_on": "Kommande ändringar {date}",
"time_remaining.days": "{number, plural, one {# dag} other {# dagar}} kvar",
"time_remaining.hours": "{number, plural, one {# timme} other {# timmar}} kvar",
"time_remaining.minutes": "{number, plural, one {# minut} other {# minuter}} kvar",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index b7b930422c..22e4a8cc7a 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -15,7 +15,6 @@
"account.block": "Zablokuj @{name}",
"account.block_domain": "Zablokuj domena {domain}",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "Domena zablokowanŏ",
"account.media": "Mydia",
"account.mute": "Wycisz @{name}",
"account.posts": "Toots",
@@ -84,7 +83,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 69c0029b7f..ef127ee390 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -13,7 +13,6 @@
"account.blocked": "முடக்கப்பட்டது",
"account.cancel_follow_request": "Withdraw follow request",
"account.disable_notifications": "@{name} பதிவிட்டல் எனக்கு தெரியபடுத்த வேண்டாம்",
- "account.domain_blocked": "மறைக்கப்பட்டத் தளங்கள்",
"account.edit_profile": "சுயவிவரத்தை மாற்று",
"account.enable_notifications": "@{name} பதிவிட்டல் எனக்குத் தெரியப்படுத்தவும்",
"account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து",
@@ -327,7 +326,6 @@
"status.mute_conversation": "ஒலிதடு உரையாடல்",
"status.open": "இந்த நிலையை விரிவாக்கு",
"status.pin": "சுயவிவரத்தில் முள்",
- "status.pinned": "பொருத்தப்பட்டன toot",
"status.read_more": "மேலும் வாசிக்க",
"status.reblog": "மதிப்பை உயர்த்து",
"status.reblog_private": "Boost அசல் பார்வையாளர்களுக்கு",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 1e7548e378..7029e1a20c 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -72,7 +72,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 959c380787..a72268d3ab 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -1,18 +1,20 @@
{
+ "about.domain_blocks.suspended.title": "నిషేధించబడింది",
"account.add_or_remove_from_list": "జాబితాల నుండి చేర్చు లేదా తీసివేయి",
"account.badges.bot": "బాట్",
"account.block": "@{name} ను బ్లాక్ చేయి",
"account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు",
"account.blocked": "బ్లాక్ అయినవి",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది",
"account.edit_profile": "ప్రొఫైల్ని సవరించండి",
"account.endorse": "ప్రొఫైల్లో చూపించు",
+ "account.featured.hashtags": "హ్యాష్ట్యాగ్లు",
"account.follow": "అనుసరించు",
"account.followers": "అనుచరులు",
"account.followers.empty": "ఈ వినియోగదారుడిని ఇంకా ఎవరూ అనుసరించడంలేదు.",
"account.follows.empty": "ఈ వినియోగదారి ఇంకా ఎవరినీ అనుసరించడంలేదు.",
"account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు",
+ "account.joined_short": "చేరారు",
"account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది",
"account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.",
"account.media": "మీడియా",
@@ -227,7 +229,6 @@
"status.mute_conversation": "సంభాషణను మ్యూట్ చెయ్యి",
"status.open": "ఈ స్టేటస్ ను విస్తరించు",
"status.pin": "ప్రొఫైల్లో అతికించు",
- "status.pinned": "అతికించిన టూట్",
"status.read_more": "ఇంకా చదవండి",
"status.reblog": "బూస్ట్",
"status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 429d0db428..d4a9a0b40a 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -23,7 +23,7 @@
"account.copy": "คัดลอกลิงก์ไปยังโปรไฟล์",
"account.direct": "กล่าวถึง @{name} แบบส่วนตัว",
"account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
- "account.domain_blocked": "ปิดกั้นโดเมนอยู่",
+ "account.domain_blocking": "โดเมน",
"account.edit_profile": "แก้ไขโปรไฟล์",
"account.enable_notifications": "แจ้งเตือนฉันเมื่อ @{name} โพสต์",
"account.endorse": "แสดงในโปรไฟล์",
@@ -51,7 +51,6 @@
"account.mute_notifications_short": "ซ่อนการแจ้งเตือน",
"account.mute_short": "ซ่อน",
"account.muted": "ซ่อนอยู่",
- "account.mutual": "คนที่มีร่วมกัน",
"account.no_bio": "ไม่ได้ให้คำอธิบาย",
"account.open_original_page": "เปิดหน้าดั้งเดิม",
"account.posts": "โพสต์",
@@ -487,7 +486,6 @@
"lists.exclusive": "ซ่อนสมาชิกในหน้าแรก",
"lists.exclusive_hint": "หากใครสักคนอยู่ในรายการนี้ ให้ซ่อนเขาในฟีดหน้าแรกของคุณเพื่อหลีกเลี่ยงการเห็นโพสต์ของเขาสองครั้ง",
"lists.find_users_to_add": "ค้นหาผู้ใช้ที่จะเพิ่ม",
- "lists.list_members": "สมาชิกของรายการ",
"lists.list_members_count": "{count, plural, other {# สมาชิก}}",
"lists.list_name": "ชื่อรายการ",
"lists.new_list_name": "ชื่อรายการใหม่",
@@ -831,7 +829,6 @@
"status.mute_conversation": "ซ่อนการสนทนา",
"status.open": "ขยายโพสต์นี้",
"status.pin": "ปักหมุดในโปรไฟล์",
- "status.pinned": "โพสต์ที่ปักหมุด",
"status.read_more": "อ่านเพิ่มเติม",
"status.reblog": "ดัน",
"status.reblog_private": "ดันด้วยการมองเห็นดั้งเดิม",
diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json
index 08ce6fd324..696954eea3 100644
--- a/app/javascript/mastodon/locales/tok.json
+++ b/app/javascript/mastodon/locales/tok.json
@@ -8,6 +8,7 @@
"about.domain_blocks.silenced.title": "ken lukin lili ",
"about.domain_blocks.suspended.explanation": "sona ale pi ma ni li kama pali ala, li kama esun ala, li kama awen ala la sina ken ala toki tawa jan pi ma ni.",
"about.domain_blocks.suspended.title": "weka",
+ "about.language_label": "toki",
"about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.",
"about.powered_by": "lipu kulupu pi jan lawa mute tan {mastodon}",
"about.rules": "lawa kulupu",
@@ -15,43 +16,51 @@
"account.add_or_remove_from_list": "o ante e lipu jan",
"account.badges.bot": "ilo nanpa li lawa e ni",
"account.badges.group": "kulupu",
- "account.block": "o weka e @{name}",
- "account.block_domain": "o weka e ma {domain}",
- "account.block_short": "o weka e jan tawa mi",
- "account.blocked": "jan li weka tawa mi",
+ "account.block": "o len e @{name}",
+ "account.block_domain": "o len e ma {domain}",
+ "account.block_short": "o len",
+ "account.blocked": "jan li len",
+ "account.blocking": "mi len e jan ni",
"account.cancel_follow_request": "o kute ala",
"account.copy": "o pali same e linja pi lipu jan",
"account.direct": "len la o mu e @{name}",
"account.disable_notifications": "@{name} li toki la o mu ala e mi",
- "account.domain_blocked": "sina wile ala lukin e ma ni",
+ "account.domain_blocking": "mi len e ma ni",
"account.edit_profile": "o ante e lipu mi",
"account.enable_notifications": "@{name} li toki la o toki e toki ona tawa mi",
"account.endorse": "lipu jan la o suli e ni",
- "account.featured_tags.last_status_at": "sitelen pini pi jan ni li lon tenpo {date}",
+ "account.familiar_followers_many": "{name1} en {name2} en {othersCount, plural, other {jan ante #}} li kute e jan ni",
+ "account.familiar_followers_one": "{name1} li kute e jan ni",
+ "account.familiar_followers_two": "{name1} en {name2} li kute e jan ni",
+ "account.featured": "suli",
+ "account.featured.accounts": "lipu jan",
+ "account.featured.hashtags": "kulupu lipu",
+ "account.featured_tags.last_status_at": "sitelen pini pi jan ni li tan {date}",
"account.featured_tags.last_status_never": "toki ala li lon",
"account.follow": "o kute",
"account.follow_back": "jan ni li kute e sina. o kute",
"account.followers": "jan kute",
"account.followers.empty": "jan ala li kute e jan ni",
"account.followers_counter": "{count, plural, other {jan {counter} li kute e ona}}",
+ "account.followers_you_know_counter": "jan {counter} pi kute sama",
"account.following": "sina kute e jan ni",
"account.following_counter": "{count, plural, other {ona li kute e jan {counter}}}",
"account.follows.empty": "jan ni li kute e jan ala",
+ "account.follows_you": "ona li kute e sina",
"account.go_to_profile": "o tawa lipu jan",
"account.hide_reblogs": "o lukin ala e pana toki tan @{name}",
"account.in_memoriam": "jan ni li moli. pona o tawa ona.",
- "account.joined_short": "li kama",
+ "account.joined_short": "ona li kama lon tenpo",
"account.languages": "sina wile lukin e sitelen pi toki seme",
"account.link_verified_on": "{date} la mi sona e ni: jan seme li jo e lipu ni",
"account.locked_info": "sina wile kute e jan ni la ona o toki e ken",
"account.media": "sitelen",
- "account.mention": "o toki e jan @{name}",
- "account.moved_to": "lipu jan sin pi jan {name} li ni:",
+ "account.mention": "o mu e jan @{name}",
+ "account.moved_to": "jan ni la lipu sin li ni:",
"account.mute": "o len e @{name}",
"account.mute_notifications_short": "o kute ala e mu tan jan ni",
"account.mute_short": "o kute ala",
"account.muted": "sina kute ala e jan ni",
- "account.mutual": "jan pona sona",
"account.no_bio": "lipu li weka.",
"account.open_original_page": "o open e lipu open",
"account.posts": "toki suli",
@@ -60,11 +69,12 @@
"account.requested": "jan ni o ken e kute sina",
"account.requested_follow": "jan {name} li wile kute e sina",
"account.share": "o pana e lipu jan @{name}",
- "account.show_reblogs": "o lukin e pana toki tan @{name}",
+ "account.show_reblogs": "o lukin e toki sike tan @{name}",
"account.statuses_counter": "{count, plural, other {toki {counter}}}",
- "account.unblock": "o weka ala e jan {name}",
- "account.unblock_domain": "o weka ala e ma {domain}",
- "account.unblock_short": "o pini weka",
+ "account.unblock": "o len ala e jan {name}",
+ "account.unblock_domain": "o len ala e ma {domain}",
+ "account.unblock_domain_short": "o len ala e jan ni",
+ "account.unblock_short": "o len ala",
"account.unendorse": "lipu jan la o suli ala e ni",
"account.unfollow": "o kute ala",
"account.unmute": "o len ala e @{name}",
@@ -74,7 +84,7 @@
"admin.dashboard.daily_retention": "nanpa pi awen jan lon tenpo suno",
"admin.dashboard.monthly_retention": "nanpa pi awen jan lon tenpo mun",
"admin.dashboard.retention.average": "sama",
- "admin.dashboard.retention.cohort": "tenpo mun open",
+ "admin.dashboard.retention.cohort": "kama sijelo la tenpo mun",
"admin.dashboard.retention.cohort_size": "jan sin",
"admin.impact_report.instance_accounts": "ni li pakala li weka e lipu jan ni",
"admin.impact_report.instance_followers": "jan pi ma mi li weka tan jan kute ni",
@@ -84,14 +94,14 @@
"alert.rate_limited.title": "ilo ni li lili e ken sina",
"alert.unexpected.message": "pakala li lon",
"alert.unexpected.title": "pakala a!",
- "alt_text_badge.title": "toki sona sitelen",
+ "alt_text_badge.title": "toki pi sona lukin",
"alt_text_modal.add_alt_text": "o pana e toki pi sona lukin",
- "alt_text_modal.add_text_from_image": "o kama jo e toki sitelen tan sitelen ni",
- "alt_text_modal.cancel": "weka",
+ "alt_text_modal.add_text_from_image": "o pana e nimi tan sitelen ni",
+ "alt_text_modal.cancel": "o weka",
"alt_text_modal.change_thumbnail": "o ante e sitelen lili",
"alt_text_modal.describe_for_people_with_hearing_impairments": "jan li ken ala kute la o pana e toki pi sona kalama…",
"alt_text_modal.describe_for_people_with_visual_impairments": "jan li ken ala lukin la o pana e toki pi sona lukin…",
- "alt_text_modal.done": "pini",
+ "alt_text_modal.done": "o pana",
"announcement.announcement": "toki suli",
"annual_report.summary.archetype.booster": "jan ni li alasa e pona",
"annual_report.summary.archetype.lurker": "jan ni li lukin taso",
@@ -105,6 +115,8 @@
"annual_report.summary.highlighted_post.by_reblogs": "toki pi sike nanpa wan",
"annual_report.summary.highlighted_post.by_replies": "toki li jo e toki kama pi nanpa wan",
"annual_report.summary.highlighted_post.possessive": "tan jan {name}",
+ "annual_report.summary.most_used_app.most_used_app": "ilo pi kepeken suli",
+ "annual_report.summary.most_used_hashtag.most_used_hashtag": "kulupu toki pi kepeken suli",
"annual_report.summary.most_used_hashtag.none": "ala",
"annual_report.summary.new_posts.new_posts": "toki suli sin",
"annual_report.summary.percentile.text": "ni la sina nanpa sewi pi jan ale lon {domain}. ",
@@ -113,17 +125,17 @@
"attachments_list.unprocessed": "(nasin open)",
"audio.hide": "o len e kalama",
"block_modal.remote_users_caveat": "mi pana e wile sina tawa ma {domain}. taso, o sona: ma li ken kepeken nasin len ante la pakala li ken lon. toki pi lukin ale la jan pi ma ala li ken lukin.",
- "block_modal.show_less": "o pana e lili",
- "block_modal.show_more": "o pana e mute",
+ "block_modal.show_less": "o lili e toki",
+ "block_modal.show_more": "o suli e toki",
"block_modal.they_cant_mention": "ona li ken ala toki tawa sina li ken ala kute e sina.",
"block_modal.they_cant_see_posts": "ona li ken ala lukin e toki sina. sina ken ala lukin e toki ona.",
- "block_modal.they_will_know": "ona li sona e ni: sina weka e lukin ona.",
- "block_modal.title": "o weka ala weka e jan",
+ "block_modal.they_will_know": "ona li ken sona e ni: sina len e ona.",
+ "block_modal.title": "o len ala len e jan?",
"block_modal.you_wont_see_mentions": "jan li toki e nimi ona la sina lukin ala e toki ni.",
"boost_modal.combo": "sina ken luka e nena {combo} tawa ni: sina wile ala luka e nena lon tenpo kama",
"boost_modal.reblog": "o wawa ala wawa e toki?",
"boost_modal.undo_reblog": "o weka ala weka e wawa toki?",
- "bundle_column_error.copy_stacktrace": "o awen e sona pakala lon ilo sina",
+ "bundle_column_error.copy_stacktrace": "o jo e sona pakala lon ilo sina",
"bundle_column_error.error.body": "ilo li ken ala pana e lipu ni. ni li ken tan pakala ilo.",
"bundle_column_error.error.title": "pakala a!",
"bundle_column_error.network.body": "mi lukin pana e lipu la, pakala li lon. ken la, pakala li tan ilo nanpa sina. ken la, pakala li tan ilo nanpa suli pi ma kulupu ni.",
@@ -131,7 +143,7 @@
"bundle_column_error.retry": "o alasa sin",
"bundle_column_error.return": "o tawa open",
"bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?",
- "bundle_column_error.routing.title": "pakala nanpa 404",
+ "bundle_column_error.routing.title": "pakala #404",
"bundle_modal_error.close": "o pini",
"bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.",
"bundle_modal_error.retry": "o alasa sin",
@@ -141,13 +153,13 @@
"closed_registrations_modal.preamble": "ilo Masoton li lon ilo wan ala. sina kepeken ma ante la sina ken lukin li ken kute e jan pi ma ni. sina wile la, sina ken pali e ma sin!",
"closed_registrations_modal.title": "sina kama lon kulupu Masoton",
"column.about": "sona",
- "column.blocks": "kulupu pi jan weka",
+ "column.blocks": "jan len",
"column.bookmarks": "awen toki",
"column.community": "linja tenpo pi ma ni",
"column.create_list": "o pali e kulupu",
"column.direct": "mu len",
"column.directory": "o lukin e jan",
- "column.domain_blocks": "ma pi wile ala lukin",
+ "column.domain_blocks": "ma len",
"column.edit_list": "o ante e kulupu",
"column.favourites": "ijo pona",
"column.firehose": "toki pi tenpo ni",
@@ -176,27 +188,27 @@
"compose.published.body": "toki li pana.",
"compose.published.open": "o lukin",
"compose.saved.body": "ilo li awen e ijo pana sina.",
- "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante",
+ "compose_form.direct_message_warning_learn_more": "o kama sona",
"compose_form.encryption_warning": "toki li len ala lon ilo Masoton ꞏ o pana ala e sona suli len lon ilo Masoton",
"compose_form.lock_disclaimer": "lipu sina li open, li {locked} ala. jan ale li ken kama kute e sina, li ken lukin e toki sama ni.",
"compose_form.lock_disclaimer.lock": "pini",
"compose_form.placeholder": "sina wile toki e seme?",
"compose_form.poll.duration": "tenpo pana",
- "compose_form.poll.multiple": "pana mute",
+ "compose_form.poll.multiple": "mute pana",
"compose_form.poll.option_placeholder": "ken nanpa {number}",
- "compose_form.poll.single": "toki pi wan taso",
+ "compose_form.poll.single": "ken pi wan taso",
"compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken",
"compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon",
"compose_form.poll.type": "nasin",
"compose_form.publish": "o toki",
- "compose_form.publish_form": "o open toki sin",
+ "compose_form.publish_form": "o toki sin",
"compose_form.reply": "o toki lon ijo ni",
- "compose_form.save_changes": "o sin e ni",
+ "compose_form.save_changes": "o sin",
"compose_form.spoiler.marked": "o weka e toki pi ijo ike ken",
"compose_form.spoiler.unmarked": "o pali e toki pi ijo ike ken",
"compose_form.spoiler_placeholder": "toki pi ijo ike ken (sina ken ala e ni)",
- "confirmation_modal.cancel": "o weka",
- "confirmations.block.confirm": "o weka",
+ "confirmation_modal.cancel": "ala",
+ "confirmations.block.confirm": "o len",
"confirmations.delete.confirm": "o weka",
"confirmations.delete.message": "sina wile ala wile weka e toki ni?",
"confirmations.delete.title": "o weka ala weka e toki?",
@@ -213,46 +225,57 @@
"confirmations.follow_to_list.title": "sina wile ala wile kute?",
"confirmations.logout.confirm": "o weka",
"confirmations.logout.message": "sina wile ala wile weka",
- "confirmations.logout.title": "o weka?",
- "confirmations.missing_alt_text.confirm": "pana e toki pi sona lukin",
+ "confirmations.logout.title": "o weka ala weka?",
+ "confirmations.missing_alt_text.confirm": "o pana e toki pi sona lukin",
"confirmations.missing_alt_text.message": "toki ni la sitelen li lon. taso toki pi sona lukin li lon ala. toki pi sona lukin li pona tan ni: jan ale li ken sona e toki.",
- "confirmations.missing_alt_text.title": "o pana e toki pi sona lukin",
+ "confirmations.missing_alt_text.secondary": "o pana a",
+ "confirmations.missing_alt_text.title": "o pana ala pana e toki pi sona lukin?",
"confirmations.mute.confirm": "o len",
"confirmations.redraft.confirm": "o weka o pali sin e toki",
"confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.",
"confirmations.redraft.title": "ni li weka li pali sin e toki ni.",
- "confirmations.reply.confirm": "toki lon toki ni",
- "confirmations.reply.message": "sina toki lon toki ni la toki pali sina li weka. sina wile ala wile e ni?",
+ "confirmations.remove_from_followers.confirm": "o kama kute ala e jan",
+ "confirmations.remove_from_followers.message": "{name} li kama kute ala e sina. sina wile ala wile e ni?",
+ "confirmations.remove_from_followers.title": "o kama ala kama kute ala e jan?",
+ "confirmations.reply.confirm": "o weka",
+ "confirmations.reply.message": "sina pana e toki tawa lipu ante la ni li weka e toki sina lon. sina wile ala wile weka e toki ni?",
"confirmations.reply.title": "sina wile ala wile weka e toki lon?",
"confirmations.unfollow.confirm": "o kute ala",
"confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?",
"confirmations.unfollow.title": "sina wile ala wile pini kute?",
"content_warning.hide": "o len",
- "content_warning.show": "o lukin",
+ "content_warning.show": "o lukin a",
"content_warning.show_more": "o lukin",
"conversation.delete": "o weka e toki ni",
"conversation.mark_as_read": "ni o sin ala",
"conversation.open": "o lukin e toki",
"conversation.with": "lon {names}",
- "copy_icon_button.copied": "toki li awen lon ilo sina",
+ "copy_icon_button.copied": "sina jo e toki",
"copypaste.copied": "sina jo e toki",
- "copypaste.copy_to_clipboard": "o awen lon ilo sina",
+ "copypaste.copy_to_clipboard": "o jo e toki",
"directory.federated": "tan lipu ante sona",
- "directory.local": "tan {domain} taso",
+ "directory.local": "tan ma {domain} taso",
"directory.new_arrivals": "jan pi kama sin",
"directory.recently_active": "jan lon tenpo poka",
"disabled_account_banner.account_settings": "wile pi lipu jan",
- "disabled_account_banner.text": "sina ken ala kepeken e lipu jan sina pi nimi {disabledAccount}.",
- "dismissable_banner.community_timeline": "ni li toki pi tenpo poka tawa ale tan jan lon ma lawa pi nimi {domain}.",
+ "disabled_account_banner.text": "sina ken ala lon sijelo {disabledAccount}.",
+ "dismissable_banner.community_timeline": "ni li toki suli pi len ala lon ma {domain} tan tenpo poka.",
"dismissable_banner.dismiss": "o weka",
- "dismissable_banner.explore_links": "tenpo suno ni la jan pi kulupu ale li toki e ijo sin ni. ijo sin pi jan ante mute li sewi lon lipu ni.",
- "dismissable_banner.explore_statuses": "jan mute li lukin e toki ni tan ma ilo weka. toki sin en toki pi wawa mute li lon sewi.",
- "domain_block_modal.block": "o weka e ma",
- "domain_block_modal.they_wont_know": "ona li sona ala e ni: sina weka e ona.",
- "domain_block_modal.title": "sina wile weka ala weka e ma?",
+ "dismissable_banner.explore_links": "tenpo poka la jan pi kulupu ale li toki e ijo sin ni. ijo sin pi jan ante mute li sewi lon lipu ni.",
+ "dismissable_banner.explore_statuses": "tenpo poka la jan pi kulupu ale li toki e ijo ni. ijo sin pi jan ante mute li sewi lon lipu ni.",
+ "dismissable_banner.explore_tags": "tenpo poka la jan pi kulupu ale li toki e ijo ni. ijo sin pi jan ante mute li sewi lon lipu ni.",
+ "dismissable_banner.public_timeline": "toki ni li sin. jan li pali e toki ni la jan ante mute pi ma {domain} li kute e jan ni.",
+ "domain_block_modal.block": "o len e ma",
+ "domain_block_modal.block_account_instead": "o len e @{name} a",
+ "domain_block_modal.they_can_interact_with_old_posts": "jan pi ma ni li ken ijo e toki sina.",
+ "domain_block_modal.they_cant_follow": "jan pi ma ni li ken ala kute e sina.",
+ "domain_block_modal.they_wont_know": "ona li sona ala e ni: sina len e ona.",
+ "domain_block_modal.title": "sina wile ala wile len e ma?",
"domain_block_modal.you_will_lose_num_followers": "{followersCount, plural, other {jan {followersCountDisplay}}} li kute e sina la, ona kama kute ala e sina. sina kute e {followingCount, plural,other {jan {followingCountDisplay}}} la, sina kama kute ala e ona.",
"domain_block_modal.you_will_lose_relationships": "jan li lon kulupu ni la ona kute e sina la, ona li kama kute ala e sina. jan li lon kulupu ni la sina kute e ona la, sina kama kute ala e ona.",
"domain_block_modal.you_wont_see_posts": "sina ken ala lukin e toki tan jan pi ma ni",
+ "domain_pill.activitypub_lets_connect": "ilo ni la sina ken toki tawa jan ante. ni li lon ma Masoton taso ala li lon ma mute a.",
+ "domain_pill.activitypub_like_language": "ilo Masoton li toki kepeken nasin ActivityPub tawa kulupu ilo ante.",
"domain_pill.server": "ma",
"domain_pill.their_handle": "nimi pi ona taso li ni:",
"domain_pill.their_server": "ni li ma ona lon ilo. toki ale ona li lon ma ni.",
@@ -283,14 +306,14 @@
"empty_column.account_suspended": "lipu ni li weka",
"empty_column.account_timeline": "toki ala li lon!",
"empty_column.account_unavailable": "ken ala lukin e lipu jan",
- "empty_column.blocks": "jan ala li weka tawa sina.",
+ "empty_column.blocks": "sina len ala e jan.",
"empty_column.direct": "jan ala li toki len e sina. jan li toki len e sina la sina ken lukin e ni lon ni.",
- "empty_column.domain_blocks": "ma ala li weka tawa sina.",
+ "empty_column.domain_blocks": "sina len ala e ma.",
"empty_column.favourited_statuses": "sina suli ala e toki. sina suli e toki la sina ken lukin e toki ni lon ni.",
"empty_column.favourites": "jan ala li suli e toki ni. jan li suli e toki ni la sina ken lukin e ona lon ni.",
"empty_column.follow_requests": "jan ala li toki pi wile kute tawa sina. jan li toki pi wile kute tawa sina la sina ken lukin e toki ni lon ni.",
- "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni",
- "empty_column.hashtag": "ala li lon toki ni",
+ "empty_column.followed_tags": "sina kute ala e kulupu lipu. sina kute la toki li kama lon ni.",
+ "empty_column.hashtag": "toki ala li lon kulupu ni.",
"empty_column.home": "ala a li lon lipu open sina! sina wile lon e ijo lon ni la o kute e jan pi toki suli.",
"empty_column.list": "ala li lon kulupu lipu ni. jan pi kulupu lipu ni li toki sin la toki ni li lon ni.",
"empty_column.mutes": "jan ala li len tawa sina.",
@@ -301,15 +324,21 @@
"explore.trending_links": "sin",
"explore.trending_statuses": "toki",
"explore.trending_tags": "kulupu pi lipu suli",
+ "featured_carousel.next": "kama",
+ "featured_carousel.post": "toki",
+ "featured_carousel.previous": "pini",
+ "featured_carousel.slide": "lipu {total} la lipu nanpa {index}",
"filter_modal.added.settings_link": "lipu lawa",
"filter_modal.select_filter.expired": "tenpo pini",
"filter_modal.select_filter.search": "o alasa anu pali",
+ "filtered_notifications_banner.pending_requests": "ni li tan {count, plural, =0 {jan sina ala} other {jan sina #}}",
"firehose.all": "ale",
"firehose.local": "kulupu ni",
"firehose.remote": "kulupu ante",
"follow_request.authorize": "o ken",
- "follow_request.reject": "o ala",
+ "follow_request.reject": "o weka kute",
"follow_suggestions.dismiss": "mi wile lukin sin ala e ni",
+ "follow_suggestions.friends_of_friends_longer": "ni li suli tawa kulupu jan ni: sina kute e ona",
"follow_suggestions.hints.friends_of_friends": "jan kute sina li lukin mute e toki pi jan ni.",
"follow_suggestions.hints.most_followed": "jan mute lon ma {domain} li kute e jan ni.",
"follow_suggestions.hints.most_interactions": "tenpo poka la jan mute pi ma {domain} li lukin mute e toki pi jan ni.",
@@ -322,67 +351,103 @@
"footer.privacy_policy": "lawa len",
"footer.source_code": "o lukin e toki ilo",
"footer.status": "lon",
- "generic.saved": "ni li awen",
+ "footer.terms_of_service": "lipu lawa",
+ "generic.saved": "mi awen e ni",
+ "getting_started.heading": "mi open",
+ "hashtag.admin_moderation": "o lawa e kulupu #{name}",
+ "hashtag.browse": "o lukin e kulupu toki #{hashtag}",
+ "hashtag.browse_from_account": "o lukin e kulupu toki #{hashtag} tan @{name}",
"hashtag.column_header.tag_mode.all": "en {additional}",
"hashtag.column_header.tag_mode.any": "anu {additional}",
"hashtag.column_header.tag_mode.none": "en {additional} ala",
+ "hashtag.column_settings.select.placeholder": "o alasa e kulupu…",
"hashtag.column_settings.tag_mode.all": "ale ni",
"hashtag.column_settings.tag_mode.any": "wan ni",
"hashtag.column_settings.tag_mode.none": "ala ni",
"hashtag.counter_by_accounts": "{count, plural, other {jan {counter}}}",
"hashtag.counter_by_uses": "{count, plural, other {toki {counter}}}",
"hashtag.follow": "o kute e kulupu lipu",
+ "hashtag.mute": "o kute ala e kulupu #{hashtag}",
"hashtag.unfollow": "o kute ala e kulupu lipu",
- "home.column_settings.show_reblogs": "lukin e wawa",
+ "hints.profiles.followers_may_be_missing": "jan kute li ken weka.",
+ "hints.profiles.see_more_posts": "o lukin e toki ante lon ma {domain}",
+ "hints.threads.see_more": "o lukin e toki ante lon ma {domain}",
+ "home.column_settings.show_reblogs": "o lukin e wawa toki",
+ "home.hide_announcements": "o lukin ala e toki lawa suli",
"home.pending_critical_update.link": "o lukin e ijo ilo sin",
+ "home.show_announcements": "o lukin e toki lawa suli",
"info_button.label": "sona",
- "interaction_modal.go": "o tawa ma ni",
+ "interaction_modal.go": "o tawa",
+ "interaction_modal.no_account_yet": "sina jo ala e sijelo anu seme?",
"interaction_modal.on_another_server": "lon ma ante",
"interaction_modal.on_this_server": "lon ma ni",
- "interaction_modal.title.favourite": "o suli e toki {name}",
+ "interaction_modal.title.favourite": "o pona tawa {name}",
"interaction_modal.title.follow": "o kute e {name}",
- "interaction_modal.title.reblog": "o wawa e toki {name}",
- "interaction_modal.title.reply": "o toki lon toki pi jan {name}",
- "interaction_modal.title.vote": "o pana tawa wile sona pi jan {name}",
+ "interaction_modal.title.reblog": "o pana wawa e toki tan {name}",
+ "interaction_modal.title.reply": "o toki lon lipu tawa {name}",
+ "interaction_modal.title.vote": "o pana e sona wile tawa {name}",
"interaction_modal.username_prompt": "ni li sama ni: {example}",
- "intervals.full.days": "{number, plural, other {suni #}}",
- "intervals.full.hours": "{number, plural, other {tenpo suli #}}",
- "keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka",
+ "intervals.full.days": "ni li pini lon {number, plural, other {tenpo suno #}}",
+ "intervals.full.hours": "ni li pini lon {number, plural, other {tenpo ilo #}}",
+ "intervals.full.minutes": "ni li pini lon {number, plural, other {tenpo ilo lili #}}",
+ "keyboard_shortcuts.back": "o tawa pini",
+ "keyboard_shortcuts.blocked": "o lukin e lipu pi len sina",
"keyboard_shortcuts.boost": "o pana sin e toki",
"keyboard_shortcuts.down": "o tawa anpa lon lipu",
"keyboard_shortcuts.enter": "o lukin e toki",
"keyboard_shortcuts.favourite": "o sitelen pona e toki",
"keyboard_shortcuts.favourites": "o lukin e lipu sina pi toki suli",
+ "keyboard_shortcuts.federated": "o lukin e linja toki pi ma ale",
"keyboard_shortcuts.muted": "o lukin e lipu sina pi jan len",
"keyboard_shortcuts.my_profile": "o lukin e lipu sina",
"keyboard_shortcuts.open_media": "o lukin e sitelen",
"keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi",
- "keyboard_shortcuts.toggle_sensitivity": "o ante e ken lukin",
- "keyboard_shortcuts.toot": "o toki",
+ "keyboard_shortcuts.reply": "o toki lon ijo ni",
+ "keyboard_shortcuts.toggle_hidden": "o lukin ala lukin e toki len",
+ "keyboard_shortcuts.toggle_sensitivity": "o lukin ala lukin e sitelen",
+ "keyboard_shortcuts.toot": "o toki sin",
+ "keyboard_shortcuts.translate": "o ante e toki lipu",
"keyboard_shortcuts.up": "o tawa sewi lon lipu",
"lightbox.close": "o pini",
"lightbox.next": "sinpin",
"lightbox.previous": "monsi",
"link_preview.author": "tan {name}",
+ "link_preview.shares": "{count, plural, other {toki {counter}}}",
+ "lists.add_member": "o pana",
+ "lists.add_to_list": "o pana tawa kulupu jan",
+ "lists.add_to_lists": "o pana e {name} tawa kulupu jan",
+ "lists.create": "o lipu e kulupu jan",
+ "lists.create_a_list_to_organize": "o lipu e kulupu tawa nasin pi ilo sina",
+ "lists.create_list": "o lipu e kulupu jan",
"lists.delete": "o weka e kulupu lipu",
"lists.done": "ale li pini",
"lists.edit": "o ante e kulupu lipu",
+ "lists.find_users_to_add": "o alasa e jan",
"lists.list_members_count": "{count, plural, other {jan #}}",
"lists.list_name": "nimi kulupu",
"lists.new_list_name": "nimi pi kulupu sin",
"lists.no_lists_yet": "kulupu li lon ala.",
+ "lists.no_members_yet": "jan ala li lon.",
+ "lists.no_results_found": "jan ala li lon.",
"lists.remove_member": "o weka",
"lists.replies_policy.followed": "jan kute ale",
"lists.replies_policy.list": "jan pi kulupu ni taso",
"lists.replies_policy.none": "jan ala",
+ "lists.save": "o awen",
"lists.search": "o alasa",
"load_pending": "{count, plural, other {ijo sin #}}",
"loading_indicator.label": "ni li kama…",
+ "media_gallery.hide": "o len",
+ "moved_to_account_banner.text": "sina ante e sijelo tawa sijelo {movedToAccount}. ni la sijelo {disabledAccount} li pini.",
+ "mute_modal.hide_from_notifications": "o len tan mu",
+ "mute_modal.indefinite": "ni li pini ala",
"mute_modal.title": "sina wile ala wile kute e jan ni?",
"navigation_bar.about": "sona",
- "navigation_bar.blocks": "jan weka",
+ "navigation_bar.blocks": "jan len",
"navigation_bar.compose": "o pali e toki sin",
- "navigation_bar.domain_blocks": "kulupu pi ma weka",
+ "navigation_bar.discover": "o alasa",
+ "navigation_bar.domain_blocks": "ma len",
+ "navigation_bar.explore": "o alasa",
"navigation_bar.favourites": "ijo pona",
"navigation_bar.filters": "nimi len",
"navigation_bar.lists": "kulupu lipu",
@@ -395,8 +460,15 @@
"notification.favourite": "toki sina li pona tawa {name}",
"notification.follow": " {name} li kute e sina",
"notification.follow_request": "{name} li wile kute e sina",
+ "notification.label.mention": "jan li toki e sina",
+ "notification.label.private_mention": "jan li toki e sina lon len",
+ "notification.label.private_reply": "toki len",
+ "notification.label.reply": "jan li toki tawa toki sina",
+ "notification.mentioned_you": "jan {name} li toki e sina",
"notification.moderation-warning.learn_more": "o kama sona e ijo ante",
"notification.reblog": "{name} li wawa e toki sina",
+ "notification.relationships_severance_event.domain_block": "ma {from} la jan lawa li len e ma {target}. ma ni la jan {followersCount} li kute e sina. sina kute e {followingCount, plural, other {jan #}} tan ma ni. kama la ona ale li len tawa sina.",
+ "notification.relationships_severance_event.user_domain_block": "sina len e ma {target}. ma ni la jan {followersCount} li kute e sina. sina kute e {followingCount, plural, other {jan #}} tan ma ni. kama la ona ale li len tawa sina.",
"notification.status": "{name} li toki",
"notification.update": "{name} li ante e toki",
"notification_requests.dismiss": "o weka",
@@ -429,8 +501,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "tenpo suno ni",
- "reply_indicator.cancel": "o ala",
- "report.block": "o weka e jan",
+ "reply_indicator.attachments": "{count, plural, other {sitelen #}}",
+ "reply_indicator.cancel": "o pana ala",
+ "report.block": "o len e jan",
"report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.",
"report.categories.other": "ante",
"report.categories.spam": "ike tan toki mute",
@@ -462,8 +535,8 @@
"search_results.see_all": "ale",
"search_results.statuses": "toki",
"server_banner.administered_by": "jan lawa:",
- "status.block": "o weka e @{name}",
- "status.cancel_reblog_private": "o pini e pana",
+ "status.block": "o len e @{name}",
+ "status.cancel_reblog_private": "o pana ala",
"status.delete": "o weka",
"status.edit": "o ante",
"status.favourite": "o sitelen pona",
@@ -477,7 +550,6 @@
"status.mute": "o len e @{name}",
"status.mute_conversation": "o kute ala e ijo pi toki ni",
"status.pin": "o sewi lon lipu sina",
- "status.pinned": "toki sewi",
"status.reblog": "o wawa",
"status.reblogged_by": "jan {name} li wawa",
"status.reblogs.empty": "jan ala li wawa e toki ni. jan li wawa la, nimi ona li sitelen lon ni.",
@@ -498,6 +570,7 @@
"units.short.thousand": "{count}K",
"upload_button.label": "o pana e sitelen anu kalama",
"upload_error.limit": "ilo li ken ala e suli pi ijo ni.",
+ "upload_form.drag_and_drop.on_drag_cancel": "sina wile ala pana e sitelen. mi weka e sitelen.",
"upload_form.edit": "o ante",
"upload_progress.label": "ilo li kama jo e ijo sina...",
"upload_progress.processing": "ilo li pali…",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 1f703e0748..b68854b883 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Denetlenen sunucular",
"about.contact": "İletişim:",
+ "about.default_locale": "Varsayılan",
"about.disclaimer": "Mastodon özgür, açık kaynak bir yazılımdır ve Mastodon gGmbH şirketinin ticari markasıdır.",
"about.domain_blocks.no_reason_available": "Gerekçe mevcut değil",
"about.domain_blocks.preamble": "Mastodon, genel olarak fediverse'teki herhangi bir sunucudan içerik görüntülemenize ve kullanıcılarıyla etkileşim kurmanıza izin verir. Bunlar, bu sunucuda yapılmış olan istisnalardır.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Sınırlı",
"about.domain_blocks.suspended.explanation": "Bu sunucudaki hiçbir veri işlenmeyecek, saklanmayacak veya değiş tokuş edilmeyecektir, dolayısıyla bu sunucudaki kullanıcılarla herhangi bir etkileşim veya iletişim imkansız olacaktır.",
"about.domain_blocks.suspended.title": "Askıya alındı",
+ "about.language_label": "Dil",
"about.not_available": "Bu sunucuda bu bilgi kullanıma sunulmadı.",
"about.powered_by": "{mastodon} destekli merkeziyetsiz sosyal ağ",
"about.rules": "Sunucu kuralları",
@@ -19,17 +21,21 @@
"account.block_domain": "{domain} alan adını engelle",
"account.block_short": "Engelle",
"account.blocked": "Engellendi",
+ "account.blocking": "Engelleme",
"account.cancel_follow_request": "Takip isteğini geri çek",
"account.copy": "Gönderi bağlantısını kopyala",
"account.direct": "@{name} kullanıcısına özel olarak değin",
"account.disable_notifications": "@{name} kişisinin gönderi bildirimlerini kapat",
- "account.domain_blocked": "Alan adı engellendi",
+ "account.domain_blocking": "Alan adını engelleme",
"account.edit_profile": "Profili düzenle",
"account.enable_notifications": "@{name} kişisinin gönderi bildirimlerini aç",
"account.endorse": "Profilimde öne çıkar",
+ "account.familiar_followers_many": "{name1}, {name2}, {othersCount, plural, one {# diğer} other {# diğer}} bildiğiniz kişi tarafından takip ediliyor",
+ "account.familiar_followers_one": "{name1} tarafından takip ediliyor",
+ "account.familiar_followers_two": "{name1} ve {name2} tarafından takip ediliyor",
"account.featured": "Öne çıkan",
+ "account.featured.accounts": "Profiller",
"account.featured.hashtags": "Etiketler",
- "account.featured.posts": "Gönderiler",
"account.featured_tags.last_status_at": "Son gönderinin tarihi {date}",
"account.featured_tags.last_status_never": "Gönderi yok",
"account.follow": "Takip et",
@@ -37,9 +43,11 @@
"account.followers": "Takipçi",
"account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.",
"account.followers_counter": "{count, plural, one {{counter} takipçi} other {{counter} takipçi}}",
+ "account.followers_you_know_counter": "bildiğiniz {counter}",
"account.following": "Takip Ediliyor",
"account.following_counter": "{count, plural, one {{counter} takip edilen} other {{counter} takip edilen}}",
"account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.",
+ "account.follows_you": "Seni takip ediyor",
"account.go_to_profile": "Profile git",
"account.hide_reblogs": "@{name} kişisinin boostlarını gizle",
"account.in_memoriam": "Hatırasına.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Bildirimleri sessize al",
"account.mute_short": "Sessize al",
"account.muted": "Susturuldu",
- "account.mutual": "Karşılıklı",
+ "account.muting": "Sessize alınıyor",
+ "account.mutual": "Birbirinizi takip ediyorsunuz",
"account.no_bio": "Herhangi bir açıklama belirtilmedi.",
"account.open_original_page": "Asıl sayfayı aç",
"account.posts": "Gönderiler",
"account.posts_with_replies": "Gönderiler ve yanıtlar",
+ "account.remove_from_followers": "{name} takipçilerinden kaldır",
"account.report": "@{name} adlı kişiyi bildir",
"account.requested": "Onay bekleniyor. Takip isteğini iptal etmek için tıklayın",
"account.requested_follow": "{name} size takip isteği gönderdi",
+ "account.requests_to_follow_you": "Size takip isteği gönderdi",
"account.share": "@{name} adlı kişinin profilini paylaş",
"account.show_reblogs": "@{name} kişisinin yeniden paylaşımlarını göster",
"account.statuses_counter": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Sil Düzenle ve yeniden paylaş",
"confirmations.redraft.message": "Bu gönderiyi silip taslak haline getirmek istediğinize emin misiniz? Mevcut favoriler ve boostlar silinecek ve gönderiye verilen yanıtlar başıboş kalacak.",
"confirmations.redraft.title": "Gönderiyi sil veya taslağa dönüştür?",
+ "confirmations.remove_from_followers.confirm": "Takipçi kaldır",
+ "confirmations.remove_from_followers.message": "{name} sizi takip etmeyi bırakacaktır. Devam etmek istediğinize emin misiniz?",
+ "confirmations.remove_from_followers.title": "Takipçiyi kaldır?",
"confirmations.reply.confirm": "Yanıtla",
"confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğun mesajın üzerine yazılır. Devam etmek istediğine emin misin?",
"confirmations.reply.title": "Gönderinin üzerine yaz?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Arama sonuçları",
"emoji_button.symbols": "Semboller",
"emoji_button.travel": "Seyahat ve Yerler",
- "empty_column.account_featured": "Bu liste boş",
+ "empty_column.account_featured.me": "Henüz hiçbir şeyi öne çıkarmadınız. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?",
+ "empty_column.account_featured.other": "{acct} henüz hiçbir şeyi öne çıkarmadı. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?",
+ "empty_column.account_featured_other.unknown": "Bu hesap henüz hiçbir şeyi öne çıkarmadı.",
"empty_column.account_hides_collections": "Bu kullanıcı bu bilgiyi sağlamayı tercih etmemiştir",
"empty_column.account_suspended": "Hesap askıya alındı",
"empty_column.account_timeline": "Burada hiç gönderi yok!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Haberler",
"explore.trending_statuses": "Gönderiler",
"explore.trending_tags": "Etiketler",
+ "featured_carousel.header": "{count, plural, one {{counter} Sabitlenmiş Gönderi} other {{counter} Sabitlenmiş Gönderi}}",
+ "featured_carousel.next": "Sonraki",
+ "featured_carousel.post": "Gönderi",
+ "featured_carousel.previous": "Önceki",
+ "featured_carousel.slide": "{index}/{total}",
"filter_modal.added.context_mismatch_explanation": "Bu süzgeç kategorisi, bu gönderide eriştiğin bağlama uymuyor. Eğer gönderinin bu bağlamda da filtrelenmesini istiyorsanız, süzgeci düzenlemeniz gerekiyor.",
"filter_modal.added.context_mismatch_title": "Bağlam uyumsuzluğu!",
"filter_modal.added.expired_explanation": "Bu süzgeç kategorisinin süresi dolmuş, süzgeci uygulamak için bitiş tarihini değiştirmeniz gerekiyor.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} katılımcı} other {{counter} katılımcı}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
"hashtag.counter_by_uses_today": "bugün {count, plural, one {{counter} gönderi} other {{counter} gönderi}}",
+ "hashtag.feature": "Profilimde öne çıkar",
"hashtag.follow": "Etiketi takip et",
"hashtag.mute": "#{hashtag} gönderilerini sessize al",
+ "hashtag.unfeature": "Profilimde öne çıkarma",
"hashtag.unfollow": "Etiketi takibi bırak",
"hashtags.and_other": "…ve {count, plural, one {}other {# fazlası}}",
"hints.profiles.followers_may_be_missing": "Bu profilin takipçileri eksik olabilir.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "{domain} adresinde daha fazla gönderi gör",
"hints.threads.replies_may_be_missing": "Diğer sunuculardan yanıtlar eksik olabilir.",
"hints.threads.see_more": "{domain} adresinde daha fazla yanıt gör",
+ "home.column_settings.show_quotes": "Alıntıları göster",
"home.column_settings.show_reblogs": "Yeniden paylaşımları göster",
"home.column_settings.show_replies": "Yanıtları göster",
"home.hide_announcements": "Duyuruları gizle",
@@ -502,7 +526,6 @@
"lists.exclusive": "Anasayfada üyeleri gizle",
"lists.exclusive_hint": "Birisi bu listede yer alıyorsa, gönderilerini iki kez görmekten kaçınmak için onu anasayfa akışınızda gizleyin.",
"lists.find_users_to_add": "Eklenecek kullanıcıları bul",
- "lists.list_members": "Liste üyeleri",
"lists.list_members_count": "{count, plural, one {# üye} other {# üye}}",
"lists.list_name": "Liste adı",
"lists.new_list_name": "Yeni liste adı",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Sohbeti sessize al",
"status.open": "Bu gönderiyi genişlet",
"status.pin": "Profile sabitle",
- "status.pinned": "Sabitlenmiş gönderi",
+ "status.quote_error.filtered": "Bazı filtrelerinizden dolayı gizlenmiştir",
+ "status.quote_error.not_found": "Bu gönderi görüntülenemez.",
+ "status.quote_error.pending_approval": "Bu gönderi özgün yazarın onayını bekliyor.",
+ "status.quote_error.rejected": "Bu gönderi, özgün yazar alıntılanmasına izin vermediği için görüntülenemez.",
+ "status.quote_error.removed": "Bu gönderi yazarı tarafından kaldırıldı.",
+ "status.quote_error.unauthorized": "Bu gönderiyi, yetkiniz olmadığı için görüntüleyemiyorsunuz.",
+ "status.quote_post_author": "{name} gönderisi",
"status.read_more": "Devamını okuyun",
"status.reblog": "Yeniden paylaş",
"status.reblog_private": "Özgün görünürlük ile yeniden paylaş",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index ee50180ced..b16441cf25 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -21,7 +21,6 @@
"account.cancel_follow_request": "Киләсе сорау",
"account.copy": "Профиль сылтамасын күчереп ал",
"account.disable_notifications": "@{name} язулары өчен белдерүләр сүндерү",
- "account.domain_blocked": "Домен блокланган",
"account.edit_profile": "Профильне үзгәртү",
"account.enable_notifications": "@{name} язулары өчен белдерүләр яндыру",
"account.endorse": "Профильдә тәкъдим итү",
@@ -390,7 +389,6 @@
"status.mention": "@{name} Искә алу",
"status.more": "Күбрәк",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.read_more": "Күбрәк уку",
"status.reblog": "Уртаклашу",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index e550d7e678..b46d55d4a8 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -82,7 +82,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 6d37e0e1db..3c222e4310 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Модеровані сервери",
"about.contact": "Контакти:",
+ "about.default_locale": "За замовчуванням",
"about.disclaimer": "Mastodon — це вільне програмне забезпечення з відкритим кодом і торгова марка компанії Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Причина недоступна",
"about.domain_blocks.preamble": "Mastodon зазвичай дозволяє вам взаємодіяти з користувачами будь-яких серверів у Федіверсі та переглядати їх вміст. Ось винятки, які було зроблено на цьому конкретному сервері.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Обмежені",
"about.domain_blocks.suspended.explanation": "Дані з цього сервера не будуть оброблятися, зберігатися чи обмінюватися, що унеможливить взаємодію чи спілкування з користувачами цього сервера.",
"about.domain_blocks.suspended.title": "Заблоковані",
+ "about.language_label": "Мова",
"about.not_available": "Ця інформація не доступна на цьому сервері.",
"about.powered_by": "Децентралізовані соціальні мережі від {mastodon}",
"about.rules": "Правила сервера",
@@ -23,13 +25,12 @@
"account.copy": "Копіювати посилання на профіль",
"account.direct": "Особиста згадка @{name}",
"account.disable_notifications": "Не повідомляти мене про дописи @{name}",
- "account.domain_blocked": "Домен заблоковано",
"account.edit_profile": "Редагувати профіль",
"account.enable_notifications": "Повідомляти мене про дописи @{name}",
"account.endorse": "Рекомендувати у моєму профілі",
"account.featured": "Рекомендоване",
+ "account.featured.accounts": "Профілі",
"account.featured.hashtags": "Хештеги",
- "account.featured.posts": "Дописи",
"account.featured_tags.last_status_at": "Останній допис {date}",
"account.featured_tags.last_status_never": "Немає дописів",
"account.follow": "Підписатися",
@@ -40,6 +41,7 @@
"account.following": "Ви стежите",
"account.following_counter": "{count, plural, one {{counter} підписка} few {{counter} підписки} many {{counter} підписок} other {{counter} підписка}}",
"account.follows.empty": "Цей користувач ще ні на кого не підписався.",
+ "account.follows_you": "Підписаний(-а) на вас",
"account.go_to_profile": "Перейти до профілю",
"account.hide_reblogs": "Сховати поширення від @{name}",
"account.in_memoriam": "Пам'ятник.",
@@ -54,7 +56,6 @@
"account.mute_notifications_short": "Не сповіщати",
"account.mute_short": "Ігнорувати",
"account.muted": "Приховується",
- "account.mutual": "Взаємно",
"account.no_bio": "Немає опису.",
"account.open_original_page": "Відкрити оригінальну сторінку",
"account.posts": "Дописи",
@@ -296,7 +297,7 @@
"emoji_button.search_results": "Результати пошуку",
"emoji_button.symbols": "Символи",
"emoji_button.travel": "Подорожі та місця",
- "empty_column.account_featured": "Список порожній",
+ "empty_column.account_featured_other.unknown": "Цей обліковий запис ще не виділив нічого.",
"empty_column.account_hides_collections": "Цей користувач вирішив не робити цю інформацію доступною",
"empty_column.account_suspended": "Обліковий запис заблоковано",
"empty_column.account_timeline": "Тут немає дописів!",
@@ -500,7 +501,6 @@
"lists.exclusive": "Сховати учасників на головній сторінці",
"lists.exclusive_hint": "Якщо хтось є у цьому списку, сховайте їх на своїй домашній сторінці, щоб не бачити їхні дописи двічі.",
"lists.find_users_to_add": "Знайти користувачів, щоб додати їх",
- "lists.list_members": "Учасники списку",
"lists.list_members_count": "{count, plural, one {# member} other {# members}}",
"lists.list_name": "Назва списку",
"lists.new_list_name": "Нова назва списку",
@@ -846,7 +846,8 @@
"status.mute_conversation": "Ігнорувати розмову",
"status.open": "Розгорнути допис",
"status.pin": "Закріпити у профілі",
- "status.pinned": "Закріплений допис",
+ "status.quote_error.filtered": "Приховано через один з ваших фільтрів",
+ "status.quote_post_author": "@{name} опублікував допис",
"status.read_more": "Дізнатися більше",
"status.reblog": "Поширити",
"status.reblog_private": "Поширити для початкової аудиторії",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index e28ad93828..65b9beebfa 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -16,7 +16,6 @@
"account.cancel_follow_request": "Withdraw follow request",
"account.direct": "نجی طور پر @{name} کا ذکر کریں",
"account.disable_notifications": "جب @{name} پوسٹ کرے تو مجھ مطلع نہ کریں",
- "account.domain_blocked": "پوشیدہ ڈومین",
"account.edit_profile": "مشخص ترمیم کریں",
"account.enable_notifications": "جب @{name} پوسٹ کرے تو مجھ مطلع کریں",
"account.endorse": "مشکص پر نمایاں کریں",
@@ -42,7 +41,6 @@
"account.mute_notifications_short": "نوٹیفیکیشنز کو خاموش کریں",
"account.mute_short": "خاموش",
"account.muted": "خاموش کردہ",
- "account.mutual": "میوچول اکاؤنٹ",
"account.no_bio": "کوئی تفصیل نہیں دی گئی۔",
"account.open_original_page": "اصل صفحہ کھولیں",
"account.posts": "ٹوٹ",
@@ -248,7 +246,6 @@
"status.copy": "Copy link to status",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json
index 6dd350651d..92673f9044 100644
--- a/app/javascript/mastodon/locales/uz.json
+++ b/app/javascript/mastodon/locales/uz.json
@@ -19,7 +19,6 @@
"account.blocked": "Bloklangan",
"account.cancel_follow_request": "Kuzatuv so‘rovini bekor qilish",
"account.disable_notifications": "@{name} post qo‘yganida menga xabar berishni to‘xtating",
- "account.domain_blocked": "Domen bloklangan",
"account.edit_profile": "Profilni tahrirlash",
"account.enable_notifications": "@{name} post qo‘yganida menga xabar olish",
"account.endorse": "Profildagi xususiyat",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index cabf3a5a82..747d02a473 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Giới hạn chung",
"about.contact": "Liên lạc:",
+ "about.default_locale": "Mặc định",
"about.disclaimer": "Mastodon là phần mềm tự do nguồn mở của Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Lý do không được cung cấp",
"about.domain_blocks.preamble": "Mastodon cho phép bạn đọc nội dung và giao tiếp với mọi người từ bất kỳ máy chủ nào. Còn đây là những ngoại lệ trên máy chủ này.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Hạn chế",
"about.domain_blocks.suspended.explanation": "Dữ liệu từ máy chủ này sẽ không được xử lý, lưu trữ hoặc trao đổi. Mọi tương tác hoặc giao tiếp với người từ máy chủ này đều bị cấm.",
"about.domain_blocks.suspended.title": "Vô hiệu hóa",
+ "about.language_label": "Ngôn ngữ",
"about.not_available": "Máy chủ này chưa cung cấp thông tin.",
"about.powered_by": "Mạng xã hội liên hợp {mastodon}",
"about.rules": "Nội quy máy chủ",
@@ -19,17 +21,21 @@
"account.block_domain": "Chặn mọi thứ từ {domain}",
"account.block_short": "Chặn",
"account.blocked": "Đã chặn",
+ "account.blocking": "Đang chặn",
"account.cancel_follow_request": "Thu hồi yêu cầu theo dõi",
"account.copy": "Sao chép địa chỉ",
"account.direct": "Nhắn riêng @{name}",
"account.disable_notifications": "Tắt thông báo khi @{name} đăng tút",
- "account.domain_blocked": "Tên miền đã chặn",
+ "account.domain_blocking": "Máy chủ đang chủ",
"account.edit_profile": "Sửa hồ sơ",
"account.enable_notifications": "Nhận thông báo khi @{name} đăng tút",
"account.endorse": "Tôn vinh người này",
- "account.featured": "Nổi bật",
+ "account.familiar_followers_many": "Theo dõi bởi {name1}, {name2} và {othersCount, plural, other {# người khác mà bạn biết}}",
+ "account.familiar_followers_one": "Theo dõi bởi {name1}",
+ "account.familiar_followers_two": "Theo dõi bởi {name1} và {name2}",
+ "account.featured": "Nêu bật",
+ "account.featured.accounts": "Mọi người",
"account.featured.hashtags": "Hashtag",
- "account.featured.posts": "Tút",
"account.featured_tags.last_status_at": "Tút gần nhất {date}",
"account.featured_tags.last_status_never": "Chưa có tút",
"account.follow": "Theo dõi",
@@ -37,9 +43,11 @@
"account.followers": "Người theo dõi",
"account.followers.empty": "Chưa có người theo dõi nào.",
"account.followers_counter": "{count, plural, other {{counter} Người theo dõi}}",
+ "account.followers_you_know_counter": "{counter} bạn biết",
"account.following": "Đang theo dõi",
"account.following_counter": "{count, plural, other {{counter} Đang theo dõi}}",
"account.follows.empty": "Người này chưa theo dõi ai.",
+ "account.follows_you": "Đang theo dõi bạn",
"account.go_to_profile": "Xem hồ sơ",
"account.hide_reblogs": "Ẩn tút @{name} đăng lại",
"account.in_memoriam": "Tưởng Niệm.",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "Ẩn thông báo",
"account.mute_short": "Ẩn",
"account.muted": "Đã ẩn",
- "account.mutual": "Đang theo dõi nhau",
+ "account.muting": "Đang ẩn",
+ "account.mutual": "Theo dõi nhau",
"account.no_bio": "Chưa có miêu tả.",
"account.open_original_page": "Mở trang gốc",
"account.posts": "Tút",
"account.posts_with_replies": "Trả lời",
+ "account.remove_from_followers": "Xóa người theo dõi {name}",
"account.report": "Báo cáo @{name}",
"account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi",
"account.requested_follow": "{name} yêu cầu theo dõi bạn",
+ "account.requests_to_follow_you": "Yêu cầu theo dõi bạn",
"account.share": "Chia sẻ @{name}",
"account.show_reblogs": "Hiện tút do @{name} đăng lại",
"account.statuses_counter": "{count, plural, other {{counter} Tút}}",
@@ -128,7 +139,7 @@
"block_modal.you_wont_see_mentions": "Bạn sẽ không nhìn thấy tút có nhắc đến họ.",
"boost_modal.combo": "Nhấn {combo} để bỏ qua bước này",
"boost_modal.reblog": "Đăng lại?",
- "boost_modal.undo_reblog": "Hủy đăng lại?",
+ "boost_modal.undo_reblog": "Bỏ đăng lại?",
"bundle_column_error.copy_stacktrace": "Sao chép báo lỗi",
"bundle_column_error.error.body": "Không thể hiện trang này. Đây có thể là một lỗi trong mã lập trình của chúng tôi, hoặc là vấn đề tương thích của trình duyệt.",
"bundle_column_error.error.title": "Ôi không!",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "Xóa & viết lại",
"confirmations.redraft.message": "Điều này sẽ khiến những lượt thích và đăng lại của tút bị mất, cũng như những trả lời sẽ không còn nội dung gốc.",
"confirmations.redraft.title": "Xóa & viết lại",
+ "confirmations.remove_from_followers.confirm": "Xóa người theo dõi",
+ "confirmations.remove_from_followers.message": "{name} sẽ không còn theo dõi bạn.Bạn có chắc tiếp tục?",
+ "confirmations.remove_from_followers.title": "Xóa người theo dõi?",
"confirmations.reply.confirm": "Trả lời",
"confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?",
"confirmations.reply.title": "Ghi đè lên tút cũ",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "Kết quả tìm kiếm",
"emoji_button.symbols": "Biểu tượng",
"emoji_button.travel": "Du lịch",
- "empty_column.account_featured": "Danh sách trống",
+ "empty_column.account_featured.me": "Bạn chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag bạn dùng nhiều nhất, lẫn hồ sơ của bạn bè trên trang cá nhân của mình không?",
+ "empty_column.account_featured.other": "{acct} chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag bạn dùng nhiều nhất, lẫn hồ sơ của bạn bè trên trang cá nhân của mình không?",
+ "empty_column.account_featured_other.unknown": "Người này chưa nêu bật nội dung gì.",
"empty_column.account_hides_collections": "Người này đã chọn ẩn thông tin",
"empty_column.account_suspended": "Tài khoản vô hiệu hóa",
"empty_column.account_timeline": "Chưa có tút nào!",
@@ -329,6 +345,11 @@
"explore.trending_links": "Tin tức",
"explore.trending_statuses": "Tút",
"explore.trending_tags": "Hashtag",
+ "featured_carousel.header": "{count, plural, other {Tút đã ghim}}",
+ "featured_carousel.next": "Kế tiếp",
+ "featured_carousel.post": "Tút",
+ "featured_carousel.previous": "Trước đó",
+ "featured_carousel.slide": "{index} trong {total}",
"filter_modal.added.context_mismatch_explanation": "Danh mục bộ lọc này không áp dụng cho ngữ cảnh mà bạn đã truy cập tút này. Nếu bạn muốn tút cũng được lọc trong ngữ cảnh này, bạn sẽ phải chỉnh sửa bộ lọc.",
"filter_modal.added.context_mismatch_title": "Bối cảnh không phù hợp!",
"filter_modal.added.expired_explanation": "Danh mục bộ lọc này đã hết hạn, bạn sẽ cần thay đổi ngày hết hạn để áp dụng.",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, other {{counter} người dùng}}",
"hashtag.counter_by_uses": "{count, plural, other {{counter} tút}}",
"hashtag.counter_by_uses_today": "{count, plural, other {{counter} tút}} hôm nay",
+ "hashtag.feature": "Nêu bật trên hồ sơ",
"hashtag.follow": "Theo dõi hashtag",
"hashtag.mute": "Ẩn #{hashtag}",
+ "hashtag.unfeature": "Bỏ nêu bật trên hồ sơ",
"hashtag.unfollow": "Bỏ theo dõi hashtag",
"hashtags.and_other": "…và {count, plural, other {# nữa}}",
"hints.profiles.followers_may_be_missing": "Số người theo dõi có thể không đầy đủ.",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "Xem thêm tút ở {domain}",
"hints.threads.replies_may_be_missing": "Lượt trả lời từ máy chủ khác có thể không đầy đủ.",
"hints.threads.see_more": "Xem thêm ở {domain}",
+ "home.column_settings.show_quotes": "Hiện các trích dẫn",
"home.column_settings.show_reblogs": "Hiện những lượt đăng lại",
"home.column_settings.show_replies": "Hiện những tút dạng trả lời",
"home.hide_announcements": "Ẩn thông báo máy chủ",
@@ -502,7 +526,6 @@
"lists.exclusive": "Ẩn thành viên trong Trang chủ",
"lists.exclusive_hint": "Nếu ai đó có trong danh sách này, ẩn họ trong Trang chủ để tránh thấy tút của họ hiện trùng lặp.",
"lists.find_users_to_add": "Tìm người để thêm vào",
- "lists.list_members": "Liệt kê các thành viên",
"lists.list_members_count": "{count, plural, other {# thành viên}}",
"lists.list_name": "Tên danh sách",
"lists.new_list_name": "Tên danh sách mới",
@@ -626,7 +649,7 @@
"notifications.column_settings.admin.sign_up": "Người mới tham gia:",
"notifications.column_settings.alert": "Báo trên máy tính",
"notifications.column_settings.favourite": "Lượt thích:",
- "notifications.column_settings.filter_bar.advanced": "Toàn bộ",
+ "notifications.column_settings.filter_bar.advanced": "Hiện tất cả loại thông báo",
"notifications.column_settings.filter_bar.category": "Thanh lọc nhanh",
"notifications.column_settings.follow": "Người theo dõi:",
"notifications.column_settings.follow_request": "Yêu cầu theo dõi:",
@@ -641,10 +664,10 @@
"notifications.column_settings.unread_notifications.category": "Thông báo chưa đọc",
"notifications.column_settings.unread_notifications.highlight": "Nổi bật thông báo chưa đọc",
"notifications.column_settings.update": "Sửa tút:",
- "notifications.filter.all": "Toàn bộ",
+ "notifications.filter.all": "Tất cả",
"notifications.filter.boosts": "Đăng lại",
"notifications.filter.favourites": "Lượt thích",
- "notifications.filter.follows": "Đang theo dõi",
+ "notifications.filter.follows": "Người theo dõi mới",
"notifications.filter.mentions": "Lượt nhắc đến",
"notifications.filter.polls": "Kết quả bình chọn",
"notifications.filter.statuses": "Cập nhật từ những người bạn theo dõi",
@@ -654,21 +677,21 @@
"notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.",
"notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó",
"notifications.permission_required": "Không hiện thông báo trên màn hình bởi vì chưa cho phép.",
- "notifications.policy.accept": "Có",
+ "notifications.policy.accept": "Cho phép",
"notifications.policy.accept_hint": "Hiện trong thông báo",
- "notifications.policy.drop": "Không",
+ "notifications.policy.drop": "Bỏ qua",
"notifications.policy.drop_hint": "Loại bỏ vĩnh viễn",
"notifications.policy.filter": "Lọc",
"notifications.policy.filter_hint": "Cho vào mục thông báo bị lọc",
"notifications.policy.filter_limited_accounts_hint": "Chỉ dành cho kiểm duyệt viên",
- "notifications.policy.filter_limited_accounts_title": "Kiểm duyệt tài khoản",
+ "notifications.policy.filter_limited_accounts_title": "Kiểm duyệt máy chủ",
"notifications.policy.filter_new_accounts.hint": "Đã tạo trong vòng {days, plural, other {# ngày}}",
- "notifications.policy.filter_new_accounts_title": "Tài khoản mới",
- "notifications.policy.filter_not_followers_hint": "Bao gồm những người đã theo dõi bạn ít hơn {days, plural, other {# ngày}}",
+ "notifications.policy.filter_new_accounts_title": "Người mới tạo tài khoản",
+ "notifications.policy.filter_not_followers_hint": "Gồm những ai theo dõi bạn ít hơn {days, plural, other {# ngày}}",
"notifications.policy.filter_not_followers_title": "Những người không theo dõi bạn",
"notifications.policy.filter_not_following_hint": "Cho tới khi bạn duyệt họ",
"notifications.policy.filter_not_following_title": "Những người bạn không theo dõi",
- "notifications.policy.filter_private_mentions_hint": "Trừ khi nó trả lời lượt nhắc từ bạn hoặc nếu bạn có theo dõi người gửi",
+ "notifications.policy.filter_private_mentions_hint": "Trừ khi đó là trả lời lượt nhắc từ bạn hoặc nếu bạn có theo dõi người gửi",
"notifications.policy.filter_private_mentions_title": "Lượt nhắn riêng không mong muốn",
"notifications.policy.title": "Quản lý thông báo từ…",
"notifications_permission_banner.enable": "Cho phép thông báo trên màn hình",
@@ -821,7 +844,7 @@
"status.admin_status": "Mở tút này trong giao diện quản trị",
"status.block": "Chặn @{name}",
"status.bookmark": "Lưu",
- "status.cancel_reblog_private": "Hủy đăng lại",
+ "status.cancel_reblog_private": "Bỏ đăng lại",
"status.cannot_reblog": "Không thể đăng lại tút này",
"status.continued_thread": "Tiếp tục chủ đề",
"status.copy": "Sao chép URL",
@@ -848,7 +871,13 @@
"status.mute_conversation": "Không quan tâm nữa",
"status.open": "Đọc tút",
"status.pin": "Ghim lên hồ sơ",
- "status.pinned": "Tút đã ghim",
+ "status.quote_error.filtered": "Bị ẩn vì một bộ lọc của bạn",
+ "status.quote_error.not_found": "Tút này không thể hiển thị.",
+ "status.quote_error.pending_approval": "Tút này cần chờ cho phép từ người đăng.",
+ "status.quote_error.rejected": "Tút này không thể hiển thị vì người đăng không cho phép trích dẫn nó.",
+ "status.quote_error.removed": "Tút này đã bị người đăng xóa.",
+ "status.quote_error.unauthorized": "Tút này không thể hiển thị vì bạn không được cấp quyền truy cập nó.",
+ "status.quote_post_author": "Tút của {name}",
"status.read_more": "Đọc tiếp",
"status.reblog": "Đăng lại",
"status.reblog_private": "Đăng lại (Riêng tư)",
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index 334365acbe..3dd05a9fb6 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -6,7 +6,6 @@
"account.block_domain": "ⴳⴷⵍ ⵉⴳⵔ {domain}",
"account.blocked": "ⵉⵜⵜⵓⴳⴷⵍ",
"account.cancel_follow_request": "Withdraw follow request",
- "account.domain_blocked": "ⵉⵜⵜⵓⴳⴷⵍ ⵉⴳⵔ",
"account.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
"account.follow": "ⴹⴼⵕ",
"account.followers": "ⵉⵎⴹⴼⴰⵕⵏ",
@@ -156,7 +155,6 @@
"status.mute": "ⵥⵥⵉⵥⵏ @{name}",
"status.mute_conversation": "ⵥⵥⵉⵥⵏ ⴰⵎⵙⴰⵡⴰⵍ",
"status.open": "Expand this status",
- "status.pinned": "Pinned toot",
"status.read_more": "ⵖⵔ ⵓⴳⴳⴰⵔ",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.reply": "ⵔⴰⵔ",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index fc3f914e6a..4f4909ad7f 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -1,6 +1,7 @@
{
"about.blocks": "被限制的服务器",
"about.contact": "联系方式:",
+ "about.default_locale": "默认",
"about.disclaimer": "Mastodon 是自由的开源软件,商标由 Mastodon gGmbH 持有。",
"about.domain_blocks.no_reason_available": "原因不可用",
"about.domain_blocks.preamble": "通常来说,在 Mastodon 上,你可以浏览联邦宇宙中任何一台服务器上的内容,并且和上面的用户互动。但其中一些在本服务器上被设置为例外。",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "已隐藏",
"about.domain_blocks.suspended.explanation": "此服务器的数据将不会被处理、存储或者交换,本站也将无法和来自此服务器的用户互动或者交流。",
"about.domain_blocks.suspended.title": "已封禁",
+ "about.language_label": "语言",
"about.not_available": "此信息在当前服务器尚不可用。",
"about.powered_by": "由 {mastodon} 驱动的去中心化社交媒体",
"about.rules": "站点规则",
@@ -19,17 +21,20 @@
"account.block_domain": "屏蔽 {domain} 实例",
"account.block_short": "屏蔽",
"account.blocked": "已屏蔽",
+ "account.blocking": "屏蔽中",
"account.cancel_follow_request": "撤回关注请求",
"account.copy": "复制个人资料链接",
"account.direct": "私下提及 @{name}",
"account.disable_notifications": "当 @{name} 发布嘟文时不要通知我",
- "account.domain_blocked": "域名已屏蔽",
+ "account.domain_blocking": "正在屏蔽中的域名",
"account.edit_profile": "修改个人资料",
"account.enable_notifications": "当 @{name} 发布嘟文时通知我",
"account.endorse": "在个人资料中推荐此用户",
+ "account.familiar_followers_one": "{name1} 关注了此账号",
+ "account.familiar_followers_two": "{name1} 和 {name2} 关注了此账号",
"account.featured": "精选",
+ "account.featured.accounts": "个人资料",
"account.featured.hashtags": "话题",
- "account.featured.posts": "嘟文",
"account.featured_tags.last_status_at": "上次发言于 {date}",
"account.featured_tags.last_status_never": "暂无嘟文",
"account.follow": "关注",
@@ -37,9 +42,11 @@
"account.followers": "关注者",
"account.followers.empty": "目前无人关注此用户。",
"account.followers_counter": "{count, plural, other {{counter} 关注者}}",
+ "account.followers_you_know_counter": "你认识{counter}个",
"account.following": "正在关注",
"account.following_counter": "{count, plural, other {{counter} 正在关注}}",
"account.follows.empty": "此用户目前未关注任何人。",
+ "account.follows_you": "关注了你",
"account.go_to_profile": "前往个人资料页",
"account.hide_reblogs": "隐藏来自 @{name} 的转嘟",
"account.in_memoriam": "谨此悼念。",
@@ -54,14 +61,17 @@
"account.mute_notifications_short": "关闭通知",
"account.mute_short": "隐藏",
"account.muted": "已隐藏",
- "account.mutual": "互相关注",
+ "account.muting": "正在静音",
+ "account.mutual": "你们互相关注",
"account.no_bio": "未提供描述。",
"account.open_original_page": "打开原始页面",
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文和回复",
+ "account.remove_from_followers": "从关注者中移除 {name}",
"account.report": "举报 @{name}",
"account.requested": "正在等待对方同意。点击取消发送关注请求",
"account.requested_follow": "{name} 向你发送了关注请求",
+ "account.requests_to_follow_you": "请求关注您",
"account.share": "分享 @{name} 的个人资料",
"account.show_reblogs": "显示来自 @{name} 的转嘟",
"account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}",
@@ -229,6 +239,9 @@
"confirmations.redraft.confirm": "删除并重新编辑",
"confirmations.redraft.message": "确定删除这条嘟文并重写吗?所有相关的喜欢和转嘟都将丢失,嘟文的回复也会失去关联。",
"confirmations.redraft.title": "是否删除并重新编辑嘟文?",
+ "confirmations.remove_from_followers.confirm": "移除关注者",
+ "confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?",
+ "confirmations.remove_from_followers.title": "移除关注者?",
"confirmations.reply.confirm": "回复",
"confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?",
"confirmations.reply.title": "是否重写嘟文?",
@@ -296,7 +309,6 @@
"emoji_button.search_results": "搜索结果",
"emoji_button.symbols": "符号",
"emoji_button.travel": "旅行与地点",
- "empty_column.account_featured": "这个列表为空",
"empty_column.account_hides_collections": "该用户选择不公开此信息",
"empty_column.account_suspended": "账号已被停用",
"empty_column.account_timeline": "这里没有嘟文!",
@@ -329,6 +341,8 @@
"explore.trending_links": "新闻",
"explore.trending_statuses": "嘟文",
"explore.trending_tags": "话题",
+ "featured_carousel.next": "下一步",
+ "featured_carousel.previous": "上一步",
"filter_modal.added.context_mismatch_explanation": "这条过滤规则不适用于你当前访问此嘟文的场景。要在此场景下过滤嘟文,你必须编辑此过滤规则。",
"filter_modal.added.context_mismatch_title": "场景不匹配!",
"filter_modal.added.expired_explanation": "此过滤规则类别已过期,你需要修改到期日期才能应用。",
@@ -381,6 +395,7 @@
"generic.saved": "已保存",
"getting_started.heading": "开始使用",
"hashtag.admin_moderation": "打开 #{name} 的管理界面",
+ "hashtag.browse": "浏览#{hashtag}中的贴子",
"hashtag.column_header.tag_mode.all": "以及 {additional}",
"hashtag.column_header.tag_mode.any": "或是 {additional}",
"hashtag.column_header.tag_mode.none": "而不用 {additional}",
@@ -405,6 +420,7 @@
"hints.profiles.see_more_posts": "在 {domain} 查看更多嘟文",
"hints.threads.replies_may_be_missing": "来自其它实例的回复可能没有完全显示。",
"hints.threads.see_more": "在 {domain} 查看更多回复",
+ "home.column_settings.show_quotes": "显示引用",
"home.column_settings.show_reblogs": "显示转嘟",
"home.column_settings.show_replies": "显示回复",
"home.hide_announcements": "隐藏公告",
@@ -500,7 +516,6 @@
"lists.exclusive": "在主页动态中隐藏列表成员",
"lists.exclusive_hint": "列表成员的嘟文将不会在你的主页动态中显示,以免重复阅读。",
"lists.find_users_to_add": "查找要添加的用户",
- "lists.list_members": "列表成员",
"lists.list_members_count": "{count, plural, other {# 人}}",
"lists.list_name": "列表名称",
"lists.new_list_name": "新列表名称",
@@ -846,7 +861,10 @@
"status.mute_conversation": "关闭此对话的通知",
"status.open": "展开嘟文",
"status.pin": "在个人资料页面置顶",
- "status.pinned": "置顶嘟文",
+ "status.quote_error.filtered": "已根据你的筛选器过滤",
+ "status.quote_error.not_found": "无法显示这篇贴文。",
+ "status.quote_error.rejected": "由于原作者不允许引用转发,无法显示这篇贴文。",
+ "status.quote_error.removed": "该帖子已被作者删除。",
"status.read_more": "查看更多",
"status.reblog": "转嘟",
"status.reblog_private": "以相同可见性转嘟",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 493d06b672..f776439fcc 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -23,7 +23,6 @@
"account.copy": "複製個人檔案連結",
"account.direct": "私下提及 @{name}",
"account.disable_notifications": "當 @{name} 發文時不要再通知我",
- "account.domain_blocked": "網域被封鎖",
"account.edit_profile": "修改個人檔案",
"account.enable_notifications": "當 @{name} 發文時通知我",
"account.endorse": "在個人檔案中推薦對方",
@@ -50,7 +49,6 @@
"account.mute_notifications_short": "靜音通知",
"account.mute_short": "靜音",
"account.muted": "靜音",
- "account.mutual": "互相追蹤",
"account.no_bio": "未提供描述。",
"account.open_original_page": "打開原始頁面",
"account.posts": "帖文",
@@ -86,6 +84,7 @@
"alt_text_modal.cancel": "取消",
"alt_text_modal.done": "完成",
"announcement.announcement": "公告",
+ "annual_report.summary.thanks": "感謝您成為 Mastodon 的一份子!",
"attachments_list.unprocessed": "(未處理)",
"audio.hide": "隱藏音訊",
"block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重你的決定。然而,由於部份伺服器可能以不同方式處理封鎖,因此無法保證一定會成功。公開帖文仍然有機會被未登入的使用者看見。",
@@ -668,7 +667,6 @@
"status.mute_conversation": "靜音對話",
"status.open": "展開文章",
"status.pin": "置頂到資料頁",
- "status.pinned": "置頂文章",
"status.read_more": "閱讀更多",
"status.reblog": "轉推",
"status.reblog_private": "轉推到原讀者",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 0d37e7f6c5..6c83fb55ce 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,6 +1,7 @@
{
"about.blocks": "被限制的伺服器",
"about.contact": "聯絡我們:",
+ "about.default_locale": "預設",
"about.disclaimer": "Mastodon 是一個自由的開源軟體,是 Mastodon gGmbH 之註冊商標。",
"about.domain_blocks.no_reason_available": "無法存取的原因",
"about.domain_blocks.preamble": "Mastodon 基本上允許您瀏覽聯邦宇宙中任何伺服器的內容並與使用者互動。以下是在本伺服器上設定的例外。",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "已受限",
"about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法和此伺服器上的使用者互動與交流。",
"about.domain_blocks.suspended.title": "已停權",
+ "about.language_label": "語言",
"about.not_available": "無法於本伺服器上使用此資訊。",
"about.powered_by": "由 {mastodon} 提供的去中心化社群媒體",
"about.rules": "伺服器規則",
@@ -19,17 +21,21 @@
"account.block_domain": "封鎖來自 {domain} 網域的所有內容",
"account.block_short": "封鎖",
"account.blocked": "已封鎖",
+ "account.blocking": "封鎖中",
"account.cancel_follow_request": "收回跟隨請求",
"account.copy": "複製個人檔案連結",
"account.direct": " @{name}",
"account.disable_notifications": "取消來自 @{name} 嘟文的通知",
- "account.domain_blocked": "已封鎖網域",
+ "account.domain_blocking": "封鎖中網域",
"account.edit_profile": "編輯個人檔案",
"account.enable_notifications": "當 @{name} 嘟文時通知我",
"account.endorse": "於個人檔案推薦對方",
+ "account.familiar_followers_many": "被 {name1}、{name2}、及 {othersCount, plural, other {其他您認識的 # 人}} 跟隨",
+ "account.familiar_followers_one": "被 {name1} 跟隨",
+ "account.familiar_followers_two": "被 {name1} 與 {name2} 跟隨",
"account.featured": "精選內容",
+ "account.featured.accounts": "個人檔案",
"account.featured.hashtags": "主題標籤",
- "account.featured.posts": "嘟文",
"account.featured_tags.last_status_at": "上次嘟文於 {date}",
"account.featured_tags.last_status_never": "沒有嘟文",
"account.follow": "跟隨",
@@ -37,9 +43,11 @@
"account.followers": "跟隨者",
"account.followers.empty": "尚未有人跟隨這位使用者。",
"account.followers_counter": "被 {count, plural, other {{count} 人}}跟隨",
+ "account.followers_you_know_counter": "{counter} 位您知道的跟隨者",
"account.following": "跟隨中",
"account.following_counter": "正在跟隨 {count,plural,other {{count} 人}}",
"account.follows.empty": "這位使用者尚未跟隨任何人。",
+ "account.follows_you": "已跟隨您",
"account.go_to_profile": "前往個人檔案",
"account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
"account.in_memoriam": "謹此悼念。",
@@ -54,14 +62,17 @@
"account.mute_notifications_short": "靜音推播通知",
"account.mute_short": "靜音",
"account.muted": "已靜音",
- "account.mutual": "互相跟隨",
+ "account.muting": "靜音",
+ "account.mutual": "跟隨彼此",
"account.no_bio": "無個人檔案描述。",
"account.open_original_page": "檢視原始頁面",
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文與回覆",
+ "account.remove_from_followers": "自跟隨者中移除 {name}",
"account.report": "檢舉 @{name}",
"account.requested": "正在等候審核。按一下以取消跟隨請求",
"account.requested_follow": "{name} 要求跟隨您",
+ "account.requests_to_follow_you": "要求跟隨您",
"account.share": "分享 @{name} 的個人檔案",
"account.show_reblogs": "顯示來自 @{name} 的轉嘟",
"account.statuses_counter": "{count, plural, other {{count} 則嘟文}}",
@@ -229,6 +240,9 @@
"confirmations.redraft.confirm": "刪除並重新編輯",
"confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。",
"confirmations.redraft.title": "是否刪除並重新編輯該嘟文?",
+ "confirmations.remove_from_followers.confirm": "移除跟隨者",
+ "confirmations.remove_from_followers.message": "{name} 將會停止跟隨您。您確定要繼續嗎?",
+ "confirmations.remove_from_followers.title": "是否移除該跟隨者?",
"confirmations.reply.confirm": "回覆",
"confirmations.reply.message": "回覆嘟文將覆蓋掉您目前正在撰寫之嘟文內容。您是否仍要繼續?",
"confirmations.reply.title": "是否覆寫該嘟文?",
@@ -296,7 +310,9 @@
"emoji_button.search_results": "搜尋結果",
"emoji_button.symbols": "符號",
"emoji_button.travel": "旅遊與地點",
- "empty_column.account_featured": "此列表為空",
+ "empty_column.account_featured.me": "您尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?",
+ "empty_column.account_featured.other": "{acct} 尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?",
+ "empty_column.account_featured_other.unknown": "此帳號尚未有任何精選內容。",
"empty_column.account_hides_collections": "這位使用者選擇不提供此資訊",
"empty_column.account_suspended": "帳號已被停權",
"empty_column.account_timeline": "這裡還沒有嘟文!",
@@ -329,6 +345,11 @@
"explore.trending_links": "最新消息",
"explore.trending_statuses": "嘟文",
"explore.trending_tags": "主題標籤",
+ "featured_carousel.header": "{count, plural, other {# 則釘選嘟文}}",
+ "featured_carousel.next": "下一個",
+ "featured_carousel.post": "嘟文",
+ "featured_carousel.previous": "上一個",
+ "featured_carousel.slide": "{total} 中的 {index}",
"filter_modal.added.context_mismatch_explanation": "此過濾器類別不是用您所存取嘟文的情境。若您想要此嘟文被於此情境被過濾,您必須編輯過濾器。",
"filter_modal.added.context_mismatch_title": "不符合情境!",
"filter_modal.added.expired_explanation": "此過濾器類別已失效,您需要更新過期日期以套用。",
@@ -395,8 +416,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} 名} other {{counter} 名}}參與者",
"hashtag.counter_by_uses": "{count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
"hashtag.counter_by_uses_today": "本日有 {count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
+ "hashtag.feature": "於個人檔案推薦",
"hashtag.follow": "跟隨主題標籤",
"hashtag.mute": "靜音 #{hashtag}",
+ "hashtag.unfeature": "取消於個人檔案推薦",
"hashtag.unfollow": "取消跟隨主題標籤",
"hashtags.and_other": "…及其他 {count, plural, other {# 個}}",
"hints.profiles.followers_may_be_missing": "此個人檔案之跟隨者或有缺失。",
@@ -407,6 +430,7 @@
"hints.profiles.see_more_posts": "於 {domain} 檢視更多嘟文",
"hints.threads.replies_may_be_missing": "來自其他站點之回覆或有缺失。",
"hints.threads.see_more": "於 {domain} 檢視更多回覆",
+ "home.column_settings.show_quotes": "顯示引用嘟文",
"home.column_settings.show_reblogs": "顯示轉嘟",
"home.column_settings.show_replies": "顯示回覆",
"home.hide_announcements": "隱藏公告",
@@ -502,7 +526,6 @@
"lists.exclusive": "於首頁隱藏成員",
"lists.exclusive_hint": "如果某個帳號於此列表中,將自您的首頁時間軸中隱藏此帳號,以防重複見到他們的嘟文。",
"lists.find_users_to_add": "尋找欲新增之使用者",
- "lists.list_members": "列表成員",
"lists.list_members_count": "{count, plural, other {# 個成員}}",
"lists.list_name": "列表名稱",
"lists.new_list_name": "新列表名稱",
@@ -515,7 +538,7 @@
"lists.replies_policy.none": "沒有人",
"lists.save": "儲存",
"lists.search": "搜尋",
- "lists.show_replies_to": "包含來自列表成員的回覆到",
+ "lists.show_replies_to": "包含來自列表成員的回覆至",
"load_pending": "{count, plural, other {# 個新項目}}",
"loading_indicator.label": "正在載入...",
"media_gallery.hide": "隱藏",
@@ -848,7 +871,13 @@
"status.mute_conversation": "靜音對話",
"status.open": "展開此嘟文",
"status.pin": "釘選至個人檔案頁面",
- "status.pinned": "釘選嘟文",
+ "status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏",
+ "status.quote_error.not_found": "這則嘟文無法被顯示。",
+ "status.quote_error.pending_approval": "此嘟文正在等待原作者審核。",
+ "status.quote_error.rejected": "由於原作者不允許引用,此嘟文無法被顯示。",
+ "status.quote_error.removed": "此嘟文已被其作者移除。",
+ "status.quote_error.unauthorized": "由於您未被授權檢視,此嘟文無法被顯示。",
+ "status.quote_post_author": "由 {name} 發嘟",
"status.read_more": "閱讀更多",
"status.reblog": "轉嘟",
"status.reblog_private": "依照原嘟可見性轉嘟",
diff --git a/app/javascript/mastodon/main.jsx b/app/javascript/mastodon/main.tsx
similarity index 51%
rename from app/javascript/mastodon/main.jsx
rename to app/javascript/mastodon/main.tsx
index e7979d56a1..70e6391bee 100644
--- a/app/javascript/mastodon/main.jsx
+++ b/app/javascript/mastodon/main.tsx
@@ -1,23 +1,33 @@
import { createRoot } from 'react-dom/client';
+import { Globals } from '@react-spring/web';
+
import { setupBrowserNotifications } from 'mastodon/actions/notifications';
import Mastodon from 'mastodon/containers/mastodon';
-import { me } from 'mastodon/initial_state';
+import { me, reduceMotion } from 'mastodon/initial_state';
import * as perf from 'mastodon/performance';
import ready from 'mastodon/ready';
import { store } from 'mastodon/store';
-import { isProduction } from './utils/environment';
+import { isProduction, isDevelopment } from './utils/environment';
-/**
- * @returns {Promise}
- */
function main() {
perf.start('main()');
return ready(async () => {
const mountNode = document.getElementById('mastodon');
- const props = JSON.parse(mountNode.getAttribute('data-props'));
+ if (!mountNode) {
+ throw new Error('Mount node not found');
+ }
+ const props = JSON.parse(
+ mountNode.getAttribute('data-props') ?? '{}',
+ ) as Record;
+
+ if (reduceMotion) {
+ Globals.assign({
+ skipAnimation: true,
+ });
+ }
const root = createRoot(mountNode);
root.render( );
@@ -25,8 +35,10 @@ function main() {
if (isProduction() && me && 'serviceWorker' in navigator) {
const { Workbox } = await import('workbox-window');
- const wb = new Workbox('/sw.js');
- /** @type {ServiceWorkerRegistration} */
+ const wb = new Workbox(
+ isDevelopment() ? '/packs-dev/dev-sw.js?dev-sw' : '/sw.js',
+ { type: 'module', scope: '/' },
+ );
let registration;
try {
@@ -35,8 +47,14 @@ function main() {
console.error(err);
}
- if (registration && 'Notification' in window && Notification.permission === 'granted') {
- const registerPushNotifications = await import('mastodon/actions/push_notifications');
+ if (
+ registration &&
+ 'Notification' in window &&
+ Notification.permission === 'granted'
+ ) {
+ const registerPushNotifications = await import(
+ 'mastodon/actions/push_notifications'
+ );
store.dispatch(registerPushNotifications.register());
}
@@ -46,4 +64,5 @@ function main() {
});
}
+// eslint-disable-next-line import/no-default-export
export default main;
diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts
index 55dbbcbb34..60072910d7 100644
--- a/app/javascript/mastodon/models/account.ts
+++ b/app/javascript/mastodon/models/account.ts
@@ -56,7 +56,6 @@ const AccountOtherSettingsFactory = ImmutableRecord({
hide_statuses_count: false,
translatable_private: false,
link_preview: true,
- allow_quote: true,
emoji_reaction_policy: 'allow',
subscription_policy: 'allow',
});
@@ -69,7 +68,6 @@ const AccountServerFeaturesFactory =
ImmutableRecord({
circle: false,
emoji_reaction: false,
- quote: false,
status_reference: false,
});
@@ -178,5 +176,10 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) {
),
note_emojified: emojify(accountJSON.note, emojiMap),
note_plain: unescapeHTML(accountJSON.note),
+ url:
+ accountJSON.url.startsWith('http://') ||
+ accountJSON.url.startsWith('https://')
+ ? accountJSON.url
+ : accountJSON.uri,
});
}
diff --git a/app/javascript/mastodon/models/dropdown_menu.ts b/app/javascript/mastodon/models/dropdown_menu.ts
index ceea9ad4dd..c02f205023 100644
--- a/app/javascript/mastodon/models/dropdown_menu.ts
+++ b/app/javascript/mastodon/models/dropdown_menu.ts
@@ -22,3 +22,29 @@ export type MenuItem =
| LinkMenuItem
| ExternalLinkMenuItem
| null;
+
+export const isMenuItem = (item: unknown): item is MenuItem => {
+ if (item === null) {
+ return true;
+ }
+
+ return typeof item === 'object' && 'text' in item;
+};
+
+export const isActionItem = (item: unknown): item is ActionMenuItem => {
+ if (!item || !isMenuItem(item)) {
+ return false;
+ }
+
+ return 'action' in item;
+};
+
+export const isExternalLinkItem = (
+ item: unknown,
+): item is ExternalLinkMenuItem => {
+ if (!item || !isMenuItem(item)) {
+ return false;
+ }
+
+ return 'href' in item;
+};
diff --git a/app/javascript/mastodon/performance.js b/app/javascript/mastodon/performance.js
index 3bca95e85e..1b2092cfc4 100644
--- a/app/javascript/mastodon/performance.js
+++ b/app/javascript/mastodon/performance.js
@@ -1,24 +1,11 @@
//
// Tools for performance debugging, only enabled in development mode.
// Open up Chrome Dev Tools, then Timeline, then User Timing to see output.
-// Also see config/webpack/loaders/mark.js for the webpack loader marks.
import * as marky from 'marky';
import { isDevelopment } from './utils/environment';
-if (isDevelopment()) {
- if (typeof performance !== 'undefined' && performance.setResourceTimingBufferSize) {
- // Increase Firefox's performance entry limit; otherwise it's capped to 150.
- // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1331135
- performance.setResourceTimingBufferSize(Infinity);
- }
-
- // allows us to easily do e.g. ReactPerf.printWasted() while debugging
- //window.ReactPerf = require('react-addons-perf');
- //window.ReactPerf.start();
-}
-
export function start(name) {
if (isDevelopment()) {
marky.mark(name);
diff --git a/app/javascript/mastodon/polyfills/index.ts b/app/javascript/mastodon/polyfills/index.ts
index 431c5b0f30..c001421c36 100644
--- a/app/javascript/mastodon/polyfills/index.ts
+++ b/app/javascript/mastodon/polyfills/index.ts
@@ -2,10 +2,13 @@
// If there are no polyfills, then this is just Promise.resolve() which means
// it will execute in the same tick of the event loop (i.e. near-instant).
+// eslint-disable-next-line import/extensions -- This file is virtual so it thinks it has an extension
+import 'vite/modulepreload-polyfill';
+
import { loadIntlPolyfills } from './intl';
function importExtraPolyfills() {
- return import(/* webpackChunkName: "extra_polyfills" */ './extra_polyfills');
+ return import('./extra_polyfills');
}
export function loadPolyfills() {
diff --git a/app/javascript/mastodon/polyfills/intl.ts b/app/javascript/mastodon/polyfills/intl.ts
index b825da6621..b1157557e5 100644
--- a/app/javascript/mastodon/polyfills/intl.ts
+++ b/app/javascript/mastodon/polyfills/intl.ts
@@ -54,11 +54,9 @@ async function loadIntlPluralRulesPolyfills(locale: string) {
return;
}
// Load the polyfill 1st BEFORE loading data
+ await import('@formatjs/intl-pluralrules/polyfill-force');
await import(
- /* webpackChunkName: "i18n-pluralrules-polyfill" */ '@formatjs/intl-pluralrules/polyfill-force'
- );
- await import(
- /* webpackChunkName: "i18n-pluralrules-polyfill-[request]" */ `@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}`
+ `../../../../node_modules/@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}.js`
);
}
@@ -70,11 +68,9 @@ async function loadIntlPluralRulesPolyfills(locale: string) {
// }
// // Load the polyfill 1st BEFORE loading data
// await import(
-// /* webpackChunkName: "i18n-relativetimeformat-polyfill" */
// '@formatjs/intl-relativetimeformat/polyfill-force'
// );
// await import(
-// /* webpackChunkName: "i18n-relativetimeformat-polyfill-[request]" */
// `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}`
// );
// }
diff --git a/app/javascript/mastodon/reducers/accounts.ts b/app/javascript/mastodon/reducers/accounts.ts
index 2001353b2e..692c4feec4 100644
--- a/app/javascript/mastodon/reducers/accounts.ts
+++ b/app/javascript/mastodon/reducers/accounts.ts
@@ -4,9 +4,9 @@ import { Map as ImmutableMap } from 'immutable';
import {
followAccountSuccess,
unfollowAccountSuccess,
- importAccounts,
revealAccount,
} from 'mastodon/actions/accounts_typed';
+import { importAccounts } from 'mastodon/actions/importer/accounts';
import type { ApiAccountJSON } from 'mastodon/api_types/accounts';
import { me } from 'mastodon/initial_state';
import type { Account } from 'mastodon/models/account';
diff --git a/app/javascript/mastodon/reducers/accounts_familiar_followers.ts b/app/javascript/mastodon/reducers/accounts_familiar_followers.ts
new file mode 100644
index 0000000000..8d1c994040
--- /dev/null
+++ b/app/javascript/mastodon/reducers/accounts_familiar_followers.ts
@@ -0,0 +1,19 @@
+import { createReducer } from '@reduxjs/toolkit';
+
+import { fetchAccountsFamiliarFollowers } from '../actions/accounts_familiar_followers';
+
+const initialState: Record = {};
+
+export const accountsFamiliarFollowersReducer = createReducer(
+ initialState,
+ (builder) => {
+ builder.addCase(
+ fetchAccountsFamiliarFollowers.fulfilled,
+ (state, { payload }) => {
+ if (payload) {
+ state[payload.id] = payload.accountIds;
+ }
+ },
+ );
+ },
+);
diff --git a/app/javascript/mastodon/reducers/accounts_map.js b/app/javascript/mastodon/reducers/accounts_map.js
deleted file mode 100644
index d1229169cc..0000000000
--- a/app/javascript/mastodon/reducers/accounts_map.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Map as ImmutableMap } from 'immutable';
-
-import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
-import { importAccounts } from '../actions/accounts_typed';
-import { domain } from '../initial_state';
-
-const pattern = new RegExp(`@${domain}$`, 'gi');
-
-export const normalizeForLookup = str =>
- str.toLowerCase().replace(pattern, '');
-
-const initialState = ImmutableMap();
-
-export default function accountsMap(state = initialState, action) {
- switch(action.type) {
- case ACCOUNT_LOOKUP_FAIL:
- return action.error?.response?.status === 404 ? state.set(normalizeForLookup(action.acct), null) : state;
- case importAccounts.type:
- return state.withMutations(map => action.payload.accounts.forEach(account => map.set(normalizeForLookup(account.acct), account.id)));
- default:
- return state;
- }
-}
diff --git a/app/javascript/mastodon/reducers/accounts_map.ts b/app/javascript/mastodon/reducers/accounts_map.ts
new file mode 100644
index 0000000000..820082e3d8
--- /dev/null
+++ b/app/javascript/mastodon/reducers/accounts_map.ts
@@ -0,0 +1,38 @@
+import { createReducer } from '@reduxjs/toolkit';
+import type { UnknownAction } from '@reduxjs/toolkit';
+
+import type { AxiosError } from 'axios';
+
+import { ACCOUNT_LOOKUP_FAIL } from 'mastodon/actions/accounts';
+import { importAccounts } from 'mastodon/actions/importer/accounts';
+import { domain } from 'mastodon/initial_state';
+
+interface AccountLookupFailAction extends UnknownAction {
+ acct: string;
+ error?: AxiosError;
+}
+
+const pattern = new RegExp(`@${domain}$`, 'gi');
+
+export const normalizeForLookup = (str: string) =>
+ str.toLowerCase().replace(pattern, '');
+
+const initialState: Record = {};
+
+export const accountsMapReducer = createReducer(initialState, (builder) => {
+ builder
+ .addCase(importAccounts, (state, action) => {
+ action.payload.accounts.forEach((account) => {
+ state[normalizeForLookup(account.acct)] = account.id;
+ });
+ })
+ .addMatcher(
+ (action: UnknownAction): action is AccountLookupFailAction =>
+ action.type === ACCOUNT_LOOKUP_FAIL,
+ (state, action) => {
+ if (action.error?.response?.status === 404) {
+ state[normalizeForLookup(action.acct)] = null;
+ }
+ },
+ );
+});
diff --git a/app/javascript/mastodon/reducers/contexts.js b/app/javascript/mastodon/reducers/contexts.js
deleted file mode 100644
index 18a519e4ff..0000000000
--- a/app/javascript/mastodon/reducers/contexts.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
-
-import { timelineDelete } from 'mastodon/actions/timelines_typed';
-
-import {
- blockAccountSuccess,
- muteAccountSuccess,
-} from '../actions/accounts';
-import { CONTEXT_FETCH_SUCCESS } from '../actions/statuses';
-import { TIMELINE_UPDATE } from '../actions/timelines';
-import { compareId } from '../compare_id';
-
-const initialState = ImmutableMap({
- inReplyTos: ImmutableMap(),
- replies: ImmutableMap(),
- references: ImmutableMap(),
-});
-
-const normalizeContext = (immutableState, id, ancestors, descendants, references) => immutableState.withMutations(state => {
- state.update('inReplyTos', immutableAncestors => immutableAncestors.withMutations(inReplyTos => {
- state.update('replies', immutableDescendants => immutableDescendants.withMutations(replies => {
- state.update('references', immutableReferences => immutableReferences.withMutations(referencePosts => {
- function addReply({ id, in_reply_to_id }) {
- if (in_reply_to_id && !inReplyTos.has(id)) {
-
- replies.update(in_reply_to_id, ImmutableList(), siblings => {
- const index = siblings.findLastIndex(sibling => compareId(sibling, id) < 0);
- return siblings.insert(index + 1, id);
- });
-
- inReplyTos.set(id, in_reply_to_id);
- }
- }
-
- // We know in_reply_to_id of statuses but `id` itself.
- // So we assume that the status of the id replies to last ancestors.
-
- ancestors.forEach(addReply);
-
- if (ancestors[0]) {
- addReply({ id, in_reply_to_id: ancestors[ancestors.length - 1].id });
- }
-
- descendants.forEach(addReply);
-
- referencePosts.set(id, ImmutableList(references.map((r) => r.id)));
- }));
- }));
- }));
-});
-
-const deleteFromContexts = (immutableState, ids) => immutableState.withMutations(state => {
- state.update('inReplyTos', immutableAncestors => immutableAncestors.withMutations(inReplyTos => {
- state.update('replies', immutableDescendants => immutableDescendants.withMutations(replies => {
- ids.forEach(id => {
- const inReplyToIdOfId = inReplyTos.get(id);
- const repliesOfId = replies.get(id);
- const siblings = replies.get(inReplyToIdOfId);
-
- if (siblings) {
- replies.set(inReplyToIdOfId, siblings.filterNot(sibling => sibling === id));
- }
-
-
- if (repliesOfId) {
- repliesOfId.forEach(reply => inReplyTos.delete(reply));
- }
-
- inReplyTos.delete(id);
- replies.delete(id);
- });
- }));
- }));
-});
-
-const filterContexts = (state, relationship, statuses) => {
- const ownedStatusIds = statuses
- .filter(status => status.get('account') === relationship.id)
- .map(status => status.get('id'));
-
- return deleteFromContexts(state, ownedStatusIds);
-};
-
-const updateContext = (state, status) => {
- if (status.in_reply_to_id) {
- return state.withMutations(mutable => {
- const replies = mutable.getIn(['replies', status.in_reply_to_id], ImmutableList());
-
- mutable.setIn(['inReplyTos', status.id], status.in_reply_to_id);
-
- if (!replies.includes(status.id)) {
- mutable.setIn(['replies', status.in_reply_to_id], replies.push(status.id));
- }
- });
- }
-
- return state;
-};
-
-export default function replies(state = initialState, action) {
- switch(action.type) {
- case blockAccountSuccess.type:
- case muteAccountSuccess.type:
- return filterContexts(state, action.payload.relationship, action.payload.statuses);
- case CONTEXT_FETCH_SUCCESS:
- return normalizeContext(state, action.id, action.ancestors, action.descendants, action.references);
- case timelineDelete.type:
- return deleteFromContexts(state, [action.payload.statusId]);
- case TIMELINE_UPDATE:
- return updateContext(state, action.status);
- default:
- return state;
- }
-}
diff --git a/app/javascript/mastodon/reducers/contexts.ts b/app/javascript/mastodon/reducers/contexts.ts
new file mode 100644
index 0000000000..035e6fa217
--- /dev/null
+++ b/app/javascript/mastodon/reducers/contexts.ts
@@ -0,0 +1,159 @@
+/* eslint-disable @typescript-eslint/no-dynamic-delete */
+import { createReducer } from '@reduxjs/toolkit';
+import type { Draft, UnknownAction } from '@reduxjs/toolkit';
+import type { List as ImmutableList } from 'immutable';
+
+import { timelineDelete } from 'mastodon/actions/timelines_typed';
+import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships';
+import type {
+ ApiStatusJSON,
+ ApiContextJSON,
+} from 'mastodon/api_types/statuses';
+import type { Status } from 'mastodon/models/status';
+
+import { blockAccountSuccess, muteAccountSuccess } from '../actions/accounts';
+import { fetchContext } from '../actions/statuses';
+import { TIMELINE_UPDATE } from '../actions/timelines';
+import { compareId } from '../compare_id';
+
+interface TimelineUpdateAction extends UnknownAction {
+ timeline: string;
+ status: ApiStatusJSON;
+ usePendingItems: boolean;
+}
+
+interface State {
+ inReplyTos: Record;
+ replies: Record;
+ references: Record;
+}
+
+const initialState: State = {
+ inReplyTos: {},
+ replies: {},
+ references: {},
+};
+
+const normalizeContext = (
+ state: Draft,
+ id: string,
+ { ancestors, descendants, references }: ApiContextJSON,
+): void => {
+ const addReply = ({
+ id,
+ in_reply_to_id,
+ }: {
+ id: string;
+ in_reply_to_id?: string;
+ }) => {
+ if (!in_reply_to_id) {
+ return;
+ }
+
+ if (!state.inReplyTos[id]) {
+ const siblings = (state.replies[in_reply_to_id] ??= []);
+ const index = siblings.findIndex((sibling) => compareId(sibling, id) < 0);
+ siblings.splice(index + 1, 0, id);
+ state.inReplyTos[id] = in_reply_to_id;
+ }
+ };
+
+ // We know in_reply_to_id of statuses but `id` itself.
+ // So we assume that the status of the id replies to last ancestors.
+
+ ancestors.forEach(addReply);
+
+ if (ancestors[0]) {
+ addReply({
+ id,
+ in_reply_to_id: ancestors[ancestors.length - 1]?.id,
+ });
+ }
+
+ descendants.forEach(addReply);
+
+ state.references[id] = references.map((r) => r.id);
+};
+
+const deleteFromContexts = (state: Draft, ids: string[]): void => {
+ ids.forEach((id) => {
+ const inReplyToIdOfId = state.inReplyTos[id];
+ const repliesOfId = state.replies[id];
+
+ if (inReplyToIdOfId) {
+ const siblings = state.replies[inReplyToIdOfId];
+
+ if (siblings) {
+ state.replies[inReplyToIdOfId] = siblings.filter(
+ (sibling) => sibling !== id,
+ );
+ }
+ }
+
+ if (repliesOfId) {
+ repliesOfId.forEach((reply) => {
+ delete state.inReplyTos[reply];
+ });
+ }
+
+ delete state.inReplyTos[id];
+ delete state.replies[id];
+ });
+};
+
+const filterContexts = (
+ state: Draft,
+ relationship: ApiRelationshipJSON,
+ statuses: ImmutableList,
+): void => {
+ const ownedStatusIds = statuses
+ .filter((status) => (status.get('account') as string) === relationship.id)
+ .map((status) => status.get('id') as string);
+
+ deleteFromContexts(state, ownedStatusIds.toArray());
+};
+
+const updateContext = (state: Draft, status: ApiStatusJSON): void => {
+ if (!status.in_reply_to_id) {
+ return;
+ }
+
+ const siblings = (state.replies[status.in_reply_to_id] ??= []);
+
+ state.inReplyTos[status.id] = status.in_reply_to_id;
+
+ if (!siblings.includes(status.id)) {
+ siblings.push(status.id);
+ }
+};
+
+export const contextsReducer = createReducer(initialState, (builder) => {
+ builder
+ .addCase(fetchContext.fulfilled, (state, action) => {
+ normalizeContext(state, action.meta.arg.statusId, action.payload.context);
+ })
+ .addCase(blockAccountSuccess, (state, action) => {
+ filterContexts(
+ state,
+ action.payload.relationship,
+ action.payload.statuses as ImmutableList,
+ );
+ })
+ .addCase(muteAccountSuccess, (state, action) => {
+ filterContexts(
+ state,
+ action.payload.relationship,
+ action.payload.statuses as ImmutableList,
+ );
+ })
+ .addCase(timelineDelete, (state, action) => {
+ deleteFromContexts(state, [action.payload.statusId]);
+ })
+ .addMatcher(
+ (action: UnknownAction): action is TimelineUpdateAction =>
+ action.type === TIMELINE_UPDATE,
+ (state, action) => {
+ updateContext(state, action.status);
+ },
+ );
+});
diff --git a/app/javascript/mastodon/reducers/filters.js b/app/javascript/mastodon/reducers/filters.js
index 28f0c3e6e4..566ad0c6ca 100644
--- a/app/javascript/mastodon/reducers/filters.js
+++ b/app/javascript/mastodon/reducers/filters.js
@@ -11,7 +11,6 @@ const normalizeFilter = (state, filter) => {
filter_action: filter.filter_action,
keywords: filter.keywords,
expires_at: filter.expires_at ? Date.parse(filter.expires_at) : null,
- with_quote: filter.with_quote,
});
if (is(state.get(filter.id), normalizedFilter)) {
diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts
index 617d7a08d9..4f725c3f64 100644
--- a/app/javascript/mastodon/reducers/index.ts
+++ b/app/javascript/mastodon/reducers/index.ts
@@ -4,14 +4,15 @@ import { loadingBarReducer } from 'react-redux-loading-bar';
import { combineReducers } from 'redux-immutable';
import { accountsReducer } from './accounts';
-import accounts_map from './accounts_map';
+import { accountsFamiliarFollowersReducer } from './accounts_familiar_followers';
+import { accountsMapReducer } from './accounts_map';
import { alertsReducer } from './alerts';
import announcements from './announcements';
import { antennasReducer } from './antennas';
import { bookmarkCategoriesReducer } from './bookmark_categories';
import { circlesReducer } from './circles';
import { composeReducer } from './compose';
-import contexts from './contexts';
+import { contextsReducer } from './contexts';
import conversations from './conversations';
import custom_emojis from './custom_emojis';
import { dropdownMenuReducer } from './dropdown_menu';
@@ -23,6 +24,7 @@ import { markersReducer } from './markers';
import media_attachments from './media_attachments';
import meta from './meta';
import { modalReducer } from './modal';
+import { navigationReducer } from './navigation';
import { notificationGroupsReducer } from './notification_groups';
import { notificationPolicyReducer } from './notification_policy';
import { notificationRequestsReducer } from './notification_requests';
@@ -53,13 +55,14 @@ const reducers = {
user_lists,
status_lists,
accounts: accountsReducer,
- accounts_map,
+ accounts_map: accountsMapReducer,
+ accounts_familiar_followers: accountsFamiliarFollowersReducer,
statuses,
relationships: relationshipsReducer,
settings,
push_notifications,
server,
- contexts,
+ contexts: contextsReducer,
compose: composeReducer,
search: searchReducer,
media_attachments,
@@ -82,6 +85,7 @@ const reducers = {
reaction_deck,
notificationPolicy: notificationPolicyReducer,
notificationRequests: notificationRequestsReducer,
+ navigation: navigationReducer,
};
// We want the root state to be an ImmutableRecord, which is an object with a defined list of keys,
diff --git a/app/javascript/mastodon/reducers/navigation.ts b/app/javascript/mastodon/reducers/navigation.ts
new file mode 100644
index 0000000000..3f245603a1
--- /dev/null
+++ b/app/javascript/mastodon/reducers/navigation.ts
@@ -0,0 +1,28 @@
+import { createReducer } from '@reduxjs/toolkit';
+
+import {
+ openNavigation,
+ closeNavigation,
+ toggleNavigation,
+} from 'mastodon/actions/navigation';
+
+interface State {
+ open: boolean;
+}
+
+const initialState: State = {
+ open: false,
+};
+
+export const navigationReducer = createReducer(initialState, (builder) => {
+ builder
+ .addCase(openNavigation, (state) => {
+ state.open = true;
+ })
+ .addCase(closeNavigation, (state) => {
+ state.open = false;
+ })
+ .addCase(toggleNavigation, (state) => {
+ state.open = !state.open;
+ });
+});
diff --git a/app/javascript/mastodon/reducers/relationships.ts b/app/javascript/mastodon/reducers/relationships.ts
index dcca11b203..9df81c75ea 100644
--- a/app/javascript/mastodon/reducers/relationships.ts
+++ b/app/javascript/mastodon/reducers/relationships.ts
@@ -24,6 +24,7 @@ import {
pinAccountSuccess,
unpinAccountSuccess,
fetchRelationshipsSuccess,
+ removeAccountFromFollowers,
} from '../actions/accounts_typed';
import {
blockDomainSuccess,
@@ -109,7 +110,8 @@ export const relationshipsReducer: Reducer = (
unmuteAccountSuccess.match(action) ||
pinAccountSuccess.match(action) ||
unpinAccountSuccess.match(action) ||
- isFulfilled(submitAccountNote)(action)
+ isFulfilled(submitAccountNote)(action) ||
+ isFulfilled(removeAccountFromFollowers)(action)
)
return normalizeRelationship(state, action.payload.relationship);
else if (fetchRelationshipsSuccess.match(action))
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 891d6ac994..f2486c1bbb 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -24,6 +24,7 @@ const initialState = ImmutableMap({
home: ImmutableMap({
shows: ImmutableMap({
+ quote: true,
reblog: true,
reply: true,
}),
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 977bbe3e3d..d93e737d38 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -96,6 +96,8 @@ const statusTranslateUndo = (state, id) => {
});
};
+
+/** @type {ImmutableMap} */
const initialState = ImmutableMap();
/** @type {import('@reduxjs/toolkit').Reducer} */
diff --git a/app/javascript/mastodon/reducers/user_lists.js b/app/javascript/mastodon/reducers/user_lists.js
index fecd8a05a4..22e8fc1424 100644
--- a/app/javascript/mastodon/reducers/user_lists.js
+++ b/app/javascript/mastodon/reducers/user_lists.js
@@ -5,9 +5,7 @@ import {
fetchDirectory
} from 'mastodon/actions/directory';
import {
- FEATURED_TAGS_FETCH_REQUEST,
- FEATURED_TAGS_FETCH_SUCCESS,
- FEATURED_TAGS_FETCH_FAIL,
+ fetchFeaturedTags
} from 'mastodon/actions/featured_tags';
import {
@@ -31,6 +29,7 @@ import {
FOLLOW_REQUESTS_EXPAND_FAIL,
authorizeFollowRequestSuccess,
rejectFollowRequestSuccess,
+ fetchEndorsedAccounts,
} from '../actions/accounts';
import {
BLOCKS_FETCH_REQUEST,
@@ -250,21 +249,27 @@ export default function userLists(state = initialState, action) {
case MUTES_FETCH_FAIL:
case MUTES_EXPAND_FAIL:
return state.setIn(['mutes', 'isLoading'], false);
- case FEATURED_TAGS_FETCH_SUCCESS:
- return normalizeFeaturedTags(state, ['featured_tags', action.id], action.tags, action.id);
- case FEATURED_TAGS_FETCH_REQUEST:
- return state.setIn(['featured_tags', action.id, 'isLoading'], true);
- case FEATURED_TAGS_FETCH_FAIL:
- return state.setIn(['featured_tags', action.id, 'isLoading'], false);
default:
- if(fetchDirectory.fulfilled.match(action))
+ if (fetchEndorsedAccounts.fulfilled.match(action))
+ return normalizeList(state, ['featured_accounts', action.meta.arg.accountId], action.payload, undefined);
+ else if (fetchEndorsedAccounts.pending.match(action))
+ return state.setIn(['featured_accounts', action.meta.arg.accountId, 'isLoading'], true);
+ else if (fetchEndorsedAccounts.rejected.match(action))
+ return state.setIn(['featured_accounts', action.meta.arg.accountId, 'isLoading'], false);
+ else if (fetchFeaturedTags.fulfilled.match(action))
+ return normalizeFeaturedTags(state, ['featured_tags', action.meta.arg.accountId], action.payload, action.meta.arg.accountId);
+ else if (fetchFeaturedTags.pending.match(action))
+ return state.setIn(['featured_tags', action.meta.arg.accountId, 'isLoading'], true);
+ else if (fetchFeaturedTags.rejected.match(action))
+ return state.setIn(['featured_tags', action.meta.arg.accountId, 'isLoading'], false);
+ else if (fetchDirectory.fulfilled.match(action))
return normalizeList(state, ['directory'], action.payload.accounts, undefined);
- else if( expandDirectory.fulfilled.match(action))
+ else if (expandDirectory.fulfilled.match(action))
return appendToList(state, ['directory'], action.payload.accounts, undefined);
- else if(fetchDirectory.pending.match(action) ||
+ else if (fetchDirectory.pending.match(action) ||
expandDirectory.pending.match(action))
return state.setIn(['directory', 'isLoading'], true);
- else if(fetchDirectory.rejected.match(action) ||
+ else if (fetchDirectory.rejected.match(action) ||
expandDirectory.rejected.match(action))
return state.setIn(['directory', 'isLoading'], false);
else
diff --git a/app/javascript/mastodon/selectors/accounts.ts b/app/javascript/mastodon/selectors/accounts.ts
index a33daee867..f9ba1a76a6 100644
--- a/app/javascript/mastodon/selectors/accounts.ts
+++ b/app/javascript/mastodon/selectors/accounts.ts
@@ -59,3 +59,16 @@ export const getAccountHidden = createSelector(
return hidden && !(isSelf || followingOrRequested);
},
);
+
+export const getAccountFamiliarFollowers = createSelector(
+ [
+ (state: RootState) => state.accounts,
+ (state: RootState, id: string) => state.accounts_familiar_followers[id],
+ ],
+ (accounts, accounts_familiar_followers) => {
+ if (!accounts_familiar_followers) return null;
+ return accounts_familiar_followers
+ .map((id) => accounts.get(id))
+ .filter((f) => !!f);
+ },
+);
diff --git a/app/javascript/mastodon/selectors/antennas.ts b/app/javascript/mastodon/selectors/antennas.ts
index 7194bf9a19..daa19f7508 100644
--- a/app/javascript/mastodon/selectors/antennas.ts
+++ b/app/javascript/mastodon/selectors/antennas.ts
@@ -1,15 +1,18 @@
-import { createSelector } from '@reduxjs/toolkit';
-import type { Map as ImmutableMap } from 'immutable';
+import type { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import type { Antenna } from 'mastodon/models/antenna';
-import type { RootState } from 'mastodon/store';
+import { createAppSelector } from 'mastodon/store';
-export const getOrderedAntennas = createSelector(
- [(state: RootState) => state.antennas],
- (antennas: ImmutableMap) =>
+const getAntennas = createAppSelector(
+ [(state) => state.antennas],
+ (antennas: ImmutableMap): ImmutableList =>
+ antennas.toList().filter((item: Antenna | null): item is Antenna => !!item),
+);
+
+export const getOrderedAntennas = createAppSelector(
+ [(state) => getAntennas(state)],
+ (antennas) =>
antennas
- .toList()
- .filter((item: Antenna | null) => !!item)
.sort((a: Antenna, b: Antenna) => a.title.localeCompare(b.title))
.toArray(),
);
diff --git a/app/javascript/mastodon/selectors/contexts.ts b/app/javascript/mastodon/selectors/contexts.ts
new file mode 100644
index 0000000000..e17d7e4722
--- /dev/null
+++ b/app/javascript/mastodon/selectors/contexts.ts
@@ -0,0 +1,101 @@
+import { createAppSelector } from 'mastodon/store';
+
+export const getAncestorsIds = createAppSelector(
+ [(_, id: string) => id, (state) => state.contexts.inReplyTos],
+ (statusId, inReplyTos) => {
+ const ancestorsIds: string[] = [];
+
+ let currentId: string | undefined = statusId;
+
+ while (currentId && !ancestorsIds.includes(currentId)) {
+ ancestorsIds.unshift(currentId);
+ currentId = inReplyTos[currentId];
+ }
+
+ return ancestorsIds;
+ },
+);
+
+export const getDescendantsIds = createAppSelector(
+ [
+ (_, id: string) => id,
+ (state) => state.contexts.replies,
+ (state) => state.statuses,
+ ],
+ (statusId, contextReplies, statuses) => {
+ const descendantsIds: string[] = [];
+
+ const visitIds = [statusId];
+
+ while (visitIds.length > 0) {
+ const id = visitIds.pop();
+
+ if (!id) {
+ break;
+ }
+
+ const replies = contextReplies[id];
+
+ if (statusId !== id) {
+ descendantsIds.push(id);
+ }
+
+ if (replies) {
+ replies.toReversed().forEach((replyId) => {
+ if (
+ !visitIds.includes(replyId) &&
+ !descendantsIds.includes(replyId) &&
+ statusId !== replyId
+ ) {
+ visitIds.push(replyId);
+ }
+ });
+ }
+ }
+
+ let insertAt = descendantsIds.findIndex((id) => {
+ const status = statuses.get(id);
+
+ if (!status) {
+ return false;
+ }
+
+ const inReplyToAccountId = status.get('in_reply_to_account_id') as
+ | string
+ | null;
+ const accountId = status.get('account') as string;
+
+ return inReplyToAccountId !== accountId;
+ });
+
+ if (insertAt !== -1) {
+ descendantsIds.forEach((id, idx) => {
+ const status = statuses.get(id);
+
+ if (!status) {
+ return;
+ }
+
+ const inReplyToAccountId = status.get('in_reply_to_account_id') as
+ | string
+ | null;
+ const accountId = status.get('account') as string;
+
+ if (idx > insertAt && inReplyToAccountId === accountId) {
+ descendantsIds.splice(idx, 1);
+ descendantsIds.splice(insertAt, 0, id);
+ insertAt += 1;
+ }
+ });
+ }
+
+ return descendantsIds;
+ },
+);
+
+export const getReferencesIds = createAppSelector(
+ [(_, id: string) => id, (state) => state.contexts.references],
+ (statusId, references) => {
+ return references[statusId] ?? [];
+ },
+);
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index a03ee70e3f..3da829d11d 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -13,41 +13,27 @@ export const makeGetStatus = () => {
[
(state, { id }) => state.getIn(['statuses', id]),
(state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]),
- (state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'quote_id'])]),
- (state, { id }) => state.getIn(['statuses', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'quote_id'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]),
getFilters,
(_, { contextType }) => ['detailed', 'bookmarks', 'favourites'].includes(contextType),
],
- (statusBase, statusReblog, statusQuote, statusReblogQuote, accountBase, accountReblog, filters, warnInsteadOfHide) => {
+ (statusBase, statusReblog, accountBase, accountReblog, filters, warnInsteadOfHide) => {
if (!statusBase || statusBase.get('isLoading')) {
return null;
}
if (statusReblog) {
statusReblog = statusReblog.set('account', accountReblog);
- statusQuote = statusReblogQuote;
} else {
statusReblog = null;
}
- if (isHideItem('blocking_quote') && (statusReblog || statusBase).getIn(['quote', 'quote_muted'])) {
- return null;
- }
-
let filtered = false;
let mediaFiltered = false;
if ((accountReblog || accountBase).get('id') !== me && filters) {
let filterResults = statusReblog?.get('filtered') || statusBase.get('filtered') || ImmutableList();
- const quoteFilterResults = statusQuote?.get('filtered');
- if (quoteFilterResults) {
- const filterWithQuote = quoteFilterResults.some((result) => filters.getIn([result.get('filter'), 'with_quote']));
- if (filterWithQuote) {
- filterResults = filterResults.concat(quoteFilterResults);
- }
- }
if (!warnInsteadOfHide && filterResults.some((result) => filters.getIn([result.get('filter'), 'filter_action']) === 'hide')) {
return null;
@@ -66,7 +52,6 @@ export const makeGetStatus = () => {
return statusBase.withMutations(map => {
map.set('reblog', statusReblog);
- map.set('quote', statusQuote);
map.set('account', accountBase);
map.set('matched_filters', filtered);
map.set('matched_media_filters', mediaFiltered);
diff --git a/app/javascript/mastodon/selectors/lists.ts b/app/javascript/mastodon/selectors/lists.ts
index f93e90ce68..9b79a880a9 100644
--- a/app/javascript/mastodon/selectors/lists.ts
+++ b/app/javascript/mastodon/selectors/lists.ts
@@ -1,15 +1,16 @@
-import { createSelector } from '@reduxjs/toolkit';
-import type { Map as ImmutableMap } from 'immutable';
+import type { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import type { List } from 'mastodon/models/list';
-import type { RootState } from 'mastodon/store';
+import { createAppSelector } from 'mastodon/store';
-export const getOrderedLists = createSelector(
- [(state: RootState) => state.lists],
- (lists: ImmutableMap) =>
- lists
- .toList()
- .filter((item: List | null) => !!item)
- .sort((a: List, b: List) => a.title.localeCompare(b.title))
- .toArray(),
+const getLists = createAppSelector(
+ [(state) => state.lists],
+ (lists: ImmutableMap): ImmutableList =>
+ lists.toList().filter((item: List | null): item is List => !!item),
+);
+
+export const getOrderedLists = createAppSelector(
+ [(state) => getLists(state)],
+ (lists) =>
+ lists.sort((a: List, b: List) => a.title.localeCompare(b.title)).toArray(),
);
diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/sw.js
similarity index 95%
rename from app/javascript/mastodon/service_worker/entry.js
rename to app/javascript/mastodon/service_worker/sw.js
index a4aebcd3a7..9c153b123f 100644
--- a/app/javascript/mastodon/service_worker/entry.js
+++ b/app/javascript/mastodon/service_worker/sw.js
@@ -1,5 +1,4 @@
import { ExpirationPlugin } from 'workbox-expiration';
-import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { CacheFirst } from 'workbox-strategies';
@@ -15,10 +14,9 @@ function fetchRoot() {
return fetch('/', { credentials: 'include', redirect: 'manual' });
}
-precacheAndRoute(self.__WB_MANIFEST);
registerRoute(
- /locale_.*\.js$/,
+ /intl\/.*\.js$/,
new CacheFirst({
cacheName: `${CACHE_NAME_PREFIX}locales`,
plugins: [
diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js
deleted file mode 100644
index f3d61e0195..0000000000
--- a/app/javascript/mastodon/service_worker/web_push_locales.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* @preval */
-
-const fs = require('fs');
-const path = require('path');
-
-const { defineMessages } = require('react-intl');
-
-const messages = defineMessages({
- mentioned_you: { id: 'notification.mentioned_you', defaultMessage: '{name} mentioned you' },
-});
-
-const filtered = {};
-const filenames = fs.readdirSync(path.resolve(__dirname, '../locales'));
-
-filenames.forEach(filename => {
- if (!filename.match(/\.json$/)) return;
-
- const content = fs.readFileSync(path.resolve(__dirname, `../locales/${filename}`), 'utf-8');
- const full = JSON.parse(content);
- const locale = filename.split('.')[0];
-
- filtered[locale] = {
- 'notification.favourite': full['notification.favourite'] || '',
- 'notification.follow': full['notification.follow'] || '',
- 'notification.follow_request': full['notification.follow_request'] || '',
- 'notification.mention': full[messages.mentioned_you.id] || '',
- 'notification.reblog': full['notification.reblog'] || '',
- 'notification.poll': full['notification.poll'] || '',
- 'notification.status': full['notification.status'] || '',
- 'notification.update': full['notification.update'] || '',
- 'notification.admin.sign_up': full['notification.admin.sign_up'] || '',
-
- 'status.show_more': full['status.show_more'] || '',
- 'status.reblog': full['status.reblog'] || '',
- 'status.favourite': full['status.favourite'] || '',
-
- 'notifications.group': full['notifications.group'] || '',
- };
-});
-
-module.exports = JSON.parse(JSON.stringify(filtered));
diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js
index 77187a59ed..88db63280e 100644
--- a/app/javascript/mastodon/service_worker/web_push_notifications.js
+++ b/app/javascript/mastodon/service_worker/web_push_notifications.js
@@ -1,8 +1,9 @@
import { IntlMessageFormat } from 'intl-messageformat';
import { unescape } from 'lodash';
-
-import locales from './web_push_locales';
+// see config/vite/plugins/sw-locales
+// it needs to be updated when new locale keys are used in this file
+import locales from "virtual:mastodon-sw-locales";
const MAX_NOTIFICATIONS = 5;
const GROUP_TAG = 'tag';
diff --git a/app/javascript/mastodon/store/index.ts b/app/javascript/mastodon/store/index.ts
index c2629b0ed7..0b9564c909 100644
--- a/app/javascript/mastodon/store/index.ts
+++ b/app/javascript/mastodon/store/index.ts
@@ -3,6 +3,7 @@ export type { GetState, AppDispatch, RootState } from './store';
export {
createAppAsyncThunk,
+ createAppSelector,
useAppDispatch,
useAppSelector,
} from './typed_functions';
diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index 9fcc90c61b..f0a18a0681 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -1,5 +1,5 @@
import type { GetThunkAPI } from '@reduxjs/toolkit';
-import { createAsyncThunk } from '@reduxjs/toolkit';
+import { createAsyncThunk, createSelector } from '@reduxjs/toolkit';
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
import { useDispatch, useSelector } from 'react-redux';
@@ -24,6 +24,8 @@ export const createAppAsyncThunk = createAsyncThunk.withTypes<{
rejectValue: AsyncThunkRejectValue;
}>();
+export const createAppSelector = createSelector.withTypes();
+
interface AppThunkConfig {
state: RootState;
dispatch: AppDispatch;
diff --git a/app/javascript/mastodon/test_helpers.tsx b/app/javascript/mastodon/test_helpers.tsx
index 8a6f5a3377..ae1f1cd4f6 100644
--- a/app/javascript/mastodon/test_helpers.tsx
+++ b/app/javascript/mastodon/test_helpers.tsx
@@ -3,17 +3,17 @@ import { IntlProvider } from 'react-intl';
import { MemoryRouter } from 'react-router';
import type { RenderOptions } from '@testing-library/react';
-// eslint-disable-next-line import/no-extraneous-dependencies
import { render as rtlRender } from '@testing-library/react';
import { IdentityContext } from './identity_context';
-beforeEach(() => {
- global.requestIdleCallback = jest
- .fn()
- .mockImplementation((fn: () => void) => {
- fn();
- });
+beforeAll(() => {
+ global.requestIdleCallback = vi.fn((cb: IdleRequestCallback) => {
+ // @ts-expect-error IdleRequestCallback expects an argument of type IdleDeadline,
+ // but that doesn't exist in this environment.
+ cb();
+ return 0;
+ });
});
function render(
@@ -46,7 +46,6 @@ function render(
}
// re-export everything
-// eslint-disable-next-line import/no-extraneous-dependencies
export * from '@testing-library/react';
// override render method
diff --git a/app/javascript/mastodon/test_setup.js b/app/javascript/mastodon/test_setup.js
deleted file mode 100644
index 7b0828bfa8..0000000000
--- a/app/javascript/mastodon/test_setup.js
+++ /dev/null
@@ -1 +0,0 @@
-import '@testing-library/jest-dom';
diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts
index b6371499f6..5ccd4d27e3 100644
--- a/app/javascript/mastodon/utils/environment.ts
+++ b/app/javascript/mastodon/utils/environment.ts
@@ -1,7 +1,11 @@
export function isDevelopment() {
- return process.env.NODE_ENV === 'development';
+ if (typeof process !== 'undefined')
+ return process.env.NODE_ENV === 'development';
+ else return import.meta.env.DEV;
}
export function isProduction() {
- return process.env.NODE_ENV === 'production';
+ if (typeof process !== 'undefined')
+ return process.env.NODE_ENV === 'production';
+ else return import.meta.env.PROD;
}
diff --git a/app/javascript/material-icons/400-24px/arrow_downward-fill.svg b/app/javascript/material-icons/400-24px/arrow_downward-fill.svg
new file mode 100644
index 0000000000..a9157219ca
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_downward-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_downward.svg b/app/javascript/material-icons/400-24px/arrow_downward.svg
new file mode 100644
index 0000000000..a9157219ca
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_downward.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_left-fill.svg b/app/javascript/material-icons/400-24px/arrow_left-fill.svg
new file mode 100644
index 0000000000..bf9b2aef3f
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_left-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_left.svg b/app/javascript/material-icons/400-24px/arrow_left.svg
new file mode 100644
index 0000000000..bf9b2aef3f
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_upward-fill.svg b/app/javascript/material-icons/400-24px/arrow_upward-fill.svg
new file mode 100644
index 0000000000..1ec54b0702
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_upward-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_upward.svg b/app/javascript/material-icons/400-24px/arrow_upward.svg
new file mode 100644
index 0000000000..1ec54b0702
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_upward.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/article-fill.svg b/app/javascript/material-icons/400-24px/article-fill.svg
new file mode 100644
index 0000000000..5ea367df92
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/article-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/article.svg b/app/javascript/material-icons/400-24px/article.svg
new file mode 100644
index 0000000000..1265c26dad
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/article.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit_square-fill.svg b/app/javascript/material-icons/400-24px/edit_square-fill.svg
new file mode 100644
index 0000000000..4f931de0f2
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit_square-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit_square.svg b/app/javascript/material-icons/400-24px/edit_square.svg
new file mode 100644
index 0000000000..dccfaa9f3c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit_square.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/pip_exit-fill.svg b/app/javascript/material-icons/400-24px/pip_exit-fill.svg
new file mode 100644
index 0000000000..762c6d6219
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/pip_exit-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/pip_exit.svg b/app/javascript/material-icons/400-24px/pip_exit.svg
new file mode 100644
index 0000000000..7e05b956f6
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/pip_exit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/unfold_less-fill.svg b/app/javascript/material-icons/400-24px/unfold_less-fill.svg
new file mode 100644
index 0000000000..8136d615b2
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/unfold_less-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/unfold_less.svg b/app/javascript/material-icons/400-24px/unfold_less.svg
new file mode 100644
index 0000000000..8136d615b2
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/unfold_less.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/unfold_more-fill.svg b/app/javascript/material-icons/400-24px/unfold_more-fill.svg
new file mode 100644
index 0000000000..3e245d2090
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/unfold_more-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/unfold_more.svg b/app/javascript/material-icons/400-24px/unfold_more.svg
new file mode 100644
index 0000000000..3e245d2090
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/unfold_more.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/README.md b/app/javascript/material-icons/README.md
index 1479cb2255..c583d5ee2c 100644
--- a/app/javascript/material-icons/README.md
+++ b/app/javascript/material-icons/README.md
@@ -1 +1,12 @@
-Files in this directory are Material Symbols icons fetched using the `icons:download` task.
+Files in this directory are Material Symbols icons fetched using the `icons:download` rake task (see `/lib/tasks/icons.rake`).
+
+To add another icon, follow these steps:
+
+- Determine the name of the Material Symbols icon you want to download.
+ You can find a searchable overview of all icons on [https://fonts.google.com/icons].
+ Click on the icon you want to use and find the icon name towards the bottom of the slide-out panel (it'll be something like `icon_name`)
+- Import the icon in your React component using the following format:
+ `import IconName from '@/material-icons/400-24px/icon_name.svg?react';`
+- Run `RAILS_ENV=development rails icons:download` to download any newly imported icons.
+
+The import should now work and the icon should appear when passed to the ` component
diff --git a/app/javascript/styles/contrast/variables.scss b/app/javascript/styles/contrast/variables.scss
index d63512ce43..3127c3ed5f 100644
--- a/app/javascript/styles/contrast/variables.scss
+++ b/app/javascript/styles/contrast/variables.scss
@@ -1,7 +1,7 @@
@use '../mastodon/functions' as *;
// Dependent colors
-$black: #000000;
+$black: #000;
$classic-base-color: hsl(240deg, 16%, 19%);
$classic-primary-color: hsl(240deg, 29%, 70%);
diff --git a/app/javascript/styles/inert.scss b/app/javascript/styles/entrypoints/inert.scss
similarity index 100%
rename from app/javascript/styles/inert.scss
rename to app/javascript/styles/entrypoints/inert.scss
diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/entrypoints/mailer.scss
similarity index 96%
rename from app/javascript/styles/mailer.scss
rename to app/javascript/styles/entrypoints/mailer.scss
index 1e339b4313..7d2a54afae 100644
--- a/app/javascript/styles/mailer.scss
+++ b/app/javascript/styles/entrypoints/mailer.scss
@@ -1,8 +1,8 @@
-@use 'fonts/inter';
+@use '../fonts/inter';
body {
accent-color: #6364ff;
- word-break: break-word;
+ overflow-wrap: anywhere;
margin: 0;
background-color: #f3f2f5;
padding: 0;
@@ -45,7 +45,7 @@ table + p {
.email {
min-width: 280px;
font-family: Inter, 'Lucida Grande', sans-serif;
- word-break: break-word;
+ overflow-wrap: anywhere;
color: #17063b;
background-color: #f3f2f5;
}
@@ -259,7 +259,7 @@ table + p {
.email-header-td {
padding: 16px 32px;
background-color: #1b001f;
- background-image: url('../images/mailer-new/common/header-bg-start.png');
+ background-image: url('../../images/mailer-new/common/header-bg-start.png');
background-position: left top;
background-repeat: repeat;
}
@@ -426,7 +426,7 @@ table + p {
// Body content
.email-body-td {
- background-image: url('../images/mailer-new/common/header-bg-end.png');
+ background-image: url('../../images/mailer-new/common/header-bg-end.png');
background-position: left top;
background-repeat: no-repeat;
}
@@ -922,7 +922,7 @@ table + p {
// Extra content on light purple background
.email-extra-wave {
height: 42px;
- background-image: url('../images/mailer-new/welcome/purple-extra-soft-wave.png');
+ background-image: url('../../images/mailer-new/welcome/purple-extra-soft-wave.png');
background-position: bottom center;
background-repeat: no-repeat;
}
@@ -930,7 +930,7 @@ table + p {
.email-extra-td {
padding: 32px 32px 24px;
background-color: #f0f0ff;
- background-image: url('../images/mailer-new/welcome/purple-extra-soft-spacer.png'); // Using an image to maintain the color even in forced dark modes
+ background-image: url('../../images/mailer-new/welcome/purple-extra-soft-spacer.png'); // Using an image to maintain the color even in forced dark modes
.email-column-td {
padding-top: 8px;
diff --git a/app/javascript/styles/fonts/inter.scss b/app/javascript/styles/fonts/inter.scss
index bb4899b701..816fc75b85 100644
--- a/app/javascript/styles/fonts/inter.scss
+++ b/app/javascript/styles/fonts/inter.scss
@@ -1,8 +1,8 @@
@font-face {
font-family: Inter;
- src: url('../fonts/inter/inter-variable-font-slnt-wght.woff2')
+ src: url('../../fonts/inter/inter-variable-font-slnt-wght.woff2')
format('woff2-variations');
font-weight: 100 900;
font-style: normal;
- mso-generic-font-family: swiss; /* stylelint-disable-line property-no-unknown -- Proprietary property for Outlook on Windows. */
+ mso-generic-font-family: swiss;
}
diff --git a/app/javascript/styles/fonts/roboto-mono.scss b/app/javascript/styles/fonts/roboto-mono.scss
index d07aae07ab..d51cb01c91 100644
--- a/app/javascript/styles/fonts/roboto-mono.scss
+++ b/app/javascript/styles/fonts/roboto-mono.scss
@@ -2,11 +2,10 @@
font-family: mastodon-font-monospace;
src:
local('Roboto Mono'),
- url('../fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
- url('../fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
- url('../fonts/roboto-mono/robotomono-regular-webfont.ttf')
- format('truetype'),
- url('../fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular')
+ url('@/fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
+ url('@/fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
+ url('@/fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
+ url('@/fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular')
format('svg');
font-weight: 400;
font-display: swap;
diff --git a/app/javascript/styles/fonts/roboto.scss b/app/javascript/styles/fonts/roboto.scss
index 2a7b8fb90c..ea4b842b0c 100644
--- a/app/javascript/styles/fonts/roboto.scss
+++ b/app/javascript/styles/fonts/roboto.scss
@@ -2,10 +2,10 @@
font-family: mastodon-font-sans-serif;
src:
local('Roboto Italic'),
- url('../fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
- url('../fonts/roboto/roboto-italic-webfont.woff') format('woff'),
- url('../fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
- url('../fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont')
+ url('@/fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
+ url('@/fonts/roboto/roboto-italic-webfont.woff') format('woff'),
+ url('@/fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
+ url('@/fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont')
format('svg');
font-weight: normal;
font-display: swap;
@@ -16,10 +16,10 @@
font-family: mastodon-font-sans-serif;
src:
local('Roboto Bold'),
- url('../fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
- url('../fonts/roboto/roboto-bold-webfont.woff') format('woff'),
- url('../fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
- url('../fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont')
+ url('@/fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
+ url('@/fonts/roboto/roboto-bold-webfont.woff') format('woff'),
+ url('@/fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
+ url('@/fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont')
format('svg');
font-weight: bold;
font-display: swap;
@@ -30,10 +30,10 @@
font-family: mastodon-font-sans-serif;
src:
local('Roboto Medium'),
- url('../fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
- url('../fonts/roboto/roboto-medium-webfont.woff') format('woff'),
- url('../fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
- url('../fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont')
+ url('@/fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
+ url('@/fonts/roboto/roboto-medium-webfont.woff') format('woff'),
+ url('@/fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
+ url('@/fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont')
format('svg');
font-weight: 500;
font-display: swap;
@@ -44,10 +44,10 @@
font-family: mastodon-font-sans-serif;
src:
local('Roboto'),
- url('../fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
- url('../fonts/roboto/roboto-regular-webfont.woff') format('woff'),
- url('../fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
- url('../fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont')
+ url('@/fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
+ url('@/fonts/roboto/roboto-regular-webfont.woff') format('woff'),
+ url('@/fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
+ url('@/fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont')
format('svg');
font-weight: normal;
font-display: swap;
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 8ca860a86d..ebaac66a5e 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -283,36 +283,6 @@
}
}
-.activity-stream {
- border: 1px solid var(--background-border-color);
-
- &--under-tabs {
- border-top: 0;
- }
-
- .entry {
- background: $white;
-
- .detailed-status.light,
- .more.light,
- .status.light {
- border-bottom-color: lighten($ui-base-color, 8%);
- }
- }
-
- .status.light {
- .status__content {
- color: $primary-text-color;
- }
-
- .display-name {
- strong {
- color: $primary-text-color;
- }
- }
- }
-}
-
.accounts-grid {
.account-grid-card {
.controls {
@@ -416,13 +386,6 @@
}
}
-.mute-modal select {
- border: 1px solid var(--background-border-color);
- background: $simple-background-color
- url("data:image/svg+xml;utf8, ")
- no-repeat right 8px center / auto 16px;
-}
-
.status__wrapper-direct {
background-color: rgba($ui-highlight-color, 0.1);
@@ -567,3 +530,9 @@ a.sparkline {
opacity: 0.25;
}
}
+
+.featured-carousel {
+ background: var(--nested-card-background);
+ border-bottom: var(--nested-card-border);
+ color: var(--nested-card-text);
+}
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index 5a32e2058e..5f0cb661f5 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -5,8 +5,8 @@
$lighten-multiplier: -1
);
-$black: #000000; // Black
-$white: #ffffff; // White
+$black: #000; // Black
+$white: #fff; // White
$blurple-500: #6364ff; // Brand purple
$grey-600: hsl(240deg, 8%, 33%); // Trout
$grey-100: hsl(240deg, 51%, 90%); // Topaz
diff --git a/app/javascript/styles/mastodon/_functions.scss b/app/javascript/styles/mastodon/_functions.scss
index 7190a6233e..a9911edb9d 100644
--- a/app/javascript/styles/mastodon/_functions.scss
+++ b/app/javascript/styles/mastodon/_functions.scss
@@ -1,4 +1,6 @@
@use 'sass:color';
+@use 'sass:string';
+@use 'sass:meta';
$darken-multiplier: -1 !default;
$lighten-multiplier: 1 !default;
@@ -19,3 +21,11 @@ $lighten-multiplier: 1 !default;
$space: hsl
);
}
+
+@function hex-color($color) {
+ @if meta.type-of($color) == 'color' {
+ $color: string.slice(color.ie-hex-str($color), 4);
+ }
+
+ @return '%23' + string.unquote($color);
+}
diff --git a/app/javascript/styles/mastodon/_variables.scss b/app/javascript/styles/mastodon/_variables.scss
index ea2d216441..644a1b3014 100644
--- a/app/javascript/styles/mastodon/_variables.scss
+++ b/app/javascript/styles/mastodon/_variables.scss
@@ -2,8 +2,8 @@
@use 'functions' as *;
// Commonly used web colors
-$black: #000000; // Black
-$white: #ffffff; // White
+$black: #000; // Black
+$white: #fff; // White
$red-600: #b7253d !default; // Deep Carmine
$red-500: #df405a !default; // Cerise
$blurple-600: #563acc; // Iris
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index a310e2ffe7..7df87f95dd 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -1,4 +1,5 @@
@use 'variables' as *;
+@use 'functions' as *;
$maximum-width: 1235px;
$fluid-breakpoint: $maximum-width + 20px;
@@ -107,3 +108,52 @@ $fluid-breakpoint: $maximum-width + 20px;
}
}
}
+
+.rules-languages {
+ display: flex;
+ gap: 1rem;
+ align-items: center;
+ position: relative;
+
+ > label {
+ font-size: 14px;
+ font-weight: 600;
+ color: $primary-text-color;
+ }
+
+ > select {
+ appearance: none;
+ box-sizing: border-box;
+ font-size: 14px;
+ color: $primary-text-color;
+ display: block;
+ width: 100%;
+ outline: 0;
+ font-family: inherit;
+ resize: vertical;
+ background: $ui-base-color;
+ border: 1px solid var(--background-border-color);
+ border-radius: 4px;
+ padding-inline-start: 10px;
+ padding-inline-end: 30px;
+ height: 41px;
+
+ @media screen and (width <= 600px) {
+ font-size: 16px;
+ }
+ }
+
+ &::after {
+ display: block;
+ position: absolute;
+ width: 15px;
+ height: 15px;
+ content: '';
+ mask: url("data:image/svg+xml;utf8, ")
+ no-repeat 50% 50%;
+ mask-size: contain;
+ right: 8px;
+ background-color: lighten($ui-base-color, 12%);
+ pointer-events: none;
+ }
+}
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index c3035f946f..d1795621ae 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -114,15 +114,14 @@ $content-width: 840px;
a {
font-size: 14px;
- display: block;
+ display: flex;
+ align-items: center;
+ gap: 6px;
padding: 15px;
color: $darker-text-color;
text-decoration: none;
transition: all 200ms linear;
transition-property: color, background-color;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
&:hover {
color: $primary-text-color;
@@ -586,16 +585,6 @@ body,
.account-status {
display: flex;
margin-bottom: 10px;
-
- .activity-stream {
- flex: 2 0 0;
- margin-inline-end: 20px;
- max-width: calc(100% - 60px);
-
- .entry {
- border-radius: 4px;
- }
- }
}
.report-status__actions,
@@ -1105,7 +1094,7 @@ a.name-tag,
display: flex;
justify-content: space-between;
margin-bottom: 0;
- word-break: break-word;
+ overflow-wrap: anywhere;
}
&__permissions {
@@ -1135,6 +1124,15 @@ a.name-tag,
}
}
+.rule-actions {
+ display: flex;
+ flex-direction: column;
+
+ a.table-action-link {
+ padding-inline-start: 0;
+ }
+}
+
.dashboard__counters.admin-account-counters {
margin-top: 10px;
}
@@ -1437,8 +1435,8 @@ a.sparkline {
inset-inline-start: 10px;
border-radius: 4px;
background:
- url('../images/warning-stripes.svg') repeat-y left,
- url('../images/warning-stripes.svg') repeat-y right,
+ url('@/images/warning-stripes.svg') repeat-y left,
+ url('@/images/warning-stripes.svg') repeat-y right,
var(--background-color);
}
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 7ae8cb2d08..e123b6276e 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -1,14 +1,6 @@
@use 'variables' as *;
@use 'functions' as *;
-@function hex-color($color) {
- @if type-of($color) == 'color' {
- $color: str-slice(ie-hex-str($color), 4);
- }
-
- @return '%23' + unquote($color);
-}
-
body {
font-family: $font-sans-serif, sans-serif;
background: var(--background-color);
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 9758ecc62c..508468d5b2 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -645,7 +645,7 @@ body > [data-popper-placement] {
align-items: stretch;
&__border {
- background: url('../images/warning-stripes.svg') repeat-y;
+ background: url('@/images/warning-stripes.svg') repeat-y;
width: 5px;
flex: 0 0 auto;
@@ -1436,6 +1436,10 @@ body > [data-popper-placement] {
}
}
+.status--has-quote .quote-inline {
+ display: none;
+}
+
.status {
padding: 16px;
min-height: 54px;
@@ -1469,45 +1473,12 @@ body > [data-popper-placement] {
margin-top: 16px;
}
- &.light {
- .status__relative-time,
- .status__visibility-icon {
- color: $light-text-color;
- }
-
- .status__display-name {
- color: $inverted-text-color;
- }
-
- .display-name {
- color: $light-text-color;
-
- strong {
- color: $inverted-text-color;
- }
- }
-
- .status__content {
- color: $inverted-text-color;
-
- a {
- color: $highlight-text-color;
- }
-
- &__spoiler-link {
- color: $primary-text-color;
- background: $ui-primary-color;
-
- &:hover,
- &:focus {
- background: lighten($ui-primary-color, 8%);
- }
- }
- }
+ &--is-quote {
+ border: none;
}
&--in-thread {
- $thread-margin: 46px + 10px;
+ --thread-margin: calc(46px + 8px);
border-bottom: 0;
@@ -1524,16 +1495,16 @@ body > [data-popper-placement] {
.hashtag-bar,
.content-warning,
.filter-warning {
- margin-inline-start: $thread-margin;
- width: calc(100% - $thread-margin);
+ margin-inline-start: var(--thread-margin);
+ width: calc(100% - var(--thread-margin));
}
.more-from-author {
- width: calc(100% - $thread-margin + 2px);
+ width: calc(100% - var(--thread-margin) + 2px);
}
.status__content__read-more-button {
- margin-inline-start: $thread-margin;
+ margin-inline-start: var(--thread-margin);
}
}
@@ -1943,6 +1914,83 @@ body > [data-popper-placement] {
}
}
+.status__quote {
+ --quote-margin: 36px;
+
+ position: relative;
+ margin-block-start: 16px;
+ margin-inline-start: calc(var(--quote-margin) + var(--thread-margin, 0px));
+ border-radius: 8px;
+ color: var(--nested-card-text);
+ background: var(--nested-card-background);
+ border: var(--nested-card-border);
+
+ @container (width > 460px) {
+ --quote-margin: 56px;
+ }
+}
+
+.status__quote--error {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px;
+ font-size: 15px;
+}
+
+.status__quote-author-button {
+ position: relative;
+ overflow: hidden;
+ display: inline-flex;
+ width: auto;
+ margin-block-start: 10px;
+ padding: 5px 12px;
+ align-items: center;
+ gap: 6px;
+ font-family: inherit;
+ font-size: 14px;
+ font-weight: 700;
+ line-height: normal;
+ letter-spacing: 0;
+ text-decoration: none;
+ color: $highlight-text-color;
+ background: var(--nested-card-background);
+ border: var(--nested-card-border);
+ border-radius: 4px;
+
+ &:active,
+ &:focus,
+ &:hover {
+ border-color: lighten($highlight-text-color, 4%);
+ color: lighten($highlight-text-color, 4%);
+ }
+
+ &:focus-visible {
+ outline: $ui-button-icon-focus-outline;
+ }
+}
+
+.status__quote-icon {
+ position: absolute;
+ inset-block-start: 18px;
+ inset-inline-start: -40px;
+ display: block;
+ width: 26px;
+ height: 26px;
+ padding: 5px;
+ color: #6a49ba;
+ z-index: 10;
+
+ .status__quote--error & {
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ }
+
+ @container (width > 460px) {
+ inset-inline-start: -50px;
+ }
+}
+
.detailed-status__link {
display: inline-flex;
align-items: center;
@@ -2155,12 +2203,28 @@ body > [data-popper-placement] {
display: flex;
gap: 10px;
align-items: center;
+ justify-content: end;
+}
+
+.account__wrapper--with-bio {
+ align-items: start;
+}
+
+.account__info-wrapper {
+ flex: 1 1 auto;
+ min-width: 0;
}
.account__avatar {
display: block;
position: relative;
border-radius: var(--avatar-border-radius);
+ background: var(--surface-background-color);
+
+ @container (width < 360px) {
+ width: 35px !important;
+ height: 35px !important;
+ }
img {
width: 100%;
@@ -2237,6 +2301,37 @@ a .account__avatar {
cursor: pointer;
}
+.avatar-group {
+ display: flex;
+
+ --avatar-height: 28px;
+
+ &:not(.avatar-group--compact) {
+ gap: 8px;
+ flex-wrap: wrap;
+ height: var(--avatar-height);
+ overflow-y: clip;
+ }
+}
+
+.avatar-group--compact {
+ & > :not(:first-child) {
+ margin-inline-start: -12px;
+ }
+
+ & > :first-child {
+ transform: rotate(-4deg);
+ }
+
+ & > :nth-child(2) {
+ transform: rotate(-2deg);
+ }
+
+ .account__avatar {
+ box-shadow: 0 0 0 2px var(--background-color);
+ }
+}
+
.account__avatar-overlay {
position: relative;
@@ -2256,7 +2351,7 @@ a .account__avatar {
}
.account__relationship,
-.explore__suggestions__card {
+.explore-suggestions-card {
.icon-button {
border: 1px solid var(--background-border-color);
border-radius: 4px;
@@ -2348,16 +2443,6 @@ a.account__display-name {
}
}
-.status__avatar {
- width: 46px;
- height: 46px;
-
- &.status__avatar__compact {
- width: 32px;
- height: 32px;
- }
-}
-
.muted {
.status__content,
.status__content p,
@@ -2612,15 +2697,13 @@ a.account__display-name {
min-width: 0;
&__display-name {
- font-size: 16px;
- line-height: 24px;
- letter-spacing: 0.15px;
+ font-size: 14px;
+ line-height: 20px;
font-weight: 500;
.display-name__account {
font-size: 14px;
- line-height: 20px;
- letter-spacing: 0.1px;
+ font-weight: 400;
}
}
}
@@ -2848,6 +2931,7 @@ a.account__display-name {
display: flex;
flex-direction: column;
contain: inline-size layout paint style;
+ container: column / inline-size;
@media screen and (min-width: $no-gap-breakpoint) {
max-width: 600px;
@@ -2856,45 +2940,32 @@ a.account__display-name {
}
}
-$ui-header-height: 55px;
-$ui-header-logo-wordmark-width: 99px;
-
-.ui__header {
- display: none;
- box-sizing: border-box;
- height: $ui-header-height;
+.ui__navigation-bar {
position: sticky;
- top: 0;
- z-index: 3;
- justify-content: space-between;
- align-items: center;
+ bottom: 0;
+ background: var(--background-color);
backdrop-filter: var(--background-filter);
+ border-top: 1px solid var(--background-border-color);
+ z-index: 3;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ padding-bottom: env(safe-area-inset-bottom);
- &__logo {
- display: inline-flex;
- padding: 15px;
- flex-grow: 1;
- flex-shrink: 1;
- overflow: hidden;
- container: header-logo / inline-size;
+ .layout-multiple-columns & {
+ display: none;
+ }
- .logo {
- height: $ui-header-height - 30px;
- width: auto;
- }
+ &__items {
+ display: grid;
+ grid-auto-columns: minmax(0, 1fr);
+ grid-auto-flow: column;
+ padding: 0 16px;
- .logo--wordmark {
- display: none;
- }
-
- @container header-logo (min-width: #{$ui-header-logo-wordmark-width}) {
- .logo--wordmark {
- display: block;
- }
-
- .logo--icon {
- display: none;
- }
+ &.active {
+ flex: 1;
+ padding: 0;
}
@media screen and (width < 330px) {
@@ -2908,25 +2979,42 @@ $ui-header-logo-wordmark-width: 99px;
}
}
- &__links {
+ &__sign-up {
display: flex;
align-items: center;
gap: 8px;
- padding: 0 9px;
+ padding-inline-start: 16px;
overflow: hidden;
flex-shrink: 0;
+ }
- .button {
- flex: 0 0 auto;
+ &__item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background: transparent;
+ border: none;
+ gap: 8px;
+ font-size: 12px;
+ font-weight: 500;
+ line-height: 16px;
+ padding-top: 11px;
+ padding-bottom: 15px;
+ border-top: 4px solid transparent;
+ text-decoration: none;
+ color: inherit;
+
+ &.active {
+ color: $highlight-text-color;
}
- .button-tertiary {
- flex-shrink: 1;
+ &:focus {
+ outline: 0;
}
- .icon {
- width: 22px;
- height: 22px;
+ &:focus-visible {
+ border-top-color: $ui-button-focus-outline-color;
+ border-radius: 0;
}
}
}
@@ -2935,13 +3023,12 @@ $ui-header-logo-wordmark-width: 99px;
background: var(--background-color);
backdrop-filter: var(--background-filter);
position: sticky;
- top: $ui-header-height;
+ top: 0;
z-index: 2;
padding-top: 0;
@media screen and (min-width: $no-gap-breakpoint) {
padding-top: 10px;
- top: 0;
}
}
@@ -3110,8 +3197,11 @@ $ui-header-logo-wordmark-width: 99px;
display: none;
}
- .navigation-panel__legal {
- display: none;
+ .navigation-panel__legal,
+ .navigation-panel__compose-button,
+ .navigation-panel .navigation-bar,
+ .navigation-panel__refresh {
+ display: none !important;
}
}
@@ -3123,7 +3213,7 @@ $ui-header-logo-wordmark-width: 99px;
}
.columns-area__panels {
- min-height: calc(100vh - $ui-header-height);
+ min-height: 100vh;
gap: 0;
}
@@ -3141,28 +3231,18 @@ $ui-header-logo-wordmark-width: 99px;
}
.navigation-panel__sign-in-banner,
- .navigation-panel__logo,
.navigation-panel__banner,
- .getting-started__trends {
+ .getting-started__trends,
+ .navigation-panel__logo {
display: none;
}
.navigation-panel__legal {
margin-bottom: 100px;
}
-
- .column-link__icon {
- font-size: 18px;
- }
}
.layout-single-column {
- .ui__header {
- display: flex;
- background: var(--background-color);
- border-bottom: 1px solid var(--background-border-color);
- }
-
.column > .scrollable,
.tabs-bar__wrapper .column-header,
.tabs-bar__wrapper .column-back-button,
@@ -3186,31 +3266,65 @@ $ui-header-logo-wordmark-width: 99px;
}
}
-@media screen and (max-width: $no-gap-breakpoint - 285px - 1px) {
- $sidebar-width: 55px;
-
+@media screen and (width <= 759px) {
.columns-area__panels__main {
- width: calc(100% - $sidebar-width);
+ width: 100%;
}
.columns-area__panels__pane--navigational {
- min-width: $sidebar-width;
+ position: fixed;
+ inset-inline-end: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ }
- .columns-area__panels__pane__inner {
- width: $sidebar-width;
- }
+ .columns-area__panels__pane--navigational .columns-area__panels__pane__inner {
+ pointer-events: auto;
+ background: var(--background-color);
+ position: fixed;
+ width: 284px + 70px;
+ inset-inline-end: -70px;
+ touch-action: pan-y;
- .column-link span {
- display: none;
- }
+ .navigation-panel {
+ width: 284px;
+ overflow-y: auto;
- .list-panel {
- display: none;
+ &__menu {
+ flex-shrink: 0;
+ min-height: none;
+ overflow: hidden;
+ padding-bottom: calc(65px + env(safe-area-inset-bottom));
+ }
+
+ &__logo {
+ display: none;
+ }
}
}
}
-.explore__suggestions__card {
+.columns-area__panels__pane--navigational {
+ transition: background 500ms;
+}
+
+.columns-area__panels__pane--overlay {
+ pointer-events: auto;
+ background: rgba($base-overlay-background, 0.5);
+
+ .columns-area__panels__pane__inner {
+ box-shadow: var(--dropdown-shadow);
+ }
+}
+
+@media screen and (width >= 760px) {
+ .ui__navigation-bar {
+ display: none;
+ }
+}
+
+.explore-suggestions-card {
padding: 12px 16px;
gap: 8px;
display: flex;
@@ -3222,60 +3336,77 @@ $ui-header-logo-wordmark-width: 99px;
}
&__source {
- padding-inline-start: 60px;
font-size: 13px;
line-height: 16px;
color: $dark-text-color;
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
+
+ @container (width >= 400px) {
+ padding-inline-start: 60px;
+ }
}
&__body {
display: flex;
gap: 12px;
align-items: center;
+ justify-content: end;
+ }
- &__main {
- flex: 1 1 auto;
- display: flex;
- flex-direction: column;
- gap: 8px;
- min-width: 0;
+ &__avatar {
+ flex-shrink: 0;
- &__name-button {
- display: flex;
- align-items: center;
- gap: 8px;
+ @container (width < 360px) {
+ width: 35px !important;
+ height: 35px !important;
+ }
+ }
- &__name {
- display: block;
- color: inherit;
- text-decoration: none;
- flex: 1 1 auto;
- min-width: 0;
- }
+ &__link {
+ flex: 1 1 auto;
+ display: flex;
+ gap: 12px;
+ align-items: center;
+ text-decoration: none;
+ min-width: 0;
- .button {
- min-width: 80px;
- }
-
- .display-name {
- font-size: 15px;
- line-height: 20px;
- color: $secondary-text-color;
-
- strong {
- font-weight: 700;
- }
-
- &__account {
- color: $darker-text-color;
- display: block;
- }
- }
+ &:hover,
+ &:focus-visible {
+ .display-name__html {
+ text-decoration: underline;
}
}
+
+ .display-name {
+ font-size: 15px;
+ line-height: 20px;
+ color: $secondary-text-color;
+
+ strong {
+ font-weight: 700;
+ }
+
+ &__account {
+ color: $darker-text-color;
+ display: block;
+ }
+ }
+ }
+
+ &__actions {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ justify-content: end;
+
+ .button {
+ min-width: 80px;
+ }
+ }
+
+ &__dismiss-button {
+ @container (width < 400px) {
+ display: none;
+ }
}
}
@@ -3436,6 +3567,49 @@ $ui-header-logo-wordmark-width: 99px;
overflow-y: auto;
}
+ &__list-panel {
+ &__header {
+ display: flex;
+ align-items: center;
+ padding-inline-end: 12px;
+
+ .column-link {
+ flex: 1 1 auto;
+ }
+ }
+
+ &__items {
+ padding-inline-start: 24px + 5px;
+
+ .icon {
+ display: none;
+ }
+ }
+ }
+
+ &__compose-button {
+ display: flex;
+ justify-content: flex-start;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-inline-start: 13px - 7px;
+ padding-inline-end: 13px;
+ gap: 5px;
+ margin: 12px;
+ margin-bottom: 4px;
+ border-radius: 6px;
+
+ .icon {
+ width: 24px;
+ height: 24px;
+ }
+ }
+
+ .navigation-bar {
+ padding: 16px;
+ border-bottom: 1px solid var(--background-border-color);
+ }
+
.logo {
height: 30px;
width: auto;
@@ -3468,12 +3642,6 @@ $ui-header-logo-wordmark-width: 99px;
display: none;
}
}
-
- // @media screen and (height <= 1040px) {
- // .list-panel {
- // display: none;
- // }
- // }
}
.navigation-panel,
@@ -3658,7 +3826,8 @@ $ui-header-logo-wordmark-width: 99px;
-webkit-tap-highlight-color: transparent;
}
-.react-toggle-screenreader-only {
+.react-toggle-screenreader-only,
+.sr-only {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
@@ -4400,6 +4569,10 @@ a.status-card {
&:focus-visible {
outline: $ui-button-icon-focus-outline;
}
+
+ .logo {
+ height: 24px;
+ }
}
.column-header__back-button + &__title {
@@ -4483,10 +4656,6 @@ a.status-card {
&:hover {
color: $primary-text-color;
}
-
- .icon-sliders {
- transform: rotate(60deg);
- }
}
&:disabled {
@@ -5071,19 +5240,6 @@ a.status-card {
}
}
-.relationship-tag {
- color: $white;
- margin-bottom: 4px;
- display: block;
- background-color: rgba($black, 0.45);
- backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
- font-size: 11px;
- text-transform: uppercase;
- font-weight: 700;
- padding: 2px 6px;
- border-radius: 4px;
-}
-
.setting-toggle {
display: flex;
align-items: center;
@@ -6003,6 +6159,7 @@ a.status-card {
position: absolute;
top: 0;
bottom: 0;
+ transform: scaleX(var(--text-x-direction));
&:hover,
&:focus,
@@ -6011,11 +6168,11 @@ a.status-card {
}
}
-.media-modal__nav--left {
+.media-modal__nav--prev {
inset-inline-start: 0;
}
-.media-modal__nav--right {
+.media-modal__nav--next {
inset-inline-end: 0;
}
@@ -6029,7 +6186,9 @@ a.status-card {
.picture-in-picture__footer {
border-radius: 0;
+ border: none;
background: transparent;
+ backdrop-filter: none;
padding: 16px;
.icon-button {
@@ -6497,6 +6656,7 @@ a.status-card {
@media screen and (max-width: $no-columns-breakpoint) {
border-bottom: 0;
border-radius: 4px 4px 0 0;
+ padding-bottom: env(safe-area-inset-bottom);
}
}
@@ -6808,55 +6968,37 @@ a.status-card {
}
.actions-modal {
+ border-radius: 8px 8px 0 0;
+ background: var(--dropdown-background-color);
+ backdrop-filter: var(--background-filter);
+ border-color: var(--dropdown-border-color);
+ box-shadow: var(--dropdown-shadow);
max-height: 80vh;
max-width: 80vw;
- .actions-modal__item-label {
- font-weight: 500;
- }
-
ul {
overflow-y: auto;
- flex-shrink: 0;
- max-height: 80vh;
+ padding-bottom: 8px;
+ }
- &.with-status {
- max-height: calc(80vh - 75px);
- }
+ a,
+ button {
+ color: inherit;
+ display: flex;
+ padding: 16px;
+ font-size: 15px;
+ line-height: 21px;
+ background: transparent;
+ border: none;
+ align-items: center;
+ text-decoration: none;
+ width: 100%;
+ box-sizing: border-box;
- li:empty {
- margin: 0;
- }
-
- li:not(:empty) {
- a {
- color: $primary-text-color;
- display: flex;
- padding: 12px 16px;
- font-size: 15px;
- align-items: center;
- text-decoration: none;
-
- &,
- button {
- transition: none;
- }
-
- &.active,
- &:hover,
- &:active,
- &:focus {
- &,
- button {
- background: $ui-highlight-color;
- color: $primary-text-color;
- }
- }
-
- button:first-child {
- margin-inline-end: 10px;
- }
- }
+ &:hover,
+ &:active,
+ &:focus {
+ background: var(--dropdown-border-color);
}
}
}
@@ -6874,24 +7016,6 @@ a.status-card {
}
}
}
-
- select {
- appearance: none;
- box-sizing: border-box;
- font-size: 14px;
- color: $inverted-text-color;
- display: inline-block;
- width: auto;
- outline: 0;
- font-family: inherit;
- background: $simple-background-color
- url("data:image/svg+xml;utf8, ")
- no-repeat right 8px center / auto 16px;
- border: 1px solid darken($simple-background-color, 14%);
- border-radius: 4px;
- padding: 6px 10px;
- padding-inline-end: 30px;
- }
}
.report-modal__target {
@@ -6991,7 +7115,8 @@ a.status-card {
pointer-events: none;
}
-.media-gallery__alt__label {
+.media-gallery__alt__label,
+.relationship-tag {
display: block;
text-align: center;
color: $white;
@@ -7012,6 +7137,11 @@ a.status-card {
}
}
+.relationship-tag {
+ text-transform: uppercase;
+ cursor: default;
+}
+
.media-gallery__alt__popover {
background: rgba($black, 0.65);
backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
@@ -7315,18 +7445,81 @@ a.status-card {
}
.audio-player {
- overflow: hidden;
box-sizing: border-box;
+ container: audio-player / inline-size;
position: relative;
- background: var(--background-color);
- border-radius: 8px;
- padding-bottom: 44px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
width: 100%;
+ aspect-ratio: 16 / 9;
+ color: var(--player-foreground-color);
+ background: var(--player-background-color, var(--background-color));
+ border-radius: 8px;
outline: 1px solid var(--media-outline-color);
outline-offset: -1px;
+ &__controls {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ height: 100%;
+
+ &__play {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+
+ .player-button {
+ position: absolute;
+ top: 50%;
+ inset-inline-start: 50%;
+ transform: translate(-50%, -50%);
+ }
+
+ .icon {
+ filter: var(--overlay-icon-shadow);
+ }
+ }
+
+ .player-button {
+ display: inline-block;
+ outline: 0;
+ padding: 5px;
+ flex: 0 0 auto;
+ background: transparent;
+ border: 0;
+ color: var(--player-foreground-color);
+ opacity: 0.75;
+
+ .icon {
+ width: 48px;
+ height: 48px;
+ }
+
+ &:active,
+ &:hover,
+ &:focus {
+ opacity: 1;
+ }
+ }
+ }
+
+ &__visualizer {
+ width: 100%;
+ max-width: 200px;
+ }
+
+ .video-player__seek {
+ position: absolute;
+ inset: 0 0 auto;
+ height: 24px;
+ z-index: 1; /* Ensure this renders on top of audio player controls */
+ }
+
&.inactive {
- audio,
+ .video-player__seek,
+ .audio-player__controls,
.video-player__controls {
visibility: hidden;
}
@@ -7343,6 +7536,13 @@ a.status-card {
opacity: 0.2;
}
+ .video-player__seek__progress,
+ .video-player__seek__handle,
+ .video-player__volume__current,
+ .video-player__volume__handle {
+ background-color: var(--player-accent-color);
+ }
+
.video-player__buttons button,
.video-player__buttons a {
color: currentColor;
@@ -7362,6 +7562,13 @@ a.status-card {
color: currentColor;
}
+ @container audio-player (max-width: 400px) {
+ .video-player__time,
+ .player-button.video-player__download__icon {
+ display: none;
+ }
+ }
+
.video-player__seek::before,
.video-player__seek__buffer,
.video-player__seek__progress {
@@ -7429,10 +7636,12 @@ a.status-card {
);
padding: 0 15px;
opacity: 0;
+ pointer-events: none;
transition: opacity 0.1s ease;
&.active {
opacity: 1;
+ pointer-events: auto;
}
}
@@ -7518,6 +7727,7 @@ a.status-card {
background: transparent;
border: 0;
color: rgba($white, 0.75);
+ font-weight: 500;
&:active,
&:hover,
@@ -8237,8 +8447,11 @@ noscript {
&__info {
position: absolute;
- top: 10px;
- inset-inline-start: 10px;
+ top: 20px;
+ inset-inline-end: 20px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 2px;
}
&__image {
@@ -8265,7 +8478,6 @@ noscript {
.avatar {
display: block;
flex: 0 0 auto;
- width: 94px;
.account__avatar {
background: var(--background-color);
@@ -8499,6 +8711,20 @@ noscript {
font-weight: 400;
margin-bottom: 10px;
+ &__loading-indicator-wrapper {
+ position: relative;
+ height: 37px;
+
+ .loading-indicator {
+ left: 10px;
+ }
+
+ .circular-progress {
+ width: 14px;
+ height: 14px;
+ }
+ }
+
label {
display: block;
font-size: 12px;
@@ -8533,6 +8759,20 @@ noscript {
}
}
}
+
+ &__familiar-followers {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-block: 16px;
+ color: $darker-text-color;
+
+ a:any-link {
+ font-weight: 500;
+ text-decoration: none;
+ color: $primary-text-color;
+ }
+ }
}
.account__contents {
@@ -8757,7 +8997,7 @@ noscript {
}
a {
- word-break: break-word;
+ overflow-wrap: anywhere;
}
}
}
@@ -8826,6 +9066,8 @@ noscript {
position: absolute;
bottom: 3px;
inset-inline-end: 0;
+ display: flex;
+ align-items: center;
}
}
@@ -8978,23 +9220,33 @@ noscript {
bottom: 20px;
inset-inline-end: 20px;
width: 300px;
+ box-shadow: var(--dropdown-shadow);
&__footer {
border-radius: 0 0 4px 4px;
- background: lighten($ui-base-color, 4%);
- padding: 10px;
- padding-top: 12px;
+ background: var(--modal-background-variant-color);
+ backdrop-filter: var(--background-filter);
+ border: 1px solid var(--modal-border-color);
+ border-top: 0;
+ padding: 12px;
display: flex;
justify-content: space-between;
}
&__header {
border-radius: 4px 4px 0 0;
- background: lighten($ui-base-color, 4%);
- padding: 10px;
+ background: var(--modal-background-variant-color);
+ backdrop-filter: var(--background-filter);
+ border: 1px solid var(--modal-border-color);
+ border-bottom: 0;
+ padding: 12px;
display: flex;
justify-content: space-between;
+ .icon-button {
+ padding: 6px;
+ }
+
&__account {
display: flex;
text-decoration: none;
@@ -9002,7 +9254,7 @@ noscript {
}
.account__avatar {
- margin-inline-end: 10px;
+ margin-inline-end: 8px;
}
.display-name {
@@ -9029,30 +9281,36 @@ noscript {
}
.picture-in-picture-placeholder {
+ border-radius: 8px;
box-sizing: border-box;
- border: 2px dashed var(--background-border-color);
- background: $base-shadow-color;
+ border: 1px dashed var(--background-border-color);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
- margin-top: 10px;
- font-size: 16px;
+ margin-top: 16px;
+ font-size: 15px;
+ line-height: 21px;
font-weight: 500;
cursor: pointer;
- color: $darker-text-color;
+ color: $dark-text-color;
aspect-ratio: 16 / 9;
.icon {
- width: 24px;
- height: 24px;
- margin-bottom: 10px;
+ width: 48px;
+ height: 48px;
+ margin-bottom: 8px;
}
&:hover,
- &:focus,
- &:active {
- border-color: lighten($ui-base-color, 12%);
+ &:active,
+ &:focus {
+ color: $darker-text-color;
+ }
+
+ &:focus-visible {
+ outline: $ui-button-focus-outline;
+ border-color: transparent;
}
}
@@ -10126,6 +10384,8 @@ noscript {
border: 1px solid var(--background-border-color);
color: $highlight-text-color;
cursor: pointer;
+ width: 100%;
+ background: none;
}
&.active &__title {
@@ -10691,7 +10951,8 @@ noscript {
padding: 15px;
display: flex;
align-items: center;
- gap: 8px;
+ flex-wrap: wrap;
+ gap: 4px 8px;
.logo {
width: 16px;
@@ -10785,12 +11046,6 @@ noscript {
overflow: hidden;
container-type: inline-size;
- @container (width < 350px) {
- &__header time {
- display: none;
- }
- }
-
&__header {
display: flex;
flex-direction: column;
@@ -10822,7 +11077,8 @@ noscript {
&__label {
display: flex;
- gap: 8px;
+ flex-wrap: wrap;
+ gap: 2px 8px;
font-size: 15px;
line-height: 22px;
color: $darker-text-color;
@@ -10840,6 +11096,13 @@ noscript {
time {
color: $dark-text-color;
}
+
+ @container (width < 350px) {
+ time,
+ &-separator {
+ display: none;
+ }
+ }
}
}
@@ -10857,14 +11120,6 @@ noscript {
}
}
- &__avatar-group {
- display: flex;
- gap: 8px;
- height: 28px;
- overflow-y: hidden;
- flex-wrap: wrap;
- }
-
.status {
padding: 0;
border: 0;
@@ -10887,6 +11142,10 @@ noscript {
bdi {
color: $darker-text-color;
}
+
+ .account__avatar {
+ flex: 0 0 auto;
+ }
}
&__content {
@@ -10895,6 +11154,7 @@ noscript {
line-height: 22px;
color: $darker-text-color;
-webkit-line-clamp: 4;
+ line-clamp: 4;
-webkit-box-orient: vertical;
max-height: none;
overflow: hidden;
@@ -11050,7 +11310,15 @@ noscript {
color: inherit;
}
- &__number {
+ &__numbers,
+ &__familiar-followers {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 2px 10px;
+ }
+
+ &__numbers {
font-size: 15px;
line-height: 22px;
color: $secondary-text-color;
@@ -11198,9 +11466,9 @@ noscript {
.content-warning {
display: block;
box-sizing: border-box;
- background: rgba($ui-highlight-color, 0.05);
- color: $secondary-text-color;
- border: 1px solid rgba($ui-highlight-color, 0.15);
+ background: var(--nested-card-background);
+ color: var(--nested-card-text);
+ border: var(--nested-card-border);
border-radius: 8px;
padding: 8px (5px + 8px);
position: relative;
@@ -11338,3 +11606,52 @@ noscript {
.lists-scrollable {
min-height: 50vh;
}
+
+.featured-carousel {
+ background: var(--surface-background-color);
+ overflow: hidden;
+ flex-shrink: 0;
+ border-bottom: 1px solid var(--background-border-color);
+ touch-action: pan-y;
+
+ &__slides {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: start;
+ }
+
+ &__slide {
+ flex: 0 0 auto;
+ flex-basis: 100%;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .status {
+ border-bottom: 0;
+ }
+
+ &__header {
+ padding: 8px 16px;
+ color: $darker-text-color;
+ inset-inline-end: 0;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ }
+
+ &__title {
+ flex-grow: 1;
+ font-size: 12px;
+ font-weight: 500;
+ text-transform: uppercase;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .icon {
+ width: 16px;
+ height: 16px;
+ }
+ }
+}
diff --git a/app/javascript/styles/mastodon/css_variables.scss b/app/javascript/styles/mastodon/css_variables.scss
index d1a357f730..c7223136ae 100644
--- a/app/javascript/styles/mastodon/css_variables.scss
+++ b/app/javascript/styles/mastodon/css_variables.scss
@@ -20,13 +20,17 @@
--on-surface-color: #{color.adjust($ui-base-color, $alpha: -0.5)};
--avatar-border-radius: 8px;
--media-outline-color: #{rgba(#fcf8ff, 0.15)};
- --overlay-icon-shadow: drop-shadow(0 0 8px #{rgba($base-shadow-color, 0.25)});
+ --overlay-icon-shadow: drop-shadow(0 0 8px #{rgba($base-shadow-color, 0.35)});
--error-background-color: #{darken($error-red, 16%)};
--error-active-background-color: #{darken($error-red, 12%)};
--on-error-color: #fff;
--rich-text-container-color: rgba(87, 24, 60, 100%);
--rich-text-text-color: rgba(255, 175, 212, 100%);
--rich-text-decorations-color: rgba(128, 58, 95, 100%);
+ --nested-card-background: color(from #{$ui-highlight-color} srgb r g b / 5%);
+ --nested-card-text: #{$secondary-text-color};
+ --nested-card-border: 1px solid
+ color(from #{$ui-highlight-color} srgb r g b / 15%);
--input-placeholder-color: #{$dark-text-color};
--input-background-color: var(--surface-variant-background-color);
--on-input-color: #{$secondary-text-color};
@@ -37,3 +41,12 @@
--detail-content-emoji-size: 24px;
--detail-content-line-height: 24px;
}
+
+body {
+ // Variable for easily inverting directional UI elements,
+ --text-x-direction: 1;
+
+ &.rtl {
+ --text-x-direction: -1;
+ }
+}
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index f8eaa43a20..0eb8ce092b 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -405,7 +405,7 @@ code {
max-width: 100%;
height: auto;
border-radius: var(--avatar-border-radius);
- background: url('images/void.png');
+ background: url('@/images/void.png');
&[src$='missing.png'] {
visibility: hidden;
@@ -1168,7 +1168,7 @@ code {
&__type {
color: $darker-text-color;
- word-break: break-word;
+ overflow-wrap: anywhere;
}
}
@@ -1456,6 +1456,12 @@ code {
display: block;
color: $primary-text-color;
}
+
+ .icon {
+ vertical-align: -5px;
+ width: 20px;
+ height: 20px;
+ }
}
}
@@ -1490,6 +1496,12 @@ code {
&:last-child {
margin-inline-end: 0;
+
+ .icon {
+ vertical-align: -5px;
+ width: 20px;
+ height: 20px;
+ }
}
}
}
diff --git a/app/javascript/styles/mastodon/rich_text.scss b/app/javascript/styles/mastodon/rich_text.scss
index 38bfbe3dca..b8f5cc83eb 100644
--- a/app/javascript/styles/mastodon/rich_text.scss
+++ b/app/javascript/styles/mastodon/rich_text.scss
@@ -71,7 +71,7 @@
content: '';
width: 24px;
height: 20px;
- mask-image: url('../images/quote.svg');
+ mask-image: url('@/images/quote.svg');
background-color: var(--rich-text-decorations-color);
position: absolute;
inset-inline-start: 0;
diff --git a/app/javascript/types/emoji_picker.d.ts b/app/javascript/types/emoji_picker.d.ts
new file mode 100644
index 0000000000..4649da7ed0
--- /dev/null
+++ b/app/javascript/types/emoji_picker.d.ts
@@ -0,0 +1,8 @@
+declare module 'emoji-mart' {
+ interface PickerProps {
+ sheetColumns?: number;
+ sheetRows?: number;
+ }
+}
+
+export {};
diff --git a/app/javascript/types/image.d.ts b/app/javascript/types/image.d.ts
index 8a08eca9f6..aa4b6ded71 100644
--- a/app/javascript/types/image.d.ts
+++ b/app/javascript/types/image.d.ts
@@ -1,3 +1,5 @@
+///
+
/* eslint-disable import/no-default-export */
declare module '*.avif' {
const path: string;
@@ -19,23 +21,6 @@ declare module '*.png' {
export default path;
}
-declare module '*.svg' {
- const path: string;
- export default path;
-}
-
-declare module '*.svg?react' {
- import type React from 'react';
-
- interface SVGPropsWithTitle extends React.SVGProps {
- title?: string;
- }
-
- const ReactComponent: React.FC;
-
- export default ReactComponent;
-}
-
declare module '*.webp' {
const path: string;
export default path;
diff --git a/app/javascript/types/virtual.d.ts b/app/javascript/types/virtual.d.ts
new file mode 100644
index 0000000000..9f5b890b8a
--- /dev/null
+++ b/app/javascript/types/virtual.d.ts
@@ -0,0 +1,59 @@
+declare module 'virtual:mastodon-emoji-compressed' {
+ import type { BaseEmoji, EmojiData, NimbleEmojiIndex } from 'emoji-mart';
+ import type { Category, Data, Emoji } from 'emoji-mart/dist-es/utils/data';
+ /*
+ * The 'search' property, although not defined in the [`Emoji`]{@link node_modules/@types/emoji-mart/dist-es/utils/data.d.ts#Emoji} type,
+ * is used in the application.
+ * This could be due to an oversight by the library maintainer.
+ * The `search` property is defined and used [here]{@link node_modules/emoji-mart/dist/utils/data.js#uncompress}.
+ */
+ export type Search = string;
+ /*
+ * The 'skins' property does not exist in the application data.
+ * This could be a potential area of refactoring or error handling.
+ * The non-existence of 'skins' property is evident at [this location]{@link app/javascript/mastodon/features/emoji/emoji_compressed.js:121}.
+ */
+ type Skins = null;
+
+ type Filename = string;
+ type UnicodeFilename = string;
+ export type FilenameData = [
+ filename: Filename,
+ unicodeFilename?: UnicodeFilename,
+ ][];
+ export type ShortCodesToEmojiDataKey =
+ | EmojiData['id']
+ | BaseEmoji['native']
+ | keyof NimbleEmojiIndex['emojis'];
+
+ type SearchData = [
+ BaseEmoji['native'],
+ Emoji['short_names'],
+ Search,
+ Emoji['unified'],
+ ];
+
+ export type ShortCodesToEmojiData = Record<
+ ShortCodesToEmojiDataKey,
+ [FilenameData, SearchData]
+ >;
+ type EmojisWithoutShortCodes = FilenameData;
+
+ type EmojiCompressed = [
+ ShortCodesToEmojiData,
+ Skins,
+ Category[],
+ Data['aliases'],
+ EmojisWithoutShortCodes,
+ Data,
+ ];
+
+ /*
+ * `emoji_compressed.js` uses `babel-plugin-preval`, which makes it difficult to convert to TypeScript.
+ * As a temporary solution, we are allowing a default export here to apply the TypeScript type `EmojiCompressed` to the JS file export.
+ * - {@link app/javascript/mastodon/features/emoji/emoji_compressed.js}
+ */
+ declare const emojiCompressed: EmojiCompressed;
+
+ export default emojiCompressed; // eslint-disable-line import/no-default-export
+}
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index d726f5e68c..4e3171a898 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -57,6 +57,8 @@ class ActivityPub::Activity
ActivityPub::Activity::Remove
when 'Move'
ActivityPub::Activity::Move
+ when 'QuoteRequest'
+ ActivityPub::Activity::QuoteRequest
end
end
end
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 6cdc21ce75..e18d9bc55c 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -54,10 +54,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
@silenced_account_ids = []
@params = {}
@raw_mention_uris = []
+ @quote = nil
+ @quote_uri = nil
process_status_params
process_sensitive_words
process_tags
+ process_quote
process_audience
return nil unless valid_status?
@@ -68,6 +71,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
attach_tags(@status)
attach_mentions(@status)
attach_counts(@status)
+ attach_quote(@status)
end
resolve_thread(@status)
@@ -94,7 +98,14 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def process_status_params
- @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object, account: @account, friend_domain: friend_domain?)
+ @status_parser = ActivityPub::Parser::StatusParser.new(
+ @json,
+ followers_collection: @account.followers_url,
+ actor_uri: ActivityPub::TagManager.instance.uri_for(@account),
+ object: @object,
+ account: @account,
+ friend_domain: friend_domain?
+ )
attachment_ids = process_attachments.take(Status::MEDIA_ATTACHMENTS_LIMIT_FROM_REMOTE).map(&:id)
@@ -118,6 +129,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
media_attachment_ids: attachment_ids,
ordered_media_attachment_ids: attachment_ids,
poll: process_poll,
+ quote_approval_policy: @status_parser.quote_policy,
}
end
@@ -258,6 +270,18 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
end
+ def attach_quote(status)
+ return if @quote.nil?
+
+ @quote.status = status
+ @quote.save
+
+ embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @json['context'])
+ ActivityPub::VerifyQuoteService.new.call(@quote, fetchable_quoted_uri: @quote_uri, prefetched_quoted_object: embedded_quote, request_id: @options[:request_id])
+ rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
+ ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, @quote.id, @quote_uri, { 'request_id' => @options[:request_id] })
+ end
+
def process_tags
return if @object['tag'].nil?
@@ -272,6 +296,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
end
+ def process_quote
+ @quote_uri = @status_parser.quote_uri
+ return if @quote_uri.blank?
+
+ approval_uri = @status_parser.quote_approval_uri
+ approval_uri = nil if unsupported_uri_scheme?(approval_uri)
+ @quote = Quote.new(account: @account, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?)
+ end
+
def process_hashtag(tag)
return if tag['name'].blank? || ignore_hashtags?
@@ -555,7 +588,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def related_to_local_activity?
fetch? || followed_by_local_accounts? || requested_through_relay? ||
- responds_to_followed_account? || addresses_local_accounts? || quote_local? || free_friend_domain?
+ responds_to_followed_account? || addresses_local_accounts? || free_friend_domain?
end
def responds_to_followed_account?
@@ -618,17 +651,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def process_references!
- ProcessReferencesService.call_service_without_error(@status, [], reference_uris, [quote].compact)
- end
-
- def quote_local?
- url = quote
-
- if url.present?
- ActivityPub::TagManager.instance.uri_to_resource(url, Status)&.local?
- else
- false
- end
+ ProcessReferencesService.call_service_without_error(@status, [], reference_uris)
end
def free_friend_domain?
@@ -640,15 +663,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def quote
- @quote ||= quote_from_tags || @object['quote'] || @object['quoteUrl'] || @object['quoteURL'] || @object['_misskey_quote']
- end
-
- def quote_from_tags
- return @quote_from_tags if defined?(@quote_from_tags)
-
- hit_tag = as_array(@object['tag']).detect do |tag|
- equals_or_includes?(tag['type'], 'Link') && LINK_MEDIA_TYPES.include?(tag['mediaType']) && tag['href'].present?
- end
- @quote_from_tags = hit_tag && hit_tag['href']
+ @quote ||= @status_parser.quote_uri
end
end
diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb
index 4f02d83427..75b5ed66fe 100644
--- a/app/lib/activitypub/activity/delete.rb
+++ b/app/lib/activitypub/activity/delete.rb
@@ -7,7 +7,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
elsif object_uri == ActivityPub::TagManager::COLLECTIONS[:public]
delete_friend
else
- delete_note
+ delete_object
end
end
@@ -19,7 +19,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
end
end
- def delete_note
+ def delete_object
return if object_uri.nil?
with_redis_lock("delete_status_in_progress:#{object_uri}", raise_on_failure: false) do
@@ -34,17 +34,38 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
Tombstone.find_or_create_by(uri: object_uri, account: @account)
end
- @status = Status.find_by(uri: object_uri, account: @account)
- @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
-
- return if @status.nil?
-
- forwarder.forward! if forwarder.forwardable?
- forward_for_conversation
- delete_now!
+ case @object['type']
+ when 'QuoteAuthorization'
+ revoke_quote
+ when 'Note', 'Question'
+ delete_status
+ else
+ delete_status || revoke_quote
+ end
end
end
+ def delete_status
+ @status = Status.find_by(uri: object_uri, account: @account)
+ @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
+
+ return if @status.nil?
+
+ forwarder.forward! if forwarder.forwardable?
+ forward_for_conversation
+ RemoveStatusService.new.call(@status, redraft: false)
+
+ true
+ end
+
+ def revoke_quote
+ @quote = Quote.find_by(approval_uri: object_uri, quoted_account: @account)
+ return if @quote.nil?
+
+ ActivityPub::Forwarder.new(@account, @json, @quote.status).forward!
+ @quote.reject!
+ end
+
def forward_for_conversation
return unless @status.conversation.present? && @status.conversation.local? && @json['signature'].present?
@@ -59,8 +80,4 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
def forwarder
@forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
end
-
- def delete_now!
- RemoveStatusService.new.call(@status, redraft: false)
- end
end
diff --git a/app/lib/activitypub/activity/quote_request.rb b/app/lib/activitypub/activity/quote_request.rb
new file mode 100644
index 0000000000..2de03df158
--- /dev/null
+++ b/app/lib/activitypub/activity/quote_request.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity
+ include Payloadable
+
+ def perform
+ return if non_matching_uri_hosts?(@account.uri, @json['id'])
+
+ quoted_status = status_from_uri(object_uri)
+ return if quoted_status.nil? || !quoted_status.account.local? || !quoted_status.distributable?
+
+ # For now, we don't support being quoted by external servers
+ reject_quote_request!(quoted_status)
+ end
+
+ private
+
+ def reject_quote_request!(quoted_status)
+ quote = Quote.new(
+ quoted_status: quoted_status,
+ quoted_account: quoted_status.account,
+ status: Status.new(account: @account, uri: @json['instrument']),
+ account: @account,
+ activity_uri: @json['id']
+ )
+ json = Oj.dump(serialize_payload(quote, ActivityPub::RejectQuoteRequestSerializer))
+ ActivityPub::DeliveryWorker.perform_async(json, quoted_status.account_id, @account.inbox_url)
+ end
+end
diff --git a/app/lib/activitypub/case_transform.rb b/app/lib/activitypub/case_transform.rb
index 33e3ef6fac..05b9477907 100644
--- a/app/lib/activitypub/case_transform.rb
+++ b/app/lib/activitypub/case_transform.rb
@@ -5,7 +5,6 @@ module ActivityPub::CaseTransform
NO_CONVERT_VALUES = %w(
_misskey_content
_misskey_license
- _misskey_quote
).freeze
def camel_lower_cache
diff --git a/app/lib/activitypub/parser/custom_emoji_parser.rb b/app/lib/activitypub/parser/custom_emoji_parser.rb
index fcd36b0395..3cfcc6212e 100644
--- a/app/lib/activitypub/parser/custom_emoji_parser.rb
+++ b/app/lib/activitypub/parser/custom_emoji_parser.rb
@@ -29,7 +29,7 @@ class ActivityPub::Parser::CustomEmojiParser
nil
end
- def is_sensitive # rubocop:disable Naming/PredicateName
+ def is_sensitive # rubocop:disable Naming/PredicatePrefix
@json['isSensitive'].presence || false
end
diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb
index 56b8b23f84..1f4f43cb15 100644
--- a/app/lib/activitypub/parser/media_attachment_parser.rb
+++ b/app/lib/activitypub/parser/media_attachment_parser.rb
@@ -15,13 +15,15 @@ class ActivityPub::Parser::MediaAttachmentParser
end
def remote_url
- Addressable::URI.parse(@json['url'])&.normalize&.to_s
+ url = Addressable::URI.parse(url_to_href(@json['url']))&.normalize&.to_s
+ url unless unsupported_uri_scheme?(url)
rescue Addressable::URI::InvalidURIError
nil
end
def thumbnail_remote_url
- Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
+ url = Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
+ url unless unsupported_uri_scheme?(url)
rescue Addressable::URI::InvalidURIError
nil
end
@@ -41,7 +43,7 @@ class ActivityPub::Parser::MediaAttachmentParser
end
def file_content_type
- @json['mediaType']
+ @json['mediaType'] || url_to_media_type(@json['url'])
end
private
diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb
index 1968f18468..ce7057b88a 100644
--- a/app/lib/activitypub/parser/status_parser.rb
+++ b/app/lib/activitypub/parser/status_parser.rb
@@ -11,6 +11,7 @@ class ActivityPub::Parser::StatusParser
# @param [Hash] json
# @param [Hash] options
# @option options [String] :followers_collection
+ # @option options [String] :actor_uri
# @option options [Hash] :object
def initialize(json, **options)
@json = json
@@ -33,7 +34,10 @@ class ActivityPub::Parser::StatusParser
end
def url
- url_to_href(@object['url'], 'text/html') if @object['url'].present?
+ return if @object['url'].blank?
+
+ url = url_to_href(@object['url'], 'text/html')
+ url unless unsupported_uri_scheme?(url)
end
def text
@@ -128,15 +132,69 @@ class ActivityPub::Parser::StatusParser
end
def favourites_count
- @object.dig(:likes, :totalItems)
+ @object['likes']['totalItems'] if @object.is_a?(Hash) && @object['likes'].is_a?(Hash)
end
def reblogs_count
- @object.dig(:shares, :totalItems)
+ @object['shares']['totalItems'] if @object.is_a?(Hash) && @object['shares'].is_a?(Hash)
+ end
+
+ def quote_policy
+ flags = 0
+ policy = @object.dig('interactionPolicy', 'canQuote')
+ return flags if policy.blank?
+
+ flags |= quote_subpolicy(policy['automaticApproval'])
+ flags <<= 16
+ flags |= quote_subpolicy(policy['manualApproval'])
+
+ flags
+ end
+
+ def quote_uri
+ %w(quote _misskey_quote quoteUrl quoteUri).filter_map do |key|
+ value_or_id(as_array(@object[key]).first)
+ end.first
+ end
+
+ def legacy_quote?
+ !@object.key?('quote')
+ end
+
+ # The inlined quote; out of the attributes we support, only `https://w3id.org/fep/044f#quote` explicitly supports inlined objects
+ def quoted_object
+ as_array(@object['quote']).first
+ end
+
+ def quote_approval_uri
+ as_array(@object['quoteAuthorization']).first
end
private
+ def quote_subpolicy(subpolicy)
+ flags = 0
+
+ allowed_actors = as_array(subpolicy)
+ allowed_actors.uniq!
+
+ flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] if allowed_actors.delete('as:Public') || allowed_actors.delete('Public') || allowed_actors.delete('https://www.w3.org/ns/activitystreams#Public')
+ flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] if allowed_actors.delete(@options[:followers_collection])
+ # TODO: we don't actually store that collection URI
+ # flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:followed]
+
+ # Remove the special-meaning actor URI
+ allowed_actors.delete(@options[:actor_uri])
+
+ # Tagged users are always allowed, so remove them
+ allowed_actors -= as_array(@object['tag']).filter_map { |tag| tag['href'] if equals_or_includes?(tag['type'], 'Mention') }
+
+ # Any unrecognized actor is marked as unknown
+ flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:unknown] unless allowed_actors.empty?
+
+ flags
+ end
+
def raw_language_code
if content_language_map?
@object['contentMap'].keys.first
diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb
index 3ead162ec3..99d85a262a 100644
--- a/app/lib/activitypub/tag_manager.rb
+++ b/app/lib/activitypub/tag_manager.rb
@@ -4,6 +4,7 @@ require 'singleton'
class ActivityPub::TagManager
include Singleton
+ include JsonLdHelper
include RoutingHelper
CONTEXT = 'https://www.w3.org/ns/activitystreams'
@@ -17,7 +18,7 @@ class ActivityPub::TagManager
end
def url_for(target)
- return target.url if target.respond_to?(:local?) && !target.local?
+ return unsupported_uri_scheme?(target.url) ? nil : target.url if target.respond_to?(:local?) && !target.local?
return unless target.respond_to?(:object_type)
diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
index 84ffc41d74..91ab4f836d 100644
--- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb
+++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
@@ -119,10 +119,6 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
end
def redis_info
- @redis_info ||= if redis.is_a?(Redis::Namespace)
- redis.redis.info
- else
- redis.info
- end
+ @redis_info ||= redis.info
end
end
diff --git a/app/lib/admin/metrics/dimension/space_usage_dimension.rb b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
index 0d3fd8db33..3fd8d86856 100644
--- a/app/lib/admin/metrics/dimension/space_usage_dimension.rb
+++ b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
@@ -58,11 +58,7 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension
end
def redis_info
- @redis_info ||= if redis.is_a?(Redis::Namespace)
- redis.redis.info
- else
- redis.info
- end
+ @redis_info ||= redis.info
end
def search_size
diff --git a/app/lib/admin/system_check/elasticsearch_check.rb b/app/lib/admin/system_check/elasticsearch_check.rb
index ea35807f30..11a1abd777 100644
--- a/app/lib/admin/system_check/elasticsearch_check.rb
+++ b/app/lib/admin/system_check/elasticsearch_check.rb
@@ -16,8 +16,8 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
def pass?
return true unless Chewy.enabled?
- running_version.present? && compatible_version? && cluster_health['status'] == 'green' && indexes_match? && preset_matches?
- rescue Faraday::ConnectionFailed, Elasticsearch::Transport::Transport::Error
+ running_version.present? && compatible_version? && cluster_health['status'] == 'green' && indexes_match? && specifications_match? && preset_matches?
+ rescue Faraday::ConnectionFailed, Elasticsearch::Transport::Transport::Error, HTTPClient::KeepAliveDisconnected
false
end
@@ -38,6 +38,11 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
:elasticsearch_index_mismatch,
mismatched_indexes.join(' ')
)
+ elsif !specifications_match?
+ Admin::SystemCheck::Message.new(
+ :elasticsearch_analysis_index_mismatch,
+ mismatched_specifications_indexes.join(' ')
+ )
elsif cluster_health['status'] == 'red'
Admin::SystemCheck::Message.new(:elasticsearch_health_red)
elsif cluster_health['number_of_nodes'] < 2 && es_preset != 'single_node_cluster'
@@ -49,7 +54,7 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
else
Admin::SystemCheck::Message.new(:elasticsearch_preset, nil, 'https://docs.joinmastodon.org/admin/elasticsearch/#scaling')
end
- rescue Faraday::ConnectionFailed, Elasticsearch::Transport::Transport::Error
+ rescue Faraday::ConnectionFailed, Elasticsearch::Transport::Transport::Error, HTTPClient::KeepAliveDisconnected
Admin::SystemCheck::Message.new(:elasticsearch_running_check)
end
@@ -111,10 +116,20 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
end
end
+ def mismatched_specifications_indexes
+ @mismatched_specifications_indexes ||= INDEXES.filter_map do |klass|
+ klass.base_name if klass.specification.changed?
+ end
+ end
+
def indexes_match?
mismatched_indexes.empty?
end
+ def specifications_match?
+ mismatched_specifications_indexes.empty?
+ end
+
def es_preset
ENV.fetch('ES_PRESET', 'single_node_cluster')
end
diff --git a/app/lib/admin/system_check/media_privacy_check.rb b/app/lib/admin/system_check/media_privacy_check.rb
index 378a8ce294..01bffcff16 100644
--- a/app/lib/admin/system_check/media_privacy_check.rb
+++ b/app/lib/admin/system_check/media_privacy_check.rb
@@ -13,7 +13,7 @@ class Admin::SystemCheck::MediaPrivacyCheck < Admin::SystemCheck::BaseCheck
end
def message
- Admin::SystemCheck::Message.new(@failure_message, @failure_value, @failure_action, true)
+ Admin::SystemCheck::Message.new(@failure_message, @failure_value, @failure_action, critical: true)
end
private
diff --git a/app/lib/admin/system_check/message.rb b/app/lib/admin/system_check/message.rb
index ad8d4b6073..60f14bdfd9 100644
--- a/app/lib/admin/system_check/message.rb
+++ b/app/lib/admin/system_check/message.rb
@@ -3,7 +3,7 @@
class Admin::SystemCheck::Message
attr_reader :key, :value, :action, :critical
- def initialize(key, value = nil, action = nil, critical = false)
+ def initialize(key, value = nil, action = nil, critical: false)
@key = key
@value = value
@action = action
diff --git a/app/lib/admin/system_check/sidekiq_process_check.rb b/app/lib/admin/system_check/sidekiq_process_check.rb
index 4c7447e4da..d0c57159a2 100644
--- a/app/lib/admin/system_check/sidekiq_process_check.rb
+++ b/app/lib/admin/system_check/sidekiq_process_check.rb
@@ -9,6 +9,7 @@ class Admin::SystemCheck::SidekiqProcessCheck < Admin::SystemCheck::BaseCheck
scheduler
ingress
perishable
+ fasp
).freeze
def skip?
diff --git a/app/lib/admin/system_check/software_version_check.rb b/app/lib/admin/system_check/software_version_check.rb
index e5cacfe354..014c3290d8 100644
--- a/app/lib/admin/system_check/software_version_check.rb
+++ b/app/lib/admin/system_check/software_version_check.rb
@@ -13,7 +13,7 @@ class Admin::SystemCheck::SoftwareVersionCheck < Admin::SystemCheck::BaseCheck
def message
if software_updates.any?(&:urgent?)
- Admin::SystemCheck::Message.new(:software_version_critical_check, nil, admin_software_updates_path, true)
+ Admin::SystemCheck::Message.new(:software_version_critical_check, nil, admin_software_updates_path, critical: true)
elsif software_updates.any?(&:patch_type?)
Admin::SystemCheck::Message.new(:software_version_patch_check, nil, admin_software_updates_path)
else
diff --git a/app/lib/chewy_config.rb b/app/lib/chewy_config.rb
index 9de69b5147..a01cc41597 100644
--- a/app/lib/chewy_config.rb
+++ b/app/lib/chewy_config.rb
@@ -8,7 +8,7 @@ class ChewyConfig
class InvalidElasticSearchVersionError < Mastodon::Error; end
- CONFIG_VERSION = 1
+ CONFIG_VERSION = 2
def initialize
custom_config_file = Rails.root.join('.elasticsearch.yml')
diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb
index c57b926604..1c52be7781 100644
--- a/app/lib/entity_cache.rb
+++ b/app/lib/entity_cache.rb
@@ -26,7 +26,9 @@ class EntityCache
uncached_ids << shortcode unless cached.key?(to_key(:emoji, shortcode, domain))
end
- unless uncached_ids.empty?
+ if uncached_ids.empty?
+ uncached = {}
+ else
uncached = CustomEmoji.enabled.where(shortcode: shortcodes, domain: domain).index_by(&:shortcode)
uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) }
end
diff --git a/app/lib/fasp/request.rb b/app/lib/fasp/request.rb
index 2addbe8502..6ea837b89c 100644
--- a/app/lib/fasp/request.rb
+++ b/app/lib/fasp/request.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class Fasp::Request
+ COVERED_COMPONENTS = %w(@method @target-uri content-digest).freeze
+
def initialize(provider)
@provider = provider
end
@@ -23,54 +25,36 @@ class Fasp::Request
url = @provider.url(path)
body = body.present? ? body.to_json : ''
headers = request_headers(verb, url, body)
- response = HTTP.headers(headers).send(verb, url, body:)
+ key = Linzer.new_ed25519_key(@provider.server_private_key_pem, @provider.remote_identifier)
+ response = HTTP
+ .headers(headers)
+ .use(http_signature: { key:, covered_components: COVERED_COMPONENTS })
+ .send(verb, url, body:)
+
validate!(response)
response.parse if response.body.present?
end
- def request_headers(verb, url, body = '')
- result = {
+ def request_headers(_verb, _url, body = '')
+ {
'accept' => 'application/json',
+ 'content-type' => 'application/json',
'content-digest' => content_digest(body),
}
- result.merge(signature_headers(verb, url, result))
end
def content_digest(body)
"sha-256=:#{OpenSSL::Digest.base64digest('sha256', body || '')}:"
end
- def signature_headers(verb, url, headers)
- linzer_request = Linzer.new_request(verb, url, {}, headers)
- message = Linzer::Message.new(linzer_request)
- key = Linzer.new_ed25519_key(@provider.server_private_key_pem, @provider.remote_identifier)
- signature = Linzer.sign(key, message, %w(@method @target-uri content-digest))
- Linzer::Signer.send(:populate_parameters, key, {})
-
- signature.to_h
- end
-
def validate!(response)
content_digest_header = response.headers['content-digest']
raise Mastodon::SignatureVerificationError, 'content-digest missing' if content_digest_header.blank?
raise Mastodon::SignatureVerificationError, 'content-digest does not match' if content_digest_header != content_digest(response.body)
+ raise Mastodon::SignatureVerificationError, 'signature-input is missing' if response.headers['signature-input'].blank?
- signature_input = response.headers['signature-input']&.encode('UTF-8')
- raise Mastodon::SignatureVerificationError, 'signature-input is missing' if signature_input.blank?
-
- linzer_response = Linzer.new_response(
- response.body,
- response.status,
- {
- 'content-digest' => content_digest_header,
- 'signature-input' => signature_input,
- 'signature' => response.headers['signature'],
- }
- )
- message = Linzer::Message.new(linzer_response)
key = Linzer.new_ed25519_public_key(@provider.provider_public_key_pem)
- signature = Linzer::Signature.build(message.headers)
- Linzer.verify(key, message, signature)
+ Linzer.verify!(response, key:)
end
end
diff --git a/app/lib/http_signature_draft.rb b/app/lib/http_signature_draft.rb
index fc0d498b29..cb794b223a 100644
--- a/app/lib/http_signature_draft.rb
+++ b/app/lib/http_signature_draft.rb
@@ -6,14 +6,13 @@
class HttpSignatureDraft
REQUEST_TARGET = '(request-target)'
- def initialize(keypair, key_id, full_path: true)
+ def initialize(keypair, key_id)
@keypair = keypair
@key_id = key_id
- @full_path = full_path
end
def request_target(verb, url)
- if url.query.nil? || !@full_path
+ if url.query.nil?
"#{verb} #{url.path}"
else
"#{verb} #{url.path}?#{url.query}"
diff --git a/app/lib/redis_connection.rb b/app/lib/redis_connection.rb
index 24e376e6a5..2db5b794fd 100644
--- a/app/lib/redis_connection.rb
+++ b/app/lib/redis_connection.rb
@@ -15,7 +15,7 @@ class RedisConnection
def pool_size
if Sidekiq.server?
- Sidekiq[:concurrency]
+ Sidekiq.default_configuration[:concurrency]
else
ENV['MAX_THREADS'] || 5
end
@@ -29,12 +29,7 @@ class RedisConnection
end
def connection
- namespace = config[:namespace]
- if namespace.present?
- Redis::Namespace.new(namespace, redis: raw_connection)
- else
- raw_connection
- end
+ raw_connection
end
private
diff --git a/app/lib/request.rb b/app/lib/request.rb
index ad39f928db..4858aa4bc2 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -20,7 +20,7 @@ class PerOperationWithDeadline < HTTP::Timeout::PerOperation
@read_deadline = options.fetch(:read_deadline, READ_DEADLINE)
end
- def connect(socket_class, host, port, nodelay = false)
+ def connect(socket_class, host, port, nodelay = false) # rubocop:disable Style/OptionalBooleanParameter
@socket = socket_class.open(host, port)
@socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
end
@@ -75,7 +75,6 @@ class Request
@url = Addressable::URI.parse(url).normalize
@http_client = options.delete(:http_client)
@allow_local = options.delete(:allow_local)
- @full_path = !options.delete(:omit_query_string)
@options = {
follow: {
max_hops: 3,
@@ -102,7 +101,7 @@ class Request
key_id = ActivityPub::TagManager.instance.key_uri_for(actor)
keypair = sign_with.present? ? OpenSSL::PKey::RSA.new(sign_with) : actor.keypair
- @signing = HttpSignatureDraft.new(keypair, key_id, full_path: @full_path)
+ @signing = HttpSignatureDraft.new(keypair, key_id)
self
end
diff --git a/app/lib/signed_request.rb b/app/lib/signed_request.rb
new file mode 100644
index 0000000000..066411c680
--- /dev/null
+++ b/app/lib/signed_request.rb
@@ -0,0 +1,270 @@
+# frozen_string_literal: true
+
+class SignedRequest
+ include DomainControlHelper
+
+ EXPIRATION_WINDOW_LIMIT = 12.hours
+ CLOCK_SKEW_MARGIN = 1.hour
+
+ class HttpSignature
+ REQUIRED_PARAMETERS = %w(keyId signature).freeze
+
+ def initialize(request)
+ @request = request
+ end
+
+ def key_id
+ signature_params['keyId']
+ end
+
+ def missing_signature_parameters
+ REQUIRED_PARAMETERS if REQUIRED_PARAMETERS.any? { |p| signature_params[p].blank? }
+ end
+
+ def algorithm_supported?
+ %w(rsa-sha256 hs2019).include?(signature_algorithm)
+ end
+
+ def verified?(actor)
+ signature = Base64.decode64(signature_params['signature'])
+ compare_signed_string = build_signed_string(include_query_string: true)
+
+ return true unless verify_signature(actor, signature, compare_signed_string).nil?
+
+ compare_signed_string = build_signed_string(include_query_string: false)
+ return true unless verify_signature(actor, signature, compare_signed_string).nil?
+
+ false
+ end
+
+ def created_time
+ if signature_algorithm == 'hs2019' && signature_params['created'].present?
+ Time.at(signature_params['created'].to_i).utc
+ elsif @request.headers['Date'].present?
+ Time.httpdate(@request.headers['Date']).utc
+ end
+ rescue ArgumentError => e
+ raise Mastodon::SignatureVerificationError, "Invalid Date header: #{e.message}"
+ end
+
+ def expires_time
+ Time.at(signature_params['expires'].to_i).utc if signature_params['expires'].present?
+ rescue ArgumentError => e
+ raise Mastodon::SignatureVerificationError, "Invalid Date header: #{e.message}"
+ end
+
+ def verify_signature_strength!
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the Date header or (created) pseudo-header to be signed' unless signed_headers.include?('date') || signed_headers.include?('(created)')
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the Digest header or (request-target) pseudo-header to be signed' unless signed_headers.include?(HttpSignatureDraft::REQUEST_TARGET) || signed_headers.include?('digest')
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the Host header to be signed when doing a GET request' if @request.get? && !signed_headers.include?('host')
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the Digest header to be signed when doing a POST request' if @request.post? && !signed_headers.include?('digest')
+ end
+
+ def verify_body_digest!
+ return unless signed_headers.include?('digest')
+ raise Mastodon::SignatureVerificationError, 'Digest header missing' unless @request.headers.key?('Digest')
+
+ digests = @request.headers['Digest'].split(',').map { |digest| digest.split('=', 2) }.map { |key, value| [key.downcase, value] }
+ sha256 = digests.assoc('sha-256')
+ raise Mastodon::SignatureVerificationError, "Mastodon only supports SHA-256 in Digest header. Offered algorithms: #{digests.map(&:first).join(', ')}" if sha256.nil?
+
+ return if body_digest == sha256[1]
+
+ digest_size = begin
+ Base64.strict_decode64(sha256[1].strip).length
+ rescue ArgumentError
+ raise Mastodon::SignatureVerificationError, "Invalid Digest value. The provided Digest value is not a valid base64 string. Given digest: #{sha256[1]}"
+ end
+
+ raise Mastodon::SignatureVerificationError, "Invalid Digest value. The provided Digest value is not a SHA-256 digest. Given digest: #{sha256[1]}" if digest_size != 32
+
+ raise Mastodon::SignatureVerificationError, "Invalid Digest value. Computed SHA-256 digest: #{body_digest}; given: #{sha256[1]}"
+ end
+
+ private
+
+ def request_body
+ @request_body ||= @request.raw_post
+ end
+
+ def signature_params
+ @signature_params ||= SignatureParser.parse(@request.headers['Signature'])
+ rescue SignatureParser::ParsingError
+ raise Mastodon::SignatureVerificationError, 'Error parsing signature parameters'
+ end
+
+ def signature_algorithm
+ signature_params.fetch('algorithm', 'hs2019')
+ end
+
+ def signed_headers
+ signature_params.fetch('headers', signature_algorithm == 'hs2019' ? '(created)' : 'date').downcase.split
+ end
+
+ def verify_signature(actor, signature, compare_signed_string)
+ true if actor.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), signature, compare_signed_string)
+ rescue OpenSSL::PKey::RSAError
+ nil
+ end
+
+ def build_signed_string(include_query_string: true)
+ signed_headers.map do |signed_header|
+ case signed_header
+ when HttpSignatureDraft::REQUEST_TARGET
+ if include_query_string
+ "#{HttpSignatureDraft::REQUEST_TARGET}: #{@request.method.downcase} #{@request.original_fullpath}"
+ else
+ # Current versions of Mastodon incorrectly omit the query string from the (request-target) pseudo-header.
+ # Therefore, temporarily support such incorrect signatures for compatibility.
+ # TODO: remove eventually some time after release of the fixed version
+ "#{HttpSignatureDraft::REQUEST_TARGET}: #{@request.method.downcase} #{@request.path}"
+ end
+ when '(created)'
+ raise Mastodon::SignatureVerificationError, 'Invalid pseudo-header (created) for rsa-sha256' unless signature_algorithm == 'hs2019'
+ raise Mastodon::SignatureVerificationError, 'Pseudo-header (created) used but corresponding argument missing' if signature_params['created'].blank?
+
+ "(created): #{signature_params['created']}"
+ when '(expires)'
+ raise Mastodon::SignatureVerificationError, 'Invalid pseudo-header (expires) for rsa-sha256' unless signature_algorithm == 'hs2019'
+ raise Mastodon::SignatureVerificationError, 'Pseudo-header (expires) used but corresponding argument missing' if signature_params['expires'].blank?
+
+ "(expires): #{signature_params['expires']}"
+ else
+ "#{signed_header}: #{@request.headers[to_header_name(signed_header)]}"
+ end
+ end.join("\n")
+ end
+
+ def body_digest
+ @body_digest ||= Digest::SHA256.base64digest(request_body)
+ end
+
+ def to_header_name(name)
+ name.split('-').map(&:capitalize).join('-')
+ end
+ end
+
+ class HttpMessageSignature
+ REQUIRED_PARAMETERS = %w(keyid created).freeze
+
+ def initialize(request)
+ @request = request
+ @signature = Linzer::Signature.build({
+ 'signature-input' => @request.headers['signature-input'],
+ 'signature' => @request.headers['signature'],
+ })
+ end
+
+ def key_id
+ @signature.parameters['keyid']
+ end
+
+ def missing_signature_parameters
+ REQUIRED_PARAMETERS if REQUIRED_PARAMETERS.any? { |p| @signature.parameters[p].blank? }
+ end
+
+ # This method can lie as we only support one specific algorith for now.
+ # But HTTP Message Signatures do not need to specify an algorithm (as
+ # this can be inferred from the key used). Using an unsupported
+ # algorithm will fail anyway further down the line.
+ def algorithm_supported?
+ true
+ end
+
+ def verified?(actor)
+ key = Linzer.new_rsa_v1_5_sha256_public_key(actor.public_key)
+
+ Linzer.verify!(@request.rack_request, key:)
+ rescue Linzer::VerifyError
+ false
+ end
+
+ def verify_signature_strength!
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the (created) parameter to be signed' if @signature.parameters['created'].blank?
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the @method and @target-uri derived components to be signed' unless @signature.components.include?('@method') && @signature.components.include?('@target-uri')
+ raise Mastodon::SignatureVerificationError, 'Mastodon requires the Content-Digest header to be signed when doing a POST request' if @request.post? && !signed_headers.include?('content-digest')
+ end
+
+ def verify_body_digest!
+ return unless signed_headers.include?('content-digest')
+ raise Mastodon::SignatureVerificationError, 'Content-Digest header missing' unless @request.headers.key?('content-digest')
+
+ digests = Starry.parse_dictionary(@request.headers['content-digest'])
+ raise Mastodon::SignatureVerificationError, "Mastodon only supports SHA-256 in Content-Digest header. Offered algorithms: #{digests.keys.join(', ')}" unless digests.key?('sha-256')
+
+ received_digest = Base64.strict_encode64(digests['sha-256'].value)
+ return if body_digest == received_digest
+
+ raise Mastodon::SignatureVerificationError, "Invalid Digest value. Computed SHA-256 digest: #{body_digest}; given: #{received_digest}"
+ end
+
+ def created_time
+ Time.at(@signature.parameters['created'].to_i).utc
+ rescue ArgumentError => e
+ raise Mastodon::SignatureVerificationError, "Invalid Date header: #{e.message}"
+ end
+
+ def expires_time
+ Time.at(@signature.parameters['expires'].to_i).utc if @signature.parameters['expires'].present?
+ rescue ArgumentError => e
+ raise Mastodon::SignatureVerificationError, "Invalid Date header: #{e.message}"
+ end
+
+ private
+
+ def request_body
+ @request_body ||= @request.raw_post
+ end
+
+ def signed_headers
+ @signed_headers ||= @signature.components.reject { |c| c.start_with?('@') }
+ end
+
+ def body_digest
+ @body_digest ||= Digest::SHA256.base64digest(request_body)
+ end
+
+ def missing_required_signature_parameters?
+ @signature.parameters['keyid'].blank?
+ end
+ end
+
+ attr_reader :signature
+
+ delegate :key_id, to: :signature
+
+ def initialize(request)
+ @signature =
+ if Mastodon::Feature.http_message_signatures_enabled? && request.headers['signature-input'].present?
+ HttpMessageSignature.new(request)
+ else
+ HttpSignature.new(request)
+ end
+ end
+
+ def verified?(actor)
+ missing_signature_parameters = @signature.missing_signature_parameters
+ raise Mastodon::SignatureVerificationError, "Incompatible request signature. #{missing_signature_parameters.to_sentence} are required" if missing_signature_parameters
+ raise Mastodon::SignatureVerificationError, 'Unsupported signature algorithm (only rsa-sha256 and hs2019 are supported)' unless @signature.algorithm_supported?
+ raise Mastodon::SignatureVerificationError, 'Signed request date outside acceptable time window' unless matches_time_window?
+
+ @signature.verify_signature_strength!
+ @signature.verify_body_digest!
+ @signature.verified?(actor)
+ end
+
+ private
+
+ def matches_time_window?
+ created_time = @signature.created_time
+ expires_time = @signature.expires_time
+
+ expires_time ||= created_time + 5.minutes unless created_time.nil?
+ expires_time = [expires_time, created_time + EXPIRATION_WINDOW_LIMIT].min unless created_time.nil?
+
+ return false if created_time.present? && created_time > Time.now.utc + CLOCK_SKEW_MARGIN
+ return false if expires_time.present? && Time.now.utc > expires_time + CLOCK_SKEW_MARGIN
+
+ true
+ end
+end
diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb
index 56ffd2a28c..61ffde0d9d 100644
--- a/app/lib/status_cache_hydrator.rb
+++ b/app/lib/status_cache_hydrator.rb
@@ -5,7 +5,7 @@ class StatusCacheHydrator
@status = status
end
- def hydrate(account_id)
+ def hydrate(account_id, nested: false)
account = Account.find(account_id)
# The cache of the serialized hash is generated by the fan-out-on-write service
@@ -18,17 +18,17 @@ class StatusCacheHydrator
# We take advantage of the fact that some relationships can only occur with an original status, not
# the reblog that wraps it, so we can assume that some values are always false
if payload[:reblog]
- hydrate_reblog_payload(payload, account_id, account)
+ hydrate_reblog_payload(payload, account_id, account, nested:)
else
- hydrate_non_reblog_payload(payload, account_id, account)
+ hydrate_non_reblog_payload(payload, account_id, account, nested:)
end
end
private
- def hydrate_non_reblog_payload(empty_payload, account_id, account)
+ def hydrate_non_reblog_payload(empty_payload, account_id, account, nested: false)
empty_payload.tap do |payload|
- fill_status_payload(payload, @status, account_id, account)
+ fill_status_payload(payload, @status, account_id, account, nested:)
if payload[:poll]
payload[:poll][:voted] = @status.account_id == account_id
@@ -37,7 +37,7 @@ class StatusCacheHydrator
end
end
- def hydrate_reblog_payload(empty_payload, account_id, account)
+ def hydrate_reblog_payload(empty_payload, account_id, account, nested: false)
empty_payload.tap do |payload|
payload[:muted] = false
payload[:bookmarked] = false
@@ -47,7 +47,7 @@ class StatusCacheHydrator
# used to create the status, we need to hydrate it here too
payload[:reblog][:application] = payload_reblog_application if payload[:reblog][:application].nil? && @status.reblog.account_id == account_id
- fill_status_payload(payload[:reblog], @status.reblog, account_id, account)
+ fill_status_payload(payload[:reblog], @status.reblog, account_id, account, nested:)
if payload[:reblog][:poll]
if @status.reblog.account_id == account_id
@@ -66,7 +66,7 @@ class StatusCacheHydrator
end
end
- def fill_status_payload(payload, status, account_id, account)
+ def fill_status_payload(payload, status, account_id, account, nested: false)
payload[:favourited] = Favourite.exists?(account_id: account_id, status_id: status.id)
payload[:reblogged] = Status.exists?(account_id: account_id, reblog_of_id: status.id)
payload[:muted] = ConversationMute.exists?(account_id: account_id, conversation_id: status.conversation_id)
@@ -74,6 +74,35 @@ class StatusCacheHydrator
payload[:pinned] = StatusPin.exists?(account_id: account_id, status_id: status.id) if status.account_id == account_id
payload[:filtered] = mapped_applied_custom_filter(account_id, status)
payload[:emoji_reactions] = status.emoji_reactions_grouped_by_name(account)
+ payload[:quote] = hydrate_quote_payload(payload[:quote], status.quote, account_id, nested:) if payload[:quote]
+ end
+
+ def hydrate_quote_payload(empty_payload, quote, account_id, nested: false)
+ return unless quote&.acceptable?
+
+ empty_payload.tap do |payload|
+ payload.delete(:quoted_status) if nested
+
+ # TODO: performance improvements
+ if quote.accepted?
+ if quote.quoted_status.nil?
+ payload[nested ? :quoted_status_id : :quoted_status] = nil
+ payload[:state] = 'deleted'
+ elsif StatusFilter.new(quote.quoted_status, Account.find_by(id: account_id)).filtered?
+ payload[nested ? :quoted_status_id : :quoted_status] = nil
+ payload[:state] = 'unauthorized'
+ else
+ payload[:state] = 'accepted'
+ if nested
+ payload[:quoted_status_id] = quote.quoted_status_id&.to_s
+ else
+ payload[:quoted_status] = StatusCacheHydrator.new(quote.quoted_status).hydrate(account_id, nested: true)
+ end
+ end
+ else
+ payload[nested ? :quoted_status_id : :quoted_status] = nil
+ end
+ end
end
def mapped_applied_custom_filter(account_id, status)
diff --git a/app/lib/status_filter.rb b/app/lib/status_filter.rb
index 70656f9c8d..8df80b7d63 100644
--- a/app/lib/status_filter.rb
+++ b/app/lib/status_filter.rb
@@ -39,7 +39,7 @@ class StatusFilter
end
def silenced_account?
- !account&.silenced? && status_account_silenced? && !account_following_status_account?
+ status_account_silenced? && !account_following_status_account?
end
def status_account_silenced?
diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb
index 04dd254458..b622e140f7 100644
--- a/app/lib/status_reach_finder.rb
+++ b/app/lib/status_reach_finder.rb
@@ -78,7 +78,6 @@ class StatusReachFinder
reblogs_account_ids,
favourites_account_ids,
replies_account_ids,
- quoted_account_id,
].tap do |arr|
arr.flatten!
arr.compact!
@@ -114,10 +113,6 @@ class StatusReachFinder
@status.replies.pluck(:account_id) if distributable? || unsafe?
end
- def quoted_account_id
- @status.quote.account_id if @status.quote?
- end
-
def followers_inboxes
scope = followers_scope
inboxes_without_suspended_for(scope)
diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb
index 6ff4ea5651..6337a60230 100644
--- a/app/lib/text_formatter.rb
+++ b/app/lib/text_formatter.rb
@@ -34,26 +34,21 @@ class TextFormatter
def to_s
return ''.html_safe if text.blank?
- html = nil
- MastodonOTELTracer.in_span('TextFormatter#to_s extract_and_rewrite') do
- html = rewrite do |entity|
- if entity[:url]
- link_to_url(entity)
- elsif entity[:hashtag]
- link_to_hashtag(entity)
- elsif entity[:screen_name]
- link_to_mention(entity)
- end
+ html = rewrite do |entity|
+ if entity[:url]
+ link_to_url(entity)
+ elsif entity[:hashtag]
+ link_to_hashtag(entity)
+ elsif entity[:screen_name]
+ link_to_mention(entity)
end
end
- MastodonOTELTracer.in_span('TextFormatter#to_s simple_format') do
- # line first letter for blockquote
- html = markdownify(html.gsub(/^>/, '>')) if markdown?
+ # line first letter for blockquote
+ html = markdownify(html.gsub(/^>/, '>')) if markdown?
- html = simple_format(html, {}, sanitize: false).delete("\n") if !markdown? && multiline?
- html = html.delete("\n")
- end
+ html = simple_format(html, {}, sanitize: false).delete("\n") if !markdown? && multiline?
+ html = html.delete("\n")
html.html_safe # rubocop:disable Rails/OutputSafety
end
@@ -109,54 +104,48 @@ class TextFormatter
end
def link_to_url(entity)
- MastodonOTELTracer.in_span('TextFormatter#link_to_url') do
- TextFormatter.shortened_link(entity[:url], rel_me: with_rel_me?)
- end
+ TextFormatter.shortened_link(entity[:url], rel_me: with_rel_me?)
end
def link_to_hashtag(entity)
- MastodonOTELTracer.in_span('TextFormatter#link_to_hashtag') do
- hashtag = entity[:hashtag]
- url = tag_url(hashtag)
+ hashtag = entity[:hashtag]
+ url = tag_url(hashtag)
- <<~HTML.squish
- ##{h(hashtag)}
- HTML
- end
+ <<~HTML.squish
+ ##{h(hashtag)}
+ HTML
end
def link_to_mention(entity)
- MastodonOTELTracer.in_span('TextFormatter#link_to_mention') do
- username, domain = entity[:screen_name].split('@')
- domain = nil if local_domain?(domain)
- account = nil
+ username, domain = entity[:screen_name].split('@')
+ domain = nil if local_domain?(domain)
+ account = nil
- if preloaded_accounts?
- same_username_hits = 0
+ if preloaded_accounts?
+ same_username_hits = 0
- preloaded_accounts.each do |other_account|
- same_username = other_account.username.casecmp(username).zero?
- same_domain = other_account.domain.nil? ? domain.nil? : other_account.domain.casecmp(domain)&.zero?
+ preloaded_accounts.each do |other_account|
+ same_username = other_account.username.casecmp(username).zero?
+ same_domain = other_account.domain.nil? ? domain.nil? : other_account.domain.casecmp(domain)&.zero?
- if same_username && !same_domain
- same_username_hits += 1
- elsif same_username && same_domain
- account = other_account
- end
+ if same_username && !same_domain
+ same_username_hits += 1
+ elsif same_username && same_domain
+ account = other_account
end
- else
- account = entity_cache.mention(username, domain)
end
-
- return "@#{h(entity[:screen_name])}" if account.nil?
-
- url = ActivityPub::TagManager.instance.url_for(account)
- display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username
-
- <<~HTML.squish
- @#{h(display_username)}
- HTML
+ else
+ account = entity_cache.mention(username, domain)
end
+
+ return "@#{h(entity[:screen_name])}" if account.nil?
+
+ url = ActivityPub::TagManager.instance.url_for(account)
+ display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username
+
+ <<~HTML.squish
+ @#{h(display_username)}
+ HTML
end
def entity_cache
diff --git a/app/lib/web_push_request.rb b/app/lib/web_push_request.rb
index 85e8ab6bb5..416a629429 100644
--- a/app/lib/web_push_request.rb
+++ b/app/lib/web_push_request.rb
@@ -79,8 +79,8 @@ class WebPushRequest
def vapid_key
@vapid_key ||= Webpush::VapidKey.from_keys(
- Rails.configuration.x.vapid_public_key,
- Rails.configuration.x.vapid_private_key
+ Rails.configuration.x.vapid.public_key,
+ Rails.configuration.x.vapid.private_key
)
end
diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb
index 01a5dbc21d..83b5415a33 100644
--- a/app/lib/webfinger.rb
+++ b/app/lib/webfinger.rb
@@ -65,7 +65,7 @@ class Webfinger
private
- def body_from_webfinger(url = standard_url, use_fallback = true)
+ def body_from_webfinger(url = standard_url, use_fallback: true)
webfinger_request(url).perform do |res|
if res.code == 200
body = res.body_with_limit
@@ -85,7 +85,7 @@ class Webfinger
def body_from_host_meta
host_meta_request.perform do |res|
if res.code == 200
- body_from_webfinger(url_from_template(res.body_with_limit), false)
+ body_from_webfinger(url_from_template(res.body_with_limit), use_fallback: false)
else
raise Webfinger::Error, "Request for #{@uri} returned HTTP #{res.code}"
end
diff --git a/app/models/account.rb b/app/models/account.rb
index f3f591d006..a85e95e6da 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -89,6 +89,7 @@ class Account < ApplicationRecord
include Account::Associations
include Account::Avatar
include Account::Counters
+ include Account::FaspConcern
include Account::FinderConcern
include Account::Header
include Account::Interactions
diff --git a/app/models/concerns/account/fasp_concern.rb b/app/models/concerns/account/fasp_concern.rb
new file mode 100644
index 0000000000..b18529a3e9
--- /dev/null
+++ b/app/models/concerns/account/fasp_concern.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Account::FaspConcern
+ extend ActiveSupport::Concern
+
+ included do
+ after_commit :announce_new_account_to_subscribed_fasp, on: :create
+ after_commit :announce_updated_account_to_subscribed_fasp, on: :update
+ after_commit :announce_deleted_account_to_subscribed_fasp, on: :destroy
+ end
+
+ private
+
+ def announce_new_account_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless discoverable?
+
+ uri = ActivityPub::TagManager.instance.uri_for(self)
+ Fasp::AnnounceAccountLifecycleEventWorker.perform_async(uri, 'new')
+ end
+
+ def announce_updated_account_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless discoverable? || saved_change_to_discoverable?
+
+ uri = ActivityPub::TagManager.instance.uri_for(self)
+ Fasp::AnnounceAccountLifecycleEventWorker.perform_async(uri, 'update')
+ end
+
+ def announce_deleted_account_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless discoverable?
+
+ uri = ActivityPub::TagManager.instance.uri_for(self)
+ Fasp::AnnounceAccountLifecycleEventWorker.perform_async(uri, 'delete')
+ end
+end
diff --git a/app/models/concerns/account/other_settings.rb b/app/models/concerns/account/other_settings.rb
index 7968f857ff..a8311c6788 100644
--- a/app/models/concerns/account/other_settings.rb
+++ b/app/models/concerns/account/other_settings.rb
@@ -15,13 +15,6 @@ module Account::OtherSettings
false
end
- def allow_quote?
- return user.setting_allow_quote if local? && user.present?
- return settings['allow_quote'] if settings.present? && settings.key?('allow_quote')
-
- true
- end
-
def hide_statuses_count?
return user&.setting_hide_statuses_count if local? && user.present?
return settings['hide_statuses_count'] if settings.present? && settings.key?('hide_statuses_count')
@@ -88,7 +81,6 @@ module Account::OtherSettings
'hide_following_count' => hide_following_count?,
'hide_followers_count' => hide_followers_count?,
'translatable_private' => translatable_private?,
- 'allow_quote' => allow_quote?,
'emoji_reaction_policy' => Setting.enable_emoji_reaction ? emoji_reaction_policy.to_s : 'block',
}
end
diff --git a/app/models/concerns/attachmentable.rb b/app/models/concerns/attachmentable.rb
index a83e178fc4..783054b850 100644
--- a/app/models/concerns/attachmentable.rb
+++ b/app/models/concerns/attachmentable.rb
@@ -22,7 +22,7 @@ module Attachmentable
).freeze
included do
- def self.has_attached_file(name, options = {}) # rubocop:disable Naming/PredicateName
+ def self.has_attached_file(name, options = {}) # rubocop:disable Naming/PredicatePrefix
super
send(:"before_#{name}_validate", prepend: true) do
diff --git a/app/models/concerns/favourite/fasp_concern.rb b/app/models/concerns/favourite/fasp_concern.rb
new file mode 100644
index 0000000000..c72e7c3792
--- /dev/null
+++ b/app/models/concerns/favourite/fasp_concern.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Favourite::FaspConcern
+ extend ActiveSupport::Concern
+
+ included do
+ after_commit :announce_trends_to_subscribed_fasp, on: :create
+ end
+
+ private
+
+ def announce_trends_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+
+ Fasp::AnnounceTrendWorker.perform_async(status_id, 'favourite')
+ end
+end
diff --git a/app/models/concerns/legacy_otp_secret.rb b/app/models/concerns/legacy_otp_secret.rb
deleted file mode 100644
index 466c4ec9bb..0000000000
--- a/app/models/concerns/legacy_otp_secret.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-# frozen_string_literal: true
-
-# TODO: This file is here for legacy support during devise-two-factor upgrade.
-# It should be removed after all records have been migrated.
-
-module LegacyOtpSecret
- extend ActiveSupport::Concern
-
- private
-
- # Decrypt and return the `encrypted_otp_secret` attribute which was used in
- # prior versions of devise-two-factor
- # @return [String] The decrypted OTP secret
- def legacy_otp_secret
- return nil unless self[:encrypted_otp_secret]
- return nil unless self.class.otp_secret_encryption_key
-
- hmac_iterations = 2000 # a default set by the Encryptor gem
- key = self.class.otp_secret_encryption_key
- salt = Base64.decode64(encrypted_otp_secret_salt)
- iv = Base64.decode64(encrypted_otp_secret_iv)
-
- raw_cipher_text = Base64.decode64(encrypted_otp_secret)
- # The last 16 bytes of the ciphertext are the authentication tag - we use
- # Galois Counter Mode which is an authenticated encryption mode
- cipher_text = raw_cipher_text[0..-17]
- auth_tag = raw_cipher_text[-16..-1] # rubocop:disable Style/SlicingWithRange
-
- # this alrorithm lifted from
- # https://github.com/attr-encrypted/encryptor/blob/master/lib/encryptor.rb#L54
-
- # create an OpenSSL object which will decrypt the AES cipher with 256 bit
- # keys in Galois Counter Mode (GCM). See
- # https://ruby.github.io/openssl/OpenSSL/Cipher.html
- cipher = OpenSSL::Cipher.new('aes-256-gcm')
-
- # tell the cipher we want to decrypt. Symmetric algorithms use a very
- # similar process for encryption and decryption, hence the same object can
- # do both.
- cipher.decrypt
-
- # Use a Password-Based Key Derivation Function to generate the key actually
- # used for encryptoin from the key we got as input.
- cipher.key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(key, salt, hmac_iterations, cipher.key_len)
-
- # set the Initialization Vector (IV)
- cipher.iv = iv
-
- # The tag must be set after calling Cipher#decrypt, Cipher#key= and
- # Cipher#iv=, but before calling Cipher#final. After all decryption is
- # performed, the tag is verified automatically in the call to Cipher#final.
- #
- # If the auth_tag does not verify, then #final will raise OpenSSL::Cipher::CipherError
- cipher.auth_tag = auth_tag
-
- # auth_data must be set after auth_tag has been set when decrypting See
- # http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-auth_data-3D
- # we are not adding any authenticated data but OpenSSL docs say this should
- # still be called.
- cipher.auth_data = ''
-
- # #update is (somewhat confusingly named) the method which actually
- # performs the decryption on the given chunk of data. Our OTP secret is
- # short so we only need to call it once.
- #
- # It is very important that we call #final because:
- #
- # 1. The authentication tag is checked during the call to #final
- # 2. Block based cipher modes (e.g. CBC) work on fixed size chunks. We need
- # to call #final to get it to process the last chunk properly. The output
- # of #final should be appended to the decrypted value. This isn't
- # required for streaming cipher modes but including it is a best practice
- # so that your code will continue to function correctly even if you later
- # change to a block cipher mode.
- cipher.update(cipher_text) + cipher.final
- end
-end
diff --git a/app/models/concerns/status/fasp_concern.rb b/app/models/concerns/status/fasp_concern.rb
new file mode 100644
index 0000000000..9a838c3a6a
--- /dev/null
+++ b/app/models/concerns/status/fasp_concern.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Status::FaspConcern
+ extend ActiveSupport::Concern
+
+ included do
+ after_commit :announce_new_content_to_subscribed_fasp, on: :create
+ after_commit :announce_updated_content_to_subscribed_fasp, on: :update
+ after_commit :announce_deleted_content_to_subscribed_fasp, on: :destroy
+ after_commit :announce_trends_to_subscribed_fasp, on: :create
+ end
+
+ private
+
+ def announce_new_content_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless account_indexable? && public_visibility?
+
+ # We need the uri here, but it is set in another `after_commit`
+ # callback. Hooks included from modules are run before the ones
+ # in the class itself and can neither be reordered nor is there
+ # a way to declare dependencies.
+ store_uri if uri.nil?
+ Fasp::AnnounceContentLifecycleEventWorker.perform_async(uri, 'new')
+ end
+
+ def announce_updated_content_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless account_indexable? && public_visibility?
+
+ Fasp::AnnounceContentLifecycleEventWorker.perform_async(uri, 'update')
+ end
+
+ def announce_deleted_content_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless account_indexable? && public_visibility?
+
+ Fasp::AnnounceContentLifecycleEventWorker.perform_async(uri, 'delete')
+ end
+
+ def announce_trends_to_subscribed_fasp
+ return unless Mastodon::Feature.fasp_enabled?
+ return unless account_indexable?
+
+ candidate_id, trend_source =
+ if reblog_of_id
+ [reblog_of_id, 'reblog']
+ elsif in_reply_to_id
+ [in_reply_to_id, 'reply']
+ end
+ Fasp::AnnounceTrendWorker.perform_async(candidate_id, trend_source) if candidate_id
+ end
+end
diff --git a/app/models/concerns/status/safe_reblog_insert.rb b/app/models/concerns/status/safe_reblog_insert.rb
index 48d585ea18..94bed5b39a 100644
--- a/app/models/concerns/status/safe_reblog_insert.rb
+++ b/app/models/concerns/status/safe_reblog_insert.rb
@@ -16,7 +16,7 @@ module Status::SafeReblogInsert
# The code is kept similar to ActiveRecord::Persistence code and calls it
# directly when we are not handling a reblog.
#
- # https://github.com/rails/rails/blob/v7.2.1.1/activerecord/lib/active_record/persistence.rb#L238-L263
+ # https://github.com/rails/rails/blob/v8.0.2/activerecord/lib/active_record/persistence.rb#L238-L261
def _insert_record(connection, values, returning)
return super unless values.is_a?(Hash) && values['reblog_of_id']&.value.present?
@@ -36,15 +36,13 @@ module Status::SafeReblogInsert
# Instead, we use a custom builder when a reblog is happening:
im = _compile_reblog_insert(values)
- with_connection do |_c|
- connection.insert(
- im, "#{self} Create", primary_key || false, primary_key_value,
- returning: returning
- ).tap do |result|
- # Since we are using SELECT instead of VALUES, a non-error `nil` return is possible.
- # For our purposes, it's equivalent to a foreign key constraint violation
- raise ActiveRecord::InvalidForeignKey, "(reblog_of_id)=(#{values['reblog_of_id'].value}) is not present in table \"statuses\"" if result.nil?
- end
+ connection.insert(
+ im, "#{self} Create", primary_key || false, primary_key_value,
+ returning: returning
+ ).tap do |result|
+ # Since we are using SELECT instead of VALUES, a non-error `nil` return is possible.
+ # For our purposes, it's equivalent to a foreign key constraint violation
+ raise ActiveRecord::InvalidForeignKey, "(reblog_of_id)=(#{values['reblog_of_id'].value}) is not present in table \"statuses\"" if result.nil?
end
end
diff --git a/app/models/concerns/status/snapshot_concern.rb b/app/models/concerns/status/snapshot_concern.rb
index b0507da5d3..8105472c1e 100644
--- a/app/models/concerns/status/snapshot_concern.rb
+++ b/app/models/concerns/status/snapshot_concern.rb
@@ -26,6 +26,7 @@ module Status::SnapshotConcern
poll_options: preloadable_poll&.options&.dup,
account_id: account_id || self.account_id,
created_at: at_time || edited_at,
+ quote_id: quote&.id,
rate_limit: rate_limit
)
end
diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb
index 2f8b11dcec..6c5e5d665d 100644
--- a/app/models/concerns/user/has_settings.rb
+++ b/app/models/concerns/user/has_settings.rb
@@ -107,18 +107,6 @@ module User::HasSettings
settings['web.content_font_size']
end
- def setting_show_quote_in_home
- settings['web.show_quote_in_home']
- end
-
- def setting_show_quote_in_public
- settings['web.show_quote_in_public']
- end
-
- def setting_hide_blocking_quote
- settings['web.hide_blocking_quote']
- end
-
def setting_show_relationships
settings['web.show_relationships']
end
@@ -127,10 +115,6 @@ module User::HasSettings
settings['web.show_avatar_on_filter']
end
- def setting_allow_quote
- settings['allow_quote']
- end
-
def setting_reject_send_limited_to_suspects
settings['reject_send_limited_to_suspects']
end
@@ -275,10 +259,6 @@ module User::HasSettings
settings['web.hide_emoji_reaction_unavailable_server']
end
- def setting_hide_quote_unavailable_server
- settings['web.hide_quote_unavailable_server']
- end
-
def setting_hide_status_reference_unavailable_server
settings['web.hide_status_reference_unavailable_server']
end
diff --git a/app/models/concerns/user/omniauthable.rb b/app/models/concerns/user/omniauthable.rb
index 396a0598f8..bf85885f44 100644
--- a/app/models/concerns/user/omniauthable.rb
+++ b/app/models/concerns/user/omniauthable.rb
@@ -99,7 +99,7 @@ module User::Omniauthable
external: true,
account_attributes: {
username: ensure_unique_username(ensure_valid_username(auth.uid)),
- display_name: auth.info.full_name || auth.info.name || [auth.info.first_name, auth.info.last_name].join(' '),
+ display_name: display_name_from_auth(auth),
},
}
end
@@ -121,5 +121,10 @@ module User::Omniauthable
temp_username = starting_username.gsub(/[^a-z0-9_]+/i, '')
temp_username.truncate(30, omission: '')
end
+
+ def display_name_from_auth(auth)
+ display_name = auth.info.full_name || auth.info.name || [auth.info.first_name, auth.info.last_name].join(' ')
+ display_name.truncate(Account::DISPLAY_NAME_LENGTH_LIMIT, omission: '')
+ end
end
end
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index b67105aade..ed1c782328 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -12,7 +12,6 @@
# expires_at :datetime
# phrase :text default(""), not null
# with_profile :boolean default(FALSE), not null
-# with_quote :boolean default(TRUE), not null
# created_at :datetime not null
# updated_at :datetime not null
# account_id :bigint(8) not null
@@ -69,14 +68,6 @@ class CustomFilter < ApplicationRecord
hide_action?
end
- def exclude_quote=(value)
- self.with_quote = !ActiveModel::Type::Boolean.new.cast(value)
- end
-
- def exclude_quote
- !with_quote
- end
-
def exclude_profile=(value)
self.with_profile = !ActiveModel::Type::Boolean.new.cast(value)
end
@@ -111,9 +102,6 @@ class CustomFilter < ApplicationRecord
end
def self.apply_cached_filters(cached_filters, status, following: false)
- references_text_cache = nil
- references_spoiler_text_cache = nil
-
cached_filters.filter_map do |filter, rules|
next if filter.exclude_follows && following
next if filter.exclude_localusers && status.account.local?
@@ -121,17 +109,10 @@ class CustomFilter < ApplicationRecord
if rules[:keywords].present?
match = rules[:keywords].match(status.proper.searchable_text)
match = rules[:keywords].match([status.account.display_name, status.account.note].join("\n\n")) if !match && filter.with_profile
- if match.nil? && filter.with_quote && status.proper.reference_objects.exists?
- references_text_cache = status.proper.references.pluck(:text).join("\n\n") if references_text_cache.nil?
- references_spoiler_text_cache = status.proper.references.pluck(:spoiler_text).join("\n\n") if references_spoiler_text_cache.nil?
- match = rules[:keywords].match(references_text_cache)
- match = rules[:keywords].match(references_spoiler_text_cache) if match.nil?
- end
end
keyword_matches = [match.to_s] unless match.nil?
- reference_ids = filter.with_quote ? status.proper.reference_objects.pluck(:target_status_id) : []
- status_matches = ([status.id, status.reblog_of_id] + reference_ids).compact & rules[:status_ids] if rules[:status_ids].present?
+ status_matches = [status.id, status.reblog_of_id].compact & rules[:status_ids] if rules[:status_ids].present?
next if keyword_matches.blank? && status_matches.blank?
diff --git a/app/models/fasp.rb b/app/models/fasp.rb
index cb33937715..e4e73a2312 100644
--- a/app/models/fasp.rb
+++ b/app/models/fasp.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module Fasp
+ DATA_CATEGORIES = %w(account content).freeze
+
def self.table_name_prefix
'fasp_'
end
diff --git a/app/models/fasp/backfill_request.rb b/app/models/fasp/backfill_request.rb
new file mode 100644
index 0000000000..e1be611097
--- /dev/null
+++ b/app/models/fasp/backfill_request.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: fasp_backfill_requests
+#
+# id :bigint(8) not null, primary key
+# category :string not null
+# cursor :string
+# fulfilled :boolean default(FALSE), not null
+# max_count :integer default(100), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# fasp_provider_id :bigint(8) not null
+#
+class Fasp::BackfillRequest < ApplicationRecord
+ belongs_to :fasp_provider, class_name: 'Fasp::Provider'
+
+ validates :category, presence: true, inclusion: Fasp::DATA_CATEGORIES
+ validates :max_count, presence: true,
+ numericality: { only_integer: true }
+
+ after_commit :queue_fulfillment_job, on: :create
+
+ def next_objects
+ @next_objects ||= base_scope.to_a
+ end
+
+ def next_uris
+ next_objects.map { |o| ActivityPub::TagManager.instance.uri_for(o) }
+ end
+
+ def more_objects_available?
+ return false if next_objects.empty?
+
+ base_scope.where(id: ...(next_objects.last.id)).any?
+ end
+
+ def advance!
+ if more_objects_available?
+ update!(cursor: next_objects.last.id)
+ else
+ update!(fulfilled: true)
+ end
+ end
+
+ private
+
+ def base_scope
+ result = category_scope.limit(max_count).order(id: :desc)
+ result = result.where(id: ...cursor) if cursor.present?
+ result
+ end
+
+ def category_scope
+ case category
+ when 'account'
+ Account.discoverable.without_instance_actor
+ when 'content'
+ Status.indexable
+ end
+ end
+
+ def queue_fulfillment_job
+ Fasp::BackfillWorker.perform_async(id)
+ end
+end
diff --git a/app/models/fasp/provider.rb b/app/models/fasp/provider.rb
index cd1b3008c7..7926953e6c 100644
--- a/app/models/fasp/provider.rb
+++ b/app/models/fasp/provider.rb
@@ -22,7 +22,9 @@
class Fasp::Provider < ApplicationRecord
include DebugConcern
+ has_many :fasp_backfill_requests, inverse_of: :fasp_provider, class_name: 'Fasp::BackfillRequest', dependent: :delete_all
has_many :fasp_debug_callbacks, inverse_of: :fasp_provider, class_name: 'Fasp::DebugCallback', dependent: :delete_all
+ has_many :fasp_subscriptions, inverse_of: :fasp_provider, class_name: 'Fasp::Subscription', dependent: :delete_all
validates :name, presence: true
validates :base_url, presence: true, url: true
diff --git a/app/models/fasp/subscription.rb b/app/models/fasp/subscription.rb
new file mode 100644
index 0000000000..e2e554ed74
--- /dev/null
+++ b/app/models/fasp/subscription.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: fasp_subscriptions
+#
+# id :bigint(8) not null, primary key
+# category :string not null
+# max_batch_size :integer not null
+# subscription_type :string not null
+# threshold_likes :integer
+# threshold_replies :integer
+# threshold_shares :integer
+# threshold_timeframe :integer
+# created_at :datetime not null
+# updated_at :datetime not null
+# fasp_provider_id :bigint(8) not null
+#
+class Fasp::Subscription < ApplicationRecord
+ TYPES = %w(lifecycle trends).freeze
+
+ belongs_to :fasp_provider, class_name: 'Fasp::Provider'
+
+ validates :category, presence: true, inclusion: Fasp::DATA_CATEGORIES
+ validates :subscription_type, presence: true,
+ inclusion: TYPES
+
+ scope :category_content, -> { where(category: 'content') }
+ scope :category_account, -> { where(category: 'account') }
+ scope :lifecycle, -> { where(subscription_type: 'lifecycle') }
+ scope :trends, -> { where(subscription_type: 'trends') }
+
+ def threshold=(threshold)
+ self.threshold_timeframe = threshold['timeframe'] || 15
+ self.threshold_shares = threshold['shares'] || 3
+ self.threshold_likes = threshold['likes'] || 3
+ self.threshold_replies = threshold['replies'] || 3
+ end
+
+ def timeframe_start
+ threshold_timeframe.minutes.ago
+ end
+end
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
index c2256099a6..5f8b6eac00 100644
--- a/app/models/favourite.rb
+++ b/app/models/favourite.rb
@@ -14,6 +14,7 @@
class Favourite < ApplicationRecord
include Paginable
+ include Favourite::FaspConcern
update_index('statuses', :status)
diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb
index dfc700649c..9a91ab3bed 100644
--- a/app/models/featured_tag.rb
+++ b/app/models/featured_tag.rb
@@ -18,18 +18,20 @@ class FeaturedTag < ApplicationRecord
belongs_to :account, inverse_of: :featured_tags
belongs_to :tag, inverse_of: :featured_tags, optional: true # Set after validation
- validates :name, presence: true, format: { with: Tag::HASHTAG_NAME_RE }, on: :create
+ validates :name, presence: true, on: :create, if: -> { tag_id.nil? }
+ validates :name, format: { with: Tag::HASHTAG_NAME_RE }, on: :create, allow_blank: true
+ validates :tag_id, uniqueness: { scope: :account_id }
- validate :validate_tag_uniqueness, on: :create
validate :validate_featured_tags_limit, on: :create
normalizes :name, with: ->(name) { name.strip.delete_prefix('#') }
- before_create :set_tag
- before_create :reset_data
-
scope :by_name, ->(name) { joins(:tag).where(tag: { name: HashtagNormalizer.new.normalize(name) }) }
+ before_validation :set_tag
+
+ before_create :reset_data
+
LIMIT = 10
def sign?
@@ -59,7 +61,11 @@ class FeaturedTag < ApplicationRecord
private
def set_tag
- self.tag = Tag.find_or_create_by_names(name)&.first
+ if tag.nil?
+ self.tag = Tag.find_or_create_by_names(name)&.first
+ elsif tag&.new_record?
+ tag.save
+ end
end
def reset_data
@@ -73,14 +79,6 @@ class FeaturedTag < ApplicationRecord
errors.add(:base, I18n.t('featured_tags.errors.limit')) if account.featured_tags.count >= LIMIT
end
- def validate_tag_uniqueness
- errors.add(:name, :taken) if tag_already_featured_for_account?
- end
-
- def tag_already_featured_for_account?
- FeaturedTag.by_name(name).exists?(account_id: account_id)
- end
-
def visible_tagged_account_statuses
account.statuses.distributable_visibility.tagged_with(tag)
end
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index 31ac04b754..0330d0213c 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -36,6 +36,7 @@ class Form::AdminSettings
trendable_by_default
show_domain_blocks
show_domain_blocks_rationale
+ allow_referrer_origin
noindex
require_invite_text
media_cache_retention_period
@@ -85,6 +86,7 @@ class Form::AdminSettings
).freeze
BOOLEAN_KEYS = %i(
+ allow_referrer_origin
timeline_preview
activity_api_enabled
peers_api_enabled
diff --git a/app/models/home_feed.rb b/app/models/home_feed.rb
index d6ebb5fa6b..81730ac98f 100644
--- a/app/models/home_feed.rb
+++ b/app/models/home_feed.rb
@@ -9,4 +9,12 @@ class HomeFeed < Feed
def regenerating?
redis.exists?("account:#{@account.id}:regeneration")
end
+
+ def regeneration_in_progress!
+ redis.set("account:#{@account.id}:regeneration", true, nx: true, ex: 1.day.seconds)
+ end
+
+ def regeneration_finished!
+ redis.del("account:#{@account.id}:regeneration")
+ end
end
diff --git a/app/models/instance_info.rb b/app/models/instance_info.rb
index 7b42c2df7e..8862501ce4 100644
--- a/app/models/instance_info.rb
+++ b/app/models/instance_info.rb
@@ -35,8 +35,6 @@ class InstanceInfo < ApplicationRecord
yojo-art
).freeze
- QUOTE_AVAILABLE_SOFTWARES = EMOJI_REACTION_AVAILABLE_SOFTWARES + %w(bridgy-fed).freeze
-
STATUS_REFERENCE_AVAILABLE_SOFTWARES = %w(fedibird).freeze
CIRCLE_AVAILABLE_SOFTWARES = %w(fedibird).freeze
@@ -87,7 +85,6 @@ class InstanceInfo < ApplicationRecord
{
emoji_reaction: feature_available?(info, EMOJI_REACTION_AVAILABLE_SOFTWARES, 'emoji_reaction'),
- quote: feature_available?(info, QUOTE_AVAILABLE_SOFTWARES, 'quote'),
status_reference: feature_available?(info, STATUS_REFERENCE_AVAILABLE_SOFTWARES, 'status_reference'),
circle: feature_available?(info, CIRCLE_AVAILABLE_SOFTWARES, 'circle'),
}
@@ -96,7 +93,6 @@ class InstanceInfo < ApplicationRecord
def local_features
{
emoji_reaction: Setting.enable_emoji_reaction,
- quote: true,
status_reference: true,
circle: true,
}
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 89c74d5a41..9331e52845 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -123,6 +123,7 @@ class MediaAttachment < ApplicationRecord
output: {
'loglevel' => 'fatal',
'map_metadata' => '-1',
+ 'movflags' => 'faststart', # Move metadata to start of file so playback can begin before download finishes
'c:v' => 'copy',
'c:a' => 'copy',
}.freeze,
@@ -421,7 +422,7 @@ class MediaAttachment < ApplicationRecord
# Record the cache keys to burst before the file get actually deleted
def prepare_cache_bust!
- return unless Rails.configuration.x.cache_buster_enabled
+ return unless Rails.configuration.x.cache_buster.enabled
@paths_to_cache_bust = MediaAttachment.attachment_definitions.keys.flat_map do |attachment_name|
attachment = public_send(attachment_name)
@@ -438,7 +439,7 @@ class MediaAttachment < ApplicationRecord
# Once Paperclip has deleted the files, we can't recover the cache keys,
# so use the previously-saved ones
def bust_cache!
- return unless Rails.configuration.x.cache_buster_enabled
+ return unless Rails.configuration.x.cache_buster.enabled
CacheBusterWorker.push_bulk(@paths_to_cache_bust) { |path| [path] }
rescue => e
diff --git a/app/models/quote.rb b/app/models/quote.rb
new file mode 100644
index 0000000000..c981591e17
--- /dev/null
+++ b/app/models/quote.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: quotes
+#
+# id :bigint(8) not null, primary key
+# activity_uri :string
+# approval_uri :string
+# legacy :boolean default(FALSE), not null
+# state :integer default("pending"), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint(8) not null
+# quoted_account_id :bigint(8)
+# quoted_status_id :bigint(8)
+# status_id :bigint(8) not null
+#
+class Quote < ApplicationRecord
+ BACKGROUND_REFRESH_INTERVAL = 1.week.freeze
+ REFRESH_DEADLINE = 6.hours
+
+ enum :state,
+ { pending: 0, accepted: 1, rejected: 2, revoked: 3 },
+ validate: true
+
+ belongs_to :status
+ belongs_to :quoted_status, class_name: 'Status', optional: true
+
+ belongs_to :account
+ belongs_to :quoted_account, class_name: 'Account', optional: true
+
+ before_validation :set_accounts
+
+ validates :activity_uri, presence: true, if: -> { account.local? && quoted_account&.remote? }
+ validate :validate_visibility
+
+ def accept!
+ update!(state: :accepted)
+ end
+
+ def reject!
+ if accepted?
+ update!(state: :revoked)
+ elsif !revoked?
+ update!(state: :rejected)
+ end
+ end
+
+ def acceptable?
+ accepted? || !legacy?
+ end
+
+ def schedule_refresh_if_stale!
+ return unless quoted_status_id.present? && approval_uri.present? && updated_at <= BACKGROUND_REFRESH_INTERVAL.ago
+
+ ActivityPub::QuoteRefreshWorker.perform_in(rand(REFRESH_DEADLINE), id)
+ end
+
+ private
+
+ def set_accounts
+ self.account = status.account
+ self.quoted_account = quoted_status&.account
+ end
+
+ def validate_visibility
+ return if account_id == quoted_account_id || quoted_status.nil? || quoted_status.distributable?
+
+ errors.add(:quoted_status_id, :visibility_mismatch)
+ end
+end
diff --git a/app/models/rule.rb b/app/models/rule.rb
index 99a36397aa..c7b532fe5d 100644
--- a/app/models/rule.rb
+++ b/app/models/rule.rb
@@ -19,7 +19,29 @@ class Rule < ApplicationRecord
self.discard_column = :deleted_at
+ has_many :translations, inverse_of: :rule, class_name: 'RuleTranslation', dependent: :destroy
+ accepts_nested_attributes_for :translations, reject_if: :all_blank, allow_destroy: true
+
validates :text, presence: true, length: { maximum: TEXT_SIZE_LIMIT }
scope :ordered, -> { kept.order(priority: :asc, id: :asc) }
+
+ def move!(offset)
+ rules = Rule.ordered.to_a
+ position = rules.index(self)
+
+ rules.delete_at(position)
+ rules.insert(position + offset, self)
+
+ transaction do
+ rules.each.with_index do |rule, index|
+ rule.update!(priority: index)
+ end
+ end
+ end
+
+ def translation_for(locale)
+ @cached_translations ||= {}
+ @cached_translations[locale] ||= translations.where(language: [locale, locale.to_s.split('-').first]).order('length(language) desc').first || RuleTranslation.new(language: locale, text: text, hint: hint)
+ end
end
diff --git a/app/models/rule_translation.rb b/app/models/rule_translation.rb
new file mode 100644
index 0000000000..99991b2ee1
--- /dev/null
+++ b/app/models/rule_translation.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: rule_translations
+#
+# id :bigint(8) not null, primary key
+# hint :text default(""), not null
+# language :string not null
+# text :text default(""), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# rule_id :bigint(8) not null
+#
+class RuleTranslation < ApplicationRecord
+ belongs_to :rule
+
+ validates :language, presence: true, uniqueness: { scope: :rule_id }
+ validates :text, presence: true, length: { maximum: Rule::TEXT_SIZE_LIMIT }
+end
diff --git a/app/models/status.rb b/app/models/status.rb
index 0325802022..6b6bca57b3 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -5,33 +5,33 @@
# Table name: statuses
#
# id :bigint(8) not null, primary key
-# uri :string
-# text :text default(""), not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# in_reply_to_id :bigint(8)
-# reblog_of_id :bigint(8)
-# url :string
-# sensitive :boolean default(FALSE), not null
-# visibility :integer default("public"), not null
-# spoiler_text :text default(""), not null
-# reply :boolean default(FALSE), not null
-# language :string
-# conversation_id :bigint(8)
-# local :boolean
-# account_id :bigint(8) not null
-# application_id :bigint(8)
-# in_reply_to_account_id :bigint(8)
-# poll_id :bigint(8)
# deleted_at :datetime
# edited_at :datetime
-# trendable :boolean
-# ordered_media_attachment_ids :bigint(8) is an Array
-# searchability :integer
-# markdown :boolean default(FALSE)
-# limited_scope :integer
-# quote_of_id :bigint(8)
# fetched_replies_at :datetime
+# language :string
+# limited_scope :integer
+# local :boolean
+# markdown :boolean default(FALSE)
+# ordered_media_attachment_ids :bigint(8) is an Array
+# quote_approval_policy :integer default(0), not null
+# reply :boolean default(FALSE), not null
+# searchability :integer
+# sensitive :boolean default(FALSE), not null
+# spoiler_text :text default(""), not null
+# text :text default(""), not null
+# trendable :boolean
+# uri :string
+# url :string
+# visibility :integer default("public"), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint(8) not null
+# application_id :bigint(8)
+# conversation_id :bigint(8)
+# in_reply_to_account_id :bigint(8)
+# in_reply_to_id :bigint(8)
+# poll_id :bigint(8)
+# reblog_of_id :bigint(8)
#
require 'ostruct'
@@ -42,6 +42,7 @@ class Status < ApplicationRecord
include Paginable
include RateLimitable
include Status::DomainBlockConcern
+ include Status::FaspConcern
include Status::FetchRepliesConcern
include Status::SafeReblogInsert
include Status::SearchConcern
@@ -54,6 +55,13 @@ class Status < ApplicationRecord
MEDIA_ATTACHMENTS_LIMIT_WITH_POLL = 4
MEDIA_ATTACHMENTS_LIMIT_FROM_REMOTE = 16
+ QUOTE_APPROVAL_POLICY_FLAGS = {
+ unknown: (1 << 0),
+ public: (1 << 1),
+ followers: (1 << 2),
+ followed: (1 << 3),
+ }.freeze
+
rate_limit by: :account, family: :statuses
self.discard_column = :deleted_at
@@ -76,7 +84,6 @@ class Status < ApplicationRecord
with_options class_name: 'Status', optional: true do
belongs_to :thread, foreign_key: 'in_reply_to_id', inverse_of: :replies
belongs_to :reblog, foreign_key: 'reblog_of_id', inverse_of: :reblogs
- belongs_to :quote, foreign_key: 'quote_of_id', inverse_of: :quotes
end
has_many :favourites, inverse_of: :status, dependent: :destroy
@@ -84,8 +91,6 @@ class Status < ApplicationRecord
has_many :bookmarks, inverse_of: :status, dependent: :destroy
has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy
has_many :reblogged_by_accounts, through: :reblogs, class_name: 'Account', source: :account
- has_many :quotes, foreign_key: 'quote_of_id', class_name: 'Status', inverse_of: :quote, dependent: nil
- has_many :quoted_by_accounts, through: :quotes, class_name: 'Account', source: :account
has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread, dependent: nil
has_many :mentions, dependent: :destroy, inverse_of: :status
has_many :mentioned_accounts, through: :mentions, source: :account, class_name: 'Account'
@@ -123,6 +128,7 @@ class Status < ApplicationRecord
has_one :scheduled_expiration_status, inverse_of: :status, dependent: :destroy
has_one :circle_status, inverse_of: :status, dependent: :destroy
has_many :list_status, inverse_of: :status, dependent: :destroy
+ has_one :quote, inverse_of: :status, dependent: :destroy
validates :uri, uniqueness: true, presence: true, unless: :local?
validates :text, presence: true, unless: -> { with_media? || reblog? }
@@ -189,38 +195,27 @@ class Status < ApplicationRecord
:reference_objects,
:references,
:scheduled_expiration_status,
+ quote: { status: { account: [:account_stat, user: :role] } },
preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
account: [:account_stat, user: :role],
active_mentions: :account,
reblog: [
:application,
- :tags,
:media_attachments,
:conversation,
:status_stat,
+ :tags,
:preloadable_poll,
:reference_objects,
:scheduled_expiration_status,
+ quote: { status: { account: [:account_stat, user: :role] } },
preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
account: [:account_stat, user: :role],
active_mentions: { account: :account_stat },
],
- quote: [
- :application,
- :tags,
- :media_attachments,
- :conversation,
- :status_stat,
- :preloadable_poll,
- :reference_objects,
- :scheduled_expiration_status,
- preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
- account: [:account_stat, user: :role],
- active_mentions: :account,
- ],
thread: :account
- delegate :domain, to: :account, prefix: true
+ delegate :domain, :indexable?, to: :account, prefix: true
REAL_TIME_WINDOW = 6.hours
@@ -252,10 +247,6 @@ class Status < ApplicationRecord
!reblog_of_id.nil?
end
- def quote?
- !quote_of_id.nil? && !quote.nil?
- end
-
def expires?
scheduled_expiration_status.present?
end
@@ -518,14 +509,6 @@ class Status < ApplicationRecord
ConversationMute.select(:conversation_id).where(conversation_id: conversation_ids).where(account_id: account_id).each_with_object({}) { |m, h| h[m.conversation_id] = true }
end
- def blocks_map(account_ids, account_id)
- Block.where(account_id: account_id, target_account_id: account_ids).each_with_object({}) { |b, h| h[b.target_account_id] = true }
- end
-
- def domain_blocks_map(domains, account_id)
- AccountDomainBlock.where(account_id: account_id, domain: domains).each_with_object({}) { |d, h| h[d.domain] = true }
- end
-
def pins_map(status_ids, account_id)
StatusPin.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |p, h| h[p.status_id] = true }
end
diff --git a/app/models/status_edit.rb b/app/models/status_edit.rb
index 6a094131d0..3a7e9bec53 100644
--- a/app/models/status_edit.rb
+++ b/app/models/status_edit.rb
@@ -16,6 +16,7 @@
# poll_options :string is an Array
# sensitive :boolean
# markdown :boolean default(FALSE)
+# quote_id :bigint(8)
#
class StatusEdit < ApplicationRecord
diff --git a/app/models/status_reference.rb b/app/models/status_reference.rb
index 79207291ac..b5d522baf4 100644
--- a/app/models/status_reference.rb
+++ b/app/models/status_reference.rb
@@ -5,12 +5,11 @@
# Table name: status_references
#
# id :bigint(8) not null, primary key
-# status_id :bigint(8) not null
-# target_status_id :bigint(8) not null
+# attribute_type :string
# created_at :datetime not null
# updated_at :datetime not null
-# attribute_type :string
-# quote :boolean default(FALSE), not null
+# status_id :bigint(8) not null
+# target_status_id :bigint(8) not null
#
class StatusReference < ApplicationRecord
@@ -22,8 +21,6 @@ class StatusReference < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy
after_commit :reset_parent_cache
- after_create_commit :set_quote
- after_destroy_commit :remove_quote
private
@@ -31,18 +28,4 @@ class StatusReference < ApplicationRecord
Rails.cache.delete("statuses/#{status_id}")
Rails.cache.delete("statuses/#{target_status_id}")
end
-
- def set_quote
- return unless quote
- return if status.quote_of_id.present?
-
- status.quote_of_id = target_status_id
- end
-
- def remove_quote
- return unless quote
- return unless status.quote_of_id == target_status_id
-
- status.quote_of_id = nil
- end
end
diff --git a/app/models/terms_of_service.rb b/app/models/terms_of_service.rb
index 3b69a40a1a..f29094036d 100644
--- a/app/models/terms_of_service.rb
+++ b/app/models/terms_of_service.rb
@@ -23,6 +23,8 @@ class TermsOfService < ApplicationRecord
validate :effective_date_cannot_be_in_the_past
+ NOTIFICATION_ACTIVITY_CUTOFF = 1.year.freeze
+
def published?
published_at.present?
end
@@ -39,8 +41,20 @@ class TermsOfService < ApplicationRecord
notification_sent_at.present?
end
+ def base_user_scope
+ User.confirmed.where(created_at: ..published_at).joins(:account)
+ end
+
+ def email_notification_cutoff
+ published_at - NOTIFICATION_ACTIVITY_CUTOFF
+ end
+
+ def scope_for_interstitial
+ base_user_scope.merge(Account.suspended).or(base_user_scope.where(current_sign_in_at: [nil, ...email_notification_cutoff]))
+ end
+
def scope_for_notification
- User.confirmed.joins(:account).merge(Account.without_suspended).where(created_at: (..published_at))
+ base_user_scope.merge(Account.without_suspended).where(current_sign_in_at: email_notification_cutoff...)
end
private
diff --git a/app/models/trends/statuses.rb b/app/models/trends/statuses.rb
index 14c5acba75..e61e82252a 100644
--- a/app/models/trends/statuses.rb
+++ b/app/models/trends/statuses.rb
@@ -91,9 +91,14 @@ class Trends::Statuses < Trends::Base
def eligible?(status)
status.created_at.past? &&
(status.public_visibility? || status.public_unlisted_visibility?) &&
- status.account.discoverable? && !status.account.silenced? && !status.account.sensitized? &&
- status.spoiler_text.blank? && (!status.sensitive? || status.media_attachments.none?) &&
- !status.reply? && valid_locale?(status.language) && !domain_blocked?(status)
+ status.account.discoverable? &&
+ !status.account.silenced? &&
+ !status.account.sensitized? &&
+ status.spoiler_text.blank? &&
+ (!status.sensitive? || status.media_attachments.none?) &&
+ !status.reply? &&
+ valid_locale?(status.language) &&
+ !domain_blocked?(status)
end
def domain_blocked?(status)
diff --git a/app/models/user.rb b/app/models/user.rb
index 7858ab906d..6b2d4a002a 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -15,9 +15,6 @@
# current_sign_in_at :datetime
# disabled :boolean default(FALSE), not null
# email :string default(""), not null
-# encrypted_otp_secret :string
-# encrypted_otp_secret_iv :string
-# encrypted_otp_secret_salt :string
# encrypted_password :string default(""), not null
# last_emailed_at :datetime
# last_sign_in_at :datetime
@@ -25,6 +22,7 @@
# otp_backup_codes :string is an Array
# otp_required_for_login :boolean default(FALSE), not null
# otp_secret :string
+# require_tos_interstitial :boolean default(FALSE), not null
# reset_password_sent_at :datetime
# reset_password_token :string
# settings :text
@@ -45,14 +43,17 @@
class User < ApplicationRecord
self.ignored_columns += %w(
+ admin
+ current_sign_in_ip
+ encrypted_otp_secret
+ encrypted_otp_secret_iv
+ encrypted_otp_secret_salt
+ filtered_languages
+ last_sign_in_ip
+ moderator
remember_created_at
remember_token
- current_sign_in_ip
- last_sign_in_ip
skip_sign_in_token
- filtered_languages
- admin
- moderator
)
include LanguagesHelper
@@ -75,11 +76,8 @@ class User < ApplicationRecord
REACTION_DECK_MAX = 256
devise :two_factor_authenticatable,
- otp_secret_encryption_key: Rails.configuration.x.otp_secret,
otp_secret_length: 32
- include LegacyOtpSecret # Must be after the above `devise` line in order to override the legacy method
-
devise :two_factor_backupable,
otp_number_of_backup_codes: 10
@@ -117,7 +115,7 @@ class User < ApplicationRecord
validates_with RegistrationFormTimeValidator, on: :create
validates :website, absence: true, on: :create
validates :confirm_password, absence: true, on: :create
- validates :date_of_birth, presence: true, date_of_birth: true, on: :create, if: -> { Setting.min_age.present? }
+ validates :date_of_birth, presence: true, date_of_birth: true, on: :create, if: -> { Setting.min_age.present? && !bypass_registration_checks? }
validate :validate_role_elevation
scope :account_not_suspended, -> { joins(:account).merge(Account.without_suspended) }
@@ -149,7 +147,7 @@ class User < ApplicationRecord
delegate :can?, to: :role
attr_reader :invite_code, :date_of_birth
- attr_writer :external, :bypass_invite_request_check, :current_account
+ attr_writer :external, :bypass_registration_checks, :current_account
def self.those_who_can(*any_of_privileges)
matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id)
@@ -524,8 +522,8 @@ class User < ApplicationRecord
!!@external
end
- def bypass_invite_request_check?
- @bypass_invite_request_check
+ def bypass_registration_checks?
+ @bypass_registration_checks
end
def sanitize_role
@@ -557,7 +555,11 @@ class User < ApplicationRecord
end
def regenerate_feed!
- RegenerationWorker.perform_async(account_id) if redis.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
+ home_feed = HomeFeed.new(account)
+ unless home_feed.regenerating?
+ home_feed.regeneration_in_progress!
+ RegenerationWorker.perform_async(account_id)
+ end
end
def needs_feed_update?
@@ -573,7 +575,7 @@ class User < ApplicationRecord
end
def invite_text_required?
- Setting.require_invite_text && !open_registrations? && !invited? && !external? && !bypass_invite_request_check?
+ Setting.require_invite_text && !open_registrations? && !invited? && !external? && !bypass_registration_checks?
end
def trigger_webhooks
diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb
index fb7d81a5f4..909d73c226 100644
--- a/app/models/user_settings.rb
+++ b/app/models/user_settings.rb
@@ -21,6 +21,7 @@ class UserSettings
setting :default_language, default: nil
setting :default_sensitive, default: false
setting :default_privacy, default: nil, in: %w(public public_unlisted login unlisted private)
+ setting :default_quote_policy, default: 'public', in: %w(public followers nobody)
setting :stay_privacy, default: false
setting :default_reblog_privacy, default: nil
setting :disabled_visibilities, default: %w()
@@ -40,7 +41,6 @@ class UserSettings
setting :dtl_force_visibility, default: :unchange, in: %w(unchange public public_unlisted unlisted)
setting :dtl_force_searchability, default: :unchange, in: %w(unchange public public_unlisted)
setting :lock_follow_from_bot, default: false
- setting :allow_quote, default: true
setting :reject_send_limited_to_suspects, default: false
setting_inverse_alias :indexable, :noindex
@@ -75,18 +75,13 @@ class UserSettings
setting :auto_play, default: true
setting :simple_timeline_menu, default: false
setting :boost_menu, default: false
- setting :show_quote_in_home, default: true
- setting :show_quote_in_public, default: false
setting :show_relationships, default: true
- setting :hide_blocking_quote, default: true
setting :hide_emoji_reaction_unavailable_server, default: false
- setting :hide_quote_unavailable_server, default: false
setting :hide_status_reference_unavailable_server, default: false
setting :hide_favourite_menu, default: false
setting :hide_emoji_reaction_count, default: false
setting :show_avatar_on_filter, default: true
- setting_inverse_alias :'web.show_blocking_quote', :'web.hide_blocking_quote'
setting_inverse_alias :'web.show_emoji_reaction_count', :'web.hide_emoji_reaction_count'
setting_inverse_alias :'web.show_favourite_menu', :'web.hide_favourite_menu'
setting_inverse_alias :'web.show_recent_emojis', :'web.hide_recent_emojis'
diff --git a/app/models/user_settings/glue.rb b/app/models/user_settings/glue.rb
index 02066a4110..c5ee1283e2 100644
--- a/app/models/user_settings/glue.rb
+++ b/app/models/user_settings/glue.rb
@@ -17,7 +17,7 @@ module UserSettings::Glue
self.class.definition_for(key)&.type
end
- def has_attribute?(key) # rubocop:disable Naming/PredicateName
+ def has_attribute?(key) # rubocop:disable Naming/PredicatePrefix
self.class.definition_for?(key)
end
end
diff --git a/app/models/web/push_subscription.rb b/app/models/web/push_subscription.rb
index 12d843cd09..25140598a5 100644
--- a/app/models/web/push_subscription.rb
+++ b/app/models/web/push_subscription.rb
@@ -12,13 +12,13 @@
# standard :boolean default(FALSE), not null
# created_at :datetime not null
# updated_at :datetime not null
-# access_token_id :bigint(8)
-# user_id :bigint(8)
+# access_token_id :bigint(8) not null
+# user_id :bigint(8) not null
#
class Web::PushSubscription < ApplicationRecord
- belongs_to :user, optional: true
- belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', optional: true
+ belongs_to :user
+ belongs_to :access_token, class_name: 'Doorkeeper::AccessToken'
has_one :session_activation, foreign_key: 'web_push_subscription_id', inverse_of: :web_push_subscription, dependent: nil
@@ -28,7 +28,7 @@ class Web::PushSubscription < ApplicationRecord
validates_with WebPushKeyValidator
- delegate :locale, to: :associated_user
+ delegate :locale, to: :user
generates_token_for :unsubscribe, expires_in: Web::PushNotificationWorker::TTL
@@ -36,24 +36,8 @@ class Web::PushSubscription < ApplicationRecord
policy_allows_notification?(notification) && alert_enabled_for_notification_type?(notification)
end
- def associated_user
- return @associated_user if defined?(@associated_user)
-
- @associated_user = if user_id.nil?
- session_activation.user
- else
- user
- end
- end
-
def associated_access_token
- return @associated_access_token if defined?(@associated_access_token)
-
- @associated_access_token = if access_token_id.nil?
- find_or_create_access_token.token
- else
- access_token.token
- end
+ access_token.token
end
class << self
@@ -65,16 +49,6 @@ class Web::PushSubscription < ApplicationRecord
private
- def find_or_create_access_token
- Doorkeeper::AccessToken.find_or_create_for(
- application: Doorkeeper::Application.find_by(superapp: true),
- resource_owner: user_id || session_activation.user_id,
- scopes: Doorkeeper::OAuth::Scopes.from_string('read write follow push'),
- expires_in: Doorkeeper.configuration.access_token_expires_in,
- use_refresh_token: Doorkeeper.configuration.refresh_token_enabled?
- )
- end
-
def alert_enabled_for_notification_type?(notification)
truthy?(data&.dig('alerts', notification.type.to_s))
end
diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb
index f846a9bc75..c8f9af1ee4 100644
--- a/app/policies/status_policy.rb
+++ b/app/policies/status_policy.rb
@@ -47,10 +47,6 @@ class StatusPolicy < ApplicationPolicy
show? && !blocking_author?
end
- def quote?
- %i(public public_unlisted unlisted).include?(record.visibility.to_sym) && show? && !blocking_author?
- end
-
def destroy?
owned?
end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index 92415a6903..6923f565ef 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -47,7 +47,7 @@ class InstancePresenter < ActiveModelSerializers::Model
end
def rules
- Rule.ordered
+ Rule.ordered.includes(:translations)
end
def user_count
diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb
index e42bdb560f..7c395c6000 100644
--- a/app/presenters/status_relationships_presenter.rb
+++ b/app/presenters/status_relationships_presenter.rb
@@ -3,42 +3,56 @@
class StatusRelationshipsPresenter
PINNABLE_VISIBILITIES = %w(public public_unlisted unlisted login private).freeze
- attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map, :blocks_map, :domain_blocks_map,
+ attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map,
:bookmarks_map, :filters_map, :attributes_map, :emoji_reaction_allows_map
def initialize(statuses, current_account_id = nil, **options)
@current_account_id = current_account_id
+ # Keeping a reference to @statuses is ok since `StatusRelationshipsPresenter`
+ # basically never outlives the statuses collection it is passed
+ @statuses = statuses
+
if current_account_id.nil?
- @reblogs_map = {}
- @favourites_map = {}
- @bookmarks_map = {}
- @mutes_map = {}
- @blocks_map = {}
- @domain_blocks_map = {}
- @pins_map = {}
- @filters_map = {}
+ @preloaded_account_relations = {}
+ @filters_map = {}
+ @reblogs_map = {}
+ @favourites_map = {}
+ @bookmarks_map = {}
+ @mutes_map = {}
+ @pins_map = {}
+ @attributes_map = {}
@emoji_reaction_allows_map = nil
else
- statuses = statuses.compact
- statuses += statuses.filter_map(&:quote)
- status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq.compact
- conversation_ids = statuses.filter_map(&:conversation_id).uniq
- pinnable_status_ids = statuses.map(&:proper).filter_map { |s| s.id if s.account_id == current_account_id && PINNABLE_VISIBILITIES.include?(s.visibility) }
+ @preloaded_account_relations = nil
- @filters_map = build_filters_map(statuses, current_account_id).merge(options[:filters_map] || {})
- @reblogs_map = Status.reblogs_map(status_ids, current_account_id).merge(options[:reblogs_map] || {})
- @favourites_map = Status.favourites_map(status_ids, current_account_id).merge(options[:favourites_map] || {})
- @bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {})
- @mutes_map = Status.mutes_map(conversation_ids, current_account_id).merge(options[:mutes_map] || {})
- @blocks_map = Status.blocks_map(statuses.map(&:account_id), current_account_id).merge(options[:blocks_map] || {})
- @domain_blocks_map = Status.domain_blocks_map(statuses.filter_map { |status| status.account.domain }.uniq, current_account_id).merge(options[:domain_blocks_map] || {})
- @pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {})
+ statuses = statuses.compact
+ status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id, s.proper.quote&.quoted_status_id] }.uniq.compact
+ conversation_ids = statuses.flat_map { |s| [s.proper.conversation_id, s.proper.quote&.quoted_status&.conversation_id] }.uniq.compact
+ pinnable_status_ids = statuses.flat_map { |s| [s.proper, s.proper.quote&.quoted_status] }.compact.filter_map { |s| s.id if s.account_id == current_account_id && PINNABLE_VISIBILITIES.include?(s.visibility) }
+
+ @filters_map = build_filters_map(statuses.flat_map { |s| [s, s.proper.quote&.quoted_status] }.compact.uniq, current_account_id).merge(options[:filters_map] || {})
+ @reblogs_map = Status.reblogs_map(status_ids, current_account_id).merge(options[:reblogs_map] || {})
+ @favourites_map = Status.favourites_map(status_ids, current_account_id).merge(options[:favourites_map] || {})
+ @bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {})
+ @mutes_map = Status.mutes_map(conversation_ids, current_account_id).merge(options[:mutes_map] || {})
+ @pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {})
@emoji_reaction_allows_map = Status.emoji_reaction_allows_map(status_ids, current_account_id).merge(options[:emoji_reaction_allows_map] || {})
@attributes_map = options[:attributes_map] || {}
end
end
+ # This one is currently on-demand as it is only used for quote posts
+ def preloaded_account_relations
+ @preloaded_account_relations ||= begin
+ accounts = @statuses.compact.flat_map { |s| [s.account, s.proper.account, s.proper.quote&.quoted_account] }.uniq.compact
+
+ account_ids = accounts.pluck(:id)
+ account_domains = accounts.pluck(:domain).uniq
+ Account.find(@current_account_id).relations_map(account_ids, account_domains)
+ end
+ end
+
private
def build_filters_map(statuses, current_account_id)
diff --git a/app/presenters/tag_relationships_presenter.rb b/app/presenters/tag_relationships_presenter.rb
index 52e24314be..922eb7a39b 100644
--- a/app/presenters/tag_relationships_presenter.rb
+++ b/app/presenters/tag_relationships_presenter.rb
@@ -1,13 +1,15 @@
# frozen_string_literal: true
class TagRelationshipsPresenter
- attr_reader :following_map
+ attr_reader :following_map, :featuring_map
def initialize(tags, current_account_id = nil, **options)
- @following_map = if current_account_id.nil?
- {}
- else
- TagFollow.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:following_map] || {})
- end
+ if current_account_id.nil?
+ @following_map = {}
+ @featuring_map = {}
+ else
+ @following_map = TagFollow.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:following_map] || {})
+ @featuring_map = FeaturedTag.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:featuring_map] || {})
+ end
end
end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index d778440450..49c39a2c47 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -3,7 +3,7 @@
class ActivityPub::NoteSerializer < ActivityPub::Serializer
include FormattingHelper
- context_extensions :atom_uri, :conversation, :sensitive, :voters_count, :searchable_by, :references, :limited_scope, :quote_uri
+ context_extensions :atom_uri, :conversation, :sensitive, :voters_count, :searchable_by, :references, :limited_scope
attributes :id, :type, :summary,
:in_reply_to, :published, :url,
@@ -16,9 +16,6 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
attribute :updated, if: :edited?
attribute :limited_scope, if: :limited_visibility?
- attribute :quote_uri, if: :quote?
- attribute :misskey_quote, key: :_misskey_quote, if: :quote?
-
has_many :virtual_attachments, key: :attachment
has_many :virtual_tags, key: :tag
@@ -158,30 +155,7 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
end
def virtual_tags
- object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis + virtual_tags_of_quote
- end
-
- class NoteLink < ActiveModelSerializers::Model
- attributes :href
- end
-
- class NoteLinkSerializer < ActivityPub::Serializer
- attributes :type, :href
- attribute :media_type, key: :mediaType
-
- def type
- 'Link'
- end
-
- def media_type
- 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
- end
- end
-
- def virtual_tags_of_quote
- return [] unless object.quote?
-
- [NoteLink.new(href: quote_uri)]
+ object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis
end
def atom_uri
@@ -218,20 +192,6 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
object.account.local?
end
- delegate :quote?, to: :object
-
- def quote_post
- @quote_post ||= object.quote
- end
-
- def quote_uri
- ActivityPub::TagManager.instance.uri_for(quote_post)
- end
-
- def misskey_quote
- quote_uri
- end
-
def poll_options
object.preloadable_poll.loaded_options
end
diff --git a/app/serializers/activitypub/quote_request_serializer.rb b/app/serializers/activitypub/quote_request_serializer.rb
new file mode 100644
index 0000000000..d68b3c2d87
--- /dev/null
+++ b/app/serializers/activitypub/quote_request_serializer.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class ActivityPub::QuoteRequestSerializer < ActivityPub::Serializer
+ context_extensions :quote_requests
+
+ attributes :id, :type, :actor, :instrument
+ attribute :virtual_object, key: :object
+
+ def id
+ object.activity_uri || [ActivityPub::TagManager.instance.uri_for(object.target_account), '#quote_requests/', object.id].join
+ end
+
+ def type
+ 'QuoteRequest'
+ end
+
+ def actor
+ ActivityPub::TagManager.instance.uri_for(object.account)
+ end
+
+ def virtual_object
+ ActivityPub::TagManager.instance.uri_for(object.quoted_status)
+ end
+
+ def instrument
+ ActivityPub::TagManager.instance.uri_for(object.status)
+ end
+end
diff --git a/app/serializers/activitypub/reject_quote_request_serializer.rb b/app/serializers/activitypub/reject_quote_request_serializer.rb
new file mode 100644
index 0000000000..791d8d730e
--- /dev/null
+++ b/app/serializers/activitypub/reject_quote_request_serializer.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class ActivityPub::RejectQuoteRequestSerializer < ActivityPub::Serializer
+ attributes :id, :type, :actor
+
+ has_one :object, serializer: ActivityPub::QuoteRequestSerializer
+
+ def id
+ [ActivityPub::TagManager.instance.uri_for(object.quoted_account), '#rejects/quote_requests/', object.id].join
+ end
+
+ def type
+ 'Reject'
+ end
+
+ def actor
+ ActivityPub::TagManager.instance.uri_for(object.quoted_account)
+ end
+end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index 7fbee3a626..f52a97c4f6 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -26,7 +26,7 @@ class InitialStateSerializer < ActiveModel::Serializer
store[:display_media] = object_account_user.setting_display_media
store[:expand_spoilers] = object_account_user.setting_expand_spoilers
store[:enable_emoji_reaction] = object_account_user.setting_enable_emoji_reaction && Setting.enable_emoji_reaction
- store[:enable_dtl_menu] = object_account_user.setting_enable_dtl_menu
+ store[:enable_dtl_menu] = object_account_user.setting_enable_dtl_menu && dtl_enabled?
store[:reduce_motion] = object_account_user.setting_reduce_motion
store[:disable_swiping] = object_account_user.setting_disable_swiping
store[:disable_hover_cards] = object_account_user.setting_disable_hover_cards
@@ -40,14 +40,10 @@ class InitialStateSerializer < ActiveModel::Serializer
store[:hide_items] = [
object_account_user.setting_hide_favourite_menu ? 'favourite_menu' : nil,
object_account_user.setting_hide_recent_emojis ? 'recent_emojis' : nil,
- object_account_user.setting_hide_blocking_quote ? 'blocking_quote' : nil,
object_account_user.setting_hide_emoji_reaction_unavailable_server ? 'emoji_reaction_unavailable_server' : nil,
- object_account_user.setting_hide_quote_unavailable_server ? 'quote_unavailable_server' : nil,
object_account_user.setting_hide_status_reference_unavailable_server ? 'status_reference_unavailable_server' : nil,
object_account_user.setting_hide_emoji_reaction_count ? 'emoji_reaction_count' : nil,
object_account_user.setting_show_emoji_reaction_on_timeline ? nil : 'emoji_reaction_on_timeline',
- object_account_user.setting_show_quote_in_home ? nil : 'quote_in_home',
- object_account_user.setting_show_quote_in_public ? nil : 'quote_in_public',
object_account_user.setting_show_relationships ? nil : 'relationships',
object_account_user.setting_show_avatar_on_filter ? nil : 'avatar_on_filter',
].compact
diff --git a/app/serializers/oembed_serializer.rb b/app/serializers/oembed_serializer.rb
index c87f14f26b..077c47d027 100644
--- a/app/serializers/oembed_serializer.rb
+++ b/app/serializers/oembed_serializer.rb
@@ -75,7 +75,7 @@ class OEmbedSerializer < ActiveModel::Serializer
<<~HTML.squish
-
+
Post by @#{object.account.pretty_acct}@#{provider_name}
View on Mastodon
diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb
index 1a7b9265f1..96573c94f2 100644
--- a/app/serializers/rest/application_serializer.rb
+++ b/app/serializers/rest/application_serializer.rb
@@ -18,6 +18,6 @@ class REST::ApplicationSerializer < ActiveModel::Serializer
end
def vapid_key
- Rails.configuration.x.vapid_public_key
+ Rails.configuration.x.vapid.public_key
end
end
diff --git a/app/serializers/rest/base_quote_serializer.rb b/app/serializers/rest/base_quote_serializer.rb
new file mode 100644
index 0000000000..20a53d1a20
--- /dev/null
+++ b/app/serializers/rest/base_quote_serializer.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class REST::BaseQuoteSerializer < ActiveModel::Serializer
+ attributes :state
+
+ def state
+ return object.state unless object.accepted?
+
+ # Extra states when a status is unavailable
+ return 'deleted' if object.quoted_status.nil?
+ return 'unauthorized' if status_filter.filtered?
+
+ object.state
+ end
+
+ def quoted_status
+ object.quoted_status if object.accepted? && object.quoted_status.present? && !status_filter.filtered?
+ end
+
+ private
+
+ def status_filter
+ @status_filter ||= StatusFilter.new(object.quoted_status, current_user&.account, instance_options[:relationships]&.preloaded_account_relations || {})
+ end
+end
diff --git a/app/serializers/rest/custom_emoji_slim_serializer.rb b/app/serializers/rest/custom_emoji_slim_serializer.rb
index 6b17c15a03..13d024502a 100644
--- a/app/serializers/rest/custom_emoji_slim_serializer.rb
+++ b/app/serializers/rest/custom_emoji_slim_serializer.rb
@@ -53,7 +53,7 @@ class REST::CustomEmojiSlimSerializer < ActiveModel::Serializer
object.is_sensitive
end
- def is_sensitive # rubocop:disable Naming/PredicateName
+ def is_sensitive # rubocop:disable Naming/PredicatePrefix
sensitive
end
end
diff --git a/app/serializers/rest/filter_serializer.rb b/app/serializers/rest/filter_serializer.rb
index 578cf16d98..55e74de49a 100644
--- a/app/serializers/rest/filter_serializer.rb
+++ b/app/serializers/rest/filter_serializer.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class REST::FilterSerializer < ActiveModel::Serializer
- attributes :id, :title, :exclude_follows, :exclude_localusers, :with_quote, :with_profile, :context, :expires_at, :filter_action
+ attributes :id, :title, :exclude_follows, :exclude_localusers, :with_profile, :context, :expires_at, :filter_action
has_many :keywords, serializer: REST::FilterKeywordSerializer, if: :rules_requested?
has_many :statuses, serializer: REST::FilterStatusSerializer, if: :rules_requested?
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index b786baedfa..6974a764bd 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -51,7 +51,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
def usage
{
users: {
- active_month: object.active_user_count(4),
+ active_month: limited_federation? ? 0 : object.active_user_count(4),
},
}
end
@@ -67,7 +67,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
},
vapid: {
- public_key: Rails.configuration.x.vapid_public_key,
+ public_key: Rails.configuration.x.vapid.public_key,
},
accounts: {
@@ -123,6 +123,8 @@ class REST::InstanceSerializer < ActiveModel::Serializer
search: {
enabled: Chewy.enabled?,
},
+
+ limited_federation: limited_federation?,
}
end
@@ -152,6 +154,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer
markdown.render(Setting.closed_registrations_message) if Setting.closed_registrations_message.present?
end
+ def limited_federation?
+ Rails.configuration.x.limited_federation_mode
+ end
+
def markdown
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, no_images: true)
end
diff --git a/app/serializers/rest/quote_serializer.rb b/app/serializers/rest/quote_serializer.rb
new file mode 100644
index 0000000000..6f2eede0ea
--- /dev/null
+++ b/app/serializers/rest/quote_serializer.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class REST::QuoteSerializer < REST::BaseQuoteSerializer
+ has_one :quoted_status, serializer: REST::ShallowStatusSerializer
+end
diff --git a/app/serializers/rest/rule_serializer.rb b/app/serializers/rest/rule_serializer.rb
index 9e2bcda15e..3ce2d02e66 100644
--- a/app/serializers/rest/rule_serializer.rb
+++ b/app/serializers/rest/rule_serializer.rb
@@ -1,9 +1,15 @@
# frozen_string_literal: true
class REST::RuleSerializer < ActiveModel::Serializer
- attributes :id, :text, :hint
+ attributes :id, :text, :hint, :translations
def id
object.id.to_s
end
+
+ def translations
+ object.translations.to_h do |translation|
+ [translation.language, { text: translation.text, hint: translation.hint }]
+ end
+ end
end
diff --git a/app/serializers/rest/shallow_quote_serializer.rb b/app/serializers/rest/shallow_quote_serializer.rb
new file mode 100644
index 0000000000..1f5f229d43
--- /dev/null
+++ b/app/serializers/rest/shallow_quote_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::ShallowQuoteSerializer < REST::BaseQuoteSerializer
+ attribute :quoted_status_id
+
+ def quoted_status_id
+ quoted_status&.id&.to_s
+ end
+end
diff --git a/app/serializers/rest/shallow_status_serializer.rb b/app/serializers/rest/shallow_status_serializer.rb
new file mode 100644
index 0000000000..ca0ac8f4f4
--- /dev/null
+++ b/app/serializers/rest/shallow_status_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::ShallowStatusSerializer < REST::StatusSerializer
+ has_one :quote, key: :quote, serializer: REST::ShallowQuoteSerializer
+
+ # It looks like redefining one `has_one` requires redefining all inherited ones
+ has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
+ has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
+end
diff --git a/app/serializers/rest/status_edit_serializer.rb b/app/serializers/rest/status_edit_serializer.rb
index 8d8923bf14..838055afd7 100644
--- a/app/serializers/rest/status_edit_serializer.rb
+++ b/app/serializers/rest/status_edit_serializer.rb
@@ -11,6 +11,8 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
has_many :ordered_media_attachments, key: :media_attachments, serializer: REST::MediaAttachmentSerializer
has_many :emojis, serializer: REST::CustomEmojiSlimSerializer
+ has_one :quote, serializer: REST::QuoteSerializer, if: -> { object.quote_id.present? }
+
attribute :poll, if: -> { object.poll_options.present? }
def content
@@ -24,4 +26,8 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
def markdown_opt
object.markdown
end
+
+ def quote
+ object.quote_id == status.quote&.id ? status.quote : Quote.new(state: :pending)
+ end
end
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 21fb3ae399..71e3eec251 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -18,7 +18,6 @@ class REST::StatusSerializer < ActiveModel::Serializer
attribute :pinned, if: :pinnable?
attribute :reactions, if: :reactions?
attribute :expires_at, if: :will_expire?
- attribute :quote_id, if: :quote?
attribute :markdown_opt, key: :markdown
has_many :filtered, serializer: REST::FilterResultSerializer, if: :current_user?
@@ -34,25 +33,13 @@ class REST::StatusSerializer < ActiveModel::Serializer
has_many :tags
has_many :emojis, serializer: REST::CustomEmojiSlimSerializer
+ has_one :quote, key: :quote, serializer: REST::QuoteSerializer
has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
- class QuotedStatusSerializer < REST::StatusSerializer
- attribute :quote_muted, if: :current_user?
-
- def quote
- nil
- end
-
- def quote_muted
- if relationships
- muted || relationships.blocks_map[object.account_id] || relationships.domain_blocks_map[object.account.domain] || false
- else
- muted || current_user.account.blocking?(object.account_id) || current_user.account.domain_blocking?(object.account.domain)
- end
- end
+ def quote
+ object.quote if object.quote&.acceptable?
end
- belongs_to :quote, if: :quote?, serializer: QuotedStatusSerializer, relationships: -> { relationships }
def id
object.id.to_s
@@ -182,12 +169,6 @@ class REST::StatusSerializer < ActiveModel::Serializer
end
end
- def quote_id
- object.quote_of_id.to_s
- end
-
- delegate :quote?, to: :object
-
def reblogged
if relationships
relationships.reblogs_map[object.id] || false
diff --git a/app/serializers/rest/tag_serializer.rb b/app/serializers/rest/tag_serializer.rb
index a2bcb5fd1f..f41a1513db 100644
--- a/app/serializers/rest/tag_serializer.rb
+++ b/app/serializers/rest/tag_serializer.rb
@@ -6,6 +6,7 @@ class REST::TagSerializer < ActiveModel::Serializer
attributes :id, :name, :url, :history
attribute :following, if: :current_user?
+ attribute :featuring, if: :current_user?
def id
object.id.to_s
@@ -27,6 +28,14 @@ class REST::TagSerializer < ActiveModel::Serializer
end
end
+ def featuring
+ if instance_options && instance_options[:relationships]
+ instance_options[:relationships].featuring_map[object.id] || false
+ else
+ FeaturedTag.exists?(tag_id: object.id, account_id: current_user.account_id)
+ end
+ end
+
def current_user?
!current_user.nil?
end
diff --git a/app/serializers/rest/web_push_subscription_serializer.rb b/app/serializers/rest/web_push_subscription_serializer.rb
index 01825a3bb0..11893f7c48 100644
--- a/app/serializers/rest/web_push_subscription_serializer.rb
+++ b/app/serializers/rest/web_push_subscription_serializer.rb
@@ -10,7 +10,7 @@ class REST::WebPushSubscriptionSerializer < ActiveModel::Serializer
end
def server_key
- Rails.configuration.x.vapid_public_key
+ Rails.configuration.x.vapid.public_key
end
def policy
diff --git a/app/serializers/web/notification_serializer.rb b/app/serializers/web/notification_serializer.rb
index fb2f7248a6..1c2b26bf5b 100644
--- a/app/serializers/web/notification_serializer.rb
+++ b/app/serializers/web/notification_serializer.rb
@@ -13,7 +13,7 @@ class Web::NotificationSerializer < ActiveModel::Serializer
end
def preferred_locale
- current_push_subscription.associated_user&.locale || I18n.default_locale
+ current_push_subscription.user&.locale || I18n.default_locale
end
def notification_id
diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb
index 8fa2bc14ea..d63ba621bc 100644
--- a/app/services/account_search_service.rb
+++ b/app/services/account_search_service.rb
@@ -142,11 +142,37 @@ class AccountSearchService < BaseService
def core_query
{
- multi_match: {
- query: @query,
- type: 'best_fields',
- fields: %w(username^2 display_name^2 text text.*),
- operator: 'and',
+ dis_max: {
+ queries: [
+ {
+ match: {
+ username: {
+ query: @query,
+ analyzer: 'word_join_analyzer',
+ },
+ },
+ },
+
+ {
+ match: {
+ display_name: {
+ query: @query,
+ analyzer: 'word_join_analyzer',
+ },
+ },
+ },
+
+ {
+ multi_match: {
+ query: @query,
+ type: 'best_fields',
+ fields: %w(text text.*),
+ operator: 'and',
+ },
+ },
+ ],
+
+ tie_breaker: 0.5,
},
}
end
diff --git a/app/services/activitypub/fetch_featured_collection_service.rb b/app/services/activitypub/fetch_featured_collection_service.rb
index 25c62f3be6..352e1cbf5b 100644
--- a/app/services/activitypub/fetch_featured_collection_service.rb
+++ b/app/services/activitypub/fetch_featured_collection_service.rb
@@ -4,13 +4,12 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
include JsonLdHelper
def call(account, **options)
- return if account.featured_collection_url.blank? || account.suspended? || account.local?
+ return if (account.featured_collection_url.blank? && options[:collection].blank?) || account.suspended? || account.local?
@account = account
@options = options
- @json = fetch_resource(@account.featured_collection_url, true, local_follower)
-
- return unless supported_context?(@json)
+ @json = fetch_collection(options[:collection].presence || @account.featured_collection_url)
+ return if @json.blank?
process_items(collection_items(@json))
end
diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb
index f2e4f45104..6a6d9e391a 100644
--- a/app/services/activitypub/fetch_replies_service.rb
+++ b/app/services/activitypub/fetch_replies_service.rb
@@ -57,20 +57,7 @@ class ActivityPub::FetchRepliesService < BaseService
return unless @allow_synchronous_requests
return if non_matching_uri_hosts?(@reference_uri, collection_or_uri)
- # NOTE: For backward compatibility reasons, Mastodon signs outgoing
- # queries incorrectly by default.
- #
- # While this is relevant for all URLs with query strings, this is
- # the only code path where this happens in practice.
- #
- # Therefore, retry with correct signatures if this fails.
- begin
- fetch_resource_without_id_validation(collection_or_uri, nil, raise_on_error: :temporary)
- rescue Mastodon::UnexpectedResponseError => e
- raise unless e.response && e.response.code == 401 && Addressable::URI.parse(collection_or_uri).query.present?
-
- fetch_resource_without_id_validation(collection_or_uri, nil, raise_on_error: :temporary, request_options: { omit_query_string: false })
- end
+ fetch_resource_without_id_validation(collection_or_uri, nil, raise_on_error: :temporary)
end
def filter_replies(items)
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 5c55defbda..d7393d86b4 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -62,7 +62,7 @@ class ActivityPub::ProcessAccountService < BaseService
after_suspension_change! if suspension_changed?
unless @options[:only_key] || (@account.suspended? && !@account.remote_pending)
- check_featured_collection! if @account.featured_collection_url.present?
+ check_featured_collection! if @json['featured'].present?
check_featured_tags_collection! if @json['featuredTags'].present?
check_links! if @account.fields.any?(&:requires_verification?)
end
@@ -138,7 +138,7 @@ class ActivityPub::ProcessAccountService < BaseService
end
def set_immediate_attributes!
- @account.featured_collection_url = @json['featured'] || ''
+ @account.featured_collection_url = valid_collection_uri(@json['featured'])
@account.display_name = @json['name'] || ''
@account.note = @json['summary'] || ''
@account.locked = @json['manuallyApprovesFollowers'] || false
@@ -223,7 +223,7 @@ class ActivityPub::ProcessAccountService < BaseService
end
def check_featured_collection!
- ActivityPub::SynchronizeFeaturedCollectionWorker.perform_async(@account.id, { 'hashtag' => @json['featuredTags'].blank?, 'request_id' => @options[:request_id] })
+ ActivityPub::SynchronizeFeaturedCollectionWorker.perform_async(@account.id, { 'hashtag' => @json['featuredTags'].blank?, 'collection' => @json['featured'], 'request_id' => @options[:request_id] })
end
def check_featured_tags_collection!
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index 10224f4d7e..5cd73f703c 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -13,12 +13,13 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@activity_json = activity_json
@json = object_json
- @status_parser = ActivityPub::Parser::StatusParser.new(@json, account: status.account)
+ @status_parser = ActivityPub::Parser::StatusParser.new(@json, account: status.account, followers_collection: status.account.followers_url, actor_uri: ActivityPub::TagManager.instance.uri_for(status.account))
@uri = @status_parser.uri
@status = status
@account = status.account
@media_attachments_changed = false
@poll_changed = false
+ @quote_changed = false
@request_id = request_id
# Only native types can be updated at the moment
@@ -49,6 +50,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
Status.transaction do
record_previous_edit!
update_media_attachments!
+ update_interaction_policies!
update_poll!
update_immediate_attributes!
update_metadata!
@@ -72,12 +74,17 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
def handle_implicit_update!
with_redis_lock("create:#{@uri}") do
+ update_interaction_policies!
update_poll!(allow_significant_changes: false)
queue_poll_notifications!
update_counts!
end
end
+ def update_interaction_policies!
+ @status.quote_approval_policy = @status_parser.quote_policy
+ end
+
def update_media_attachments!
previous_media_attachments = @status.media_attachments.to_a
previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id)
@@ -190,7 +197,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
sensitive: @status.sensitive,
media_count: @next_media_attachments.size,
poll_count: @status.poll&.options&.size || 0,
- quote: quote,
+ quote: @status_parser.quote_uri,
reply: @status.reply?,
mention_count: @status.mentions.count,
reference_count: reference_uris.size,
@@ -217,7 +224,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
process_sensitive_words
- @significant_changes = text_significantly_changed? || @status.spoiler_text_changed? || @media_attachments_changed || @poll_changed
+ @significant_changes = text_significantly_changed? || @status.spoiler_text_changed? || @media_attachments_changed || @poll_changed || @quote_changed
@status.edited_at = @status_parser.edited_at if significant_changes?
@@ -252,6 +259,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
update_tags!
update_mentions!
update_emojis!
+ update_quote!
end
def update_tags!
@@ -340,7 +348,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
def update_references!
references = reference_uris
- ProcessReferencesService.call_service_without_error(@status, [], references, [quote].compact)
+ ProcessReferencesService.call_service_without_error(@status, [], references)
end
def reference_uris
@@ -350,10 +358,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@reference_uris += ProcessReferencesService.extract_uris(@json['content'] || '')
end
- def quote
- @json['quote'] || @json['quoteUrl'] || @json['quoteURL'] || @json['_misskey_quote']
- end
-
def local_referred_accounts
return @local_referred_accounts if defined?(@local_referred_accounts)
@@ -364,6 +368,44 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@local_referred_accounts = local_referred_statuses.map(&:account)
end
+ def update_quote!
+ quote_uri = @status_parser.quote_uri
+
+ if quote_uri.present?
+ approval_uri = @status_parser.quote_approval_uri
+ approval_uri = nil if unsupported_uri_scheme?(approval_uri)
+
+ if @status.quote.present?
+ # If the quoted post has changed, discard the old object and create a new one
+ if @status.quote.quoted_status.present? && ActivityPub::TagManager.instance.uri_for(@status.quote.quoted_status) != quote_uri
+ @status.quote.destroy
+ quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?)
+ @quote_changed = true
+ else
+ quote = @status.quote
+ quote.update(approval_uri: approval_uri, state: :pending, legacy: @status_parser.legacy_quote?) if quote.approval_uri != @status_parser.quote_approval_uri
+ end
+ else
+ quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?)
+ @quote_changed = true
+ end
+
+ quote.save
+
+ fetch_and_verify_quote!(quote, quote_uri)
+ elsif @status.quote.present?
+ @status.quote.destroy!
+ @quote_changed = true
+ end
+ end
+
+ def fetch_and_verify_quote!(quote, quote_uri)
+ embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @activity_json['context'])
+ ActivityPub::VerifyQuoteService.new.call(quote, fetchable_quoted_uri: quote_uri, prefetched_quoted_object: embedded_quote, request_id: @request_id)
+ rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
+ ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, quote.id, quote_uri, { 'request_id' => @request_id })
+ end
+
def update_counts!
likes = @status_parser.favourites_count
shares = @status_parser.reblogs_count
diff --git a/app/services/activitypub/verify_quote_service.rb b/app/services/activitypub/verify_quote_service.rb
new file mode 100644
index 0000000000..ad4dfbe310
--- /dev/null
+++ b/app/services/activitypub/verify_quote_service.rb
@@ -0,0 +1,112 @@
+# frozen_string_literal: true
+
+class ActivityPub::VerifyQuoteService < BaseService
+ include JsonLdHelper
+
+ # Optionally fetch quoted post, and verify the quote is authorized
+ def call(quote, fetchable_quoted_uri: nil, prefetched_quoted_object: nil, prefetched_approval: nil, request_id: nil)
+ @request_id = request_id
+ @quote = quote
+ @fetching_error = nil
+
+ fetch_quoted_post_if_needed!(fetchable_quoted_uri, prefetched_body: prefetched_quoted_object)
+ return if fast_track_approval! || quote.approval_uri.blank?
+
+ @json = fetch_approval_object(quote.approval_uri, prefetched_body: prefetched_approval)
+ return quote.reject! if @json.nil?
+
+ return if non_matching_uri_hosts?(quote.approval_uri, value_or_id(@json['attributedTo']))
+ return unless matching_type? && matching_quote_uri?
+
+ # Opportunistically import embedded posts if needed
+ return if import_quoted_post_if_needed!(fetchable_quoted_uri) && fast_track_approval!
+
+ # Raise an error if we failed to fetch the status
+ raise @fetching_error if @quote.status.nil? && @fetching_error
+
+ return unless matching_quoted_post? && matching_quoted_author?
+
+ quote.accept!
+ end
+
+ private
+
+ # FEP-044f defines rules that don't require the approval flow
+ def fast_track_approval!
+ return false if @quote.quoted_status_id.blank?
+
+ # Always allow someone to quote themselves
+ if @quote.account_id == @quote.quoted_account_id
+ @quote.accept!
+
+ true
+ end
+
+ # Always allow someone to quote posts in which they are mentioned
+ if @quote.quoted_status.active_mentions.exists?(mentions: { account_id: @quote.account_id })
+ @quote.accept!
+
+ true
+ else
+ false
+ end
+ end
+
+ def fetch_approval_object(uri, prefetched_body: nil)
+ if prefetched_body.nil?
+ fetch_resource(uri, true, @quote.account.followers.local.first, raise_on_error: :temporary)
+ else
+ body_to_json(prefetched_body, compare_id: uri)
+ end
+ end
+
+ def matching_type?
+ supported_context?(@json) && equals_or_includes?(@json['type'], 'QuoteAuthorization')
+ end
+
+ def matching_quote_uri?
+ ActivityPub::TagManager.instance.uri_for(@quote.status) == value_or_id(@json['interactingObject'])
+ end
+
+ def fetch_quoted_post_if_needed!(uri, prefetched_body: nil)
+ return if uri.nil? || @quote.quoted_status.present?
+
+ status = ActivityPub::TagManager.instance.uri_to_resource(uri, Status)
+ status ||= ActivityPub::FetchRemoteStatusService.new.call(uri, on_behalf_of: @quote.account.followers.local.first, prefetched_body:, request_id: @request_id)
+
+ @quote.update(quoted_status: status) if status.present?
+ rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS => e
+ @fetching_error = e
+ end
+
+ def import_quoted_post_if_needed!(uri)
+ # No need to fetch if we already have a post
+ return if uri.nil? || @quote.quoted_status_id.present? || !@json['interactionTarget'].is_a?(Hash)
+
+ # NOTE: Replacing the object's context by that of the parent activity is
+ # not sound, but it's consistent with the rest of the codebase
+ object = @json['interactionTarget'].merge({ '@context' => @json['@context'] })
+
+ # It's not safe to fetch if the inlined object is cross-origin or doesn't match expectations
+ return if object['id'] != uri || non_matching_uri_hosts?(@quote.approval_uri, object['id'])
+
+ status = ActivityPub::FetchRemoteStatusService.new.call(object['id'], prefetched_body: object, on_behalf_of: @quote.account.followers.local.first, request_id: @request_id)
+
+ if status.present?
+ @quote.update(quoted_status: status)
+ true
+ else
+ false
+ end
+ end
+
+ def matching_quoted_post?
+ return false if @quote.quoted_status_id.blank?
+
+ ActivityPub::TagManager.instance.uri_for(@quote.quoted_status) == value_or_id(@json['interactionTarget'])
+ end
+
+ def matching_quoted_author?
+ ActivityPub::TagManager.instance.uri_for(@quote.quoted_account) == value_or_id(@json['attributedTo'])
+ end
+end
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index 1db15d9ccb..715aba6bee 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -3,7 +3,7 @@
class BlockDomainService < BaseService
attr_reader :domain_block
- def call(domain_block, update = false)
+ def call(domain_block, update: false)
@domain_block = domain_block
@domain_block_event = nil
diff --git a/app/services/create_featured_tag_service.rb b/app/services/create_featured_tag_service.rb
index 3cc59156db..13d6ac0201 100644
--- a/app/services/create_featured_tag_service.rb
+++ b/app/services/create_featured_tag_service.rb
@@ -3,18 +3,24 @@
class CreateFeaturedTagService < BaseService
include Payloadable
- def call(account, name, force: true)
+ def call(account, name_or_tag, raise_error: true)
+ raise ArgumentError unless account.local?
+
@account = account
- FeaturedTag.create!(account: account, name: name).tap do |featured_tag|
- ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
- end
- rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid => e
- if force && e.is_a(ActiveRecord::RecordNotUnique)
- FeaturedTag.by_name(name).find_by!(account: account)
- else
- account.featured_tags.new(name: name)
+ @featured_tag = begin
+ if name_or_tag.is_a?(Tag)
+ account.featured_tags.find_or_initialize_by(tag: name_or_tag)
+ else
+ account.featured_tags.find_or_initialize_by(name: name_or_tag)
+ end
end
+
+ create_method = raise_error ? :save! : :save
+
+ ActivityPub::AccountRawDistributionWorker.perform_async(build_json(@featured_tag), @account.id) if @featured_tag.new_record? && @featured_tag.public_send(create_method)
+
+ @featured_tag
end
private
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb
index 590c7c8e82..6e19872926 100644
--- a/app/services/fan_out_on_write_service.rb
+++ b/app/services/fan_out_on_write_service.rb
@@ -115,7 +115,7 @@ class FanOutOnWriteService < BaseService
end
def notify_about_update!
- @status.reblogged_by_accounts.or(@status.quoted_by_accounts).merge(Account.local).select(:id).reorder(nil).find_in_batches do |accounts|
+ @status.reblogged_by_accounts.merge(Account.local).select(:id).reorder(nil).find_in_batches do |accounts|
LocalNotificationWorker.push_bulk(accounts) do |account|
[account.id, @status.id, 'Status', 'update']
end
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 4f1ff0649a..3bc6c47bfa 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -20,7 +20,7 @@ class FetchLinkCardService < BaseService
@status = status
@original_url = parse_urls
- return if @original_url.nil? || @status.with_preview_card?
+ return if @original_url.nil? || @status.with_preview_card? || @status.with_media? || @status.quote.present?
@url = @original_url.to_s
diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb
index 3fde78455c..2382e126bd 100644
--- a/app/services/fetch_resource_service.rb
+++ b/app/services/fetch_resource_service.rb
@@ -22,7 +22,7 @@ class FetchResourceService < BaseService
def process(url, terminal: false)
@url = url
- perform_request { |response| process_response(response, terminal) }
+ perform_request { |response| process_response(response, terminal:) }
end
def perform_request(&block)
@@ -40,7 +40,7 @@ class FetchResourceService < BaseService
end.perform(&block)
end
- def process_response(response, terminal = false)
+ def process_response(response, terminal: false)
@response_code = response.code
return nil if response.code != 200
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index 1ab930e61c..f971ecf0e1 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -49,7 +49,7 @@ class FollowService < BaseService
private
def mark_home_feed_as_partial!
- redis.set("account:#{@source_account.id}:regeneration", true, nx: true, ex: 1.day.seconds)
+ HomeFeed.new(@source_account).regeneration_in_progress!
end
def following_not_possible?
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 61409f7e71..013a4afa01 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -20,6 +20,7 @@ class PostStatusService < BaseService
# @param [Hash] options
# @option [String] :text Message
# @option [Status] :thread Optional status to reply to
+ # @option [Status] :quoted_status Optional status to quote
# @option [Boolean] :sensitive
# @option [String] :visibility
# @option [Boolean] :force_visibility
@@ -41,6 +42,7 @@ class PostStatusService < BaseService
@options = options
@text = @options[:text] || ''
@in_reply_to = @options[:thread]
+ @quoted_status = @options[:quoted_status] || quoted_status_from_text
@antispam = Antispam.new
@@ -164,6 +166,8 @@ class PostStatusService < BaseService
@status.limited_scope = :personal if @status.limited_visibility? && !@status.reply_limited? && !process_mentions_service.mentions?
UpdateStatusExpirationService.new.call(@status)
+
+ attach_quote!(@status)
@antispam.local_preflight_check!(@status)
# The following transaction block is needed to wrap the UPDATEs to
@@ -174,6 +178,22 @@ class PostStatusService < BaseService
end
end
+ def attach_quote!(status)
+ return if @quoted_status.nil?
+
+ # NOTE: for now this is only for convenience in testing, as we don't support the request flow nor serialize quotes in ActivityPub
+ # we only support incoming quotes so far
+
+ status.quote = Quote.new(quoted_status: @quoted_status)
+ status.quote.accept!
+ # status.quote.accept! if @status.account == @quoted_status.account || @quoted_status.active_mentions.exists?(mentions: { account_id: status.account_id })
+
+ # TODO: the following has yet to be implemented:
+ # - handle approval of local users (requires the interactionPolicy PR)
+ # - produce a QuoteAuthorization for quotes of local users
+ # - send a QuoteRequest for quotes of remote users
+ end
+
def safeguard_mentions!(status)
return if @options[:allowed_mentions].nil?
@@ -279,6 +299,13 @@ class PostStatusService < BaseService
ProcessReferencesService.extract_quote(@text)
end
+ def quoted_status_from_text
+ url = quote_url
+ return unless url
+
+ ActivityPub::TagManager.instance.uri_to_resource(url, Status, url: true)
+ end
+
def reference_urls
@reference_urls ||= ProcessReferencesService.extract_uris(@text) || []
end
@@ -382,6 +409,7 @@ class PostStatusService < BaseService
@options.dup.tap do |options_hash|
options_hash[:in_reply_to_id] = options_hash.delete(:thread)&.id
options_hash[:application_id] = options_hash.delete(:application)&.id
+ options_hash[:quoted_status_id] = options_hash.delete(:quoted_status)&.id
options_hash[:scheduled_at] = nil
options_hash[:idempotency] = nil
options_hash[:with_rate_limit] = false
diff --git a/app/services/precompute_feed_service.rb b/app/services/precompute_feed_service.rb
index a591c90913..3eb1d41d92 100644
--- a/app/services/precompute_feed_service.rb
+++ b/app/services/precompute_feed_service.rb
@@ -12,7 +12,7 @@ class PrecomputeFeedService < BaseService
FeedManager.instance.populate_list(list) unless skip_timeline?(:list, list.id)
end
ensure
- redis.del("account:#{account.id}:regeneration")
+ HomeFeed.new(account).regeneration_finished!
end
private
diff --git a/app/services/process_references_service.rb b/app/services/process_references_service.rb
index bbb22a0575..5bfd24cf6b 100644
--- a/app/services/process_references_service.rb
+++ b/app/services/process_references_service.rb
@@ -11,11 +11,10 @@ class ProcessReferencesService < BaseService
QUOTEURL_EXP = /(QT|RN|RE)((:|;)?\s+|:|;)(#{URI::DEFAULT_PARSER.make_regexp(%w(http https))})/
MAX_REFERENCES = 5
- def call(status, reference_parameters, urls: nil, fetch_remote: true, no_fetch_urls: nil, quote_urls: nil)
+ def call(status, reference_parameters, urls: nil, fetch_remote: true, no_fetch_urls: nil)
@status = status
@reference_parameters = reference_parameters || []
- @quote_urls = quote_urls || []
- @urls = (urls - @quote_urls) || []
+ @urls = urls || []
@no_fetch_urls = no_fetch_urls || []
@fetch_remote = fetch_remote
@again = false
@@ -42,8 +41,8 @@ class ProcessReferencesService < BaseService
launch_worker if @again
end
- def self.need_process?(status, reference_parameters, urls, quote_urls)
- reference_parameters.any? || (urls || []).any? || (quote_urls || []).any? || FormattingHelper.extract_status_plain_text(status).scan(REFURL_EXP).pluck(3).uniq.any?
+ def self.need_process?(status, reference_parameters, urls)
+ reference_parameters.any? || (urls || []).any? || FormattingHelper.extract_status_plain_text(status).scan(REFURL_EXP).pluck(3).uniq.any?
end
def self.extract_uris(text, remote: false)
@@ -56,23 +55,17 @@ class ProcessReferencesService < BaseService
text.scan(QUOTEURL_EXP).pick(3)
end
- def self.perform_worker_async(status, reference_parameters, urls, quote_urls)
- return unless need_process?(status, reference_parameters, urls, quote_urls)
+ def self.call_service(status, reference_parameters, urls)
+ return unless need_process?(status, reference_parameters, urls)
- ProcessReferencesWorker.perform_async(status.id, reference_parameters, urls, [], quote_urls || [])
+ ProcessReferencesService.new.call(status, reference_parameters || [], urls: urls || [], fetch_remote: false)
end
- def self.call_service(status, reference_parameters, urls, quote_urls = [])
- return unless need_process?(status, reference_parameters, urls, quote_urls)
-
- ProcessReferencesService.new.call(status, reference_parameters || [], urls: urls || [], fetch_remote: false, quote_urls: quote_urls)
- end
-
- def self.call_service_without_error(status, reference_parameters, urls, quote_urls = [])
- return unless need_process?(status, reference_parameters, urls, quote_urls)
+ def self.call_service_without_error(status, reference_parameters, urls)
+ return unless need_process?(status, reference_parameters, urls)
begin
- ProcessReferencesService.new.call(status, reference_parameters || [], urls: urls || [], quote_urls: quote_urls)
+ ProcessReferencesService.new.call(status, reference_parameters || [], urls: urls || [])
rescue
true
end
@@ -119,7 +112,6 @@ class ProcessReferencesService < BaseService
text = extract_status_plain_text(@status)
url_to_attributes = @urls.index_with('BT')
.merge(text.scan(REFURL_EXP).to_h { |result| [result[3], result[0]] })
- .merge(@quote_urls.index_with('QT'))
url_to_statuses = fetch_statuses(url_to_attributes.keys.uniq)
@@ -130,9 +122,9 @@ class ProcessReferencesService < BaseService
status = url_to_statuses[url]
if status.present?
- quote = quote_attribute?(attribute)
+ quote_attribute?(attribute)
- [status.id, !quote || quotable?(status) ? attribute : 'BT']
+ [status.id, attribute]
else
[url, attribute]
end
@@ -170,10 +162,6 @@ class ProcessReferencesService < BaseService
@referrable = StatusPolicy.new(@status.account, target_status).show?
end
- def quotable?(target_status)
- target_status.account.allow_quote? && StatusPolicy.new(@status.account, target_status).quote?
- end
-
def add_references
return if @added_items.empty?
@@ -185,10 +173,7 @@ class ProcessReferencesService < BaseService
next if status.blank?
attribute_type = @added_items[status_id]
- quote = quote_attribute?(attribute_type)
- @added_objects << @status.reference_objects.new(target_status: status, attribute_type: attribute_type, quote: quote)
-
- @status.update!(quote_of_id: status_id) if quote
+ @added_objects << @status.reference_objects.new(target_status: status, attribute_type: attribute_type)
status.increment_count!(:status_referred_by_count)
@references_count += 1
@@ -214,7 +199,6 @@ class ProcessReferencesService < BaseService
@removed_objects = []
@status.reference_objects.where(target_status: @removed_items.keys).destroy_all
- @status.update!(quote_of_id: nil) if @status.quote_of_id.present? && @removed_items.key?(@status.quote_of_id)
statuses = Status.where(id: @added_items.keys).to_a
@removed_items.each_key do |status_id|
@@ -233,22 +217,12 @@ class ProcessReferencesService < BaseService
@status.reference_objects.where(target_status: @changed_items.keys).find_each do |ref|
attribute_type = @changed_items[ref.target_status_id]
- quote = quote_attribute?(attribute_type)
- quote_change = ref.quote != quote
- ref.update!(attribute_type: attribute_type, quote: quote)
-
- next unless quote_change
-
- if quote
- ref.status.update!(quote_of_id: ref.target_status.id)
- else
- ref.status.update!(quote_of_id: nil)
- end
+ ref.update!(attribute_type: attribute_type)
end
end
def launch_worker
- ProcessReferencesWorker.perform_async(@status.id, @reference_parameters, @urls, @no_fetch_urls, @quote_urls)
+ ProcessReferencesWorker.perform_async(@status.id, @reference_parameters, @urls, @no_fetch_urls)
end
end
diff --git a/app/services/remove_featured_tag_service.rb b/app/services/remove_featured_tag_service.rb
index 2aa70e8fc6..af8c5a64ee 100644
--- a/app/services/remove_featured_tag_service.rb
+++ b/app/services/remove_featured_tag_service.rb
@@ -3,11 +3,24 @@
class RemoveFeaturedTagService < BaseService
include Payloadable
- def call(account, featured_tag)
+ def call(account, featured_tag_or_tag)
+ raise ArgumentError unless account.local?
+
@account = account
- featured_tag.destroy!
- ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
+ @featured_tag = begin
+ if featured_tag_or_tag.is_a?(FeaturedTag)
+ featured_tag_or_tag
+ elsif featured_tag_or_tag.is_a?(Tag)
+ FeaturedTag.find_by(account: account, tag: featured_tag_or_tag)
+ end
+ end
+
+ return if @featured_tag.nil?
+
+ @featured_tag.destroy!
+
+ ActivityPub::AccountRawDistributionWorker.perform_async(build_json(@featured_tag), account.id) if @account.local?
end
private
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 3934a738f7..1b9d051b38 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -15,6 +15,7 @@ class SuspendAccountService < BaseService
unmerge_from_home_timelines!
unmerge_from_list_timelines!
privatize_media_attachments!
+ remove_from_trends!
end
private
@@ -95,12 +96,16 @@ class SuspendAccountService < BaseService
end
end
- CacheBusterWorker.perform_async(attachment.url(style)) if Rails.configuration.x.cache_buster_enabled
+ CacheBusterWorker.perform_async(attachment.url(style)) if Rails.configuration.x.cache_buster.enabled
end
end
end
end
+ def remove_from_trends!
+ StatusTrend.where(account: @account).delete_all
+ end
+
def signed_activity_json
@signed_activity_json ||= Oj.dump(serialize_payload(@account, ActivityPub::UpdateSerializer, signer: @account))
end
diff --git a/app/services/unsuspend_account_service.rb b/app/services/unsuspend_account_service.rb
index 7d3bb806a6..8ad01737ae 100644
--- a/app/services/unsuspend_account_service.rb
+++ b/app/services/unsuspend_account_service.rb
@@ -91,7 +91,7 @@ class UnsuspendAccountService < BaseService
end
end
- CacheBusterWorker.perform_async(attachment.url(style)) if Rails.configuration.x.cache_buster_enabled
+ CacheBusterWorker.perform_async(attachment.url(style)) if Rails.configuration.x.cache_buster.enabled
end
end
end
diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb
index bc9a22d45f..9b57b6d1cf 100644
--- a/app/services/update_status_service.rb
+++ b/app/services/update_status_service.rb
@@ -138,7 +138,11 @@ class UpdateStatusService < BaseService
end
def quote_url
- ProcessReferencesService.extract_quote(text)
+ # ProcessReferencesService.extract_quote(text)
+ # TODO: quote
+ return unless @status.quote&.quoted_status
+
+ ActivityPub::TagManager.instance.uri_for(@status.quote.quoted_status)
end
def reference_urls
diff --git a/app/views/admin/rules/_rule.html.haml b/app/views/admin/rules/_rule.html.haml
index eb97eefb3c..7d84534d59 100644
--- a/app/views/admin/rules/_rule.html.haml
+++ b/app/views/admin/rules/_rule.html.haml
@@ -7,5 +7,7 @@
.announcements-list__item__meta
= rule.hint
- %div
+ .rule-actions
+ = table_link_to 'arrow_upward', t('admin.rules.move_up'), move_up_admin_rule_path(rule), method: :post if can?(:update, rule) && !rule_iteration.first?
= table_link_to 'delete', t('admin.rules.delete'), admin_rule_path(rule), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, rule)
+ = table_link_to 'arrow_downward', t('admin.rules.move_down'), move_down_admin_rule_path(rule), method: :post if can?(:update, rule) && !rule_iteration.last?
diff --git a/app/views/admin/rules/_translation_fields.html.haml b/app/views/admin/rules/_translation_fields.html.haml
new file mode 100644
index 0000000000..bf8d817224
--- /dev/null
+++ b/app/views/admin/rules/_translation_fields.html.haml
@@ -0,0 +1,27 @@
+%tr.nested-fields
+ %td
+ .fields-row
+ .fields-row__column.fields-group
+ = f.input :language,
+ collection: ui_languages,
+ include_blank: false,
+ label_method: ->(locale) { native_locale_name(locale) }
+
+ .fields-row__column.fields-group
+ = f.hidden_field :id if f.object&.persisted? # Required so Rails doesn't put the field outside of the
+ = link_to_remove_association(f, class: 'table-action-link') do
+ = safe_join([material_symbol('close'), t('filters.index.delete')])
+
+ .fields-group
+ = f.input :text,
+ label: I18n.t('simple_form.labels.rule.text'),
+ hint: I18n.t('simple_form.hints.rule.text'),
+ input_html: { lang: f.object&.language },
+ wrapper: :with_block_label
+
+ .fields-group
+ = f.input :hint,
+ label: I18n.t('simple_form.labels.rule.hint'),
+ hint: I18n.t('simple_form.hints.rule.hint'),
+ input_html: { lang: f.object&.language },
+ wrapper: :with_block_label
diff --git a/app/views/admin/rules/edit.html.haml b/app/views/admin/rules/edit.html.haml
index 9e3c915812..b64a27d751 100644
--- a/app/views/admin/rules/edit.html.haml
+++ b/app/views/admin/rules/edit.html.haml
@@ -6,5 +6,26 @@
= render form
+ %hr.spacer/
+
+ %h4= t('admin.rules.translations')
+
+ %p.hint= t('admin.rules.translations_explanation')
+
+ .table-wrapper
+ %table.table.keywords-table
+ %thead
+ %tr
+ %th= t('admin.rules.translation')
+ %th
+ %tbody
+ = form.simple_fields_for :translations do |translation|
+ = render 'translation_fields', f: translation
+ %tfoot
+ %tr
+ %td{ colspan: 3 }
+ = link_to_add_association form, :translations, class: 'table-action-link', partial: 'translation_fields', 'data-association-insertion-node': '.keywords-table tbody', 'data-association-insertion-method': 'append' do
+ = safe_join([material_symbol('add'), t('admin.rules.add_translation')])
+
.actions
= form.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/rules/index.html.haml b/app/views/admin/rules/index.html.haml
index 5a2789edcf..41bff18d2f 100644
--- a/app/views/admin/rules/index.html.haml
+++ b/app/views/admin/rules/index.html.haml
@@ -1,21 +1,12 @@
- content_for :page_title do
= t('admin.rules.title')
-%p= t('admin.rules.description_html')
+- content_for :heading_actions do
+ - if can? :create, :rule
+ = link_to t('admin.rules.add_new'), new_admin_rule_path, class: 'button'
%hr.spacer/
-- if can? :create, :rule
- = simple_form_for @rule, url: admin_rules_path do |form|
- = render 'shared/error_messages', object: @rule
-
- = render form
-
- .actions
- = form.button :button, t('admin.rules.add_new'), type: :submit
-
- %hr.spacer/
-
- if @rules.empty?
.muted-hint.center-text
= t 'admin.rules.empty'
diff --git a/app/views/admin/rules/new.html.haml b/app/views/admin/rules/new.html.haml
new file mode 100644
index 0000000000..bc93c7df55
--- /dev/null
+++ b/app/views/admin/rules/new.html.haml
@@ -0,0 +1,14 @@
+- content_for :page_title do
+ = t('admin.rules.add_new')
+
+%p= t('admin.rules.description_html')
+
+%hr.spacer/
+
+= simple_form_for @rule, url: admin_rules_path do |form|
+ = render 'shared/error_messages', object: @rule
+
+ = render form
+
+ .actions
+ = form.button :button, t('admin.rules.add_new'), type: :submit
diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml
index 162dd51d86..8a4fb2caff 100644
--- a/app/views/admin/settings/discovery/show.html.haml
+++ b/app/views/admin/settings/discovery/show.html.haml
@@ -35,6 +35,8 @@
as: :boolean,
wrapper: :with_label
+ %h4= t('admin.settings.discovery.privacy')
+
.fields-group
= f.input :noindex,
as: :boolean,
@@ -42,6 +44,13 @@
label: t('admin.settings.default_noindex.title'),
wrapper: :with_label
+ .fields-group
+ = f.input :allow_referrer_origin,
+ as: :boolean,
+ hint: t('admin.settings.allow_referrer_origin.desc'),
+ label: t('admin.settings.allow_referrer_origin.title'),
+ wrapper: :with_label
+
%h4= t('admin.settings.discovery.emoji_reactions')
.fields-group
@@ -80,8 +89,6 @@
wrapper: :with_label,
recommended: :recommended
- %h4= t('admin.settings.discovery.publish_discovered_servers')
-
.fields-group
= f.input :peers_api_enabled,
as: :boolean,
diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml
index ebbef00ff3..04f391fea7 100644
--- a/app/views/auth/registrations/new.html.haml
+++ b/app/views/auth/registrations/new.html.haml
@@ -56,7 +56,7 @@
.fields-group
= f.input :date_of_birth,
as: :date_of_birth,
- hint: t('simple_form.hints.user.date_of_birth', age: Setting.min_age.to_i),
+ hint: t('simple_form.hints.user.date_of_birth', count: Setting.min_age.to_i),
required: true,
wrapper: :with_block_label
diff --git a/app/views/auth/registrations/rules.html.haml b/app/views/auth/registrations/rules.html.haml
index 4b0159e862..59e7c9072f 100644
--- a/app/views/auth/registrations/rules.html.haml
+++ b/app/views/auth/registrations/rules.html.haml
@@ -18,10 +18,11 @@
%ol.rules-list
- @rules.each do |rule|
+ - translation = rule.translation_for(I18n.locale.to_s)
%li
%button{ type: 'button', aria: { expanded: 'false' } }
- .rules-list__text= rule.text
- .rules-list__hint= rule.hint
+ .rules-list__text= translation.text
+ .rules-list__hint= translation.hint
.stacked-actions
- accept_path = @invite_code.present? ? public_invite_url(invite_code: @invite_code, accept: @accept_token) : new_user_registration_path(accept: @accept_token)
diff --git a/app/views/auth/sessions/two_factor.html.haml b/app/views/auth/sessions/two_factor.html.haml
index 653f155801..38def20fc5 100644
--- a/app/views/auth/sessions/two_factor.html.haml
+++ b/app/views/auth/sessions/two_factor.html.haml
@@ -1,7 +1,7 @@
- content_for :page_title do
= t('auth.login')
-= javascript_pack_tag 'two_factor_authentication', crossorigin: 'anonymous'
+= vite_typescript_tag 'two_factor_authentication.ts', crossorigin: 'anonymous'
- if webauthn_enabled?
= render partial: 'auth/sessions/two_factor/webauthn_form', locals: { hidden: @scheme_type != 'webauthn' }
diff --git a/app/views/auth/setup/show.html.haml b/app/views/auth/setup/show.html.haml
index 91654ca214..83e0bfd25f 100644
--- a/app/views/auth/setup/show.html.haml
+++ b/app/views/auth/setup/show.html.haml
@@ -1,7 +1,7 @@
- content_for :page_title do
= t('auth.setup.title')
-= javascript_pack_tag 'sign_up', crossorigin: 'anonymous'
+= vite_typescript_tag 'sign_up.ts', crossorigin: 'anonymous'
= simple_form_for(@user, url: auth_setup_path) do |f|
= render 'auth/shared/progress', stage: 'confirm'
diff --git a/app/views/filters/_filter_fields.html.haml b/app/views/filters/_filter_fields.html.haml
index 18e9a6580e..f4b851c85a 100644
--- a/app/views/filters/_filter_fields.html.haml
+++ b/app/views/filters/_filter_fields.html.haml
@@ -38,7 +38,6 @@
= f.input :exclude_localusers, wrapper: :with_label, kmyblue: true, label: t('simple_form.labels.filters.options.exclude_localusers')
.fields-group
- = f.input :exclude_quote, wrapper: :with_label, as: :boolean, kmyblue: true, label: t('simple_form.labels.filters.options.exclude_quote')
= f.input :exclude_profile, wrapper: :with_label, as: :boolean, kmyblue: true, label: t('simple_form.labels.filters.options.exclude_profile')
%hr.spacer/
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index 3f7727cdfb..08432a177c 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -1,7 +1,7 @@
- content_for :header_tags do
= render_initial_state
- = javascript_pack_tag 'public', crossorigin: 'anonymous'
- = javascript_pack_tag 'admin', async: true, crossorigin: 'anonymous'
+ = vite_typescript_tag 'public.tsx', crossorigin: 'anonymous'
+ = vite_typescript_tag 'admin.tsx', crossorigin: 'anonymous'
- content_for :body_classes, 'admin'
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 678f44d017..13f347225a 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -26,11 +26,14 @@
%title= html_title
= theme_style_tags current_theme
+ = vite_client_tag
+ = vite_react_refresh_tag
+ = vite_polyfills_tag
-# Needed for the wicg-inert polyfill. It needs to be on it's own