mirror of
https://github.com/mastodon/mastodon.git
synced 2025-09-04 00:43:41 +00:00
Compare commits
70 Commits
d17c91665a
...
3a7d1eb7c7
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3a7d1eb7c7 | ||
![]() |
40242fafee | ||
![]() |
ee4b0a223c | ||
![]() |
3c578dbdcd | ||
![]() |
4fa203e69e | ||
![]() |
8b7685d956 | ||
![]() |
4ecbaea8bb | ||
![]() |
5f1e6a5886 | ||
![]() |
97d80265b4 | ||
![]() |
d93572ea90 | ||
![]() |
d880f397df | ||
![]() |
3ab2d14782 | ||
![]() |
229cbc6a24 | ||
![]() |
dccd29fe25 | ||
![]() |
b6cd32281f | ||
![]() |
02de05dc27 | ||
![]() |
9c55b2fbe4 | ||
![]() |
a6a0d982ef | ||
![]() |
c2b7b28919 | ||
![]() |
5cb7dfafcc | ||
![]() |
35a06319fa | ||
![]() |
6f34db9bb7 | ||
![]() |
3f1d78f3c6 | ||
![]() |
c00ed9c913 | ||
![]() |
66f5ad42e2 | ||
![]() |
8dcd195527 | ||
![]() |
4180f754d0 | ||
![]() |
6ad0ddebe4 | ||
![]() |
3c9bde31f7 | ||
![]() |
a8166d28ed | ||
![]() |
460043a969 | ||
![]() |
4f41b7c089 | ||
![]() |
4738a18e52 | ||
![]() |
3c17ccab37 | ||
![]() |
496370801a | ||
![]() |
f3a932d8a1 | ||
![]() |
7aba79ade9 | ||
![]() |
7a76f71d99 | ||
![]() |
012450e87d | ||
![]() |
d8c07be021 | ||
![]() |
2560242972 | ||
![]() |
94ad088482 | ||
![]() |
b771fc0880 | ||
![]() |
61a21d6a36 | ||
![]() |
d85743576c | ||
![]() |
a1ca52ed8f | ||
![]() |
f6e822e1f5 | ||
![]() |
3fd629cf84 | ||
![]() |
20bc34ca52 | ||
![]() |
abe5413638 | ||
![]() |
4df50b9c7e | ||
![]() |
a1c7b853ec | ||
![]() |
118c30fbc7 | ||
![]() |
511e10df34 | ||
![]() |
4f494781c1 | ||
![]() |
f85f0eee1b | ||
![]() |
e770303968 | ||
![]() |
23de9c7e6c | ||
![]() |
f696f794cf | ||
![]() |
83f151947e | ||
![]() |
20a71a5479 | ||
![]() |
181134153d | ||
![]() |
45ec4c93c0 | ||
![]() |
50cf327819 | ||
![]() |
8268323d7f | ||
![]() |
54da7ff12b | ||
![]() |
e28fe4199d | ||
![]() |
8d3bca3bb8 | ||
![]() |
f16f8b51b8 | ||
![]() |
831a24ae15 |
|
@ -1,17 +1,21 @@
|
|||
---
|
||||
Metrics/AbcSize:
|
||||
Exclude:
|
||||
- lib/mastodon/cli/*.rb
|
||||
Enabled: false
|
||||
|
||||
Metrics/BlockLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/BlockNesting:
|
||||
Enabled: false
|
||||
|
||||
Metrics/ClassLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/CollectionLiteralLength:
|
||||
Enabled: false
|
||||
|
||||
Metrics/CyclomaticComplexity:
|
||||
Exclude:
|
||||
- lib/mastodon/cli/*.rb
|
||||
Enabled: false
|
||||
|
||||
Metrics/MethodLength:
|
||||
Enabled: false
|
||||
|
@ -20,4 +24,7 @@ Metrics/ModuleLength:
|
|||
Enabled: false
|
||||
|
||||
Metrics/ParameterLists:
|
||||
CountKeywordArgs: false
|
||||
Enabled: false
|
||||
|
||||
Metrics/PerceivedComplexity:
|
||||
Enabled: false
|
||||
|
|
|
@ -6,23 +6,6 @@
|
|||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
||||
Metrics/AbcSize:
|
||||
Max: 82
|
||||
|
||||
# Configuration parameters: CountBlocks, CountModifierForms, Max.
|
||||
Metrics/BlockNesting:
|
||||
Exclude:
|
||||
- 'lib/tasks/mastodon.rake'
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||
Metrics/CyclomaticComplexity:
|
||||
Max: 25
|
||||
|
||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 27
|
||||
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowedVars, DefaultToNil.
|
||||
Style/FetchEnvVar:
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -88,7 +88,7 @@ gem 'sidekiq-scheduler', '~> 6.0'
|
|||
gem 'sidekiq-unique-jobs', '> 8'
|
||||
gem 'simple_form', '~> 5.2'
|
||||
gem 'simple-navigation', '~> 4.4'
|
||||
gem 'stoplight'
|
||||
gem 'stoplight', github: 'ClearlyClaire/stoplight', ref: 'f13e0c0d5e6d34af8d3cfc888871caa84237db42'
|
||||
gem 'strong_migrations'
|
||||
gem 'tty-prompt', '~> 0.23', require: false
|
||||
gem 'twitter-text', '~> 3.1.0'
|
||||
|
|
16
Gemfile.lock
16
Gemfile.lock
|
@ -1,3 +1,11 @@
|
|||
GIT
|
||||
remote: https://github.com/ClearlyClaire/stoplight.git
|
||||
revision: f13e0c0d5e6d34af8d3cfc888871caa84237db42
|
||||
ref: f13e0c0d5e6d34af8d3cfc888871caa84237db42
|
||||
specs:
|
||||
stoplight (5.3.1)
|
||||
zeitwerk
|
||||
|
||||
GIT
|
||||
remote: https://github.com/mastodon/webpush.git
|
||||
revision: 9631ac63045cfabddacc69fc06e919b4c13eb913
|
||||
|
@ -806,10 +814,10 @@ GEM
|
|||
ruby-saml (1.18.1)
|
||||
nokogiri (>= 1.13.10)
|
||||
rexml
|
||||
ruby-vips (2.2.4)
|
||||
ruby-vips (2.2.5)
|
||||
ffi (~> 1.12)
|
||||
logger
|
||||
rubyzip (3.0.1)
|
||||
rubyzip (3.0.2)
|
||||
rufus-scheduler (3.9.2)
|
||||
fugit (~> 1.1, >= 1.11.1)
|
||||
safety_net_attestation (0.4.0)
|
||||
|
@ -853,8 +861,6 @@ GEM
|
|||
stackprof (0.2.27)
|
||||
starry (0.2.0)
|
||||
base64
|
||||
stoplight (5.3.1)
|
||||
zeitwerk
|
||||
stringio (3.1.7)
|
||||
strong_migrations (2.5.0)
|
||||
activerecord (>= 7.1)
|
||||
|
@ -1086,7 +1092,7 @@ DEPENDENCIES
|
|||
simplecov (~> 0.22)
|
||||
simplecov-lcov (~> 0.8)
|
||||
stackprof
|
||||
stoplight
|
||||
stoplight!
|
||||
strong_migrations
|
||||
test-prof
|
||||
thor (~> 1.2)
|
||||
|
|
|
@ -48,6 +48,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
|
|||
default_privacy: source_params.fetch(:privacy, @account.user.setting_default_privacy),
|
||||
default_sensitive: source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
|
||||
default_language: source_params.fetch(:language, @account.user.setting_default_language),
|
||||
default_quote_policy: source_params.fetch(:quote_policy, @account.user.setting_default_quote_policy),
|
||||
},
|
||||
}
|
||||
end
|
||||
|
|
|
@ -102,6 +102,16 @@ module ApplicationHelper
|
|||
policy(record).public_send(:"#{action}?")
|
||||
end
|
||||
|
||||
def conditional_link_to(condition, name, options = {}, html_options = {}, &block)
|
||||
if condition && !current_page?(block_given? ? name : options)
|
||||
link_to(name, options, html_options, &block)
|
||||
elsif block_given?
|
||||
content_tag(:span, options, html_options, &block)
|
||||
else
|
||||
content_tag(:span, name, html_options)
|
||||
end
|
||||
end
|
||||
|
||||
def material_symbol(icon, attributes = {})
|
||||
safe_join(
|
||||
[
|
||||
|
@ -233,6 +243,10 @@ module ApplicationHelper
|
|||
tag.input(type: :text, maxlength: 999, spellcheck: false, readonly: true, **options)
|
||||
end
|
||||
|
||||
def recent_tag_users(tag)
|
||||
tag.statuses.public_visibility.joins(:account).merge(Account.without_suspended.without_silenced).includes(:account).limit(3).map(&:account)
|
||||
end
|
||||
|
||||
def recent_tag_usage(tag)
|
||||
people = tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts
|
||||
I18n.t 'user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(people), count: people
|
||||
|
|
|
@ -84,6 +84,7 @@ export const COMPOSE_FOCUS = 'COMPOSE_FOCUS';
|
|||
const messages = defineMessages({
|
||||
uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
|
||||
uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
|
||||
uploadQuote: { id: 'upload_error.quote', defaultMessage: 'File upload not allowed with quotes.' },
|
||||
open: { id: 'compose.published.open', defaultMessage: 'Open' },
|
||||
published: { id: 'compose.published.body', defaultMessage: 'Post published.' },
|
||||
saved: { id: 'compose.saved.body', defaultMessage: 'Post saved.' },
|
||||
|
@ -96,12 +97,17 @@ export const ensureComposeIsVisible = (getState) => {
|
|||
};
|
||||
|
||||
export function setComposeToStatus(status, text, spoiler_text) {
|
||||
return{
|
||||
type: COMPOSE_SET_STATUS,
|
||||
status,
|
||||
text,
|
||||
spoiler_text,
|
||||
};
|
||||
return (dispatch, getState) => {
|
||||
const maxOptions = getState().server.getIn(['server', 'configuration', 'polls', 'max_options']);
|
||||
|
||||
dispatch({
|
||||
type: COMPOSE_SET_STATUS,
|
||||
status,
|
||||
text,
|
||||
spoiler_text,
|
||||
maxOptions,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function changeCompose(text) {
|
||||
|
@ -146,7 +152,7 @@ export function resetCompose() {
|
|||
};
|
||||
}
|
||||
|
||||
export const focusCompose = (defaultText) => (dispatch, getState) => {
|
||||
export const focusCompose = (defaultText = '') => (dispatch, getState) => {
|
||||
dispatch({
|
||||
type: COMPOSE_FOCUS,
|
||||
defaultText,
|
||||
|
@ -215,6 +221,7 @@ export function submitCompose(successCallback) {
|
|||
});
|
||||
}
|
||||
|
||||
const visibility = getState().getIn(['compose', 'privacy']);
|
||||
api().request({
|
||||
url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`,
|
||||
method: statusId === null ? 'post' : 'put',
|
||||
|
@ -225,11 +232,11 @@ export function submitCompose(successCallback) {
|
|||
media_attributes,
|
||||
sensitive: getState().getIn(['compose', 'sensitive']),
|
||||
spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
|
||||
visibility: getState().getIn(['compose', 'privacy']),
|
||||
visibility: visibility,
|
||||
poll: getState().getIn(['compose', 'poll'], null),
|
||||
language: getState().getIn(['compose', 'language']),
|
||||
quoted_status_id: getState().getIn(['compose', 'quoted_status_id']),
|
||||
quote_approval_policy: getState().getIn(['compose', 'quote_policy']),
|
||||
quote_approval_policy: visibility === 'private' || visibility === 'direct' ? 'nobody' : getState().getIn(['compose', 'quote_policy']),
|
||||
},
|
||||
headers: {
|
||||
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
|
||||
|
@ -303,6 +310,11 @@ export function submitComposeFail(error) {
|
|||
|
||||
export function uploadCompose(files) {
|
||||
return function (dispatch, getState) {
|
||||
// Exit if there's a quote.
|
||||
if (getState().compose.get('quoted_status_id')) {
|
||||
dispatch(showAlert({ message: messages.uploadQuote }));
|
||||
return;
|
||||
}
|
||||
const uploadLimit = getState().getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']);
|
||||
const media = getState().getIn(['compose', 'media_attachments']);
|
||||
const pending = getState().getIn(['compose', 'pending_media_attachments']);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import { defineMessages } from 'react-intl';
|
||||
|
||||
import { createAction } from '@reduxjs/toolkit';
|
||||
import type { List as ImmutableList, Map as ImmutableMap } from 'immutable';
|
||||
|
||||
|
@ -12,7 +14,27 @@ import {
|
|||
import type { ApiQuotePolicy } from '../api_types/quotes';
|
||||
import type { Status } from '../models/status';
|
||||
|
||||
import { ensureComposeIsVisible } from './compose';
|
||||
import { showAlert } from './alerts';
|
||||
import { focusCompose } from './compose';
|
||||
|
||||
const messages = defineMessages({
|
||||
quoteErrorUpload: {
|
||||
id: 'quote_error.upload',
|
||||
defaultMessage: 'Quoting is not allowed with media attachments.',
|
||||
},
|
||||
quoteErrorPoll: {
|
||||
id: 'quote_error.poll',
|
||||
defaultMessage: 'Quoting is not allowed with polls.',
|
||||
},
|
||||
quoteErrorQuote: {
|
||||
id: 'quote_error.quote',
|
||||
defaultMessage: 'Only one quote at a time is allowed.',
|
||||
},
|
||||
quoteErrorUnauthorized: {
|
||||
id: 'quote_error.unauthorized',
|
||||
defaultMessage: 'You are not authorized to quote this post.',
|
||||
},
|
||||
});
|
||||
|
||||
type SimulatedMediaAttachmentJSON = ApiMediaAttachmentJSON & {
|
||||
unattached?: boolean;
|
||||
|
@ -78,14 +100,43 @@ export const changeUploadCompose = createDataLoadingThunk(
|
|||
},
|
||||
);
|
||||
|
||||
export const quoteComposeByStatus = createAppThunk(
|
||||
export const quoteCompose = createAppThunk(
|
||||
'compose/quoteComposeStatus',
|
||||
(status: Status, { getState }) => {
|
||||
ensureComposeIsVisible(getState);
|
||||
(status: Status, { dispatch }) => {
|
||||
dispatch(focusCompose());
|
||||
return status;
|
||||
},
|
||||
);
|
||||
|
||||
export const quoteComposeByStatus = createAppThunk(
|
||||
(status: Status, { dispatch, getState }) => {
|
||||
const composeState = getState().compose;
|
||||
const mediaAttachments = composeState.get('media_attachments');
|
||||
|
||||
if (composeState.get('poll')) {
|
||||
dispatch(showAlert({ message: messages.quoteErrorPoll }));
|
||||
} else if (
|
||||
composeState.get('is_uploading') ||
|
||||
(mediaAttachments &&
|
||||
typeof mediaAttachments !== 'string' &&
|
||||
typeof mediaAttachments !== 'number' &&
|
||||
typeof mediaAttachments !== 'boolean' &&
|
||||
mediaAttachments.size !== 0)
|
||||
) {
|
||||
dispatch(showAlert({ message: messages.quoteErrorUpload }));
|
||||
} else if (composeState.get('quoted_status_id')) {
|
||||
dispatch(showAlert({ message: messages.quoteErrorQuote }));
|
||||
} else if (
|
||||
status.getIn(['quote_approval', 'current_user']) !== 'automatic' &&
|
||||
status.getIn(['quote_approval', 'current_user']) !== 'manual'
|
||||
) {
|
||||
dispatch(showAlert({ message: messages.quoteErrorUnauthorized }));
|
||||
} else {
|
||||
dispatch(quoteCompose(status));
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
export const quoteComposeById = createAppThunk(
|
||||
(statusId: string, { dispatch, getState }) => {
|
||||
const status = getState().statuses.get(statusId);
|
||||
|
@ -97,6 +148,6 @@ export const quoteComposeById = createAppThunk(
|
|||
|
||||
export const quoteComposeCancel = createAction('compose/quoteComposeCancel');
|
||||
|
||||
export const setQuotePolicy = createAction<ApiQuotePolicy>(
|
||||
export const setComposeQuotePolicy = createAction<ApiQuotePolicy>(
|
||||
'compose/setQuotePolicy',
|
||||
);
|
||||
|
|
|
@ -2,11 +2,12 @@ import {
|
|||
apiReblog,
|
||||
apiUnreblog,
|
||||
apiRevokeQuote,
|
||||
apiGetQuotes,
|
||||
} from 'mastodon/api/interactions';
|
||||
import type { StatusVisibility } from 'mastodon/models/status';
|
||||
import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
|
||||
|
||||
import { importFetchedStatus } from './importer';
|
||||
import { importFetchedStatus, importFetchedStatuses } from './importer';
|
||||
|
||||
export const reblog = createDataLoadingThunk(
|
||||
'status/reblog',
|
||||
|
@ -53,3 +54,19 @@ export const revokeQuote = createDataLoadingThunk(
|
|||
return discardLoadData;
|
||||
},
|
||||
);
|
||||
|
||||
export const fetchQuotes = createDataLoadingThunk(
|
||||
'status/fetch_quotes',
|
||||
async ({ statusId, next }: { statusId: string; next?: string }) => {
|
||||
const { links, statuses } = await apiGetQuotes(statusId, next);
|
||||
|
||||
return {
|
||||
links,
|
||||
statuses,
|
||||
replace: !next,
|
||||
};
|
||||
},
|
||||
(payload, { dispatch }) => {
|
||||
dispatch(importFetchedStatuses(payload.statuses));
|
||||
},
|
||||
);
|
||||
|
|
|
@ -30,9 +30,20 @@ import { importFetchedAccounts, importFetchedStatuses } from './importer';
|
|||
import { NOTIFICATIONS_FILTER_SET } from './notifications';
|
||||
import { saveSettings } from './settings';
|
||||
|
||||
function notificationTypeForFilter(type: NotificationType) {
|
||||
if (type === 'quoted_update') return 'update';
|
||||
else return type;
|
||||
}
|
||||
|
||||
function notificationTypeForQuickFilter(type: NotificationType) {
|
||||
if (type === 'quoted_update') return 'update';
|
||||
else if (type === 'quote') return 'mention';
|
||||
else return type;
|
||||
}
|
||||
|
||||
function excludeAllTypesExcept(filter: string) {
|
||||
return allNotificationTypes.filter(
|
||||
(item) => item !== filter && !(item === 'quote' && filter === 'mention'),
|
||||
(item) => notificationTypeForQuickFilter(item) !== filter,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -157,16 +168,17 @@ export const processNewNotificationForGroups = createAppAsyncThunk(
|
|||
|
||||
const showInColumn =
|
||||
activeFilter === 'all'
|
||||
? notificationShows[notification.type] !== false
|
||||
: activeFilter === notification.type ||
|
||||
(activeFilter === 'mention' && notification.type === 'quote');
|
||||
? notificationShows[notificationTypeForFilter(notification.type)] !==
|
||||
false
|
||||
: activeFilter === notificationTypeForQuickFilter(notification.type);
|
||||
|
||||
if (!showInColumn) return;
|
||||
|
||||
if (
|
||||
(notification.type === 'mention' ||
|
||||
notification.type === 'quote' ||
|
||||
notification.type === 'update' ||
|
||||
notification.type === 'quote') &&
|
||||
notification.type === 'quoted_update') &&
|
||||
notification.status?.filtered
|
||||
) {
|
||||
const filters = notification.status.filtered.filter((result) =>
|
||||
|
|
|
@ -31,7 +31,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
|||
|
||||
let filtered = false;
|
||||
|
||||
if (['mention', 'status', 'quote'].includes(notification.type) && notification.status.filtered) {
|
||||
if (['mention', 'quote', 'status'].includes(notification.type) && notification.status.filtered) {
|
||||
const filters = notification.status.filtered.filter(result => result.filter.context.includes('notifications'));
|
||||
|
||||
if (filters.some(result => result.filter.filter_action === 'hide')) {
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
import { defineMessages } from 'react-intl';
|
||||
|
||||
import { browserHistory } from 'mastodon/components/router';
|
||||
|
||||
import api from '../api';
|
||||
|
||||
import { showAlert } from './alerts';
|
||||
import { ensureComposeIsVisible, setComposeToStatus } from './compose';
|
||||
import { importFetchedStatus, importFetchedStatuses, importFetchedAccount } from './importer';
|
||||
import { importFetchedStatus, importFetchedAccount } from './importer';
|
||||
import { fetchContext } from './statuses_typed';
|
||||
import { deleteFromTimelines } from './timelines';
|
||||
|
||||
|
@ -40,6 +43,10 @@ export const STATUS_TRANSLATE_SUCCESS = 'STATUS_TRANSLATE_SUCCESS';
|
|||
export const STATUS_TRANSLATE_FAIL = 'STATUS_TRANSLATE_FAIL';
|
||||
export const STATUS_TRANSLATE_UNDO = 'STATUS_TRANSLATE_UNDO';
|
||||
|
||||
const messages = defineMessages({
|
||||
deleteSuccess: { id: 'status.delete.success', defaultMessage: 'Post deleted' },
|
||||
});
|
||||
|
||||
export function fetchStatusRequest(id, skipLoading) {
|
||||
return {
|
||||
type: STATUS_FETCH_REQUEST,
|
||||
|
@ -48,7 +55,18 @@ export function fetchStatusRequest(id, skipLoading) {
|
|||
};
|
||||
}
|
||||
|
||||
export function fetchStatus(id, forceFetch = false, alsoFetchContext = true) {
|
||||
/**
|
||||
* @param {string} id
|
||||
* @param {Object} [options]
|
||||
* @param {boolean} [options.forceFetch]
|
||||
* @param {boolean} [options.alsoFetchContext]
|
||||
* @param {string | null | undefined} [options.parentQuotePostId]
|
||||
*/
|
||||
export function fetchStatus(id, {
|
||||
forceFetch = false,
|
||||
alsoFetchContext = true,
|
||||
parentQuotePostId,
|
||||
} = {}) {
|
||||
return (dispatch, getState) => {
|
||||
const skipLoading = !forceFetch && getState().getIn(['statuses', id], null) !== null;
|
||||
|
||||
|
@ -66,7 +84,7 @@ export function fetchStatus(id, forceFetch = false, alsoFetchContext = true) {
|
|||
dispatch(importFetchedStatus(response.data));
|
||||
dispatch(fetchStatusSuccess(skipLoading));
|
||||
}).catch(error => {
|
||||
dispatch(fetchStatusFail(id, error, skipLoading));
|
||||
dispatch(fetchStatusFail(id, error, skipLoading, parentQuotePostId));
|
||||
});
|
||||
};
|
||||
}
|
||||
|
@ -78,21 +96,27 @@ export function fetchStatusSuccess(skipLoading) {
|
|||
};
|
||||
}
|
||||
|
||||
export function fetchStatusFail(id, error, skipLoading) {
|
||||
export function fetchStatusFail(id, error, skipLoading, parentQuotePostId) {
|
||||
return {
|
||||
type: STATUS_FETCH_FAIL,
|
||||
id,
|
||||
error,
|
||||
parentQuotePostId,
|
||||
skipLoading,
|
||||
skipAlert: true,
|
||||
};
|
||||
}
|
||||
|
||||
export function redraft(status, raw_text) {
|
||||
return {
|
||||
type: REDRAFT,
|
||||
status,
|
||||
raw_text,
|
||||
return (dispatch, getState) => {
|
||||
const maxOptions = getState().server.getIn(['server', 'configuration', 'polls', 'max_options']);
|
||||
|
||||
dispatch({
|
||||
type: REDRAFT,
|
||||
status,
|
||||
raw_text,
|
||||
maxOptions,
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -137,7 +161,7 @@ export function deleteStatus(id, withRedraft = false) {
|
|||
|
||||
dispatch(deleteStatusRequest(id));
|
||||
|
||||
api().delete(`/api/v1/statuses/${id}`, { params: { delete_media: !withRedraft } }).then(response => {
|
||||
return api().delete(`/api/v1/statuses/${id}`, { params: { delete_media: !withRedraft } }).then(response => {
|
||||
dispatch(deleteStatusSuccess(id));
|
||||
dispatch(deleteFromTimelines(id));
|
||||
dispatch(importFetchedAccount(response.data.account));
|
||||
|
@ -145,9 +169,14 @@ export function deleteStatus(id, withRedraft = false) {
|
|||
if (withRedraft) {
|
||||
dispatch(redraft(status, response.data.text));
|
||||
ensureComposeIsVisible(getState);
|
||||
} else {
|
||||
dispatch(showAlert({ message: messages.deleteSuccess }));
|
||||
}
|
||||
|
||||
return response;
|
||||
}).catch(error => {
|
||||
dispatch(deleteStatusFail(id, error));
|
||||
throw error;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,15 +1,28 @@
|
|||
import { apiRequestPost } from 'mastodon/api';
|
||||
import type { Status, StatusVisibility } from 'mastodon/models/status';
|
||||
import api, { apiRequestPost, getLinks } from 'mastodon/api';
|
||||
import type { ApiStatusJSON } from 'mastodon/api_types/statuses';
|
||||
import type { StatusVisibility } from 'mastodon/models/status';
|
||||
|
||||
export const apiReblog = (statusId: string, visibility: StatusVisibility) =>
|
||||
apiRequestPost<{ reblog: Status }>(`v1/statuses/${statusId}/reblog`, {
|
||||
apiRequestPost<{ reblog: ApiStatusJSON }>(`v1/statuses/${statusId}/reblog`, {
|
||||
visibility,
|
||||
});
|
||||
|
||||
export const apiUnreblog = (statusId: string) =>
|
||||
apiRequestPost<Status>(`v1/statuses/${statusId}/unreblog`);
|
||||
apiRequestPost<ApiStatusJSON>(`v1/statuses/${statusId}/unreblog`);
|
||||
|
||||
export const apiRevokeQuote = (quotedStatusId: string, statusId: string) =>
|
||||
apiRequestPost<Status>(
|
||||
apiRequestPost<ApiStatusJSON>(
|
||||
`v1/statuses/${quotedStatusId}/quotes/${statusId}/revoke`,
|
||||
);
|
||||
|
||||
export const apiGetQuotes = async (statusId: string, url?: string) => {
|
||||
const response = await api().request<ApiStatusJSON[]>({
|
||||
method: 'GET',
|
||||
url: url ?? `/api/v1/statuses/${statusId}/quotes`,
|
||||
});
|
||||
|
||||
return {
|
||||
statuses: response.data,
|
||||
links: getLinks(response),
|
||||
};
|
||||
};
|
||||
|
|
|
@ -7,7 +7,7 @@ import type { ApiReportJSON } from './reports';
|
|||
import type { ApiStatusJSON } from './statuses';
|
||||
|
||||
// See app/model/notification.rb
|
||||
export const allNotificationTypes = [
|
||||
export const allNotificationTypes: NotificationType[] = [
|
||||
'follow',
|
||||
'follow_request',
|
||||
'favourite',
|
||||
|
@ -31,7 +31,8 @@ export type NotificationWithStatusType =
|
|||
| 'mention'
|
||||
| 'quote'
|
||||
| 'poll'
|
||||
| 'update';
|
||||
| 'update'
|
||||
| 'quoted_update';
|
||||
|
||||
export type NotificationType =
|
||||
| NotificationWithStatusType
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
import type { ApiStatusJSON } from './statuses';
|
||||
|
||||
export type ApiQuoteState = 'accepted' | 'pending' | 'revoked' | 'unauthorized';
|
||||
export type ApiQuotePolicy = 'public' | 'followers' | 'nobody' | 'unknown';
|
||||
export type ApiQuotePolicy =
|
||||
| 'public'
|
||||
| 'followers'
|
||||
| 'nobody'
|
||||
| 'unsupported_policy';
|
||||
export type ApiUserQuotePolicy = 'automatic' | 'manual' | 'denied' | 'unknown';
|
||||
|
||||
interface ApiQuoteEmptyJSON {
|
||||
state: Exclude<ApiQuoteState, 'accepted'>;
|
||||
|
@ -25,7 +30,7 @@ export type ApiQuoteJSON = ApiQuoteAcceptedJSON | ApiQuoteEmptyJSON;
|
|||
export interface ApiQuotePolicyJSON {
|
||||
automatic: ApiQuotePolicy[];
|
||||
manual: ApiQuotePolicy[];
|
||||
current_user: ApiQuotePolicy;
|
||||
current_user: ApiUserQuotePolicy;
|
||||
}
|
||||
|
||||
export function isQuotePolicy(policy: string): policy is ApiQuotePolicy {
|
||||
|
|
|
@ -96,6 +96,7 @@ export interface ApiStatusJSON {
|
|||
replies_count: number;
|
||||
reblogs_count: number;
|
||||
favorites_count: number;
|
||||
quotes_count: number;
|
||||
edited_at?: string;
|
||||
|
||||
favorited?: boolean;
|
||||
|
@ -133,3 +134,9 @@ export interface ApiStatusSourceJSON {
|
|||
text: string;
|
||||
spoiler_text: string;
|
||||
}
|
||||
|
||||
export function isStatusVisibility(
|
||||
visibility: string,
|
||||
): visibility is StatusVisibility {
|
||||
return ['public', 'unlisted', 'private', 'direct'].includes(visibility);
|
||||
}
|
||||
|
|
|
@ -41,13 +41,16 @@ import { IconButton } from './icon_button';
|
|||
|
||||
let id = 0;
|
||||
|
||||
type RenderItemFn<Item = MenuItem> = (
|
||||
export interface RenderItemFnHandlers {
|
||||
onClick: React.MouseEventHandler;
|
||||
onKeyUp: React.KeyboardEventHandler;
|
||||
}
|
||||
|
||||
export type RenderItemFn<Item = MenuItem> = (
|
||||
item: Item,
|
||||
index: number,
|
||||
handlers: {
|
||||
onClick: (e: React.MouseEvent) => void;
|
||||
onKeyUp: (e: React.KeyboardEvent) => void;
|
||||
},
|
||||
handlers: RenderItemFnHandlers,
|
||||
focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void,
|
||||
) => React.ReactNode;
|
||||
|
||||
type ItemClickFn<Item = MenuItem> = (item: Item, index: number) => void;
|
||||
|
@ -173,7 +176,7 @@ export const DropdownMenu = <Item = MenuItem,>({
|
|||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
item.action(e);
|
||||
}
|
||||
},
|
||||
[onClose, onItemClick, items],
|
||||
|
@ -277,10 +280,15 @@ export const DropdownMenu = <Item = MenuItem,>({
|
|||
})}
|
||||
>
|
||||
{items.map((option, i) =>
|
||||
renderItemMethod(option, i, {
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
}),
|
||||
renderItemMethod(
|
||||
option,
|
||||
i,
|
||||
{
|
||||
onClick: handleItemClick,
|
||||
onKeyUp: handleItemKeyUp,
|
||||
},
|
||||
i === 0 ? handleFocusedItemRef : undefined,
|
||||
),
|
||||
)}
|
||||
</ul>
|
||||
)}
|
||||
|
@ -307,7 +315,9 @@ interface DropdownProps<Item = MenuItem> {
|
|||
forceDropdown?: boolean;
|
||||
renderItem?: RenderItemFn<Item>;
|
||||
renderHeader?: RenderHeaderFn<Item>;
|
||||
onOpen?: () => void;
|
||||
onOpen?: // Must use a union type for the full function as a union with void is not allowed.
|
||||
| ((event: React.MouseEvent | React.KeyboardEvent) => void)
|
||||
| ((event: React.MouseEvent | React.KeyboardEvent) => boolean);
|
||||
onItemClick?: ItemClickFn<Item>;
|
||||
}
|
||||
|
||||
|
@ -376,7 +386,7 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
onItemClick(item, i);
|
||||
} else if (isActionItem(item)) {
|
||||
e.preventDefault();
|
||||
item.action();
|
||||
item.action(e);
|
||||
}
|
||||
},
|
||||
[handleClose, onItemClick, items],
|
||||
|
@ -389,7 +399,10 @@ export const Dropdown = <Item = MenuItem,>({
|
|||
if (open) {
|
||||
handleClose();
|
||||
} else {
|
||||
onOpen?.();
|
||||
const allow = onOpen?.(e);
|
||||
if (allow === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (prefetchAccountId) {
|
||||
dispatch(fetchRelationships([prefetchAccountId]));
|
||||
|
|
|
@ -98,13 +98,13 @@ export const DropdownSelector: React.FC<Props> = ({
|
|||
break;
|
||||
case 'Tab':
|
||||
if (e.shiftKey) {
|
||||
element =
|
||||
nodeRef.current?.children[index + 1] ??
|
||||
nodeRef.current?.firstElementChild;
|
||||
} else {
|
||||
element =
|
||||
nodeRef.current?.children[index - 1] ??
|
||||
nodeRef.current?.lastElementChild;
|
||||
} else {
|
||||
element =
|
||||
nodeRef.current?.children[index + 1] ??
|
||||
nodeRef.current?.firstElementChild;
|
||||
}
|
||||
break;
|
||||
case 'Home':
|
||||
|
|
|
@ -7,11 +7,7 @@ import { normalizeKey, isKeyboardEvent } from './utils';
|
|||
* the hotkey with a higher priority is selected. All others
|
||||
* are ignored.
|
||||
*/
|
||||
const hotkeyPriority = {
|
||||
singleKey: 0,
|
||||
combo: 1,
|
||||
sequence: 2,
|
||||
} as const;
|
||||
const hotkeyPriority = { singleKey: 0, combo: 1, sequence: 2 } as const;
|
||||
|
||||
/**
|
||||
* This type of function receives a keyboard event and an array of
|
||||
|
@ -105,14 +101,16 @@ const hotkeyMatcherMap = {
|
|||
new: just('n'),
|
||||
forceNew: optionPlus('n'),
|
||||
focusColumn: any('1', '2', '3', '4', '5', '6', '7', '8', '9'),
|
||||
focusLoadMore: just('l'),
|
||||
reply: just('r'),
|
||||
favourite: just('f'),
|
||||
boost: just('b'),
|
||||
quote: just('q'),
|
||||
mention: just('m'),
|
||||
open: any('enter', 'o'),
|
||||
openProfile: just('p'),
|
||||
moveDown: any('down', 'j'),
|
||||
moveUp: any('up', 'k'),
|
||||
moveDown: just('j'),
|
||||
moveUp: just('k'),
|
||||
toggleHidden: just('x'),
|
||||
toggleSensitive: just('h'),
|
||||
toggleComposeSpoilers: optionPlus('x'),
|
||||
|
|
|
@ -96,6 +96,7 @@ class Status extends ImmutablePureComponent {
|
|||
onReply: PropTypes.func,
|
||||
onFavourite: PropTypes.func,
|
||||
onReblog: PropTypes.func,
|
||||
onQuote: PropTypes.func,
|
||||
onDelete: PropTypes.func,
|
||||
onDirect: PropTypes.func,
|
||||
onMention: PropTypes.func,
|
||||
|
@ -110,11 +111,10 @@ class Status extends ImmutablePureComponent {
|
|||
onToggleCollapsed: PropTypes.func,
|
||||
onTranslate: PropTypes.func,
|
||||
onInteractionModal: PropTypes.func,
|
||||
onQuoteCancel: PropTypes.func,
|
||||
muted: PropTypes.bool,
|
||||
hidden: PropTypes.bool,
|
||||
unread: PropTypes.bool,
|
||||
onMoveUp: PropTypes.func,
|
||||
onMoveDown: PropTypes.func,
|
||||
showThread: PropTypes.bool,
|
||||
isQuotedPost: PropTypes.bool,
|
||||
getScrollPosition: PropTypes.func,
|
||||
|
@ -277,6 +277,10 @@ class Status extends ImmutablePureComponent {
|
|||
this.props.onReblog(this._properStatus(), e);
|
||||
};
|
||||
|
||||
handleHotkeyQuote = () => {
|
||||
this.props.onQuote(this._properStatus());
|
||||
};
|
||||
|
||||
handleHotkeyMention = e => {
|
||||
e.preventDefault();
|
||||
this.props.onMention(this._properStatus().get('account'));
|
||||
|
@ -327,14 +331,6 @@ class Status extends ImmutablePureComponent {
|
|||
history.push(`/@${status.getIn(['account', 'acct'])}`);
|
||||
};
|
||||
|
||||
handleHotkeyMoveUp = e => {
|
||||
this.props.onMoveUp?.(this.props.status.get('id'), this.node.getAttribute('data-featured'));
|
||||
};
|
||||
|
||||
handleHotkeyMoveDown = e => {
|
||||
this.props.onMoveDown?.(this.props.status.get('id'), this.node.getAttribute('data-featured'));
|
||||
};
|
||||
|
||||
handleHotkeyToggleHidden = () => {
|
||||
const { onToggleHidden } = this.props;
|
||||
const status = this._properStatus();
|
||||
|
@ -395,11 +391,10 @@ class Status extends ImmutablePureComponent {
|
|||
reply: this.handleHotkeyReply,
|
||||
favourite: this.handleHotkeyFavourite,
|
||||
boost: this.handleHotkeyBoost,
|
||||
quote: this.handleHotkeyQuote,
|
||||
mention: this.handleHotkeyMention,
|
||||
open: this.handleHotkeyOpen,
|
||||
openProfile: this.handleHotkeyOpenProfile,
|
||||
moveUp: this.handleHotkeyMoveUp,
|
||||
moveDown: this.handleHotkeyMoveDown,
|
||||
toggleHidden: this.handleHotkeyToggleHidden,
|
||||
toggleSensitive: this.handleHotkeyToggleSensitive,
|
||||
openMedia: this.handleHotkeyOpenMedia,
|
||||
|
@ -583,7 +578,7 @@ class Status extends ImmutablePureComponent {
|
|||
<DisplayName account={status.get('account')} />
|
||||
</Link>
|
||||
|
||||
{this.props.contextType === 'compose' && isQuotedPost && (
|
||||
{isQuotedPost && !!this.props.onQuoteCancel && (
|
||||
<IconButton
|
||||
onClick={this.handleQuoteCancel}
|
||||
className='status__quote-cancel'
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
import type { Meta, StoryObj } from '@storybook/react-vite';
|
||||
|
||||
import type { StatusVisibility } from '@/mastodon/api_types/statuses';
|
||||
import { statusFactoryState } from '@/testing/factories';
|
||||
|
||||
import { LegacyReblogButton, StatusReblogButton } from './reblog_button';
|
||||
|
||||
interface StoryProps {
|
||||
visibility: StatusVisibility;
|
||||
quoteAllowed: boolean;
|
||||
alreadyBoosted: boolean;
|
||||
reblogCount: number;
|
||||
}
|
||||
|
||||
const meta = {
|
||||
title: 'Components/Status/ReblogButton',
|
||||
args: {
|
||||
visibility: 'public',
|
||||
quoteAllowed: true,
|
||||
alreadyBoosted: false,
|
||||
reblogCount: 0,
|
||||
},
|
||||
argTypes: {
|
||||
visibility: {
|
||||
name: 'Visibility',
|
||||
control: { type: 'select' },
|
||||
options: ['public', 'unlisted', 'private', 'direct'],
|
||||
},
|
||||
reblogCount: {
|
||||
name: 'Boost Count',
|
||||
description: 'More than 0 will show the counter',
|
||||
},
|
||||
quoteAllowed: {
|
||||
name: 'Quotes allowed',
|
||||
},
|
||||
alreadyBoosted: {
|
||||
name: 'Already boosted',
|
||||
},
|
||||
},
|
||||
render: (args) => (
|
||||
<StatusReblogButton
|
||||
status={argsToStatus(args)}
|
||||
counters={args.reblogCount > 0}
|
||||
/>
|
||||
),
|
||||
} satisfies Meta<StoryProps>;
|
||||
|
||||
export default meta;
|
||||
|
||||
function argsToStatus({
|
||||
reblogCount,
|
||||
visibility,
|
||||
quoteAllowed,
|
||||
alreadyBoosted,
|
||||
}: StoryProps) {
|
||||
return statusFactoryState({
|
||||
reblogs_count: reblogCount,
|
||||
visibility,
|
||||
reblogged: alreadyBoosted,
|
||||
quote_approval: {
|
||||
automatic: [],
|
||||
manual: [],
|
||||
current_user: quoteAllowed ? 'automatic' : 'denied',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
type Story = StoryObj<typeof meta>;
|
||||
|
||||
export const Default: Story = {};
|
||||
|
||||
export const Mine: Story = {
|
||||
parameters: {
|
||||
state: {
|
||||
meta: {
|
||||
me: '1',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const Legacy: Story = {
|
||||
render: (args) => (
|
||||
<LegacyReblogButton
|
||||
status={argsToStatus(args)}
|
||||
counters={args.reblogCount > 0}
|
||||
/>
|
||||
),
|
||||
};
|
425
app/javascript/mastodon/components/status/reblog_button.tsx
Normal file
425
app/javascript/mastodon/components/status/reblog_button.tsx
Normal file
|
@ -0,0 +1,425 @@
|
|||
import { useCallback, useMemo } from 'react';
|
||||
import type {
|
||||
FC,
|
||||
KeyboardEvent,
|
||||
MouseEvent,
|
||||
MouseEventHandler,
|
||||
SVGProps,
|
||||
} from 'react';
|
||||
|
||||
import type { MessageDescriptor } from 'react-intl';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import { quoteComposeById } from '@/mastodon/actions/compose_typed';
|
||||
import { toggleReblog } from '@/mastodon/actions/interactions';
|
||||
import { openModal } from '@/mastodon/actions/modal';
|
||||
import type { ActionMenuItem } from '@/mastodon/models/dropdown_menu';
|
||||
import type { Status, StatusVisibility } from '@/mastodon/models/status';
|
||||
import {
|
||||
createAppSelector,
|
||||
useAppDispatch,
|
||||
useAppSelector,
|
||||
} from '@/mastodon/store';
|
||||
import { isFeatureEnabled } from '@/mastodon/utils/environment';
|
||||
import FormatQuote from '@/material-icons/400-24px/format_quote.svg?react';
|
||||
import FormatQuoteOff from '@/material-icons/400-24px/format_quote_off.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
||||
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
||||
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
||||
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
||||
|
||||
import type { RenderItemFn, RenderItemFnHandlers } from '../dropdown_menu';
|
||||
import { Dropdown } from '../dropdown_menu';
|
||||
import { Icon } from '../icon';
|
||||
import { IconButton } from '../icon_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
all_disabled: {
|
||||
id: 'status.all_disabled',
|
||||
defaultMessage: 'Boosts and quotes are disabled',
|
||||
},
|
||||
quote: { id: 'status.quote', defaultMessage: 'Quote' },
|
||||
quote_cannot: {
|
||||
id: 'status.cannot_quote',
|
||||
defaultMessage: 'Author has disabled quoting on this post',
|
||||
},
|
||||
quote_followers_only: {
|
||||
id: 'status.quote_followers_only',
|
||||
defaultMessage: 'Only followers can quote this post',
|
||||
},
|
||||
quote_manual_review: {
|
||||
id: 'status.quote_manual_review',
|
||||
defaultMessage: 'Author will manually review',
|
||||
},
|
||||
quote_private: {
|
||||
id: 'status.quote_private',
|
||||
defaultMessage: 'Private posts cannot be quoted',
|
||||
},
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
reblog_or_quote: {
|
||||
id: 'status.reblog_or_quote',
|
||||
defaultMessage: 'Boost or quote',
|
||||
},
|
||||
reblog_cancel: {
|
||||
id: 'status.cancel_reblog_private',
|
||||
defaultMessage: 'Unboost',
|
||||
},
|
||||
reblog_private: {
|
||||
id: 'status.reblog_private',
|
||||
defaultMessage: 'Boost with original visibility',
|
||||
},
|
||||
reblog_cannot: {
|
||||
id: 'status.cannot_reblog',
|
||||
defaultMessage: 'This post cannot be boosted',
|
||||
},
|
||||
request_quote: {
|
||||
id: 'status.request_quote',
|
||||
defaultMessage: 'Request to quote',
|
||||
},
|
||||
});
|
||||
|
||||
interface ReblogButtonProps {
|
||||
status: Status;
|
||||
counters?: boolean;
|
||||
}
|
||||
|
||||
export const StatusReblogButton: FC<ReblogButtonProps> = ({
|
||||
status,
|
||||
counters,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
|
||||
const statusState = useAppSelector((state) =>
|
||||
selectStatusState(state, status),
|
||||
);
|
||||
const {
|
||||
isLoggedIn,
|
||||
isReblogged,
|
||||
isReblogAllowed,
|
||||
isQuoteAutomaticallyAccepted,
|
||||
isQuoteManuallyAccepted,
|
||||
} = statusState;
|
||||
const { iconComponent } = useMemo(
|
||||
() => reblogIconText(statusState),
|
||||
[statusState],
|
||||
);
|
||||
const disabled =
|
||||
!isQuoteAutomaticallyAccepted &&
|
||||
!isQuoteManuallyAccepted &&
|
||||
!isReblogAllowed;
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
const statusId = status.get('id') as string;
|
||||
const items: ActionMenuItem[] = useMemo(
|
||||
() => [
|
||||
{
|
||||
text: 'reblog',
|
||||
action: (event) => {
|
||||
if (isLoggedIn) {
|
||||
dispatch(toggleReblog(statusId, event.shiftKey));
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
text: 'quote',
|
||||
action: () => {
|
||||
if (isLoggedIn) {
|
||||
dispatch(quoteComposeById(statusId));
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
[dispatch, isLoggedIn, statusId],
|
||||
);
|
||||
|
||||
const handleDropdownOpen = useCallback(
|
||||
(event: MouseEvent | KeyboardEvent) => {
|
||||
if (!isLoggedIn) {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
type: 'reblog',
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('uri'),
|
||||
},
|
||||
}),
|
||||
);
|
||||
} else if (event.shiftKey) {
|
||||
dispatch(toggleReblog(status.get('id'), true));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
[dispatch, isLoggedIn, status],
|
||||
);
|
||||
|
||||
const renderMenuItem: RenderItemFn<ActionMenuItem> = useCallback(
|
||||
(item, index, handlers, focusRefCallback) => (
|
||||
<ReblogMenuItem
|
||||
status={status}
|
||||
index={index}
|
||||
item={item}
|
||||
handlers={handlers}
|
||||
key={`${item.text}-${index}`}
|
||||
focusRefCallback={focusRefCallback}
|
||||
/>
|
||||
),
|
||||
[status],
|
||||
);
|
||||
|
||||
return (
|
||||
<Dropdown
|
||||
items={items}
|
||||
renderItem={renderMenuItem}
|
||||
onOpen={handleDropdownOpen}
|
||||
disabled={disabled}
|
||||
>
|
||||
<IconButton
|
||||
title={intl.formatMessage(
|
||||
!disabled ? messages.reblog_or_quote : messages.all_disabled,
|
||||
)}
|
||||
icon='retweet'
|
||||
iconComponent={iconComponent}
|
||||
counter={
|
||||
counters
|
||||
? (status.get('reblogs_count') as number) +
|
||||
(status.get('quotes_count') as number)
|
||||
: undefined
|
||||
}
|
||||
active={isReblogged}
|
||||
/>
|
||||
</Dropdown>
|
||||
);
|
||||
};
|
||||
|
||||
interface ReblogMenuItemProps {
|
||||
status: Status;
|
||||
item: ActionMenuItem;
|
||||
index: number;
|
||||
handlers: RenderItemFnHandlers;
|
||||
focusRefCallback?: (c: HTMLAnchorElement | HTMLButtonElement | null) => void;
|
||||
}
|
||||
|
||||
const ReblogMenuItem: FC<ReblogMenuItemProps> = ({
|
||||
status,
|
||||
index,
|
||||
item: { text },
|
||||
handlers,
|
||||
focusRefCallback,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
const statusState = useAppSelector((state) =>
|
||||
selectStatusState(state, status),
|
||||
);
|
||||
const { title, meta, iconComponent, disabled } = useMemo(
|
||||
() =>
|
||||
text === 'quote'
|
||||
? quoteIconText(statusState)
|
||||
: reblogIconText(statusState),
|
||||
[statusState, text],
|
||||
);
|
||||
const active = useMemo(
|
||||
() => text === 'reblog' && !!status.get('reblogged'),
|
||||
[status, text],
|
||||
);
|
||||
|
||||
return (
|
||||
<li
|
||||
className={classNames('dropdown-menu__item reblog-button__item', {
|
||||
disabled,
|
||||
active,
|
||||
})}
|
||||
key={`${text}-${index}`}
|
||||
>
|
||||
<button
|
||||
{...handlers}
|
||||
title={intl.formatMessage(title)}
|
||||
ref={focusRefCallback}
|
||||
disabled={disabled}
|
||||
data-index={index}
|
||||
>
|
||||
<Icon
|
||||
id={text === 'quote' ? 'quote' : 'retweet'}
|
||||
icon={iconComponent}
|
||||
/>
|
||||
<div>
|
||||
{intl.formatMessage(title)}
|
||||
{meta && (
|
||||
<span className='reblog-button__meta'>
|
||||
{intl.formatMessage(meta)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
};
|
||||
|
||||
// Legacy helpers
|
||||
|
||||
// Switch between the legacy and new reblog button based on feature flag.
|
||||
export const ReblogButton: FC<ReblogButtonProps> = (props) => {
|
||||
if (isFeatureEnabled('outgoing_quotes')) {
|
||||
return <StatusReblogButton {...props} />;
|
||||
}
|
||||
return <LegacyReblogButton {...props} />;
|
||||
};
|
||||
|
||||
export const LegacyReblogButton: FC<ReblogButtonProps> = ({
|
||||
status,
|
||||
counters,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
const statusState = useAppSelector((state) =>
|
||||
selectStatusState(state, status),
|
||||
);
|
||||
|
||||
const { title, meta, iconComponent, disabled } = useMemo(
|
||||
() => reblogIconText(statusState),
|
||||
[statusState],
|
||||
);
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
const handleClick: MouseEventHandler = useCallback(
|
||||
(event) => {
|
||||
if (statusState.isLoggedIn) {
|
||||
dispatch(toggleReblog(status.get('id') as string, event.shiftKey));
|
||||
} else {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
type: 'reblog',
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('uri'),
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
[dispatch, status, statusState.isLoggedIn],
|
||||
);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
disabled={disabled}
|
||||
active={!!status.get('reblogged')}
|
||||
title={intl.formatMessage(meta ?? title)}
|
||||
icon='retweet'
|
||||
iconComponent={iconComponent}
|
||||
onClick={!disabled ? handleClick : undefined}
|
||||
counter={
|
||||
counters
|
||||
? (status.get('reblogs_count') as number) +
|
||||
(status.get('quotes_count') as number)
|
||||
: undefined
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
// Helpers for copy and state for status.
|
||||
const selectStatusState = createAppSelector(
|
||||
[
|
||||
(state) => state.meta.get('me') as string | undefined,
|
||||
(_, status: Status) => status,
|
||||
],
|
||||
(userId, status) => {
|
||||
const isPublic = ['public', 'unlisted'].includes(
|
||||
status.get('visibility') as StatusVisibility,
|
||||
);
|
||||
const isMineAndPrivate =
|
||||
userId === status.getIn(['account', 'id']) &&
|
||||
status.get('visibility') === 'private';
|
||||
return {
|
||||
isLoggedIn: !!userId,
|
||||
isPublic,
|
||||
isMine: userId === status.getIn(['account', 'id']),
|
||||
isPrivateReblog:
|
||||
userId === status.getIn(['account', 'id']) &&
|
||||
status.get('visibility') === 'private',
|
||||
isReblogged: !!status.get('reblogged'),
|
||||
isReblogAllowed: isPublic || isMineAndPrivate,
|
||||
isQuoteAutomaticallyAccepted:
|
||||
status.getIn(['quote_approval', 'current_user']) === 'automatic' &&
|
||||
(isPublic || isMineAndPrivate),
|
||||
isQuoteManuallyAccepted:
|
||||
status.getIn(['quote_approval', 'current_user']) === 'manual' &&
|
||||
(isPublic || isMineAndPrivate),
|
||||
isQuoteFollowersOnly:
|
||||
status.getIn(['quote_approval', 'automatic', 0]) === 'followers' ||
|
||||
status.getIn(['quote_approval', 'manual', 0]) === 'followers',
|
||||
};
|
||||
},
|
||||
);
|
||||
type StatusState = ReturnType<typeof selectStatusState>;
|
||||
|
||||
interface IconText {
|
||||
title: MessageDescriptor;
|
||||
meta?: MessageDescriptor;
|
||||
iconComponent: FC<SVGProps<SVGSVGElement>>;
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
function reblogIconText({
|
||||
isPublic,
|
||||
isPrivateReblog,
|
||||
isReblogged,
|
||||
}: StatusState): IconText {
|
||||
if (isReblogged) {
|
||||
return {
|
||||
title: messages.reblog_cancel,
|
||||
iconComponent: isPublic ? RepeatActiveIcon : RepeatPrivateActiveIcon,
|
||||
};
|
||||
}
|
||||
const iconText: IconText = {
|
||||
title: messages.reblog,
|
||||
iconComponent: RepeatIcon,
|
||||
};
|
||||
|
||||
if (isPrivateReblog) {
|
||||
iconText.meta = messages.reblog_private;
|
||||
iconText.iconComponent = RepeatPrivateIcon;
|
||||
} else if (!isPublic) {
|
||||
iconText.meta = messages.reblog_cannot;
|
||||
iconText.iconComponent = RepeatDisabledIcon;
|
||||
iconText.disabled = true;
|
||||
}
|
||||
return iconText;
|
||||
}
|
||||
|
||||
function quoteIconText({
|
||||
isMine,
|
||||
isQuoteAutomaticallyAccepted,
|
||||
isQuoteManuallyAccepted,
|
||||
isQuoteFollowersOnly,
|
||||
isPublic,
|
||||
}: StatusState): IconText {
|
||||
const iconText: IconText = {
|
||||
title: messages.quote,
|
||||
iconComponent: FormatQuote,
|
||||
};
|
||||
|
||||
if (!isPublic && !isMine) {
|
||||
iconText.disabled = true;
|
||||
iconText.iconComponent = FormatQuoteOff;
|
||||
iconText.meta = messages.quote_private;
|
||||
} else if (isQuoteAutomaticallyAccepted) {
|
||||
iconText.title = messages.quote;
|
||||
} else if (isQuoteManuallyAccepted) {
|
||||
iconText.title = messages.request_quote;
|
||||
iconText.meta = messages.quote_manual_review;
|
||||
} else {
|
||||
iconText.disabled = true;
|
||||
iconText.iconComponent = FormatQuoteOff;
|
||||
iconText.meta = isQuoteFollowersOnly
|
||||
? messages.quote_followers_only
|
||||
: messages.quote_cannot;
|
||||
}
|
||||
|
||||
return iconText;
|
||||
}
|
|
@ -2,7 +2,6 @@ import PropTypes from 'prop-types';
|
|||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { withRouter } from 'react-router-dom';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
@ -12,15 +11,10 @@ import { connect } from 'react-redux';
|
|||
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
|
||||
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
|
||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
|
||||
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
|
||||
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
|
||||
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
||||
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
||||
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
||||
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
|
||||
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
||||
|
@ -30,6 +24,7 @@ import { me } from '../initial_state';
|
|||
|
||||
import { IconButton } from './icon_button';
|
||||
import { isFeatureEnabled } from '../utils/environment';
|
||||
import { ReblogButton } from './status/reblog_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
@ -43,10 +38,6 @@ const messages = defineMessages({
|
|||
share: { id: 'status.share', defaultMessage: 'Share' },
|
||||
more: { id: 'status.more', defaultMessage: 'More' },
|
||||
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
|
||||
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
|
||||
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
||||
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
|
||||
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
|
||||
|
@ -85,10 +76,9 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
identity: identityContextPropShape,
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
quotedAccountId: ImmutablePropTypes.string,
|
||||
quotedAccountId: PropTypes.string,
|
||||
onReply: PropTypes.func,
|
||||
onFavourite: PropTypes.func,
|
||||
onReblog: PropTypes.func,
|
||||
onDelete: PropTypes.func,
|
||||
onRevokeQuote: PropTypes.func,
|
||||
onQuotePolicyChange: PropTypes.func,
|
||||
|
@ -152,16 +142,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
}
|
||||
};
|
||||
|
||||
handleReblogClick = e => {
|
||||
const { signedIn } = this.props.identity;
|
||||
|
||||
if (signedIn) {
|
||||
this.props.onReblog(this.props.status, e);
|
||||
} else {
|
||||
this.props.onInteractionModal('reblog', this.props.status);
|
||||
}
|
||||
};
|
||||
|
||||
handleBookmarkClick = () => {
|
||||
this.props.onBookmark(this.props.status);
|
||||
};
|
||||
|
@ -377,25 +357,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
replyTitle = intl.formatMessage(messages.replyAll);
|
||||
}
|
||||
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle, reblogIconComponent;
|
||||
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
reblogIconComponent = RepeatIcon;
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
reblogIconComponent = RepeatPrivateIcon;
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
reblogIconComponent = RepeatDisabledIcon;
|
||||
}
|
||||
|
||||
|
||||
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
|
||||
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
|
||||
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
|
||||
|
@ -406,7 +367,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
<IconButton className='status__action-bar__button' title={replyTitle} icon={isReply ? 'reply' : replyIcon} iconComponent={isReply ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
|
||||
</div>
|
||||
<div className='status__action-bar__button-wrapper'>
|
||||
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
|
||||
<ReblogButton status={status} counters={withCounters} />
|
||||
</div>
|
||||
<div className='status__action-bar__button-wrapper'>
|
||||
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />
|
||||
|
|
|
@ -14,6 +14,7 @@ import { StatusQuoteManager } from '../components/status_quoted';
|
|||
import { LoadGap } from './load_gap';
|
||||
import ScrollableList from './scrollable_list';
|
||||
|
||||
|
||||
export default class StatusList extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
|
@ -40,84 +41,6 @@ export default class StatusList extends ImmutablePureComponent {
|
|||
trackScroll: true,
|
||||
};
|
||||
|
||||
componentDidMount() {
|
||||
this.columnHeaderHeight = this.node?.node
|
||||
? parseFloat(
|
||||
getComputedStyle(this.node.node).getPropertyValue('--column-header-height')
|
||||
) || 0
|
||||
: 0;
|
||||
}
|
||||
|
||||
getFeaturedStatusCount = () => {
|
||||
return this.props.featuredStatusIds ? this.props.featuredStatusIds.size : 0;
|
||||
};
|
||||
|
||||
getCurrentStatusIndex = (id, featured) => {
|
||||
if (featured) {
|
||||
return this.props.featuredStatusIds.indexOf(id);
|
||||
} else {
|
||||
return this.props.statusIds.indexOf(id) + this.getFeaturedStatusCount();
|
||||
}
|
||||
};
|
||||
|
||||
handleMoveUp = (id, featured) => {
|
||||
const index = this.getCurrentStatusIndex(id, featured);
|
||||
this._selectChild(id, index, -1);
|
||||
};
|
||||
|
||||
handleMoveDown = (id, featured) => {
|
||||
const index = this.getCurrentStatusIndex(id, featured);
|
||||
this._selectChild(id, index, 1);
|
||||
};
|
||||
|
||||
_selectChild = (id, index, direction) => {
|
||||
const listContainer = this.node?.node;
|
||||
let listItem = listContainer?.querySelector(
|
||||
// :nth-child uses 1-based indexing
|
||||
`.item-list > :nth-child(${index + 1 + direction})`
|
||||
);
|
||||
|
||||
if (!listItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If selected container element is empty, we skip it
|
||||
if (listItem.matches(':empty')) {
|
||||
this._selectChild(id, index + direction, direction);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the list item is a post
|
||||
let targetElement = listItem.querySelector('.focusable');
|
||||
|
||||
// Otherwise, check if the item contains follow suggestions or
|
||||
// is a 'load more' button.
|
||||
if (
|
||||
!targetElement && (
|
||||
listItem.querySelector('.inline-follow-suggestions') ||
|
||||
listItem.matches('.load-more')
|
||||
)
|
||||
) {
|
||||
targetElement = listItem;
|
||||
}
|
||||
|
||||
if (targetElement) {
|
||||
const elementRect = targetElement.getBoundingClientRect();
|
||||
|
||||
const isFullyVisible =
|
||||
elementRect.top >= this.columnHeaderHeight &&
|
||||
elementRect.bottom <= window.innerHeight;
|
||||
|
||||
if (!isFullyVisible) {
|
||||
targetElement.scrollIntoView({
|
||||
block: direction === 1 ? 'start' : 'center',
|
||||
});
|
||||
}
|
||||
|
||||
targetElement.focus();
|
||||
}
|
||||
}
|
||||
|
||||
handleLoadOlder = debounce(() => {
|
||||
const { statusIds, lastId, onLoadMore } = this.props;
|
||||
onLoadMore(lastId || (statusIds.size > 0 ? statusIds.last() : undefined));
|
||||
|
@ -158,8 +81,6 @@ export default class StatusList extends ImmutablePureComponent {
|
|||
<StatusQuoteManager
|
||||
key={statusId}
|
||||
id={statusId}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType={timelineId}
|
||||
scrollKey={this.props.scrollKey}
|
||||
showThread
|
||||
|
@ -176,8 +97,6 @@ export default class StatusList extends ImmutablePureComponent {
|
|||
key={`f-${statusId}`}
|
||||
id={statusId}
|
||||
featured
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType={timelineId}
|
||||
showThread
|
||||
withCounters={this.props.withCounters}
|
||||
|
@ -191,5 +110,4 @@ export default class StatusList extends ImmutablePureComponent {
|
|||
</ScrollableList>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,9 +32,7 @@ const QuoteWrapper: React.FC<{
|
|||
);
|
||||
};
|
||||
|
||||
const NestedQuoteLink: React.FC<{
|
||||
status: Status;
|
||||
}> = ({ status }) => {
|
||||
const NestedQuoteLink: React.FC<{ status: Status }> = ({ status }) => {
|
||||
const accountId = status.get('account') as string;
|
||||
const account = useAppSelector((state) =>
|
||||
accountId ? state.accounts.get(accountId) : undefined,
|
||||
|
@ -63,24 +61,47 @@ type GetStatusSelector = (
|
|||
props: { id?: string | null; contextType?: string },
|
||||
) => Status | null;
|
||||
|
||||
export const QuotedStatus: React.FC<{
|
||||
interface QuotedStatusProps {
|
||||
quote: QuoteMap;
|
||||
contextType?: string;
|
||||
parentQuotePostId?: string | null;
|
||||
variant?: 'full' | 'link';
|
||||
nestingLevel?: number;
|
||||
}> = ({ quote, contextType, nestingLevel = 1, variant = 'full' }) => {
|
||||
onQuoteCancel?: () => void; // Used for composer.
|
||||
}
|
||||
|
||||
export const QuotedStatus: React.FC<QuotedStatusProps> = ({
|
||||
quote,
|
||||
contextType,
|
||||
parentQuotePostId,
|
||||
nestingLevel = 1,
|
||||
variant = 'full',
|
||||
onQuoteCancel,
|
||||
}) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const quoteState = useAppSelector((state) =>
|
||||
parentQuotePostId
|
||||
? state.statuses.getIn([parentQuotePostId, 'quote', 'state'])
|
||||
: quote.get('state'),
|
||||
);
|
||||
|
||||
const quotedStatusId = quote.get('quoted_status');
|
||||
const quoteState = quote.get('state');
|
||||
const status = useAppSelector((state) =>
|
||||
quotedStatusId ? state.statuses.get(quotedStatusId) : undefined,
|
||||
);
|
||||
|
||||
const shouldLoadQuote = !status?.get('isLoading') && quoteState !== 'deleted';
|
||||
|
||||
useEffect(() => {
|
||||
if (!status && quotedStatusId) {
|
||||
dispatch(fetchStatus(quotedStatusId));
|
||||
if (shouldLoadQuote && quotedStatusId) {
|
||||
dispatch(
|
||||
fetchStatus(quotedStatusId, {
|
||||
parentQuotePostId,
|
||||
alsoFetchContext: false,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}, [status, quotedStatusId, dispatch]);
|
||||
}, [shouldLoadQuote, quotedStatusId, parentQuotePostId, dispatch]);
|
||||
|
||||
// In order to find out whether the quoted post should be completely hidden
|
||||
// due to a matching filter, we run it through the selector used by `status_container`.
|
||||
|
@ -160,10 +181,12 @@ export const QuotedStatus: React.FC<{
|
|||
id={quotedStatusId}
|
||||
contextType={contextType}
|
||||
avatarSize={32}
|
||||
onQuoteCancel={onQuoteCancel}
|
||||
>
|
||||
{canRenderChildQuote && (
|
||||
<QuotedStatus
|
||||
quote={childQuote}
|
||||
parentQuotePostId={quotedStatusId}
|
||||
contextType={contextType}
|
||||
variant={
|
||||
nestingLevel === MAX_QUOTE_POSTS_NESTING_LEVEL ? 'link' : 'full'
|
||||
|
@ -199,7 +222,11 @@ export const StatusQuoteManager = (props: StatusQuoteManagerProps) => {
|
|||
if (quote) {
|
||||
return (
|
||||
<StatusContainer {...props}>
|
||||
<QuotedStatus quote={quote} contextType={props.contextType} />
|
||||
<QuotedStatus
|
||||
quote={quote}
|
||||
parentQuotePostId={status?.get('id') as string}
|
||||
contextType={props.contextType}
|
||||
/>
|
||||
</StatusContainer>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import {
|
|||
mentionCompose,
|
||||
directCompose,
|
||||
} from '../actions/compose';
|
||||
import { quoteComposeById } from '../actions/compose_typed';
|
||||
import {
|
||||
initDomainBlockModal,
|
||||
unblockDomain,
|
||||
|
@ -41,10 +42,12 @@ import {
|
|||
translateStatus,
|
||||
undoStatusTranslation,
|
||||
} from '../actions/statuses';
|
||||
import { setStatusQuotePolicy } from '../actions/statuses_typed';
|
||||
import Status from '../components/status';
|
||||
import { deleteModal } from '../initial_state';
|
||||
import { makeGetStatus, makeGetPictureInPicture } from '../selectors';
|
||||
import { quoteComposeCancel } from '../actions/compose_typed';
|
||||
|
||||
import { isFeatureEnabled } from 'mastodon/utils/environment';
|
||||
|
||||
const makeMapStateToProps = () => {
|
||||
const getStatus = makeGetStatus();
|
||||
|
@ -76,6 +79,12 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
|
|||
onReblog (status, e) {
|
||||
dispatch(toggleReblog(status.get('id'), e.shiftKey));
|
||||
},
|
||||
|
||||
onQuote (status) {
|
||||
if (isFeatureEnabled('outgoing_quotes')) {
|
||||
dispatch(quoteComposeById(status.get('id')));
|
||||
}
|
||||
},
|
||||
|
||||
onFavourite (status) {
|
||||
dispatch(toggleFavourite(status.get('id')));
|
||||
|
@ -108,13 +117,13 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
|
|||
if (!deleteModal) {
|
||||
dispatch(deleteStatus(status.get('id'), withRedraft));
|
||||
} else {
|
||||
dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
|
||||
}
|
||||
},
|
||||
|
||||
onQuoteCancel() {
|
||||
if (contextType === 'compose') {
|
||||
dispatch(quoteComposeCancel());
|
||||
dispatch(openModal({
|
||||
modalType: 'CONFIRM_DELETE_STATUS',
|
||||
modalProps: {
|
||||
statusId: status.get('id'),
|
||||
withRedraft
|
||||
}
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -123,7 +132,13 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({
|
|||
},
|
||||
|
||||
onQuotePolicyChange(status) {
|
||||
dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId: status.get('id') } }));
|
||||
const statusId = status.get('id');
|
||||
const handleChange = (_, quotePolicy) => {
|
||||
dispatch(
|
||||
setStatusQuotePolicy({ policy: quotePolicy, statusId }),
|
||||
);
|
||||
}
|
||||
dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId, onChange: handleChange } }));
|
||||
},
|
||||
|
||||
onEdit (status) {
|
||||
|
|
|
@ -15,10 +15,8 @@ import { missingAltTextModal } from 'mastodon/initial_state';
|
|||
import AutosuggestInput from 'mastodon/components/autosuggest_input';
|
||||
import AutosuggestTextarea from 'mastodon/components/autosuggest_textarea';
|
||||
import { Button } from 'mastodon/components/button';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
|
||||
import PollButtonContainer from '../containers/poll_button_container';
|
||||
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
|
||||
import SpoilerButtonContainer from '../containers/spoiler_button_container';
|
||||
import UploadButtonContainer from '../containers/upload_button_container';
|
||||
import { countableText } from '../util/counter';
|
||||
|
@ -32,6 +30,7 @@ import { ReplyIndicator } from './reply_indicator';
|
|||
import { UploadForm } from './upload_form';
|
||||
import { Warning } from './warning';
|
||||
import { ComposeQuotedStatus } from './quoted_post';
|
||||
import { VisibilityButton } from './visibility_button';
|
||||
|
||||
const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d';
|
||||
|
||||
|
@ -259,6 +258,11 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
<div className={classNames('compose-form__highlightable', { active: highlighted })} ref={this.setRef}>
|
||||
<EditIndicator />
|
||||
|
||||
<div className='compose-form__dropdowns'>
|
||||
<VisibilityButton disabled={this.props.isEditing} />
|
||||
<LanguageDropdown />
|
||||
</div>
|
||||
|
||||
{this.props.spoiler && (
|
||||
<div className='spoiler-input'>
|
||||
<div className='spoiler-input__border' />
|
||||
|
@ -285,11 +289,6 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
</div>
|
||||
)}
|
||||
|
||||
<div className='compose-form__dropdowns'>
|
||||
<PrivacyDropdownContainer disabled={this.props.isEditing} />
|
||||
<LanguageDropdown />
|
||||
</div>
|
||||
|
||||
<AutosuggestTextarea
|
||||
ref={this.textareaRef}
|
||||
placeholder={intl.formatMessage(messages.placeholder)}
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
import { useMemo } from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import type { FC } from 'react';
|
||||
|
||||
import { Map } from 'immutable';
|
||||
|
||||
import { quoteComposeCancel } from '@/mastodon/actions/compose_typed';
|
||||
import { QuotedStatus } from '@/mastodon/components/status_quoted';
|
||||
import { useAppSelector } from '@/mastodon/store';
|
||||
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
|
||||
|
||||
export const ComposeQuotedStatus: FC = () => {
|
||||
const quotedStatusId = useAppSelector(
|
||||
(state) => state.compose.get('quoted_status_id') as string | null,
|
||||
);
|
||||
const isEditing = useAppSelector((state) => !!state.compose.get('id'));
|
||||
const quote = useMemo(
|
||||
() =>
|
||||
quotedStatusId
|
||||
|
@ -20,8 +22,17 @@ export const ComposeQuotedStatus: FC = () => {
|
|||
: null,
|
||||
[quotedStatusId],
|
||||
);
|
||||
const dispatch = useAppDispatch();
|
||||
const handleQuoteCancel = useCallback(() => {
|
||||
dispatch(quoteComposeCancel());
|
||||
}, [dispatch]);
|
||||
if (!quote) {
|
||||
return null;
|
||||
}
|
||||
return <QuotedStatus quote={quote} contextType='compose' />;
|
||||
return (
|
||||
<QuotedStatus
|
||||
quote={quote}
|
||||
onQuoteCancel={!isEditing ? handleQuoteCancel : undefined}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
import { useCallback, useMemo } from 'react';
|
||||
import type { FC } from 'react';
|
||||
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import { changeComposeVisibility } from '@/mastodon/actions/compose';
|
||||
import { setComposeQuotePolicy } from '@/mastodon/actions/compose_typed';
|
||||
import { openModal } from '@/mastodon/actions/modal';
|
||||
import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes';
|
||||
import type { StatusVisibility } from '@/mastodon/api_types/statuses';
|
||||
import { Icon } from '@/mastodon/components/icon';
|
||||
import { useAppSelector, useAppDispatch } from '@/mastodon/store';
|
||||
import { isFeatureEnabled } from '@/mastodon/utils/environment';
|
||||
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
||||
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
|
||||
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
||||
import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react';
|
||||
|
||||
import type { VisibilityModalCallback } from '../../ui/components/visibility_modal';
|
||||
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
|
||||
|
||||
import { messages as privacyMessages } from './privacy_dropdown';
|
||||
|
||||
const messages = defineMessages({
|
||||
anyone_quote: {
|
||||
id: 'privacy.quote.anyone',
|
||||
defaultMessage: '{visibility}, anyone can quote',
|
||||
},
|
||||
limited_quote: {
|
||||
id: 'privacy.quote.limited',
|
||||
defaultMessage: '{visibility}, quotes limited',
|
||||
},
|
||||
disabled_quote: {
|
||||
id: 'privacy.quote.disabled',
|
||||
defaultMessage: '{visibility}, quotes disabled',
|
||||
},
|
||||
});
|
||||
|
||||
interface PrivacyDropdownProps {
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
export const VisibilityButton: FC<PrivacyDropdownProps> = (props) => {
|
||||
if (!isFeatureEnabled('outgoing_quotes')) {
|
||||
return <PrivacyDropdownContainer {...props} />;
|
||||
}
|
||||
return <PrivacyModalButton {...props} />;
|
||||
};
|
||||
|
||||
const visibilityOptions = {
|
||||
public: {
|
||||
icon: 'globe',
|
||||
iconComponent: PublicIcon,
|
||||
value: 'public',
|
||||
text: privacyMessages.public_short,
|
||||
},
|
||||
unlisted: {
|
||||
icon: 'unlock',
|
||||
iconComponent: QuietTimeIcon,
|
||||
value: 'unlisted',
|
||||
text: privacyMessages.unlisted_short,
|
||||
},
|
||||
private: {
|
||||
icon: 'lock',
|
||||
iconComponent: LockIcon,
|
||||
value: 'private',
|
||||
text: privacyMessages.private_short,
|
||||
},
|
||||
direct: {
|
||||
icon: 'at',
|
||||
iconComponent: AlternateEmailIcon,
|
||||
value: 'direct',
|
||||
text: privacyMessages.direct_short,
|
||||
},
|
||||
};
|
||||
|
||||
const PrivacyModalButton: FC<PrivacyDropdownProps> = ({ disabled = false }) => {
|
||||
const intl = useIntl();
|
||||
|
||||
const { visibility, quotePolicy } = useAppSelector((state) => ({
|
||||
visibility: state.compose.get('privacy') as StatusVisibility,
|
||||
quotePolicy: state.compose.get('quote_policy') as ApiQuotePolicy,
|
||||
}));
|
||||
|
||||
const { icon, iconComponent } = useMemo(() => {
|
||||
const option = visibilityOptions[visibility];
|
||||
return { icon: option.icon, iconComponent: option.iconComponent };
|
||||
}, [visibility]);
|
||||
const text = useMemo(() => {
|
||||
const visibilityText = intl.formatMessage(
|
||||
visibilityOptions[visibility].text,
|
||||
);
|
||||
if (visibility === 'private' || visibility === 'direct') {
|
||||
return visibilityText;
|
||||
}
|
||||
if (quotePolicy === 'nobody') {
|
||||
return intl.formatMessage(messages.disabled_quote, {
|
||||
visibility: visibilityText,
|
||||
});
|
||||
}
|
||||
if (quotePolicy !== 'public') {
|
||||
return intl.formatMessage(messages.limited_quote, {
|
||||
visibility: visibilityText,
|
||||
});
|
||||
}
|
||||
return intl.formatMessage(messages.anyone_quote, {
|
||||
visibility: visibilityText,
|
||||
});
|
||||
}, [quotePolicy, visibility, intl]);
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const handleChange: VisibilityModalCallback = useCallback(
|
||||
(newVisibility, newQuotePolicy) => {
|
||||
if (newVisibility !== visibility) {
|
||||
dispatch(changeComposeVisibility(newVisibility));
|
||||
}
|
||||
if (newQuotePolicy !== quotePolicy) {
|
||||
dispatch(setComposeQuotePolicy(newQuotePolicy));
|
||||
}
|
||||
},
|
||||
[dispatch, quotePolicy, visibility],
|
||||
);
|
||||
|
||||
const handleOpen = useCallback(() => {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'COMPOSE_PRIVACY',
|
||||
modalProps: { onChange: handleChange },
|
||||
}),
|
||||
);
|
||||
}, [dispatch, handleChange]);
|
||||
|
||||
return (
|
||||
<button
|
||||
type='button'
|
||||
title={intl.formatMessage(privacyMessages.change_privacy)}
|
||||
onClick={handleOpen}
|
||||
disabled={disabled}
|
||||
className={classNames('dropdown-button')}
|
||||
>
|
||||
<Icon id={icon} icon={iconComponent} />
|
||||
<span className='dropdown-button__label'>{text}</span>
|
||||
</button>
|
||||
);
|
||||
};
|
|
@ -45,7 +45,7 @@ const getAccounts = createSelector(
|
|||
|
||||
const getStatus = makeGetStatus();
|
||||
|
||||
export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown }) => {
|
||||
export const Conversation = ({ conversation, scrollKey }) => {
|
||||
const id = conversation.get('id');
|
||||
const unread = conversation.get('unread');
|
||||
const lastStatusId = conversation.get('last_status');
|
||||
|
@ -110,14 +110,6 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
|
|||
dispatch(deleteConversation(id));
|
||||
}, [dispatch, id]);
|
||||
|
||||
const handleHotkeyMoveUp = useCallback(() => {
|
||||
onMoveUp(id);
|
||||
}, [id, onMoveUp]);
|
||||
|
||||
const handleHotkeyMoveDown = useCallback(() => {
|
||||
onMoveDown(id);
|
||||
}, [id, onMoveDown]);
|
||||
|
||||
const handleConversationMute = useCallback(() => {
|
||||
if (lastStatus.get('muted')) {
|
||||
dispatch(unmuteStatus(lastStatus.get('id')));
|
||||
|
@ -161,8 +153,6 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
|
|||
const handlers = {
|
||||
reply: handleReply,
|
||||
open: handleClick,
|
||||
moveUp: handleHotkeyMoveUp,
|
||||
moveDown: handleHotkeyMoveDown,
|
||||
toggleHidden: handleShowMore,
|
||||
};
|
||||
|
||||
|
@ -224,6 +214,4 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
|
|||
Conversation.propTypes = {
|
||||
conversation: ImmutablePropTypes.map.isRequired,
|
||||
scrollKey: PropTypes.string,
|
||||
onMoveUp: PropTypes.func,
|
||||
onMoveDown: PropTypes.func,
|
||||
};
|
||||
|
|
|
@ -10,20 +10,6 @@ import ScrollableList from 'mastodon/components/scrollable_list';
|
|||
|
||||
import { Conversation } from './conversation';
|
||||
|
||||
const focusChild = (node, index, alignTop) => {
|
||||
const element = node.querySelector(`article:nth-of-type(${index + 1}) .focusable`);
|
||||
|
||||
if (element) {
|
||||
if (alignTop && node.scrollTop > element.offsetTop) {
|
||||
element.scrollIntoView(true);
|
||||
} else if (!alignTop && node.scrollTop + node.clientHeight < element.offsetTop + element.offsetHeight) {
|
||||
element.scrollIntoView(false);
|
||||
}
|
||||
|
||||
element.focus();
|
||||
}
|
||||
};
|
||||
|
||||
export const ConversationsList = ({ scrollKey, ...other }) => {
|
||||
const listRef = useRef();
|
||||
const conversations = useSelector(state => state.getIn(['conversations', 'items']));
|
||||
|
@ -32,16 +18,6 @@ export const ConversationsList = ({ scrollKey, ...other }) => {
|
|||
const dispatch = useDispatch();
|
||||
const lastStatusId = conversations.last()?.get('last_status');
|
||||
|
||||
const handleMoveUp = useCallback(id => {
|
||||
const elementIndex = conversations.findIndex(x => x.get('id') === id) - 1;
|
||||
focusChild(listRef.current.node, elementIndex, true);
|
||||
}, [listRef, conversations]);
|
||||
|
||||
const handleMoveDown = useCallback(id => {
|
||||
const elementIndex = conversations.findIndex(x => x.get('id') === id) + 1;
|
||||
focusChild(listRef.current.node, elementIndex, false);
|
||||
}, [listRef, conversations]);
|
||||
|
||||
const debouncedLoadMore = useMemo(() => debounce(id => {
|
||||
dispatch(expandConversations({ maxId: id }));
|
||||
}, 300, { leading: true }), [dispatch]);
|
||||
|
@ -58,8 +34,6 @@ export const ConversationsList = ({ scrollKey, ...other }) => {
|
|||
<Conversation
|
||||
key={item.get('id')}
|
||||
conversation={item}
|
||||
onMoveUp={handleMoveUp}
|
||||
onMoveDown={handleMoveDown}
|
||||
scrollKey={scrollKey}
|
||||
/>
|
||||
))}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { useEffect, useCallback, useRef, useState } from 'react';
|
||||
import { useEffect, useCallback, useRef, useState, useId } from 'react';
|
||||
|
||||
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
|
@ -19,6 +19,7 @@ import { DisplayName } from 'mastodon/components/display_name';
|
|||
import { FollowButton } from 'mastodon/components/follow_button';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { IconButton } from 'mastodon/components/icon_button';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import { VerifiedBadge } from 'mastodon/components/verified_badge';
|
||||
import { domain } from 'mastodon/initial_state';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
@ -56,9 +57,7 @@ const messages = defineMessages({
|
|||
},
|
||||
});
|
||||
|
||||
const Source: React.FC<{
|
||||
id: ApiSuggestionSourceJSON;
|
||||
}> = ({ id }) => {
|
||||
const Source: React.FC<{ id: ApiSuggestionSourceJSON }> = ({ id }) => {
|
||||
const intl = useIntl();
|
||||
|
||||
let label, hint;
|
||||
|
@ -168,10 +167,11 @@ const Card: React.FC<{
|
|||
|
||||
const DISMISSIBLE_ID = 'home/follow-suggestions';
|
||||
|
||||
export const InlineFollowSuggestions: React.FC<{
|
||||
hidden?: boolean;
|
||||
}> = ({ hidden }) => {
|
||||
export const InlineFollowSuggestions: React.FC<{ hidden?: boolean }> = ({
|
||||
hidden,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
const uniqueId = useId();
|
||||
const dispatch = useAppDispatch();
|
||||
const suggestions = useAppSelector((state) => state.suggestions.items);
|
||||
const isLoading = useAppSelector((state) => state.suggestions.isLoading);
|
||||
|
@ -257,9 +257,14 @@ export const InlineFollowSuggestions: React.FC<{
|
|||
}
|
||||
|
||||
return (
|
||||
<div className='inline-follow-suggestions'>
|
||||
<div
|
||||
role='group'
|
||||
aria-labelledby={uniqueId}
|
||||
className='inline-follow-suggestions focusable'
|
||||
tabIndex={-1}
|
||||
>
|
||||
<div className='inline-follow-suggestions__header'>
|
||||
<h3>
|
||||
<h3 id={uniqueId}>
|
||||
<FormattedMessage
|
||||
id='follow_suggestions.who_to_follow'
|
||||
defaultMessage='Who to follow'
|
||||
|
@ -288,13 +293,17 @@ export const InlineFollowSuggestions: React.FC<{
|
|||
ref={bodyRef}
|
||||
onScroll={handleScroll}
|
||||
>
|
||||
{suggestions.map((suggestion) => (
|
||||
<Card
|
||||
key={suggestion.account_id}
|
||||
id={suggestion.account_id}
|
||||
sources={suggestion.sources}
|
||||
/>
|
||||
))}
|
||||
{isLoading ? (
|
||||
<LoadingIndicator />
|
||||
) : (
|
||||
suggestions.map((suggestion) => (
|
||||
<Card
|
||||
key={suggestion.account_id}
|
||||
id={suggestion.account_id}
|
||||
sources={suggestion.sources}
|
||||
/>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
|
||||
{canScrollLeft && (
|
||||
|
|
|
@ -9,6 +9,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
|||
import InfoIcon from '@/material-icons/400-24px/info.svg?react';
|
||||
import Column from 'mastodon/components/column';
|
||||
import ColumnHeader from 'mastodon/components/column_header';
|
||||
import { isFeatureEnabled } from 'mastodon/utils/environment';
|
||||
|
||||
const messages = defineMessages({
|
||||
heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },
|
||||
|
@ -62,6 +63,12 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
|||
<td><kbd>b</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.boost' defaultMessage='to boost' /></td>
|
||||
</tr>
|
||||
{isFeatureEnabled('outgoing_quotes') && (
|
||||
<tr>
|
||||
<td><kbd>q</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.quote' defaultMessage='Quote post' /></td>
|
||||
</tr>
|
||||
)}
|
||||
<tr>
|
||||
<td><kbd>enter</kbd>, <kbd>o</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.enter' defaultMessage='to open status' /></td>
|
||||
|
@ -83,13 +90,17 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
|||
<td><FormattedMessage id='keyboard_shortcuts.toggle_sensitivity' defaultMessage='to show/hide media' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>up</kbd>, <kbd>k</kbd></td>
|
||||
<td><kbd>k</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.up' defaultMessage='to move up in the list' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>down</kbd>, <kbd>j</kbd></td>
|
||||
<td><kbd>j</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.down' defaultMessage='to move down in the list' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>l</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.load_more' defaultMessage='Focus "Load more" button' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>1</kbd>-<kbd>9</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.column' defaultMessage='to focus a status in one of the columns' /></td>
|
||||
|
|
|
@ -38,6 +38,7 @@ const messages = defineMessages({
|
|||
reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your post' },
|
||||
status: { id: 'notification.status', defaultMessage: '{name} just posted' },
|
||||
update: { id: 'notification.update', defaultMessage: '{name} edited a post' },
|
||||
quoted_update: { id: 'notification.quoted_update', defaultMessage: '{name} edited a post you have quoted' },
|
||||
adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
|
||||
adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' },
|
||||
relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' },
|
||||
|
@ -57,8 +58,6 @@ class Notification extends ImmutablePureComponent {
|
|||
static propTypes = {
|
||||
notification: ImmutablePropTypes.map.isRequired,
|
||||
hidden: PropTypes.bool,
|
||||
onMoveUp: PropTypes.func.isRequired,
|
||||
onMoveDown: PropTypes.func.isRequired,
|
||||
onMention: PropTypes.func.isRequired,
|
||||
onFavourite: PropTypes.func.isRequired,
|
||||
onReblog: PropTypes.func.isRequired,
|
||||
|
@ -73,16 +72,6 @@ class Notification extends ImmutablePureComponent {
|
|||
...WithRouterPropTypes,
|
||||
};
|
||||
|
||||
handleMoveUp = () => {
|
||||
const { notification, onMoveUp } = this.props;
|
||||
onMoveUp(notification.get('id'));
|
||||
};
|
||||
|
||||
handleMoveDown = () => {
|
||||
const { notification, onMoveDown } = this.props;
|
||||
onMoveDown(notification.get('id'));
|
||||
};
|
||||
|
||||
handleOpen = () => {
|
||||
const { notification } = this.props;
|
||||
|
||||
|
@ -128,8 +117,6 @@ class Notification extends ImmutablePureComponent {
|
|||
mention: this.handleMention,
|
||||
open: this.handleOpen,
|
||||
openProfile: this.handleOpenProfile,
|
||||
moveUp: this.handleMoveUp,
|
||||
moveDown: this.handleMoveDown,
|
||||
toggleHidden: this.handleHotkeyToggleHidden,
|
||||
};
|
||||
}
|
||||
|
@ -180,8 +167,6 @@ class Notification extends ImmutablePureComponent {
|
|||
id={notification.get('status')}
|
||||
withDismiss
|
||||
hidden={this.props.hidden}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
contextType='notifications'
|
||||
getScrollPosition={this.props.getScrollPosition}
|
||||
updateScrollBottom={this.props.updateScrollBottom}
|
||||
|
@ -352,6 +337,41 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderQuotedUpdate (notification, link) {
|
||||
const { intl, unread, status } = this.props;
|
||||
|
||||
if (!status) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Hotkeys handlers={this.getHandlers()}>
|
||||
<div className={classNames('notification notification-update focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.update, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
|
||||
<div className='notification__message'>
|
||||
<Icon id='pencil' icon={EditIcon} />
|
||||
|
||||
<span title={notification.get('created_at')}>
|
||||
<FormattedMessage id='notification.quoted_update' defaultMessage='{name} edited a post you have quoted' values={{ name: link }} />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<StatusQuoteManager
|
||||
id={notification.get('status')}
|
||||
account={notification.get('account')}
|
||||
contextType='notifications'
|
||||
muted
|
||||
withDismiss
|
||||
hidden={this.props.hidden}
|
||||
getScrollPosition={this.props.getScrollPosition}
|
||||
updateScrollBottom={this.props.updateScrollBottom}
|
||||
cachedMediaWidth={this.props.cachedMediaWidth}
|
||||
cacheMediaWidth={this.props.cacheMediaWidth}
|
||||
/>
|
||||
</div>
|
||||
</Hotkeys>
|
||||
);
|
||||
}
|
||||
|
||||
renderPoll (notification, account) {
|
||||
const { intl, unread, status } = this.props;
|
||||
const ownPoll = me === account.get('id');
|
||||
|
@ -508,6 +528,8 @@ class Notification extends ImmutablePureComponent {
|
|||
return this.renderStatus(notification, link);
|
||||
case 'update':
|
||||
return this.renderUpdate(notification, link);
|
||||
case 'quoted_update':
|
||||
return this.renderQuotedUpdate(notification, link);
|
||||
case 'poll':
|
||||
return this.renderPoll(notification, account);
|
||||
case 'severed_relationships':
|
||||
|
|
|
@ -31,21 +31,6 @@ const messages = defineMessages({
|
|||
dismiss: { id: 'notification_requests.dismiss', defaultMessage: 'Dismiss' },
|
||||
});
|
||||
|
||||
const selectChild = (ref, index, alignTop) => {
|
||||
const container = ref.current.node;
|
||||
const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);
|
||||
|
||||
if (element) {
|
||||
if (alignTop && container.scrollTop > element.offsetTop) {
|
||||
element.scrollIntoView(true);
|
||||
} else if (!alignTop && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {
|
||||
element.scrollIntoView(false);
|
||||
}
|
||||
|
||||
element.focus();
|
||||
}
|
||||
};
|
||||
|
||||
export const NotificationRequest = ({ multiColumn, params: { id } }) => {
|
||||
const columnRef = useRef();
|
||||
const intl = useIntl();
|
||||
|
@ -74,16 +59,6 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => {
|
|||
dispatch(acceptNotificationRequest({ id }));
|
||||
}, [dispatch, id]);
|
||||
|
||||
const handleMoveUp = useCallback(id => {
|
||||
const elementIndex = notifications.findIndex(item => item !== null && item.get('id') === id) - 1;
|
||||
selectChild(columnRef, elementIndex, true);
|
||||
}, [columnRef, notifications]);
|
||||
|
||||
const handleMoveDown = useCallback(id => {
|
||||
const elementIndex = notifications.findIndex(item => item !== null && item.get('id') === id) + 1;
|
||||
selectChild(columnRef, elementIndex, false);
|
||||
}, [columnRef, notifications]);
|
||||
|
||||
useEffect(() => {
|
||||
dispatch(fetchNotificationRequest({ id }));
|
||||
}, [dispatch, id]);
|
||||
|
@ -146,8 +121,6 @@ export const NotificationRequest = ({ multiColumn, params: { id } }) => {
|
|||
key={item.get('id')}
|
||||
notification={item}
|
||||
accountId={item.get('account')}
|
||||
onMoveUp={handleMoveUp}
|
||||
onMoveDown={handleMoveDown}
|
||||
/>
|
||||
))}
|
||||
</ScrollableList>
|
||||
|
|
|
@ -16,6 +16,7 @@ import { NotificationMention } from './notification_mention';
|
|||
import { NotificationModerationWarning } from './notification_moderation_warning';
|
||||
import { NotificationPoll } from './notification_poll';
|
||||
import { NotificationQuote } from './notification_quote';
|
||||
import { NotificationQuotedUpdate } from './notification_quoted_update';
|
||||
import { NotificationReblog } from './notification_reblog';
|
||||
import { NotificationSeveredRelationships } from './notification_severed_relationships';
|
||||
import { NotificationStatus } from './notification_status';
|
||||
|
@ -24,9 +25,7 @@ import { NotificationUpdate } from './notification_update';
|
|||
export const NotificationGroup: React.FC<{
|
||||
notificationGroupId: NotificationGroupModel['group_key'];
|
||||
unread: boolean;
|
||||
onMoveUp: (groupId: string) => void;
|
||||
onMoveDown: (groupId: string) => void;
|
||||
}> = ({ notificationGroupId, unread, onMoveUp, onMoveDown }) => {
|
||||
}> = ({ notificationGroupId, unread }) => {
|
||||
const notificationGroup = useAppSelector((state) =>
|
||||
state.notificationGroups.groups.find(
|
||||
(item) => item.type !== 'gap' && item.group_key === notificationGroupId,
|
||||
|
@ -42,14 +41,6 @@ export const NotificationGroup: React.FC<{
|
|||
|
||||
const handlers = useMemo(
|
||||
() => ({
|
||||
moveUp: () => {
|
||||
onMoveUp(notificationGroupId);
|
||||
},
|
||||
|
||||
moveDown: () => {
|
||||
onMoveDown(notificationGroupId);
|
||||
},
|
||||
|
||||
openProfile: () => {
|
||||
if (accountId) dispatch(navigateToProfile(accountId));
|
||||
},
|
||||
|
@ -58,7 +49,7 @@ export const NotificationGroup: React.FC<{
|
|||
if (accountId) dispatch(mentionComposeById(accountId));
|
||||
},
|
||||
}),
|
||||
[dispatch, notificationGroupId, accountId, onMoveUp, onMoveDown],
|
||||
[dispatch, accountId],
|
||||
);
|
||||
|
||||
if (!notificationGroup || notificationGroup.type === 'gap') return null;
|
||||
|
@ -125,6 +116,14 @@ export const NotificationGroup: React.FC<{
|
|||
<NotificationUpdate unread={unread} notification={notificationGroup} />
|
||||
);
|
||||
break;
|
||||
case 'quoted_update':
|
||||
content = (
|
||||
<NotificationQuotedUpdate
|
||||
unread={unread}
|
||||
notification={notificationGroup}
|
||||
/>
|
||||
);
|
||||
break;
|
||||
case 'admin.sign_up':
|
||||
content = (
|
||||
<NotificationAdminSignUp
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import EditIcon from '@/material-icons/400-24px/edit.svg?react';
|
||||
import type { NotificationGroupQuotedUpdate } from 'mastodon/models/notification_group';
|
||||
|
||||
import type { LabelRenderer } from './notification_group_with_status';
|
||||
import { NotificationWithStatus } from './notification_with_status';
|
||||
|
||||
const labelRenderer: LabelRenderer = (displayedName) => (
|
||||
<FormattedMessage
|
||||
id='notification.quoted_update'
|
||||
defaultMessage='{name} edited a post you have quoted'
|
||||
values={{ name: displayedName }}
|
||||
/>
|
||||
);
|
||||
|
||||
export const NotificationQuotedUpdate: React.FC<{
|
||||
notification: NotificationGroupQuotedUpdate;
|
||||
unread: boolean;
|
||||
}> = ({ notification, unread }) => (
|
||||
<NotificationWithStatus
|
||||
type='update'
|
||||
icon={EditIcon}
|
||||
iconId='edit'
|
||||
accountIds={notification.sampleAccountIds}
|
||||
count={notification.notifications_count}
|
||||
statusId={notification.statusId}
|
||||
labelRenderer={labelRenderer}
|
||||
unread={unread}
|
||||
/>
|
||||
);
|
|
@ -99,29 +99,6 @@ export const Notifications: React.FC<{
|
|||
|
||||
const columnRef = useRef<ColumnRef>(null);
|
||||
|
||||
const selectChild = useCallback((index: number, alignTop: boolean) => {
|
||||
const container = columnRef.current?.node as HTMLElement | undefined;
|
||||
|
||||
if (!container) return;
|
||||
|
||||
const element = container.querySelector<HTMLElement>(
|
||||
`article:nth-of-type(${index + 1}) .focusable`,
|
||||
);
|
||||
|
||||
if (element) {
|
||||
if (alignTop && container.scrollTop > element.offsetTop) {
|
||||
element.scrollIntoView(true);
|
||||
} else if (
|
||||
!alignTop &&
|
||||
container.scrollTop + container.clientHeight <
|
||||
element.offsetTop + element.offsetHeight
|
||||
) {
|
||||
element.scrollIntoView(false);
|
||||
}
|
||||
element.focus();
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Keep track of mounted components for unread notification handling
|
||||
useEffect(() => {
|
||||
void dispatch(mountNotifications());
|
||||
|
@ -187,28 +164,6 @@ export const Notifications: React.FC<{
|
|||
columnRef.current?.scrollTop();
|
||||
}, []);
|
||||
|
||||
const handleMoveUp = useCallback(
|
||||
(id: string) => {
|
||||
const elementIndex =
|
||||
notifications.findIndex(
|
||||
(item) => item.type !== 'gap' && item.group_key === id,
|
||||
) - 1;
|
||||
selectChild(elementIndex, true);
|
||||
},
|
||||
[notifications, selectChild],
|
||||
);
|
||||
|
||||
const handleMoveDown = useCallback(
|
||||
(id: string) => {
|
||||
const elementIndex =
|
||||
notifications.findIndex(
|
||||
(item) => item.type !== 'gap' && item.group_key === id,
|
||||
) + 1;
|
||||
selectChild(elementIndex, false);
|
||||
},
|
||||
[notifications, selectChild],
|
||||
);
|
||||
|
||||
const handleMarkAsRead = useCallback(() => {
|
||||
dispatch(markNotificationsAsRead());
|
||||
void dispatch(submitMarkers({ immediate: true }));
|
||||
|
@ -241,8 +196,6 @@ export const Notifications: React.FC<{
|
|||
<NotificationGroup
|
||||
key={item.group_key}
|
||||
notificationGroupId={item.group_key}
|
||||
onMoveUp={handleMoveUp}
|
||||
onMoveDown={handleMoveDown}
|
||||
unread={
|
||||
lastReadId !== '0' &&
|
||||
!!item.page_max_id &&
|
||||
|
@ -251,15 +204,7 @@ export const Notifications: React.FC<{
|
|||
/>
|
||||
),
|
||||
);
|
||||
}, [
|
||||
notifications,
|
||||
isLoading,
|
||||
hasMore,
|
||||
lastReadId,
|
||||
handleLoadGap,
|
||||
handleMoveUp,
|
||||
handleMoveDown,
|
||||
]);
|
||||
}, [notifications, isLoading, hasMore, lastReadId, handleLoadGap]);
|
||||
|
||||
const prepend = (
|
||||
<>
|
||||
|
|
|
@ -233,7 +233,10 @@ export const Footer: React.FC<{
|
|||
icon='retweet'
|
||||
iconComponent={reblogIconComponent}
|
||||
onClick={handleReblogClick}
|
||||
counter={status.get('reblogs_count') as number}
|
||||
counter={
|
||||
(status.get('reblogs_count') as number) +
|
||||
(status.get('quotes_count') as number)
|
||||
}
|
||||
/>
|
||||
|
||||
<IconButton
|
||||
|
|
113
app/javascript/mastodon/features/quotes/index.tsx
Normal file
113
app/javascript/mastodon/features/quotes/index.tsx
Normal file
|
@ -0,0 +1,113 @@
|
|||
import { useCallback, useEffect } from 'react';
|
||||
|
||||
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
|
||||
|
||||
import { Helmet } from 'react-helmet';
|
||||
|
||||
import { List as ImmutableList } from 'immutable';
|
||||
|
||||
import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react';
|
||||
import { fetchQuotes } from 'mastodon/actions/interactions_typed';
|
||||
import { ColumnHeader } from 'mastodon/components/column_header';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import StatusList from 'mastodon/components/status_list';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
||||
import Column from '../ui/components/column';
|
||||
|
||||
const messages = defineMessages({
|
||||
refresh: { id: 'refresh', defaultMessage: 'Refresh' },
|
||||
});
|
||||
|
||||
const emptyList = ImmutableList();
|
||||
|
||||
export const Quotes: React.FC<{
|
||||
multiColumn?: boolean;
|
||||
params?: { statusId: string };
|
||||
}> = ({ multiColumn, params }) => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const statusId = params?.statusId;
|
||||
|
||||
const isCorrectStatusId: boolean = useAppSelector(
|
||||
(state) => state.status_lists.getIn(['quotes', 'statusId']) === statusId,
|
||||
);
|
||||
const statusIds = useAppSelector((state) =>
|
||||
state.status_lists.getIn(['quotes', 'items'], emptyList),
|
||||
);
|
||||
const nextUrl = useAppSelector(
|
||||
(state) =>
|
||||
state.status_lists.getIn(['quotes', 'next']) as string | undefined,
|
||||
);
|
||||
const isLoading = useAppSelector((state) =>
|
||||
state.status_lists.getIn(['quotes', 'isLoading'], true),
|
||||
);
|
||||
const hasMore = !!nextUrl;
|
||||
|
||||
useEffect(() => {
|
||||
if (statusId) void dispatch(fetchQuotes({ statusId }));
|
||||
}, [dispatch, statusId]);
|
||||
|
||||
const handleLoadMore = useCallback(() => {
|
||||
if (statusId && isCorrectStatusId && nextUrl)
|
||||
void dispatch(fetchQuotes({ statusId, next: nextUrl }));
|
||||
}, [dispatch, statusId, isCorrectStatusId, nextUrl]);
|
||||
|
||||
const handleRefresh = useCallback(() => {
|
||||
if (statusId) void dispatch(fetchQuotes({ statusId }));
|
||||
}, [dispatch, statusId]);
|
||||
|
||||
if (!statusIds || !isCorrectStatusId) {
|
||||
return (
|
||||
<Column>
|
||||
<LoadingIndicator />
|
||||
</Column>
|
||||
);
|
||||
}
|
||||
|
||||
const emptyMessage = (
|
||||
<FormattedMessage
|
||||
id='status.quotes.empty'
|
||||
defaultMessage='No one has quoted this post yet. When someone does, it will show up here.'
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn}>
|
||||
<ColumnHeader
|
||||
showBackButton
|
||||
multiColumn={multiColumn}
|
||||
extraButton={
|
||||
<button
|
||||
type='button'
|
||||
className='column-header__button'
|
||||
title={intl.formatMessage(messages.refresh)}
|
||||
aria-label={intl.formatMessage(messages.refresh)}
|
||||
onClick={handleRefresh}
|
||||
>
|
||||
<Icon id='refresh' icon={RefreshIcon} />
|
||||
</button>
|
||||
}
|
||||
/>
|
||||
|
||||
<StatusList
|
||||
scrollKey='quotes_timeline'
|
||||
statusIds={statusIds}
|
||||
onLoadMore={handleLoadMore}
|
||||
hasMore={hasMore}
|
||||
isLoading={isLoading}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
/>
|
||||
|
||||
<Helmet>
|
||||
<meta name='robots' content='noindex' />
|
||||
</Helmet>
|
||||
</Column>
|
||||
);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line import/no-default-export
|
||||
export default Quotes;
|
|
@ -32,7 +32,7 @@ const Embed: React.FC<{ id: string }> = ({ id }) => {
|
|||
const dispatchRenderSignal = useRenderSignal();
|
||||
|
||||
useEffect(() => {
|
||||
dispatch(fetchStatus(id, false, false));
|
||||
dispatch(fetchStatus(id, { alsoFetchContext: false }));
|
||||
}, [dispatch, id]);
|
||||
|
||||
const handleToggleHidden = useCallback(() => {
|
||||
|
|
|
@ -3,23 +3,16 @@ import { PureComponent } from 'react';
|
|||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';
|
||||
import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';
|
||||
import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
|
||||
import StarIcon from '@/material-icons/400-24px/star-fill.svg?react';
|
||||
import StarBorderIcon from '@/material-icons/400-24px/star.svg?react';
|
||||
import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
|
||||
import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
|
||||
import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
|
||||
import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
|
||||
|
||||
|
@ -27,6 +20,7 @@ import { IconButton } from '../../../components/icon_button';
|
|||
import { Dropdown } from 'mastodon/components/dropdown_menu';
|
||||
import { me } from '../../../initial_state';
|
||||
import { isFeatureEnabled } from '@/mastodon/utils/environment';
|
||||
import { ReblogButton } from '@/mastodon/components/status/reblog_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
@ -35,10 +29,6 @@ const messages = defineMessages({
|
|||
direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
|
||||
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
|
||||
reply: { id: 'status.reply', defaultMessage: 'Reply' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },
|
||||
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
|
||||
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
|
||||
removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
|
||||
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
|
||||
|
@ -313,31 +303,15 @@ class ActionBar extends PureComponent {
|
|||
replyIconComponent = ReplyAllIcon;
|
||||
}
|
||||
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle, reblogIconComponent;
|
||||
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
reblogIconComponent = RepeatIcon;
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
reblogIconComponent = RepeatPrivateIcon;
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
reblogIconComponent = RepeatDisabledIcon;
|
||||
}
|
||||
|
||||
const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
|
||||
const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
|
||||
|
||||
return (
|
||||
<div className='detailed-status__action-bar'>
|
||||
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} iconComponent={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} /></div>
|
||||
<div className='detailed-status__button'>
|
||||
<ReblogButton status={status} />
|
||||
</div>
|
||||
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={favouriteTitle} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={bookmarkTitle} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} /></div>
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import { VisibilityIcon } from 'mastodon/components/visibility_icon';
|
|||
import { Audio } from 'mastodon/features/audio';
|
||||
import scheduleIdleTask from 'mastodon/features/ui/util/schedule_idle_task';
|
||||
import { Video } from 'mastodon/features/video';
|
||||
import { me } from 'mastodon/initial_state';
|
||||
|
||||
import Card from './card';
|
||||
|
||||
|
@ -127,6 +128,7 @@ export const DetailedStatus: React.FC<{
|
|||
let media;
|
||||
let applicationLink;
|
||||
let reblogLink;
|
||||
let quotesLink;
|
||||
let attachmentAspectRatio;
|
||||
|
||||
if (properStatus.get('media_attachments').getIn([0, 'type']) === 'video') {
|
||||
|
@ -279,6 +281,39 @@ export const DetailedStatus: React.FC<{
|
|||
);
|
||||
}
|
||||
|
||||
if (['private', 'direct'].includes(status.get('visibility') as string)) {
|
||||
quotesLink = '';
|
||||
} else if (status.getIn(['account', 'id']) === me) {
|
||||
quotesLink = (
|
||||
<Link
|
||||
to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/quotes`}
|
||||
className='detailed-status__link'
|
||||
>
|
||||
<span className='detailed-status__quotes'>
|
||||
<AnimatedNumber value={status.get('quotes_count')} />
|
||||
</span>
|
||||
<FormattedMessage
|
||||
id='status.quotes'
|
||||
defaultMessage='{count, plural, one {quote} other {quotes}}'
|
||||
values={{ count: status.get('quotes_count') }}
|
||||
/>
|
||||
</Link>
|
||||
);
|
||||
} else {
|
||||
quotesLink = (
|
||||
<span className='detailed-status__link'>
|
||||
<span className='detailed-status__quotes'>
|
||||
<AnimatedNumber value={status.get('quotes_count')} />
|
||||
</span>
|
||||
<FormattedMessage
|
||||
id='status.quotes'
|
||||
defaultMessage='{count, plural, one {quote} other {quotes}}'
|
||||
values={{ count: status.get('quotes_count') }}
|
||||
/>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
const favouriteLink = (
|
||||
<Link
|
||||
to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`}
|
||||
|
@ -381,7 +416,10 @@ export const DetailedStatus: React.FC<{
|
|||
{hashtagBar}
|
||||
|
||||
{status.get('quote') && (
|
||||
<QuotedStatus quote={status.get('quote')} />
|
||||
<QuotedStatus
|
||||
quote={status.get('quote')}
|
||||
parentQuotePostId={status.get('id')}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
|
@ -420,6 +458,8 @@ export const DetailedStatus: React.FC<{
|
|||
<div className='detailed-status__meta__line'>
|
||||
{reblogLink}
|
||||
{reblogLink && <>·</>}
|
||||
{quotesLink}
|
||||
{quotesLink && <>·</>}
|
||||
{favouriteLink}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { Helmet } from 'react-helmet';
|
||||
|
@ -15,7 +15,6 @@ import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?reac
|
|||
import { Hotkeys } from 'mastodon/components/hotkeys';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import { TimelineHint } from 'mastodon/components/timeline_hint';
|
||||
import ScrollContainer from 'mastodon/containers/scroll_container';
|
||||
import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
|
@ -57,6 +56,7 @@ import {
|
|||
translateStatus,
|
||||
undoStatusTranslation,
|
||||
} from '../../actions/statuses';
|
||||
import { setStatusQuotePolicy } from '../../actions/statuses_typed';
|
||||
import ColumnHeader from '../../components/column_header';
|
||||
import { textForScreenReader, defaultMediaVisibility } from '../../components/status';
|
||||
import { StatusQuoteManager } from '../../components/status_quoted';
|
||||
|
@ -69,6 +69,7 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from
|
|||
import ActionBar from './components/action_bar';
|
||||
import { DetailedStatus } from './components/detailed_status';
|
||||
import { RefreshController } from './components/refresh_controller';
|
||||
import { quoteComposeById } from '@/mastodon/actions/compose_typed';
|
||||
|
||||
const messages = defineMessages({
|
||||
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
|
||||
|
@ -250,12 +251,31 @@ class Status extends ImmutablePureComponent {
|
|||
};
|
||||
|
||||
handleDeleteClick = (status, withRedraft = false) => {
|
||||
const { dispatch } = this.props;
|
||||
const { dispatch, history } = this.props;
|
||||
|
||||
const handleDeleteSuccess = () => {
|
||||
history.push('/');
|
||||
};
|
||||
|
||||
if (!deleteModal) {
|
||||
dispatch(deleteStatus(status.get('id'), withRedraft));
|
||||
dispatch(deleteStatus(status.get('id'), withRedraft))
|
||||
.then(() => {
|
||||
if (!withRedraft) {
|
||||
handleDeleteSuccess();
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// Error handling - could show error message
|
||||
});
|
||||
} else {
|
||||
dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
|
||||
dispatch(openModal({
|
||||
modalType: 'CONFIRM_DELETE_STATUS',
|
||||
modalProps: {
|
||||
statusId: status.get('id'),
|
||||
withRedraft,
|
||||
onDeleteSuccess: handleDeleteSuccess
|
||||
}
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -266,8 +286,14 @@ class Status extends ImmutablePureComponent {
|
|||
};
|
||||
|
||||
handleQuotePolicyChange = (status) => {
|
||||
const statusId = status.get('id');
|
||||
const { dispatch } = this.props;
|
||||
dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId: status.get('id') } }));
|
||||
const handleChange = (_, quotePolicy) => {
|
||||
dispatch(
|
||||
setStatusQuotePolicy({ policy: quotePolicy, statusId }),
|
||||
);
|
||||
}
|
||||
dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId, onChange: handleChange } }));
|
||||
};
|
||||
|
||||
handleEditClick = (status) => {
|
||||
|
@ -390,15 +416,6 @@ class Status extends ImmutablePureComponent {
|
|||
this.props.dispatch(unblockDomain(domain));
|
||||
};
|
||||
|
||||
|
||||
handleHotkeyMoveUp = () => {
|
||||
this.handleMoveUp(this.props.status.get('id'));
|
||||
};
|
||||
|
||||
handleHotkeyMoveDown = () => {
|
||||
this.handleMoveDown(this.props.status.get('id'));
|
||||
};
|
||||
|
||||
handleHotkeyReply = e => {
|
||||
e.preventDefault();
|
||||
this.handleReplyClick(this.props.status);
|
||||
|
@ -412,6 +429,10 @@ class Status extends ImmutablePureComponent {
|
|||
this.handleReblogClick(this.props.status);
|
||||
};
|
||||
|
||||
handleHotkeyQuote = () => {
|
||||
this.props.dispatch(quoteComposeById(this.props.status.get('id')));
|
||||
};
|
||||
|
||||
handleHotkeyMention = e => {
|
||||
e.preventDefault();
|
||||
this.handleMentionClick(this.props.status.get('account'));
|
||||
|
@ -433,54 +454,6 @@ class Status extends ImmutablePureComponent {
|
|||
this.handleTranslate(this.props.status);
|
||||
};
|
||||
|
||||
handleMoveUp = id => {
|
||||
const { status, ancestorsIds, descendantsIds } = this.props;
|
||||
|
||||
if (id === status.get('id')) {
|
||||
this._selectChild(ancestorsIds.length - 1, true);
|
||||
} else {
|
||||
let index = ancestorsIds.indexOf(id);
|
||||
|
||||
if (index === -1) {
|
||||
index = descendantsIds.indexOf(id);
|
||||
this._selectChild(ancestorsIds.length + index, true);
|
||||
} else {
|
||||
this._selectChild(index - 1, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
handleMoveDown = id => {
|
||||
const { status, ancestorsIds, descendantsIds } = this.props;
|
||||
|
||||
if (id === status.get('id')) {
|
||||
this._selectChild(ancestorsIds.length + 1, false);
|
||||
} else {
|
||||
let index = ancestorsIds.indexOf(id);
|
||||
|
||||
if (index === -1) {
|
||||
index = descendantsIds.indexOf(id);
|
||||
this._selectChild(ancestorsIds.length + index + 2, false);
|
||||
} else {
|
||||
this._selectChild(index + 1, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_selectChild (index, align_top) {
|
||||
const container = this.node;
|
||||
const element = container.querySelectorAll('.focusable')[index];
|
||||
|
||||
if (element) {
|
||||
if (align_top && container.scrollTop > element.offsetTop) {
|
||||
element.scrollIntoView(true);
|
||||
} else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {
|
||||
element.scrollIntoView(false);
|
||||
}
|
||||
element.focus();
|
||||
}
|
||||
}
|
||||
|
||||
renderChildren (list, ancestors) {
|
||||
const { params: { statusId } } = this.props;
|
||||
|
||||
|
@ -488,8 +461,6 @@ class Status extends ImmutablePureComponent {
|
|||
<StatusQuoteManager
|
||||
key={id}
|
||||
id={id}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType='thread'
|
||||
previousId={i > 0 ? list[i - 1] : undefined}
|
||||
nextId={list[i + 1] || (ancestors && statusId)}
|
||||
|
@ -596,11 +567,10 @@ class Status extends ImmutablePureComponent {
|
|||
}
|
||||
|
||||
const handlers = {
|
||||
moveUp: this.handleHotkeyMoveUp,
|
||||
moveDown: this.handleHotkeyMoveDown,
|
||||
reply: this.handleHotkeyReply,
|
||||
favourite: this.handleHotkeyFavourite,
|
||||
boost: this.handleHotkeyBoost,
|
||||
quote: this.handleHotkeyQuote,
|
||||
mention: this.handleHotkeyMention,
|
||||
openProfile: this.handleHotkeyOpenProfile,
|
||||
toggleHidden: this.handleHotkeyToggleHidden,
|
||||
|
@ -620,7 +590,7 @@ class Status extends ImmutablePureComponent {
|
|||
/>
|
||||
|
||||
<ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>
|
||||
<div className={classNames('scrollable', { fullscreen })} ref={this.setContainerRef}>
|
||||
<div className={classNames('scrollable item-list', { fullscreen })} ref={this.setContainerRef}>
|
||||
{ancestors}
|
||||
|
||||
<Hotkeys handlers={handlers}>
|
||||
|
|
|
@ -40,14 +40,23 @@ export const ConfirmDeleteStatusModal: React.FC<
|
|||
{
|
||||
statusId: string;
|
||||
withRedraft: boolean;
|
||||
onDeleteSuccess?: () => void;
|
||||
} & BaseConfirmationModalProps
|
||||
> = ({ statusId, withRedraft, onClose }) => {
|
||||
> = ({ statusId, withRedraft, onClose, onDeleteSuccess }) => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const onConfirm = useCallback(() => {
|
||||
dispatch(deleteStatus(statusId, withRedraft));
|
||||
}, [dispatch, statusId, withRedraft]);
|
||||
void dispatch(deleteStatus(statusId, withRedraft))
|
||||
.then(() => {
|
||||
onDeleteSuccess?.();
|
||||
onClose();
|
||||
})
|
||||
.catch(() => {
|
||||
// Error handling - still close modal
|
||||
onClose();
|
||||
});
|
||||
}, [dispatch, statusId, withRedraft, onDeleteSuccess, onClose]);
|
||||
|
||||
return (
|
||||
<ConfirmationModal
|
||||
|
|
|
@ -38,7 +38,7 @@ class FilterModal extends ImmutablePureComponent {
|
|||
|
||||
handleSuccess = () => {
|
||||
const { dispatch, statusId } = this.props;
|
||||
dispatch(fetchStatus(statusId, true));
|
||||
dispatch(fetchStatus(statusId, {forceFetch: true}));
|
||||
this.setState({ isSubmitting: false, isSubmitted: true, step: 'submitted' });
|
||||
};
|
||||
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
import { forwardRef, useCallback, useId, useMemo } from 'react';
|
||||
import { forwardRef, useCallback, useId, useMemo, useState } from 'react';
|
||||
import type { FC } from 'react';
|
||||
|
||||
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import { changeComposeVisibility } from '@/mastodon/actions/compose';
|
||||
import { setStatusQuotePolicy } from '@/mastodon/actions/statuses_typed';
|
||||
import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes';
|
||||
import { isQuotePolicy } from '@/mastodon/api_types/quotes';
|
||||
import { isStatusVisibility } from '@/mastodon/api_types/statuses';
|
||||
import type { StatusVisibility } from '@/mastodon/api_types/statuses';
|
||||
import { Button } from '@/mastodon/components/button';
|
||||
import { Dropdown } from '@/mastodon/components/dropdown';
|
||||
import type { SelectItem } from '@/mastodon/components/dropdown_selector';
|
||||
import { IconButton } from '@/mastodon/components/icon_button';
|
||||
import { messages as privacyMessages } from '@/mastodon/features/compose/components/privacy_dropdown';
|
||||
import {
|
||||
createAppSelector,
|
||||
useAppDispatch,
|
||||
useAppSelector,
|
||||
} from '@/mastodon/store';
|
||||
import { createAppSelector, useAppSelector } from '@/mastodon/store';
|
||||
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
||||
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
|
||||
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
|
||||
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
||||
import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react';
|
||||
|
||||
import type { BaseConfirmationModalProps } from './confirmation_modals/confirmation_modal';
|
||||
|
||||
|
@ -39,17 +39,30 @@ const messages = defineMessages({
|
|||
},
|
||||
quoteNobody: {
|
||||
id: 'visibility_modal.quote_nobody',
|
||||
defaultMessage: 'No one',
|
||||
defaultMessage: 'Just me',
|
||||
},
|
||||
});
|
||||
|
||||
export type VisibilityModalCallback = (
|
||||
visibility: StatusVisibility,
|
||||
quotePolicy: ApiQuotePolicy,
|
||||
) => void;
|
||||
|
||||
interface VisibilityModalProps extends BaseConfirmationModalProps {
|
||||
statusId: string;
|
||||
statusId?: string;
|
||||
onChange: VisibilityModalCallback;
|
||||
}
|
||||
|
||||
const selectStatusPolicy = createAppSelector(
|
||||
[(state) => state.statuses, (_state, statusId: string) => statusId],
|
||||
(statuses, statusId) => {
|
||||
[
|
||||
(state) => state.statuses,
|
||||
(_state, statusId?: string) => statusId,
|
||||
(state) => state.compose.get('quote_policy') as ApiQuotePolicy,
|
||||
],
|
||||
(statuses, statusId, composeQuotePolicy) => {
|
||||
if (!statusId) {
|
||||
return composeQuotePolicy;
|
||||
}
|
||||
const status = statuses.get(statusId);
|
||||
if (!status) {
|
||||
return 'public';
|
||||
|
@ -78,23 +91,25 @@ const selectStatusPolicy = createAppSelector(
|
|||
|
||||
export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
({ onClose, statusId }, ref) => {
|
||||
({ onClose, onChange, statusId }, _ref) => {
|
||||
const intl = useIntl();
|
||||
const currentVisibility = useAppSelector(
|
||||
(state) =>
|
||||
(state.statuses.getIn([statusId, 'visibility'], 'public') as
|
||||
| StatusVisibility
|
||||
| undefined) ?? 'public',
|
||||
const currentVisibility = useAppSelector((state) =>
|
||||
statusId
|
||||
? ((state.statuses.getIn([statusId, 'visibility'], 'public') as
|
||||
| StatusVisibility
|
||||
| undefined) ?? 'public')
|
||||
: (state.compose.get('privacy') as StatusVisibility),
|
||||
);
|
||||
const currentQuotePolicy = useAppSelector((state) =>
|
||||
selectStatusPolicy(state, statusId),
|
||||
);
|
||||
|
||||
const [visibility, setVisibility] = useState(currentVisibility);
|
||||
const [quotePolicy, setQuotePolicy] = useState(currentQuotePolicy);
|
||||
|
||||
const disableVisibility = !!statusId;
|
||||
const disableQuotePolicy =
|
||||
currentVisibility === 'private' || currentVisibility === 'direct';
|
||||
const isSaving = useAppSelector(
|
||||
(state) =>
|
||||
state.statuses.getIn([statusId, 'isSavingQuotePolicy']) === true,
|
||||
);
|
||||
visibility === 'private' || visibility === 'direct';
|
||||
|
||||
const visibilityItems = useMemo<SelectItem<StatusVisibility>[]>(
|
||||
() => [
|
||||
|
@ -102,21 +117,30 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
value: 'public',
|
||||
text: intl.formatMessage(privacyMessages.public_short),
|
||||
meta: intl.formatMessage(privacyMessages.public_long),
|
||||
icon: 'globe',
|
||||
iconComponent: PublicIcon,
|
||||
},
|
||||
{
|
||||
value: 'unlisted',
|
||||
text: intl.formatMessage(privacyMessages.unlisted_short),
|
||||
meta: intl.formatMessage(privacyMessages.unlisted_long),
|
||||
extra: intl.formatMessage(privacyMessages.unlisted_extra),
|
||||
icon: 'unlock',
|
||||
iconComponent: QuietTimeIcon,
|
||||
},
|
||||
{
|
||||
value: 'private',
|
||||
text: intl.formatMessage(privacyMessages.private_short),
|
||||
meta: intl.formatMessage(privacyMessages.private_long),
|
||||
icon: 'lock',
|
||||
iconComponent: LockIcon,
|
||||
},
|
||||
{
|
||||
value: 'direct',
|
||||
text: intl.formatMessage(privacyMessages.direct_short),
|
||||
meta: intl.formatMessage(privacyMessages.direct_long),
|
||||
icon: 'at',
|
||||
iconComponent: AlternateEmailIcon,
|
||||
},
|
||||
],
|
||||
[intl],
|
||||
|
@ -133,25 +157,20 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
[intl],
|
||||
);
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
const handleVisibilityChange = useCallback(
|
||||
(value: string) => {
|
||||
// Published statuses cannot change visibility.
|
||||
if (statusId) {
|
||||
return;
|
||||
}
|
||||
dispatch(changeComposeVisibility(value));
|
||||
},
|
||||
[dispatch, statusId],
|
||||
);
|
||||
const handleQuotePolicyChange = useCallback(
|
||||
(value: string) => {
|
||||
if (isQuotePolicy(value) && !disableQuotePolicy) {
|
||||
void dispatch(setStatusQuotePolicy({ policy: value, statusId }));
|
||||
}
|
||||
},
|
||||
[disableQuotePolicy, dispatch, statusId],
|
||||
);
|
||||
const handleVisibilityChange = useCallback((value: string) => {
|
||||
if (isStatusVisibility(value)) {
|
||||
setVisibility(value);
|
||||
}
|
||||
}, []);
|
||||
const handleQuotePolicyChange = useCallback((value: string) => {
|
||||
if (isQuotePolicy(value)) {
|
||||
setQuotePolicy(value);
|
||||
}
|
||||
}, []);
|
||||
const handleSave = useCallback(() => {
|
||||
onChange(visibility, quotePolicy);
|
||||
onClose();
|
||||
}, [onChange, onClose, visibility, quotePolicy]);
|
||||
|
||||
const privacyDropdownId = useId();
|
||||
const quoteDropdownId = useId();
|
||||
|
@ -192,7 +211,7 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
<label
|
||||
htmlFor={privacyDropdownId}
|
||||
className={classNames('visibility-dropdown__label', {
|
||||
disabled: isSaving || !!statusId,
|
||||
disabled: disableVisibility,
|
||||
})}
|
||||
>
|
||||
<FormattedMessage
|
||||
|
@ -203,10 +222,10 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
<Dropdown
|
||||
items={visibilityItems}
|
||||
classPrefix='visibility-dropdown'
|
||||
current={currentVisibility}
|
||||
current={visibility}
|
||||
onChange={handleVisibilityChange}
|
||||
title={intl.formatMessage(privacyMessages.change_privacy)}
|
||||
disabled={isSaving || !!statusId}
|
||||
disabled={disableVisibility}
|
||||
id={privacyDropdownId}
|
||||
/>
|
||||
{!!statusId && (
|
||||
|
@ -222,7 +241,7 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
<label
|
||||
htmlFor={quoteDropdownId}
|
||||
className={classNames('visibility-dropdown__label', {
|
||||
disabled: disableQuotePolicy || isSaving,
|
||||
disabled: disableQuotePolicy,
|
||||
})}
|
||||
>
|
||||
<FormattedMessage
|
||||
|
@ -234,17 +253,28 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
|
|||
items={quoteItems}
|
||||
onChange={handleQuotePolicyChange}
|
||||
classPrefix='visibility-dropdown'
|
||||
current={currentQuotePolicy}
|
||||
current={disableQuotePolicy ? 'nobody' : quotePolicy}
|
||||
title={intl.formatMessage(messages.buttonTitle)}
|
||||
disabled={disableQuotePolicy || isSaving}
|
||||
disabled={disableQuotePolicy}
|
||||
id={quoteDropdownId}
|
||||
/>
|
||||
<QuotePolicyHelper
|
||||
policy={currentQuotePolicy}
|
||||
visibility={currentVisibility}
|
||||
/>
|
||||
<QuotePolicyHelper policy={quotePolicy} visibility={visibility} />
|
||||
</label>
|
||||
</div>
|
||||
<div className='dialog-modal__content__actions'>
|
||||
<Button onClick={onClose} secondary>
|
||||
<FormattedMessage
|
||||
id='confirmation_modal.cancel'
|
||||
defaultMessage='Cancel'
|
||||
/>
|
||||
</Button>
|
||||
<Button onClick={handleSave}>
|
||||
<FormattedMessage
|
||||
id='visibility_modal.save'
|
||||
defaultMessage='Save'
|
||||
/>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
@ -272,7 +302,7 @@ const QuotePolicyHelper: FC<{
|
|||
<p className='visibility-dropdown__helper'>
|
||||
<FormattedMessage
|
||||
id='visibility_modal.helper.private_quoting'
|
||||
defaultMessage="Follower-only posts can't be quoted."
|
||||
defaultMessage="Follower-only posts authored on Mastodon can't be quoted by others."
|
||||
/>
|
||||
</p>
|
||||
);
|
||||
|
@ -283,7 +313,7 @@ const QuotePolicyHelper: FC<{
|
|||
<p className='visibility-dropdown__helper'>
|
||||
<FormattedMessage
|
||||
id='visibility_modal.helper.direct_quoting'
|
||||
defaultMessage="Private mentions can't be quoted."
|
||||
defaultMessage="Private mentions authored on Mastodon can't be quoted by others."
|
||||
/>
|
||||
</p>
|
||||
);
|
||||
|
|
|
@ -75,8 +75,10 @@ import {
|
|||
PrivacyPolicy,
|
||||
TermsOfService,
|
||||
AccountFeatured,
|
||||
Quotes,
|
||||
} from './util/async-components';
|
||||
import { ColumnsContextProvider } from './util/columns_context';
|
||||
import { focusColumn, getFocusedItemIndex, focusItemSibling } from './util/focusUtils';
|
||||
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
|
||||
|
||||
// Dummy import, to make sure that <Status /> ends up in the application bundle.
|
||||
|
@ -208,6 +210,7 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
<WrappedRoute path='/@:acct/:statusId' exact component={Status} content={children} />
|
||||
<WrappedRoute path='/@:acct/:statusId/reblogs' component={Reblogs} content={children} />
|
||||
<WrappedRoute path='/@:acct/:statusId/favourites' component={Favourites} content={children} />
|
||||
<WrappedRoute path='/@:acct/:statusId/quotes' component={Quotes} content={children} />
|
||||
|
||||
{/* Legacy routes, cannot be easily factored with other routes because they share a param name */}
|
||||
<WrappedRoute path='/timelines/tag/:id' component={HashtagTimeline} content={children} />
|
||||
|
@ -446,20 +449,34 @@ class UI extends PureComponent {
|
|||
};
|
||||
|
||||
handleHotkeyFocusColumn = e => {
|
||||
const index = (e.key * 1) + 1; // First child is drawer, skip that
|
||||
const column = this.node.querySelector(`.column:nth-child(${index})`);
|
||||
if (!column) return;
|
||||
const container = column.querySelector('.scrollable');
|
||||
focusColumn({index: e.key * 1});
|
||||
};
|
||||
|
||||
if (container) {
|
||||
const status = container.querySelector('.focusable');
|
||||
handleHotkeyLoadMore = () => {
|
||||
document.querySelector('.load-more')?.focus();
|
||||
};
|
||||
|
||||
if (status) {
|
||||
if (container.scrollTop > status.offsetTop) {
|
||||
status.scrollIntoView(true);
|
||||
}
|
||||
status.focus();
|
||||
}
|
||||
handleMoveUp = () => {
|
||||
const currentItemIndex = getFocusedItemIndex();
|
||||
if (currentItemIndex === -1) {
|
||||
focusColumn({
|
||||
index: 1,
|
||||
focusItem: 'first-visible',
|
||||
});
|
||||
} else {
|
||||
focusItemSibling(currentItemIndex, -1);
|
||||
}
|
||||
};
|
||||
|
||||
handleMoveDown = () => {
|
||||
const currentItemIndex = getFocusedItemIndex();
|
||||
if (currentItemIndex === -1) {
|
||||
focusColumn({
|
||||
index: 1,
|
||||
focusItem: 'first-visible',
|
||||
});
|
||||
} else {
|
||||
focusItemSibling(currentItemIndex, 1);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -542,6 +559,9 @@ class UI extends PureComponent {
|
|||
forceNew: this.handleHotkeyForceNew,
|
||||
toggleComposeSpoilers: this.handleHotkeyToggleComposeSpoilers,
|
||||
focusColumn: this.handleHotkeyFocusColumn,
|
||||
focusLoadMore: this.handleHotkeyLoadMore,
|
||||
moveDown: this.handleMoveDown,
|
||||
moveUp: this.handleMoveUp,
|
||||
back: this.handleHotkeyBack,
|
||||
goToHome: this.handleHotkeyGoToHome,
|
||||
goToNotifications: this.handleHotkeyGoToNotifications,
|
||||
|
|
|
@ -86,6 +86,10 @@ export function Favourites () {
|
|||
return import('../../favourites');
|
||||
}
|
||||
|
||||
export function Quotes () {
|
||||
return import('../../quotes');
|
||||
}
|
||||
|
||||
export function FollowRequests () {
|
||||
return import('../../follow_requests');
|
||||
}
|
||||
|
|
132
app/javascript/mastodon/features/ui/util/focusUtils.ts
Normal file
132
app/javascript/mastodon/features/ui/util/focusUtils.ts
Normal file
|
@ -0,0 +1,132 @@
|
|||
import initialState from '@/mastodon/initial_state';
|
||||
|
||||
interface FocusColumnOptions {
|
||||
index?: number;
|
||||
focusItem?: 'first' | 'first-visible';
|
||||
}
|
||||
|
||||
/**
|
||||
* Move focus to the column of the passed index (1-based).
|
||||
* Can either focus the topmost item or the first one in the viewport
|
||||
*/
|
||||
export function focusColumn({
|
||||
index = 1,
|
||||
focusItem = 'first',
|
||||
}: FocusColumnOptions = {}) {
|
||||
// Skip the leftmost drawer in multi-column mode
|
||||
const indexOffset = initialState?.meta.advanced_layout ? 1 : 0;
|
||||
|
||||
const column = document.querySelector(
|
||||
`.column:nth-child(${index + indexOffset})`,
|
||||
);
|
||||
|
||||
if (!column) return;
|
||||
|
||||
const container = column.querySelector('.scrollable');
|
||||
|
||||
if (!container) return;
|
||||
|
||||
let itemToFocus: HTMLElement | null = null;
|
||||
|
||||
if (focusItem === 'first-visible') {
|
||||
const focusableItems = Array.from(
|
||||
container.querySelectorAll<HTMLElement>(
|
||||
'.focusable:not(.status__quote .focusable)',
|
||||
),
|
||||
);
|
||||
|
||||
const viewportHeight =
|
||||
window.innerHeight || document.documentElement.clientHeight;
|
||||
|
||||
// Find first item visible in the viewport
|
||||
itemToFocus =
|
||||
focusableItems.find((item) => {
|
||||
const { top } = item.getBoundingClientRect();
|
||||
return top >= 0 && top < viewportHeight;
|
||||
}) ?? null;
|
||||
} else {
|
||||
itemToFocus = container.querySelector('.focusable');
|
||||
}
|
||||
|
||||
if (itemToFocus) {
|
||||
if (container.scrollTop > itemToFocus.offsetTop) {
|
||||
itemToFocus.scrollIntoView(true);
|
||||
}
|
||||
itemToFocus.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the index of the currently focused item in one of our item lists
|
||||
*/
|
||||
export function getFocusedItemIndex() {
|
||||
const focusedElement = document.activeElement;
|
||||
const itemList = focusedElement?.closest('.item-list');
|
||||
|
||||
if (!focusedElement || !itemList) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
let focusedItem: HTMLElement | null = null;
|
||||
if (focusedElement.parentElement === itemList) {
|
||||
focusedItem = focusedElement as HTMLElement;
|
||||
} else {
|
||||
focusedItem = focusedElement.closest('.item-list > *');
|
||||
}
|
||||
|
||||
if (!focusedItem) return -1;
|
||||
|
||||
const items = Array.from(itemList.children);
|
||||
return items.indexOf(focusedItem);
|
||||
}
|
||||
|
||||
/**
|
||||
* Focus the item next to the one with the provided index
|
||||
*/
|
||||
export function focusItemSibling(
|
||||
index: number,
|
||||
direction: 1 | -1,
|
||||
scrollThreshold = 62,
|
||||
) {
|
||||
const focusedElement = document.activeElement;
|
||||
const itemList = focusedElement?.closest('.item-list');
|
||||
|
||||
const siblingItem = itemList?.querySelector<HTMLElement>(
|
||||
// :nth-child uses 1-based indexing
|
||||
`.item-list > :nth-child(${index + 1 + direction})`,
|
||||
);
|
||||
|
||||
if (!siblingItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If sibling element is empty, we skip it
|
||||
if (siblingItem.matches(':empty')) {
|
||||
focusItemSibling(index + direction, direction);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the sibling is a post or a 'follow suggestions' widget
|
||||
let targetElement = siblingItem.querySelector<HTMLElement>('.focusable');
|
||||
|
||||
// Otherwise, check if the item is a 'load more' button.
|
||||
if (!targetElement && siblingItem.matches('.load-more')) {
|
||||
targetElement = siblingItem;
|
||||
}
|
||||
|
||||
if (targetElement) {
|
||||
const elementRect = targetElement.getBoundingClientRect();
|
||||
|
||||
const isFullyVisible =
|
||||
elementRect.top >= scrollThreshold &&
|
||||
elementRect.bottom <= window.innerHeight;
|
||||
|
||||
if (!isFullyVisible) {
|
||||
targetElement.scrollIntoView({
|
||||
block: direction === 1 ? 'start' : 'center',
|
||||
});
|
||||
}
|
||||
|
||||
targetElement.focus();
|
||||
}
|
||||
}
|
|
@ -946,14 +946,11 @@
|
|||
"video.volume_up": "Həcmi artır",
|
||||
"visibility_modal.button_title": "Görünməni ayarla",
|
||||
"visibility_modal.header": "Görünmə və qarşılıqlı əlaqə",
|
||||
"visibility_modal.helper.direct_quoting": "Şəxsi adçəkmələr, sitat gətirilə bilməz.",
|
||||
"visibility_modal.helper.privacy_editing": "Dərc edilən göndərişlərin görünməsi dəyişdirilə bilməz.",
|
||||
"visibility_modal.helper.private_quoting": "Yalnız izləyicilərə xas göndərişlər, sitat gətirilə bilməz.",
|
||||
"visibility_modal.helper.unlisted_quoting": "İnsanlar sizdən sitat gətirdiyi zaman, onların göndərişləri də trend zaman xəttindən gizlədiləcək.",
|
||||
"visibility_modal.instructions": "Bu göndərişlə kimin əlaqə qura biləcəyini idarə edin. Qlobal ayarlar <link>Tərcihlər > Digər</link> bölməsinin altında tapıla bilər.",
|
||||
"visibility_modal.privacy_label": "Gizlilik",
|
||||
"visibility_modal.quote_followers": "Yalnız izləyicilər",
|
||||
"visibility_modal.quote_label": "Kimin sitat gətirə biləcəyini dəyişdir",
|
||||
"visibility_modal.quote_nobody": "Heç kim",
|
||||
"visibility_modal.quote_public": "Hər kəs"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Адкрыць хатнюю храналагічную стужку",
|
||||
"keyboard_shortcuts.hotkey": "Спалучэнне клавіш",
|
||||
"keyboard_shortcuts.legend": "Паказаць легенду",
|
||||
"keyboard_shortcuts.load_more": "Навесці на кнопку \"Загрузіць болей\"",
|
||||
"keyboard_shortcuts.local": "Адкрыць хатнюю храналагічную стужку",
|
||||
"keyboard_shortcuts.mention": "Згадаць аўтара",
|
||||
"keyboard_shortcuts.muted": "Адкрыць спіс ігнараваных карыстальнікаў",
|
||||
|
@ -619,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў заблакіраваны.",
|
||||
"notification.own_poll": "Ваша апытанне скончылася",
|
||||
"notification.poll": "Апытанне, дзе Вы прынялі ўдзел, скончылася",
|
||||
"notification.quoted_update": "{name} адрэдагаваў(-ла) допіс, які Вы цытавалі",
|
||||
"notification.reblog": "{name} пашырыў ваш допіс",
|
||||
"notification.reblog.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы} many {# іншых} other {# іншых}}</a> пашырылі ваш допіс",
|
||||
"notification.relationships_severance_event": "Страціў сувязь з {name}",
|
||||
|
@ -738,11 +740,18 @@
|
|||
"privacy.private.short": "Падпісчыкі",
|
||||
"privacy.public.long": "Усе, хто ёсць і каго няма ў Mastodon",
|
||||
"privacy.public.short": "Публічны",
|
||||
"privacy.quote.anyone": "{visibility}, усе могуць цытаваць",
|
||||
"privacy.quote.disabled": "{visibility}, цытаты адключаныя",
|
||||
"privacy.quote.limited": "{visibility}, абмежаваныя цытаты",
|
||||
"privacy.unlisted.additional": "Паводзіць сябе гэтак жа, як і публічны, за выключэннем таго, што допіс не будзе адлюстроўвацца ў жывой стужцы, хэштэгах, аглядзе або ў пошуку Mastodon, нават калі Вы ўключылі бачнасць у пошуку ў наладах.",
|
||||
"privacy.unlisted.long": "Менш фанфар ад алгарытмаў",
|
||||
"privacy.unlisted.short": "Ціхі публічны",
|
||||
"privacy_policy.last_updated": "Адноўлена {date}",
|
||||
"privacy_policy.title": "Палітыка канфідэнцыйнасці",
|
||||
"quote_error.poll": "Нельга цытаваць з апытаннямі.",
|
||||
"quote_error.quote": "За раз дазволена рабіць толькі адну цытату.",
|
||||
"quote_error.unauthorized": "Вы не ўвайшлі, каб цытаваць гэты допіс.",
|
||||
"quote_error.upload": "Нельга цытаваць з медыя далучэннямі.",
|
||||
"recommended": "Рэкамендаванае",
|
||||
"refresh": "Абнавiць",
|
||||
"regeneration_indicator.please_stand_by": "Пачакайце.",
|
||||
|
@ -836,22 +845,24 @@
|
|||
"search_results.see_all": "Праглядзець усе",
|
||||
"search_results.statuses": "Допісы",
|
||||
"search_results.title": "Шукаць \"{q}\"",
|
||||
"server_banner.about_active_users": "Людзі, якія карыстаюцца гэтым сервера на працягу апошніх 30 дзён (Штомесячна Актыўныя Карыстальнікі)",
|
||||
"server_banner.about_active_users": "Людзі, якія карысталіся гэтым серверам на працягу апошніх 30 дзён (штомесячна актыўныя карыстальнікі)",
|
||||
"server_banner.active_users": "актыўныя карыстальнікі",
|
||||
"server_banner.administered_by": "Адміністратар:",
|
||||
"server_banner.is_one_of_many": "{domain} - гэта адзін з многіх незалежных сервераў Mastodon, які Вы можаце выкарыстоўваць для ўдзелу ў федэральным сусвеце.",
|
||||
"server_banner.server_stats": "Статыстыка сервера:",
|
||||
"sign_in_banner.create_account": "Стварыць уліковы запіс",
|
||||
"sign_in_banner.follow_anyone": "Падпісвайцеся на каго захочаце ва ўсім федэральным сусвеце і глядзіце ўсё ў храналагічным парадку. Ніякіх алгарытмаў, рэкламы або клікбэйту.",
|
||||
"sign_in_banner.mastodon_is": "Mastodon - лепшы спосаб быць у курсе ўсяго, што адбываецца.",
|
||||
"sign_in_banner.mastodon_is": "Mastodon - найлепшы спосаб быць у курсе ўсяго, што адбываецца.",
|
||||
"sign_in_banner.sign_in": "Увайсці",
|
||||
"sign_in_banner.sso_redirect": "Уваход ці рэгістрацыя",
|
||||
"status.admin_account": "Адкрыць інтэрфейс мадэратара для @{name}",
|
||||
"status.admin_domain": "Адкрыць інтэрфейс мадэратара для {domain}",
|
||||
"status.admin_status": "Адкрыць гэты допіс у інтэрфейсе мадэрацыі",
|
||||
"status.all_disabled": "Пашырэнні і цытаванні адключаны",
|
||||
"status.block": "Заблакаваць @{name}",
|
||||
"status.bookmark": "Дадаць закладку",
|
||||
"status.cancel_reblog_private": "Прыбраць",
|
||||
"status.cannot_quote": "Аўтар допісу адключыў цытаванне",
|
||||
"status.cannot_reblog": "Гэты допіс нельга пашырыць",
|
||||
"status.context.load_new_replies": "Даступныя новыя адказы",
|
||||
"status.context.loading": "Правяраюцца новыя адказы",
|
||||
|
@ -880,13 +891,20 @@
|
|||
"status.mute_conversation": "Ігнараваць размову",
|
||||
"status.open": "Разгарнуць гэты допіс",
|
||||
"status.pin": "Замацаваць у профілі",
|
||||
"status.quote": "Цытаваць",
|
||||
"status.quote.cancel": "Адмяніць цытаванне",
|
||||
"status.quote_error.filtered": "Схавана адным з Вашых фільтраў",
|
||||
"status.quote_error.not_available": "Допіс недаступны",
|
||||
"status.quote_error.pending_approval": "Допіс чакае пацвярджэння",
|
||||
"status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.",
|
||||
"status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой",
|
||||
"status.quote_followers_only": "Толькі падпісчыкі могуць цытаваць гэты допіс",
|
||||
"status.quote_manual_review": "Аўтар зробіць агляд уручную",
|
||||
"status.quote_policy_change": "Змяніць, хто можа цытаваць",
|
||||
"status.quote_post_author": "Цытаваў допіс @{name}",
|
||||
"status.quote_private": "Прыватныя допісы нельга цытаваць",
|
||||
"status.quotes": "{count, plural,one {цытата} few {цытаты} other {цытат}}",
|
||||
"status.quotes.empty": "Яшчэ ніхто не цытаваў гэты допіс. Калі гэта адбудзецца, то Вы пабачыце гэта тут.",
|
||||
"status.read_more": "Чытаць болей",
|
||||
"status.reblog": "Пашырыць",
|
||||
"status.reblog_private": "Пашырыць з першапачатковай бачнасцю",
|
||||
|
@ -901,6 +919,7 @@
|
|||
"status.reply": "Адказаць",
|
||||
"status.replyAll": "Адказаць у ланцугу",
|
||||
"status.report": "Паскардзіцца на @{name}",
|
||||
"status.request_quote": "Даслаць запыт на цытаванне",
|
||||
"status.revoke_quote": "Выдаліць мой допіс з допісу @{name}",
|
||||
"status.sensitive_warning": "Уражвальны змест",
|
||||
"status.share": "Абагуліць",
|
||||
|
@ -939,6 +958,7 @@
|
|||
"upload_button.label": "Дадаць выяву, відэа- ці аўдыяфайл",
|
||||
"upload_error.limit": "Перавышана колькасць файлаў.",
|
||||
"upload_error.poll": "Немагчыма прымацаваць файл да апытання.",
|
||||
"upload_error.quote": "Нельга запампоўваць файл пры цытаванні.",
|
||||
"upload_form.drag_and_drop.instructions": "Каб абраць медыя ўлажэнне, націсніце прабел ці Enter. Падчас перасоўвання выкарыстоўвайце кнопкі са стрэлкамі, каб пасунуць медыя далучэнне ў любым напрамку. Націсніце прабел ці Enter зноў, каб перасунуць медыя далучэнне ў новае месца, або Escape для адмены.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Перасоўванне адмененае. Медыя ўлажэнне {item} на месцы.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Медыя ўлажэнне {item} на месцы.",
|
||||
|
@ -964,14 +984,15 @@
|
|||
"video.volume_up": "Павялічыць гучнасць",
|
||||
"visibility_modal.button_title": "Вызначыць бачнасць",
|
||||
"visibility_modal.header": "Бачнасць і ўзаемадзеянне",
|
||||
"visibility_modal.helper.direct_quoting": "Прыватныя згадванні нельга цытаваць.",
|
||||
"visibility_modal.helper.direct_quoting": "Прыватныя згадванні, створаныя на Mastodon, нельга цытаваць іншым людзям.",
|
||||
"visibility_modal.helper.privacy_editing": "Апублікаваным допісам нельга змяняць бачнасць.",
|
||||
"visibility_modal.helper.private_quoting": "Допісы для падпісчыкаў нельга цытаваць.",
|
||||
"visibility_modal.helper.private_quoting": "Допісы для падпісчыкаў, створаныя на Mastodon, нельга цытаваць іншым людзям.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Калі людзі працытуюць Вас, іх допіс таксама будзе схаваны ад стужкі трэндаў.",
|
||||
"visibility_modal.instructions": "Кантралюйце, хто можа ўзаемадзейнічаць з Вашым допісам. Глабальныя налады можна знайсці ў <link>Налады > Іншае</link>.",
|
||||
"visibility_modal.privacy_label": "Прыватнасць",
|
||||
"visibility_modal.quote_followers": "Толькі падпісчыкі",
|
||||
"visibility_modal.quote_label": "Змяніць, хто можа цытаваць",
|
||||
"visibility_modal.quote_nobody": "Ніхто",
|
||||
"visibility_modal.quote_public": "Усе"
|
||||
"visibility_modal.quote_nobody": "Толькі я",
|
||||
"visibility_modal.quote_public": "Усе",
|
||||
"visibility_modal.save": "Захаваць"
|
||||
}
|
||||
|
|
|
@ -952,12 +952,10 @@
|
|||
"video.volume_up": "Увеличаване на звука",
|
||||
"visibility_modal.button_title": "Задаване на видимост",
|
||||
"visibility_modal.header": "Видимост и взаимодействие",
|
||||
"visibility_modal.helper.direct_quoting": "Частни споменавания не може да се цитират.",
|
||||
"visibility_modal.helper.privacy_editing": "Публикуваните публикации не може да променят видимостта си.",
|
||||
"visibility_modal.instructions": "Управлявайте кой може да взаимодейства с тази публикация. Глобалните настройки може да се намерят под <link>Предпочитания> Друго</link>.",
|
||||
"visibility_modal.privacy_label": "Поверителност",
|
||||
"visibility_modal.quote_followers": "Само последователи",
|
||||
"visibility_modal.quote_label": "Промяна кой може да цитира",
|
||||
"visibility_modal.quote_nobody": "Никого",
|
||||
"visibility_modal.quote_public": "Някой"
|
||||
}
|
||||
|
|
|
@ -640,6 +640,5 @@
|
|||
"video.play": "Lenn",
|
||||
"visibility_modal.privacy_label": "Prevezded",
|
||||
"visibility_modal.quote_followers": "Tud koumanantet hepken",
|
||||
"visibility_modal.quote_nobody": "Den ebet",
|
||||
"visibility_modal.quote_public": "Pep den"
|
||||
}
|
||||
|
|
|
@ -848,9 +848,11 @@
|
|||
"status.admin_account": "Obre la interfície de moderació per a @{name}",
|
||||
"status.admin_domain": "Obre la interfície de moderació per a @{domain}",
|
||||
"status.admin_status": "Obre aquest tut a la interfície de moderació",
|
||||
"status.all_disabled": "S'han deshabilitat impulsos i cites",
|
||||
"status.block": "Bloca @{name}",
|
||||
"status.bookmark": "Marca",
|
||||
"status.cancel_reblog_private": "Desfés l'impuls",
|
||||
"status.cannot_quote": "L'autor no permet que se citi aquesta publicació",
|
||||
"status.cannot_reblog": "No es pot impulsar aquest tut",
|
||||
"status.context.load_new_replies": "Hi ha respostes noves",
|
||||
"status.context.loading": "Comprovació de més respostes",
|
||||
|
@ -879,6 +881,7 @@
|
|||
"status.mute_conversation": "Silencia la conversa",
|
||||
"status.open": "Amplia el tut",
|
||||
"status.pin": "Fixa en el perfil",
|
||||
"status.quote": "Cita",
|
||||
"status.quote.cancel": "Canceŀlar la citació",
|
||||
"status.quote_error.filtered": "No es mostra a causa d'un dels vostres filtres",
|
||||
"status.quote_error.not_available": "Publicació no disponible",
|
||||
|
@ -887,6 +890,7 @@
|
|||
"status.quote_error.pending_approval_popout.title": "Publicació pendent? Mantinguem la calma",
|
||||
"status.quote_policy_change": "Canvieu qui us pot citar",
|
||||
"status.quote_post_author": "S'ha citat una publicació de @{name}",
|
||||
"status.quote_private": "No es poden citar les publicacions privades",
|
||||
"status.read_more": "Més informació",
|
||||
"status.reblog": "Impulsa",
|
||||
"status.reblog_private": "Impulsa amb la visibilitat original",
|
||||
|
@ -964,14 +968,12 @@
|
|||
"video.volume_up": "Apuja el volum",
|
||||
"visibility_modal.button_title": "Establiu la visibilitat",
|
||||
"visibility_modal.header": "Visibilitat i interacció",
|
||||
"visibility_modal.helper.direct_quoting": "No es poden citar les mencions privades.",
|
||||
"visibility_modal.helper.privacy_editing": "No es pot canviar la visibilitat de les publicacions ja fetes.",
|
||||
"visibility_modal.helper.private_quoting": "No es poden citar les publicacions només per a seguidors.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quan la gent et citi les seves publicacions estaran amagades de les línies de temps de tendències.",
|
||||
"visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. La configuració global es troba a <link>Preferències>Altres</link>.",
|
||||
"visibility_modal.privacy_label": "Privacitat",
|
||||
"visibility_modal.quote_followers": "Només seguidors",
|
||||
"visibility_modal.quote_label": "Canvieu qui us pot citar",
|
||||
"visibility_modal.quote_nobody": "Ningú",
|
||||
"visibility_modal.quote_public": "Qualsevol"
|
||||
"visibility_modal.quote_public": "Qualsevol",
|
||||
"visibility_modal.save": "Desa"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Otevřít domovskou časovou osu",
|
||||
"keyboard_shortcuts.hotkey": "Klávesová zkratka",
|
||||
"keyboard_shortcuts.legend": "Zobrazit tuto legendu",
|
||||
"keyboard_shortcuts.load_more": "Zvýraznit tlačítko „Načíst více“",
|
||||
"keyboard_shortcuts.local": "Otevřít místní časovou osu",
|
||||
"keyboard_shortcuts.mention": "Zmínit autora",
|
||||
"keyboard_shortcuts.muted": "Otevřít seznam skrytých uživatelů",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Otevřít média",
|
||||
"keyboard_shortcuts.pinned": "Otevřít seznam připnutých příspěvků",
|
||||
"keyboard_shortcuts.profile": "Otevřít autorův profil",
|
||||
"keyboard_shortcuts.quote": "Citovat příspěvek",
|
||||
"keyboard_shortcuts.reply": "Odpovědět na příspěvek",
|
||||
"keyboard_shortcuts.requests": "Otevřít seznam žádostí o sledování",
|
||||
"keyboard_shortcuts.search": "Zaměřit se na vyhledávací lištu",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Váš účet byl pozastaven.",
|
||||
"notification.own_poll": "Vaše anketa skončila",
|
||||
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
|
||||
"notification.quoted_update": "{name} upravili příspěvek, který jste citovali",
|
||||
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
|
||||
"notification.reblog.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> boostnul} few {<a># další</a> boostnuli} other {<a># dalších</a> boostnulo}} Váš příspěvek",
|
||||
"notification.relationships_severance_event": "Kontakt ztracen s {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Sledující",
|
||||
"privacy.public.long": "Kdokoliv na Mastodonu i mimo něj",
|
||||
"privacy.public.short": "Veřejné",
|
||||
"privacy.quote.anyone": "{visibility}, kdokoliv může citovat",
|
||||
"privacy.quote.disabled": "{visibility}, citování je zakázáno",
|
||||
"privacy.quote.limited": "{visibility}, citování je omezené",
|
||||
"privacy.unlisted.additional": "Chová se stejně jako veřejný, až na to, že se příspěvek neobjeví v živých kanálech nebo hashtazích, v objevování nebo vyhledávání na Mastodonu, a to i když je účet nastaven tak, aby se zde všude tyto příspěvky zobrazovaly.",
|
||||
"privacy.unlisted.long": "Méně algoritmických fanfár",
|
||||
"privacy.unlisted.short": "Ztišené veřejné",
|
||||
"privacy_policy.last_updated": "Naposledy aktualizováno {date}",
|
||||
"privacy_policy.title": "Zásady ochrany osobních údajů",
|
||||
"quote_error.poll": "Citování není u dotazníků povoleno.",
|
||||
"quote_error.quote": "Je povoleno citovat pouze jednou.",
|
||||
"quote_error.unauthorized": "Nemáte oprávnění citovat tento příspěvek.",
|
||||
"quote_error.upload": "Není povoleno citovat s přílohami.",
|
||||
"recommended": "Doporučeno",
|
||||
"refresh": "Obnovit",
|
||||
"regeneration_indicator.please_stand_by": "Počkej prosím.",
|
||||
|
@ -849,9 +859,11 @@
|
|||
"status.admin_account": "Otevřít moderátorské rozhraní pro @{name}",
|
||||
"status.admin_domain": "Otevřít moderátorské rozhraní pro {domain}",
|
||||
"status.admin_status": "Otevřít tento příspěvek v moderátorském rozhraní",
|
||||
"status.all_disabled": "Boosty a citace jsou zakázány",
|
||||
"status.block": "Blokovat @{name}",
|
||||
"status.bookmark": "Přidat do záložek",
|
||||
"status.cancel_reblog_private": "Zrušit boostnutí",
|
||||
"status.cannot_quote": "Autor zakázal citování tohoto příspěvku",
|
||||
"status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
|
||||
"status.context.load_new_replies": "K dispozici jsou nové odpovědi",
|
||||
"status.context.loading": "Hledání dalších odpovědí",
|
||||
|
@ -880,15 +892,23 @@
|
|||
"status.mute_conversation": "Skrýt konverzaci",
|
||||
"status.open": "Rozbalit tento příspěvek",
|
||||
"status.pin": "Připnout na profil",
|
||||
"status.quote": "Citovat",
|
||||
"status.quote.cancel": "Zrušit citování",
|
||||
"status.quote_error.filtered": "Skryté kvůli jednomu z vašich filtrů",
|
||||
"status.quote_error.not_available": "Příspěvek není dostupný",
|
||||
"status.quote_error.pending_approval": "Příspěvek čeká na schválení",
|
||||
"status.quote_error.pending_approval_popout.body": "Zobrazení citátů sdílených napříč Fediversem může chvíli trvat, protože různé servery používají různé protokoly.",
|
||||
"status.quote_error.pending_approval_popout.title": "Příspěvek čeká na schválení? Buďte klidní",
|
||||
"status.quote_followers_only": "Pouze moji sledující mohou citovat tento příspěvek",
|
||||
"status.quote_manual_review": "Autor provede manuální kontrolu",
|
||||
"status.quote_policy_change": "Změňte, kdo může citovat",
|
||||
"status.quote_post_author": "Citovali příspěvek od @{name}",
|
||||
"status.quote_private": "Soukromé příspěvky nelze citovat",
|
||||
"status.quotes": "{count, plural, one {citace} few {citace} other {citací}}",
|
||||
"status.quotes.empty": "Tento příspěvek zatím nikdo necitoval. Pokud tak někdo učiní, uvidíte to zde.",
|
||||
"status.read_more": "Číst více",
|
||||
"status.reblog": "Boostnout",
|
||||
"status.reblog_or_quote": "Boostnout nebo citovat",
|
||||
"status.reblog_private": "Boostnout s původní viditelností",
|
||||
"status.reblogged_by": "Uživatel {name} boostnul",
|
||||
"status.reblogs": "{count, plural, one {boost} few {boosty} many {boostů} other {boostů}}",
|
||||
|
@ -901,6 +921,7 @@
|
|||
"status.reply": "Odpovědět",
|
||||
"status.replyAll": "Odpovědět na vlákno",
|
||||
"status.report": "Nahlásit @{name}",
|
||||
"status.request_quote": "Požádat o možnost citovat",
|
||||
"status.revoke_quote": "Odstranit můj příspěvek z příspěvku @{name}",
|
||||
"status.sensitive_warning": "Citlivý obsah",
|
||||
"status.share": "Sdílet",
|
||||
|
@ -939,6 +960,7 @@
|
|||
"upload_button.label": "Přidat obrázky, video nebo audio soubor",
|
||||
"upload_error.limit": "Byl překročen limit nahraných souborů.",
|
||||
"upload_error.poll": "Nahrávání souborů není povoleno s anketami.",
|
||||
"upload_error.quote": "Nahrávání souboru není povoleno s citacemi.",
|
||||
"upload_form.drag_and_drop.instructions": "Chcete-li zvednout přílohu, stiskněte mezerník nebo enter. Při přetažení použijte klávesnicové šipky k přesunutí mediální přílohy v libovolném směru. Stiskněte mezerník nebo enter pro vložení přílohy do nové pozice, nebo stiskněte Esc pro ukončení.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Přetažení bylo zrušeno. Příloha {item} byla vrácena.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Příloha {item} byla vrácena.",
|
||||
|
@ -964,14 +986,15 @@
|
|||
"video.volume_up": "Zvýšit hlasitost",
|
||||
"visibility_modal.button_title": "Nastavit viditelnost",
|
||||
"visibility_modal.header": "Viditelnost a interakce",
|
||||
"visibility_modal.helper.direct_quoting": "Soukromé zmínky nemohou být citovány.",
|
||||
"visibility_modal.helper.direct_quoting": "Soukromé zmínky, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními.",
|
||||
"visibility_modal.helper.privacy_editing": "Publikované příspěvky nemohou změnit svou viditelnost.",
|
||||
"visibility_modal.helper.private_quoting": "Nelze citovat příspěvky, které jsou pouze pro sledující.",
|
||||
"visibility_modal.helper.private_quoting": "Příspěvky pouze pro sledující, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt.",
|
||||
"visibility_modal.instructions": "Kontrolujte, kdo může interagovat s tímto příspěvkem. Globální nastavení můžete najít pod <link>Nastavení > Ostatní</link>.",
|
||||
"visibility_modal.privacy_label": "Soukromí",
|
||||
"visibility_modal.quote_followers": "Pouze sledující",
|
||||
"visibility_modal.quote_label": "Změňte, kdo může citovat",
|
||||
"visibility_modal.quote_nobody": "Nikdo",
|
||||
"visibility_modal.quote_public": "Kdokoliv"
|
||||
"visibility_modal.quote_nobody": "Jen já",
|
||||
"visibility_modal.quote_public": "Kdokoliv",
|
||||
"visibility_modal.save": "Uložit"
|
||||
}
|
||||
|
|
|
@ -964,14 +964,11 @@
|
|||
"video.volume_up": "Lefel sain i fyny",
|
||||
"visibility_modal.button_title": "Gosod gwelededd",
|
||||
"visibility_modal.header": "Gwelededd a rhyngweithio",
|
||||
"visibility_modal.helper.direct_quoting": "Does dim modd dyfynnu crybwylliadau preifat.",
|
||||
"visibility_modal.helper.privacy_editing": "Does dim modd newid gwelededd postiadau wedi'u cyhoeddi.",
|
||||
"visibility_modal.helper.private_quoting": "Does dim modd dyfynnu postiadau dilynwyr yn unig.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio.",
|
||||
"visibility_modal.instructions": "Rheolwch bwy all ryngweithio â'r postiad hwn. Mae modd dod o hyd i osodiadau eang o dan <link>Dewisiadau > Arall</link>.",
|
||||
"visibility_modal.privacy_label": "Preifatrwydd",
|
||||
"visibility_modal.quote_followers": "Dilynwyr yn unig",
|
||||
"visibility_modal.quote_label": "Newid pwy all ddyfynnu",
|
||||
"visibility_modal.quote_nobody": "Neb",
|
||||
"visibility_modal.quote_public": "Pawb"
|
||||
}
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
"domain_pill.your_handle": "Dit handle:",
|
||||
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
|
||||
"domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
|
||||
"dropdown.empty": "Vælg en indstillingsmulighed",
|
||||
"dropdown.empty": "Vælg en indstilling",
|
||||
"embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
|
||||
"embed.preview": "Sådan kommer det til at se ud:",
|
||||
"emoji_button.activity": "Aktivitet",
|
||||
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Åbn hjem-tidslinje",
|
||||
"keyboard_shortcuts.hotkey": "Hurtigtast",
|
||||
"keyboard_shortcuts.legend": "Vis dette symbol",
|
||||
"keyboard_shortcuts.load_more": "Fokusér knappen \"Indlæs flere\"",
|
||||
"keyboard_shortcuts.local": "Åbn lokal tidslinje",
|
||||
"keyboard_shortcuts.mention": "Omtal forfatter",
|
||||
"keyboard_shortcuts.muted": "Åbn listen over skjulte brugere",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Åbn medier",
|
||||
"keyboard_shortcuts.pinned": "Åbn liste over fastgjorte indlæg",
|
||||
"keyboard_shortcuts.profile": "Åbn forfatters profil",
|
||||
"keyboard_shortcuts.quote": "Citer indlæg",
|
||||
"keyboard_shortcuts.reply": "Besvar indlægget",
|
||||
"keyboard_shortcuts.requests": "Åbn liste over følgeanmodninger",
|
||||
"keyboard_shortcuts.search": "Fokusér søgebjælke",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Din konto er suspenderet.",
|
||||
"notification.own_poll": "Din afstemning er afsluttet",
|
||||
"notification.poll": "En afstemning, hvori du har stemt, er slut",
|
||||
"notification.quoted_update": "{name} redigerede et indlæg, man har citeret",
|
||||
"notification.reblog": "{name} fremhævede dit indlæg",
|
||||
"notification.reblog.name_and_others_with_link": "{name} og <a>{count, plural, one {# anden} other {# andre}}</a> fremhævede dit indlæg",
|
||||
"notification.relationships_severance_event": "Mistede forbindelser med {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Følgere",
|
||||
"privacy.public.long": "Alle på og udenfor Mastodon",
|
||||
"privacy.public.short": "Offentlig",
|
||||
"privacy.quote.anyone": "{visibility}, alle kan citere",
|
||||
"privacy.quote.disabled": "{visibility}, citering deaktiveret",
|
||||
"privacy.quote.limited": "{visibility}, citering begrænset",
|
||||
"privacy.unlisted.additional": "Dette svarer til offentlig, bortset fra at indlægget ikke vises i live-feeds eller hashtags, udforsk eller Mastodon-søgning, selvom du har tilvalgt dette for kontoen.",
|
||||
"privacy.unlisted.long": "Færre algoritmiske fanfarer",
|
||||
"privacy.unlisted.short": "Offentlig (stille)",
|
||||
"privacy_policy.last_updated": "Senest opdateret {date}",
|
||||
"privacy_policy.title": "Privatlivspolitik",
|
||||
"quote_error.poll": "Citering ikke tilladt i afstemninger.",
|
||||
"quote_error.quote": "Kun ét citat ad gangen er tilladt.",
|
||||
"quote_error.unauthorized": "Man har ikke tilladelse til at citere dette indlæg.",
|
||||
"quote_error.upload": "Citering ikke tilladt ved medievedhæftninger.",
|
||||
"recommended": "Anbefalet",
|
||||
"refresh": "Genindlæs",
|
||||
"regeneration_indicator.please_stand_by": "Vent venligst.",
|
||||
|
@ -849,9 +859,11 @@
|
|||
"status.admin_account": "Åbn modereringsbrugerflade for @{name}",
|
||||
"status.admin_domain": "Åbn modereringsbrugerflade for {domain}",
|
||||
"status.admin_status": "Åbn dette indlæg i modereringsbrugerfladen",
|
||||
"status.all_disabled": "Fremhævelser og citater er deaktiveret",
|
||||
"status.block": "Blokér @{name}",
|
||||
"status.bookmark": "Bogmærk",
|
||||
"status.cancel_reblog_private": "Fjern fremhævelse",
|
||||
"status.cannot_quote": "Forfatter har deaktiveret citering af dette indlæg",
|
||||
"status.cannot_reblog": "Dette indlæg kan ikke fremhæves",
|
||||
"status.context.load_new_replies": "Nye svar tilgængelige",
|
||||
"status.context.loading": "Tjekker for flere svar",
|
||||
|
@ -880,15 +892,23 @@
|
|||
"status.mute_conversation": "Skjul samtale",
|
||||
"status.open": "Udvid dette indlæg",
|
||||
"status.pin": "Fastgør til profil",
|
||||
"status.quote": "Citér",
|
||||
"status.quote.cancel": "Annullér citat",
|
||||
"status.quote_error.filtered": "Skjult grundet et af filterne",
|
||||
"status.quote_error.not_available": "Indlæg utilgængeligt",
|
||||
"status.quote_error.pending_approval": "Afventende indlæg",
|
||||
"status.quote_error.pending_approval_popout.body": "Citater delt på tværs af Fediverset kan tage tid at vise, da forskellige servere har forskellige protokoller.",
|
||||
"status.quote_error.pending_approval_popout.title": "Afventende citat? Tag det roligt",
|
||||
"status.quote_followers_only": "Kun følgere kan citere dette indlæg",
|
||||
"status.quote_manual_review": "Forfatter vil manuelt gennemgå",
|
||||
"status.quote_policy_change": "Ændr hvem der kan citere",
|
||||
"status.quote_post_author": "Citerede et indlæg fra @{name}",
|
||||
"status.quote_private": "Private indlæg kan ikke citeres",
|
||||
"status.quotes": "{count, plural, one {citat} other {citater}}",
|
||||
"status.quotes.empty": "Ingen har citeret dette indlæg endnu. Når nogen gør det, vil det blive vist her.",
|
||||
"status.read_more": "Læs mere",
|
||||
"status.reblog": "Fremhæv",
|
||||
"status.reblog_or_quote": "Fremhæv eller citer",
|
||||
"status.reblog_private": "Fremhæv med oprindelig synlighed",
|
||||
"status.reblogged_by": "{name} fremhævede",
|
||||
"status.reblogs": "{count, plural, one {# fremhævelse} other {# fremhævelser}}",
|
||||
|
@ -901,6 +921,7 @@
|
|||
"status.reply": "Besvar",
|
||||
"status.replyAll": "Svar alle",
|
||||
"status.report": "Anmeld @{name}",
|
||||
"status.request_quote": "Anmod om tilladelse til at citere",
|
||||
"status.revoke_quote": "Fjern eget indlæg fra @{name}s indlæg",
|
||||
"status.sensitive_warning": "Følsomt indhold",
|
||||
"status.share": "Del",
|
||||
|
@ -939,6 +960,7 @@
|
|||
"upload_button.label": "Tilføj billed-, video- eller lydfil(er)",
|
||||
"upload_error.limit": "Grænse for filupload nået.",
|
||||
"upload_error.poll": "Filupload ikke tilladt for afstemninger.",
|
||||
"upload_error.quote": "Fil-upload ikke tilladt i citater.",
|
||||
"upload_form.drag_and_drop.instructions": "For at opsamle en medievedhæftning, tryk på Mellemrum eller Retur. Mens der trækkes, benyt piletasterne til at flytte medievedhæftningen i en given retning. Tryk på Mellemrum eller Retur igen for at slippe medievedhæftningen på den nye position, eller tryk på Escape for at afbryde.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Træk blev afbrudt. Medievedhæftningen {item} blev sluppet.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Medievedhæftningen {item} er sluppet.",
|
||||
|
@ -964,14 +986,15 @@
|
|||
"video.volume_up": "Lydstyrke op",
|
||||
"visibility_modal.button_title": "Indstil synlighed",
|
||||
"visibility_modal.header": "Synlighed og interaktion",
|
||||
"visibility_modal.helper.direct_quoting": "Private omtaler kan ikke citeres.",
|
||||
"visibility_modal.helper.direct_quoting": "Private omtaler forfattet på Mastodon kan ikke citeres af andre.",
|
||||
"visibility_modal.helper.privacy_editing": "Publicerede indlægs synlighed kan ikke ændres.",
|
||||
"visibility_modal.helper.private_quoting": "Indlæg kun for følgere kan ikke citeres.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Når man citeres af andre, skjules deres indlæg også på tendenstidslinjer.",
|
||||
"visibility_modal.helper.private_quoting": "Kun-følger indlæg forfattet på Mastodon kan ikke citeres af andre.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Når folk citerer dig, vil deres indlæg også blive skjult fra trendtidslinjer.",
|
||||
"visibility_modal.instructions": "Styr, hvem der kan interagere med dette indlæg. Globale indstillinger findes under <link>Præferencer > Andet</link>.",
|
||||
"visibility_modal.privacy_label": "Fortrolighed",
|
||||
"visibility_modal.quote_followers": "Kun følgere",
|
||||
"visibility_modal.quote_label": "Ændr hvem der kan citere",
|
||||
"visibility_modal.quote_nobody": "Ingen",
|
||||
"visibility_modal.quote_public": "Alle"
|
||||
"visibility_modal.quote_nobody": "Kun en selv",
|
||||
"visibility_modal.quote_public": "Alle",
|
||||
"visibility_modal.save": "Gem"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Startseite öffnen",
|
||||
"keyboard_shortcuts.hotkey": "Tastenkürzel",
|
||||
"keyboard_shortcuts.legend": "Tastenkombinationen anzeigen",
|
||||
"keyboard_shortcuts.load_more": "Schaltfläche „Mehr laden“ fokussieren",
|
||||
"keyboard_shortcuts.local": "Lokale Timeline öffnen",
|
||||
"keyboard_shortcuts.mention": "Profil erwähnen",
|
||||
"keyboard_shortcuts.muted": "Liste stummgeschalteter Profile öffnen",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Medieninhalt öffnen",
|
||||
"keyboard_shortcuts.pinned": "Liste angehefteter Beiträge öffnen",
|
||||
"keyboard_shortcuts.profile": "Profil aufrufen",
|
||||
"keyboard_shortcuts.quote": "Beitrag zitieren",
|
||||
"keyboard_shortcuts.reply": "Auf Beitrag antworten",
|
||||
"keyboard_shortcuts.requests": "Liste der Follower-Anfragen aufrufen",
|
||||
"keyboard_shortcuts.search": "Suchleiste fokussieren",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Dein Konto wurde gesperrt.",
|
||||
"notification.own_poll": "Deine Umfrage ist beendet",
|
||||
"notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet",
|
||||
"notification.quoted_update": "{name} bearbeitete einen von dir zitierten Beitrag",
|
||||
"notification.reblog": "{name} teilte deinen Beitrag",
|
||||
"notification.reblog.name_and_others_with_link": "{name} und <a>{count, plural, one {# weiteres Profil} other {# weitere Profile}}</a> teilten deinen Beitrag",
|
||||
"notification.relationships_severance_event": "Verbindungen mit {name} verloren",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Follower",
|
||||
"privacy.public.long": "Alle in und außerhalb von Mastodon",
|
||||
"privacy.public.short": "Öffentlich",
|
||||
"privacy.quote.anyone": "{visibility} – alle dürfen zitieren",
|
||||
"privacy.quote.disabled": "{visibility} – niemand darf zitieren",
|
||||
"privacy.quote.limited": "{visibility} – eingeschränktes Zitieren",
|
||||
"privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch gibt es einige Einschränkungen. Der Beitrag wird nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion auffindbar sein – selbst wenn die zugehörige Einstellung aktiviert wurde.",
|
||||
"privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt",
|
||||
"privacy.unlisted.short": "Öffentlich (still)",
|
||||
"privacy_policy.last_updated": "Stand: {date}",
|
||||
"privacy_policy.title": "Datenschutzerklärung",
|
||||
"quote_error.poll": "Zitieren ist bei Umfragen nicht gestattet.",
|
||||
"quote_error.quote": "Es ist jeweils nur ein Zitat zulässig.",
|
||||
"quote_error.unauthorized": "Du bist nicht berechtigt, diesen Beitrag zu zitieren.",
|
||||
"quote_error.upload": "Zitieren ist mit Medien-Anhängen nicht möglich.",
|
||||
"recommended": "Empfohlen",
|
||||
"refresh": "Aktualisieren",
|
||||
"regeneration_indicator.please_stand_by": "Bitte warten.",
|
||||
|
@ -849,9 +859,11 @@
|
|||
"status.admin_account": "@{name} moderieren",
|
||||
"status.admin_domain": "{domain} moderieren",
|
||||
"status.admin_status": "Beitrag moderieren",
|
||||
"status.all_disabled": "Teilen und Zitieren von Beiträgen ist deaktiviert",
|
||||
"status.block": "@{name} blockieren",
|
||||
"status.bookmark": "Lesezeichen setzen",
|
||||
"status.cancel_reblog_private": "Beitrag nicht mehr teilen",
|
||||
"status.cannot_quote": "Autor*in hat das Zitieren dieses Beitrags deaktiviert",
|
||||
"status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
|
||||
"status.context.load_new_replies": "Neue Antworten verfügbar",
|
||||
"status.context.loading": "Weitere Antworten werden abgerufen",
|
||||
|
@ -880,16 +892,23 @@
|
|||
"status.mute_conversation": "Unterhaltung stummschalten",
|
||||
"status.open": "Beitrag öffnen",
|
||||
"status.pin": "Im Profil anheften",
|
||||
"status.quote": "Zitieren",
|
||||
"status.quote.cancel": "Zitat abbrechen",
|
||||
"status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter",
|
||||
"status.quote_error.not_available": "Beitrag nicht verfügbar",
|
||||
"status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend",
|
||||
"status.quote_error.pending_approval_popout.body": "Zitierte Beiträge, die im Fediverse geteilt werden, benötigen einige Zeit, bis sie überall angezeigt werden, da die verschiedenen Server unterschiedliche Protokolle nutzen.",
|
||||
"status.quote_error.pending_approval_popout.title": "Zitierter Beitrag noch nicht freigegeben? Immer mit der Ruhe",
|
||||
"status.quote_followers_only": "Nur Follower können diesen Beitrag zitieren",
|
||||
"status.quote_manual_review": "Zitierte*r überprüft manuell",
|
||||
"status.quote_policy_change": "Ändern, wer zitieren darf",
|
||||
"status.quote_post_author": "Zitierte einen Beitrag von @{name}",
|
||||
"status.quote_private": "Private Beiträge können nicht zitiert werden",
|
||||
"status.quotes": "{count, plural, one {Mal zitiert} other {Mal zitiert}}",
|
||||
"status.quotes.empty": "Diesen Beitrag hat bisher noch niemand zitiert. Sobald es jemand tut, wird das Profil hier erscheinen.",
|
||||
"status.read_more": "Gesamten Beitrag anschauen",
|
||||
"status.reblog": "Teilen",
|
||||
"status.reblog_or_quote": "Teilen oder zitieren",
|
||||
"status.reblog_private": "Mit der ursprünglichen Zielgruppe teilen",
|
||||
"status.reblogged_by": "{name} teilte",
|
||||
"status.reblogs": "{count, plural, one {Mal geteilt} other {Mal geteilt}}",
|
||||
|
@ -902,6 +921,7 @@
|
|||
"status.reply": "Antworten",
|
||||
"status.replyAll": "Allen antworten",
|
||||
"status.report": "@{name} melden",
|
||||
"status.request_quote": "Anfrage zum Zitieren",
|
||||
"status.revoke_quote": "Meinen zitierten Beitrag aus dem Beitrag von @{name} entfernen",
|
||||
"status.sensitive_warning": "Inhaltswarnung",
|
||||
"status.share": "Teilen",
|
||||
|
@ -940,6 +960,7 @@
|
|||
"upload_button.label": "Bilder, Video oder Audio hinzufügen",
|
||||
"upload_error.limit": "Dateiupload-Limit überschritten.",
|
||||
"upload_error.poll": "Medien-Anhänge sind zusammen mit Umfragen nicht erlaubt.",
|
||||
"upload_error.quote": "Medien-Anhänge sind zusammen mit Zitaten nicht erlaubt.",
|
||||
"upload_form.drag_and_drop.instructions": "Drücke zum Aufnehmen eines Medienanhangs die Eingabe- oder Leertaste. Verwende beim Ziehen die Pfeiltasten, um den Medienanhang zur gewünschten Position zu bewegen. Drücke erneut die Eingabe- oder Leertaste, um den Medienanhang an der gewünschten Position abzulegen. Mit der Escape-Taste kannst du den Vorgang abbrechen.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Das Ziehen wurde abgebrochen und der Medienanhang {item} wurde abgelegt.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Der Medienanhang {item} wurde abgelegt.",
|
||||
|
@ -965,14 +986,15 @@
|
|||
"video.volume_up": "Lauter",
|
||||
"visibility_modal.button_title": "Sichtbarkeit festlegen",
|
||||
"visibility_modal.header": "Sichtbarkeit und Interaktion",
|
||||
"visibility_modal.helper.direct_quoting": "Private Erwähnungen können nicht zitiert werden.",
|
||||
"visibility_modal.helper.direct_quoting": "Private Erwähnungen, die auf Mastodon verfasst wurden, können nicht von anderen zitiert werden.",
|
||||
"visibility_modal.helper.privacy_editing": "Die Sichtbarkeit bereits veröffentlichter Beiträge kann nachträglich nicht mehr geändert werden.",
|
||||
"visibility_modal.helper.private_quoting": "Beiträge, die nur für deine Follower bestimmt sind, können nicht zitiert werden.",
|
||||
"visibility_modal.helper.private_quoting": "Beiträge, die nur für deine Follower bestimmt sind und auf Mastodon verfasst wurden, können nicht von anderen zitiert werden.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Sollten dich andere zitieren, werden ihre zitierten Beiträge ebenfalls nicht in den Trends und öffentlichen Timelines angezeigt.",
|
||||
"visibility_modal.instructions": "Bestimme, wer mit diesem Beitrag interagieren darf. Allgemeingültige Einstellungen findest du unter <link>Einstellungen > Erweitert</link>.",
|
||||
"visibility_modal.privacy_label": "Datenschutz",
|
||||
"visibility_modal.quote_followers": "Nur Follower",
|
||||
"visibility_modal.quote_label": "Ändern, wer zitieren darf",
|
||||
"visibility_modal.quote_nobody": "Niemand",
|
||||
"visibility_modal.quote_public": "Alle"
|
||||
"visibility_modal.quote_nobody": "Nur von mir",
|
||||
"visibility_modal.quote_public": "Alle",
|
||||
"visibility_modal.save": "Speichern"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας",
|
||||
"keyboard_shortcuts.hotkey": "Συντόμευση",
|
||||
"keyboard_shortcuts.legend": "Εμφάνιση αυτού του οδηγού",
|
||||
"keyboard_shortcuts.load_more": "Εστίαση στο κουμπί \"Φόρτωση περισσότερων\"",
|
||||
"keyboard_shortcuts.local": "Άνοιγμα τοπικής ροής",
|
||||
"keyboard_shortcuts.mention": "Επισήμανση συγγραφέα",
|
||||
"keyboard_shortcuts.muted": "Άνοιγμα λίστας αποσιωπημένων χρηστών",
|
||||
|
@ -738,11 +739,18 @@
|
|||
"privacy.private.short": "Ακόλουθοι",
|
||||
"privacy.public.long": "Όλοι εντός και εκτός του Mastodon",
|
||||
"privacy.public.short": "Δημόσιο",
|
||||
"privacy.quote.anyone": "{visibility}, ο καθένας μπορεί να παραθέσει",
|
||||
"privacy.quote.disabled": "{visibility}, παραθέσεις απενεργοποιημένες",
|
||||
"privacy.quote.limited": "{visibility}, παραθέσεις περιορισμένες",
|
||||
"privacy.unlisted.additional": "Αυτό συμπεριφέρεται ακριβώς όπως το δημόσιο, εκτός από το ότι η ανάρτηση δεν θα εμφανιστεί σε ζωντανές ροές ή ετικέτες, εξερεύνηση ή αναζήτηση στο Mastodon, ακόμη και αν το έχεις επιλέξει για τον λογαριασμό σου.",
|
||||
"privacy.unlisted.long": "Λιγότερα αλγοριθμικά κόλπα",
|
||||
"privacy.unlisted.short": "Ήσυχα δημόσια",
|
||||
"privacy_policy.last_updated": "Τελευταία ενημέρωση {date}",
|
||||
"privacy_policy.title": "Πολιτική Απορρήτου",
|
||||
"quote_error.poll": "Η παράθεση δεν επιτρέπεται με δημοσκοπήσεις.",
|
||||
"quote_error.quote": "Επιτρέπεται μόνο μία παράθεση τη φορά.",
|
||||
"quote_error.unauthorized": "Δεν είστε εξουσιοδοτημένοι να παραθέσετε αυτή την ανάρτηση.",
|
||||
"quote_error.upload": "Η παράθεση δεν επιτρέπεται με συνημμένα πολυμέσων.",
|
||||
"recommended": "Προτεινόμενα",
|
||||
"refresh": "Ανανέωση",
|
||||
"regeneration_indicator.please_stand_by": "Παρακαλούμε περίμενε.",
|
||||
|
@ -849,9 +857,11 @@
|
|||
"status.admin_account": "Άνοιγμα διεπαφής συντονισμού για τον/την @{name}",
|
||||
"status.admin_domain": "Άνοιγμα λειτουργίας διαμεσολάβησης για {domain}",
|
||||
"status.admin_status": "Άνοιγμα αυτής της ανάρτησης σε διεπαφή συντονισμού",
|
||||
"status.all_disabled": "Ενισχύσεις και παραθέσεις είναι απενεργοποιημένες",
|
||||
"status.block": "Αποκλεισμός @{name}",
|
||||
"status.bookmark": "Σελιδοδείκτης",
|
||||
"status.cancel_reblog_private": "Ακύρωση ενίσχυσης",
|
||||
"status.cannot_quote": "Ο συντάκτης έχει απενεργοποιήσει την παράθεση σε αυτή την ανάρτηση",
|
||||
"status.cannot_reblog": "Αυτή η ανάρτηση δεν μπορεί να ενισχυθεί",
|
||||
"status.context.load_new_replies": "Νέες απαντήσεις διαθέσιμες",
|
||||
"status.context.loading": "Γίνεται έλεγχος για περισσότερες απαντήσεις",
|
||||
|
@ -880,6 +890,8 @@
|
|||
"status.mute_conversation": "Σίγαση συνομιλίας",
|
||||
"status.open": "Επέκταση ανάρτησης",
|
||||
"status.pin": "Καρφίτσωσε στο προφίλ",
|
||||
"status.quote": "Παράθεση",
|
||||
"status.quote.cancel": "Ακύρωση παράθεσης",
|
||||
"status.quote_error.filtered": "Κρυφό λόγω ενός από τα φίλτρα σου",
|
||||
"status.quote_error.not_available": "Ανάρτηση μη διαθέσιμη",
|
||||
"status.quote_error.pending_approval": "Ανάρτηση σε αναμονή",
|
||||
|
@ -887,6 +899,7 @@
|
|||
"status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι",
|
||||
"status.quote_policy_change": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
|
||||
"status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}",
|
||||
"status.quote_private": "Ιδιωτικές αναρτήσεις δεν μπορούν να παρατεθούν",
|
||||
"status.read_more": "Διάβασε περισότερα",
|
||||
"status.reblog": "Ενίσχυση",
|
||||
"status.reblog_private": "Ενίσχυση με αρχική ορατότητα",
|
||||
|
@ -939,6 +952,7 @@
|
|||
"upload_button.label": "Πρόσθεσε εικόνες, ένα βίντεο ή ένα αρχείο ήχου",
|
||||
"upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
|
||||
"upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
|
||||
"upload_error.quote": "Δεν επιτρέπεται η μεταφόρτωση αρχείου με παραθέσεις.",
|
||||
"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}».",
|
||||
|
@ -964,14 +978,12 @@
|
|||
"video.volume_up": "Αύξηση έντασης",
|
||||
"visibility_modal.button_title": "Ορισμός ορατότητας",
|
||||
"visibility_modal.header": "Ορατότητα και αλληλεπίδραση",
|
||||
"visibility_modal.helper.direct_quoting": "Ιδιωτικές επισημάνσεις δεν μπορούν να παρατεθούν.",
|
||||
"visibility_modal.helper.privacy_editing": "Δημοσιευμένες αναρτήσεις δεν μπορούν να αλλάξουν την ορατότητά τους.",
|
||||
"visibility_modal.helper.private_quoting": "Οι αναρτήσεις μόνο για ακολούθους δεν μπορούν να παρατεθούν.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Όταν οι άνθρωποι σας παραθέτουν, η ανάρτηση τους θα είναι επίσης κρυμμένη από τα δημοφιλή χρονοδιαγράμματα.",
|
||||
"visibility_modal.instructions": "Ελέγξτε ποιός μπορεί να αλληλεπιδράσει με αυτή την ανάρτηση. Οι καθολικές ρυθμίσεις μπορούν να βρεθούν κάτω από <link>Προτιμήσεις > Άλλα</link>.",
|
||||
"visibility_modal.privacy_label": "Απόρρητο",
|
||||
"visibility_modal.quote_followers": "Μόνο ακόλουθοι",
|
||||
"visibility_modal.quote_label": "Αλλάξτε ποιός μπορεί να κάνει παράθεση",
|
||||
"visibility_modal.quote_nobody": "Κανένας",
|
||||
"visibility_modal.quote_public": "Οποιοσδήποτε"
|
||||
"visibility_modal.quote_public": "Οποιοσδήποτε",
|
||||
"visibility_modal.save": "Αποθήκευση"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Open home timeline",
|
||||
"keyboard_shortcuts.hotkey": "Hotkey",
|
||||
"keyboard_shortcuts.legend": "Display this legend",
|
||||
"keyboard_shortcuts.load_more": "Focus \"Load more\" button",
|
||||
"keyboard_shortcuts.local": "Open local timeline",
|
||||
"keyboard_shortcuts.mention": "Mention author",
|
||||
"keyboard_shortcuts.muted": "Open muted users list",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Open media",
|
||||
"keyboard_shortcuts.pinned": "Open pinned posts list",
|
||||
"keyboard_shortcuts.profile": "Open author's profile",
|
||||
"keyboard_shortcuts.quote": "Quote post",
|
||||
"keyboard_shortcuts.reply": "Reply to post",
|
||||
"keyboard_shortcuts.requests": "Open follow requests list",
|
||||
"keyboard_shortcuts.search": "Focus search bar",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Your account has been suspended.",
|
||||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.poll": "A poll you voted in has ended",
|
||||
"notification.quoted_update": "{name} edited a post you have quoted",
|
||||
"notification.reblog": "{name} boosted your post",
|
||||
"notification.reblog.name_and_others_with_link": "{name} and <a>{count, plural, one {# other} other {# others}}</a> boosted your post",
|
||||
"notification.relationships_severance_event": "Lost connections with {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Followers",
|
||||
"privacy.public.long": "Anyone on and off Mastodon",
|
||||
"privacy.public.short": "Public",
|
||||
"privacy.quote.anyone": "{visibility}, anyone can quote",
|
||||
"privacy.quote.disabled": "{visibility}, quotes disabled",
|
||||
"privacy.quote.limited": "{visibility}, quotes limited",
|
||||
"privacy.unlisted.additional": "This behaves exactly like public, except the post will not appear in live feeds or hashtags, explore, or Mastodon search, even if you are opted-in account-wide.",
|
||||
"privacy.unlisted.long": "Fewer algorithmic fanfares",
|
||||
"privacy.unlisted.short": "Quiet public",
|
||||
"privacy_policy.last_updated": "Last updated {date}",
|
||||
"privacy_policy.title": "Privacy Policy",
|
||||
"quote_error.poll": "Quoting is not allowed with polls.",
|
||||
"quote_error.quote": "Only one quote at a time is allowed.",
|
||||
"quote_error.unauthorized": "You are not authorized to quote this post.",
|
||||
"quote_error.upload": "Quoting is not allowed with media attachments.",
|
||||
"recommended": "Recommended",
|
||||
"refresh": "Refresh",
|
||||
"regeneration_indicator.please_stand_by": "Please stand by.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_domain": "Open moderation interface for {domain}",
|
||||
"status.admin_status": "Open this post in the moderation interface",
|
||||
"status.all_disabled": "Boosts and quotes are disabled",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_quote": "Author has disabled quoting on this post",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.context.load_new_replies": "New replies available",
|
||||
"status.context.loading": "Checking for more replies",
|
||||
"status.continued_thread": "Continued thread",
|
||||
"status.copy": "Copy link to post",
|
||||
"status.delete": "Delete",
|
||||
"status.delete.success": "Post deleted",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Privately mention @{name}",
|
||||
"status.direct_indicator": "Private mention",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this post",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.quote": "Quote",
|
||||
"status.quote.cancel": "Cancel quote",
|
||||
"status.quote_error.filtered": "Hidden due to one of your filters",
|
||||
"status.quote_error.not_available": "Post unavailable",
|
||||
"status.quote_error.pending_approval": "Post pending",
|
||||
"status.quote_error.pending_approval_popout.body": "Quotes shared across the Fediverse may take time to display, as different servers have different protocols.",
|
||||
"status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm",
|
||||
"status.quote_followers_only": "Only followers can quote this post",
|
||||
"status.quote_manual_review": "Author will manually review",
|
||||
"status.quote_policy_change": "Change who can quote",
|
||||
"status.quote_post_author": "Quoted a post by @{name}",
|
||||
"status.quote_private": "Private posts cannot be quoted",
|
||||
"status.quotes": "{count, plural, one {quote} other {quotes}}",
|
||||
"status.quotes.empty": "No one has quoted this post yet. When someone does, it will show up here.",
|
||||
"status.read_more": "Read more",
|
||||
"status.reblog": "Boost",
|
||||
"status.reblog_or_quote": "Boost or quote",
|
||||
"status.reblog_private": "Boost with original visibility",
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Reply",
|
||||
"status.replyAll": "Reply to thread",
|
||||
"status.report": "Report @{name}",
|
||||
"status.request_quote": "Request to quote",
|
||||
"status.revoke_quote": "Remove my post from @{name}’s post",
|
||||
"status.sensitive_warning": "Sensitive content",
|
||||
"status.share": "Share",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_error.quote": "File upload not allowed with quotes.",
|
||||
"upload_form.drag_and_drop.instructions": "To pick up a media attachment, press space or enter. While dragging, use the arrow keys to move the media attachment in any given direction. Press space or enter again to drop the media attachment in its new position, or press escape to cancel.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Dragging was cancelled. Media attachment {item} was dropped.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Media attachment {item} was dropped.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Volume up",
|
||||
"visibility_modal.button_title": "Set visibility",
|
||||
"visibility_modal.header": "Visibility and interaction",
|
||||
"visibility_modal.helper.direct_quoting": "Private mentions can't be quoted.",
|
||||
"visibility_modal.helper.direct_quoting": "Private mentions authored on Mastodon can't be quoted by others.",
|
||||
"visibility_modal.helper.privacy_editing": "Published posts cannot change their visibility.",
|
||||
"visibility_modal.helper.private_quoting": "Follower-only posts can't be quoted.",
|
||||
"visibility_modal.helper.private_quoting": "Follower-only posts authored on Mastodon can't be quoted by others.",
|
||||
"visibility_modal.helper.unlisted_quoting": "When people quote you, their post will also be hidden from trending timelines.",
|
||||
"visibility_modal.instructions": "Control who can interact with this post. Global settings can be found under <link>Preferences > Other</link>.",
|
||||
"visibility_modal.privacy_label": "Privacy",
|
||||
"visibility_modal.quote_followers": "Followers only",
|
||||
"visibility_modal.quote_label": "Change who can quote",
|
||||
"visibility_modal.quote_nobody": "No one",
|
||||
"visibility_modal.quote_public": "Anyone"
|
||||
"visibility_modal.quote_nobody": "Just me",
|
||||
"visibility_modal.quote_public": "Anyone",
|
||||
"visibility_modal.save": "Save"
|
||||
}
|
||||
|
|
|
@ -568,6 +568,8 @@
|
|||
"navigation_bar.preferences": "Preferoj",
|
||||
"navigation_bar.privacy_and_reach": "Privateco kaj atingo",
|
||||
"navigation_bar.search": "Serĉi",
|
||||
"navigation_panel.expand_followed_tags": "Malfermi la menuon de sekvataj haŝetikedoj",
|
||||
"navigation_panel.expand_lists": "Malfermi la listmenuon",
|
||||
"not_signed_in_indicator.not_signed_in": "Necesas saluti por aliri tiun rimedon.",
|
||||
"notification.admin.report": "{name} raportis {target}",
|
||||
"notification.admin.report_account": "{name} raportis {count, plural, one {afiŝon} other {# afiŝojn}} de {target} por {category}",
|
||||
|
@ -604,6 +606,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Via konto estas malakceptita.",
|
||||
"notification.own_poll": "Via balotenketo finiĝitis",
|
||||
"notification.poll": "Balotenketo, en kiu vi voĉdonis, finiĝis",
|
||||
"notification.quoted_update": "{name} redaktis afiŝon, kiun vi citis",
|
||||
"notification.reblog": "{name} diskonigis vian afiŝon",
|
||||
"notification.reblog.name_and_others_with_link": "{name} kaj <a>{count, plural, one {# alia} other {# aliaj}}</a> diskonigis vian afiŝon",
|
||||
"notification.relationships_severance_event": "Perditaj konektoj kun {name}",
|
||||
|
@ -723,11 +726,14 @@
|
|||
"privacy.private.short": "Sekvantoj",
|
||||
"privacy.public.long": "Ĉiujn ajn ĉe kaj ekster Mastodon",
|
||||
"privacy.public.short": "Publika",
|
||||
"privacy.quote.anyone": "{visibility}, iu ajn povas citi",
|
||||
"privacy.unlisted.additional": "Ĉi tio kondutas ekzakte kiel publika, krom ke la afiŝo ne aperos en vivaj fluoj aŭ kradvortoj, esploro aŭ Mastodon-serĉo, eĉ se vi estas enskribita en la tuta konto.",
|
||||
"privacy.unlisted.long": "Malpli algoritmaj fanfaroj",
|
||||
"privacy.unlisted.short": "Diskrete publika",
|
||||
"privacy_policy.last_updated": "Laste ĝisdatigita en {date}",
|
||||
"privacy_policy.title": "Politiko de privateco",
|
||||
"quote_error.quote": "Nur unu citaĵo samtempe estas permesita.",
|
||||
"quote_error.unauthorized": "Vi ne rajtas citi tiun ĉi afiŝon.",
|
||||
"recommended": "Rekomendita",
|
||||
"refresh": "Refreŝigu",
|
||||
"regeneration_indicator.please_stand_by": "Bonvolu atendi.",
|
||||
|
@ -837,12 +843,14 @@
|
|||
"status.block": "Bloki @{name}",
|
||||
"status.bookmark": "Aldoni al la legosignoj",
|
||||
"status.cancel_reblog_private": "Ne plu diskonigi",
|
||||
"status.cannot_quote": "La aŭtoro malŝaltis citadon en ĉi tiu afiŝo",
|
||||
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
|
||||
"status.context.load_new_replies": "Disponeblaj novaj respondoj",
|
||||
"status.context.loading": "Serĉante pliajn respondojn",
|
||||
"status.continued_thread": "Daŭrigis fadenon",
|
||||
"status.copy": "Kopii la ligilon al la afiŝo",
|
||||
"status.delete": "Forigi",
|
||||
"status.delete.success": "Afiŝo forigita",
|
||||
"status.detailed_status": "Detala konversacia vido",
|
||||
"status.direct": "Private mencii @{name}",
|
||||
"status.direct_indicator": "Privata mencio",
|
||||
|
@ -865,9 +873,19 @@
|
|||
"status.mute_conversation": "Silentigi konversacion",
|
||||
"status.open": "Pligrandigu ĉi tiun afiŝon",
|
||||
"status.pin": "Alpingli al la profilo",
|
||||
"status.quote": "Citaĵo",
|
||||
"status.quote.cancel": "Nuligi citaĵon",
|
||||
"status.quote_error.filtered": "Kaŝita pro unu el viaj filtriloj",
|
||||
"status.quote_error.not_available": "Afiŝo ne disponebla",
|
||||
"status.quote_error.pending_approval": "Pritraktata afiŝo",
|
||||
"status.quote_error.pending_approval_popout.body": "Citaĵoj diskonigitaj tra la Fediverso povas bezoni tempon por montriĝi, ĉar malsamaj serviloj havas malsamajn protokolojn.",
|
||||
"status.quote_error.pending_approval_popout.title": "Ĉu pritraktata citaĵo? Restu trankvila",
|
||||
"status.quote_followers_only": "Nur sekvantoj rajtas citi tiun ĉi afiŝon",
|
||||
"status.quote_policy_change": "Ŝanĝi kiu povas citi",
|
||||
"status.quote_post_author": "Citis afiŝon de @{name}",
|
||||
"status.quote_private": "Privataj afiŝoj ne povas esti cititaj",
|
||||
"status.quotes": "{count, plural,one {citaĵo} other {citaĵoj}}",
|
||||
"status.quotes.empty": "Neniu citis ĉi tiun afiŝon ankoraŭ. Kiam iu faros tion, ĝi aperos ĉi tie.",
|
||||
"status.read_more": "Legi pli",
|
||||
"status.reblog": "Diskonigi",
|
||||
"status.reblog_private": "Diskonigi kun la sama videbleco",
|
||||
|
@ -882,6 +900,7 @@
|
|||
"status.reply": "Respondi",
|
||||
"status.replyAll": "Respondi al la fadeno",
|
||||
"status.report": "Raporti @{name}",
|
||||
"status.revoke_quote": "Forigu mian afiŝon el la afiŝo de @{name}",
|
||||
"status.sensitive_warning": "Tikla enhavo",
|
||||
"status.share": "Kundividi",
|
||||
"status.show_less_all": "Montri malpli ĉiun",
|
||||
|
@ -919,6 +938,7 @@
|
|||
"upload_button.label": "Aldonu bildojn, filmeton aŭ sondosieron",
|
||||
"upload_error.limit": "Limo de dosiera alŝutado transpasita.",
|
||||
"upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.",
|
||||
"upload_error.quote": "Ne estas permesita alŝuto de dosieroj kun citaĵoj.",
|
||||
"upload_form.drag_and_drop.instructions": "Por preni amaskomunikilaron aldonaĵon, premu spacoklavon aŭ enen-klavon. Dum trenado, uzu la sagoklavojn por movi la amaskomunikilaron aldonaĵon en iu ajn direkto. Premu spacoklavon aŭ enen-klavon denove por faligi la amaskomunikilaron aldonaĵon en ĝia nova pozicio, aŭ premu eskapan klavon por nuligi.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Trenado estis nuligita. Amaskomunikila aldonaĵo {item} estis forigita.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Amaskomunikila aldonaĵo {item} estis forigita.",
|
||||
|
@ -944,13 +964,12 @@
|
|||
"video.volume_up": "Laŭteco pliigi",
|
||||
"visibility_modal.button_title": "Agordu videblon",
|
||||
"visibility_modal.header": "Videblo kaj interago",
|
||||
"visibility_modal.helper.direct_quoting": "Privataj mencioj ne povas esti cititaj.",
|
||||
"visibility_modal.helper.privacy_editing": "Publikigitaj afiŝoj ne povas ŝanĝi sian videblon.",
|
||||
"visibility_modal.helper.private_quoting": "Afiŝoj nur por sekvantoj ne povas esti cititaj.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj.",
|
||||
"visibility_modal.privacy_label": "Privateco",
|
||||
"visibility_modal.quote_followers": "Nur sekvantoj",
|
||||
"visibility_modal.quote_label": "Ŝanĝi kiu povas citi",
|
||||
"visibility_modal.quote_nobody": "Neniu",
|
||||
"visibility_modal.quote_public": "Iu ajn"
|
||||
"visibility_modal.quote_nobody": "Nur mi",
|
||||
"visibility_modal.quote_public": "Iu ajn",
|
||||
"visibility_modal.save": "Konservi"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Abrir línea temporal principal",
|
||||
"keyboard_shortcuts.hotkey": "Atajo",
|
||||
"keyboard_shortcuts.legend": "Mostrar este texto",
|
||||
"keyboard_shortcuts.load_more": "Focalizar el botón «Cargar más»",
|
||||
"keyboard_shortcuts.local": "Abrirlínea temporal local",
|
||||
"keyboard_shortcuts.mention": "Mencionar al autor",
|
||||
"keyboard_shortcuts.muted": "Abrir lista de usuarios silenciados",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Abrir archivos de medios",
|
||||
"keyboard_shortcuts.pinned": "Abrir lista de mensajes fijados",
|
||||
"keyboard_shortcuts.profile": "Abrir perfil del autor",
|
||||
"keyboard_shortcuts.quote": "Citar mensaje",
|
||||
"keyboard_shortcuts.reply": "Responder al mensaje",
|
||||
"keyboard_shortcuts.requests": "Abrir lista de solicitudes de seguimiento",
|
||||
"keyboard_shortcuts.search": "Enfocar barra de búsqueda",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tu cuenta fue suspendida.",
|
||||
"notification.own_poll": "Tu encuesta finalizó",
|
||||
"notification.poll": "Finalizó una encuesta en la que votaste",
|
||||
"notification.quoted_update": "{name} editó un mensaje que citaste",
|
||||
"notification.reblog": "{name} adhirió a tu mensaje",
|
||||
"notification.reblog.name_and_others_with_link": "{name} y <a>{count, plural, one {# cuenta más} other {# cuentas más}}</a> marcaron tu mensaje como favorito",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Seguidores",
|
||||
"privacy.public.long": "Cualquier persona dentro y fuera de Mastodon",
|
||||
"privacy.public.short": "Público",
|
||||
"privacy.unlisted.additional": "Esto se comporta exactamente igual que con la configuración de privacidad de mensaje \"Público\", excepto que el mensaje no aparecerá en los líneas temporales en vivo, ni en las etiquetas, ni en la línea temporal \"Explorá\", ni en la búsqueda de Mastodon; incluso si optaste por hacer tu cuenta visible.",
|
||||
"privacy.quote.anyone": "{visibility}, todos pueden citar",
|
||||
"privacy.quote.disabled": "{visibility}, citas deshabilitadas",
|
||||
"privacy.quote.limited": "{visibility}, citas limitadas",
|
||||
"privacy.unlisted.additional": "Esto se comporta exactamente igual que con la configuración de privacidad de mensaje «Público», excepto que el mensaje no aparecerá en las líneas temporales en vivo, ni en las etiquetas, ni en la línea temporal «Explorá», ni en la búsqueda de Mastodon; incluso si optaste por hacer tu cuenta visible.",
|
||||
"privacy.unlisted.long": "Menos fanfarrias algorítmicas",
|
||||
"privacy.unlisted.short": "Público silencioso",
|
||||
"privacy_policy.last_updated": "Última actualización: {date}",
|
||||
"privacy_policy.title": "Política de privacidad",
|
||||
"quote_error.poll": "No se permite citar encuestas.",
|
||||
"quote_error.quote": "Solo se permite una cita a la vez.",
|
||||
"quote_error.unauthorized": "No tenés autorización para citar este mensaje.",
|
||||
"quote_error.upload": "No se permite citar con archivos multimedia.",
|
||||
"recommended": "Opción recomendada",
|
||||
"refresh": "Refrescar",
|
||||
"regeneration_indicator.please_stand_by": "Esperá, por favor.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Abrir interface de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderación para {domain}",
|
||||
"status.admin_status": "Abrir este mensaje en la interface de moderación",
|
||||
"status.all_disabled": "Las adhesiones y citas están deshabilitadas",
|
||||
"status.block": "Bloquear a @{name}",
|
||||
"status.bookmark": "Marcar",
|
||||
"status.cancel_reblog_private": "Quitar adhesión",
|
||||
"status.cannot_quote": "El autor deshabilitó las citas en este mensaje",
|
||||
"status.cannot_reblog": "No se puede adherir a este mensaje",
|
||||
"status.context.load_new_replies": "Hay nuevas respuestas",
|
||||
"status.context.loading": "Buscando más respuestas",
|
||||
"status.continued_thread": "Continuación de hilo",
|
||||
"status.copy": "Copiar enlace al mensaje",
|
||||
"status.delete": "Eliminar",
|
||||
"status.delete.success": "Mensaje eliminado",
|
||||
"status.detailed_status": "Vista de conversación detallada",
|
||||
"status.direct": "Mención privada a @{name}",
|
||||
"status.direct_indicator": "Mención privada",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir este mensaje",
|
||||
"status.pin": "Fijar en el perfil",
|
||||
"status.quote": "Citar",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Mensaje no disponible",
|
||||
"status.quote_error.pending_approval": "Mensaje pendiente",
|
||||
"status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que diferentes servidores tienen diferentes protocolos.",
|
||||
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Esperá un momento",
|
||||
"status.quote_followers_only": "Solo los seguidores pueden citar este mensaje",
|
||||
"status.quote_manual_review": "El autor revisará manualmente",
|
||||
"status.quote_policy_change": "Cambiá quién puede citar",
|
||||
"status.quote_post_author": "Se citó un mensaje de @{name}",
|
||||
"status.quote_private": "No se pueden citar los mensajes privados",
|
||||
"status.quotes": "{count, plural, one {# voto} other {# votos}}",
|
||||
"status.quotes.empty": "Todavía nadie citó este mensaje. Cuando alguien lo haga, se mostrará acá.",
|
||||
"status.read_more": "Leé más",
|
||||
"status.reblog": "Adherir",
|
||||
"status.reblog_or_quote": "Adherir o citar",
|
||||
"status.reblog_private": "Adherir a la audiencia original",
|
||||
"status.reblogged_by": "{name} adhirió",
|
||||
"status.reblogs": "{count, plural, one {adhesión} other {adhesiones}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al hilo",
|
||||
"status.report": "Denunciar a @{name}",
|
||||
"status.request_quote": "Solicitud para citar",
|
||||
"status.revoke_quote": "Eliminar mi mensaje de la cita de @{name}",
|
||||
"status.sensitive_warning": "Contenido sensible",
|
||||
"status.share": "Compartir",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Agregá imágenes, o un archivo de audio o video",
|
||||
"upload_error.limit": "Se excedió el límite de subida de archivos.",
|
||||
"upload_error.poll": "No se permite la subida de archivos en encuestas.",
|
||||
"upload_error.quote": "No se permite subir archivos con citas.",
|
||||
"upload_form.drag_and_drop.instructions": "Para recoger un archivo multimedia, pulsá la barra espaciadora o la tecla Enter. Mientras arrastrás, usá las teclas de flecha para mover el archivo multimedia en cualquier dirección. Volvé a pulsar la barra espaciadora o la tecla Enter para soltar el archivo multimedia en su nueva posición, o pulsá la tecla Escape para cancelar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Se canceló el arrastre. Se eliminó el archivo adjunto {item}.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} fue soltado.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Subir volumen",
|
||||
"visibility_modal.button_title": "Establecer visibilidad",
|
||||
"visibility_modal.header": "Visibilidad e interacción",
|
||||
"visibility_modal.helper.direct_quoting": "No se pueden citar las menciones privadas.",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas redactadas en Mastodon no pueden ser citadas por otras cuentas.",
|
||||
"visibility_modal.helper.privacy_editing": "No se puede cambiar la visibilidad a los mensajes ya enviados.",
|
||||
"visibility_modal.helper.private_quoting": "No se pueden citar los mensajes destinados solo a seguidores.",
|
||||
"visibility_modal.helper.private_quoting": "Los mensajes solo para seguidores redactados en Mastodon no pueden ser citados por otras cuentas.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando otras cuentas te citen, sus publicaciones también se ocultarán de las líneas temporales de tendencias.",
|
||||
"visibility_modal.instructions": "Controlá quién puede interactuar con este mensaje. Los ajustes globales se pueden encontrar en <link>«Configuración» > «Otras opciones»</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidad",
|
||||
"visibility_modal.quote_followers": "Solo para seguidores",
|
||||
"visibility_modal.quote_label": "Cambiá quién puede citar",
|
||||
"visibility_modal.quote_nobody": "Ninguna cuenta",
|
||||
"visibility_modal.quote_public": "Cualquier cuenta"
|
||||
"visibility_modal.quote_nobody": "Solo yo",
|
||||
"visibility_modal.quote_public": "Cualquier cuenta",
|
||||
"visibility_modal.save": "Guardar"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Abrir cronología principal",
|
||||
"keyboard_shortcuts.hotkey": "Tecla de acceso rápido",
|
||||
"keyboard_shortcuts.legend": "Mostrar esta leyenda",
|
||||
"keyboard_shortcuts.load_more": "Enfoque en el botón \"Cargar más\"",
|
||||
"keyboard_shortcuts.local": "Abrir cronología local",
|
||||
"keyboard_shortcuts.mention": "Mencionar al autor",
|
||||
"keyboard_shortcuts.muted": "Abrir la lista de usuarios silenciados",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Abrir multimedia",
|
||||
"keyboard_shortcuts.pinned": "Abrir la lista de publicaciones fijadas",
|
||||
"keyboard_shortcuts.profile": "Abrir perfil del autor",
|
||||
"keyboard_shortcuts.quote": "Citar publicación",
|
||||
"keyboard_shortcuts.reply": "Responder a la publicación",
|
||||
"keyboard_shortcuts.requests": "Abrir lista de solicitudes de seguimiento",
|
||||
"keyboard_shortcuts.search": "Enfocar la barra de búsqueda",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
|
||||
"notification.own_poll": "Tu encuesta ha terminado",
|
||||
"notification.poll": "Una encuesta en la que has votado ha terminado",
|
||||
"notification.quoted_update": "{name} editó una publicación que has citado",
|
||||
"notification.reblog": "{name} ha impulsado tu publicación",
|
||||
"notification.reblog.name_and_others_with_link": "{name} y <a>{count, plural, one {# otro} other {# otros}}</a> impulsaron tu publicación",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Seguidores",
|
||||
"privacy.public.long": "Cualquiera dentro y fuera de Mastodon",
|
||||
"privacy.public.short": "Público",
|
||||
"privacy.quote.anyone": "{visibility}, cualquiera puede citar",
|
||||
"privacy.quote.disabled": "{visibility}, citas desactivadas",
|
||||
"privacy.quote.limited": "{visibility}, citas limitadas",
|
||||
"privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que el post no aparecerá en las cronologías en directo o en las etiquetas, la exploración o busquedas en Mastodon, incluso si está optado por activar la cuenta de usuario.",
|
||||
"privacy.unlisted.long": "Menos fanfares algorítmicos",
|
||||
"privacy.unlisted.short": "Público silencioso",
|
||||
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
||||
"privacy_policy.title": "Política de Privacidad",
|
||||
"quote_error.poll": "No se permite citar encuestas.",
|
||||
"quote_error.quote": "Solo se permite una cita a la vez.",
|
||||
"quote_error.unauthorized": "No estás autorizado a citar esta publicación.",
|
||||
"quote_error.upload": "No se permite citar con archivos multimedia.",
|
||||
"recommended": "Recomendado",
|
||||
"refresh": "Actualizar",
|
||||
"regeneration_indicator.please_stand_by": "Espera, por favor.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Abrir interfaz de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interfaz de moderación para {domain}",
|
||||
"status.admin_status": "Abrir este estado en la interfaz de moderación",
|
||||
"status.all_disabled": "Los impulsos y las citas están desactivadas",
|
||||
"status.block": "Bloquear a @{name}",
|
||||
"status.bookmark": "Añadir marcador",
|
||||
"status.cancel_reblog_private": "Deshacer impulso",
|
||||
"status.cannot_quote": "El autor ha desactivado las citas de esta publicación",
|
||||
"status.cannot_reblog": "Esta publicación no puede ser impulsada",
|
||||
"status.context.load_new_replies": "Nuevas respuestas disponibles",
|
||||
"status.context.loading": "Comprobando si hay más respuestas",
|
||||
"status.continued_thread": "Hilo continuado",
|
||||
"status.copy": "Copiar enlace al estado",
|
||||
"status.delete": "Borrar",
|
||||
"status.delete.success": "Publicación eliminada",
|
||||
"status.detailed_status": "Vista de conversación detallada",
|
||||
"status.direct": "Mención privada @{name}",
|
||||
"status.direct_indicator": "Mención privada",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir estado",
|
||||
"status.pin": "Fijar",
|
||||
"status.quote": "Cita",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Publicación no disponible",
|
||||
"status.quote_error.pending_approval": "Publicación pendiente",
|
||||
"status.quote_error.pending_approval_popout.body": "Las citas compartidas en el Fediverso pueden tardar en mostrarse, ya que cada servidor tiene un protocolo diferente.",
|
||||
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
|
||||
"status.quote_followers_only": "Solo los seguidores pueden citar esta publicación",
|
||||
"status.quote_manual_review": "El autor la revisará manualmente",
|
||||
"status.quote_policy_change": "Cambia quién puede citarte",
|
||||
"status.quote_post_author": "Ha citado una publicación de @{name}",
|
||||
"status.quote_private": "Las publicaciones privadas no pueden citarse",
|
||||
"status.quotes": "{count, plural,one {cita} other {citas}}",
|
||||
"status.quotes.empty": "Nadie ha citado esta publicación todavía. Cuando alguien lo haga, aparecerá aquí.",
|
||||
"status.read_more": "Leer más",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_or_quote": "Impulsar o citar",
|
||||
"status.reblog_private": "Implusar a la audiencia original",
|
||||
"status.reblogged_by": "Impulsado por {name}",
|
||||
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al hilo",
|
||||
"status.report": "Reportar @{name}",
|
||||
"status.request_quote": "Solicitud de citación",
|
||||
"status.revoke_quote": "Eliminar mi publicación de la cita de @{name}",
|
||||
"status.sensitive_warning": "Contenido sensible",
|
||||
"status.share": "Compartir",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Límite de subida de archivos excedido.",
|
||||
"upload_error.poll": "No se permite subir archivos con las encuestas.",
|
||||
"upload_error.quote": "No se permite subir archivos a las citas.",
|
||||
"upload_form.drag_and_drop.instructions": "Para recoger un archivo adjunto, pulsa la barra espaciadora o la tecla Intro. Mientras arrastras, usa las teclas de flecha para mover el archivo adjunto en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Intro para soltar el archivo adjunto en su nueva posición, o pulsa la tecla Escape para cancelar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Arrastre cancelado. El archivo adjunto {item} fue eliminado.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} fue eliminado.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Subir el volumen",
|
||||
"visibility_modal.button_title": "Establece la visibilidad",
|
||||
"visibility_modal.header": "Visibilidad e interacción",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas no pueden citarse.",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas creadas en Mastodon no pueden ser citadas por otros.",
|
||||
"visibility_modal.helper.privacy_editing": "Las publicaciones ya enviadas no pueden cambiar su visibilidad.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones solo para seguidores creadas en Mastodon no pueden ser citadas por otros.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando las personas te citen, sus publicaciones también se ocultarán de las cronologías de tendencias.",
|
||||
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. La configuración global se encuentra en <link>Preferencias > Otros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidad",
|
||||
"visibility_modal.quote_followers": "Solo seguidores",
|
||||
"visibility_modal.quote_label": "Cambia quién puede citarte",
|
||||
"visibility_modal.quote_nobody": "Nadie",
|
||||
"visibility_modal.quote_public": "Cualquiera"
|
||||
"visibility_modal.quote_nobody": "Solo yo",
|
||||
"visibility_modal.quote_public": "Cualquiera",
|
||||
"visibility_modal.save": "Guardar"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Abrir cronología principal",
|
||||
"keyboard_shortcuts.hotkey": "Tecla rápida",
|
||||
"keyboard_shortcuts.legend": "Mostrar esta leyenda",
|
||||
"keyboard_shortcuts.load_more": "Poner el foco en el botón \"Cargar más\"",
|
||||
"keyboard_shortcuts.local": "Abrir cronología local",
|
||||
"keyboard_shortcuts.mention": "Mencionar autor",
|
||||
"keyboard_shortcuts.muted": "Abrir lista de usuarios silenciados",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Abrir multimedia",
|
||||
"keyboard_shortcuts.pinned": "Abrir la lista de publicaciones destacadas",
|
||||
"keyboard_shortcuts.profile": "Abrir perfil del autor",
|
||||
"keyboard_shortcuts.quote": "Citar publicación",
|
||||
"keyboard_shortcuts.reply": "Responder a una publicación",
|
||||
"keyboard_shortcuts.requests": "Abrir lista de solicitudes de seguimiento",
|
||||
"keyboard_shortcuts.search": "Focalizar barra de búsqueda",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
|
||||
"notification.own_poll": "Tu encuesta ha terminado",
|
||||
"notification.poll": "Una encuesta ha terminado",
|
||||
"notification.quoted_update": "{name} editó una publicación que has citado",
|
||||
"notification.reblog": "{name} ha impulsado tu publicación",
|
||||
"notification.reblog.name_and_others_with_link": "{name} y <a>{count, plural, one {# más} other {# más}}</a> impulsaron tu publicación",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Seguidores",
|
||||
"privacy.public.long": "Visible por todo el mundo, dentro y fuera de Mastodon",
|
||||
"privacy.public.short": "Pública",
|
||||
"privacy.quote.anyone": "{visibility}, cualquiera puede citar",
|
||||
"privacy.quote.disabled": "{visibility}, citas deshabilitadas",
|
||||
"privacy.quote.limited": "{visibility}, citas limitadas",
|
||||
"privacy.unlisted.additional": "Se comporta exactamente igual que la visibilidad pública, excepto que la publicación no aparecerá en las cronologías públicas o en las etiquetas, la sección de Explorar o la búsqueda de Mastodon, incluso si has habilitado la opción de búsqueda en tu perfil.",
|
||||
"privacy.unlisted.long": "Sin algoritmos de descubrimiento",
|
||||
"privacy.unlisted.short": "Pública silenciosa",
|
||||
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
||||
"privacy_policy.title": "Política de Privacidad",
|
||||
"quote_error.poll": "No es posible citar encuestas.",
|
||||
"quote_error.quote": "Solo se permite una cita a la vez.",
|
||||
"quote_error.unauthorized": "No tienes permiso para citar esta publicación.",
|
||||
"quote_error.upload": "No se permite citar con archivos multimedia.",
|
||||
"recommended": "Recomendado",
|
||||
"refresh": "Actualizar",
|
||||
"regeneration_indicator.please_stand_by": "Espera, por favor.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Abrir interfaz de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interfaz de moderación para {domain}",
|
||||
"status.admin_status": "Abrir esta publicación en la interfaz de moderación",
|
||||
"status.all_disabled": "Los impulsos y las citas están deshabilitados",
|
||||
"status.block": "Bloquear a @{name}",
|
||||
"status.bookmark": "Añadir marcador",
|
||||
"status.cancel_reblog_private": "Deshacer impulso",
|
||||
"status.cannot_quote": "El autor ha deshabilitado las citas en esta publicación",
|
||||
"status.cannot_reblog": "Esta publicación no se puede impulsar",
|
||||
"status.context.load_new_replies": "Hay nuevas respuestas",
|
||||
"status.context.loading": "Buscando más respuestas",
|
||||
"status.continued_thread": "Continuó el hilo",
|
||||
"status.copy": "Copiar enlace a la publicación",
|
||||
"status.delete": "Borrar",
|
||||
"status.delete.success": "Publicación eliminada",
|
||||
"status.detailed_status": "Vista de conversación detallada",
|
||||
"status.direct": "Mención privada @{name}",
|
||||
"status.direct_indicator": "Mención privada",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Silenciar conversación",
|
||||
"status.open": "Expandir publicación",
|
||||
"status.pin": "Fijar",
|
||||
"status.quote": "Cita",
|
||||
"status.quote.cancel": "Cancelar cita",
|
||||
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
|
||||
"status.quote_error.not_available": "Publicación no disponible",
|
||||
"status.quote_error.pending_approval": "Publicación pendiente",
|
||||
"status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que los diferentes servidores tienen diferentes protocolos.",
|
||||
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
|
||||
"status.quote_followers_only": "Solo los seguidores pueden citar esta publicación",
|
||||
"status.quote_manual_review": "El autor revisará manualmente",
|
||||
"status.quote_policy_change": "Cambia quién puede citarte",
|
||||
"status.quote_post_author": "Ha citado una publicación de @{name}",
|
||||
"status.quote_private": "Las publicaciones privadas no pueden ser citadas",
|
||||
"status.quotes": "{count, plural,one {cita} other {citas}}",
|
||||
"status.quotes.empty": "Nadie ha citado esta publicación todavía. Cuando alguien lo haga, aparecerá aquí.",
|
||||
"status.read_more": "Leer más",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_or_quote": "Impulsar o citar",
|
||||
"status.reblog_private": "Impulsar a la audiencia original",
|
||||
"status.reblogged_by": "Impulsado por {name}",
|
||||
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al hilo",
|
||||
"status.report": "Reportar a @{name}",
|
||||
"status.request_quote": "Solicitud de citación",
|
||||
"status.revoke_quote": "Eliminar mi publicación de la cita de {name}",
|
||||
"status.sensitive_warning": "Contenido sensible",
|
||||
"status.share": "Compartir",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Añadir imágenes, un fichero de vídeo o de audio",
|
||||
"upload_error.limit": "Límite de subida de archivos excedido.",
|
||||
"upload_error.poll": "No se permite la subida de archivos con encuestas.",
|
||||
"upload_error.quote": "No se permite subir archivos a las citas.",
|
||||
"upload_form.drag_and_drop.instructions": "Para recoger un archivo multimedia, pulsa la barra espaciadora o la tecla Enter. Mientras arrastras, utiliza las teclas de flecha para mover el archivo multimedia en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Enter para soltar el archivo multimedia en su nueva posición, o pulsa Escape para cancelar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Se canceló el arrastre. Se eliminó el archivo adjunto {item}.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} ha sido eliminado.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Subir volumen",
|
||||
"visibility_modal.button_title": "Configura la visibilidad",
|
||||
"visibility_modal.header": "Visibilidad e interacciones",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas no se pueden citar.",
|
||||
"visibility_modal.helper.privacy_editing": "Las publicaciones no pueden cambiar su visibilidad.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.",
|
||||
"visibility_modal.helper.direct_quoting": "Las menciones privadas publicadas en Mastodon no pueden ser citadas por otros usuarios.",
|
||||
"visibility_modal.helper.privacy_editing": "Una vez publicada, no se puede cambiar su visibilidad.",
|
||||
"visibility_modal.helper.private_quoting": "Las publicaciones solo para seguidores hechas en Mastodon no pueden ser citadas por otros usuarios.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando la gente te cite, su publicación tampoco se mostrará en las cronologías públicas.",
|
||||
"visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. Puedes encontrar los ajustes globales en <link>Preferencias > Otros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidad",
|
||||
"visibility_modal.quote_followers": "Sólo seguidores",
|
||||
"visibility_modal.quote_label": "Cambia quién puede citarte",
|
||||
"visibility_modal.quote_nobody": "Nadie",
|
||||
"visibility_modal.quote_public": "Cualquiera"
|
||||
"visibility_modal.quote_nobody": "Solo yo",
|
||||
"visibility_modal.quote_public": "Cualquiera",
|
||||
"visibility_modal.save": "Guardar"
|
||||
}
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"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.revoke_quote.confirm": "Eemalda postitus",
|
||||
"confirmations.revoke_quote.message": "Seda tegevust ei saa tagasi pöörata.",
|
||||
"confirmations.revoke_quote.title": "Kas eemaldame postituse?",
|
||||
"confirmations.unfollow.confirm": "Ära jälgi",
|
||||
"confirmations.unfollow.message": "Oled kindel, et ei soovi rohkem jälgida kasutajat {name}?",
|
||||
"confirmations.unfollow.title": "Ei jälgi enam kasutajat?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Sinu tunnus:",
|
||||
"domain_pill.your_server": "Sinu digitaalne kodu, kus on kõik sinu postitused. Sulle ei meeldi see? Vaheta mistahes ajal serverit ja võta jälgijad ka.",
|
||||
"domain_pill.your_username": "Sinu unikaalne identifikaator siin serveris. On võimalik, et leiad teistes serverites samasuguse kasutajanimega kasutajaid.",
|
||||
"dropdown.empty": "Vali üks variantidest",
|
||||
"embed.instructions": "Lisa see postitus oma veebilehele, kopeerides alloleva koodi.",
|
||||
"embed.preview": "Nii näeb see välja:",
|
||||
"emoji_button.activity": "Tegevus",
|
||||
|
@ -479,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Ava kodu ajajoon",
|
||||
"keyboard_shortcuts.hotkey": "Kiirklahv",
|
||||
"keyboard_shortcuts.legend": "Kuva see legend",
|
||||
"keyboard_shortcuts.load_more": "Fookus „Laadi veel“ nupule",
|
||||
"keyboard_shortcuts.local": "Ava kohalik ajajoon",
|
||||
"keyboard_shortcuts.mention": "Maini autorit",
|
||||
"keyboard_shortcuts.muted": "Ava vaigistatud kasutajate loetelu",
|
||||
|
@ -600,6 +605,7 @@
|
|||
"notification.label.mention": "Mainimine",
|
||||
"notification.label.private_mention": "Privaatne mainimine",
|
||||
"notification.label.private_reply": "Privaatne vastus",
|
||||
"notification.label.quote": "{name} tsiteeris sinu postitust",
|
||||
"notification.label.reply": "Vastus",
|
||||
"notification.mention": "Mainimine",
|
||||
"notification.mentioned_you": "{name} mainis sind",
|
||||
|
@ -614,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Su konto on peatatud.",
|
||||
"notification.own_poll": "Su küsitlus on lõppenud",
|
||||
"notification.poll": "Hääletus, millel osalesid, on lõppenud",
|
||||
"notification.quoted_update": "{name} on muutnud sinu poolt tsiteeritud postitust",
|
||||
"notification.reblog": "{name} jagas edasi postitust",
|
||||
"notification.reblog.name_and_others_with_link": "{name} ja <a>{count, plural, one {# veel} other {# teist}}</a> jagas su postitust",
|
||||
"notification.relationships_severance_event": "Kadunud ühendus kasutajaga {name}",
|
||||
|
@ -657,6 +664,7 @@
|
|||
"notifications.column_settings.mention": "Mainimised:",
|
||||
"notifications.column_settings.poll": "Küsitluse tulemused:",
|
||||
"notifications.column_settings.push": "Push teated",
|
||||
"notifications.column_settings.quote": "Tsitaadid:",
|
||||
"notifications.column_settings.reblog": "Jagamised:",
|
||||
"notifications.column_settings.show": "Kuva tulbas",
|
||||
"notifications.column_settings.sound": "Mängi heli",
|
||||
|
@ -732,11 +740,18 @@
|
|||
"privacy.private.short": "Jälgijad",
|
||||
"privacy.public.long": "Nii kasutajad kui mittekasutajad",
|
||||
"privacy.public.short": "Avalik",
|
||||
"privacy.quote.anyone": "{visibility}, kõik võivad tsiteerida",
|
||||
"privacy.quote.disabled": "{visibility}, tsiteerimine pole lubatud",
|
||||
"privacy.quote.limited": "{visibility}, tsiteerimine on piiratud",
|
||||
"privacy.unlisted.additional": "See on olemuselt küll avalik, aga postitus ei ilmu voogudes ega märksõnades, lehitsedes ega Mastodoni otsingus, isegi kui konto on seadistustes avalik.",
|
||||
"privacy.unlisted.long": "Vähem algoritmilisi teavitusi",
|
||||
"privacy.unlisted.short": "Vaikselt avalik",
|
||||
"privacy_policy.last_updated": "Viimati uuendatud {date}",
|
||||
"privacy_policy.title": "Isikuandmete kaitse",
|
||||
"quote_error.poll": "Tsiteerimine pole küsitlustes lubatud.",
|
||||
"quote_error.quote": "Korraga on lubatud vaid üks tsitaat.",
|
||||
"quote_error.unauthorized": "Sul pole õigust seda postitust tsiteerida.",
|
||||
"quote_error.upload": "Tsiteerimine pole manuste puhul lubatud.",
|
||||
"recommended": "Soovitatud",
|
||||
"refresh": "Värskenda",
|
||||
"regeneration_indicator.please_stand_by": "Palun oota.",
|
||||
|
@ -843,9 +858,11 @@
|
|||
"status.admin_account": "Ava @{name} moderaatorivaates",
|
||||
"status.admin_domain": "Ava {domain} modeereerimisliides",
|
||||
"status.admin_status": "Ava postitus moderaatorivaates",
|
||||
"status.all_disabled": "Hooandmine ja tsiteerimine pole lubatud",
|
||||
"status.block": "Blokeeri @{name}",
|
||||
"status.bookmark": "Järjehoidja",
|
||||
"status.cancel_reblog_private": "Lõpeta jagamine",
|
||||
"status.cannot_quote": "Autor ei luba selle postituse tsiteerimist",
|
||||
"status.cannot_reblog": "Seda postitust ei saa jagada",
|
||||
"status.context.load_new_replies": "Leidub uusi vastuseid",
|
||||
"status.context.loading": "Kontrollin täiendavate vastuste olemasolu",
|
||||
|
@ -864,7 +881,7 @@
|
|||
"status.filter": "Filtreeri seda postitust",
|
||||
"status.history.created": "{name} lõi {date}",
|
||||
"status.history.edited": "{name} muutis {date}",
|
||||
"status.load_more": "Lae rohkem",
|
||||
"status.load_more": "Laadi veel",
|
||||
"status.media.open": "Avamiseks klõpsa",
|
||||
"status.media.show": "Näitamiseks klõpsa",
|
||||
"status.media_hidden": "Meedia peidetud",
|
||||
|
@ -874,12 +891,17 @@
|
|||
"status.mute_conversation": "Vaigista vestlus",
|
||||
"status.open": "Laienda postitus",
|
||||
"status.pin": "Kinnita profiilile",
|
||||
"status.quote": "Tsiteeri",
|
||||
"status.quote.cancel": "Katkesta tsiteerimine",
|
||||
"status.quote_error.filtered": "Peidetud mõne kasutatud filtri tõttu",
|
||||
"status.quote_error.not_available": "Postitus pole saadaval",
|
||||
"status.quote_error.pending_approval": "Postitus on ootel",
|
||||
"status.quote_error.pending_approval_popout.body": "Kuna erinevates serverites on erinevad reeglid, siis üle Födiversumi jagatud tsitaatide kuvamine võib võtta aega.",
|
||||
"status.quote_error.pending_approval_popout.title": "Tsiteerimine on ootel? Palun jää rahulikuks",
|
||||
"status.quote_policy_change": "Muuda neid, kes võivad tsiteerida",
|
||||
"status.quote_post_author": "Tsiteeris kasutaja @{name} postitust",
|
||||
"status.quote_private": "Otsepostituste tsiteerimine pole võimalik",
|
||||
"status.quotes": "{count, plural, one {# tsiteerimine} other {# tsiteerimist}}",
|
||||
"status.read_more": "Loe veel",
|
||||
"status.reblog": "Jaga",
|
||||
"status.reblog_private": "Jaga algse nähtavusega",
|
||||
|
@ -894,6 +916,7 @@
|
|||
"status.reply": "Vasta",
|
||||
"status.replyAll": "Vasta lõimele",
|
||||
"status.report": "Raporteeri @{name}",
|
||||
"status.revoke_quote": "Eemalda minu tsitaat postituses, mille tegi @{name}",
|
||||
"status.sensitive_warning": "Tundlik sisu",
|
||||
"status.share": "Jaga",
|
||||
"status.show_less_all": "Peida kogu tundlik sisu",
|
||||
|
@ -927,11 +950,12 @@
|
|||
"units.short.billion": "{count} mld",
|
||||
"units.short.million": "{count} mln",
|
||||
"units.short.thousand": "{count} tuh",
|
||||
"upload_area.title": "Lohista & aseta üleslaadimiseks",
|
||||
"upload_button.label": "Lisa meedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Faili üleslaadimise limiit ületatud.",
|
||||
"upload_area.title": "Lohista ja aseta üleslaadimiseks",
|
||||
"upload_button.label": "Lisa pilte, üks video- või helifail",
|
||||
"upload_error.limit": "Faili üleslaadimise piir ületatud.",
|
||||
"upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.",
|
||||
"upload_form.drag_and_drop.instructions": "Vajuta tühikut või enterit, et tõsta manus. Lohistamise ajal kasuta nooleklahve, et manust liigutada teatud suunas. Vajuta tühikut või enterit uuesti, et paigutada manus oma uuele kohale, või escape tühistamiseks.",
|
||||
"upload_error.quote": "Tsiteerimisel pole faili üleslaadimine lubatud.",
|
||||
"upload_form.drag_and_drop.instructions": "Manuse valimiseks vajuta tühikut või sisestusklahvi. Lohistamise ajal kasuta nooleklahve, et manust liigutada teatud suunas. Vajuta tühikut või enterit uuesti, et paigutada manus oma uuele kohale, või escape tühistamiseks.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Lohistamine tühistati. Manus {item} on asetatud.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Manus {item} on asetatud.",
|
||||
"upload_form.drag_and_drop.on_drag_over": "Manus {item} on liigutatud.",
|
||||
|
@ -941,7 +965,7 @@
|
|||
"upload_progress.processing": "Töötlen…",
|
||||
"username.taken": "See kasutajanimi on juba kasutusel. Proovi teist",
|
||||
"video.close": "Sulge video",
|
||||
"video.download": "Faili allalaadimine",
|
||||
"video.download": "Laadi fail alla",
|
||||
"video.exit_fullscreen": "Välju täisekraanist",
|
||||
"video.expand": "Suurenda video",
|
||||
"video.fullscreen": "Täisekraan",
|
||||
|
@ -953,5 +977,18 @@
|
|||
"video.skip_forward": "Keri edasi",
|
||||
"video.unmute": "Lõpeta vaigistamine",
|
||||
"video.volume_down": "Heli vaiksemaks",
|
||||
"video.volume_up": "Heli valjemaks"
|
||||
"video.volume_up": "Heli valjemaks",
|
||||
"visibility_modal.button_title": "Muuda nähtavust",
|
||||
"visibility_modal.header": "Nähtavus ja kasutus",
|
||||
"visibility_modal.helper.direct_quoting": "Ainult mainituile mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida.",
|
||||
"visibility_modal.helper.privacy_editing": "Avaldatud postitused ei saa muuta oma nähtavust.",
|
||||
"visibility_modal.helper.private_quoting": "Ainult jälgijatele mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kui teised kasutajad sind tsiteerivad, siis nende postitused peidetakse ajajoonelt, mis näitavad populaarsust koguvaid postitusi.",
|
||||
"visibility_modal.instructions": "Halda seda, kes võivad antud postitust kasutada. Üldised seadistused leiduvad siin: <link>Eelistused > Muu</link>.",
|
||||
"visibility_modal.privacy_label": "Privaatsus",
|
||||
"visibility_modal.quote_followers": "Ainult jälgijad",
|
||||
"visibility_modal.quote_label": "Muuda seda, kes võivad tsiteerida",
|
||||
"visibility_modal.quote_nobody": "Ainult mina",
|
||||
"visibility_modal.quote_public": "Kõik",
|
||||
"visibility_modal.save": "Salvesta"
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
"account.followers": "پیگیرندگان",
|
||||
"account.followers.empty": "هنوز کسی پیگیر این کاربر نیست.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} پیگیرنده} other {{counter} پیگیرنده}}",
|
||||
"account.followers_you_know_counter": "{counter} را میشناسید",
|
||||
"account.followers_you_know_counter": "{counter} نفر را میشناسید",
|
||||
"account.following": "پی میگیرید",
|
||||
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
|
||||
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
|
||||
|
@ -880,6 +880,8 @@
|
|||
"status.mute_conversation": "خموشاندن گفتوگو",
|
||||
"status.open": "گسترش این فرسته",
|
||||
"status.pin": "سنجاق به نمایه",
|
||||
"status.quote": "نقلقول",
|
||||
"status.quote.cancel": "لغو نقل",
|
||||
"status.quote_error.filtered": "نهفته بنا بر یکی از پالایههایتان",
|
||||
"status.quote_error.not_available": "فرسته در دسترس نیست",
|
||||
"status.quote_error.pending_approval": "فرسته منتظر",
|
||||
|
@ -964,14 +966,11 @@
|
|||
"video.volume_up": "افزایش حجم صدا",
|
||||
"visibility_modal.button_title": "تنظیم نمایانی",
|
||||
"visibility_modal.header": "نمایانی و برهمکنش",
|
||||
"visibility_modal.helper.direct_quoting": "نامبریهای خصوصی قابل نقل نیستند.",
|
||||
"visibility_modal.helper.privacy_editing": "نمیتوان نمایانی فرستههای منتشر شده را تغییر داد.",
|
||||
"visibility_modal.helper.private_quoting": "فرستههای فقط برای پیگیرندگان نمیتوانند نقل شوند.",
|
||||
"visibility_modal.helper.unlisted_quoting": "هنگامی که افراد نقلتان میکنند فرستهشان هم از خطزمانیهای داغ پنهان خواهد بود.",
|
||||
"visibility_modal.instructions": "واپایش کسانی که میتوانند با این فرسته برهمکنش داشته باشند. تنظیمات سراسری میتواند در <link>ترجیحات > دیگر</link> پیدا شود.",
|
||||
"visibility_modal.privacy_label": "محرمانگی",
|
||||
"visibility_modal.quote_followers": "فقط پیگیرندگان",
|
||||
"visibility_modal.quote_label": "تغییر کسانی که میتوانند نقل کنند",
|
||||
"visibility_modal.quote_nobody": "هیچکس",
|
||||
"visibility_modal.quote_public": "هرکسی"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Avaa kotiaikajana",
|
||||
"keyboard_shortcuts.hotkey": "Pikanäppäin",
|
||||
"keyboard_shortcuts.legend": "Näytä tämä ohje",
|
||||
"keyboard_shortcuts.load_more": "Kohdista ”Lataa lisää” -painikkeeseen",
|
||||
"keyboard_shortcuts.local": "Avaa paikallinen aikajana",
|
||||
"keyboard_shortcuts.mention": "Mainitse tekijä",
|
||||
"keyboard_shortcuts.muted": "Avaa mykistettyjen käyttäjien luettelo",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Avaa media",
|
||||
"keyboard_shortcuts.pinned": "Avaa kiinnitettyjen julkaisujen luettelo",
|
||||
"keyboard_shortcuts.profile": "Avaa tekijän profiili",
|
||||
"keyboard_shortcuts.quote": "Lainaa julkaisua",
|
||||
"keyboard_shortcuts.reply": "Vastaa julkaisuun",
|
||||
"keyboard_shortcuts.requests": "Avaa seurantapyyntöjen luettelo",
|
||||
"keyboard_shortcuts.search": "Kohdista hakukenttään",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tilisi on jäädytetty.",
|
||||
"notification.own_poll": "Äänestyksesi on päättynyt",
|
||||
"notification.poll": "Äänestys, johon osallistuit, on päättynyt",
|
||||
"notification.quoted_update": "{name} muokkasi lainaamaasi julkaisua",
|
||||
"notification.reblog": "{name} tehosti julkaisuasi",
|
||||
"notification.reblog.name_and_others_with_link": "{name} ja <a>{count, plural, one {# muu} other {# muuta}}</a> tehostivat julkaisuasi",
|
||||
"notification.relationships_severance_event": "Menetettiin yhteydet palvelimeen {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Seuraajat",
|
||||
"privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella",
|
||||
"privacy.public.short": "Julkinen",
|
||||
"privacy.quote.anyone": "{visibility}, kuka vain voi lainata",
|
||||
"privacy.quote.disabled": "{visibility}, lainaukset poissa käytöstä",
|
||||
"privacy.quote.limited": "{visibility}, lainauksia rajoitettu",
|
||||
"privacy.unlisted.additional": "Tämä toimii muuten kuin julkinen, mutta julkaisut eivät näy livesyöte-, aihetunniste- tai selausnäkymissä eivätkä Mastodonin hakutuloksissa, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.",
|
||||
"privacy.unlisted.long": "Vähemmän algoritmiperusteista sisältöä",
|
||||
"privacy.unlisted.short": "Vaivihkaisesti julkinen",
|
||||
"privacy_policy.last_updated": "Päivitetty viimeksi {date}",
|
||||
"privacy_policy.title": "Tietosuojakäytäntö",
|
||||
"quote_error.poll": "Äänestysten lainaaminen ei ole sallittua.",
|
||||
"quote_error.quote": "Vain yksi lainaus kerrallaan on sallittu.",
|
||||
"quote_error.unauthorized": "Sinulla ei ole valtuuksia lainata tätä julkaisua.",
|
||||
"quote_error.upload": "Medialiitteiden lainaaminen ei ole sallittua.",
|
||||
"recommended": "Suositellaan",
|
||||
"refresh": "Päivitä",
|
||||
"regeneration_indicator.please_stand_by": "Ole valmiina.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Avaa tilin @{name} moderointinäkymä",
|
||||
"status.admin_domain": "Avaa palvelimen {domain} moderointinäkymä",
|
||||
"status.admin_status": "Avaa julkaisu moderointinäkymässä",
|
||||
"status.all_disabled": "Tehostukset ja lainaukset ovat poissa käytöstä",
|
||||
"status.block": "Estä @{name}",
|
||||
"status.bookmark": "Lisää kirjanmerkki",
|
||||
"status.cancel_reblog_private": "Peru tehostus",
|
||||
"status.cannot_quote": "Julkaisun tekijä on poistanut lainaamisen käytöstä",
|
||||
"status.cannot_reblog": "Tätä julkaisua ei voi tehostaa",
|
||||
"status.context.load_new_replies": "Uusia vastauksia saatavilla",
|
||||
"status.context.loading": "Tarkistetaan lisävastauksia",
|
||||
"status.continued_thread": "Jatkoi ketjua",
|
||||
"status.copy": "Kopioi linkki julkaisuun",
|
||||
"status.delete": "Poista",
|
||||
"status.delete.success": "Julkaisu poistettu",
|
||||
"status.detailed_status": "Yksityiskohtainen keskustelunäkymä",
|
||||
"status.direct": "Mainitse @{name} yksityisesti",
|
||||
"status.direct_indicator": "Yksityismaininta",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Mykistä keskustelu",
|
||||
"status.open": "Laajenna julkaisu",
|
||||
"status.pin": "Kiinnitä profiiliin",
|
||||
"status.quote": "Lainaa",
|
||||
"status.quote.cancel": "Peruuta lainaus",
|
||||
"status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia",
|
||||
"status.quote_error.not_available": "Julkaisu ei saatavilla",
|
||||
"status.quote_error.pending_approval": "Julkaisu odottaa",
|
||||
"status.quote_error.pending_approval_popout.body": "Saattaa viedä jonkin ainaa ennen kuin fediversumin kautta jaetut julkaisut tulevat näkyviin, sillä eri palvelimet käyttävät eri protokollia.",
|
||||
"status.quote_error.pending_approval_popout.title": "Odottava lainaus? Pysy rauhallisena",
|
||||
"status.quote_followers_only": "Vain seuraajat voivat lainata tätä julkaisua",
|
||||
"status.quote_manual_review": "Tekijä arvioi pyynnön manuaalisesti",
|
||||
"status.quote_policy_change": "Vaihda, kuka voi lainata",
|
||||
"status.quote_post_author": "Lainaa käyttäjän @{name} julkaisua",
|
||||
"status.quote_private": "Yksityisiä julkaisuja ei voi lainata",
|
||||
"status.quotes": "{count, plural, one {lainaus} other {lainausta}}",
|
||||
"status.quotes.empty": "Kukaan ei ole vielä lainannut tätä julkaisua. Kun joku tekee niin, se tulee tähän näkyviin.",
|
||||
"status.read_more": "Näytä enemmän",
|
||||
"status.reblog": "Tehosta",
|
||||
"status.reblog_or_quote": "Tehosta tai lainaa",
|
||||
"status.reblog_private": "Tehosta alkuperäiselle yleisölle",
|
||||
"status.reblogged_by": "{name} tehosti",
|
||||
"status.reblogs": "{count, plural, one {tehostus} other {tehostusta}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Vastaa",
|
||||
"status.replyAll": "Vastaa ketjuun",
|
||||
"status.report": "Raportoi @{name}",
|
||||
"status.request_quote": "Pyydä lupaa lainata",
|
||||
"status.revoke_quote": "Poista julkaisuni käyttäjän @{name} julkaisusta",
|
||||
"status.sensitive_warning": "Arkaluonteista sisältöä",
|
||||
"status.share": "Jaa",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Lisää kuvia, video tai äänitiedosto",
|
||||
"upload_error.limit": "Tiedostolähetysten rajoitus ylitetty.",
|
||||
"upload_error.poll": "Tiedostojen lisääminen äänestysten oheen ei ole sallittua.",
|
||||
"upload_error.quote": "Tiedostojen lähettäminen ei ole sallittua lainauksissa.",
|
||||
"upload_form.drag_and_drop.instructions": "Valitse medialiite painamalla välilyöntiä tai enteriä. Vetäessäsi käytä nuolinäppäimiä siirtääksesi medialiitettä vastaavaan suuntaan. Paina välilyöntiä tai enteriä uudelleen pudottaaksesi medialiitteen uuteen kohtaansa, tai peru siirto painamalla escape-näppäintä.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Veto peruttiin. Medialiitettä {item} ei siirretty.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Medialiite {item} pudotettiin.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Lisää äänenvoimakkuutta",
|
||||
"visibility_modal.button_title": "Aseta näkyvyys",
|
||||
"visibility_modal.header": "Näkyvyys ja vuorovaikutus",
|
||||
"visibility_modal.helper.direct_quoting": "Yksityismainintoja ei voi lainata.",
|
||||
"visibility_modal.helper.direct_quoting": "Muut eivät voi lainata Mastodonissa kirjoitettuja yksityismainintoja.",
|
||||
"visibility_modal.helper.privacy_editing": "Lähetettyjen julkaisujen näkyvyyttä ei voi vaihtaa.",
|
||||
"visibility_modal.helper.private_quoting": "Vain seuraajille tarkoitettuja julkaisuja ei voi lainata.",
|
||||
"visibility_modal.helper.private_quoting": "Muut eivät voi lainata Mastodonissa kirjoitettuja, vain seuraajille tarkoitettuja julkaisuja.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kun ihmiset lainaavat sinua, myös heidän julkaisunsa piilotetaan suosittujen julkaisujen aikajanoilta.",
|
||||
"visibility_modal.instructions": "Hallitse, kuka voi olla vuorovaikutuksessa tämän julkaisun kanssa. Yleiset asetukset sijaitsevat kohdassa <link>Asetukset > Muut</link>.",
|
||||
"visibility_modal.privacy_label": "Yksityisyys",
|
||||
"visibility_modal.quote_followers": "Vain seuraajat",
|
||||
"visibility_modal.quote_label": "Vaihda, kuka voi lainata",
|
||||
"visibility_modal.quote_nobody": "Ei kukaan",
|
||||
"visibility_modal.quote_public": "Kuka tahansa"
|
||||
"visibility_modal.quote_nobody": "Vain minä",
|
||||
"visibility_modal.quote_public": "Kuka tahansa",
|
||||
"visibility_modal.save": "Tallenna"
|
||||
}
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
"account.edit_profile": "Baguhin ang profile",
|
||||
"account.enable_notifications": "Ipaalam sa akin kapag nag-post si @{name}",
|
||||
"account.endorse": "I-tampok sa profile",
|
||||
"account.familiar_followers_many": "Sinusundan nina {name1}, {name2}, at {othersCount, plural, one {# iba pa na kilala mo} other {# na iba pa na kilala mo}}",
|
||||
"account.familiar_followers_one": "Sinusindan ni/ng {name1}",
|
||||
"account.familiar_followers_two": "Sinusindan nina {name1} at {name2}",
|
||||
"account.featured": "Itinatampok",
|
||||
"account.featured_tags.last_status_at": "Huling post noong {date}",
|
||||
"account.featured_tags.last_status_never": "Walang mga post",
|
||||
|
@ -34,9 +37,11 @@
|
|||
"account.followers": "Mga tagasunod",
|
||||
"account.followers.empty": "Wala pang sumusunod sa tagagamit na ito.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} tagasunod} other {{counter} tagasunod}}",
|
||||
"account.followers_you_know_counter": "{counter} (na) kilala mo",
|
||||
"account.following": "Sinusundan",
|
||||
"account.following_counter": "{count, plural, one {{counter} sinusundan} other {{counter} sinusundan}}",
|
||||
"account.follows.empty": "Wala pang sinusundan ang tagagamit na ito.",
|
||||
"account.follows_you": "Sinusundan ka",
|
||||
"account.go_to_profile": "Pumunta sa profile",
|
||||
"account.hide_reblogs": "Itago ang mga pagpapalakas mula sa {name}",
|
||||
"account.in_memoriam": "Sa Alaala Ni.",
|
||||
|
@ -127,12 +132,14 @@
|
|||
"compose_form.reply": "Tumugon",
|
||||
"compose_form.spoiler.marked": "Tanggalin ang babala sa nilalaman",
|
||||
"compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman",
|
||||
"compose_form.spoiler_placeholder": "Babala sa nilalaman (hindi kinailangan)",
|
||||
"confirmation_modal.cancel": "Pagpaliban",
|
||||
"confirmations.block.confirm": "Harangan",
|
||||
"confirmations.delete.message": "Sigurado ka bang gusto mong burahin ang post na ito?",
|
||||
"confirmations.delete_list.confirm": "Tanggalin",
|
||||
"confirmations.delete_list.message": "Sigurado ka bang gusto mong burahin ang listahang ito?",
|
||||
"confirmations.discard_edit_media.confirm": "Ipagpaliban",
|
||||
"content_warning.hide": "Itago ang post",
|
||||
"content_warning.show_more": "Magpakita ng higit pa",
|
||||
"conversation.mark_as_read": "Markahan bilang nabasa na",
|
||||
"conversation.open": "Tingnan ang pag-uusap",
|
||||
|
@ -255,6 +262,8 @@
|
|||
"notification.mentioned_you": "Binanggit ka ni {name}",
|
||||
"notification.moderation-warning.learn_more": "Matuto nang higit pa",
|
||||
"notification.moderation_warning": "Mayroong kang natanggap na babala sa pagtitimpi",
|
||||
"notification.reblog": "Pinalakas ang iyong post ni {name}",
|
||||
"notification.reblog.name_and_others_with_link": "Pinalakas ang iyong post ni/ng {name} at <a>{count, plural,one {# iba pa} other {# na iba pa}}</a>",
|
||||
"notification.relationships_severance_event.learn_more": "Matuto nang higit pa",
|
||||
"notification_requests.accept": "Tanggapin",
|
||||
"notification_requests.maximize": "Palakihin",
|
||||
|
@ -342,6 +351,7 @@
|
|||
"search_results.see_all": "Ipakita lahat",
|
||||
"server_banner.server_stats": "Katayuan ng serbiro:",
|
||||
"status.block": "Harangan si @{name}",
|
||||
"status.cannot_reblog": "Hindi maaring mapalakas ang post na ito",
|
||||
"status.delete": "Tanggalin",
|
||||
"status.direct": "Palihim na banggitin si/ang @{name}",
|
||||
"status.direct_indicator": "Palihim na banggit",
|
||||
|
@ -354,6 +364,7 @@
|
|||
"status.mention": "Banggitin ang/si @{name}",
|
||||
"status.more": "Higit pa",
|
||||
"status.read_more": "Basahin ang higit pa",
|
||||
"status.reblogged_by": "Pinapalakas ni/ng {name}",
|
||||
"status.reblogs.empty": "Wala pang nagpalakas ng post na ito. Kung may sinumang nagpalakas, makikita sila rito.",
|
||||
"status.remove_favourite": "Tanggalin sa mga paborito",
|
||||
"status.reply": "Tumugon",
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Lat heimatíðarlinju upp",
|
||||
"keyboard_shortcuts.hotkey": "Snarknappur",
|
||||
"keyboard_shortcuts.legend": "Vís henda tekstin",
|
||||
"keyboard_shortcuts.load_more": "Fokusera á \"Tak meira niður\" knøttin",
|
||||
"keyboard_shortcuts.local": "Lat lokala tíðarlinju upp",
|
||||
"keyboard_shortcuts.mention": "Nevn rithøvund",
|
||||
"keyboard_shortcuts.muted": "Lat upp lista við doyvdum brúkarum",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Lat miðlar upp",
|
||||
"keyboard_shortcuts.pinned": "Lat lista yvir festar postar upp",
|
||||
"keyboard_shortcuts.profile": "Lat vangan hjá høvundinum upp",
|
||||
"keyboard_shortcuts.quote": "Sitera post",
|
||||
"keyboard_shortcuts.reply": "Svara posti",
|
||||
"keyboard_shortcuts.requests": "Lat lista við fylgjaraumbønum upp",
|
||||
"keyboard_shortcuts.search": "Fá leitibjálka í miðdepilin",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Konta tín er ógildað.",
|
||||
"notification.own_poll": "Tín atkvøðugreiðsla er endað",
|
||||
"notification.poll": "Ein atkvøðugreiðsla, har tú atkvøddi, er endað",
|
||||
"notification.quoted_update": "{name} rættaði ein post, sum tú hevur siterað",
|
||||
"notification.reblog": "{name} lyfti tín post",
|
||||
"notification.reblog.name_and_others_with_link": "{name} og <a>{count, plural, one {# annar/onnur} other {# onnur}}</a> framhevjaðu tín post",
|
||||
"notification.relationships_severance_event": "Mist sambond við {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Fylgjarar",
|
||||
"privacy.public.long": "Øll í og uttanfyri Mastodon",
|
||||
"privacy.public.short": "Alment",
|
||||
"privacy.quote.anyone": "{visibility}, øll kunnu sitera",
|
||||
"privacy.quote.disabled": "{visibility}, siteringar óvirknar",
|
||||
"privacy.quote.limited": "{visibility}, siteringar avmarkaðar",
|
||||
"privacy.unlisted.additional": "Hetta er júst sum almenn, tó verður posturin ikki vístur í samtíðarrásum ella frámerkjum, rannsakan ella Mastodon leitingum, sjálvt um valið er galdandi fyri alla kontuna.",
|
||||
"privacy.unlisted.long": "Færri algoritmiskar fanfarur",
|
||||
"privacy.unlisted.short": "Stillur almenningur",
|
||||
"privacy_policy.last_updated": "Seinast dagført {date}",
|
||||
"privacy_policy.title": "Privatlívspolitikkur",
|
||||
"quote_error.poll": "Tað er ikki loyvt at sitera spurnarkanningar.",
|
||||
"quote_error.quote": "Bara ein sitering er loyvd í senn.",
|
||||
"quote_error.unauthorized": "Tú hevur ikki rættindi at sitera hendan postin.",
|
||||
"quote_error.upload": "Sitering er ikki loyvd um miðlar eru viðheftir.",
|
||||
"recommended": "Viðmælt",
|
||||
"refresh": "Endurles",
|
||||
"regeneration_indicator.please_stand_by": "Bíða við.",
|
||||
|
@ -849,9 +859,11 @@
|
|||
"status.admin_account": "Lat kjakleiðaramarkamót upp fyri @{name}",
|
||||
"status.admin_domain": "Lat umsjónarmarkamót upp fyri {domain}",
|
||||
"status.admin_status": "Lat hendan postin upp í kjakleiðaramarkamótinum",
|
||||
"status.all_disabled": "Stimbranir og sitatir eru gjørd óvirkin",
|
||||
"status.block": "Blokera @{name}",
|
||||
"status.bookmark": "Goym",
|
||||
"status.cancel_reblog_private": "Strika stimbran",
|
||||
"status.cannot_quote": "Høvundurin hevur gjørt sitering óvirkna fyri hendan postin",
|
||||
"status.cannot_reblog": "Tað ber ikki til at stimbra hendan postin",
|
||||
"status.context.load_new_replies": "Nýggj svar tøk",
|
||||
"status.context.loading": "Kanni um tað eru fleiri svar",
|
||||
|
@ -880,16 +892,22 @@
|
|||
"status.mute_conversation": "Doyv samrøðu",
|
||||
"status.open": "Víðka henda postin",
|
||||
"status.pin": "Ger fastan í vangan",
|
||||
"status.quote": "Sitat",
|
||||
"status.quote.cancel": "Ógilda sitat",
|
||||
"status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta",
|
||||
"status.quote_error.not_available": "Postur ikki tøkur",
|
||||
"status.quote_error.pending_approval": "Postur bíðar",
|
||||
"status.quote_error.pending_approval_popout.body": "Sitatir, sum eru deild tvørtur um fediversið, kunnu taka nakað av tíð at vísast, tí ymiskir ambætarar hava ymiskar protokollir.",
|
||||
"status.quote_error.pending_approval_popout.title": "Bíðar eftir sitati? Tak tað róligt",
|
||||
"status.quote_followers_only": "Bara fylgjarar kunnu sitera hendan postin",
|
||||
"status.quote_manual_review": "Høvundurin fer at eftirkanna manuelt",
|
||||
"status.quote_policy_change": "Broyt hvør kann sitera",
|
||||
"status.quote_post_author": "Siteraði ein post hjá @{name}",
|
||||
"status.quote_private": "Privatir postar kunnu ikki siterast",
|
||||
"status.quotes": "{count, plural, one {sitat} other {sitat}}",
|
||||
"status.read_more": "Les meira",
|
||||
"status.reblog": "Stimbra",
|
||||
"status.reblog_or_quote": "Stimbra ella sitera",
|
||||
"status.reblog_private": "Stimbra við upprunasýni",
|
||||
"status.reblogged_by": "{name} stimbrað",
|
||||
"status.reblogs": "{count, plural, one {stimbran} other {stimbranir}}",
|
||||
|
@ -902,6 +920,7 @@
|
|||
"status.reply": "Svara",
|
||||
"status.replyAll": "Svara tráðnum",
|
||||
"status.report": "Melda @{name}",
|
||||
"status.request_quote": "Fyrispurningur um at sitera",
|
||||
"status.revoke_quote": "Strika postin hjá mær frá postinum hjá @{name}",
|
||||
"status.sensitive_warning": "Viðkvæmt tilfar",
|
||||
"status.share": "Deil",
|
||||
|
@ -940,6 +959,7 @@
|
|||
"upload_button.label": "Legg myndir, sjónfílu ella ljóðfílu afturat",
|
||||
"upload_error.limit": "Farið er um markið fyri fíluuppsending.",
|
||||
"upload_error.poll": "Ikki loyvt at leggja fílur upp í spurnarkanningum.",
|
||||
"upload_error.quote": "Ikki loyvt at leggja fílur upp við siteringum.",
|
||||
"upload_form.drag_and_drop.instructions": "Fyri at heinta eitt miðlaviðfesti, trýst á millumrúm ella returknapp. Meðan tú dregur, brúka pílarnar fyri at flyta miðaviðfesti í einhvønn rætning. Trýst á millumrúm ella returknapp aftur fyri at sleppa miðlaviðfestinum í nýggja staðnum ella trýst á esc-knappin fyri at angra.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Draging varð steðgað. Miðlaviðfestið {item} varð slept.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Miðlaviðfestið {item} var slept.",
|
||||
|
@ -965,14 +985,15 @@
|
|||
"video.volume_up": "Øk um ljóðstyrki",
|
||||
"visibility_modal.button_title": "Set sýni",
|
||||
"visibility_modal.header": "Sýni og samvirkni",
|
||||
"visibility_modal.helper.direct_quoting": "Privatar umrøður kunnu ikki siterast.",
|
||||
"visibility_modal.helper.direct_quoting": "Privatar umrøður, sum eru skrivaðar á Mastodon, kunnu ikki siterast av øðrum.",
|
||||
"visibility_modal.helper.privacy_editing": "Útgivnir postar kunnnu ikki broyta sýni.",
|
||||
"visibility_modal.helper.private_quoting": "Postar, sum einans eru fyri fylgjarar, kunnu ikki siterast.",
|
||||
"visibility_modal.helper.private_quoting": "Postar, sum einans eru fyri fylgjarar á Mastodon, kunnu ikki siterast av øðrum.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Tá fólk sitera teg, so vera teirra postar eisini fjaldir frá tíðarlinjum við ráki.",
|
||||
"visibility_modal.instructions": "Stýr, hvør kann virka saman við hesum postinum. Globalar stillingar finnast undir <link>Stilingar > Onnur</link>.",
|
||||
"visibility_modal.privacy_label": "Privatlív",
|
||||
"visibility_modal.quote_followers": "Einans fylgjarar",
|
||||
"visibility_modal.quote_label": "Broyt hvør kann sitera",
|
||||
"visibility_modal.quote_nobody": "Eingin",
|
||||
"visibility_modal.quote_public": "Ein og hvør"
|
||||
"visibility_modal.quote_nobody": "Bara eg",
|
||||
"visibility_modal.quote_public": "Ein og hvør",
|
||||
"visibility_modal.save": "Goym"
|
||||
}
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Supprimer l'abonné·e",
|
||||
"confirmations.remove_from_followers.message": "{name} cessera de vous suivre. Êtes-vous sûr de vouloir continuer ?",
|
||||
"confirmations.remove_from_followers.title": "Supprimer l'abonné·e ?",
|
||||
"confirmations.revoke_quote.confirm": "Retirer la publication",
|
||||
"confirmations.revoke_quote.message": "Cette action ne peut pas être annulée.",
|
||||
"confirmations.revoke_quote.title": "Retirer la publication ?",
|
||||
"confirmations.unfollow.confirm": "Ne plus suivre",
|
||||
"confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?",
|
||||
"confirmations.unfollow.title": "Se désabonner de l'utilisateur·rice ?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Votre identifiant :",
|
||||
"domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"dropdown.empty": "Sélectionner une option",
|
||||
"embed.instructions": "Intégrez cette publication à votre site en copiant le code ci-dessous.",
|
||||
"embed.preview": "Voici comment il apparaîtra:",
|
||||
"emoji_button.activity": "Activité",
|
||||
|
@ -497,6 +501,8 @@
|
|||
"keyboard_shortcuts.translate": "traduire un message",
|
||||
"keyboard_shortcuts.unfocus": "Ne plus se concentrer sur la zone de rédaction/barre de recherche",
|
||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||
"learn_more_link.got_it": "Compris",
|
||||
"learn_more_link.learn_more": "En savoir plus",
|
||||
"lightbox.close": "Fermer",
|
||||
"lightbox.next": "Suivant",
|
||||
"lightbox.previous": "Précédent",
|
||||
|
@ -730,6 +736,7 @@
|
|||
"privacy.unlisted.short": "Public discret",
|
||||
"privacy_policy.last_updated": "Dernière mise à jour {date}",
|
||||
"privacy_policy.title": "Politique de confidentialité",
|
||||
"quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer cette publication.",
|
||||
"recommended": "Recommandé",
|
||||
"refresh": "Actualiser",
|
||||
"regeneration_indicator.please_stand_by": "Veuillez patienter.",
|
||||
|
@ -798,6 +805,7 @@
|
|||
"report_notification.categories.violation": "Infraction aux règles du serveur",
|
||||
"report_notification.categories.violation_sentence": "infraction de règle",
|
||||
"report_notification.open": "Ouvrir le signalement",
|
||||
"search.clear": "Effacer la recherche",
|
||||
"search.no_recent_searches": "Aucune recherche récente",
|
||||
"search.placeholder": "Rechercher",
|
||||
"search.quick_action.account_search": "Profils correspondant à {x}",
|
||||
|
@ -839,6 +847,7 @@
|
|||
"status.bookmark": "Ajouter aux signets",
|
||||
"status.cancel_reblog_private": "Débooster",
|
||||
"status.cannot_reblog": "Cette publication ne peut pas être boostée",
|
||||
"status.context.load_new_replies": "Nouvelles réponses disponibles",
|
||||
"status.continued_thread": "Suite du fil",
|
||||
"status.copy": "Copier un lien vers cette publication",
|
||||
"status.delete": "Supprimer",
|
||||
|
@ -864,6 +873,13 @@
|
|||
"status.mute_conversation": "Masquer la conversation",
|
||||
"status.open": "Afficher la publication entière",
|
||||
"status.pin": "Épingler sur profil",
|
||||
"status.quote": "Citation",
|
||||
"status.quote.cancel": "Annuler la citation",
|
||||
"status.quote_error.not_available": "Publication non disponible",
|
||||
"status.quote_error.pending_approval": "Publication en attente",
|
||||
"status.quote_error.pending_approval_popout.title": "Publication en attente ? Restez calme",
|
||||
"status.quote_policy_change": "Changer qui peut vous citer",
|
||||
"status.quote_private": "Les publications privées ne peuvent pas être citées",
|
||||
"status.read_more": "En savoir plus",
|
||||
"status.reblog": "Booster",
|
||||
"status.reblog_private": "Booster avec visibilité originale",
|
||||
|
@ -933,7 +949,13 @@
|
|||
"video.mute": "Couper le son",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Lecture",
|
||||
"video.skip_backward": "Revenir en arrière",
|
||||
"video.unmute": "Rétablir le son",
|
||||
"video.volume_down": "Baisser le volume",
|
||||
"video.volume_up": "Augmenter le volume"
|
||||
"video.volume_up": "Augmenter le volume",
|
||||
"visibility_modal.button_title": "Définir la visibilité",
|
||||
"visibility_modal.header": "Visibilité et interactions",
|
||||
"visibility_modal.privacy_label": "Vie privée",
|
||||
"visibility_modal.quote_public": "Tout le monde",
|
||||
"visibility_modal.save": "Sauvegarder"
|
||||
}
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"confirmations.remove_from_followers.confirm": "Supprimer l'abonné·e",
|
||||
"confirmations.remove_from_followers.message": "{name} cessera de vous suivre. Êtes-vous sûr de vouloir continuer ?",
|
||||
"confirmations.remove_from_followers.title": "Supprimer l'abonné·e ?",
|
||||
"confirmations.revoke_quote.confirm": "Retirer la publication",
|
||||
"confirmations.revoke_quote.message": "Cette action ne peut pas être annulée.",
|
||||
"confirmations.revoke_quote.title": "Retirer la publication ?",
|
||||
"confirmations.unfollow.confirm": "Ne plus suivre",
|
||||
"confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?",
|
||||
"confirmations.unfollow.title": "Se désabonner de l'utilisateur·rice ?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Votre identifiant :",
|
||||
"domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"dropdown.empty": "Sélectionner une option",
|
||||
"embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.",
|
||||
"embed.preview": "Il apparaîtra comme cela :",
|
||||
"emoji_button.activity": "Activités",
|
||||
|
@ -497,6 +501,8 @@
|
|||
"keyboard_shortcuts.translate": "traduire un message",
|
||||
"keyboard_shortcuts.unfocus": "Quitter la zone de rédaction/barre de recherche",
|
||||
"keyboard_shortcuts.up": "Monter dans la liste",
|
||||
"learn_more_link.got_it": "Compris",
|
||||
"learn_more_link.learn_more": "En savoir plus",
|
||||
"lightbox.close": "Fermer",
|
||||
"lightbox.next": "Suivant",
|
||||
"lightbox.previous": "Précédent",
|
||||
|
@ -730,6 +736,7 @@
|
|||
"privacy.unlisted.short": "Public discret",
|
||||
"privacy_policy.last_updated": "Dernière mise à jour {date}",
|
||||
"privacy_policy.title": "Politique de confidentialité",
|
||||
"quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer cette publication.",
|
||||
"recommended": "Recommandé",
|
||||
"refresh": "Actualiser",
|
||||
"regeneration_indicator.please_stand_by": "Veuillez patienter.",
|
||||
|
@ -798,6 +805,7 @@
|
|||
"report_notification.categories.violation": "Infraction aux règles du serveur",
|
||||
"report_notification.categories.violation_sentence": "infraction de règle",
|
||||
"report_notification.open": "Ouvrir le signalement",
|
||||
"search.clear": "Effacer la recherche",
|
||||
"search.no_recent_searches": "Aucune recherche récente",
|
||||
"search.placeholder": "Rechercher",
|
||||
"search.quick_action.account_search": "Profils correspondant à {x}",
|
||||
|
@ -839,6 +847,7 @@
|
|||
"status.bookmark": "Ajouter aux marque-pages",
|
||||
"status.cancel_reblog_private": "Annuler le partage",
|
||||
"status.cannot_reblog": "Ce message ne peut pas être partagé",
|
||||
"status.context.load_new_replies": "Nouvelles réponses disponibles",
|
||||
"status.continued_thread": "Suite du fil",
|
||||
"status.copy": "Copier le lien vers le message",
|
||||
"status.delete": "Supprimer",
|
||||
|
@ -864,6 +873,13 @@
|
|||
"status.mute_conversation": "Masquer la conversation",
|
||||
"status.open": "Afficher le message entier",
|
||||
"status.pin": "Épingler sur le profil",
|
||||
"status.quote": "Citation",
|
||||
"status.quote.cancel": "Annuler la citation",
|
||||
"status.quote_error.not_available": "Publication non disponible",
|
||||
"status.quote_error.pending_approval": "Publication en attente",
|
||||
"status.quote_error.pending_approval_popout.title": "Publication en attente ? Restez calme",
|
||||
"status.quote_policy_change": "Changer qui peut vous citer",
|
||||
"status.quote_private": "Les publications privées ne peuvent pas être citées",
|
||||
"status.read_more": "En savoir plus",
|
||||
"status.reblog": "Partager",
|
||||
"status.reblog_private": "Partager à l’audience originale",
|
||||
|
@ -933,7 +949,13 @@
|
|||
"video.mute": "Couper le son",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Lecture",
|
||||
"video.skip_backward": "Revenir en arrière",
|
||||
"video.unmute": "Rétablir le son",
|
||||
"video.volume_down": "Baisser le volume",
|
||||
"video.volume_up": "Augmenter le volume"
|
||||
"video.volume_up": "Augmenter le volume",
|
||||
"visibility_modal.button_title": "Définir la visibilité",
|
||||
"visibility_modal.header": "Visibilité et interactions",
|
||||
"visibility_modal.privacy_label": "Vie privée",
|
||||
"visibility_modal.quote_public": "Tout le monde",
|
||||
"visibility_modal.save": "Sauvegarder"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Oscail amlíne bhaile",
|
||||
"keyboard_shortcuts.hotkey": "Eochair aicearra",
|
||||
"keyboard_shortcuts.legend": "Taispeáin an finscéal seo",
|
||||
"keyboard_shortcuts.load_more": "Dírigh ar an gcnaipe \"Lódáil níos mó\"",
|
||||
"keyboard_shortcuts.local": "Oscail an amlíne áitiúil",
|
||||
"keyboard_shortcuts.mention": "Luaigh údar",
|
||||
"keyboard_shortcuts.muted": "Oscail liosta na n-úsáideoirí balbhaithe",
|
||||
|
@ -619,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Cuireadh do chuntas ar fionraí.",
|
||||
"notification.own_poll": "Tá do suirbhé críochnaithe",
|
||||
"notification.poll": "Tá deireadh le vótaíocht inar vótáil tú",
|
||||
"notification.quoted_update": "Chuir {name} post in eagar a luaigh tú",
|
||||
"notification.reblog": "Mhol {name} do phostáil",
|
||||
"notification.reblog.name_and_others_with_link": "{name} agus <a>{count, plural, one {# duine eile} other {# daoine eile}}</a> a chuir borradh faoi do phost",
|
||||
"notification.relationships_severance_event": "Cailleadh naisc le {name}",
|
||||
|
@ -738,11 +740,18 @@
|
|||
"privacy.private.short": "Leantóirí",
|
||||
"privacy.public.long": "Duine ar bith ar agus amach Mastodon",
|
||||
"privacy.public.short": "Poiblí",
|
||||
"privacy.quote.anyone": "{visibility}, is féidir le duine ar bith lua",
|
||||
"privacy.quote.disabled": "{visibility}, comharthaí athfhriotail díchumasaithe",
|
||||
"privacy.quote.limited": "{visibility}, luachana teoranta",
|
||||
"privacy.unlisted.additional": "Iompraíonn sé seo díreach mar a bheadh poiblí, ach amháin ní bheidh an postáil le feiceáil i bhfothaí beo nó i hashtags, in iniúchadh nó i gcuardach Mastodon, fiú má tá tú liostáilte ar fud an chuntais.",
|
||||
"privacy.unlisted.long": "Níos lú fanfarraí algarthacha",
|
||||
"privacy.unlisted.short": "Poiblí ciúin",
|
||||
"privacy_policy.last_updated": "Nuashonraithe {date}",
|
||||
"privacy_policy.title": "Polasaí príobháideachais",
|
||||
"quote_error.poll": "Ní cheadaítear lua le pobalbhreitheanna.",
|
||||
"quote_error.quote": "Ní cheadaítear ach luachan amháin ag an am.",
|
||||
"quote_error.unauthorized": "Níl údarás agat an post seo a lua.",
|
||||
"quote_error.upload": "Ní cheadaítear lua a dhéanamh le ceangaltáin sna meáin.",
|
||||
"recommended": "Molta",
|
||||
"refresh": "Athnuaigh",
|
||||
"regeneration_indicator.please_stand_by": "Fan i do sheasamh, le do thoil.",
|
||||
|
@ -849,9 +858,11 @@
|
|||
"status.admin_account": "Oscail comhéadan modhnóireachta do @{name}",
|
||||
"status.admin_domain": "Oscail comhéadan modhnóireachta le haghaidh {domain}",
|
||||
"status.admin_status": "Oscail an postáil seo sa chomhéadan modhnóireachta",
|
||||
"status.all_disabled": "Tá borradh agus luachana díchumasaithe",
|
||||
"status.block": "Bac @{name}",
|
||||
"status.bookmark": "Leabharmharcanna",
|
||||
"status.cancel_reblog_private": "Dímhol",
|
||||
"status.cannot_quote": "Tá an t-údar tar éis lua a dhíchumasú ar an bpost seo",
|
||||
"status.cannot_reblog": "Ní féidir an phostáil seo a mholadh",
|
||||
"status.context.load_new_replies": "Freagraí nua ar fáil",
|
||||
"status.context.loading": "Ag seiceáil le haghaidh tuilleadh freagraí",
|
||||
|
@ -880,13 +891,20 @@
|
|||
"status.mute_conversation": "Balbhaigh comhrá",
|
||||
"status.open": "Leathnaigh an post seo",
|
||||
"status.pin": "Pionnáil ar do phróifíl",
|
||||
"status.quote": "Luachan",
|
||||
"status.quote.cancel": "Cealaigh an luachan",
|
||||
"status.quote_error.filtered": "I bhfolach mar gheall ar cheann de do scagairí",
|
||||
"status.quote_error.not_available": "Níl an postáil ar fáil",
|
||||
"status.quote_error.pending_approval": "Post ar feitheamh",
|
||||
"status.quote_error.pending_approval_popout.body": "D’fhéadfadh sé go dtógfadh sé tamall le Sleachta a roinntear ar fud Fediverse a thaispeáint, toisc go mbíonn prótacail éagsúla ag freastalaithe éagsúla.",
|
||||
"status.quote_error.pending_approval_popout.title": "Ag fanacht le luachan? Fan socair",
|
||||
"status.quote_followers_only": "Ní féidir ach le leantóirí an post seo a lua",
|
||||
"status.quote_manual_review": "Déanfaidh an t-údar athbhreithniú de láimh",
|
||||
"status.quote_policy_change": "Athraigh cé a fhéadann luachan a thabhairt",
|
||||
"status.quote_post_author": "Luaigh mé post le @{name}",
|
||||
"status.quote_private": "Ní féidir poist phríobháideacha a lua",
|
||||
"status.quotes": "{count, plural, one {sliocht} few {sliocht} other {sliocht}}",
|
||||
"status.quotes.empty": "Níl an post seo luaite ag aon duine go fóill. Nuair a dhéanann duine é, taispeánfar anseo é.",
|
||||
"status.read_more": "Léan a thuilleadh",
|
||||
"status.reblog": "Treisiú",
|
||||
"status.reblog_private": "Mol le léargas bunúsach",
|
||||
|
@ -901,6 +919,7 @@
|
|||
"status.reply": "Freagair",
|
||||
"status.replyAll": "Freagair le snáithe",
|
||||
"status.report": "Tuairiscigh @{name}",
|
||||
"status.request_quote": "Iarratas ar luachan",
|
||||
"status.revoke_quote": "Bain mo phost ó phost @{name}",
|
||||
"status.sensitive_warning": "Ábhar íogair",
|
||||
"status.share": "Comhroinn",
|
||||
|
@ -939,6 +958,7 @@
|
|||
"upload_button.label": "Cuir íomhánna, físeán nó comhad fuaime leis",
|
||||
"upload_error.limit": "Sáraíodh an teorainn uaslódála comhaid.",
|
||||
"upload_error.poll": "Ní cheadaítear uaslódáil comhad le pobalbhreith.",
|
||||
"upload_error.quote": "Ní cheadaítear uaslódáil comhaid le comharthaí athfhriotail.",
|
||||
"upload_form.drag_and_drop.instructions": "Chun ceangaltán meán a phiocadh suas, brúigh spás nó cuir isteach. Agus tú ag tarraingt, bain úsáid as na heochracha saigheada chun an ceangaltán meán a bhogadh i dtreo ar bith. Brúigh spás nó cuir isteach arís chun an ceangaltán meán a scaoileadh ina phost nua, nó brúigh éalú chun cealú.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Cuireadh an tarraingt ar ceal. Scaoileadh ceangaltán meán {item}.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Scaoileadh ceangaltán meán {item}.",
|
||||
|
@ -964,14 +984,15 @@
|
|||
"video.volume_up": "Toirt suas",
|
||||
"visibility_modal.button_title": "Socraigh infheictheacht",
|
||||
"visibility_modal.header": "Infheictheacht agus idirghníomhaíocht",
|
||||
"visibility_modal.helper.direct_quoting": "Ní féidir lua a thabhairt ar luanna príobháideacha.",
|
||||
"visibility_modal.helper.direct_quoting": "Ní féidir le daoine eile tráchtanna príobháideacha a scríobhadh ar Mastodon a lua.",
|
||||
"visibility_modal.helper.privacy_editing": "Ní féidir infheictheacht postálacha foilsithe a athrú.",
|
||||
"visibility_modal.helper.private_quoting": "Ní féidir poist atá dírithe ar leanúna amháin a lua.",
|
||||
"visibility_modal.helper.private_quoting": "Ní féidir le daoine eile poist atá scríofa ar Mastodon agus atá dírithe ar leanúna amháin a lua.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Nuair a luann daoine thú, beidh a bpost i bhfolach ó amlínte treochta freisin.",
|
||||
"visibility_modal.instructions": "Rialú cé a fhéadfaidh idirghníomhú leis an bpost seo. Is féidir socruithe domhanda a fháil faoi <link>Sainroghanna > Eile</link>.",
|
||||
"visibility_modal.privacy_label": "Príobháideacht",
|
||||
"visibility_modal.quote_followers": "Leantóirí amháin",
|
||||
"visibility_modal.quote_label": "Athraigh cé a fhéadann luachan a thabhairt",
|
||||
"visibility_modal.quote_nobody": "Níl aon duine",
|
||||
"visibility_modal.quote_public": "Aon duine"
|
||||
"visibility_modal.quote_nobody": "Mise amháin",
|
||||
"visibility_modal.quote_public": "Aon duine",
|
||||
"visibility_modal.save": "Sábháil"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Para abrir a cronoloxía inicial",
|
||||
"keyboard_shortcuts.hotkey": "Tecla de atallo",
|
||||
"keyboard_shortcuts.legend": "Para amosar esta lenda",
|
||||
"keyboard_shortcuts.load_more": "Foco no botón \"Cargar máis\"",
|
||||
"keyboard_shortcuts.local": "Para abrir a cronoloxía local",
|
||||
"keyboard_shortcuts.mention": "Para mencionar a autora",
|
||||
"keyboard_shortcuts.muted": "Abrir lista de usuarias acaladas",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Para abrir o contido multimedia",
|
||||
"keyboard_shortcuts.pinned": "Para abrir a listaxe das publicacións fixadas",
|
||||
"keyboard_shortcuts.profile": "Para abrir o perfil da autora",
|
||||
"keyboard_shortcuts.quote": "Citar publicación",
|
||||
"keyboard_shortcuts.reply": "Para responder",
|
||||
"keyboard_shortcuts.requests": "Para abrir a listaxe das peticións de seguimento",
|
||||
"keyboard_shortcuts.search": "Por cursor na caixa de busca",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "A túa conta foi suspendida.",
|
||||
"notification.own_poll": "A túa enquisa rematou",
|
||||
"notification.poll": "Rematou a enquisa na que votaches",
|
||||
"notification.quoted_update": "{name} editou unha publicación que citaches",
|
||||
"notification.reblog": "{name} compartiu a túa publicación",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# máis} other {# máis}}</a> promoveron a túa publicación",
|
||||
"notification.relationships_severance_event": "Relacións perdidas con {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Seguidoras",
|
||||
"privacy.public.long": "Para todas dentro e fóra de Mastodon",
|
||||
"privacy.public.short": "Público",
|
||||
"privacy.quote.anyone": "{visibility}, calquera pode citar",
|
||||
"privacy.quote.disabled": "{visibility}, citas desactivadas",
|
||||
"privacy.quote.limited": "{visibility}, citas limitadas",
|
||||
"privacy.unlisted.additional": "Do mesmo xeito que público, menos que a publicación non aparecerá nas cronoloxías en directo ou nos cancelos, en descubrir ou nas buscas de Mastodon, incluso se estivese establecido nas opcións xerais da conta.",
|
||||
"privacy.unlisted.long": "Menor implicación dos algoritmos",
|
||||
"privacy.unlisted.short": "Público limitado",
|
||||
"privacy_policy.last_updated": "Actualizado por última vez no {date}",
|
||||
"privacy_policy.title": "Política de Privacidade",
|
||||
"quote_error.poll": "Non se permite citar as enquisas.",
|
||||
"quote_error.quote": "Só se permite citar unha vez.",
|
||||
"quote_error.unauthorized": "Non tes permiso para citar esta publicación.",
|
||||
"quote_error.upload": "As citas non están permitidas para anexos multimedia.",
|
||||
"recommended": "Aconsellable",
|
||||
"refresh": "Actualizar",
|
||||
"regeneration_indicator.please_stand_by": "Por favor, agarda.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Abrir interface de moderación para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderación para {domain}",
|
||||
"status.admin_status": "Abrir esta publicación na interface de moderación",
|
||||
"status.all_disabled": "As promocións e citas están desactivadas",
|
||||
"status.block": "Bloquear a @{name}",
|
||||
"status.bookmark": "Marcar",
|
||||
"status.cancel_reblog_private": "Desfacer compartido",
|
||||
"status.cannot_quote": "A persoa autora desactivou as citas desta publicación",
|
||||
"status.cannot_reblog": "Esta publicación non pode ser promovida",
|
||||
"status.context.load_new_replies": "Non hai respostas dispoñibles",
|
||||
"status.context.loading": "Mirando se hai máis respostas",
|
||||
"status.continued_thread": "Continua co fío",
|
||||
"status.copy": "Copiar ligazón á publicación",
|
||||
"status.delete": "Eliminar",
|
||||
"status.delete.success": "Publicación eliminada",
|
||||
"status.detailed_status": "Vista detallada da conversa",
|
||||
"status.direct": "Mencionar de xeito privado a @{name}",
|
||||
"status.direct_indicator": "Mención privada",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Silenciar conversa",
|
||||
"status.open": "Estender esta publicación",
|
||||
"status.pin": "Fixar no perfil",
|
||||
"status.quote": "Citar",
|
||||
"status.quote.cancel": "Cancelar a cita",
|
||||
"status.quote_error.filtered": "Oculto debido a un dos teus filtros",
|
||||
"status.quote_error.not_available": "Publicación non dispoñible",
|
||||
"status.quote_error.pending_approval": "Publicación pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "As citas compartidas no Fediverso poderían tardar en mostrarse, xa que os diferentes servidores teñen diferentes protocolos.",
|
||||
"status.quote_error.pending_approval_popout.title": "Cita pendente? Non te apures",
|
||||
"status.quote_followers_only": "Só as seguidoras poden citar esta publicación",
|
||||
"status.quote_manual_review": "A autora revisará manualmente",
|
||||
"status.quote_policy_change": "Cambia quen pode citarte",
|
||||
"status.quote_post_author": "Citou unha publicación de @{name}",
|
||||
"status.quote_private": "As publicacións privadas non se poden citar",
|
||||
"status.quotes": "{count, plural, one {cita} other {citas}}",
|
||||
"status.quotes.empty": "Aínda ninguén citou esta publicación. Cando alguén o faga aparecerá aquí.",
|
||||
"status.read_more": "Ler máis",
|
||||
"status.reblog": "Promover",
|
||||
"status.reblog_or_quote": "Promover ou citar",
|
||||
"status.reblog_private": "Compartir coa audiencia orixinal",
|
||||
"status.reblogged_by": "{name} promoveu",
|
||||
"status.reblogs": "{count, plural, one {promoción} other {promocións}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder ao tema",
|
||||
"status.report": "Denunciar @{name}",
|
||||
"status.request_quote": "Solicitar a citación",
|
||||
"status.revoke_quote": "Retirar a miña publicación da cita de @{name}",
|
||||
"status.sensitive_warning": "Contido sensíbel",
|
||||
"status.share": "Compartir",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Engadir imaxes, un vídeo ou ficheiro de audio",
|
||||
"upload_error.limit": "Límite máximo do ficheiro a subir excedido.",
|
||||
"upload_error.poll": "Non se poden subir ficheiros nas enquisas.",
|
||||
"upload_error.quote": "Non se permite subir ficheiros ao citar.",
|
||||
"upload_form.drag_and_drop.instructions": "Preme en Espazo ou Enter para escoller un anexo multimedia. Ao arrastrar usa as teclas de frecha para mover o anexo en todas direccións.Preme Espazo ou Enter outra vez para soltalo na súa nova posición, ou preme Escape para desbotar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Cancelouse o movemento. O anexo {item} soltouse.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Soltouse o anexo multimedia {item}.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Subir volume",
|
||||
"visibility_modal.button_title": "Establece a visibilidade",
|
||||
"visibility_modal.header": "Visibilidade e interaccións",
|
||||
"visibility_modal.helper.direct_quoting": "A mencións privadas non se poden citar.",
|
||||
"visibility_modal.helper.direct_quoting": "As mencións privadas creadas con Mastodon non poden ser citadas.",
|
||||
"visibility_modal.helper.privacy_editing": "Non se pode cambiar a visibilidade das publicacións xa publicadas.",
|
||||
"visibility_modal.helper.private_quoting": "As publicacións só para seguidoras non se poden citar.",
|
||||
"visibility_modal.helper.private_quoting": "As publicacións só para seguidoras creadas con Mastodon non poden ser citadas.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Cando alguén te cite, a súa publicación non aparecerá nas cronoloxías de popularidade.",
|
||||
"visibility_modal.instructions": "Controla quen pode interactuar con esta publicación. Os axustes xerais están en <link>Preferencias > Outros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidade",
|
||||
"visibility_modal.quote_followers": "Só para seguidoras",
|
||||
"visibility_modal.quote_label": "Cambia quen pode citarte",
|
||||
"visibility_modal.quote_nobody": "Ninguén",
|
||||
"visibility_modal.quote_public": "Calquera"
|
||||
"visibility_modal.quote_nobody": "Só para min",
|
||||
"visibility_modal.quote_public": "Calquera",
|
||||
"visibility_modal.save": "Gardar"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "פתיחת ציר זמן אישי",
|
||||
"keyboard_shortcuts.hotkey": "מקש קיצור",
|
||||
"keyboard_shortcuts.legend": "הצגת מקרא",
|
||||
"keyboard_shortcuts.load_more": "התמקדות בכפתור \"טען עוד\"",
|
||||
"keyboard_shortcuts.local": "פתיחת ציר זמן קהילתי",
|
||||
"keyboard_shortcuts.mention": "לאזכר את המחבר.ת",
|
||||
"keyboard_shortcuts.muted": "פתיחת רשימת משתמשים מושתקים",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "פתיחת מדיה",
|
||||
"keyboard_shortcuts.pinned": "פתיחת הודעה נעוצות",
|
||||
"keyboard_shortcuts.profile": "פתח את פרופיל המשתמש",
|
||||
"keyboard_shortcuts.quote": "לצטט ההודעה",
|
||||
"keyboard_shortcuts.reply": "תגובה להודעה",
|
||||
"keyboard_shortcuts.requests": "פתיחת רשימת בקשות מעקב",
|
||||
"keyboard_shortcuts.search": "להתמקד בחלון החיפוש",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "חשבונך הושעה.",
|
||||
"notification.own_poll": "הסקר שלך הסתיים",
|
||||
"notification.poll": "סקר שהצבעת בו הסתיים",
|
||||
"notification.quoted_update": "{name} ערך הודעה שהשתמשת בה בציטוט",
|
||||
"notification.reblog": "הודעתך הודהדה על ידי {name}",
|
||||
"notification.reblog.name_and_others_with_link": "{name} ועוד <a>{count, plural,one {אחד נוסף}other {# נוספים}}</a> הדהדו את הודעתך",
|
||||
"notification.relationships_severance_event": "אבד הקשר עם {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "עוקבים",
|
||||
"privacy.public.long": "כל הגולשים, מחוברים למסטודון או לא",
|
||||
"privacy.public.short": "פומבי",
|
||||
"privacy.quote.anyone": "{visibility}, הציטוט מותר לכל",
|
||||
"privacy.quote.disabled": "{visibility}, האפשרות לציטוט מכובה",
|
||||
"privacy.quote.limited": "{visibility}, האפשרות לציטוט מוגבלת",
|
||||
"privacy.unlisted.additional": "ההתנהגות דומה להודעה ציבורית, מלבד שההודעה לא תופיע בפיד החי המקומי או בתגיות, תגליות או חיפוש מסטודון, אפילו אם ביקשת שהחשבון כולו יהיה פומבי.",
|
||||
"privacy.unlisted.long": "פחות חשיפה לאלגוריתמים",
|
||||
"privacy.unlisted.short": "ציבורי שקט",
|
||||
"privacy_policy.last_updated": "עודכן לאחרונה {date}",
|
||||
"privacy_policy.title": "מדיניות פרטיות",
|
||||
"quote_error.poll": "לא ניתן לכלול משאל כאשר מחברים הודעת ציטוט.",
|
||||
"quote_error.quote": "רק ציטוט אחד מותר בכל הודעה.",
|
||||
"quote_error.unauthorized": "אין לך הרשאה לצטט את ההודעה הזו.",
|
||||
"quote_error.upload": "ציטוט הכולל מדיה אינו אפשרי.",
|
||||
"recommended": "מומלץ",
|
||||
"refresh": "רענון",
|
||||
"regeneration_indicator.please_stand_by": "נא להמתין.",
|
||||
|
@ -849,9 +859,11 @@
|
|||
"status.admin_account": "פתח/י ממשק פיקוח דיון עבור @{name}",
|
||||
"status.admin_domain": "פתיחת ממשק פיקוח דיון עבור {domain}",
|
||||
"status.admin_status": "לפתוח הודעה זו במסך ניהול הדיונים",
|
||||
"status.all_disabled": "הדהודים וציטוטים כובו",
|
||||
"status.block": "חסימת @{name}",
|
||||
"status.bookmark": "סימניה",
|
||||
"status.cancel_reblog_private": "הסרת הדהוד",
|
||||
"status.cannot_quote": "יוצר\\ת ההודעה חסמו את האפשרות לצטט אותה",
|
||||
"status.cannot_reblog": "לא ניתן להדהד חצרוץ זה",
|
||||
"status.context.load_new_replies": "הגיעו תגובות חדשות",
|
||||
"status.context.loading": "מחפש תגובות חדשות",
|
||||
|
@ -870,7 +882,7 @@
|
|||
"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": "מדיה מוסתרת",
|
||||
|
@ -880,16 +892,23 @@
|
|||
"status.mute_conversation": "השתקת שיחה",
|
||||
"status.open": "הרחבת הודעה זו",
|
||||
"status.pin": "הצמדה לפרופיל שלי",
|
||||
"status.quote": "ציטוט",
|
||||
"status.quote.cancel": "ביטול הודעת ציטוט",
|
||||
"status.quote_error.filtered": "מוסתר בהתאם לסננים שלך",
|
||||
"status.quote_error.not_available": "ההודעה לא זמינה",
|
||||
"status.quote_error.pending_approval": "ההודעה בהמתנה לאישור",
|
||||
"status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.",
|
||||
"status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע",
|
||||
"status.quote_followers_only": "רק עוקביך יוכלו לצטט את ההודעה",
|
||||
"status.quote_manual_review": "מחבר.ת ההודעה יחזרו אליך אחרי בדיקה",
|
||||
"status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך",
|
||||
"status.quote_post_author": "ההודעה צוטטה על ידי @{name}",
|
||||
"status.quote_private": "הודעות פרטיות לא ניתנות לציטוט",
|
||||
"status.quotes": "{count, plural,one {ציטוט}other {ציטוטים}}",
|
||||
"status.quotes.empty": "עוד לא ציטטו את ההודעה הזו. כאשר זה יקרה, הציטוטים יופיעו כאן.",
|
||||
"status.read_more": "לקרוא עוד",
|
||||
"status.reblog": "הדהוד",
|
||||
"status.reblog_or_quote": "להדהד או לצטט",
|
||||
"status.reblog_private": "להדהד ברמת הנראות המקורית",
|
||||
"status.reblogged_by": "{name} הידהד/ה:",
|
||||
"status.reblogs": "{count, plural, one {הדהוד אחד} two {שני הדהודים} other {# הדהודים}}",
|
||||
|
@ -902,6 +921,7 @@
|
|||
"status.reply": "תגובה",
|
||||
"status.replyAll": "תגובה לשרשור",
|
||||
"status.report": "דיווח על @{name}",
|
||||
"status.request_quote": "הגשת בקשה להרשות ציטוט",
|
||||
"status.revoke_quote": "הסירו את הודעתי מההודעה של @{name}",
|
||||
"status.sensitive_warning": "תוכן רגיש",
|
||||
"status.share": "שיתוף",
|
||||
|
@ -940,6 +960,7 @@
|
|||
"upload_button.label": "הוספת מדיה",
|
||||
"upload_error.limit": "קובץ להעלאה חורג מנפח מותר.",
|
||||
"upload_error.poll": "לא ניתן להעלות קובץ עם סקר.",
|
||||
"upload_error.quote": "לא ניתן להעלות קובץ כאשר מחברים הודעת ציטוט.",
|
||||
"upload_form.drag_and_drop.instructions": "כדי לבחור קובץ מוצמד, יש ללחוץ על מקש רווח או אנטר. בעת הגרירה, השתמשו במקשי החיצים כדי להזיז את הקובץ המוצמד בכל כיוון. לחצו רווח או אנטר בשנית כדי לעזוב את הקובץ במקומו החדש, או לחצו אסקייפ לביטול.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "הגרירה בוטלה. קובץ המדיה {item} נעזב.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "קובץ המדיה {item} נעזב.",
|
||||
|
@ -965,14 +986,15 @@
|
|||
"video.volume_up": "הגברת עוצמת שמע",
|
||||
"visibility_modal.button_title": "בחירת רמת חשיפה",
|
||||
"visibility_modal.header": "חשיפה והידוּד (אינטראקציה)",
|
||||
"visibility_modal.helper.direct_quoting": "הודעות פרטיות לא ניתנות לציטוט.",
|
||||
"visibility_modal.helper.direct_quoting": "איזכורים פרטיים שנוצרו במסטודון חסומים מציטוט על ידי אחרים.",
|
||||
"visibility_modal.helper.privacy_editing": "לא ניתן לשנות את דרגת החשיפה של הודעות שפורסמו.",
|
||||
"visibility_modal.helper.private_quoting": "לא ניתן לצטט הודעות שחשופות לעוקבים בלבד.",
|
||||
"visibility_modal.helper.private_quoting": "הודעות לעוקבים־בלבד שנוצרו במסטודון חסומות מציטוט על ידי אחרים.",
|
||||
"visibility_modal.helper.unlisted_quoting": "כאשר אחרים מצטטים אותך, ההודעות שלהם יוסתרו גם מ\"נושאים חמים\".",
|
||||
"visibility_modal.instructions": "שליטה בהרשאה להידוּד (תגובות וציטוטים) עם הודעה זו. הגדרות ברירת המחדל ניתן למצוא תחת <link>העדפות > אחרים</link>.",
|
||||
"visibility_modal.privacy_label": "פרטיות",
|
||||
"visibility_modal.quote_followers": "לעוקבים בלבד",
|
||||
"visibility_modal.quote_label": "הגדרת הרשאה לציטוט הודעותיך",
|
||||
"visibility_modal.quote_nobody": "אף אחד",
|
||||
"visibility_modal.quote_public": "כולם"
|
||||
"visibility_modal.quote_nobody": "רק אני",
|
||||
"visibility_modal.quote_public": "כולם",
|
||||
"visibility_modal.save": "שמירה"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Saját idővonal megnyitása",
|
||||
"keyboard_shortcuts.hotkey": "Gyorsbillentyű",
|
||||
"keyboard_shortcuts.legend": "Jelmagyarázat megjelenítése",
|
||||
"keyboard_shortcuts.load_more": "Fókuszálás a „Több betöltése” gombra",
|
||||
"keyboard_shortcuts.local": "Helyi idővonal megnyitása",
|
||||
"keyboard_shortcuts.mention": "Szerző megemlítése",
|
||||
"keyboard_shortcuts.muted": "Némított felhasználók listájának megnyitása",
|
||||
|
@ -619,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "A fiókod felfüggesztésre került.",
|
||||
"notification.own_poll": "A szavazásod véget ért",
|
||||
"notification.poll": "Véget ért egy szavazás, melyben részt vettél",
|
||||
"notification.quoted_update": "{name} szerkesztett egy bejegyzést, melyet idéztél",
|
||||
"notification.reblog": "{name} megtolta a bejegyzésedet",
|
||||
"notification.reblog.name_and_others_with_link": "{name} és <a>{count, plural, one {# másik} other {# másik}}</a> megtolta a bejegyzésedet",
|
||||
"notification.relationships_severance_event": "Elvesztek a kapcsolatok vele: {name}",
|
||||
|
@ -738,11 +740,18 @@
|
|||
"privacy.private.short": "Követők",
|
||||
"privacy.public.long": "Bárki a Mastodonon és azon kívül",
|
||||
"privacy.public.short": "Nyilvános",
|
||||
"privacy.quote.anyone": "{visibility}, bárki idézheti",
|
||||
"privacy.quote.disabled": "{visibility}, idézés letiltva",
|
||||
"privacy.quote.limited": "{visibility}, idézés korlátozva",
|
||||
"privacy.unlisted.additional": "Ez pontosan úgy viselkedik, mint a nyilvános, kivéve, hogy a bejegyzés nem jelenik meg élő hírfolyamokban, hashtagekben, felfedezésben vagy a Mastodonos keresésben, még akkor sem, ha ezt az egész fiókra engedélyezted.",
|
||||
"privacy.unlisted.long": "Kevesebb algoritmikus fanfár",
|
||||
"privacy.unlisted.short": "Csendes nyilvános",
|
||||
"privacy_policy.last_updated": "Utoljára frissítve: {date}",
|
||||
"privacy_policy.title": "Adatvédelmi szabályzat",
|
||||
"quote_error.poll": "Az idézés szavazások esetén nincs engedélyezve.",
|
||||
"quote_error.quote": "Egyszerre csak egy idézet van engedélyezve.",
|
||||
"quote_error.unauthorized": "Nem idézheted ezt a bejegyzést.",
|
||||
"quote_error.upload": "Az idézés médiamellékletek esetén nem engedélyezett.",
|
||||
"recommended": "Ajánlott",
|
||||
"refresh": "Frissítés",
|
||||
"regeneration_indicator.please_stand_by": "Kis türelmet.",
|
||||
|
@ -849,9 +858,11 @@
|
|||
"status.admin_account": "Moderációs felület megnyitása @{name} fiókhoz",
|
||||
"status.admin_domain": "Moderációs felület megnyitása {domain} esetében",
|
||||
"status.admin_status": "Bejegyzés megnyitása a moderációs felületen",
|
||||
"status.all_disabled": "A megtolások és idézések tiltva vannak",
|
||||
"status.block": "@{name} letiltása",
|
||||
"status.bookmark": "Könyvjelzőzés",
|
||||
"status.cancel_reblog_private": "Megtolás visszavonása",
|
||||
"status.cannot_quote": "A szerző letiltotta az idézést ennél a bejegyzésnél",
|
||||
"status.cannot_reblog": "Ezt a bejegyzést nem lehet megtolni",
|
||||
"status.context.load_new_replies": "Új válaszok érhetőek el",
|
||||
"status.context.loading": "További válaszok keresése",
|
||||
|
@ -880,13 +891,20 @@
|
|||
"status.mute_conversation": "Beszélgetés némítása",
|
||||
"status.open": "Bejegyzés kibontása",
|
||||
"status.pin": "Kitűzés a profilodra",
|
||||
"status.quote": "Idézés",
|
||||
"status.quote.cancel": "Idézés elvetése",
|
||||
"status.quote_error.filtered": "A szűrőid miatt rejtett",
|
||||
"status.quote_error.not_available": "A bejegyzés nem érhető el",
|
||||
"status.quote_error.pending_approval": "A bejegyzés függőben van",
|
||||
"status.quote_error.pending_approval_popout.body": "A Födiverzumon keresztül megosztott idézetek megjelenítése eltarthat egy darabig, mivel a különböző kiszolgálók különböző protokollokat használnak.",
|
||||
"status.quote_error.pending_approval_popout.title": "Függőben lévő idézet? Maradj nyugodt.",
|
||||
"status.quote_followers_only": "Csak a követők idézhetik ezt a bejegyzést",
|
||||
"status.quote_manual_review": "A szerző kézileg fogja jóváhagyni",
|
||||
"status.quote_policy_change": "Módosítás, hogy kik idézhetnek",
|
||||
"status.quote_post_author": "Idézte @{name} bejegyzését",
|
||||
"status.quote_private": "A privát bejegyzések nem idézhetőek",
|
||||
"status.quotes": "{count, plural, one {idézés} other {idézés}}",
|
||||
"status.quotes.empty": "Senki sem idézte még ezt a bejegyzést. Ha valaki megteszi, itt fog megjelenni.",
|
||||
"status.read_more": "Bővebben",
|
||||
"status.reblog": "Megtolás",
|
||||
"status.reblog_private": "Megtolás az eredeti közönségnek",
|
||||
|
@ -901,6 +919,7 @@
|
|||
"status.reply": "Válasz",
|
||||
"status.replyAll": "Válasz a beszélgetésre",
|
||||
"status.report": "@{name} bejelentése",
|
||||
"status.request_quote": "Idézés kérése",
|
||||
"status.revoke_quote": "Saját bejegyzés eltávolítása @{name} bejegyzéséből",
|
||||
"status.sensitive_warning": "Kényes tartalom",
|
||||
"status.share": "Megosztás",
|
||||
|
@ -939,6 +958,7 @@
|
|||
"upload_button.label": "Képek, videó vagy audiófájl hozzáadása",
|
||||
"upload_error.limit": "A fájlfeltöltési korlát elérésre került.",
|
||||
"upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
|
||||
"upload_error.quote": "Idézésnél nem lehet fájlt feltölteni.",
|
||||
"upload_form.drag_and_drop.instructions": "Egy médiamelléklet kiválasztásához nyomj Szóközt vagy Entert. Húzás közben használd a nyílgombokat a médiamelléklet adott irányba történő mozgatásához. A médiamelléklet új pozícióba helyezéséhez nyomd meg a Szóközt vagy az Entert, vagy a megszakításhoz nyomd meg az Esc gombot.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Az áthúzás megszakítva. A(z) {item} médiamelléklet el lett dobva.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "A(z) {item} médiamelléklet el lett dobva.",
|
||||
|
@ -964,14 +984,15 @@
|
|||
"video.volume_up": "Hangerő fel",
|
||||
"visibility_modal.button_title": "Láthatóság beállítása",
|
||||
"visibility_modal.header": "Láthatóság és interakció",
|
||||
"visibility_modal.helper.direct_quoting": "A privát említések nem idézhetőek.",
|
||||
"visibility_modal.helper.direct_quoting": "A Mastodonon készült privát említéseket mások nem idézhetik.",
|
||||
"visibility_modal.helper.privacy_editing": "A közzétett bejegyzések láthatósága nem módosítható.",
|
||||
"visibility_modal.helper.private_quoting": "A csak követőknek szánt bejegyzéseket nem lehet idézni.",
|
||||
"visibility_modal.helper.private_quoting": "A Mastodonon írt, csak követőknek szóló bejegyzéseket mások nem idézhetik.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Amikor idéznek tőled, a bejegyzésük rejtve lesz a felkapott bejegyzések hírfolyamain is.",
|
||||
"visibility_modal.instructions": "Döntsd el, hogy ki léphet interakcióba a bejegyzéssel. A globális beállítások a <link>Beállítások > Egyéb</link> alatt találhatóak.",
|
||||
"visibility_modal.privacy_label": "Adatvédelem",
|
||||
"visibility_modal.quote_followers": "Csak követőknek",
|
||||
"visibility_modal.quote_label": "Módosítás, hogy kik idézhetnek",
|
||||
"visibility_modal.quote_nobody": "Senki",
|
||||
"visibility_modal.quote_public": "Bárki"
|
||||
"visibility_modal.quote_nobody": "Csak én",
|
||||
"visibility_modal.quote_public": "Bárki",
|
||||
"visibility_modal.save": "Mentés"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "Servitores moderate",
|
||||
"about.contact": "Contacto:",
|
||||
"about.default_locale": "Default",
|
||||
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Ration non disponibile",
|
||||
"about.domain_blocks.preamble": "Mastodon generalmente permitte vider le contento de, e interager con, usatores de qualcunque altere servitor in le fediverso. Istes es le exceptiones que ha essite facite sur iste servitor particular.",
|
||||
|
@ -8,6 +9,7 @@
|
|||
"about.domain_blocks.silenced.title": "Limitate",
|
||||
"about.domain_blocks.suspended.explanation": "Nulle datos de iste servitor essera processate, immagazinate o excambiate, rendente omne interaction o communication con usatores de iste servitor impossibile.",
|
||||
"about.domain_blocks.suspended.title": "Suspendite",
|
||||
"about.language_label": "Lingua",
|
||||
"about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.",
|
||||
"about.powered_by": "Rete social decentralisate, actionate per {mastodon}",
|
||||
"about.rules": "Regulas del servitor",
|
||||
|
@ -41,6 +43,7 @@
|
|||
"account.followers": "Sequitores",
|
||||
"account.followers.empty": "Necuno seque ancora iste usator.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}",
|
||||
"account.followers_you_know_counter": "{counter} que tu cognosce",
|
||||
"account.following": "Sequente",
|
||||
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
|
||||
"account.follows.empty": "Iste usator non seque ancora alcuno.",
|
||||
|
@ -216,6 +219,13 @@
|
|||
"confirmations.delete_list.confirm": "Deler",
|
||||
"confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
|
||||
"confirmations.delete_list.title": "Deler lista?",
|
||||
"confirmations.discard_draft.confirm": "Discartar e continuar",
|
||||
"confirmations.discard_draft.edit.cancel": "Reprender le modification",
|
||||
"confirmations.discard_draft.edit.message": "Si tu continua, tu perdera tote le modificatione que tu ha apportate al message que tu modifica in iste momento.",
|
||||
"confirmations.discard_draft.edit.title": "Discartar le modificationes de tu message?",
|
||||
"confirmations.discard_draft.post.cancel": "Retornar al esbosso",
|
||||
"confirmations.discard_draft.post.message": "Si tu continua, tu perdera le message que tu compone in iste momento.",
|
||||
"confirmations.discard_draft.post.title": "Discartar tu esbosso de message?",
|
||||
"confirmations.discard_edit_media.confirm": "Abandonar",
|
||||
"confirmations.discard_edit_media.message": "Tu ha cambiamentos non salvate in le description o previsualisation del objecto multimedial. Abandonar los?",
|
||||
"confirmations.follow_to_list.confirm": "Sequer e adder al lista",
|
||||
|
@ -235,6 +245,9 @@
|
|||
"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.revoke_quote.confirm": "Remover message",
|
||||
"confirmations.revoke_quote.message": "Iste action non pote esser disfacite.",
|
||||
"confirmations.revoke_quote.title": "Remover message?",
|
||||
"confirmations.unfollow.confirm": "Non plus sequer",
|
||||
"confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?",
|
||||
"confirmations.unfollow.title": "Cessar de sequer le usator?",
|
||||
|
@ -279,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tu pseudonymo:",
|
||||
"domain_pill.your_server": "Tu casa digital, ubi vive tote tu messages. Non te place? Cambia de servitor a omne momento e porta tu sequitores con te.",
|
||||
"domain_pill.your_username": "Tu identificator unic sur iste servitor. Es possibile trovar usatores con le mesme nomine de usator sur servitores differente.",
|
||||
"dropdown.empty": "Selige un option",
|
||||
"embed.instructions": "Incorpora iste message sur tu sito web con le codice sequente.",
|
||||
"embed.preview": "Ecce como illlo parera:",
|
||||
"emoji_button.activity": "Activitate",
|
||||
|
@ -296,6 +310,8 @@
|
|||
"emoji_button.search_results": "Resultatos de recerca",
|
||||
"emoji_button.symbols": "Symbolos",
|
||||
"emoji_button.travel": "Viages e locos",
|
||||
"empty_column.account_featured.me": "Tu non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
|
||||
"empty_column.account_featured.other": "{acct} non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?",
|
||||
"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",
|
||||
|
@ -325,9 +341,15 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "Copiar le traciamento del pila al area de transferentia",
|
||||
"errors.unexpected_crash.report_issue": "Reportar problema",
|
||||
"explore.suggested_follows": "Personas",
|
||||
"explore.title": "In tendentia",
|
||||
"explore.trending_links": "Novas",
|
||||
"explore.trending_statuses": "Messages",
|
||||
"explore.trending_tags": "Hashtags",
|
||||
"featured_carousel.header": "{count, plural, one {Message fixate} other {Messages fixate}}",
|
||||
"featured_carousel.next": "Sequente",
|
||||
"featured_carousel.post": "Message",
|
||||
"featured_carousel.previous": "Precedente",
|
||||
"featured_carousel.slide": "{index} de {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Iste categoria de filtros non se applica al contexto in le qual tu ha accedite a iste message. Pro filtrar le message in iste contexto tamben, modifica le filtro.",
|
||||
"filter_modal.added.context_mismatch_title": "Contexto incoherente!",
|
||||
"filter_modal.added.expired_explanation": "Iste categoria de filtros ha expirate. Tu debe modificar le data de expiration pro applicar lo.",
|
||||
|
@ -380,6 +402,8 @@
|
|||
"generic.saved": "Salvate",
|
||||
"getting_started.heading": "Prime passos",
|
||||
"hashtag.admin_moderation": "Aperir le interfacie de moderation pro #{name}",
|
||||
"hashtag.browse": "Percurrer messages in #{hashtag}",
|
||||
"hashtag.browse_from_account": "Percurrer le messages de @{name} in #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "e {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
|
@ -404,6 +428,7 @@
|
|||
"hints.profiles.see_more_followers": "Vider plus de sequitores sur {domain}",
|
||||
"hints.profiles.see_more_follows": "Vider plus de sequites sur {domain}",
|
||||
"hints.profiles.see_more_posts": "Vider plus de messages sur {domain}",
|
||||
"home.column_settings.show_quotes": "Monstrar citationes",
|
||||
"home.column_settings.show_reblogs": "Monstrar impulsos",
|
||||
"home.column_settings.show_replies": "Monstrar responsas",
|
||||
"home.hide_announcements": "Celar annuncios",
|
||||
|
@ -458,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Aperir le chronologia de initio",
|
||||
"keyboard_shortcuts.hotkey": "Clave accelerator",
|
||||
"keyboard_shortcuts.legend": "Monstrar iste legenda",
|
||||
"keyboard_shortcuts.load_more": "Focalisar le button “Cargar plus”",
|
||||
"keyboard_shortcuts.local": "Aperir le chronologia local",
|
||||
"keyboard_shortcuts.mention": "Mentionar le autor",
|
||||
"keyboard_shortcuts.muted": "Aperir lista de usatores silentiate",
|
||||
|
@ -477,6 +503,8 @@
|
|||
"keyboard_shortcuts.translate": "a traducer un message",
|
||||
"keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca",
|
||||
"keyboard_shortcuts.up": "Displaciar in alto in le lista",
|
||||
"learn_more_link.got_it": "Comprendite",
|
||||
"learn_more_link.learn_more": "Pro saper plus",
|
||||
"lightbox.close": "Clauder",
|
||||
"lightbox.next": "Sequente",
|
||||
"lightbox.previous": "Precedente",
|
||||
|
@ -526,8 +554,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
|
||||
"mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.",
|
||||
"navigation_bar.about": "A proposito",
|
||||
"navigation_bar.account_settings": "Contrasigno e securitate",
|
||||
"navigation_bar.administration": "Administration",
|
||||
"navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate",
|
||||
"navigation_bar.automated_deletion": "Deletion automatic del message",
|
||||
"navigation_bar.blocks": "Usatores blocate",
|
||||
"navigation_bar.bookmarks": "Marcapaginas",
|
||||
"navigation_bar.direct": "Mentiones private",
|
||||
|
@ -537,13 +567,23 @@
|
|||
"navigation_bar.follow_requests": "Requestas de sequimento",
|
||||
"navigation_bar.followed_tags": "Hashtags sequite",
|
||||
"navigation_bar.follows_and_followers": "Sequites e sequitores",
|
||||
"navigation_bar.import_export": "Importar e exportar",
|
||||
"navigation_bar.lists": "Listas",
|
||||
"navigation_bar.live_feed_local": "Canal in directo (local)",
|
||||
"navigation_bar.live_feed_public": "Canal in directo (public)",
|
||||
"navigation_bar.logout": "Clauder session",
|
||||
"navigation_bar.moderation": "Moderation",
|
||||
"navigation_bar.more": "Plus",
|
||||
"navigation_bar.mutes": "Usatores silentiate",
|
||||
"navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.",
|
||||
"navigation_bar.preferences": "Preferentias",
|
||||
"navigation_bar.privacy_and_reach": "Confidentialitate e portata",
|
||||
"navigation_bar.search": "Cercar",
|
||||
"navigation_bar.search_trends": "Cercar / In tendentia",
|
||||
"navigation_panel.collapse_followed_tags": "Contraher le menu de hashtags sequite",
|
||||
"navigation_panel.collapse_lists": "Contraher le menu de listas",
|
||||
"navigation_panel.expand_followed_tags": "Expander le menu de hashtags sequite",
|
||||
"navigation_panel.expand_lists": "Expander le menu de listas",
|
||||
"not_signed_in_indicator.not_signed_in": "Es necessari aperir session pro acceder a iste ressource.",
|
||||
"notification.admin.report": "{name} ha reportate {target}",
|
||||
"notification.admin.report_account": "{name} ha reportate {count, plural, one {un message} other {# messages}} de {target} per {category}",
|
||||
|
@ -565,6 +605,7 @@
|
|||
"notification.label.mention": "Mention",
|
||||
"notification.label.private_mention": "Mention private",
|
||||
"notification.label.private_reply": "Responsa private",
|
||||
"notification.label.quote": "{name} ha citate tu message",
|
||||
"notification.label.reply": "Responder",
|
||||
"notification.mention": "Mention",
|
||||
"notification.mentioned_you": "{name} te ha mentionate",
|
||||
|
@ -579,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tu conto ha essite suspendite.",
|
||||
"notification.own_poll": "Tu sondage ha finite",
|
||||
"notification.poll": "Un sondage in le qual tu ha votate ha finite",
|
||||
"notification.quoted_update": "{name} ha modificate un message que tu ha citate",
|
||||
"notification.reblog": "{name} ha impulsate tu message",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# altere} other {# alteres}}</a> ha impulsate tu message",
|
||||
"notification.relationships_severance_event": "Connexiones perdite con {name}",
|
||||
|
@ -622,6 +664,7 @@
|
|||
"notifications.column_settings.mention": "Mentiones:",
|
||||
"notifications.column_settings.poll": "Resultatos del sondage:",
|
||||
"notifications.column_settings.push": "Notificationes push",
|
||||
"notifications.column_settings.quote": "Citationes:",
|
||||
"notifications.column_settings.reblog": "Impulsos:",
|
||||
"notifications.column_settings.show": "Monstrar in columna",
|
||||
"notifications.column_settings.sound": "Reproducer sono",
|
||||
|
@ -697,11 +740,18 @@
|
|||
"privacy.private.short": "Sequitores",
|
||||
"privacy.public.long": "Quicunque, sur Mastodon o non",
|
||||
"privacy.public.short": "Public",
|
||||
"privacy.quote.anyone": "{visibility}, omnes pote citar",
|
||||
"privacy.quote.disabled": "{visibility}, citation disactivate",
|
||||
"privacy.quote.limited": "{visibility}, citation limitate",
|
||||
"privacy.unlisted.additional": "Isto es exactemente como public, excepte que le message non apparera in fluxos in directo, in hashtags, in Explorar, o in le recerca de Mastodon, mesmo si tu ha optate pro render tote le conto discoperibile.",
|
||||
"privacy.unlisted.long": "Minus fanfares algorithmic",
|
||||
"privacy.unlisted.short": "Public, non listate",
|
||||
"privacy_policy.last_updated": "Ultime actualisation {date}",
|
||||
"privacy_policy.title": "Politica de confidentialitate",
|
||||
"quote_error.poll": "Non es permittite citar sondages.",
|
||||
"quote_error.quote": "Solmente un citation al vice es permittite.",
|
||||
"quote_error.unauthorized": "Tu non es autorisate a citar iste message.",
|
||||
"quote_error.upload": "Non es permittite citar con annexos multimedial.",
|
||||
"recommended": "Recommendate",
|
||||
"refresh": "Refrescar",
|
||||
"regeneration_indicator.please_stand_by": "Un momento, per favor.",
|
||||
|
@ -770,6 +820,7 @@
|
|||
"report_notification.categories.violation": "Violation del regulas",
|
||||
"report_notification.categories.violation_sentence": "violation del regulas",
|
||||
"report_notification.open": "Aperir reporto",
|
||||
"search.clear": "Rader le recerca",
|
||||
"search.no_recent_searches": "Nulle recercas recente",
|
||||
"search.placeholder": "Cercar",
|
||||
"search.quick_action.account_search": "Profilos correspondente a {x}",
|
||||
|
@ -807,10 +858,14 @@
|
|||
"status.admin_account": "Aperir le interfacie de moderation pro @{name}",
|
||||
"status.admin_domain": "Aperir le interfacie de moderation pro {domain}",
|
||||
"status.admin_status": "Aperir iste message in le interfacie de moderation",
|
||||
"status.all_disabled": "Impulso e citation es disactivate",
|
||||
"status.block": "Blocar @{name}",
|
||||
"status.bookmark": "Adder al marcapaginas",
|
||||
"status.cancel_reblog_private": "Disfacer impulso",
|
||||
"status.cannot_quote": "Le autor ha disactivate le citation de iste message",
|
||||
"status.cannot_reblog": "Iste message non pote esser impulsate",
|
||||
"status.context.load_new_replies": "Nove responsas disponibile",
|
||||
"status.context.loading": "Cercante plus responsas",
|
||||
"status.continued_thread": "Continuation del discussion",
|
||||
"status.copy": "Copiar ligamine a message",
|
||||
"status.delete": "Deler",
|
||||
|
@ -836,6 +891,17 @@
|
|||
"status.mute_conversation": "Silentiar conversation",
|
||||
"status.open": "Expander iste message",
|
||||
"status.pin": "Fixar sur profilo",
|
||||
"status.quote": "Citar",
|
||||
"status.quote.cancel": "Cancellar le citation",
|
||||
"status.quote_error.filtered": "Celate a causa de un de tu filtros",
|
||||
"status.quote_error.not_available": "Message indisponibile",
|
||||
"status.quote_error.pending_approval": "Message pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "Le citationes distribuite a transverso le Fediverso pote tardar in apparer, perque differente servitores ha differente protocollos.",
|
||||
"status.quote_error.pending_approval_popout.title": "Citation pendente? Resta calme",
|
||||
"status.quote_policy_change": "Cambiar qui pote citar",
|
||||
"status.quote_post_author": "Ha citate un message de @{name}",
|
||||
"status.quote_private": "Le messages private non pote esser citate",
|
||||
"status.quotes": "{count, plural, one {citation} other {citationes}}",
|
||||
"status.read_more": "Leger plus",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_private": "Impulsar con visibilitate original",
|
||||
|
@ -845,11 +911,12 @@
|
|||
"status.redraft": "Deler e reconciper",
|
||||
"status.remove_bookmark": "Remover marcapagina",
|
||||
"status.remove_favourite": "Remover del favoritos",
|
||||
"status.replied_in_thread": "Respondite in le discussion",
|
||||
"status.replied_to": "Respondite a {name}",
|
||||
"status.replied_in_thread": "Responsa in discussion",
|
||||
"status.replied_to": "Responsa a {name}",
|
||||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al discussion",
|
||||
"status.report": "Reportar @{name}",
|
||||
"status.revoke_quote": "Remover mi message del message de @{name}",
|
||||
"status.sensitive_warning": "Contento sensibile",
|
||||
"status.share": "Compartir",
|
||||
"status.show_less_all": "Monstrar minus pro totes",
|
||||
|
@ -865,9 +932,13 @@
|
|||
"subscribed_languages.save": "Salvar le cambiamentos",
|
||||
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
|
||||
"tabs_bar.home": "Initio",
|
||||
"tabs_bar.menu": "Menu",
|
||||
"tabs_bar.notifications": "Notificationes",
|
||||
"tabs_bar.publish": "Nove message",
|
||||
"tabs_bar.search": "Cercar",
|
||||
"terms_of_service.effective_as_of": "In vigor a partir de {date}",
|
||||
"terms_of_service.title": "Conditiones de servicio",
|
||||
"terms_of_service.upcoming_changes_on": "Cambiamentos a venir le {date}",
|
||||
"time_remaining.days": "{number, plural, one {# die} other {# dies}} restante",
|
||||
"time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restante",
|
||||
"time_remaining.minutes": "{number, plural, one {# minuta} other {# minutas}} restante",
|
||||
|
@ -875,7 +946,7 @@
|
|||
"time_remaining.seconds": "{number, plural, one {# secunda} other {# secundas}} restante",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} in le passate {days, plural, one {die} other {{days} dies}}",
|
||||
"trends.trending_now": "Ora in tendentias",
|
||||
"ui.beforeunload": "Tu esbosso essera predite si tu exi de Mastodon.",
|
||||
"ui.beforeunload": "Tu esbosso essera perdite si tu exi de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
|
@ -883,6 +954,7 @@
|
|||
"upload_button.label": "Adde imagines, un video o un file de audio",
|
||||
"upload_error.limit": "Limite de incargamento de files excedite.",
|
||||
"upload_error.poll": "Incargamento de files non permittite con sondages.",
|
||||
"upload_error.quote": "Non es permittite incargar files con citationes.",
|
||||
"upload_form.drag_and_drop.instructions": "Pro prender un annexo multimedial, preme sur le barra de spatios o Enter. Trahente lo, usa le claves de flecha pro displaciar le annexo multimedial in un certe direction. Preme le barra de spatios o Enter de novo pro deponer le annexo multimedial in su nove position, o preme sur Escape pro cancellar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Le displaciamento ha essite cancellate. Le annexo multimedial {item} ha essite deponite.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Le annexo multimedial {item} ha essite deponite.",
|
||||
|
@ -902,7 +974,21 @@
|
|||
"video.pause": "Pausa",
|
||||
"video.play": "Reproducer",
|
||||
"video.skip_backward": "Saltar a retro",
|
||||
"video.skip_forward": "Avantiar",
|
||||
"video.unmute": "Non plus silentiar",
|
||||
"video.volume_down": "Abassar le volumine",
|
||||
"video.volume_up": "Augmentar le volumine"
|
||||
"video.volume_up": "Augmentar le volumine",
|
||||
"visibility_modal.button_title": "Definir visibilitate",
|
||||
"visibility_modal.header": "Visibilitate e interaction",
|
||||
"visibility_modal.helper.direct_quoting": "Le mentiones private scribite sur Mastodon non pote esser citate per alteres.",
|
||||
"visibility_modal.helper.privacy_editing": "Le messages ja publicate non pote cambiar de visibilitate.",
|
||||
"visibility_modal.helper.private_quoting": "Le messages limitate al sequitores scribite sur Mastodon non pote esser citate per alteres.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando un persona te cita, su message essera tamben celate del chronologia \"In tendentia\".",
|
||||
"visibility_modal.instructions": "Controla qui pote interager con iste message. Le parametros global se trova sub <link>Preferentias > Alteres</link>.",
|
||||
"visibility_modal.privacy_label": "Confidentialitate",
|
||||
"visibility_modal.quote_followers": "Solmente sequitores",
|
||||
"visibility_modal.quote_label": "Cambiar qui pote citar",
|
||||
"visibility_modal.quote_nobody": "Solo io",
|
||||
"visibility_modal.quote_public": "Omnes",
|
||||
"visibility_modal.save": "Salvar"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Opna heimatímalínu",
|
||||
"keyboard_shortcuts.hotkey": "Flýtilykill",
|
||||
"keyboard_shortcuts.legend": "Birta þessa skýringu",
|
||||
"keyboard_shortcuts.load_more": "Gera \"Hlaða inn meiru\"-hnappinn virkan",
|
||||
"keyboard_shortcuts.local": "Opna staðværa tímalínu",
|
||||
"keyboard_shortcuts.mention": "Minnast á höfund",
|
||||
"keyboard_shortcuts.muted": "Opna lista yfir þaggaða notendur",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Opna margmiðlunargögn",
|
||||
"keyboard_shortcuts.pinned": "Opna lista yfir festar færslur",
|
||||
"keyboard_shortcuts.profile": "Opna notandasnið höfundar",
|
||||
"keyboard_shortcuts.quote": "Vitna í færslu",
|
||||
"keyboard_shortcuts.reply": "Svara færslu",
|
||||
"keyboard_shortcuts.requests": "Opna lista yfir fylgjendabeiðnir",
|
||||
"keyboard_shortcuts.search": "Setja virkni í leitarreit",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Notandaaðgangurinn þinn hefur verið settur í frysti.",
|
||||
"notification.own_poll": "Könnuninni þinni er lokið",
|
||||
"notification.poll": "Könnun sem þú greiddir atkvæði í er lokið",
|
||||
"notification.quoted_update": "{name} breytti færslu sem þú hefur vitnað í",
|
||||
"notification.reblog": "{name} endurbirti færsluna þína",
|
||||
"notification.reblog.name_and_others_with_link": "{name} og <a>{count, plural, one {# í viðbót hefur} other {# í viðbót hafa}}</a> endurbirt færsluna þína",
|
||||
"notification.relationships_severance_event": "Missti tengingar við {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Fylgjendur",
|
||||
"privacy.public.long": "Hver sem er, á og utan Mastodon",
|
||||
"privacy.public.short": "Opinbert",
|
||||
"privacy.quote.anyone": "{visibility}, hver sem er getur vitnað í færslu",
|
||||
"privacy.quote.disabled": "{visibility}, tilvitnanir eru óvirkar",
|
||||
"privacy.quote.limited": "{visibility}, tilvitnanir eru takmarkaðar",
|
||||
"privacy.unlisted.additional": "Þetta hegðar sér eins og opinber færsla, fyrir utan að færslan birtist ekki í beinum streymum eða myllumerkjum, né heldur í Mastodon-leitum jafnvel þótt þú hafir valið að falla undir slíkt í notandasniðinu þínu.",
|
||||
"privacy.unlisted.long": "Minni stælar í reikniritum",
|
||||
"privacy.unlisted.short": "Hljóðlátt opinbert",
|
||||
"privacy_policy.last_updated": "Síðast uppfært {date}",
|
||||
"privacy_policy.title": "Persónuverndarstefna",
|
||||
"quote_error.poll": "Ekki er leyft að vitna í kannanir.",
|
||||
"quote_error.quote": "Einungis ein tilvitnun er leyfð í einu.",
|
||||
"quote_error.unauthorized": "Þú hefur ekki heimild til að vitna í þessa færslu.",
|
||||
"quote_error.upload": "Ekki er leyft að vitna í myndviðhengi.",
|
||||
"recommended": "Mælt með",
|
||||
"refresh": "Endurlesa",
|
||||
"regeneration_indicator.please_stand_by": "Hinkraðu við.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
|
||||
"status.admin_domain": "Opna umsjónarviðmót fyrir @{domain}",
|
||||
"status.admin_status": "Opna þessa færslu í umsjónarviðmótinu",
|
||||
"status.all_disabled": "Endurbirtingar og tilvitnanir eru óvirkar",
|
||||
"status.block": "Útiloka @{name}",
|
||||
"status.bookmark": "Bókamerki",
|
||||
"status.cancel_reblog_private": "Taka úr endurbirtingu",
|
||||
"status.cannot_quote": "Höfundurinn hefur gert tilvitnanir óvirkar fyrir þessa færslu",
|
||||
"status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta",
|
||||
"status.context.load_new_replies": "Ný svör hafa borist",
|
||||
"status.context.loading": "Athuga með fleiri svör",
|
||||
"status.continued_thread": "Hélt samtali áfram",
|
||||
"status.copy": "Afrita tengil í færslu",
|
||||
"status.delete": "Eyða",
|
||||
"status.delete.success": "Færslu eytt",
|
||||
"status.detailed_status": "Nákvæm spjallþráðasýn",
|
||||
"status.direct": "Einkaspjall við @{name}",
|
||||
"status.direct_indicator": "Einkaspjall",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Þagga niður í samtali",
|
||||
"status.open": "Opna þessa færslu",
|
||||
"status.pin": "Festa á notandasnið",
|
||||
"status.quote": "Tilvitnun",
|
||||
"status.quote.cancel": "Hætta við tilvitnun",
|
||||
"status.quote_error.filtered": "Falið vegna einnar síu sem er virk",
|
||||
"status.quote_error.not_available": "Færsla ekki tiltæk",
|
||||
"status.quote_error.pending_approval": "Færsla í bið",
|
||||
"status.quote_error.pending_approval_popout.body": "Tilvitnanir sem deilt er út um samfélagsnetið geta þurft nokkurn tíma áður en þær birtast, því mismunandi netþjónar geta haft mismunandi samskiptareglur.",
|
||||
"status.quote_error.pending_approval_popout.title": "Færsla í bið? Verum róleg",
|
||||
"status.quote_followers_only": "Einungis fylgjendur geta vitnað í þessa færslu",
|
||||
"status.quote_manual_review": "Höfundur mun yfirfara handvirkt",
|
||||
"status.quote_policy_change": "Breyttu því hver getur tilvitnað",
|
||||
"status.quote_post_author": "Vitnaði í færslu frá @{name}",
|
||||
"status.quote_private": "Ekki er hægt að vitna í einkafærslur",
|
||||
"status.quotes": "{count, plural, one {tilvitnun} other {tilvitnanir}}",
|
||||
"status.quotes.empty": "Enginn hefur ennþá vitnað í þessa færslu. Þegar einhver gerir það, mun það birtast hér.",
|
||||
"status.read_more": "Lesa meira",
|
||||
"status.reblog": "Endurbirting",
|
||||
"status.reblog_or_quote": "Endurbirta eða vitna í færslu",
|
||||
"status.reblog_private": "Endurbirta til upphaflegra lesenda",
|
||||
"status.reblogged_by": "{name} endurbirti",
|
||||
"status.reblogs": "{count, plural, one {endurbirting} other {endurbirtingar}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Svara",
|
||||
"status.replyAll": "Svara þræði",
|
||||
"status.report": "Kæra @{name}",
|
||||
"status.request_quote": "Beiðni um tilvitnun",
|
||||
"status.revoke_quote": "Fjarlægja færsluna mína úr færslu frá @{name}",
|
||||
"status.sensitive_warning": "Viðkvæmt efni",
|
||||
"status.share": "Deila",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Bæta við myndum, myndskeiði eða hljóðskrá",
|
||||
"upload_error.limit": "Fór yfir takmörk á innsendingum skráa.",
|
||||
"upload_error.poll": "Innsending skráa er ekki leyfð í könnunum.",
|
||||
"upload_error.quote": "Innsending skráa er ekki leyfð í tilvitnunum.",
|
||||
"upload_form.drag_and_drop.instructions": "Til að taka í myndefnisviðhengi skaltu ýta á bilslána eða Enter. Til að draga geturðu notað örvalyklana til að færa viðhengið í samsvarandi áttir. Ýttu aftur á bilslána eða Enter til að sleppa viðhenginu á nýja staðinn, eða ýttu á Escape til að hætta við.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Hætt var við að draga. Myndefnisviðhenginu {item} var sleppt.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Myndefnisviðhenginu {item} var sleppt.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Hækka hljóðstyrk",
|
||||
"visibility_modal.button_title": "Stilla sýnileika",
|
||||
"visibility_modal.header": "Sýnileiki og gagnvirkni",
|
||||
"visibility_modal.helper.direct_quoting": "Ekki er hægt að vitna í einkaspjall.",
|
||||
"visibility_modal.helper.direct_quoting": "Ekki er hægt að vitna í einkaspjall sem skrifað er á Mastodon.",
|
||||
"visibility_modal.helper.privacy_editing": "Ekki er hægt að breyta sýnileika birtra færslna.",
|
||||
"visibility_modal.helper.private_quoting": "Ekki er hægt að vitna í færslur sem eingöngu eru til fylgjenda.",
|
||||
"visibility_modal.helper.private_quoting": "Ekki er hægt að vitna í færslur einungis til fylgjenda sem skrifaðar eru á Mastodon.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Þegar fólk vitnar í þig verða færslurnar þeirr einnig faldar á vinsældatímalínum.",
|
||||
"visibility_modal.instructions": "Stýrðu hverjir geta átt við þessa færslu. Víðværar stillingar finnast undir <link>Kjörstillingar > Annað</link>.",
|
||||
"visibility_modal.privacy_label": "Persónuvernd",
|
||||
"visibility_modal.quote_followers": "Einungis fylgjendur",
|
||||
"visibility_modal.quote_label": "Breyttu því hver getur tilvitnað",
|
||||
"visibility_modal.quote_nobody": "Enginn",
|
||||
"visibility_modal.quote_public": "Hver sem er"
|
||||
"visibility_modal.quote_nobody": "Bara ég",
|
||||
"visibility_modal.quote_public": "Hver sem er",
|
||||
"visibility_modal.save": "Vista"
|
||||
}
|
||||
|
|
|
@ -245,6 +245,9 @@
|
|||
"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.revoke_quote.confirm": "Elimina il post",
|
||||
"confirmations.revoke_quote.message": "Questa azione non può essere annullata.",
|
||||
"confirmations.revoke_quote.title": "Rimuovere il post?",
|
||||
"confirmations.unfollow.confirm": "Smetti di seguire",
|
||||
"confirmations.unfollow.message": "Sei sicuro di voler smettere di seguire {name}?",
|
||||
"confirmations.unfollow.title": "Smettere di seguire l'utente?",
|
||||
|
@ -289,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Il tuo nome univoco:",
|
||||
"domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi seguaci.",
|
||||
"domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.",
|
||||
"dropdown.empty": "Seleziona un'opzione",
|
||||
"embed.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.",
|
||||
"embed.preview": "Ecco come apparirà:",
|
||||
"emoji_button.activity": "Attività",
|
||||
|
@ -479,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Apre la cronologia domestica",
|
||||
"keyboard_shortcuts.hotkey": "Tasto di scelta rapida",
|
||||
"keyboard_shortcuts.legend": "Mostra questa legenda",
|
||||
"keyboard_shortcuts.load_more": "Evidenzia il pulsante \"Carica altro\"",
|
||||
"keyboard_shortcuts.local": "Apre la cronologia locale",
|
||||
"keyboard_shortcuts.mention": "Menziona l'autore",
|
||||
"keyboard_shortcuts.muted": "Apre l'elenco degli utenti silenziati",
|
||||
|
@ -615,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Il tuo account è stato sospeso.",
|
||||
"notification.own_poll": "Il tuo sondaggio è terminato",
|
||||
"notification.poll": "Un sondaggio in cui hai votato è terminato",
|
||||
"notification.quoted_update": "{name} ha modificato un post che hai citato",
|
||||
"notification.reblog": "{name} ha rebloggato il tuo post",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# altro} other {altri #}}</a> hanno condiviso il tuo post",
|
||||
"notification.relationships_severance_event": "Connessioni perse con {name}",
|
||||
|
@ -734,11 +740,18 @@
|
|||
"privacy.private.short": "Follower",
|
||||
"privacy.public.long": "Chiunque dentro e fuori Mastodon",
|
||||
"privacy.public.short": "Pubblico",
|
||||
"privacy.quote.anyone": "{visibility}, chiunque può citare",
|
||||
"privacy.quote.disabled": "{visibility}, citazioni disabilitate",
|
||||
"privacy.quote.limited": "{visibility}, citazioni limitate",
|
||||
"privacy.unlisted.additional": "Si comporta esattamente come pubblico, tranne per il fatto che il post non verrà visualizzato nei feed live o negli hashtag, nell'esplorazione o nella ricerca Mastodon, anche se hai attivato l'attivazione a livello di account.",
|
||||
"privacy.unlisted.long": "Meno fanfare algoritmiche",
|
||||
"privacy.unlisted.short": "Pubblico silenzioso",
|
||||
"privacy_policy.last_updated": "Ultimo aggiornamento {date}",
|
||||
"privacy_policy.title": "Politica sulla Privacy",
|
||||
"quote_error.poll": "Nei sondaggi non sono consentite le citazioni.",
|
||||
"quote_error.quote": "È consentita una sola citazione alla volta.",
|
||||
"quote_error.unauthorized": "Non sei autorizzato a citare questo post.",
|
||||
"quote_error.upload": "Le citazioni non sono consentite con gli allegati multimediali.",
|
||||
"recommended": "Consigliato",
|
||||
"refresh": "Ricarica",
|
||||
"regeneration_indicator.please_stand_by": "Si prega di rimanere in attesa.",
|
||||
|
@ -845,9 +858,11 @@
|
|||
"status.admin_account": "Apri interfaccia di moderazione per @{name}",
|
||||
"status.admin_domain": "Apri l'interfaccia di moderazione per {domain}",
|
||||
"status.admin_status": "Apri questo post nell'interfaccia di moderazione",
|
||||
"status.all_disabled": "Condivisioni e citazioni sono disabilitate",
|
||||
"status.block": "Blocca @{name}",
|
||||
"status.bookmark": "Aggiungi segnalibro",
|
||||
"status.cancel_reblog_private": "Annulla reblog",
|
||||
"status.cannot_quote": "L'autore ha disabilitato le citazioni su questo post",
|
||||
"status.cannot_reblog": "Questo post non può essere condiviso",
|
||||
"status.context.load_new_replies": "Nuove risposte disponibili",
|
||||
"status.context.loading": "Controllo per altre risposte",
|
||||
|
@ -876,12 +891,17 @@
|
|||
"status.mute_conversation": "Silenzia conversazione",
|
||||
"status.open": "Espandi questo post",
|
||||
"status.pin": "Fissa in cima sul profilo",
|
||||
"status.quote": "Cita",
|
||||
"status.quote.cancel": "Annulla la citazione",
|
||||
"status.quote_error.filtered": "Nascosto a causa di uno dei tuoi filtri",
|
||||
"status.quote_error.not_available": "Post non disponibile",
|
||||
"status.quote_error.pending_approval": "Post in attesa",
|
||||
"status.quote_error.pending_approval_popout.body": "Le citazioni condivise in tutto il Fediverso possono richiedere del tempo per la visualizzazione, poiché server diversi hanno protocolli diversi.",
|
||||
"status.quote_error.pending_approval_popout.title": "Citazione in attesa? Resta calmo",
|
||||
"status.quote_policy_change": "Cambia chi può citare",
|
||||
"status.quote_post_author": "Citato un post di @{name}",
|
||||
"status.quote_private": "I post privati non possono essere citati",
|
||||
"status.quotes": "{count, plural, one {citazione} other {citazioni}}",
|
||||
"status.read_more": "Leggi di più",
|
||||
"status.reblog": "Reblog",
|
||||
"status.reblog_private": "Reblog con visibilità originale",
|
||||
|
@ -896,6 +916,7 @@
|
|||
"status.reply": "Rispondi",
|
||||
"status.replyAll": "Rispondi alla conversazione",
|
||||
"status.report": "Segnala @{name}",
|
||||
"status.revoke_quote": "Rimuovi il mio post da quello di @{name}",
|
||||
"status.sensitive_warning": "Contenuto sensibile",
|
||||
"status.share": "Condividi",
|
||||
"status.show_less_all": "Mostra meno per tutti",
|
||||
|
@ -933,6 +954,7 @@
|
|||
"upload_button.label": "Aggiungi un file immagine, video o audio",
|
||||
"upload_error.limit": "Limite di caricamento dei file superato.",
|
||||
"upload_error.poll": "Caricamento del file non consentito con i sondaggi.",
|
||||
"upload_error.quote": "Caricamento file non consentito con le citazioni.",
|
||||
"upload_form.drag_and_drop.instructions": "Per selezionare un allegato multimediale, premi Spazio o Invio. Mentre trascini, usa i tasti con le frecce per spostare l'allegato multimediale in una qualsiasi direzione. Premi di nuovo Spazio o Invio per rilasciare l'allegato multimediale nella sua nuova posizione, oppure premi Esc per annullare.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Il trascinamento è stato annullato. L'allegato multimediale {item} è stato eliminato.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "L'allegato multimediale {item} è stato eliminato.",
|
||||
|
@ -955,5 +977,18 @@
|
|||
"video.skip_forward": "Vai avanti",
|
||||
"video.unmute": "Muta",
|
||||
"video.volume_down": "Abbassa volume",
|
||||
"video.volume_up": "Alza volume"
|
||||
"video.volume_up": "Alza volume",
|
||||
"visibility_modal.button_title": "Imposta la visibilità",
|
||||
"visibility_modal.header": "Visibilità e interazione",
|
||||
"visibility_modal.helper.direct_quoting": "Le menzioni private scritte su Mastodon non possono essere citate da altri.",
|
||||
"visibility_modal.helper.privacy_editing": "La visibilità dei post pubblicati non può essere modificata.",
|
||||
"visibility_modal.helper.private_quoting": "I post scritti e riservati ai seguaci su Mastodon non possono essere citati da altri.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando le persone ti citano, il loro post verrà nascosto anche dalle timeline di tendenza.",
|
||||
"visibility_modal.instructions": "Controlla chi può interagire con questo post. Le impostazioni globali si trovano in <link>Preferenze > Altro</link>.",
|
||||
"visibility_modal.privacy_label": "Privacy",
|
||||
"visibility_modal.quote_followers": "Solo i seguaci",
|
||||
"visibility_modal.quote_label": "Cambia chi può citare",
|
||||
"visibility_modal.quote_nobody": "Solo io",
|
||||
"visibility_modal.quote_public": "Chiunque",
|
||||
"visibility_modal.save": "Salva"
|
||||
}
|
||||
|
|
|
@ -218,6 +218,7 @@
|
|||
"domain_pill.who_you_are": "Imi isulay-ik·im yeqqar-d anwa i d kečč·kemmi d wanda i telliḍ, zemren medden ad myigwen yid-k·m deg web anmetti yebnan s <button>tɣeṛɣaṛ yemmugen s ActivityPub</button>.",
|
||||
"domain_pill.your_handle": "Asulay-ik·im:",
|
||||
"domain_pill.your_server": "D axxam-inek·inem umḍin, anda i zedɣent akk tsuffaɣ-ik·im. Ur k·m-yeεǧib ara wa? Ssenfel-d iqeddacen melmi i ak·m-yehwa, awi-d daɣen ineḍfaren-ik·im yid-k·m.",
|
||||
"dropdown.empty": "Fren taxtiṛit",
|
||||
"embed.instructions": "Ẓẓu addad-agi deg usmel-inek·inem s wenɣal n tangalt yellan sdaw-agi.",
|
||||
"embed.preview": "Akka ara d-iban:",
|
||||
"emoji_button.activity": "Aqeddic",
|
||||
|
@ -315,6 +316,7 @@
|
|||
"hashtag.follow": "Ḍfeṛ ahacṭag",
|
||||
"hashtag.mute": "Sgugem #{hashtag}",
|
||||
"hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}",
|
||||
"hints.profiles.see_more_posts": "Wali ugar n tsuffaɣ ɣef {domain}",
|
||||
"home.column_settings.show_quotes": "Sken-d tibdarin",
|
||||
"home.column_settings.show_reblogs": "Ssken-d beṭṭu",
|
||||
"home.column_settings.show_replies": "Ssken-d tiririyin",
|
||||
|
@ -322,6 +324,7 @@
|
|||
"home.pending_critical_update.body": "Ma ulac aɣilif, leqqem aqeddac-ik Mastodon akken kan tzemreḍ !",
|
||||
"home.pending_critical_update.link": "Wali ileqman",
|
||||
"home.show_announcements": "Ssken-d ulɣuyen",
|
||||
"ignore_notifications_modal.ignore": "Ttu ilɣa",
|
||||
"info_button.label": "Tallelt",
|
||||
"interaction_modal.action.favourite": "I wakken ad tkemmleḍ, yessefk ad d-tḥemmleḍ seg umiḍan-ik·im.",
|
||||
"interaction_modal.action.follow": "I wakken ad tkemmleḍ, yessefk ad d-tḍefreḍ seg umiḍan-ik·im.",
|
||||
|
@ -389,6 +392,7 @@
|
|||
"lists.delete": "Kkes tabdart",
|
||||
"lists.done": "Immed",
|
||||
"lists.edit": "Ẓreg tabdart",
|
||||
"lists.find_users_to_add": "Af-d iseqdacen ara ternuḍ",
|
||||
"lists.list_name": "Isem n tebdart",
|
||||
"lists.new_list_name": "Isem n tebdart tamaynut",
|
||||
"lists.no_lists_yet": "Ulac tibdarin akka tura.",
|
||||
|
@ -412,6 +416,7 @@
|
|||
"mute_modal.you_wont_see_mentions": "Ur tezmireḍ ara ad twaliḍ tisuffaɣ anda d-yettwabdar.",
|
||||
"mute_modal.you_wont_see_posts": "Yezmer ad yettwali tisuffaɣ-ik·im, maca ur tettwaliḍ ara tidak-is.",
|
||||
"navigation_bar.about": "Ɣef",
|
||||
"navigation_bar.account_settings": "Awal n uɛeddi akked tɣellist",
|
||||
"navigation_bar.administration": "Tadbelt",
|
||||
"navigation_bar.advanced_interface": "Ldi deg ugrudem n web leqqayen",
|
||||
"navigation_bar.blocks": "Iseqdacen yettusḥebsen",
|
||||
|
@ -449,6 +454,7 @@
|
|||
"notification.label.private_reply": "Tiririt tusligt",
|
||||
"notification.label.reply": "Tiririt",
|
||||
"notification.mention": "Abdar",
|
||||
"notification.mentioned_you": "{name} yebder-ik·em-id",
|
||||
"notification.moderation-warning.learn_more": "Issin ugar",
|
||||
"notification.moderation_warning.action_suspend": "Yettwaseḥbes umiḍan-ik.",
|
||||
"notification.own_poll": "Tafrant-ik·im tfuk",
|
||||
|
@ -461,8 +467,10 @@
|
|||
"notification_requests.exit_selection": "Immed",
|
||||
"notification_requests.notifications_from": "Ilɣa sɣur {name}",
|
||||
"notification_requests.title": "Ilɣa yettwasizdgen",
|
||||
"notification_requests.view": "Wali ilɣa",
|
||||
"notifications.clear": "Sfeḍ ilɣa",
|
||||
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk ilɣa-inek·em i lebda?",
|
||||
"notifications.clear_title": "Sfeḍ ilɣa?",
|
||||
"notifications.column_settings.admin.report": "Ineqqisen imaynuten:",
|
||||
"notifications.column_settings.alert": "Ilɣa n tnarit",
|
||||
"notifications.column_settings.favourite": "Imenyafen:",
|
||||
|
@ -648,6 +656,8 @@
|
|||
"status.mute_conversation": "Sgugem adiwenni",
|
||||
"status.open": "Semɣeṛ tasuffeɣt-ayi",
|
||||
"status.pin": "Senteḍ-itt deg umaɣnu",
|
||||
"status.quote": "Tanebdurt",
|
||||
"status.quote.cancel": "Semmet tanebdurt",
|
||||
"status.quote_post_author": "Yebder-d tasuffeɣt sɣur @{name}",
|
||||
"status.read_more": "Issin ugar",
|
||||
"status.reblog": "Bḍu",
|
||||
|
@ -707,5 +717,9 @@
|
|||
"video.mute": "Sgugem",
|
||||
"video.pause": "Sgunfu",
|
||||
"video.play": "Seddu",
|
||||
"video.unmute": "Kkes asgugem"
|
||||
"video.unmute": "Kkes asgugem",
|
||||
"visibility_modal.privacy_label": "Tabaḍnit",
|
||||
"visibility_modal.quote_followers": "Imeḍfaṛen kan",
|
||||
"visibility_modal.quote_label": "Beddel anwa i izemren ad k-id-yebder",
|
||||
"visibility_modal.quote_public": "Yal yiwen"
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
"account.mute_short": "뮤트",
|
||||
"account.muted": "뮤트됨",
|
||||
"account.muting": "뮤트함",
|
||||
"account.mutual": "서로 팔로우 중입니다",
|
||||
"account.mutual": "서로 팔로우",
|
||||
"account.no_bio": "제공된 설명이 없습니다.",
|
||||
"account.open_original_page": "원본 페이지 열기",
|
||||
"account.posts": "게시물",
|
||||
|
@ -482,6 +482,7 @@
|
|||
"keyboard_shortcuts.home": "홈 타임라인 열기",
|
||||
"keyboard_shortcuts.hotkey": "핫키",
|
||||
"keyboard_shortcuts.legend": "이 개요 표시",
|
||||
"keyboard_shortcuts.load_more": "\"더 보기\" 버튼에 포커스",
|
||||
"keyboard_shortcuts.local": "로컬 타임라인 열기",
|
||||
"keyboard_shortcuts.mention": "작성자에게 멘션",
|
||||
"keyboard_shortcuts.muted": "뮤트된 사용자 목록 열기",
|
||||
|
@ -661,6 +662,7 @@
|
|||
"notifications.column_settings.mention": "멘션:",
|
||||
"notifications.column_settings.poll": "설문 결과:",
|
||||
"notifications.column_settings.push": "푸시 알림",
|
||||
"notifications.column_settings.quote": "인용:",
|
||||
"notifications.column_settings.reblog": "부스트:",
|
||||
"notifications.column_settings.show": "컬럼에 표시",
|
||||
"notifications.column_settings.sound": "효과음 재생",
|
||||
|
@ -736,11 +738,15 @@
|
|||
"privacy.private.short": "팔로워",
|
||||
"privacy.public.long": "마스토돈 내외 모두",
|
||||
"privacy.public.short": "공개",
|
||||
"privacy.quote.anyone": "{visibility}, 누구나 인용 가능",
|
||||
"privacy.quote.disabled": "{visibility}, 인용 비활성화",
|
||||
"privacy.quote.limited": "{visibility}, 제한된 인용",
|
||||
"privacy.unlisted.additional": "공개와 똑같지만 게시물이 실시간 피드나 해시태그, 둘러보기, (계정 설정에서 허용했더라도) 마스토돈 검색에서 제외됩니다.",
|
||||
"privacy.unlisted.long": "더 적은 알고리즘 팡파르",
|
||||
"privacy.unlisted.short": "조용한 공개",
|
||||
"privacy_policy.last_updated": "{date}에 마지막으로 업데이트됨",
|
||||
"privacy_policy.title": "개인정보처리방침",
|
||||
"quote_error.unauthorized": "이 글을 인용할 권한이 없습니다.",
|
||||
"recommended": "추천함",
|
||||
"refresh": "새로고침",
|
||||
"regeneration_indicator.please_stand_by": "잠시 기다려주세요.",
|
||||
|
@ -847,9 +853,11 @@
|
|||
"status.admin_account": "@{name}에 대한 중재 화면 열기",
|
||||
"status.admin_domain": "{domain}에 대한 중재 화면 열기",
|
||||
"status.admin_status": "중재 화면에서 이 게시물 열기",
|
||||
"status.all_disabled": "부스트와 인용이 비활성화되었습니다",
|
||||
"status.block": "@{name} 차단",
|
||||
"status.bookmark": "북마크",
|
||||
"status.cancel_reblog_private": "부스트 취소",
|
||||
"status.cannot_quote": "작성자가 이 게시물의 인용을 비활성화했습니다",
|
||||
"status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다",
|
||||
"status.context.load_new_replies": "새 답글 보기",
|
||||
"status.context.loading": "추가 답글 확인중",
|
||||
|
@ -878,6 +886,8 @@
|
|||
"status.mute_conversation": "대화 뮤트",
|
||||
"status.open": "상세 정보 표시",
|
||||
"status.pin": "고정",
|
||||
"status.quote": "인용",
|
||||
"status.quote.cancel": "인용 취소",
|
||||
"status.quote_error.filtered": "필터에 의해 가려짐",
|
||||
"status.quote_error.not_available": "게시물 사용 불가",
|
||||
"status.quote_error.pending_approval": "게시물 대기중",
|
||||
|
@ -956,5 +966,12 @@
|
|||
"video.skip_forward": "앞으로 건너뛰기",
|
||||
"video.unmute": "음소거 해제",
|
||||
"video.volume_down": "음량 감소",
|
||||
"video.volume_up": "음량 증가"
|
||||
"video.volume_up": "음량 증가",
|
||||
"visibility_modal.button_title": "공개범위 설정",
|
||||
"visibility_modal.privacy_label": "공개범위",
|
||||
"visibility_modal.quote_followers": "팔로워 전용",
|
||||
"visibility_modal.quote_label": "누가 인용할 수 있는지",
|
||||
"visibility_modal.quote_nobody": "나에게만",
|
||||
"visibility_modal.quote_public": "아무나",
|
||||
"visibility_modal.save": "저장"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "Moderētie serveri",
|
||||
"about.contact": "Kontakts:",
|
||||
"about.default_locale": "Noklusējums",
|
||||
"about.disclaimer": "Mastodon ir bezmaksas atklātā pirmkoda programmatūra un Mastodon gGmbH preču zīme.",
|
||||
"about.domain_blocks.no_reason_available": "Iemesls nav norādīts",
|
||||
"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ī.",
|
||||
|
@ -8,6 +9,7 @@
|
|||
"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 jebkādu mijiedarbību vai saziņu ar šī servera lietotājiem.",
|
||||
"about.domain_blocks.suspended.title": "Apturētie",
|
||||
"about.language_label": "Valoda",
|
||||
"about.not_available": "Šī informācija nav padarīta pieejama šajā serverī.",
|
||||
"about.powered_by": "Decentralizētu sabiedrisko tīklu darbina {mastodon}",
|
||||
"about.rules": "Servera noteikumi",
|
||||
|
@ -145,6 +147,7 @@
|
|||
"bundle_column_error.routing.body": "Pieprasīto lapu nevarēja atrast. Vai esi pārliecināts, ka URL adreses joslā ir pareizs?",
|
||||
"bundle_column_error.routing.title": "404",
|
||||
"bundle_modal_error.close": "Aizvērt",
|
||||
"bundle_modal_error.message": "Kaut kas nogāja greizi šī ekrāna ielādēšanas laikā.",
|
||||
"bundle_modal_error.retry": "Mēģināt vēlreiz",
|
||||
"closed_registrations.other_server_instructions": "Tā kā Mastodon ir decentralizēts, tu vari izveidot kontu citā serverī un joprojām mijiedarboties ar šo.",
|
||||
"closed_registrations_modal.description": "Pašlaik nav iespējams izveidot kontu {domain}, bet, lūdzu, ņem vērā, ka Tev nav nepieciešams tieši {domain} konts, lai lietotu Mastodon!",
|
||||
|
@ -213,6 +216,11 @@
|
|||
"confirmations.delete_list.confirm": "Dzēst",
|
||||
"confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?",
|
||||
"confirmations.delete_list.title": "Izdzēst sarakstu?",
|
||||
"confirmations.discard_draft.confirm": "Atmest un turpināt",
|
||||
"confirmations.discard_draft.edit.cancel": "Atsākt labošanu",
|
||||
"confirmations.discard_draft.post.cancel": "Atsākt melnrakstu",
|
||||
"confirmations.discard_draft.post.message": "Turpinot tiks atmests pašreiz sastādītais ieraksts.",
|
||||
"confirmations.discard_draft.post.title": "Atmest melnraksta ierakstu?",
|
||||
"confirmations.discard_edit_media.confirm": "Atmest",
|
||||
"confirmations.discard_edit_media.message": "Ir nesaglabātas izmaiņas informācijas nesēja aprakstā vai priekšskatījumā. Vēlies tās atmest tik un tā?",
|
||||
"confirmations.follow_to_list.confirm": "Sekot un pievienot sarakstam",
|
||||
|
@ -232,6 +240,9 @@
|
|||
"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.revoke_quote.confirm": "Noņemt ierakstu",
|
||||
"confirmations.revoke_quote.message": "Šo darbību nevar atsaukt.",
|
||||
"confirmations.revoke_quote.title": "Noņemt ierakstu?",
|
||||
"confirmations.unfollow.confirm": "Pārstāt sekot",
|
||||
"confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?",
|
||||
"confirmations.unfollow.title": "Pārtraukt sekošanu lietotājam?",
|
||||
|
@ -268,6 +279,7 @@
|
|||
"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 <button>ar ActivityPub darbinātām platformām</button>.",
|
||||
"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 <button>ar ActivityPub darbinātām platformām</button>.",
|
||||
"domain_pill.your_handle": "Tavs turis:",
|
||||
"dropdown.empty": "Atlasīt iespēju",
|
||||
"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",
|
||||
|
@ -317,6 +329,7 @@
|
|||
"explore.trending_statuses": "Ieraksti",
|
||||
"explore.trending_tags": "Tēmturi",
|
||||
"featured_carousel.next": "Tālāk",
|
||||
"featured_carousel.post": "Ieraksts",
|
||||
"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.",
|
||||
|
@ -335,6 +348,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Izmanto esošu kategoriju vai izveido jaunu",
|
||||
"filter_modal.select_filter.title": "Atlasīt šo ierakstu",
|
||||
"filter_modal.title.status": "Atlasīt ziņu",
|
||||
"filter_warning.matches_filter": "Atbilst atlasītājam “<span>{title}</span>”",
|
||||
"filtered_notifications_banner.title": "Filtrētie paziņojumi",
|
||||
"firehose.all": "Visi",
|
||||
"firehose.local": "Šis serveris",
|
||||
|
@ -449,6 +463,8 @@
|
|||
"keyboard_shortcuts.translate": "tulkot ierakstu",
|
||||
"keyboard_shortcuts.unfocus": "Atfokusēt veidojamā teksta/meklēšanas lauku",
|
||||
"keyboard_shortcuts.up": "Pārvietoties augšup sarakstā",
|
||||
"learn_more_link.got_it": "Sapratu",
|
||||
"learn_more_link.learn_more": "Uzzināt vairāk",
|
||||
"lightbox.close": "Aizvērt",
|
||||
"lightbox.next": "Tālāk",
|
||||
"lightbox.previous": "Iepriekšējais",
|
||||
|
@ -466,6 +482,7 @@
|
|||
"lists.delete": "Izdzēst sarakstu",
|
||||
"lists.done": "Gatavs",
|
||||
"lists.edit": "Labot sarakstu",
|
||||
"lists.find_users_to_add": "Atrast lietotājus, kurus pievienot",
|
||||
"lists.list_name": "Saraksta nosaukums",
|
||||
"lists.remove_member": "Noņemt",
|
||||
"lists.replies_policy.followed": "Jebkuram sekotajam lietotājam",
|
||||
|
@ -531,6 +548,8 @@
|
|||
"notification_requests.dismiss": "Noraidīt",
|
||||
"notification_requests.edit_selection": "Labot",
|
||||
"notification_requests.exit_selection": "Gatavs",
|
||||
"notification_requests.explainer_for_limited_account": "Paziņojumi no šī konta tika atsijāti, jo pārvaldītājs ierobežoja kontu.",
|
||||
"notification_requests.explainer_for_limited_remote_account": "Paziņojumi no šī konta tika atsijāti, jo pārvaldītājs ierobežoja kontu vai tā serveri.",
|
||||
"notification_requests.notifications_from": "Paziņojumi no {name}",
|
||||
"notification_requests.title": "Atlasītie paziņojumi",
|
||||
"notification_requests.view": "Skatīt paziņojumus",
|
||||
|
@ -570,6 +589,7 @@
|
|||
"notifications.permission_required": "Darbvirsmas paziņojumi nav pieejami, jo nav piešķirta nepieciešamā atļauja.",
|
||||
"notifications.policy.accept": "Pieņemt",
|
||||
"notifications.policy.drop": "Ignorēt",
|
||||
"notifications.policy.filter_limited_accounts_hint": "Servera satura pārraudzītāju ierobežots",
|
||||
"notifications.policy.filter_new_accounts_title": "Jauni konti",
|
||||
"notifications.policy.filter_not_followers_title": "Cilvēki, kuri Tev neseko",
|
||||
"notifications.policy.filter_not_following_hint": "Līdz tos pašrocīgi apstiprināsi",
|
||||
|
@ -767,6 +787,7 @@
|
|||
"subscribed_languages.target": "Mainīt abonētās valodas priekš {target}",
|
||||
"tabs_bar.home": "Sākums",
|
||||
"tabs_bar.notifications": "Paziņojumi",
|
||||
"terms_of_service.effective_as_of": "Spēkā no {date}",
|
||||
"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}}",
|
||||
|
@ -800,5 +821,13 @@
|
|||
"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"
|
||||
"video.volume_up": "Pagriezt skaļāk",
|
||||
"visibility_modal.button_title": "Iestatīt redzamību",
|
||||
"visibility_modal.header": "Redzamība un mijjiedarbība",
|
||||
"visibility_modal.privacy_label": "Privātums",
|
||||
"visibility_modal.quote_followers": "Tikai sekotāji",
|
||||
"visibility_modal.quote_label": "Mainīt, kas var citēt",
|
||||
"visibility_modal.quote_nobody": "Tikai es",
|
||||
"visibility_modal.quote_public": "Ikviens",
|
||||
"visibility_modal.save": "Saglabāt"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Phah開tshù ê時間線",
|
||||
"keyboard_shortcuts.hotkey": "快速key",
|
||||
"keyboard_shortcuts.legend": "顯示tsit篇說明",
|
||||
"keyboard_shortcuts.load_more": "Kā焦點suá kàu「載入其他」ê鈕仔",
|
||||
"keyboard_shortcuts.local": "Phah開本站ê時間線",
|
||||
"keyboard_shortcuts.mention": "提起作者",
|
||||
"keyboard_shortcuts.muted": "Phah開消音ê用者列單",
|
||||
|
@ -738,11 +739,18 @@
|
|||
"privacy.private.short": "跟tuè lí ê",
|
||||
"privacy.public.long": "逐ê lâng(無論佇Mastodon以內á是以外)",
|
||||
"privacy.public.short": "公開ê",
|
||||
"privacy.quote.anyone": "{visibility},ta̍k ê lâng lóng ē當引用",
|
||||
"privacy.quote.disabled": "{visibility},停止引用PO文",
|
||||
"privacy.quote.limited": "{visibility},PO文引用受限",
|
||||
"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": "隱私權政策",
|
||||
"quote_error.poll": "有投票ê PO文bē當引用。",
|
||||
"quote_error.quote": "Tsi̍t改kan-ta ē當引用tsi̍t篇PO文。",
|
||||
"quote_error.unauthorized": "Lí bô權利引用tsit篇PO文。",
|
||||
"quote_error.upload": "有媒體附件ê PO文無允准引用。",
|
||||
"recommended": "推薦",
|
||||
"refresh": "Koh更新",
|
||||
"regeneration_indicator.please_stand_by": "請sió等leh。",
|
||||
|
@ -849,9 +857,11 @@
|
|||
"status.admin_account": "Phah開 @{name} ê管理界面",
|
||||
"status.admin_domain": "Phah開 {domain} ê管理界面",
|
||||
"status.admin_status": "Tī管理界面內底看tsit篇PO文",
|
||||
"status.all_disabled": "轉送kap引用停止使用",
|
||||
"status.block": "封鎖 @{name}",
|
||||
"status.bookmark": "冊籤",
|
||||
"status.cancel_reblog_private": "取消轉送",
|
||||
"status.cannot_quote": "作者有停止別lâng引用tsit篇PO文",
|
||||
"status.cannot_reblog": "Tsit篇PO文bē當轉送",
|
||||
"status.context.load_new_replies": "有新ê回應",
|
||||
"status.context.loading": "Leh檢查其他ê回應",
|
||||
|
@ -879,6 +889,8 @@
|
|||
"status.mute": "消音 @{name}",
|
||||
"status.mute_conversation": "Kā對話消音",
|
||||
"status.open": "Kā PO文展開",
|
||||
"status.quote": "引用",
|
||||
"status.quote.cancel": "取消引用",
|
||||
"status.quote_error.filtered": "Lí所設定ê過濾器kā tse khàm起來",
|
||||
"status.quote_error.not_available": "鋪文bē當看",
|
||||
"status.quote_error.pending_approval": "鋪文當咧送",
|
||||
|
@ -886,6 +898,7 @@
|
|||
"status.quote_error.pending_approval_popout.title": "Leh送引文?請sió等leh",
|
||||
"status.quote_policy_change": "改通引用ê lâng",
|
||||
"status.quote_post_author": "引用 @{name} ê PO文ah",
|
||||
"status.quote_private": "私人PO文bē當引用",
|
||||
"status.read_more": "讀詳細",
|
||||
"status.reblog": "轉送",
|
||||
"status.reblog_private": "照原PO ê通看見ê範圍轉送",
|
||||
|
@ -937,6 +950,7 @@
|
|||
"upload_button.label": "加圖片、影片á是聲音檔",
|
||||
"upload_error.limit": "超過檔案傳起去ê限制",
|
||||
"upload_error.poll": "Bô允準佇投票ê時kā檔案傳起去。",
|
||||
"upload_error.quote": "引用PO文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。",
|
||||
|
@ -962,14 +976,12 @@
|
|||
"video.volume_up": "變khah大聲",
|
||||
"visibility_modal.button_title": "設定通看ê程度",
|
||||
"visibility_modal.header": "通看ê程度kap互動",
|
||||
"visibility_modal.helper.direct_quoting": "私人ê提起bē當引用。",
|
||||
"visibility_modal.helper.privacy_editing": "公開ê PO文bē當改in通看ê程度。",
|
||||
"visibility_modal.helper.private_quoting": "Bē當引用kan-ta跟tuè ê通看ê PO文。",
|
||||
"visibility_modal.helper.unlisted_quoting": "若別lâng引用lí,in ê PO文mā ē tuì趨勢時間線隱藏。",
|
||||
"visibility_modal.instructions": "控制ē當kap tsit篇PO文互動ê lâng,Ē當佇 <link>偏愛ê設定>其他</link>tshuē tio̍h全地ê設定。",
|
||||
"visibility_modal.privacy_label": "隱私權",
|
||||
"visibility_modal.quote_followers": "Kan-ta hōo跟tuè ê lâng",
|
||||
"visibility_modal.quote_label": "改通引用ê lâng",
|
||||
"visibility_modal.quote_nobody": "無半位",
|
||||
"visibility_modal.quote_public": "Ta̍k ê lâng"
|
||||
"visibility_modal.quote_public": "Ta̍k ê lâng",
|
||||
"visibility_modal.save": "儲存"
|
||||
}
|
||||
|
|
|
@ -23,11 +23,14 @@
|
|||
"account.edit_profile": "प्रोफाइल सम्पादन गर्नुहोस्",
|
||||
"account.enable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित गर्नुहोस्",
|
||||
"account.endorse": "प्रोफाइलमा फिचर गर्नुहोस्",
|
||||
"account.featured": "फिचर गरिएको",
|
||||
"account.featured.accounts": "प्रोफाइलहरू",
|
||||
"account.featured.hashtags": "ह्यासट्यागहरू",
|
||||
"account.featured_tags.last_status_never": "कुनै पोस्ट छैन",
|
||||
"account.follow": "फलो गर्नुहोस",
|
||||
"account.follow_back": "फलो ब्याक गर्नुहोस्",
|
||||
"account.followers": "फलोअरहरु",
|
||||
"account.followers.empty": "यस प्रयोगकर्तालाई अहिलेसम्म कसैले फलो गर्दैन।",
|
||||
"account.followers.empty": "यस प्रयोगकर्तालाई अहिलेसम्म कसैले फलो गरेको छैन।",
|
||||
"account.followers_counter": "{count, plural, one {{counter} फलोअर} other {{counter} फलोअरहरू}}",
|
||||
"account.following": "फलो गर्दै",
|
||||
"account.following_counter": "{count, plural, one {{counter} फलो गर्दै} other {{counter} फलो गर्दै}}",
|
||||
|
@ -42,6 +45,7 @@
|
|||
"account.mute_notifications_short": "सूचनाहरू म्यूट गर्नुहोस्",
|
||||
"account.mute_short": "म्युट",
|
||||
"account.muted": "म्युट गरिएको",
|
||||
"account.mutual": "तपाईंहरु एकअर्कालाई फलो गर्नुहुन्छ",
|
||||
"account.no_bio": "कुनै विवरण प्रदान गरिएको छैन।",
|
||||
"account.posts": "पोस्टहरू",
|
||||
"account.posts_with_replies": "पोस्ट र जवाफहरू",
|
||||
|
@ -53,6 +57,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": "अनफलो गर्नुहोस्",
|
||||
|
@ -64,6 +69,7 @@
|
|||
"admin.dashboard.retention.cohort_size": "नयाँ प्रयोगकर्ताहरू",
|
||||
"alert.rate_limited.message": "कृपया {retry_time, time, medium} पछि पुन: प्रयास गर्नुहोस्।",
|
||||
"alert.unexpected.message": "एउटा अनपेक्षित त्रुटि भयो।",
|
||||
"alt_text_modal.cancel": "रद्द गर्नुहोस्",
|
||||
"announcement.announcement": "घोषणा",
|
||||
"annual_report.summary.followers.followers": "फलोअरहरु",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "सबैभन्दा बढि बूस्ट गरिएको पोस्ट",
|
||||
|
@ -156,8 +162,13 @@
|
|||
"notification_requests.confirm_accept_multiple.title": "सूचना अनुरोधहरू स्वीकार गर्ने?",
|
||||
"notification_requests.confirm_dismiss_multiple.title": "सूचना अनुरोधहरू खारेज गर्ने?",
|
||||
"notifications.clear_title": "सूचनाहरू खाली गर्ने?",
|
||||
"notifications.column_settings.follow": "नयाँ फलोअरहरु:",
|
||||
"notifications.column_settings.follow_request": "नयाँ फलोअर अनुरोधहरु",
|
||||
"notifications.column_settings.reblog": "बूस्टहरू:",
|
||||
"notifications.filter.boosts": "बूस्टहरू",
|
||||
"privacy.private.long": "मात्र तपाईंको फलोअरहरु",
|
||||
"privacy.private.short": "फलोअरहरु",
|
||||
"reply_indicator.cancel": "रद्द गर्नुहोस्",
|
||||
"report.comment.title": "के हामीले थाहा पाउनुपर्ने अरू केही छ जस्तो लाग्छ?",
|
||||
"report.forward_hint": "यो खाता अर्को सर्भरबाट हो। त्यहाँ पनि रिपोर्टको गुमनाम प्रतिलिपि पठाउने हो?",
|
||||
"report.rules.title": "कुन नियमहरू उल्लङ्घन भइरहेका छन्?",
|
||||
|
@ -172,5 +183,6 @@
|
|||
"status.reblog": "बूस्ट गर्नुहोस्",
|
||||
"status.reblogged_by": "{name} ले बूस्ट गर्नुभएको",
|
||||
"status.reblogs": "{count, plural, one {बूस्ट} other {बूस्टहरू}}",
|
||||
"status.unmute_conversation": "कुराकानी अनम्यूट गर्नुहोस्"
|
||||
"status.unmute_conversation": "कुराकानी अनम्यूट गर्नुहोस्",
|
||||
"visibility_modal.quote_followers": "फलोअरहरु मात्र"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Jouw fediverse-adres:",
|
||||
"domain_pill.your_server": "Jouw digitale thuis, waar al jouw berichten zich bevinden. Is deze server toch niet naar jouw wens? Dan kun je op elk moment naar een andere server verhuizen en ook jouw volgers overbrengen.",
|
||||
"domain_pill.your_username": "Jouw unieke identificatie-adres op deze server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.",
|
||||
"dropdown.empty": "Selecteer een optie",
|
||||
"embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.",
|
||||
"embed.preview": "Zo komt het eruit te zien:",
|
||||
"emoji_button.activity": "Activiteiten",
|
||||
|
@ -482,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Starttijdlijn tonen",
|
||||
"keyboard_shortcuts.hotkey": "Sneltoets",
|
||||
"keyboard_shortcuts.legend": "Deze legenda tonen",
|
||||
"keyboard_shortcuts.load_more": "\"Meer laden\"-knop focussen",
|
||||
"keyboard_shortcuts.local": "Lokale tijdlijn tonen",
|
||||
"keyboard_shortcuts.mention": "Account vermelden",
|
||||
"keyboard_shortcuts.muted": "Genegeerde gebruikers tonen",
|
||||
|
@ -490,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "Media openen",
|
||||
"keyboard_shortcuts.pinned": "Jouw vastgemaakte berichten tonen",
|
||||
"keyboard_shortcuts.profile": "Gebruikersprofiel auteur openen",
|
||||
"keyboard_shortcuts.quote": "Bericht citeren",
|
||||
"keyboard_shortcuts.reply": "Reageren",
|
||||
"keyboard_shortcuts.requests": "Jouw volgverzoeken tonen",
|
||||
"keyboard_shortcuts.search": "Zoekveld focussen",
|
||||
|
@ -618,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Jouw account is opgeschort.",
|
||||
"notification.own_poll": "Jouw peiling is beëindigd",
|
||||
"notification.poll": "Een peiling waaraan jij hebt meegedaan is beëindigd",
|
||||
"notification.quoted_update": "{name} bewerkte een door jou geciteerd bericht",
|
||||
"notification.reblog": "{name} boostte jouw bericht",
|
||||
"notification.reblog.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander persoon} other {# andere personen}}</a> hebben jouw bericht geboost",
|
||||
"notification.relationships_severance_event": "Verloren verbindingen met {name}",
|
||||
|
@ -730,18 +734,25 @@
|
|||
"poll.votes": "{votes, plural, one {# stem} other {# stemmen}}",
|
||||
"poll_button.add_poll": "Peiling toevoegen",
|
||||
"poll_button.remove_poll": "Peiling verwijderen",
|
||||
"privacy.change": "Zichtbaarheid van bericht aanpassen",
|
||||
"privacy.change": "Privacy voor een bericht aanpassen",
|
||||
"privacy.direct.long": "Alleen voor mensen die specifiek in het bericht worden vermeld",
|
||||
"privacy.direct.short": "Privébericht",
|
||||
"privacy.private.long": "Alleen jouw volgers",
|
||||
"privacy.private.short": "Volgers",
|
||||
"privacy.public.long": "Iedereen op Mastodon en daarbuiten",
|
||||
"privacy.public.short": "Openbaar",
|
||||
"privacy.quote.anyone": "{visibility}, iedereen kan citeren",
|
||||
"privacy.quote.disabled": "{visibility}, citeren uitgeschakeld",
|
||||
"privacy.quote.limited": "{visibility}, citeren beperkt",
|
||||
"privacy.unlisted.additional": "Dit is vergelijkbaar met openbaar, behalve dat het bericht niet op openbare tijdlijnen, onder hashtags, verkennen of zoeken verschijnt, zelfs als je je account daarvoor hebt ingesteld.",
|
||||
"privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen",
|
||||
"privacy.unlisted.short": "Minder openbaar",
|
||||
"privacy_policy.last_updated": "Laatst bijgewerkt op {date}",
|
||||
"privacy_policy.title": "Privacybeleid",
|
||||
"quote_error.poll": "Het is niet mogelijk om polls te citeren.",
|
||||
"quote_error.quote": "Je kunt maar één bericht per keer citeren.",
|
||||
"quote_error.unauthorized": "Je bent niet gemachtigd om dit bericht te citeren.",
|
||||
"quote_error.upload": "Je kunt geen mediabijlage aan een bericht met een citaat toevoegen.",
|
||||
"recommended": "Aanbevolen",
|
||||
"refresh": "Vernieuwen",
|
||||
"regeneration_indicator.please_stand_by": "Even geduld alsjeblieft.",
|
||||
|
@ -848,9 +859,11 @@
|
|||
"status.admin_account": "Moderatie-omgeving van @{name} openen",
|
||||
"status.admin_domain": "Moderatie-omgeving van {domain} openen",
|
||||
"status.admin_status": "Dit bericht in de moderatie-omgeving tonen",
|
||||
"status.all_disabled": "Boosts en citaten zijn uitgeschakeld",
|
||||
"status.block": "@{name} blokkeren",
|
||||
"status.bookmark": "Bladwijzer toevoegen",
|
||||
"status.cancel_reblog_private": "Niet langer boosten",
|
||||
"status.cannot_quote": "Dit account heeft het citeren van dit bericht uitgeschakeld",
|
||||
"status.cannot_reblog": "Dit bericht kan niet geboost worden",
|
||||
"status.context.load_new_replies": "Nieuwe reacties beschikbaar",
|
||||
"status.context.loading": "Op nieuwe reacties aan het controleren",
|
||||
|
@ -879,14 +892,23 @@
|
|||
"status.mute_conversation": "Gesprek negeren",
|
||||
"status.open": "Volledig bericht tonen",
|
||||
"status.pin": "Aan profielpagina vastmaken",
|
||||
"status.quote": "Citeren",
|
||||
"status.quote.cancel": "Citeren annuleren",
|
||||
"status.quote_error.filtered": "Verborgen door een van je filters",
|
||||
"status.quote_error.not_available": "Bericht niet beschikbaar",
|
||||
"status.quote_error.pending_approval": "Bericht in afwachting",
|
||||
"status.quote_error.pending_approval_popout.body": "Het kan even duren voordat citaten die in de Fediverse gedeeld worden, worden weergegeven. Omdat verschillende servers niet allemaal hetzelfde protocol gebruiken.",
|
||||
"status.quote_error.pending_approval_popout.title": "Even geduld wanneer het citaat nog moet worden goedgekeurd.",
|
||||
"status.quote_followers_only": "Alleen volgers mogen dit bericht citeren",
|
||||
"status.quote_manual_review": "De auteur gaat het handmatig beoordelen",
|
||||
"status.quote_policy_change": "Wijzig wie jou mag citeren",
|
||||
"status.quote_post_author": "Citeerde een bericht van @{name}",
|
||||
"status.quote_private": "Citeren van berichten aan alleen volgers is niet mogelijk",
|
||||
"status.quotes": "{count, plural, one {citaat} other {citaten}}",
|
||||
"status.quotes.empty": "Niemand heeft dit bericht nog geciteerd. Wanneer iemand dat doet, wordt dat hier getoond.",
|
||||
"status.read_more": "Meer lezen",
|
||||
"status.reblog": "Boosten",
|
||||
"status.reblog_or_quote": "Boosten of citeren",
|
||||
"status.reblog_private": "Boost naar oorspronkelijke ontvangers",
|
||||
"status.reblogged_by": "{name} boostte",
|
||||
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
|
||||
|
@ -899,6 +921,7 @@
|
|||
"status.reply": "Reageren",
|
||||
"status.replyAll": "Op iedereen reageren",
|
||||
"status.report": "@{name} rapporteren",
|
||||
"status.request_quote": "Verzoek om te citeren",
|
||||
"status.revoke_quote": "Mijn bericht uit het bericht van @{name} verwijderen",
|
||||
"status.sensitive_warning": "Gevoelige inhoud",
|
||||
"status.share": "Delen",
|
||||
|
@ -937,6 +960,7 @@
|
|||
"upload_button.label": "Afbeeldingen, een video- of een geluidsbestand toevoegen",
|
||||
"upload_error.limit": "Uploadlimiet van bestand overschreden.",
|
||||
"upload_error.poll": "Het uploaden van bestanden is bij peilingen niet toegestaan.",
|
||||
"upload_error.quote": "Je kunt geen bestand aan een bericht met een citaat toevoegen.",
|
||||
"upload_form.drag_and_drop.instructions": "Druk op spatie of enter om een mediabijlage op te pakken. Gebruik de pijltjestoetsen om de bijlage in een bepaalde richting te verplaatsen. Druk opnieuw op de spatiebalk of enter om de mediabijlage op de nieuwe positie te plaatsen, of druk op escape om te annuleren.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Slepen is geannuleerd. Mediabijlage {item} is niet verplaatst.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Mediabijlage {item} is niet verplaatst.",
|
||||
|
@ -959,5 +983,18 @@
|
|||
"video.skip_forward": "Vooruitspoelen",
|
||||
"video.unmute": "Dempen opheffen",
|
||||
"video.volume_down": "Volume omlaag",
|
||||
"video.volume_up": "Volume omhoog"
|
||||
"video.volume_up": "Volume omhoog",
|
||||
"visibility_modal.button_title": "Privacy instellen",
|
||||
"visibility_modal.header": "Zichtbaarheid en interactie",
|
||||
"visibility_modal.helper.direct_quoting": "Privéberichten afkomstig van Mastodon kunnen niet door anderen worden geciteerd.",
|
||||
"visibility_modal.helper.privacy_editing": "Het is niet mogelijk om de zichtbaarheid van geplaatste berichten te wijzigen.",
|
||||
"visibility_modal.helper.private_quoting": "Berichten aan alleen volgers afkomstig van Mastodon kunnen niet door anderen worden geciteerd.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Wanneer mensen jou citeren, verschijnt hun bericht ook niet onder trends.",
|
||||
"visibility_modal.instructions": "Bepaal wie wat met dit bericht kan doen. De globale instellingen vind je onder <link>Voorkeuren > Overig</link>.",
|
||||
"visibility_modal.privacy_label": "Privacy",
|
||||
"visibility_modal.quote_followers": "Alleen volgers",
|
||||
"visibility_modal.quote_label": "Wijzig wie jou mag citeren",
|
||||
"visibility_modal.quote_nobody": "Alleen ik",
|
||||
"visibility_modal.quote_public": "Iedereen",
|
||||
"visibility_modal.save": "Opslaan"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Handtaket ditt:",
|
||||
"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.",
|
||||
"dropdown.empty": "Vel eit alternativ",
|
||||
"embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden nedanfor.",
|
||||
"embed.preview": "Slik kjem det til å sjå ut:",
|
||||
"emoji_button.activity": "Aktivitet",
|
||||
|
@ -482,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Opne heimetidslina",
|
||||
"keyboard_shortcuts.hotkey": "Snøggtast",
|
||||
"keyboard_shortcuts.legend": "Vis denne forklaringa",
|
||||
"keyboard_shortcuts.load_more": "Fokuser på «Last meir»-knappen",
|
||||
"keyboard_shortcuts.local": "Opne lokal tidsline",
|
||||
"keyboard_shortcuts.mention": "Nemn forfattaren",
|
||||
"keyboard_shortcuts.muted": "Opne liste over målbundne brukarar",
|
||||
|
@ -594,8 +596,8 @@
|
|||
"notification.annual_report.view": "Sjå #Året ditt",
|
||||
"notification.favourite": "{name} markerte innlegget ditt som favoritt",
|
||||
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# annan} other {# andre}}</a> favorittmerka innlegget ditt",
|
||||
"notification.favourite_pm": "{name} favorittmerka den private nemninga di",
|
||||
"notification.favourite_pm.name_and_others_with_link": "{name} og <a>{count, plural, one {# annan} other {# andre}}</a> favorittmerka den private nemninga di",
|
||||
"notification.favourite_pm": "{name} favorittmerka den private omtalen din",
|
||||
"notification.favourite_pm.name_and_others_with_link": "{name} og <a>{count, plural, one {# annan} other {# andre}}</a> favorittmerka den private omtalen din",
|
||||
"notification.follow": "{name} fylgde deg",
|
||||
"notification.follow.name_and_others": "{name} og <a>{count, plural, one {# annan} other {# andre}}</a> fylgde deg",
|
||||
"notification.follow_request": "{name} har bedt om å fylgja deg",
|
||||
|
@ -618,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Kontoen din har blitt suspendert.",
|
||||
"notification.own_poll": "Rundspørjinga di er ferdig",
|
||||
"notification.poll": "Ei rundspørjing du røysta i er ferdig",
|
||||
"notification.quoted_update": "{name} redigerte eit innlegg du har sitert",
|
||||
"notification.reblog": "{name} framheva innlegget ditt",
|
||||
"notification.reblog.name_and_others_with_link": "{name} og <a>{count, plural, one {# annan} other {# andre}}</a> framheva innlegget ditt",
|
||||
"notification.relationships_severance_event": "Tapte samband med {name}",
|
||||
|
@ -658,7 +661,7 @@
|
|||
"notifications.column_settings.follow": "Nye fylgjarar:",
|
||||
"notifications.column_settings.follow_request": "Ny fylgjarførespurnader:",
|
||||
"notifications.column_settings.group": "Gruppe",
|
||||
"notifications.column_settings.mention": "Omtaler:",
|
||||
"notifications.column_settings.mention": "Omtalar:",
|
||||
"notifications.column_settings.poll": "Røysteresultat:",
|
||||
"notifications.column_settings.push": "Pushvarsel",
|
||||
"notifications.column_settings.quote": "Sitat:",
|
||||
|
@ -696,8 +699,8 @@
|
|||
"notifications.policy.filter_not_followers_title": "Folk som ikkje fylgjer deg",
|
||||
"notifications.policy.filter_not_following_hint": "Til du godkjenner dei manuelt",
|
||||
"notifications.policy.filter_not_following_title": "Folk du ikkje fylgjer",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtrert viss det ikkje er eit svar på dine eigne omtaler eller viss du fylgjer avsendaren",
|
||||
"notifications.policy.filter_private_mentions_title": "Masseutsende private omtaler",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtrert viss det ikkje er eit svar på dine eigne omtalar eller viss du fylgjer avsendaren",
|
||||
"notifications.policy.filter_private_mentions_title": "Masseutsende private omtalar",
|
||||
"notifications.policy.title": "Handter varsel frå…",
|
||||
"notifications_permission_banner.enable": "Skru på skrivebordsvarsel",
|
||||
"notifications_permission_banner.how_to_control": "Aktiver skrivebordsvarsel for å få varsel når Mastodon ikkje er open. Du kan nøye bestemme kva samhandlingar som skal føre til skrivebordsvarsel gjennom {icon}-knappen ovanfor etter at varsel er aktivert.",
|
||||
|
@ -737,11 +740,18 @@
|
|||
"privacy.private.short": "Fylgjarar",
|
||||
"privacy.public.long": "Kven som helst på og av Mastodon",
|
||||
"privacy.public.short": "Offentleg",
|
||||
"privacy.quote.anyone": "{visibility}, alle kan sitera",
|
||||
"privacy.quote.disabled": "{visibility}, ingen kan sitera",
|
||||
"privacy.quote.limited": "{visibility}, avgrensa sitat",
|
||||
"privacy.unlisted.additional": "Dette er akkurat som offentleg, bortsett frå at innlegga ikkje dukkar opp i direktestraumar eller merkelappar, i oppdagingar eller Mastodon-søk, sjølv om du har sagt ja til at kontoen skal vera synleg.",
|
||||
"privacy.unlisted.long": "Færre algoritmiske fanfarar",
|
||||
"privacy.unlisted.short": "Stille offentleg",
|
||||
"privacy_policy.last_updated": "Sist oppdatert {date}",
|
||||
"privacy_policy.title": "Personvernsreglar",
|
||||
"quote_error.poll": "Du kan ikkje sitera meiningsmålingar.",
|
||||
"quote_error.quote": "Det er berre lov med eitt sitat om gongen.",
|
||||
"quote_error.unauthorized": "Du har ikkje løyve til å sitera dette innlegget.",
|
||||
"quote_error.upload": "Du kan ikkje sitera medievedlegg.",
|
||||
"recommended": "Tilrådd",
|
||||
"refresh": "Oppdater",
|
||||
"regeneration_indicator.please_stand_by": "Vent litt.",
|
||||
|
@ -848,9 +858,11 @@
|
|||
"status.admin_account": "Opne moderasjonsgrensesnitt for @{name}",
|
||||
"status.admin_domain": "Opna moderatorgrensesnittet for {domain}",
|
||||
"status.admin_status": "Opne denne statusen i moderasjonsgrensesnittet",
|
||||
"status.all_disabled": "Framhevingar og sitat er skrudde av",
|
||||
"status.block": "Blokker @{name}",
|
||||
"status.bookmark": "Set bokmerke",
|
||||
"status.cancel_reblog_private": "Opphev framheving",
|
||||
"status.cannot_quote": "Skribenten har skrudd av sitat for dette innlegget",
|
||||
"status.cannot_reblog": "Du kan ikkje framheva dette innlegget",
|
||||
"status.context.load_new_replies": "Nye svar finst",
|
||||
"status.context.loading": "Ser etter fleire svar",
|
||||
|
@ -879,12 +891,17 @@
|
|||
"status.mute_conversation": "Demp samtale",
|
||||
"status.open": "Utvid denne statusen",
|
||||
"status.pin": "Fest på profil",
|
||||
"status.quote": "Siter",
|
||||
"status.quote.cancel": "Avbryt siteringa",
|
||||
"status.quote_error.filtered": "Gøymt på grunn av eitt av filtra dine",
|
||||
"status.quote_error.not_available": "Innlegget er ikkje tilgjengeleg",
|
||||
"status.quote_error.pending_approval": "Innlegget ventar",
|
||||
"status.quote_error.pending_approval_popout.body": "Sitat frå rundt om i allheimen kan ta tid å visa, fordi ulike tenarar har ulike protokollar.",
|
||||
"status.quote_error.pending_approval_popout.title": "Ventande sitat? Ikkje stress",
|
||||
"status.quote_policy_change": "Byt kven som kan sitera",
|
||||
"status.quote_post_author": "Siterte eit innlegg av @{name}",
|
||||
"status.quote_private": "Du kan ikkje sitera private innlegg",
|
||||
"status.quotes": "{count, plural, one {sitat} other {sitat}}",
|
||||
"status.read_more": "Les meir",
|
||||
"status.reblog": "Framhev",
|
||||
"status.reblog_private": "Framhev til dei originale mottakarane",
|
||||
|
@ -937,6 +954,7 @@
|
|||
"upload_button.label": "Legg til medium",
|
||||
"upload_error.limit": "Du har gått over opplastingsgrensa.",
|
||||
"upload_error.poll": "Filopplasting er ikkje lov for rundspørjingar.",
|
||||
"upload_error.quote": "Filopplasting er ikkje lov med sitat.",
|
||||
"upload_form.drag_and_drop.instructions": "For å plukka opp eit medievedlegg, trykkjer du på mellomrom eller enter. Når du dreg, brukar du piltastane for å flytta vedlegget i den retninga du vil. Deretter trykkjer du mellomrom eller enter att for å sleppa vedlegget på den nye plassen, eller trykk escape for å avbryta.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Du avbraut draginga. Medievedlegget {item} vart sleppt.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Medeivedlegget {item} vart sleppt.",
|
||||
|
@ -959,5 +977,18 @@
|
|||
"video.skip_forward": "Hopp framover",
|
||||
"video.unmute": "Opphev demping",
|
||||
"video.volume_down": "Volum ned",
|
||||
"video.volume_up": "Volum opp"
|
||||
"video.volume_up": "Volum opp",
|
||||
"visibility_modal.button_title": "Vel vising",
|
||||
"visibility_modal.header": "Vising og samhandling",
|
||||
"visibility_modal.helper.direct_quoting": "Private omtalar som er skrivne på Mastodon kan ikkje siterast av andre.",
|
||||
"visibility_modal.helper.privacy_editing": "Du kan ikkje endra vising på publiserte innlegg.",
|
||||
"visibility_modal.helper.private_quoting": "Innlegg som er skrivne på Mastodon og berre for fylgjarar kan ikkje siterast av andre.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Når folk siterer deg, vil innlegget deira ikkje syna på populære tidsliner.",
|
||||
"visibility_modal.instructions": "Kontroller kven som kan samhandla med dette innlegget. Innstillingane finn du under <link>Innstillingar > Anna</link>.",
|
||||
"visibility_modal.privacy_label": "Personvern",
|
||||
"visibility_modal.quote_followers": "Berre fylgjarar",
|
||||
"visibility_modal.quote_label": "Endre kven som kan sitera",
|
||||
"visibility_modal.quote_nobody": "Berre eg",
|
||||
"visibility_modal.quote_public": "Allle",
|
||||
"visibility_modal.save": "Lagre"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "O teu identificador:",
|
||||
"domain_pill.your_server": "A tua casa digital, onde se encontram todas as tuas publicações. Não gostas deste? Muda de servidor a qualquer momento e leva também os teus seguidores.",
|
||||
"domain_pill.your_username": "O teu identificador único neste servidor. É possível encontrares utilizadores com o mesmo nome de utilizador em diferentes servidores.",
|
||||
"dropdown.empty": "Selecione uma opção",
|
||||
"embed.instructions": "Incorpora esta publicação no teu site copiando o código abaixo.",
|
||||
"embed.preview": "Eis o aspeto que terá:",
|
||||
"emoji_button.activity": "Atividade",
|
||||
|
@ -482,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "abrir a cronologia na página inicial",
|
||||
"keyboard_shortcuts.hotkey": "Atalho",
|
||||
"keyboard_shortcuts.legend": "mostrar esta legenda",
|
||||
"keyboard_shortcuts.load_more": "Focar botão \"Carregar mais\"",
|
||||
"keyboard_shortcuts.local": "abrir a cronologia local",
|
||||
"keyboard_shortcuts.mention": "mencionar o autor",
|
||||
"keyboard_shortcuts.muted": "abrir a lista dos utilizadores ocultados",
|
||||
|
@ -618,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "A tua conta foi suspensa.",
|
||||
"notification.own_poll": "A tua sondagem terminou",
|
||||
"notification.poll": "Terminou uma sondagem em que votaste",
|
||||
"notification.quoted_update": "{name} editou uma publicação que citou",
|
||||
"notification.reblog": "{name} impulsionou a tua publicação",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# outros}}</a> impulsionaram a tua publicação",
|
||||
"notification.relationships_severance_event": "Perdeu as ligações com {name}",
|
||||
|
@ -737,11 +740,18 @@
|
|||
"privacy.private.short": "Seguidores",
|
||||
"privacy.public.long": "Qualquer pessoa no Mastodon ou não",
|
||||
"privacy.public.short": "Público",
|
||||
"privacy.quote.anyone": "{visibility}, qualquer pessoa pode citar",
|
||||
"privacy.quote.disabled": "{visibility}, citações desativadas",
|
||||
"privacy.quote.limited": "{visibility}, citações limitadas",
|
||||
"privacy.unlisted.additional": "Este comportamento é exatamente igual ao do público, exceto que a publicação não aparecerá em cronologias, nas etiquetas, ao explorar ou na pesquisa do Mastodon, mesmo que tenhas optado por participar em toda a tua conta.",
|
||||
"privacy.unlisted.long": "Menos fanfarras algorítmicas",
|
||||
"privacy.unlisted.short": "Público silencioso",
|
||||
"privacy_policy.last_updated": "Última atualização em {date}",
|
||||
"privacy_policy.title": "Política de privacidade",
|
||||
"quote_error.poll": "Não é permitido citar sondagens.",
|
||||
"quote_error.quote": "Apenas é permitida uma citação de cada vez.",
|
||||
"quote_error.unauthorized": "Não está autorizado a citar esta publicação.",
|
||||
"quote_error.upload": "Não é permitida a citação com anexos de multimédia.",
|
||||
"recommended": "Recomendado",
|
||||
"refresh": "Atualizar",
|
||||
"regeneration_indicator.please_stand_by": "Aguarda um momento.",
|
||||
|
@ -848,9 +858,11 @@
|
|||
"status.admin_account": "Abrir a interface de moderação para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderação para {domain}",
|
||||
"status.admin_status": "Abrir esta publicação na interface de moderação",
|
||||
"status.all_disabled": "Impulsos e citações estão desativados",
|
||||
"status.block": "Bloquear @{name}",
|
||||
"status.bookmark": "Guardar nos marcadores",
|
||||
"status.cancel_reblog_private": "Retirar impulso",
|
||||
"status.cannot_quote": "O autor desativou as citações nesta publicação",
|
||||
"status.cannot_reblog": "Esta publicação não pode ser impulsionada",
|
||||
"status.context.load_new_replies": "Novas respostas disponíveis",
|
||||
"status.context.loading": "A verificar por mais respostas",
|
||||
|
@ -879,12 +891,20 @@
|
|||
"status.mute_conversation": "Ocultar conversa",
|
||||
"status.open": "Expandir esta publicação",
|
||||
"status.pin": "Afixar no perfil",
|
||||
"status.quote": "Citação",
|
||||
"status.quote.cancel": "Cancelar citação",
|
||||
"status.quote_error.filtered": "Oculto devido a um dos seus filtros",
|
||||
"status.quote_error.not_available": "Publicação indisponível",
|
||||
"status.quote_error.pending_approval": "Publicação pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "As citações partilhadas no Fediverso podem demorar algum tempo a ser exibidas, uma vez que diferentes servidores têm protocolos diferentes.",
|
||||
"status.quote_error.pending_approval_popout.title": "Citação pendente? Mantenha a calma",
|
||||
"status.quote_followers_only": "Apenas seguidores podem citar esta publicação",
|
||||
"status.quote_manual_review": "O autor vai proceder a uma revisão manual",
|
||||
"status.quote_policy_change": "Alterar quem pode citar",
|
||||
"status.quote_post_author": "Citou uma publicação de @{name}",
|
||||
"status.quote_private": "Publicações privadas não podem ser citadas",
|
||||
"status.quotes": "{count, plural, one {citação} other {citações}}",
|
||||
"status.quotes.empty": "Ainda ninguém citou esta publicação. Quando alguém o fizer, aparecerá aqui.",
|
||||
"status.read_more": "Ler mais",
|
||||
"status.reblog": "Impulsionar",
|
||||
"status.reblog_private": "Impulsionar com a visibilidade original",
|
||||
|
@ -899,6 +919,7 @@
|
|||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder à conversa",
|
||||
"status.report": "Denunciar @{name}",
|
||||
"status.request_quote": "Pedir para citar",
|
||||
"status.revoke_quote": "Remover a minha publicação da publicação de @{name}",
|
||||
"status.sensitive_warning": "Conteúdo sensível",
|
||||
"status.share": "Partilhar",
|
||||
|
@ -937,6 +958,7 @@
|
|||
"upload_button.label": "Adicionar imagens, um vídeo ou um ficheiro de som",
|
||||
"upload_error.limit": "Limite de envio de ficheiros excedido.",
|
||||
"upload_error.poll": "Não é permitido o envio de ficheiros em sondagens.",
|
||||
"upload_error.quote": "Carregamento de ficheiros não é permitido com citações.",
|
||||
"upload_form.drag_and_drop.instructions": "Para escolher um anexo multimédia, prima espaço ou enter. Enquanto arrasta, utilize as teclas de setas para mover o anexo multimédia em qualquer direção. Prima espaço ou enter novamente para largar o anexo multimédia na sua nova posição ou prima escape para cancelar.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "O arrastamento foi cancelado. O anexo multimédia {item} foi descartado.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "O anexo multimédia {item} foi descartado.",
|
||||
|
@ -959,5 +981,18 @@
|
|||
"video.skip_forward": "Saltar para a frente",
|
||||
"video.unmute": "Ativar som",
|
||||
"video.volume_down": "Diminuir volume",
|
||||
"video.volume_up": "Aumentar volume"
|
||||
"video.volume_up": "Aumentar volume",
|
||||
"visibility_modal.button_title": "Definir visibilidade",
|
||||
"visibility_modal.header": "Visibilidade e interação",
|
||||
"visibility_modal.helper.direct_quoting": "As menções privadas criadas no Mastodon não podem ser citadas por outras pessoas.",
|
||||
"visibility_modal.helper.privacy_editing": "Publicações publicadas não podem alterar a sua visibilidade.",
|
||||
"visibility_modal.helper.private_quoting": "As publicações apenas para seguidores criadas no Mastodon não podem ser citadas por outras pessoas.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando as pessoas o citarem, as publicações delas serão também ocultadas das tendências.",
|
||||
"visibility_modal.instructions": "Controle quem pode interagir com esta publicação. As configurações globais podem ser encontradas em <link>Preferências > Outros</link>.",
|
||||
"visibility_modal.privacy_label": "Privacidade",
|
||||
"visibility_modal.quote_followers": "Apenas seguidores",
|
||||
"visibility_modal.quote_label": "Altere quem pode citar",
|
||||
"visibility_modal.quote_nobody": "Apenas eu",
|
||||
"visibility_modal.quote_public": "Todos",
|
||||
"visibility_modal.save": "Guardar"
|
||||
}
|
||||
|
|
|
@ -350,14 +350,14 @@
|
|||
"featured_carousel.previous": "Предыдущий",
|
||||
"featured_carousel.slide": "{index} из {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Этот фильтр не применяется в том контексте, в котором вы видели этот пост. Если вы хотите, чтобы пост был отфильтрован в текущем контексте, необходимо редактировать фильтр.",
|
||||
"filter_modal.added.context_mismatch_title": "Несоответствие контекста!",
|
||||
"filter_modal.added.context_mismatch_title": "Несоответствие контекста",
|
||||
"filter_modal.added.expired_explanation": "Этот фильтр истёк. Чтобы он был применён, вам нужно изменить срок действия фильтра.",
|
||||
"filter_modal.added.expired_title": "Истёкший фильтр!",
|
||||
"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.added.title": "Фильтр добавлен",
|
||||
"filter_modal.select_filter.context_mismatch": "не применяется в этом контексте",
|
||||
"filter_modal.select_filter.expired": "истёкший",
|
||||
"filter_modal.select_filter.prompt_new": "Новый фильтр: {name}",
|
||||
|
@ -433,7 +433,7 @@
|
|||
"home.hide_announcements": "Скрыть объявления",
|
||||
"home.pending_critical_update.body": "Пожалуйста, обновите свой сервер Mastodon как можно скорее!",
|
||||
"home.pending_critical_update.link": "Посмотреть обновления",
|
||||
"home.pending_critical_update.title": "Доступно критическое обновление безопасности!",
|
||||
"home.pending_critical_update.title": "Доступно критическое обновление безопасности",
|
||||
"home.show_announcements": "Показать объявления",
|
||||
"ignore_notifications_modal.disclaimer": "Mastodon не может сообщить пользователям, что вы игнорируете их уведомления. Игнорирование уведомлений не остановит отправку самих сообщений.",
|
||||
"ignore_notifications_modal.filter_instead": "Фильтровать",
|
||||
|
@ -590,7 +590,7 @@
|
|||
"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.message": "#Wrapstodon за {year} год ждёт вас! Откройте для себя итоги и памятные моменты этого года в Mastodon.",
|
||||
"notification.annual_report.view": "Перейти к #Wrapstodon",
|
||||
"notification.favourite": "{name} добавил(а) ваш пост в избранное",
|
||||
"notification.favourite.name_and_others_with_link": "{name} и ещё <a>{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}</a> добавили ваш пост в избранное",
|
||||
|
@ -861,7 +861,7 @@
|
|||
"status.direct": "Упомянуть @{name} лично",
|
||||
"status.direct_indicator": "Личное упоминание",
|
||||
"status.edit": "Редактировать",
|
||||
"status.edited": "Дата последнего изменения: {date}",
|
||||
"status.edited": "Последнее изменение: {date}",
|
||||
"status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
|
||||
"status.embed": "Встроить на свой сайт",
|
||||
"status.favourite": "Добавить в избранное",
|
||||
|
|
|
@ -246,6 +246,7 @@
|
|||
"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.revoke_quote.confirm": "Ta bort inlägg",
|
||||
"confirmations.revoke_quote.message": "Denna åtgärd kan inte ångras.",
|
||||
"confirmations.revoke_quote.title": "Ta bort inlägg?",
|
||||
"confirmations.unfollow.confirm": "Avfölj",
|
||||
"confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?",
|
||||
|
@ -603,6 +604,7 @@
|
|||
"notification.label.mention": "Nämn",
|
||||
"notification.label.private_mention": "Privat omnämnande",
|
||||
"notification.label.private_reply": "Privata svar",
|
||||
"notification.label.quote": "{name} citerade ditt inlägg",
|
||||
"notification.label.reply": "Svar",
|
||||
"notification.mention": "Nämn",
|
||||
"notification.mentioned_you": "{name} nämnde dig",
|
||||
|
@ -660,6 +662,7 @@
|
|||
"notifications.column_settings.mention": "Omnämningar:",
|
||||
"notifications.column_settings.poll": "Omröstningsresultat:",
|
||||
"notifications.column_settings.push": "Push-aviseringar",
|
||||
"notifications.column_settings.quote": "Citerat:",
|
||||
"notifications.column_settings.reblog": "Boostar:",
|
||||
"notifications.column_settings.show": "Visa i kolumnen",
|
||||
"notifications.column_settings.sound": "Spela upp ljud",
|
||||
|
@ -877,8 +880,14 @@
|
|||
"status.mute_conversation": "Tysta konversation",
|
||||
"status.open": "Utvidga detta inlägg",
|
||||
"status.pin": "Fäst i profil",
|
||||
"status.quote.cancel": "Återkalla citering",
|
||||
"status.quote_error.filtered": "Dolt på grund av ett av dina filter",
|
||||
"status.quote_error.not_available": "Inlägg ej tillgängligt",
|
||||
"status.quote_error.pending_approval": "Väntande inlägg",
|
||||
"status.quote_error.pending_approval_popout.body": "Citat som delas över Fediverse kan ta tid att visa, eftersom olika servrar har olika protokoll.",
|
||||
"status.quote_error.pending_approval_popout.title": "Väntande citat? Förbli lugn",
|
||||
"status.quote_policy_change": "Ändra vem som kan citera",
|
||||
"status.quote_post_author": "Citerade ett inlägg av @{name}",
|
||||
"status.read_more": "Läs mer",
|
||||
"status.reblog": "Boosta",
|
||||
"status.reblog_private": "Boosta med ursprunglig synlighet",
|
||||
|
@ -893,6 +902,7 @@
|
|||
"status.reply": "Svara",
|
||||
"status.replyAll": "Svara på tråden",
|
||||
"status.report": "Rapportera @{name}",
|
||||
"status.revoke_quote": "Ta bort mitt inlägg från @{name}s inlägg",
|
||||
"status.sensitive_warning": "Känsligt innehåll",
|
||||
"status.share": "Dela",
|
||||
"status.show_less_all": "Visa mindre för alla",
|
||||
|
@ -953,9 +963,14 @@
|
|||
"video.unmute": "Avtysta",
|
||||
"video.volume_down": "Volym ned",
|
||||
"video.volume_up": "Volym upp",
|
||||
"visibility_modal.button_title": "Ange synlighet",
|
||||
"visibility_modal.header": "Synlighet och interaktion",
|
||||
"visibility_modal.helper.privacy_editing": "Publicerade inlägg kan inte ändra deras synlighet.",
|
||||
"visibility_modal.helper.unlisted_quoting": "När folk citerar dig, deras inlägg kommer också att döljas från trendiga tidslinjer.",
|
||||
"visibility_modal.instructions": "Kontrollera vem som kan interagera med det här inlägget. Globala inställningar kan hittas under <link>Inställningar > Andra</link>.",
|
||||
"visibility_modal.privacy_label": "Integritet",
|
||||
"visibility_modal.quote_followers": "Endast följare",
|
||||
"visibility_modal.quote_nobody": "Ingen",
|
||||
"visibility_modal.quote_public": "Alla"
|
||||
"visibility_modal.quote_label": "Ändra vem som kan citera",
|
||||
"visibility_modal.quote_public": "Alla",
|
||||
"visibility_modal.save": "Spara"
|
||||
}
|
||||
|
|
|
@ -292,6 +292,7 @@
|
|||
"domain_pill.your_handle": "Tanıtıcınız:",
|
||||
"domain_pill.your_server": "Dijital anasayfanız, tüm gönderilerinizin yaşadığı yerdir. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de getirin.",
|
||||
"domain_pill.your_username": "Bu sunucudaki tekil tanımlayıcınız. Farklı sunucularda aynı kullanıcı adına sahip kullanıcıları bulmak mümkündür.",
|
||||
"dropdown.empty": "Bir seçenek seçin",
|
||||
"embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.",
|
||||
"embed.preview": "İşte nasıl görüneceği:",
|
||||
"emoji_button.activity": "Aktivite",
|
||||
|
@ -482,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "Ana akışı aç",
|
||||
"keyboard_shortcuts.hotkey": "Kısayol tuşu",
|
||||
"keyboard_shortcuts.legend": "Bu efsaneyi görüntülemek için",
|
||||
"keyboard_shortcuts.load_more": "\"Daha fazlası\" düğmesine odaklan",
|
||||
"keyboard_shortcuts.local": "Yerel akışı aç",
|
||||
"keyboard_shortcuts.mention": "Yazana değinmek için",
|
||||
"keyboard_shortcuts.muted": "Sessize alınmış kullanıcı listesini açmak için",
|
||||
|
@ -618,6 +620,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Hesabınız askıya alındı.",
|
||||
"notification.own_poll": "Anketiniz sona erdi",
|
||||
"notification.poll": "Oy verdiğiniz bir anket sona erdi",
|
||||
"notification.quoted_update": "{name} alıntıladığınız bir gönderiyi düzenledi",
|
||||
"notification.reblog": "{name} gönderini yeniden paylaştı",
|
||||
"notification.reblog.name_and_others_with_link": "{name} ve <a>{count, plural, one {# diğer kişi} other {# diğer kişi}}</a> gönderinizi yeniden paylaştı",
|
||||
"notification.relationships_severance_event": "{name} ile bağlantılar koptu",
|
||||
|
@ -737,11 +740,18 @@
|
|||
"privacy.private.short": "Takipçiler",
|
||||
"privacy.public.long": "Mastodon'da olan olmayan herkes",
|
||||
"privacy.public.short": "Herkese açık",
|
||||
"privacy.quote.anyone": "{visibility}, herkes alıntılayabilir",
|
||||
"privacy.quote.disabled": "{visibility}, alıntı yapılamaz",
|
||||
"privacy.quote.limited": "{visibility}, sınırlı alıntı",
|
||||
"privacy.unlisted.additional": "Bu neredeyse herkese açık gibi çalışır, tek farkı gönderi canlı akışlarda veya etiketlerde, keşfette, veya Mastodon aramasında gözükmez, hesap çapında öyle seçmiş olsanız bile.",
|
||||
"privacy.unlisted.long": "Daha az algoritmik tantana",
|
||||
"privacy.unlisted.short": "Sessizce herkese açık",
|
||||
"privacy_policy.last_updated": "Son güncelleme {date}",
|
||||
"privacy_policy.title": "Gizlilik Politikası",
|
||||
"quote_error.poll": "Anketlerde alıntıya izin verilmez.",
|
||||
"quote_error.quote": "Bir seferde tek bir alıntıya izin var.",
|
||||
"quote_error.unauthorized": "Bu gönderiyi alıntılamaya yetkiniz yok.",
|
||||
"quote_error.upload": "Medya eklentilerini alıntılamaya izin yok.",
|
||||
"recommended": "Önerilen",
|
||||
"refresh": "Yenile",
|
||||
"regeneration_indicator.please_stand_by": "Lütfen bekleyin.",
|
||||
|
@ -848,9 +858,11 @@
|
|||
"status.admin_account": "@{name} için denetim arayüzünü açın",
|
||||
"status.admin_domain": "{domain} için denetim arayüzünü açın",
|
||||
"status.admin_status": "Denetim arayüzünde bu gönderiyi açın",
|
||||
"status.all_disabled": "Yükseltmeler ve alıntılar devre dışı bırakıldı",
|
||||
"status.block": "@{name} adlı kişiyi engelle",
|
||||
"status.bookmark": "Yer işareti ekle",
|
||||
"status.cancel_reblog_private": "Yeniden paylaşımı geri al",
|
||||
"status.cannot_quote": "Yazar bu gönderide alıntılamayı devre dışı bıraktı",
|
||||
"status.cannot_reblog": "Bu gönderi yeniden paylaşılamaz",
|
||||
"status.context.load_new_replies": "Yeni yanıtlar mevcut",
|
||||
"status.context.loading": "Daha fazla yanıt için kontrol ediliyor",
|
||||
|
@ -879,12 +891,20 @@
|
|||
"status.mute_conversation": "Sohbeti sessize al",
|
||||
"status.open": "Bu gönderiyi genişlet",
|
||||
"status.pin": "Profile sabitle",
|
||||
"status.quote": "Teklif",
|
||||
"status.quote.cancel": "Teklifi iptal et",
|
||||
"status.quote_error.filtered": "Bazı filtrelerinizden dolayı gizlenmiştir",
|
||||
"status.quote_error.not_available": "Gönderi kullanılamıyor",
|
||||
"status.quote_error.pending_approval": "Gönderi beklemede",
|
||||
"status.quote_error.pending_approval_popout.body": "Fediverse genelinde paylaşılan alıntıların görüntülenmesi zaman alabilir, çünkü farklı sunucuların farklı protokolleri vardır.",
|
||||
"status.quote_error.pending_approval_popout.title": "Bekleyen bir teklif mi var? Sakin olun.",
|
||||
"status.quote_followers_only": "Sadece takipçiler bu gönderiyi alıntılayabilir",
|
||||
"status.quote_manual_review": "Yazar manuel olarak gözden geçirecek",
|
||||
"status.quote_policy_change": "Kimin alıntı yapabileceğini değiştirin",
|
||||
"status.quote_post_author": "@{name} adlı kullanıcının bir gönderisini alıntıladı",
|
||||
"status.quote_private": "Özel gönderiler alıntılanamaz",
|
||||
"status.quotes": "{count, plural, one {# alıntı} other {# alıntı}}",
|
||||
"status.quotes.empty": "Henüz hiç kimse bu gönderiyi alıntılamadı. Herhangi bir kullanıcı alıntıladığında burada görüntülenecek.",
|
||||
"status.read_more": "Devamını okuyun",
|
||||
"status.reblog": "Yeniden paylaş",
|
||||
"status.reblog_private": "Özgün görünürlük ile yeniden paylaş",
|
||||
|
@ -899,6 +919,7 @@
|
|||
"status.reply": "Yanıtla",
|
||||
"status.replyAll": "Konuyu yanıtla",
|
||||
"status.report": "@{name} adlı kişiyi bildir",
|
||||
"status.request_quote": "Alıntılamayı iste",
|
||||
"status.revoke_quote": "@{name}'nin gönderisinden benim gönderimi kaldır",
|
||||
"status.sensitive_warning": "Hassas içerik",
|
||||
"status.share": "Paylaş",
|
||||
|
@ -937,6 +958,7 @@
|
|||
"upload_button.label": "Resim, video veya ses dosyası ekleyin",
|
||||
"upload_error.limit": "Dosya yükleme sınırı aşıldı.",
|
||||
"upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.",
|
||||
"upload_error.quote": "Anketlerde dosya yüklemesine izin verilmez.",
|
||||
"upload_form.drag_and_drop.instructions": "Bir medya eklentisini taşımak için, boşluk veya enter tuşuna basın. Sürükleme sırasında medya eklentisini herhangi bir yöne hareket ettirmek için ok tuşlarını kullanın. Medya eklentisini yeni konumuna bırakmak için tekrar boşluk veya enter tuşuna basın veya işlemi iptal etmek için escape tuşuna basın.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Sürükleme iptal edildi. Medya eklentisi {item} bırakıldı.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Medya eklentisi {item} bırakıldı.",
|
||||
|
@ -959,5 +981,18 @@
|
|||
"video.skip_forward": "İleriye atla",
|
||||
"video.unmute": "Sesi aç",
|
||||
"video.volume_down": "Sesi kıs",
|
||||
"video.volume_up": "Sesi yükselt"
|
||||
"video.volume_up": "Sesi yükselt",
|
||||
"visibility_modal.button_title": "Görünürlüğü ayarla",
|
||||
"visibility_modal.header": "Görünürlük ve etkileşim",
|
||||
"visibility_modal.helper.direct_quoting": "Mastodon'da özel değiniler başkaları tarafından alıntılanamaz.",
|
||||
"visibility_modal.helper.privacy_editing": "Yayınlanan gönderilerin görünürlüğü değiştirilemez.",
|
||||
"visibility_modal.helper.private_quoting": "Mastodon'da sadece takipçilere yönelik gönderiler başkaları tarafından alıntılanamaz.",
|
||||
"visibility_modal.helper.unlisted_quoting": "İnsanlar sizden alıntı yaptığında, onların gönderileri de trend zaman tünellerinden gizlenecektir.",
|
||||
"visibility_modal.instructions": "Bu gönderiyle kimlerin etkileşimde bulunabileceğini kontrol edin. Genel ayarlara <link>Tercihler > Diğer</link> bölümünden ulaşabilirsiniz.",
|
||||
"visibility_modal.privacy_label": "Gizlilik",
|
||||
"visibility_modal.quote_followers": "Sadece takipçiler",
|
||||
"visibility_modal.quote_label": "Kimin alıntı yapabileceğini değiştirin",
|
||||
"visibility_modal.quote_nobody": "Sadece ben",
|
||||
"visibility_modal.quote_public": "Herkesten",
|
||||
"visibility_modal.save": "Kaydet"
|
||||
}
|
||||
|
|
|
@ -462,6 +462,7 @@
|
|||
"keyboard_shortcuts.open_media": "Відкрити медіа",
|
||||
"keyboard_shortcuts.pinned": "Відкрити список закріплених дописів",
|
||||
"keyboard_shortcuts.profile": "Відкрити профіль автора",
|
||||
"keyboard_shortcuts.quote": "Цитувати пост",
|
||||
"keyboard_shortcuts.reply": "Відповісти",
|
||||
"keyboard_shortcuts.requests": "Відкрити список охочих підписатися",
|
||||
"keyboard_shortcuts.search": "Сфокусуватися на пошуку",
|
||||
|
@ -924,6 +925,6 @@
|
|||
"visibility_modal.privacy_label": "Конфіденційність",
|
||||
"visibility_modal.quote_followers": "Тільки для підписників",
|
||||
"visibility_modal.quote_label": "Змінити хто може цитувати",
|
||||
"visibility_modal.quote_nobody": "Ніхто",
|
||||
"visibility_modal.quote_public": "Будь-хто"
|
||||
"visibility_modal.quote_public": "Будь-хто",
|
||||
"visibility_modal.save": "Зберегти"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "mở trang chủ",
|
||||
"keyboard_shortcuts.hotkey": "Phím tắt",
|
||||
"keyboard_shortcuts.legend": "hiện bảng hướng dẫn này",
|
||||
"keyboard_shortcuts.load_more": "Mở nút \"Tải thêm\"",
|
||||
"keyboard_shortcuts.local": "mở máy chủ của bạn",
|
||||
"keyboard_shortcuts.mention": "nhắc đến ai đó",
|
||||
"keyboard_shortcuts.muted": "mở danh sách người đã ẩn",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "mở ảnh hoặc video",
|
||||
"keyboard_shortcuts.pinned": "mở những tút đã ghim",
|
||||
"keyboard_shortcuts.profile": "mở trang của người đăng tút",
|
||||
"keyboard_shortcuts.quote": "Trích dẫn tút",
|
||||
"keyboard_shortcuts.reply": "trả lời",
|
||||
"keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi",
|
||||
"keyboard_shortcuts.search": "mở tìm kiếm",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Tài khoản của bạn đã bị vô hiệu hóa.",
|
||||
"notification.own_poll": "Vốt của bạn đã kết thúc",
|
||||
"notification.poll": "Vốt mà bạn tham gia đã kết thúc",
|
||||
"notification.quoted_update": "{name} đã chỉnh sửa tút mà bạn trích dẫn",
|
||||
"notification.reblog": "{name} đăng lại tút của bạn",
|
||||
"notification.reblog.name_and_others_with_link": "{name} và <a>{count, plural, other {# người khác}}</a> đã đăng lại tút của bạn",
|
||||
"notification.relationships_severance_event": "Mất kết nối với {name}",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "Người theo dõi",
|
||||
"privacy.public.long": "Bất cứ ai",
|
||||
"privacy.public.short": "Công khai",
|
||||
"privacy.quote.anyone": "{visibility}, mọi người có thể trích dẫn",
|
||||
"privacy.quote.disabled": "{visibility}, tắt trích dẫn",
|
||||
"privacy.quote.limited": "{visibility}, hạn chế trích dẫn",
|
||||
"privacy.unlisted.additional": "Công khai, nhưng tút sẽ không hiện trong bảng tin, hashtag, khám phá hoặc tìm kiếm Mastodon, kể cả trong cài đặt tài khoản bạn chọn cho phép.",
|
||||
"privacy.unlisted.long": "Ít hướng thuật toán hơn",
|
||||
"privacy.unlisted.short": "Hạn chế",
|
||||
"privacy_policy.last_updated": "Cập nhật lần cuối {date}",
|
||||
"privacy_policy.title": "Chính sách bảo mật",
|
||||
"quote_error.poll": "Không thể trích dẫn vốt.",
|
||||
"quote_error.quote": "Chỉ được trích dẫn một lần.",
|
||||
"quote_error.unauthorized": "Bạn không được cấp quyền trích dẫn tút này.",
|
||||
"quote_error.upload": "Không thể trích dẫn với media đính kèm.",
|
||||
"recommended": "Đề xuất",
|
||||
"refresh": "Làm mới",
|
||||
"regeneration_indicator.please_stand_by": "Hãy chờ đã.",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "Mở giao diện quản trị @{name}",
|
||||
"status.admin_domain": "Mở giao diện quản trị @{domain}",
|
||||
"status.admin_status": "Mở tút này trong giao diện quản trị",
|
||||
"status.all_disabled": "Đăng lại và trích dẫn bị tắt",
|
||||
"status.block": "Chặn @{name}",
|
||||
"status.bookmark": "Lưu",
|
||||
"status.cancel_reblog_private": "Bỏ đăng lại",
|
||||
"status.cannot_quote": "Tác giả không cho phép trích dẫn tút này",
|
||||
"status.cannot_reblog": "Không thể đăng lại tút này",
|
||||
"status.context.load_new_replies": "Có những trả lời mới",
|
||||
"status.context.loading": "Kiểm tra nhiều trả lời hơn",
|
||||
"status.continued_thread": "Tiếp tục chủ đề",
|
||||
"status.copy": "Sao chép URL",
|
||||
"status.delete": "Xóa",
|
||||
"status.delete.success": "Tút đã bị xoá",
|
||||
"status.detailed_status": "Xem chi tiết thêm",
|
||||
"status.direct": "Nhắn riêng @{name}",
|
||||
"status.direct_indicator": "Nhắn riêng",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "Tắt thông báo",
|
||||
"status.open": "Mở tút",
|
||||
"status.pin": "Ghim lên hồ sơ",
|
||||
"status.quote": "Trích dẫn",
|
||||
"status.quote.cancel": "Bỏ trích dẫn",
|
||||
"status.quote_error.filtered": "Bị ẩn vì một bộ lọc của bạn",
|
||||
"status.quote_error.not_available": "Tút không khả dụng",
|
||||
"status.quote_error.pending_approval": "Tút đang chờ duyệt",
|
||||
"status.quote_error.pending_approval_popout.body": "Các trích dẫn được chia sẻ trên Fediverse có thể mất thời gian để hiển thị vì các máy chủ khác nhau có giao thức khác nhau.",
|
||||
"status.quote_error.pending_approval_popout.title": "Đang chờ trích dẫn? Hãy bình tĩnh",
|
||||
"status.quote_followers_only": "Chỉ người theo dõi tôi có thể trích dẫn tút này",
|
||||
"status.quote_manual_review": "Người đăng sẽ duyệt thủ công",
|
||||
"status.quote_policy_change": "Thay đổi người có thể trích dẫn",
|
||||
"status.quote_post_author": "Trích dẫn từ tút của @{name}",
|
||||
"status.quote_private": "Không thể trích dẫn nhắn riêng",
|
||||
"status.quotes": "{count, plural, other {trích dẫn}}",
|
||||
"status.quotes.empty": "Tút này chưa có ai trích dẫn. Nếu có, nó sẽ hiển thị ở đây.",
|
||||
"status.read_more": "Đọc tiếp",
|
||||
"status.reblog": "Đăng lại",
|
||||
"status.reblog_or_quote": "Đăng lại hoặc trích dẫn",
|
||||
"status.reblog_private": "Đăng lại (Riêng tư)",
|
||||
"status.reblogged_by": "{name} đăng lại",
|
||||
"status.reblogs": "{count, plural, other {đăng lại}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "Trả lời",
|
||||
"status.replyAll": "Trả lời",
|
||||
"status.report": "Báo cáo @{name}",
|
||||
"status.request_quote": "Yêu cầu trích dẫn",
|
||||
"status.revoke_quote": "Gỡ tút của tôi khỏi trích dẫn của @{name}",
|
||||
"status.sensitive_warning": "Nhạy cảm",
|
||||
"status.share": "Chia sẻ",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "Thêm media (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Tập tin tải lên vượt quá giới hạn cho phép.",
|
||||
"upload_error.poll": "Không cho phép đính kèm tập tin.",
|
||||
"upload_error.quote": "Không cho phép đính kèm tập tin với trích dẫn.",
|
||||
"upload_form.drag_and_drop.instructions": "Để chọn tập tin đính kèm, hãy nhấn phím cách hoặc phím Enter. Trong khi kéo, sử dụng các phím mũi tên để di chuyển tập tin đính kèm theo bất kỳ hướng nào. Nhấn phím cách hoặc phím Enter một lần nữa để thả tập tin đính kèm vào vị trí mới hoặc nhấn phím thoát để hủy.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Kéo thả đã bị hủy bỏ. Tập tin đính kèm {item} bị bỏ qua.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Tập tin đính kèm {item} bị bỏ qua.",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "Tăng âm lượng",
|
||||
"visibility_modal.button_title": "Thay đổi quyền riêng tư",
|
||||
"visibility_modal.header": "Hiển thị và tương tác",
|
||||
"visibility_modal.helper.direct_quoting": "Không thể trích dẫn nhắn riêng.",
|
||||
"visibility_modal.helper.direct_quoting": "Nhắn riêng trên Mastodon không thể được người khác trích dẫn.",
|
||||
"visibility_modal.helper.privacy_editing": "Không thể thay đổi kiểu hiển thị của tút đã đăng.",
|
||||
"visibility_modal.helper.private_quoting": "Không thể trích dẫn những tút chỉ dành cho người theo dõi.",
|
||||
"visibility_modal.helper.private_quoting": "Tút chỉ dành cho người theo dõi trên Mastodon không thể được người khác trích dẫn.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Khi ai đó trích dẫn bạn, tút của họ cũng sẽ bị ẩn khỏi bảng tin công khai.",
|
||||
"visibility_modal.instructions": "Kiểm soát những ai có thể tương tác với tút này. Cài đặt chung trong <link>Thiết lập > Khác</link>.",
|
||||
"visibility_modal.privacy_label": "Riêng tư",
|
||||
"visibility_modal.quote_followers": "Chỉ người theo dõi",
|
||||
"visibility_modal.quote_label": "Thay đổi người có thể trích dẫn",
|
||||
"visibility_modal.quote_nobody": "Không ai",
|
||||
"visibility_modal.quote_public": "Bất cứ ai"
|
||||
"visibility_modal.quote_nobody": "Chỉ tôi",
|
||||
"visibility_modal.quote_public": "Bất cứ ai",
|
||||
"visibility_modal.save": "Lưu"
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
"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": "精选",
|
||||
|
@ -220,7 +221,11 @@
|
|||
"confirmations.delete_list.title": "确定要删除列表?",
|
||||
"confirmations.discard_draft.confirm": "放弃并继续",
|
||||
"confirmations.discard_draft.edit.cancel": "恢复编辑",
|
||||
"confirmations.discard_draft.edit.message": "继续将丢弃您对您正在编辑的嘟文所作的任何更改。",
|
||||
"confirmations.discard_draft.edit.title": "是否丢弃您对嘟文的更改?",
|
||||
"confirmations.discard_draft.post.cancel": "恢复草稿",
|
||||
"confirmations.discard_draft.post.message": "继续将丢弃您正在编辑的嘟文。",
|
||||
"confirmations.discard_draft.post.title": "丢弃您的嘟文草稿?",
|
||||
"confirmations.discard_edit_media.confirm": "丢弃",
|
||||
"confirmations.discard_edit_media.message": "你还有未保存的媒体描述或预览修改,仍要丢弃吗?",
|
||||
"confirmations.follow_to_list.confirm": "关注并添加到列表",
|
||||
|
@ -241,6 +246,7 @@
|
|||
"confirmations.remove_from_followers.message": "{name} 将停止关注您。您确定要继续吗?",
|
||||
"confirmations.remove_from_followers.title": "移除关注者?",
|
||||
"confirmations.revoke_quote.confirm": "移除嘟文",
|
||||
"confirmations.revoke_quote.message": "此操作无法撤销。",
|
||||
"confirmations.revoke_quote.title": "移除嘟文?",
|
||||
"confirmations.unfollow.confirm": "取消关注",
|
||||
"confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
|
||||
|
@ -286,6 +292,7 @@
|
|||
"domain_pill.your_handle": "你的用户名:",
|
||||
"domain_pill.your_server": "你的数字家园,你的所有嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。",
|
||||
"domain_pill.your_username": "你在此服务器上的唯一标识。不同服务器上可能存在相同用户名的用户。",
|
||||
"dropdown.empty": "选项",
|
||||
"embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。",
|
||||
"embed.preview": "这是它的预览效果:",
|
||||
"emoji_button.activity": "活动",
|
||||
|
@ -338,6 +345,7 @@
|
|||
"explore.trending_links": "新闻",
|
||||
"explore.trending_statuses": "嘟文",
|
||||
"explore.trending_tags": "话题",
|
||||
"featured_carousel.header": "{count, plural, other {# 条置顶嘟文}}",
|
||||
"featured_carousel.next": "下一步",
|
||||
"featured_carousel.post": "发嘟",
|
||||
"featured_carousel.previous": "上一步",
|
||||
|
@ -395,6 +403,7 @@
|
|||
"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}",
|
||||
|
@ -474,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "打开主页时间线",
|
||||
"keyboard_shortcuts.hotkey": "快捷键",
|
||||
"keyboard_shortcuts.legend": "显示此列表",
|
||||
"keyboard_shortcuts.load_more": "将焦点移至“加载更多”按钮",
|
||||
"keyboard_shortcuts.local": "打开本站时间线",
|
||||
"keyboard_shortcuts.mention": "提及嘟文作者",
|
||||
"keyboard_shortcuts.muted": "打开隐藏用户列表",
|
||||
|
@ -482,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "打开媒体",
|
||||
"keyboard_shortcuts.pinned": "打开置顶嘟文列表",
|
||||
"keyboard_shortcuts.profile": "打开作者的个人资料",
|
||||
"keyboard_shortcuts.quote": "引用嘟文",
|
||||
"keyboard_shortcuts.reply": "回复嘟文",
|
||||
"keyboard_shortcuts.requests": "打开关注请求列表",
|
||||
"keyboard_shortcuts.search": "选中搜索框",
|
||||
|
@ -494,6 +505,7 @@
|
|||
"keyboard_shortcuts.unfocus": "取消输入/搜索",
|
||||
"keyboard_shortcuts.up": "在列表中让光标上移",
|
||||
"learn_more_link.got_it": "明白了",
|
||||
"learn_more_link.learn_more": "了解更多",
|
||||
"lightbox.close": "关闭",
|
||||
"lightbox.next": "下一个",
|
||||
"lightbox.previous": "上一个",
|
||||
|
@ -558,6 +570,8 @@
|
|||
"navigation_bar.follows_and_followers": "关注与关注者",
|
||||
"navigation_bar.import_export": "导入与导出",
|
||||
"navigation_bar.lists": "列表",
|
||||
"navigation_bar.live_feed_local": "实时动态(本站)",
|
||||
"navigation_bar.live_feed_public": "实时动态(公开)",
|
||||
"navigation_bar.logout": "退出登录",
|
||||
"navigation_bar.moderation": "审核",
|
||||
"navigation_bar.more": "更多",
|
||||
|
@ -567,7 +581,9 @@
|
|||
"navigation_bar.privacy_and_reach": "隐私与可达性",
|
||||
"navigation_bar.search": "搜索",
|
||||
"navigation_bar.search_trends": "搜索/热门趋势",
|
||||
"navigation_panel.collapse_followed_tags": "收起已关注话题菜单",
|
||||
"navigation_panel.collapse_lists": "收起菜单列表",
|
||||
"navigation_panel.expand_followed_tags": "展开已关注话题菜单",
|
||||
"navigation_panel.expand_lists": "展开菜单列表",
|
||||
"not_signed_in_indicator.not_signed_in": "你需要登录才能访问此资源。",
|
||||
"notification.admin.report": "{name} 举报了 {target}",
|
||||
|
@ -590,6 +606,7 @@
|
|||
"notification.label.mention": "提及",
|
||||
"notification.label.private_mention": "私下提及",
|
||||
"notification.label.private_reply": "私人回复",
|
||||
"notification.label.quote": "{name} 引用了你的嘟文",
|
||||
"notification.label.reply": "回复",
|
||||
"notification.mention": "提及",
|
||||
"notification.mentioned_you": "{name} 提到了你",
|
||||
|
@ -604,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "你的账号已被封禁。",
|
||||
"notification.own_poll": "你的投票已经结束",
|
||||
"notification.poll": "你参与的一项投票已结束",
|
||||
"notification.quoted_update": "{name} 编辑了一条你之前引用过的嘟文",
|
||||
"notification.reblog": "{name} 转发了你的嘟文",
|
||||
"notification.reblog.name_and_others_with_link": "{name} 和 <a>{count, plural, other {另外 # 人}}</a> 转嘟了你的嘟文",
|
||||
"notification.relationships_severance_event": "与 {name} 的联系已断开",
|
||||
|
@ -647,6 +665,7 @@
|
|||
"notifications.column_settings.mention": "提及:",
|
||||
"notifications.column_settings.poll": "投票结果:",
|
||||
"notifications.column_settings.push": "推送通知",
|
||||
"notifications.column_settings.quote": "引用嘟文:",
|
||||
"notifications.column_settings.reblog": "转嘟:",
|
||||
"notifications.column_settings.show": "在通知栏显示",
|
||||
"notifications.column_settings.sound": "播放音效",
|
||||
|
@ -722,11 +741,18 @@
|
|||
"privacy.private.short": "关注者",
|
||||
"privacy.public.long": "所有 Mastodon 内外的人",
|
||||
"privacy.public.short": "公开",
|
||||
"privacy.quote.anyone": "{visibility},任何人都能引用",
|
||||
"privacy.quote.disabled": "{visibility},禁用嘟文引用",
|
||||
"privacy.quote.limited": "{visibility},嘟文引用受限",
|
||||
"privacy.unlisted.additional": "此模式的行为与“公开”类似,只是嘟文不会出现在实时动态、话题、探索或 Mastodon 搜索页面中,即使您已全局开启了对应的发现设置。",
|
||||
"privacy.unlisted.long": "减少算法影响",
|
||||
"privacy.unlisted.short": "悄悄公开",
|
||||
"privacy_policy.last_updated": "最近更新于 {date}",
|
||||
"privacy_policy.title": "隐私政策",
|
||||
"quote_error.poll": "不允许引用投票嘟文。",
|
||||
"quote_error.quote": "一次只能引用一条嘟文。",
|
||||
"quote_error.unauthorized": "你没有权限引用此嘟文。",
|
||||
"quote_error.upload": "不允许引用有媒体附件的嘟文。",
|
||||
"recommended": "推荐",
|
||||
"refresh": "刷新",
|
||||
"regeneration_indicator.please_stand_by": "请稍候。",
|
||||
|
@ -833,15 +859,18 @@
|
|||
"status.admin_account": "打开 @{name} 的管理界面",
|
||||
"status.admin_domain": "打开 {domain} 的管理界面",
|
||||
"status.admin_status": "在管理界面查看此嘟文",
|
||||
"status.all_disabled": "已禁用转嘟与引用",
|
||||
"status.block": "屏蔽 @{name}",
|
||||
"status.bookmark": "添加到书签",
|
||||
"status.cancel_reblog_private": "取消转嘟",
|
||||
"status.cannot_quote": "作者已禁用此嘟文的引用功能",
|
||||
"status.cannot_reblog": "不能转嘟这条嘟文",
|
||||
"status.context.load_new_replies": "有新回复",
|
||||
"status.context.loading": "正在检查更多回复",
|
||||
"status.continued_thread": "上接嘟文串",
|
||||
"status.copy": "复制嘟文链接",
|
||||
"status.delete": "删除",
|
||||
"status.delete.success": "嘟文已删除",
|
||||
"status.detailed_status": "对话详情",
|
||||
"status.direct": "私下提及 @{name}",
|
||||
"status.direct_indicator": "私下提及",
|
||||
|
@ -864,10 +893,23 @@
|
|||
"status.mute_conversation": "关闭此对话的通知",
|
||||
"status.open": "展开嘟文",
|
||||
"status.pin": "在个人资料页面置顶",
|
||||
"status.quote": "引用",
|
||||
"status.quote.cancel": "取消引用",
|
||||
"status.quote_error.filtered": "已根据你的筛选器过滤",
|
||||
"status.quote_error.not_available": "嘟文不可用",
|
||||
"status.quote_error.pending_approval": "嘟文待发布",
|
||||
"status.quote_error.pending_approval_popout.body": "由于不同服务器间使用的协议不同,联邦宇宙间引用嘟文的显示可能会有延迟。",
|
||||
"status.quote_error.pending_approval_popout.title": "引用嘟文还没发布?别着急,请耐心等待",
|
||||
"status.quote_followers_only": "只有关注者才能引用这篇嘟文",
|
||||
"status.quote_manual_review": "嘟文作者将人工审核",
|
||||
"status.quote_policy_change": "更改谁可以引用",
|
||||
"status.quote_post_author": "引用了 @{name} 的嘟文",
|
||||
"status.quote_private": "不能引用私人嘟文",
|
||||
"status.quotes": "{count, plural, other {引用嘟文}}",
|
||||
"status.quotes.empty": "还没有人引用过此条嘟文。引用此嘟文的人会显示在这里。",
|
||||
"status.read_more": "查看更多",
|
||||
"status.reblog": "转嘟",
|
||||
"status.reblog_or_quote": "转嘟或引用",
|
||||
"status.reblog_private": "以相同可见性转嘟",
|
||||
"status.reblogged_by": "{name} 转嘟了",
|
||||
"status.reblogs": "{count, plural, other {次转嘟}}",
|
||||
|
@ -880,6 +922,8 @@
|
|||
"status.reply": "回复",
|
||||
"status.replyAll": "回复此嘟文串",
|
||||
"status.report": "举报 @{name}",
|
||||
"status.request_quote": "请求引用",
|
||||
"status.revoke_quote": "将我的嘟文从 @{name} 的嘟文中删除",
|
||||
"status.sensitive_warning": "敏感内容",
|
||||
"status.share": "分享",
|
||||
"status.show_less_all": "全部折叠",
|
||||
|
@ -917,6 +961,7 @@
|
|||
"upload_button.label": "上传图片、视频或音频",
|
||||
"upload_error.limit": "文件大小超过限制。",
|
||||
"upload_error.poll": "投票中不允许上传文件。",
|
||||
"upload_error.quote": "引用中不允许上传文件。",
|
||||
"upload_form.drag_and_drop.instructions": "要选中某个媒体附件,请按空格键或回车键。在拖拽时,使用方向键将媒体附件移动到任何给定方向。再次按空格键或回车键可将媒体附件放置在新位置,或按 Esc 键取消。",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "拖拽已终止。媒体附件 {item} 已被丢弃。",
|
||||
"upload_form.drag_and_drop.on_drag_end": "媒体附件 {item} 已被丢弃。",
|
||||
|
@ -939,5 +984,18 @@
|
|||
"video.skip_forward": "前进",
|
||||
"video.unmute": "恢复提醒",
|
||||
"video.volume_down": "音量减小",
|
||||
"video.volume_up": "提高音量"
|
||||
"video.volume_up": "提高音量",
|
||||
"visibility_modal.button_title": "设置可见性",
|
||||
"visibility_modal.header": "可见性和互动",
|
||||
"visibility_modal.helper.direct_quoting": "Mastodon上发布的私下提及无法被他人引用。",
|
||||
"visibility_modal.helper.privacy_editing": "已发布的嘟文无法改变可见性。",
|
||||
"visibility_modal.helper.private_quoting": "Mastodon上发布的仅限关注者可见的嘟文无法被他人引用。",
|
||||
"visibility_modal.helper.unlisted_quoting": "当其他人引用你时,他们的嘟文也会从热门时间线上隐藏。",
|
||||
"visibility_modal.instructions": "控制谁可以和此嘟文互动。可以在<link>偏好设置 > 其他</link>下找到全局设置。",
|
||||
"visibility_modal.privacy_label": "隐私",
|
||||
"visibility_modal.quote_followers": "仅关注者",
|
||||
"visibility_modal.quote_label": "更改谁可以引用",
|
||||
"visibility_modal.quote_nobody": "仅限自己",
|
||||
"visibility_modal.quote_public": "任何人",
|
||||
"visibility_modal.save": "保存"
|
||||
}
|
||||
|
|
|
@ -377,6 +377,7 @@
|
|||
"keyboard_shortcuts.home": "開啟個人時間軸",
|
||||
"keyboard_shortcuts.hotkey": "快速鍵",
|
||||
"keyboard_shortcuts.legend": "顯示這個說明",
|
||||
"keyboard_shortcuts.load_more": "將焦點移至「讀取更多」按鈕",
|
||||
"keyboard_shortcuts.local": "開啟本站時間軸",
|
||||
"keyboard_shortcuts.mention": "提及作者",
|
||||
"keyboard_shortcuts.muted": "開啟靜音名單",
|
||||
|
@ -744,5 +745,6 @@
|
|||
"video.pause": "暫停",
|
||||
"video.play": "播放",
|
||||
"video.volume_down": "調低音量",
|
||||
"video.volume_up": "調高音量"
|
||||
"video.volume_up": "調高音量",
|
||||
"visibility_modal.save": "儲存"
|
||||
}
|
||||
|
|
|
@ -483,6 +483,7 @@
|
|||
"keyboard_shortcuts.home": "開啟首頁時間軸",
|
||||
"keyboard_shortcuts.hotkey": "快速鍵",
|
||||
"keyboard_shortcuts.legend": "顯示此說明選單",
|
||||
"keyboard_shortcuts.load_more": "將焦點移至「讀取更多」按鈕",
|
||||
"keyboard_shortcuts.local": "開啟本站時間軸",
|
||||
"keyboard_shortcuts.mention": "提及作者",
|
||||
"keyboard_shortcuts.muted": "開啟靜音使用者列表",
|
||||
|
@ -491,6 +492,7 @@
|
|||
"keyboard_shortcuts.open_media": "開啟媒體",
|
||||
"keyboard_shortcuts.pinned": "開啟釘選的嘟文列表",
|
||||
"keyboard_shortcuts.profile": "開啟作者的個人檔案頁面",
|
||||
"keyboard_shortcuts.quote": "引用嘟文",
|
||||
"keyboard_shortcuts.reply": "回應嘟文",
|
||||
"keyboard_shortcuts.requests": "開啟跟隨請求列表",
|
||||
"keyboard_shortcuts.search": "將游標移至搜尋框",
|
||||
|
@ -619,6 +621,7 @@
|
|||
"notification.moderation_warning.action_suspend": "您的帳號已被停權。",
|
||||
"notification.own_poll": "您的投票已結束",
|
||||
"notification.poll": "您曾投過的投票已經結束",
|
||||
"notification.quoted_update": "{name} 已編輯一則您曾引用之嘟文",
|
||||
"notification.reblog": "{name} 已轉嘟您的嘟文",
|
||||
"notification.reblog.name_and_others_with_link": "{name} 與<a>{count, plural, other {其他 # 個人}}</a>已轉嘟您的嘟文",
|
||||
"notification.relationships_severance_event": "與 {name} 失去連結",
|
||||
|
@ -738,11 +741,18 @@
|
|||
"privacy.private.short": "跟隨者",
|
||||
"privacy.public.long": "所有人 (無論在 Mastodon 上與否)",
|
||||
"privacy.public.short": "公開",
|
||||
"privacy.quote.anyone": "{visibility},任何人皆可引用",
|
||||
"privacy.quote.disabled": "{visibility},停用引用嘟文",
|
||||
"privacy.quote.limited": "{visibility},受限的引用嘟文",
|
||||
"privacy.unlisted.additional": "此與公開嘟文完全相同,但嘟文不會出現於即時內容或主題標籤、探索、及 Mastodon 搜尋中,即使您在帳戶設定中選擇加入。",
|
||||
"privacy.unlisted.long": "悄然無聲",
|
||||
"privacy.unlisted.short": "不公開",
|
||||
"privacy_policy.last_updated": "最後更新:{date}",
|
||||
"privacy_policy.title": "隱私權政策",
|
||||
"quote_error.poll": "無法引用投票嘟文。",
|
||||
"quote_error.quote": "一次僅能引用一則嘟文。",
|
||||
"quote_error.unauthorized": "您不被授權允許引用此嘟文。",
|
||||
"quote_error.upload": "無法引用多媒體內容嘟文。",
|
||||
"recommended": "推薦設定",
|
||||
"refresh": "重新整理",
|
||||
"regeneration_indicator.please_stand_by": "請稍候。",
|
||||
|
@ -849,15 +859,18 @@
|
|||
"status.admin_account": "開啟 @{name} 的管理介面",
|
||||
"status.admin_domain": "開啟 {domain} 的管理介面",
|
||||
"status.admin_status": "於管理介面開啟此嘟文",
|
||||
"status.all_disabled": "已停用轉嘟與引用",
|
||||
"status.block": "封鎖 @{name}",
|
||||
"status.bookmark": "書籤",
|
||||
"status.cancel_reblog_private": "取消轉嘟",
|
||||
"status.cannot_quote": "作者已停用引用此嘟文",
|
||||
"status.cannot_reblog": "這則嘟文無法被轉嘟",
|
||||
"status.context.load_new_replies": "有新回嘟",
|
||||
"status.context.loading": "正在檢查更多回嘟",
|
||||
"status.continued_thread": "接續討論串",
|
||||
"status.copy": "複製嘟文連結",
|
||||
"status.delete": "刪除",
|
||||
"status.delete.success": "已刪除嘟文",
|
||||
"status.detailed_status": "詳細的對話內容",
|
||||
"status.direct": "私訊 @{name}",
|
||||
"status.direct_indicator": "私訊",
|
||||
|
@ -880,16 +893,23 @@
|
|||
"status.mute_conversation": "靜音對話",
|
||||
"status.open": "展開此嘟文",
|
||||
"status.pin": "釘選至個人檔案頁面",
|
||||
"status.quote": "引用",
|
||||
"status.quote.cancel": "取消引用嘟文",
|
||||
"status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏",
|
||||
"status.quote_error.not_available": "無法取得該嘟文",
|
||||
"status.quote_error.pending_approval": "嘟文正在發送中",
|
||||
"status.quote_error.pending_approval_popout.body": "因為伺服器間可能運行不同協定,顯示聯邦宇宙間之引用嘟文會有些許延遲。",
|
||||
"status.quote_error.pending_approval_popout.title": "引用嘟文正在發送中?別著急,請稍候片刻",
|
||||
"status.quote_followers_only": "只有我的跟隨者能引用此嘟文",
|
||||
"status.quote_manual_review": "嘟文作者將人工審閱",
|
||||
"status.quote_policy_change": "變更可以引用的人",
|
||||
"status.quote_post_author": "已引用 @{name} 之嘟文",
|
||||
"status.quote_private": "無法引用私人嘟文",
|
||||
"status.quotes": "{count, plural, other {# 則引用嘟文}}",
|
||||
"status.quotes.empty": "目前尚無人引用此嘟文。當有人引用時,它將於此顯示。",
|
||||
"status.read_more": "閱讀更多",
|
||||
"status.reblog": "轉嘟",
|
||||
"status.reblog_or_quote": "轉嘟或引用",
|
||||
"status.reblog_private": "依照原嘟可見性轉嘟",
|
||||
"status.reblogged_by": "{name} 已轉嘟",
|
||||
"status.reblogs": "{count, plural, other {則轉嘟}}",
|
||||
|
@ -902,6 +922,7 @@
|
|||
"status.reply": "回覆",
|
||||
"status.replyAll": "回覆討論串",
|
||||
"status.report": "檢舉 @{name}",
|
||||
"status.request_quote": "要求引用嘟文",
|
||||
"status.revoke_quote": "將我的嘟文自 @{name} 之嘟文中移除",
|
||||
"status.sensitive_warning": "敏感內容",
|
||||
"status.share": "分享",
|
||||
|
@ -940,6 +961,7 @@
|
|||
"upload_button.label": "上傳圖片、影片、或者音訊檔案",
|
||||
"upload_error.limit": "已達到檔案上傳限制。",
|
||||
"upload_error.poll": "不允許於投票時上傳檔案。",
|
||||
"upload_error.quote": "引用嘟文無法上傳檔案。",
|
||||
"upload_form.drag_and_drop.instructions": "請按空白鍵或 Enter 鍵取多媒體附加檔案。使用方向鍵移動多媒體附加檔案。按下空白鍵或 Enter 鍵於新位置放置多媒體附加檔案,或按下 ESC 鍵取消。",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "移動已取消。多媒體附加檔案 {item} 已被放置。",
|
||||
"upload_form.drag_and_drop.on_drag_end": "多媒體附加檔案 {item} 已被放置。",
|
||||
|
@ -965,14 +987,15 @@
|
|||
"video.volume_up": "提高音量",
|
||||
"visibility_modal.button_title": "設定可見性",
|
||||
"visibility_modal.header": "可見性與互動",
|
||||
"visibility_modal.helper.direct_quoting": "無法引用私人提及。",
|
||||
"visibility_modal.helper.direct_quoting": "Mastodon 上發佈之私人提及嘟文無法被其他使用者引用。",
|
||||
"visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文之可見性。",
|
||||
"visibility_modal.helper.private_quoting": "無法引用僅追蹤者的嘟文。",
|
||||
"visibility_modal.helper.private_quoting": "Mastodon 上發佈之僅限跟隨者嘟文無法被其他使用者引用。",
|
||||
"visibility_modal.helper.unlisted_quoting": "當其他人引用您時,他們的嘟文也會自熱門時間軸隱藏。",
|
||||
"visibility_modal.instructions": "控制誰能與此嘟文互動。可在<link>偏好設定 > 其他</link>下找到全域設定。",
|
||||
"visibility_modal.privacy_label": "隱私權",
|
||||
"visibility_modal.quote_followers": "僅限跟隨者",
|
||||
"visibility_modal.quote_label": "變更可以引用的人",
|
||||
"visibility_modal.quote_nobody": "沒有人",
|
||||
"visibility_modal.quote_public": "所有人"
|
||||
"visibility_modal.quote_nobody": "僅有我",
|
||||
"visibility_modal.quote_public": "所有人",
|
||||
"visibility_modal.save": "儲存"
|
||||
}
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react';
|
||||
|
||||
interface BaseMenuItem {
|
||||
text: string;
|
||||
dangerous?: boolean;
|
||||
}
|
||||
|
||||
export interface ActionMenuItem extends BaseMenuItem {
|
||||
action: () => void;
|
||||
action: (event: MouseEvent | KeyboardEvent | TouchEvent) => void;
|
||||
}
|
||||
|
||||
export interface LinkMenuItem extends BaseMenuItem {
|
||||
|
|
|
@ -39,6 +39,8 @@ export type NotificationGroupMention = BaseNotificationWithStatus<'mention'>;
|
|||
export type NotificationGroupQuote = BaseNotificationWithStatus<'quote'>;
|
||||
export type NotificationGroupPoll = BaseNotificationWithStatus<'poll'>;
|
||||
export type NotificationGroupUpdate = BaseNotificationWithStatus<'update'>;
|
||||
export type NotificationGroupQuotedUpdate =
|
||||
BaseNotificationWithStatus<'quoted_update'>;
|
||||
export type NotificationGroupFollow = BaseNotification<'follow'>;
|
||||
export type NotificationGroupFollowRequest = BaseNotification<'follow_request'>;
|
||||
export type NotificationGroupAdminSignUp = BaseNotification<'admin.sign_up'>;
|
||||
|
@ -91,6 +93,7 @@ export type NotificationGroup =
|
|||
| NotificationGroupQuote
|
||||
| NotificationGroupPoll
|
||||
| NotificationGroupUpdate
|
||||
| NotificationGroupQuotedUpdate
|
||||
| NotificationGroupFollow
|
||||
| NotificationGroupFollowRequest
|
||||
| NotificationGroupModerationWarning
|
||||
|
@ -141,7 +144,8 @@ export function createNotificationGroupFromJSON(
|
|||
case 'mention':
|
||||
case 'quote':
|
||||
case 'poll':
|
||||
case 'update': {
|
||||
case 'update':
|
||||
case 'quoted_update': {
|
||||
const { status_id: statusId, ...groupWithoutStatus } = group;
|
||||
return {
|
||||
statusId: statusId ?? undefined,
|
||||
|
@ -215,6 +219,7 @@ export function createNotificationGroupFromNotificationJSON(
|
|||
case 'quote':
|
||||
case 'poll':
|
||||
case 'update':
|
||||
case 'quoted_update':
|
||||
return {
|
||||
...group,
|
||||
type: notification.type,
|
||||
|
|
|
@ -2,9 +2,9 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrde
|
|||
|
||||
import {
|
||||
changeUploadCompose,
|
||||
quoteComposeByStatus,
|
||||
quoteCompose,
|
||||
quoteComposeCancel,
|
||||
setQuotePolicy,
|
||||
setComposeQuotePolicy,
|
||||
} from 'mastodon/actions/compose_typed';
|
||||
import { timelineDelete } from 'mastodon/actions/timelines_typed';
|
||||
|
||||
|
@ -329,22 +329,15 @@ export const composeReducer = (state = initialState, action) => {
|
|||
return state.set('is_changing_upload', true);
|
||||
} else if (changeUploadCompose.rejected.match(action)) {
|
||||
return state.set('is_changing_upload', false);
|
||||
} else if (quoteComposeByStatus.match(action)) {
|
||||
} else if (quoteCompose.match(action)) {
|
||||
const status = action.payload;
|
||||
if (
|
||||
status.getIn(['quote_approval', 'current_user']) === 'automatic' &&
|
||||
state.get('media_attachments').size === 0 &&
|
||||
!state.get('is_uploading') &&
|
||||
!state.get('poll')
|
||||
) {
|
||||
return state
|
||||
.set('quoted_status_id', status.get('id'))
|
||||
.set('spoiler', status.get('sensitive'))
|
||||
.set('spoiler_text', status.get('spoiler_text'));
|
||||
}
|
||||
return state
|
||||
.set('quoted_status_id', status.get('id'))
|
||||
.set('spoiler', status.get('sensitive'))
|
||||
.set('spoiler_text', status.get('spoiler_text'));
|
||||
} else if (quoteComposeCancel.match(action)) {
|
||||
return state.set('quoted_status_id', null);
|
||||
} else if (setQuotePolicy.match(action)) {
|
||||
} else if (setComposeQuotePolicy.match(action)) {
|
||||
return state.set('quote_policy', action.payload);
|
||||
}
|
||||
|
||||
|
@ -520,6 +513,7 @@ export const composeReducer = (state = initialState, action) => {
|
|||
map.set('sensitive', action.status.get('sensitive'));
|
||||
map.set('language', action.status.get('language'));
|
||||
map.set('id', null);
|
||||
map.set('quoted_status_id', action.status.getIn(['quote', 'quoted_status']));
|
||||
// Mastodon-authored posts can be expected to have at most one automatic approval policy
|
||||
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
|
||||
|
||||
|
@ -532,8 +526,13 @@ export const composeReducer = (state = initialState, action) => {
|
|||
}
|
||||
|
||||
if (action.status.get('poll')) {
|
||||
let options = ImmutableList(action.status.get('poll').options.map(x => x.title));
|
||||
if (options.size < action.maxOptions) {
|
||||
options = options.push('');
|
||||
}
|
||||
|
||||
map.set('poll', ImmutableMap({
|
||||
options: ImmutableList(action.status.get('poll').options.map(x => x.title)),
|
||||
options: options,
|
||||
multiple: action.status.get('poll').multiple,
|
||||
expires_in: expiresInFromExpiresAt(action.status.get('poll').expires_at),
|
||||
}));
|
||||
|
@ -551,6 +550,7 @@ export const composeReducer = (state = initialState, action) => {
|
|||
map.set('idempotencyKey', uuid());
|
||||
map.set('sensitive', action.status.get('sensitive'));
|
||||
map.set('language', action.status.get('language'));
|
||||
map.set('quoted_status_id', action.status.getIn(['quote', 'quoted_status']));
|
||||
// Mastodon-authored posts can be expected to have at most one automatic approval policy
|
||||
map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody');
|
||||
|
||||
|
@ -563,8 +563,13 @@ export const composeReducer = (state = initialState, action) => {
|
|||
}
|
||||
|
||||
if (action.status.get('poll')) {
|
||||
let options = ImmutableList(action.status.get('poll').options.map(x => x.title));
|
||||
if (options.size < action.maxOptions) {
|
||||
options = options.push('');
|
||||
}
|
||||
|
||||
map.set('poll', ImmutableMap({
|
||||
options: ImmutableList(action.status.get('poll').options.map(x => x.title)),
|
||||
options: options,
|
||||
multiple: action.status.get('poll').multiple,
|
||||
expires_in: expiresInFromExpiresAt(action.status.get('poll').expires_at),
|
||||
}));
|
||||
|
|
|
@ -28,6 +28,9 @@ import {
|
|||
PIN_SUCCESS,
|
||||
UNPIN_SUCCESS,
|
||||
} from '../actions/interactions';
|
||||
import {
|
||||
fetchQuotes
|
||||
} from '../actions/interactions_typed';
|
||||
import {
|
||||
PINNED_STATUSES_FETCH_SUCCESS,
|
||||
} from '../actions/pin_statuses';
|
||||
|
@ -40,8 +43,6 @@ import {
|
|||
TRENDS_STATUSES_EXPAND_FAIL,
|
||||
} from '../actions/trends';
|
||||
|
||||
|
||||
|
||||
const initialState = ImmutableMap({
|
||||
favourites: ImmutableMap({
|
||||
next: null,
|
||||
|
@ -63,6 +64,12 @@ const initialState = ImmutableMap({
|
|||
loaded: false,
|
||||
items: ImmutableOrderedSet(),
|
||||
}),
|
||||
quotes: ImmutableMap({
|
||||
next: null,
|
||||
loaded: false,
|
||||
items: ImmutableOrderedSet(),
|
||||
statusId: null,
|
||||
}),
|
||||
});
|
||||
|
||||
const normalizeList = (state, listType, statuses, next) => {
|
||||
|
@ -147,6 +154,13 @@ export default function statusLists(state = initialState, action) {
|
|||
case muteAccountSuccess.type:
|
||||
return state.updateIn(['trending', 'items'], ImmutableOrderedSet(), list => list.filterNot(statusId => action.payload.statuses.getIn([statusId, 'account']) === action.payload.relationship.id));
|
||||
default:
|
||||
return state;
|
||||
if (fetchQuotes.fulfilled.match(action))
|
||||
return normalizeList(state, 'quotes', action.payload.statuses, action.payload.next).set('statusId', action.meta.arg.statusId);
|
||||
else if (fetchQuotes.pending.match(action))
|
||||
return state.setIn(['quotes', 'isLoading'], true).setIn(['quotes', 'statusId'], action.meta.arg.statusId);
|
||||
else if (fetchQuotes.rejected.match(action))
|
||||
return state.setIn(['quotes', 'isLoading', false]).setIn(['quotes', 'statusId'], action.meta.arg.statusId);
|
||||
else
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,8 +90,15 @@ export default function statuses(state = initialState, action) {
|
|||
switch(action.type) {
|
||||
case STATUS_FETCH_REQUEST:
|
||||
return state.setIn([action.id, 'isLoading'], true);
|
||||
case STATUS_FETCH_FAIL:
|
||||
return state.delete(action.id);
|
||||
case STATUS_FETCH_FAIL: {
|
||||
if (action.parentQuotePostId && action.error.status === 404) {
|
||||
return state
|
||||
.delete(action.id)
|
||||
.setIn([action.parentQuotePostId, 'quote', 'state'], 'deleted')
|
||||
} else {
|
||||
return state.delete(action.id);
|
||||
}
|
||||
}
|
||||
case STATUS_IMPORT:
|
||||
return importStatus(state, action.status);
|
||||
case STATUSES_IMPORT:
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user