mirror of
https://github.com/glitch-soc/mastodon.git
synced 2024-11-27 02:24:03 -05:00
Merge pull request #2898 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 44d92fa4f6
This commit is contained in:
commit
3136079d3a
42
CHANGELOG.md
42
CHANGELOG.md
@ -2,6 +2,48 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [4.3.1] - 2024-10-21
|
||||
|
||||
### Added
|
||||
|
||||
- Add more explicit explanations about author attribution and `fediverse:creator` (#32383 by @ClearlyClaire)
|
||||
- Add ability to group follow notifications in WebUI, can be disabled in the column settings (#32520 by @renchap)
|
||||
- Add back a 6 hours mute duration option (#32522 by @renchap)
|
||||
- Add note about not changing ActiveRecord encryption secrets once they are set (#32413, #32476, #32512, and #32537 by @ClearlyClaire and @mjankowski)
|
||||
|
||||
### Changed
|
||||
|
||||
- Change translation feature to translate to selected regional variant (e.g. pt-BR) if available (#32428 by @c960657)
|
||||
|
||||
### Removed
|
||||
|
||||
- Remove ability to get embed code for remote posts (#32578 by @ClearlyClaire)\
|
||||
Getting the embed code is only reliable for local posts.\
|
||||
It never worked for non-Mastodon servers, and stopped working correctly with the changes made in 4.3.0.\
|
||||
We have therefore decided to remove the menu entry while we investigate solutions.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix follow recommendation moderation page default language when using regional variant (#32580 by @ClearlyClaire)
|
||||
- Fix column-settings spacing in local timeline in advanced view (#32567 by @lindwurm)
|
||||
- Fix broken i18n in text welcome mailer tags area (#32571 by @mjankowski)
|
||||
- Fix missing or incorrect cache-control headers for Streaming server (#32551 by @ThisIsMissEm)
|
||||
- Fix only the first paragraph being displayed in some notifications (#32348 by @ClearlyClaire)
|
||||
- Fix reblog icons on account media view (#32506 by @tribela)
|
||||
- Fix Content-Security-Policy not allowing OpenStack SWIFT object storage URI (#32439 by @kenkiku1021)
|
||||
- Fix back arrow pointing to the incorrect direction in RTL languages (#32485 by @renchap)
|
||||
- Fix streaming server using `REDIS_USERNAME` instead of `REDIS_USER` (#32493 by @ThisIsMissEm)
|
||||
- Fix follow recommendation carrousel scrolling on RTL layouts (#32462 and #32505 by @ClearlyClaire)
|
||||
- Fix follow recommendation suppressions not applying immediately (#32392 by @ClearlyClaire)
|
||||
- Fix language of push notifications (#32415 by @ClearlyClaire)
|
||||
- Fix mute duration not being shown in list of muted accounts in web UI (#32388 by @ClearlyClaire)
|
||||
- Fix “Mark every notification as read” not updating the read marker if scrolled down (#32385 by @ClearlyClaire)
|
||||
- Fix “Mention” appearing for otherwise filtered posts (#32356 by @ClearlyClaire)
|
||||
- Fix notification requests from suspended accounts still being listed (#32354 by @ClearlyClaire)
|
||||
- Fix list edition modal styling (#32358 and #32367 by @ClearlyClaire and @vmstan)
|
||||
- Fix 4 columns barely not fitting on 1920px screen (#32361 by @ClearlyClaire)
|
||||
- Fix icon alignment in applications list (#32293 by @mjankowski)
|
||||
|
||||
## [4.3.0] - 2024-10-08
|
||||
|
||||
The following changelog entries focus on changes visible to users, administrators, client developers or federated software developers, but there has also been a lot of code modernization, refactoring, and tooling work, in particular by @mjankowski.
|
||||
|
48
Gemfile.lock
48
Gemfile.lock
@ -97,7 +97,7 @@ GEM
|
||||
attr_required (1.0.2)
|
||||
awrence (1.2.1)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.1001.0)
|
||||
aws-partitions (1.1004.0)
|
||||
aws-sdk-core (3.212.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
@ -106,18 +106,18 @@ GEM
|
||||
aws-sdk-kms (1.95.0)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.170.0)
|
||||
aws-sdk-s3 (1.170.1)
|
||||
aws-sdk-core (~> 3, >= 3.210.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.10.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
azure-blob (0.5.2)
|
||||
azure-blob (0.5.3)
|
||||
rexml
|
||||
base64 (0.2.0)
|
||||
bcp47_spec (0.2.1)
|
||||
bcrypt (3.1.20)
|
||||
benchmark (0.3.0)
|
||||
benchmark (0.4.0)
|
||||
better_errors (2.10.1)
|
||||
erubi (>= 1.0.0)
|
||||
rack (>= 0.9.0)
|
||||
@ -131,7 +131,7 @@ GEM
|
||||
msgpack (~> 1.2)
|
||||
brakeman (6.2.2)
|
||||
racc
|
||||
browser (6.0.0)
|
||||
browser (6.1.0)
|
||||
brpoplpush-redis_script (0.1.3)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.5)
|
||||
redis (>= 1.0, < 6)
|
||||
@ -178,7 +178,7 @@ GEM
|
||||
activerecord (>= 5.a)
|
||||
database_cleaner-core (~> 2.0.0)
|
||||
database_cleaner-core (2.0.1)
|
||||
date (3.3.4)
|
||||
date (3.4.0)
|
||||
debug (1.9.2)
|
||||
irb (~> 1.10)
|
||||
reline (>= 0.3.8)
|
||||
@ -189,10 +189,10 @@ GEM
|
||||
railties (>= 4.1.0)
|
||||
responders
|
||||
warden (~> 1.2.3)
|
||||
devise-two-factor (6.0.0)
|
||||
activesupport (~> 7.0)
|
||||
devise-two-factor (6.1.0)
|
||||
activesupport (>= 7.0, < 8.1)
|
||||
devise (~> 4.0)
|
||||
railties (~> 7.0)
|
||||
railties (>= 7.0, < 8.1)
|
||||
rotp (~> 6.0)
|
||||
devise_pam_authenticatable2 (9.2.0)
|
||||
devise (>= 4.0.0)
|
||||
@ -330,7 +330,7 @@ GEM
|
||||
azure-blob (~> 0.5.2)
|
||||
hashie (~> 5.0)
|
||||
jmespath (1.6.2)
|
||||
json (2.7.4)
|
||||
json (2.8.1)
|
||||
json-canonicalization (1.0.0)
|
||||
json-jwt (1.15.3.1)
|
||||
activesupport (>= 4.2)
|
||||
@ -407,16 +407,16 @@ GEM
|
||||
mime-types (3.6.0)
|
||||
logger
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2024.1001)
|
||||
mime-types-data (3.2024.1105)
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.7)
|
||||
minitest (5.25.1)
|
||||
msgpack (1.7.3)
|
||||
msgpack (1.7.5)
|
||||
multi_json (1.15.0)
|
||||
mutex_m (0.2.0)
|
||||
net-http (0.5.0)
|
||||
uri
|
||||
net-imap (0.5.0)
|
||||
net-imap (0.5.1)
|
||||
date
|
||||
net-protocol
|
||||
net-ldap (0.19.0)
|
||||
@ -554,10 +554,10 @@ GEM
|
||||
opentelemetry-semantic_conventions (1.10.1)
|
||||
opentelemetry-api (~> 1.0)
|
||||
orm_adapter (0.5.0)
|
||||
ostruct (0.6.0)
|
||||
ostruct (0.6.1)
|
||||
ox (2.14.18)
|
||||
parallel (1.26.3)
|
||||
parser (3.3.5.0)
|
||||
parser (3.3.6.0)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
parslet (2.0.0)
|
||||
@ -579,7 +579,7 @@ GEM
|
||||
activesupport (>= 7.0.0)
|
||||
rack
|
||||
railties (>= 7.0.0)
|
||||
psych (5.1.2)
|
||||
psych (5.2.0)
|
||||
stringio
|
||||
public_suffix (6.0.1)
|
||||
puma (6.4.3)
|
||||
@ -664,7 +664,7 @@ GEM
|
||||
redlock (1.3.2)
|
||||
redis (>= 3.0.0, < 6.0)
|
||||
regexp_parser (2.9.2)
|
||||
reline (0.5.10)
|
||||
reline (0.5.11)
|
||||
io-console (~> 0.5)
|
||||
request_store (1.6.0)
|
||||
rack (>= 1.4)
|
||||
@ -673,7 +673,7 @@ GEM
|
||||
railties (>= 5.2)
|
||||
rexml (3.3.9)
|
||||
rotp (6.3.0)
|
||||
rouge (4.4.0)
|
||||
rouge (4.5.1)
|
||||
rpam2 (4.0.2)
|
||||
rqrcode (2.2.0)
|
||||
chunky_png (~> 1.0)
|
||||
@ -693,7 +693,7 @@ GEM
|
||||
rspec-mocks (3.13.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.13.0)
|
||||
rspec-rails (7.0.1)
|
||||
rspec-rails (7.1.0)
|
||||
actionpack (>= 7.0)
|
||||
activesupport (>= 7.0)
|
||||
railties (>= 7.0)
|
||||
@ -753,7 +753,7 @@ GEM
|
||||
scenic (1.8.0)
|
||||
activerecord (>= 4.0.0)
|
||||
railties (>= 4.0.0)
|
||||
securerandom (0.3.1)
|
||||
securerandom (0.3.2)
|
||||
selenium-webdriver (4.26.0)
|
||||
base64 (~> 0.2)
|
||||
logger (~> 1.4)
|
||||
@ -794,8 +794,8 @@ GEM
|
||||
stackprof (0.2.26)
|
||||
stoplight (4.1.0)
|
||||
redlock (~> 1.0)
|
||||
stringio (3.1.1)
|
||||
strong_migrations (2.0.2)
|
||||
stringio (3.1.2)
|
||||
strong_migrations (2.1.0)
|
||||
activerecord (>= 6.1)
|
||||
swd (1.3.0)
|
||||
activesupport (>= 3)
|
||||
@ -810,7 +810,7 @@ GEM
|
||||
test-prof (1.4.2)
|
||||
thor (1.3.2)
|
||||
tilt (2.4.0)
|
||||
timeout (0.4.1)
|
||||
timeout (0.4.2)
|
||||
tpm-key_attestation (0.12.1)
|
||||
bindata (~> 2.4)
|
||||
openssl (> 2.0)
|
||||
@ -867,7 +867,7 @@ GEM
|
||||
rack-proxy (>= 0.6.1)
|
||||
railties (>= 5.2)
|
||||
semantic_range (>= 2.3.0)
|
||||
webrick (1.8.2)
|
||||
webrick (1.9.0)
|
||||
websocket (1.2.11)
|
||||
websocket-driver (0.7.6)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
|
@ -58,10 +58,7 @@ module Admin
|
||||
private
|
||||
|
||||
def set_resolved_records
|
||||
Resolv::DNS.open do |dns|
|
||||
dns.timeouts = 5
|
||||
@resolved_records = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a
|
||||
end
|
||||
@resolved_records = DomainResource.new(@email_domain_block.domain).mx
|
||||
end
|
||||
|
||||
def resource_params
|
||||
|
@ -21,6 +21,7 @@ module Admin
|
||||
@relay = Relay.new(resource_params)
|
||||
|
||||
if @relay.save
|
||||
log_action :create, @relay
|
||||
@relay.enable!
|
||||
redirect_to admin_relays_path
|
||||
else
|
||||
@ -31,18 +32,21 @@ module Admin
|
||||
def destroy
|
||||
authorize :relay, :update?
|
||||
@relay.destroy
|
||||
log_action :destroy, @relay
|
||||
redirect_to admin_relays_path
|
||||
end
|
||||
|
||||
def enable
|
||||
authorize :relay, :update?
|
||||
@relay.enable!
|
||||
log_action :enable, @relay
|
||||
redirect_to admin_relays_path
|
||||
end
|
||||
|
||||
def disable
|
||||
authorize :relay, :update?
|
||||
@relay.disable!
|
||||
log_action :disable, @relay
|
||||
redirect_to admin_relays_path
|
||||
end
|
||||
|
||||
|
@ -16,6 +16,8 @@ module Admin
|
||||
|
||||
def show
|
||||
authorize [:admin, @status], :show?
|
||||
|
||||
@status_batch_action = Admin::StatusBatchAction.new
|
||||
end
|
||||
|
||||
def batch
|
||||
|
@ -7,7 +7,6 @@ module WebAppControllerConcern
|
||||
vary_by 'Accept, Accept-Language, Cookie'
|
||||
|
||||
before_action :redirect_unauthenticated_to_permalinks!
|
||||
before_action :set_app_body_class
|
||||
|
||||
content_security_policy do |p|
|
||||
policy = ContentSecurityPolicy.new
|
||||
@ -24,10 +23,6 @@ module WebAppControllerConcern
|
||||
!(ENV['ONE_CLICK_SSO_LOGIN'] == 'true' && ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil?
|
||||
end
|
||||
|
||||
def set_app_body_class
|
||||
@body_classes = 'app-body'
|
||||
end
|
||||
|
||||
def redirect_unauthenticated_to_permalinks!
|
||||
return if user_signed_in? # NOTE: Different from upstream because we allow moved users to log in
|
||||
|
||||
|
@ -35,12 +35,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
|
||||
end
|
||||
|
||||
def set_last_used_at_by_app
|
||||
@last_used_at_by_app = Doorkeeper::AccessToken
|
||||
.select('DISTINCT ON (application_id) application_id, last_used_at')
|
||||
.where(resource_owner_id: current_resource_owner.id)
|
||||
.where.not(last_used_at: nil)
|
||||
.order(application_id: :desc, last_used_at: :desc)
|
||||
.pluck(:application_id, :last_used_at)
|
||||
.to_h
|
||||
@last_used_at_by_app = current_resource_owner.applications_last_used
|
||||
end
|
||||
end
|
||||
|
@ -12,12 +12,12 @@ module Admin::AccountModerationNotesHelper
|
||||
)
|
||||
end
|
||||
|
||||
def admin_account_inline_link_to(account)
|
||||
def admin_account_inline_link_to(account, path: nil)
|
||||
return if account.nil?
|
||||
|
||||
link_to(
|
||||
account_inline_text(account),
|
||||
admin_account_path(account.id),
|
||||
path || admin_account_path(account.id),
|
||||
class: class_names('inline-name-tag', suspended: suspended_account?(account)),
|
||||
title: account.acct
|
||||
)
|
||||
|
@ -33,6 +33,8 @@ module Admin::ActionLogsHelper
|
||||
else
|
||||
I18n.t('admin.action_logs.deleted_account')
|
||||
end
|
||||
when 'Relay'
|
||||
link_to log.human_identifier, admin_relays_path
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -79,7 +79,7 @@ module ApplicationHelper
|
||||
|
||||
def html_title
|
||||
safe_join(
|
||||
[content_for(:page_title).to_s.chomp, title]
|
||||
[content_for(:page_title), title]
|
||||
.compact_blank,
|
||||
' - '
|
||||
)
|
||||
|
@ -586,6 +586,9 @@ class Status extends ImmutablePureComponent {
|
||||
|
||||
let prepend, rebloggedByText;
|
||||
|
||||
const connectUp = previousId && previousId === status.get('in_reply_to_id');
|
||||
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
|
||||
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
|
||||
const matchedFilters = status.get('matched_filters');
|
||||
|
||||
if (hidden) {
|
||||
@ -600,10 +603,6 @@ class Status extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const connectUp = previousId && previousId === status.get('in_reply_to_id');
|
||||
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
|
||||
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
|
||||
|
||||
if (this.state.forceFilter === undefined ? matchedFilters : this.state.forceFilter) {
|
||||
const minHandlers = this.props.muted ? {} : {
|
||||
moveUp: this.handleHotkeyMoveUp,
|
||||
|
@ -7,16 +7,17 @@ export const MostUsedHashtag: React.FC<{
|
||||
}> = ({ data }) => {
|
||||
const hashtag = data[0];
|
||||
|
||||
if (!hashtag) {
|
||||
return (
|
||||
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag' />
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag'>
|
||||
<div className='annual-report__summary__most-used-hashtag__hashtag'>
|
||||
#{hashtag.name}
|
||||
{hashtag ? (
|
||||
<>#{hashtag.name}</>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='annual_report.summary.most_used_hashtag.none'
|
||||
defaultMessage='None'
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className='annual-report__summary__most-used-hashtag__label'>
|
||||
<FormattedMessage
|
||||
|
@ -22,9 +22,9 @@ export const Percentile: React.FC<{
|
||||
percentage: () => (
|
||||
<div className='annual-report__summary__percentile__number'>
|
||||
<FormattedNumber
|
||||
value={percentile / 100}
|
||||
value={Math.min(percentile, 99) / 100}
|
||||
style='percent'
|
||||
maximumFractionDigits={1}
|
||||
maximumFractionDigits={percentile < 1 ? 1 : 0}
|
||||
/>
|
||||
</div>
|
||||
),
|
||||
|
@ -532,7 +532,9 @@ class UI extends PureComponent {
|
||||
}
|
||||
};
|
||||
|
||||
handleHotkeyBack = () => {
|
||||
handleHotkeyBack = e => {
|
||||
e.preventDefault();
|
||||
|
||||
const { history } = this.props;
|
||||
|
||||
if (history.location?.state?.fromMastodon) {
|
||||
|
@ -1943,3 +1943,31 @@ a.sparkline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status__card {
|
||||
padding: 15px;
|
||||
border-radius: 4px;
|
||||
background: $ui-base-color;
|
||||
font-size: 15px;
|
||||
line-height: 20px;
|
||||
word-wrap: break-word;
|
||||
font-weight: 400;
|
||||
border: 1px solid lighten($ui-base-color, 4%);
|
||||
color: $primary-text-color;
|
||||
box-sizing: border-box;
|
||||
min-height: 100%;
|
||||
|
||||
.status__prepend {
|
||||
padding: 0 0 15px;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.status__content {
|
||||
padding-top: 0;
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -103,6 +103,11 @@
|
||||
background-color: var(--goldenrod-2);
|
||||
}
|
||||
}
|
||||
|
||||
.status-card,
|
||||
.hashtag-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__followers {
|
||||
@ -237,7 +242,7 @@
|
||||
}
|
||||
|
||||
&__number {
|
||||
font-size: 61px;
|
||||
font-size: 54px;
|
||||
font-weight: 600;
|
||||
line-height: 73px;
|
||||
color: var(--goldenrod-2);
|
||||
@ -306,7 +311,7 @@
|
||||
}
|
||||
|
||||
.annual-report-modal {
|
||||
max-width: 480px;
|
||||
max-width: 600px;
|
||||
background: var(--indigo-1);
|
||||
border-radius: 16px;
|
||||
display: flex;
|
||||
|
@ -598,3 +598,10 @@ a.sparkline {
|
||||
::-webkit-scrollbar-thumb {
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.notification-group--annual-report {
|
||||
.notification-group__icon,
|
||||
.notification-group__main .link-button {
|
||||
color: var(--indigo-3);
|
||||
}
|
||||
}
|
||||
|
@ -339,12 +339,12 @@ a.table-action-link {
|
||||
}
|
||||
}
|
||||
|
||||
.status__content {
|
||||
padding-top: 0;
|
||||
|
||||
strong {
|
||||
font-weight: 700;
|
||||
}
|
||||
// Reset the status card to not have borders, background or padding when
|
||||
// inline in the table of statuses
|
||||
.status__card {
|
||||
border: none;
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.nothing-here {
|
||||
|
@ -393,24 +393,11 @@ class Status extends ImmutablePureComponent {
|
||||
};
|
||||
|
||||
let media, statusAvatar, prepend, rebloggedByText;
|
||||
const matchedFilters = status.get('matched_filters');
|
||||
const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0);
|
||||
|
||||
if (hidden) {
|
||||
return (
|
||||
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
||||
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex={unfocusable ? null : 0}>
|
||||
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
||||
{status.get('spoiler_text').length > 0 && (<span>{status.get('spoiler_text')}</span>)}
|
||||
{expanded && <span>{status.get('content')}</span>}
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
}
|
||||
|
||||
const connectUp = previousId && previousId === status.get('in_reply_to_id');
|
||||
const connectToRoot = rootId && rootId === status.get('in_reply_to_id');
|
||||
const connectReply = nextInReplyToId && nextInReplyToId === status.get('id');
|
||||
const matchedFilters = status.get('matched_filters');
|
||||
|
||||
if (featured) {
|
||||
prepend = (
|
||||
@ -446,6 +433,20 @@ class Status extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const expanded = (!matchedFilters || this.state.showDespiteFilter) && (!status.get('hidden') || status.get('spoiler_text').length === 0);
|
||||
|
||||
if (hidden) {
|
||||
return (
|
||||
<HotKeys handlers={handlers} tabIndex={unfocusable ? null : -1}>
|
||||
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex={unfocusable ? null : 0}>
|
||||
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
||||
{status.get('spoiler_text').length > 0 && (<span>{status.get('spoiler_text')}</span>)}
|
||||
{expanded && <span>{status.get('content')}</span>}
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
}
|
||||
|
||||
if (pictureInPicture.get('inUse')) {
|
||||
media = <PictureInPicturePlaceholder aspectRatio={this.getAttachmentAspectRatio()} />;
|
||||
} else if (status.get('media_attachments').size > 0) {
|
||||
|
@ -7,16 +7,17 @@ export const MostUsedHashtag: React.FC<{
|
||||
}> = ({ data }) => {
|
||||
const hashtag = data[0];
|
||||
|
||||
if (!hashtag) {
|
||||
return (
|
||||
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag' />
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='annual-report__bento__box annual-report__summary__most-used-hashtag'>
|
||||
<div className='annual-report__summary__most-used-hashtag__hashtag'>
|
||||
#{hashtag.name}
|
||||
{hashtag ? (
|
||||
<>#{hashtag.name}</>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='annual_report.summary.most_used_hashtag.none'
|
||||
defaultMessage='None'
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className='annual-report__summary__most-used-hashtag__label'>
|
||||
<FormattedMessage
|
||||
|
@ -22,9 +22,9 @@ export const Percentile: React.FC<{
|
||||
percentage: () => (
|
||||
<div className='annual-report__summary__percentile__number'>
|
||||
<FormattedNumber
|
||||
value={percentile / 100}
|
||||
value={Math.min(percentile, 99) / 100}
|
||||
style='percent'
|
||||
maximumFractionDigits={1}
|
||||
maximumFractionDigits={percentile < 1 ? 1 : 0}
|
||||
/>
|
||||
</div>
|
||||
),
|
||||
|
@ -482,7 +482,9 @@ class UI extends PureComponent {
|
||||
}
|
||||
};
|
||||
|
||||
handleHotkeyBack = () => {
|
||||
handleHotkeyBack = e => {
|
||||
e.preventDefault();
|
||||
|
||||
const { history } = this.props;
|
||||
|
||||
if (history.location?.state?.fromMastodon) {
|
||||
|
@ -86,6 +86,7 @@
|
||||
"alert.unexpected.title": "المعذرة!",
|
||||
"alt_text_badge.title": "نص بديل",
|
||||
"announcement.announcement": "إعلان",
|
||||
"annual_report.summary.archetype.booster": "The cool-hunter",
|
||||
"attachments_list.unprocessed": "(غير معالَج)",
|
||||
"audio.hide": "إخفاء المقطع الصوتي",
|
||||
"block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.",
|
||||
|
@ -154,7 +154,7 @@
|
||||
"compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, бо ён не публічны. Толькі публічныя допісы можна знайсці па хэштэгу.",
|
||||
"compose_form.lock_disclaimer": "Ваш уліковы запіс не {locked}. Усе могуць падпісацца на вас, каб бачыць допісы толькі для падпісчыкаў.",
|
||||
"compose_form.lock_disclaimer.lock": "закрыты",
|
||||
"compose_form.placeholder": "Што здарылася?",
|
||||
"compose_form.placeholder": "Што ў вас новага?",
|
||||
"compose_form.poll.duration": "Працягласць апытання",
|
||||
"compose_form.poll.multiple": "Множны выбар",
|
||||
"compose_form.poll.option_placeholder": "Варыянт {number}",
|
||||
|
@ -87,6 +87,17 @@
|
||||
"alert.unexpected.title": "Опаа!",
|
||||
"alt_text_badge.title": "Алтернативен текст",
|
||||
"announcement.announcement": "Оповестяване",
|
||||
"annual_report.summary.archetype.lurker": "Дебнещото",
|
||||
"annual_report.summary.archetype.oracle": "Оракул",
|
||||
"annual_report.summary.archetype.pollster": "Анкетьорче",
|
||||
"annual_report.summary.archetype.replier": "Социална пеперуда",
|
||||
"annual_report.summary.followers.followers": "последователи",
|
||||
"annual_report.summary.followers.total": "{count} общо",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "най-правено като любима публикация",
|
||||
"annual_report.summary.most_used_app.most_used_app": "най-употребявано приложение",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "най-употребяван хаштаг",
|
||||
"annual_report.summary.new_posts.new_posts": "нови публикации",
|
||||
"annual_report.summary.thanks": "Благодарим, че сте част от Mastodon!",
|
||||
"attachments_list.unprocessed": "(необработено)",
|
||||
"audio.hide": "Скриване на звука",
|
||||
"block_modal.remote_users_caveat": "Ще поискаме сървърът {domain} да почита решението ви. Съгласието обаче не се гарантира откак някои сървъри могат да боравят с блоковете по различен начин. Обществените публикации още може да се виждат от невлезли в системата потребители.",
|
||||
@ -158,6 +169,7 @@
|
||||
"compose_form.poll.duration": "Времетраене на анкетата",
|
||||
"compose_form.poll.multiple": "Множествен избор",
|
||||
"compose_form.poll.option_placeholder": "Избор {number}",
|
||||
"compose_form.poll.single": "Единичен избор",
|
||||
"compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора",
|
||||
"compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
|
||||
"compose_form.poll.type": "Стил",
|
||||
@ -195,6 +207,8 @@
|
||||
"confirmations.unfollow.message": "Наистина ли искате да не следвате {name}?",
|
||||
"confirmations.unfollow.title": "Спирате ли да следвате потребителя?",
|
||||
"content_warning.hide": "Скриване на публ.",
|
||||
"content_warning.show": "Нека се покаже",
|
||||
"content_warning.show_more": "Показване на още",
|
||||
"conversation.delete": "Изтриване на разговора",
|
||||
"conversation.mark_as_read": "Маркиране като прочетено",
|
||||
"conversation.open": "Преглед на разговора",
|
||||
@ -365,6 +379,9 @@
|
||||
"home.pending_critical_update.link": "Преглед на обновяванията",
|
||||
"home.pending_critical_update.title": "Налично критично обновяване на сигурността!",
|
||||
"home.show_announcements": "Показване на оповестяванията",
|
||||
"ignore_notifications_modal.disclaimer": "Mastodon не може да осведоми потребители, че сте пренебрегнали известията им. Пренебрегването на известията няма да спре самите съобщения да не бъдат изпращани.",
|
||||
"ignore_notifications_modal.filter_to_act_users": "Вие все още ще може да приемате, отхвърляте или докладвате потребители",
|
||||
"ignore_notifications_modal.filter_to_avoid_confusion": "Прецеждането помага за избягване на възможно объркване",
|
||||
"interaction_modal.description.favourite": "Имайки акаунт в Mastodon, може да сложите тази публикации в любими, за да позволите на автора да узнае, че я цените и да я запазите за по-късно.",
|
||||
"interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.",
|
||||
"interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.",
|
||||
@ -380,6 +397,7 @@
|
||||
"interaction_modal.title.follow": "Последване на {name}",
|
||||
"interaction_modal.title.reblog": "Подсилване на публикацията на {name}",
|
||||
"interaction_modal.title.reply": "Отговаряне на публикацията на {name}",
|
||||
"interaction_modal.title.vote": "Гласувайте в анкетата на {name}",
|
||||
"intervals.full.days": "{number, plural, one {# ден} other {# дни}}",
|
||||
"intervals.full.hours": "{number, plural, one {# час} other {# часа}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# минута} other {# минути}}",
|
||||
@ -420,6 +438,8 @@
|
||||
"lightbox.close": "Затваряне",
|
||||
"lightbox.next": "Напред",
|
||||
"lightbox.previous": "Назад",
|
||||
"lightbox.zoom_in": "Увеличение до действителната големина",
|
||||
"lightbox.zoom_out": "Увеличение до побиране",
|
||||
"limited_account_hint.action": "Показване на профила въпреки това",
|
||||
"limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.",
|
||||
"link_preview.author": "От {name}",
|
||||
@ -441,6 +461,7 @@
|
||||
"lists.subheading": "Вашите списъци",
|
||||
"load_pending": "{count, plural, one {# нов елемент} other {# нови елемента}}",
|
||||
"loading_indicator.label": "Зареждане…",
|
||||
"media_gallery.hide": "Скриване",
|
||||
"moved_to_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен, защото се преместихте в {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Скриване от известията",
|
||||
"mute_modal.hide_options": "Скриване на възможностите",
|
||||
@ -489,6 +510,7 @@
|
||||
"notification.favourite": "{name} направи любима публикацията ви",
|
||||
"notification.favourite.name_and_others_with_link": "{name} и <a>{count, plural, one {# друг} other {# други}}</a> направиха любима ваша публикация",
|
||||
"notification.follow": "{name} ви последва",
|
||||
"notification.follow.name_and_others": "{name} и <a>{count, plural, one {# друг} other {# други}}</a> ви последваха",
|
||||
"notification.follow_request": "{name} поиска да ви последва",
|
||||
"notification.follow_request.name_and_others": "{name} и {count, plural, one {# друг} other {# други}} поискаха да ви последват",
|
||||
"notification.label.mention": "Споменаване",
|
||||
@ -496,6 +518,7 @@
|
||||
"notification.label.private_reply": "Личен отговор",
|
||||
"notification.label.reply": "Отговор",
|
||||
"notification.mention": "Споменаване",
|
||||
"notification.mentioned_you": "{name} ви спомена",
|
||||
"notification.moderation-warning.learn_more": "Научете повече",
|
||||
"notification.moderation_warning": "Получихте предупреждение за модериране",
|
||||
"notification.moderation_warning.action_delete_statuses": "Някои от публикациите ви са премахнати.",
|
||||
@ -752,6 +775,7 @@
|
||||
"status.bookmark": "Отмятане",
|
||||
"status.cancel_reblog_private": "Край на подсилването",
|
||||
"status.cannot_reblog": "Публикацията не може да се подсилва",
|
||||
"status.continued_thread": "Продължена нишка",
|
||||
"status.copy": "Копиране на връзката към публикация",
|
||||
"status.delete": "Изтриване",
|
||||
"status.detailed_status": "Подробен изглед на разговора",
|
||||
@ -760,6 +784,7 @@
|
||||
"status.edit": "Редактиране",
|
||||
"status.edited": "Последно редактирано на {date}",
|
||||
"status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}",
|
||||
"status.embed": "Вземане на кода за вграждане",
|
||||
"status.favourite": "Любимо",
|
||||
"status.favourites": "{count, plural, one {любимо} other {любими}}",
|
||||
"status.filter": "Филтриране на публ.",
|
||||
@ -784,6 +809,7 @@
|
||||
"status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.",
|
||||
"status.redraft": "Изтриване и преработване",
|
||||
"status.remove_bookmark": "Премахване на отметката",
|
||||
"status.replied_in_thread": "Отговорено в нишката",
|
||||
"status.replied_to": "В отговор до {name}",
|
||||
"status.reply": "Отговор",
|
||||
"status.replyAll": "Отговор на нишка",
|
||||
@ -821,6 +847,7 @@
|
||||
"upload_error.poll": "Качването на файлове не е позволено с анкети.",
|
||||
"upload_form.audio_description": "Опишете за хора, които са глухи или трудно чуват",
|
||||
"upload_form.description": "Опишете за хора, които са слепи или имат слабо зрение",
|
||||
"upload_form.drag_and_drop.instructions": "Натиснете интервал или enter, за да подберете мултимедийно прикачване. Провлачвайки, ползвайте клавишите със стрелки, за да премествате мултимедията във всяка дадена посока. Натиснете пак интервал или enter, за да се стовари мултимедийното прикачване в новото си положение или натиснете Esc за отмяна.",
|
||||
"upload_form.edit": "Редактиране",
|
||||
"upload_form.thumbnail": "Промяна на миниобраза",
|
||||
"upload_form.video_description": "Опишете за хора, които са глухи или трудно чуват, слепи или имат слабо зрение",
|
||||
|
@ -97,6 +97,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "l'aplicació més utilitzada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "l'etiqueta més utilitzada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Cap",
|
||||
"annual_report.summary.new_posts.new_posts": "publicacions noves",
|
||||
"annual_report.summary.thanks": "Gràcies per formar part de Mastodon!",
|
||||
"attachments_list.unprocessed": "(sense processar)",
|
||||
|
@ -87,11 +87,30 @@
|
||||
"alert.unexpected.title": "Wps!",
|
||||
"alt_text_badge.title": "Testun Amgen",
|
||||
"announcement.announcement": "Cyhoeddiad",
|
||||
"annual_report.summary.archetype.booster": "Y hyrwyddwr",
|
||||
"annual_report.summary.archetype.lurker": "Yr arsylwr",
|
||||
"annual_report.summary.archetype.oracle": "Yr oracl",
|
||||
"annual_report.summary.archetype.pollster": "Yr arholwr",
|
||||
"annual_report.summary.archetype.replier": "Y sbardunwr",
|
||||
"annual_report.summary.followers.followers": "dilynwyr",
|
||||
"annual_report.summary.followers.total": "{count} cyfanswm",
|
||||
"annual_report.summary.here_it_is": "Dyma eich {year} yn gryno:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "postiad wedi'i ffefrynu fwyaf",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "postiad wedi'i hybu fwyaf",
|
||||
"annual_report.summary.highlighted_post.by_replies": "postiad gyda'r ymatebion mwyaf",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "ap a ddefnyddiwyd fwyaf",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashnod a ddefnyddiwyd fwyaf",
|
||||
"annual_report.summary.most_used_hashtag.none": "Dim",
|
||||
"annual_report.summary.new_posts.new_posts": "postiadau newydd",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Rydych chi yn y </topLabel><percentage></percentage><bottomLabel>mwyaf o ddefnyddwyr Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ni fyddwn yn dweud wrth Bernie.",
|
||||
"annual_report.summary.thanks": "Diolch am fod yn rhan o Mastodon!",
|
||||
"attachments_list.unprocessed": "(heb eu prosesu)",
|
||||
"audio.hide": "Cuddio sain",
|
||||
"block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.",
|
||||
"block_modal.show_less": "Dangos llai",
|
||||
"block_modal.show_more": "Dangos mwy",
|
||||
"block_modal.show_more": "Dangos rhagor",
|
||||
"block_modal.they_cant_mention": "Nid ydynt yn gallu eich crybwyll na'ch dilyn.",
|
||||
"block_modal.they_cant_see_posts": "Nid ydynt yn gallu gweld eich postiadau ac ni fyddwch yn gweld eu rhai hwy.",
|
||||
"block_modal.they_will_know": "Gallant weld eu bod wedi'u rhwystro.",
|
||||
@ -163,9 +182,9 @@
|
||||
"compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis",
|
||||
"compose_form.poll.type": "Arddull",
|
||||
"compose_form.publish": "Postiad",
|
||||
"compose_form.publish_form": "Cyhoeddi",
|
||||
"compose_form.publish_form": "Postiad newydd",
|
||||
"compose_form.reply": "Ateb",
|
||||
"compose_form.save_changes": "Diweddariad",
|
||||
"compose_form.save_changes": "Diweddaru",
|
||||
"compose_form.spoiler.marked": "Dileu rhybudd cynnwys",
|
||||
"compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys",
|
||||
"compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)",
|
||||
@ -508,6 +527,8 @@
|
||||
"notification.admin.report_statuses_other": "Adroddodd {name} {target}",
|
||||
"notification.admin.sign_up": "Cofrestrodd {name}",
|
||||
"notification.admin.sign_up.name_and_others": "Cofrestrodd {name} {count, plural, one {ac # arall} other {a # arall}}",
|
||||
"notification.annual_report.message": "Mae eich #Wrapstodon {year} yn aros i chi! Gwelwch eich uchafbwyntiau ac amseroedd i'w cofio o'r flwyddyn hon ar Mastodon!",
|
||||
"notification.annual_report.view": "Gweld #Wrapstodon",
|
||||
"notification.favourite": "Ffafriodd {name} eich postiad",
|
||||
"notification.favourite.name_and_others_with_link": "Ffafriodd {name} a <a>{count, plural, one {# arall} other {# arall}}</a> eich postiad",
|
||||
"notification.follow": "Dilynodd {name} chi",
|
||||
|
@ -87,6 +87,25 @@
|
||||
"alert.unexpected.title": "Ups!",
|
||||
"alt_text_badge.title": "Alt text",
|
||||
"announcement.announcement": "Bekendtgørelse",
|
||||
"annual_report.summary.archetype.booster": "Cool-hunter",
|
||||
"annual_report.summary.archetype.lurker": "Lurker",
|
||||
"annual_report.summary.archetype.oracle": "Oracle",
|
||||
"annual_report.summary.archetype.pollster": "Pollster",
|
||||
"annual_report.summary.archetype.replier": "Social butterfly",
|
||||
"annual_report.summary.followers.followers": "følgere",
|
||||
"annual_report.summary.followers.total": "{count} i alt",
|
||||
"annual_report.summary.here_it_is": "Her er {year} i sammendrag:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerede indlæg",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "mest boostede indlæg",
|
||||
"annual_report.summary.highlighted_post.by_replies": "indlæg med flest svar",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}s",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest benyttede app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Intet",
|
||||
"annual_report.summary.new_posts.new_posts": "nye indlæg",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Det betyder, at man er i top</topLabel><percentage></percentage><bottomLabel>af Mastodon-brugere.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Vi fortæller det ikke til Bernie.",
|
||||
"annual_report.summary.thanks": "Tak for at være en del af Mastodon!",
|
||||
"attachments_list.unprocessed": "(ubehandlet)",
|
||||
"audio.hide": "Skjul lyd",
|
||||
"block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.",
|
||||
@ -158,6 +177,7 @@
|
||||
"compose_form.poll.duration": "Afstemningens varighed",
|
||||
"compose_form.poll.multiple": "Multivalg",
|
||||
"compose_form.poll.option_placeholder": "Valgmulighed {number}",
|
||||
"compose_form.poll.single": "Enkeltvalg",
|
||||
"compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
|
||||
"compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
|
||||
"compose_form.poll.type": "Stil",
|
||||
@ -507,6 +527,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} anmeldte {target}",
|
||||
"notification.admin.sign_up": "{name} tilmeldte sig",
|
||||
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig",
|
||||
"notification.annual_report.message": "{year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!",
|
||||
"notification.annual_report.view": "Vis #Wrapstodon",
|
||||
"notification.favourite": "{name} favoritmarkerede dit indlæg",
|
||||
"notification.favourite.name_and_others_with_link": "{name} og <a>{count, plural, one {# anden} other {# andre}}</a> gjorde dit indlæg til favorit",
|
||||
"notification.follow": "{name} begyndte at følge dig",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "am häufigsten verwendete App",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "am häufigsten verwendeter Hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Kein",
|
||||
"annual_report.summary.new_posts.new_posts": "neue Beiträge",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Damit gehörst du zu den obersten</topLabel><percentage></percentage><bottomLabel>der Mastodon-Nutzer*innen.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Wir werden Bernie nichts verraten.",
|
||||
@ -525,15 +526,15 @@
|
||||
"notification.admin.report_statuses": "{name} meldete {target} wegen {category}",
|
||||
"notification.admin.report_statuses_other": "{name} meldete {target}",
|
||||
"notification.admin.sign_up": "{name} registrierte sich",
|
||||
"notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} registrierten sich",
|
||||
"notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} registrierten sich",
|
||||
"notification.annual_report.message": "Dein {year} #Wrapstodon erwartet dich! Lass deine Highlights und unvergesslichen Momente auf Mastodon erneut aufleben!",
|
||||
"notification.annual_report.view": "#Wrapstodon ansehen",
|
||||
"notification.favourite": "{name} favorisierte deinen Beitrag",
|
||||
"notification.favourite.name_and_others_with_link": "{name} und <a>{count, plural, one {# weitere Person} other {# weitere Personen}}</a> favorisierten deinen Beitrag",
|
||||
"notification.favourite.name_and_others_with_link": "{name} und <a>{count, plural, one {# weiteres Profil} other {# weitere Profile}}</a> favorisierten deinen Beitrag",
|
||||
"notification.follow": "{name} folgt dir",
|
||||
"notification.follow.name_and_others": "{name} und <a>{count, plural, one {# weitere Person} other {# weitere Personen}}</a> folgen dir",
|
||||
"notification.follow.name_and_others": "{name} und <a>{count, plural, one {# weiteres Profil} other {# weitere Profile}}</a> folgen dir",
|
||||
"notification.follow_request": "{name} möchte dir folgen",
|
||||
"notification.follow_request.name_and_others": "{name} und {count, plural, one {# weitere Person} other {# weitere Personen}} möchten dir folgen",
|
||||
"notification.follow_request.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} möchten dir folgen",
|
||||
"notification.label.mention": "Erwähnung",
|
||||
"notification.label.private_mention": "Private Erwähnung",
|
||||
"notification.label.private_reply": "Private Antwort",
|
||||
@ -552,7 +553,7 @@
|
||||
"notification.own_poll": "Deine Umfrage ist beendet",
|
||||
"notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet",
|
||||
"notification.reblog": "{name} teilte deinen Beitrag",
|
||||
"notification.reblog.name_and_others_with_link": "{name} und <a>{count, plural, one {# weitere Person} other {# weitere Personen}}</a> teilten 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",
|
||||
"notification.relationships_severance_event.account_suspension": "Ein Admin von {from} hat {target} gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.",
|
||||
"notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} blockiert – darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.",
|
||||
|
@ -87,6 +87,24 @@
|
||||
"alert.unexpected.title": "Ουπς!",
|
||||
"alt_text_badge.title": "Εναλλακτικό κείμενο",
|
||||
"announcement.announcement": "Ανακοίνωση",
|
||||
"annual_report.summary.archetype.booster": "Ο κυνηγός των φοβερών",
|
||||
"annual_report.summary.archetype.lurker": "Ο διακριτικός",
|
||||
"annual_report.summary.archetype.oracle": "Η Πυθία",
|
||||
"annual_report.summary.archetype.pollster": "Ο δημοσκόπος",
|
||||
"annual_report.summary.archetype.replier": "Η κοινωνική πεταλούδα",
|
||||
"annual_report.summary.followers.followers": "ακόλουθοι",
|
||||
"annual_report.summary.followers.total": "{count} συνολικά",
|
||||
"annual_report.summary.here_it_is": "Εδώ είναι το {year} σου σε ανασκόπηση:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "πιο αγαπημένη ανάρτηση",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "πιο ενισχυμένη ανάρτηση",
|
||||
"annual_report.summary.highlighted_post.by_replies": "ανάρτηση με τις περισσότερες απαντήσεις",
|
||||
"annual_report.summary.highlighted_post.possessive": "του χρήστη {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "πιο χρησιμοποιημένη εφαρμογή",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "πιο χρησιμοποιημένη ετικέτα",
|
||||
"annual_report.summary.new_posts.new_posts": "νέες αναρτήσεις",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Αυτό σε βάζει στην κορυφή του </topLabel><percentage></percentage><bottomLabel>των χρηστών του Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Δεν θα το πούμε στον Bernie.",
|
||||
"annual_report.summary.thanks": "Ευχαριστούμε που συμμετέχεις στο Mastodon!",
|
||||
"attachments_list.unprocessed": "(μη επεξεργασμένο)",
|
||||
"audio.hide": "Απόκρυψη αρχείου ήχου",
|
||||
"block_modal.remote_users_caveat": "Θα ζητήσουμε από τον διακομιστή {domain} να σεβαστεί την απόφασή σου. Ωστόσο, η συμμόρφωση δεν είναι εγγυημένη δεδομένου ότι ορισμένοι διακομιστές ενδέχεται να χειρίζονται τους αποκλεισμούς διαφορετικά. Οι δημόσιες αναρτήσεις ενδέχεται να είναι ορατές σε μη συνδεδεμένους χρήστες.",
|
||||
@ -158,6 +176,7 @@
|
||||
"compose_form.poll.duration": "Διάρκεια δημοσκόπησης",
|
||||
"compose_form.poll.multiple": "Πολλαπλή επιλογή",
|
||||
"compose_form.poll.option_placeholder": "Επιλογή {number}",
|
||||
"compose_form.poll.single": "Μονή επιλογή",
|
||||
"compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές",
|
||||
"compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
|
||||
"compose_form.poll.type": "Στυλ",
|
||||
@ -196,6 +215,7 @@
|
||||
"confirmations.unfollow.title": "Άρση ακολούθησης;",
|
||||
"content_warning.hide": "Απόκρυψη ανάρτησης",
|
||||
"content_warning.show": "Εμφάνιση ούτως ή άλλως",
|
||||
"content_warning.show_more": "Εμφάνιση περισσότερων",
|
||||
"conversation.delete": "Διαγραφή συζήτησης",
|
||||
"conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
|
||||
"conversation.open": "Προβολή συνομιλίας",
|
||||
@ -304,6 +324,7 @@
|
||||
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
|
||||
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
|
||||
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
|
||||
"filter_warning.matches_filter": "Ταιριάζει με το φίλτρο “<span>{title}</span>”",
|
||||
"filtered_notifications_banner.pending_requests": "Από {count, plural, =0 {κανένα} one {ένα άτομο} other {# άτομα}} που μπορεί να ξέρεις",
|
||||
"filtered_notifications_banner.title": "Φιλτραρισμένες ειδοποιήσεις",
|
||||
"firehose.all": "Όλα",
|
||||
@ -383,9 +404,10 @@
|
||||
"interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.",
|
||||
"interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.",
|
||||
"interaction_modal.description.reply": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σε αυτή την ανάρτηση.",
|
||||
"interaction_modal.login.action": "Take me home\nΠήγαινέ με στην αρχική σελίδα",
|
||||
"interaction_modal.description.vote": "Με ένα λογαριασμό Mastodon, μπορείς να απαντήσεις σ' αυτή την ανάρτηση.",
|
||||
"interaction_modal.login.action": "Πήγαινέ με στην αρχική σελίδα",
|
||||
"interaction_modal.login.prompt": "Τομέας του οικιακού σου διακομιστή, πχ. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Not on Mastodon?\nΔεν είστε στο Mastodon;",
|
||||
"interaction_modal.no_account_yet": "Δεν είστε στο Mastodon;",
|
||||
"interaction_modal.on_another_server": "Σε διαφορετικό διακομιστή",
|
||||
"interaction_modal.on_this_server": "Σε αυτόν τον διακομιστή",
|
||||
"interaction_modal.sign_in": "Δεν είσαι συνδεδεμένος σε αυτόν το διακομιστή. Πού φιλοξενείται ο λογαριασμός σου;",
|
||||
@ -394,6 +416,7 @@
|
||||
"interaction_modal.title.follow": "Ακολούθησε {name}",
|
||||
"interaction_modal.title.reblog": "Ενίσχυσε την ανάρτηση του {name}",
|
||||
"interaction_modal.title.reply": "Απάντηση στην ανάρτηση του {name}",
|
||||
"interaction_modal.title.vote": "Ψήφισε στη δημοσκόπηση του χρήστη {name}",
|
||||
"intervals.full.days": "{number, plural, one {# μέρα} other {# μέρες}}",
|
||||
"intervals.full.hours": "{number, plural, one {# ώρα} other {# ώρες}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}",
|
||||
@ -503,9 +526,12 @@
|
||||
"notification.admin.report_statuses_other": "Ο χρήστης {name} ανέφερε τον χρήστη {target}",
|
||||
"notification.admin.sign_up": "{name} έχει εγγραφεί",
|
||||
"notification.admin.sign_up.name_and_others": "{name} και {count, plural, one {# ακόμη} other {# ακόμη}} έχουν εγγραφεί",
|
||||
"notification.annual_report.message": "Το #Wrapstodon {year} σε περιμένει! Αποκάλυψε τα στιγμιότυπα της χρονιάς και αξέχαστες στιγμές σου στο Mastodon!",
|
||||
"notification.annual_report.view": "Προβολή #Wrapstodon",
|
||||
"notification.favourite": "{name} favorited your post\n{name} προτίμησε την ανάρτηση σου",
|
||||
"notification.favourite.name_and_others_with_link": "{name} και <a>{count, plural, one {# ακόμη} other {# ακόμη}}</a> αγάπησαν την ανάρτησή σου",
|
||||
"notification.follow": "Ο/Η {name} σε ακολούθησε",
|
||||
"notification.follow.name_and_others": "Ο χρήστης {name} και <a>{count, plural, one {# ακόμη} other {# ακόμη}}</a> σε ακολούθησαν",
|
||||
"notification.follow_request": "Ο/H {name} ζήτησε να σε ακολουθήσει",
|
||||
"notification.follow_request.name_and_others": "{name} και {count, plural, one {# άλλος} other {# άλλοι}} ζήτησαν να σε ακολουθήσουν",
|
||||
"notification.label.mention": "Επισήμανση",
|
||||
@ -513,6 +539,7 @@
|
||||
"notification.label.private_reply": "Ιδιωτική απάντηση",
|
||||
"notification.label.reply": "Απάντηση",
|
||||
"notification.mention": "Επισήμανση",
|
||||
"notification.mentioned_you": "Ο χρήστης {name} σε επισήμανε",
|
||||
"notification.moderation-warning.learn_more": "Μάθε περισσότερα",
|
||||
"notification.moderation_warning": "Έχετε λάβει μία προειδοποίηση συντονισμού",
|
||||
"notification.moderation_warning.action_delete_statuses": "Ορισμένες από τις αναρτήσεις σου έχουν αφαιρεθεί.",
|
||||
@ -563,6 +590,7 @@
|
||||
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
|
||||
"notifications.column_settings.follow": "Νέοι ακόλουθοι:",
|
||||
"notifications.column_settings.follow_request": "Νέο αίτημα ακολούθησης:",
|
||||
"notifications.column_settings.group": "Ομάδα",
|
||||
"notifications.column_settings.mention": "Επισημάνσεις:",
|
||||
"notifications.column_settings.poll": "Αποτελέσματα δημοσκόπησης:",
|
||||
"notifications.column_settings.push": "Ειδοποιήσεις Push",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||
"annual_report.summary.most_used_app.most_used_app": "most used app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "most used hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "None",
|
||||
"annual_report.summary.new_posts.new_posts": "new posts",
|
||||
"annual_report.summary.percentile.text": "<topLabel>That puts you in the top</topLabel><percentage></percentage><bottomLabel>of Mastodon users.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "We won't tell Bernie.",
|
||||
|
@ -90,6 +90,8 @@
|
||||
"annual_report.summary.archetype.replier": "La plej societema",
|
||||
"annual_report.summary.followers.followers": "sekvantoj",
|
||||
"annual_report.summary.highlighted_post.by_replies": "afiŝo kun la plej multaj respondoj",
|
||||
"annual_report.summary.most_used_app.most_used_app": "plej uzita apo",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nenio",
|
||||
"annual_report.summary.new_posts.new_posts": "novaj afiŝoj",
|
||||
"annual_report.summary.thanks": "Dankon pro esti parto de Mastodon!",
|
||||
"attachments_list.unprocessed": "(neprilaborita)",
|
||||
@ -219,7 +221,7 @@
|
||||
"dismissable_banner.community_timeline": "Jen la plej novaj publikaj afiŝoj de uzantoj, kies kontojn gastigas {domain}.",
|
||||
"dismissable_banner.dismiss": "Eksigi",
|
||||
"dismissable_banner.explore_links": "Tiuj novaĵoj estas aktuale priparolataj de uzantoj en tiu ĉi kaj aliaj serviloj, sur la malcentrigita reto.",
|
||||
"dismissable_banner.explore_statuses": "Ĉi tiuj estas afiŝoj de la tuta socia reto, kiuj populariĝas hodiaŭ. Pli novaj afiŝoj kun pli da diskonigoj kaj plej ŝatataj estas rangigitaj pli alte.",
|
||||
"dismissable_banner.explore_statuses": "Jen afiŝoj en la socia reto kiuj populariĝis hodiaŭ. Novaj afiŝoj kun pli da diskonigoj kaj stelumoj aperas pli alte.",
|
||||
"dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.",
|
||||
"dismissable_banner.public_timeline": "Ĉi tiuj estas la plej lastatempaj publikaj afiŝoj de homoj en la socia reto, kiujn homoj sur {domain} sekvas.",
|
||||
"domain_block_modal.block": "Bloki servilon",
|
||||
@ -338,7 +340,7 @@
|
||||
"followed_tags": "Sekvataj kradvortoj",
|
||||
"footer.about": "Pri",
|
||||
"footer.directory": "Profilujo",
|
||||
"footer.get_app": "Akiru la Programon",
|
||||
"footer.get_app": "Akiri la apon",
|
||||
"footer.invite": "Inviti homojn",
|
||||
"footer.keyboard_shortcuts": "Fulmoklavoj",
|
||||
"footer.privacy_policy": "Politiko de privateco",
|
||||
@ -387,7 +389,7 @@
|
||||
"ignore_notifications_modal.not_followers_title": "Ĉu ignori sciigojn de homoj, kiuj ne sekvas vin?",
|
||||
"ignore_notifications_modal.not_following_title": "Ĉu ignori sciigojn de homoj, kiujn vi ne sekvas?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Ĉu ignori sciigojn de nepetitaj privataj mencioj?",
|
||||
"interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumiti ĉi tiun afiŝon por sciigi la afiŝanton ke vi aprezigas ŝin kaj konservas por la estonteco.",
|
||||
"interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumi ĉi tiun afiŝon por sciigi la afiŝanton ke vi sâtas kaj konservas ĝin por poste.",
|
||||
"interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povas sekvi {name} por ricevi iliajn afiŝojn en via hejma fluo.",
|
||||
"interaction_modal.description.reblog": "Kun konto ĉe Mastodon, vi povas diskonigi ĉi tiun afiŝon, por ke viaj propraj sekvantoj vidu ĝin.",
|
||||
"interaction_modal.description.reply": "Kun konto ĉe Mastodon, vi povos respondi al ĉi tiu afiŝo.",
|
||||
@ -646,7 +648,7 @@
|
||||
"onboarding.start.lead": "Vi nun estas parto de Mastodon, unika, malcentralizita socia amaskomunikilara platformo, kie vi—ne algoritmo—zorgas vian propran sperton. Ni komencu vin sur ĉi tiu nova socia limo:",
|
||||
"onboarding.start.skip": "Ĉu vi ne bezonas helpon por komenci?",
|
||||
"onboarding.start.title": "Vi atingas ĝin!",
|
||||
"onboarding.steps.follow_people.body": "Sekvi interesajn homojn estas pri kio Mastodonto temas.",
|
||||
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
|
||||
"onboarding.steps.follow_people.title": "Agordu vian hejman fluon",
|
||||
"onboarding.steps.publish_status.body": "Salutu la mondon per teksto, fotoj, filmetoj aŭ balotenketoj {emoji}",
|
||||
"onboarding.steps.publish_status.title": "Fari vian unuan afiŝon",
|
||||
@ -780,9 +782,9 @@
|
||||
"server_banner.is_one_of_many": "{domain} estas unu el la multaj sendependaj Mastodon-serviloj, kiujn vi povas uzi por partopreni en la fediverso.",
|
||||
"server_banner.server_stats": "Statistikoj de la servilo:",
|
||||
"sign_in_banner.create_account": "Krei konton",
|
||||
"sign_in_banner.follow_anyone": "Sekvi iun ajn tra la fediverso kaj vidi ĉion en kronologia ordo. Neniuj algoritmoj, reklamoj aŭ klakbetoj videblas.",
|
||||
"sign_in_banner.mastodon_is": "Mastodonto estas la plej bona maniero por resti flank-al-flanke kun kio okazas.",
|
||||
"sign_in_banner.sign_in": "Saluti",
|
||||
"sign_in_banner.follow_anyone": "Sekvu iun ajn tra la fediverso kaj vidu ĉion laŭ templinio. Nul algoritmo, reklamo aŭ kliklogilo ĉeestas.",
|
||||
"sign_in_banner.mastodon_is": "Mastodon estas la plej bona maniero resti ĝisdata pri aktualaĵoj.",
|
||||
"sign_in_banner.sign_in": "Ensaluti",
|
||||
"sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi",
|
||||
"status.admin_account": "Malfermi fasadon de moderigado por @{name}",
|
||||
"status.admin_domain": "Malfermu moderigan interfacon por {domain}",
|
||||
|
@ -87,22 +87,23 @@
|
||||
"alert.unexpected.title": "¡Epa!",
|
||||
"alt_text_badge.title": "Texto alternativo",
|
||||
"announcement.announcement": "Anuncio",
|
||||
"annual_report.summary.archetype.booster": "El cazador de tendencias",
|
||||
"annual_report.summary.archetype.booster": "Corrió la voz",
|
||||
"annual_report.summary.archetype.lurker": "El acechador",
|
||||
"annual_report.summary.archetype.oracle": "El oráculo",
|
||||
"annual_report.summary.archetype.pollster": "El encuestador",
|
||||
"annual_report.summary.archetype.replier": "El más sociable",
|
||||
"annual_report.summary.archetype.pollster": "Estuvo consultando",
|
||||
"annual_report.summary.archetype.replier": "Respondió un montón",
|
||||
"annual_report.summary.followers.followers": "seguidores",
|
||||
"annual_report.summary.followers.total": "{count} en total",
|
||||
"annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "publicación con más favoritos",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "publicación más impulsada",
|
||||
"annual_report.summary.highlighted_post.by_replies": "publicación con más respuestas",
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.here_it_is": "Acá está tu resumen de {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "el mensaje más veces marcado como favorito",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "el mensaje que más adhesiones recibió",
|
||||
"annual_report.summary.highlighted_post.by_replies": "el mensaje que más respuestas recibió",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "la aplicación más usada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "la etiqueta más usada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Ninguna",
|
||||
"annual_report.summary.new_posts.new_posts": "nuevos mensajes",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en la cima</topLabel><percentage></percentage><bottomLabel>de los usuarios de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||
"annual_report.summary.thanks": "¡Gracias por ser parte de Mastodon!",
|
||||
"attachments_list.unprocessed": "[sin procesar]",
|
||||
|
@ -89,9 +89,9 @@
|
||||
"announcement.announcement": "Anuncio",
|
||||
"annual_report.summary.archetype.booster": "El cazador de tendencias",
|
||||
"annual_report.summary.archetype.lurker": "El acechador",
|
||||
"annual_report.summary.archetype.oracle": "El oráculo",
|
||||
"annual_report.summary.archetype.oracle": "El oraculo",
|
||||
"annual_report.summary.archetype.pollster": "El encuestador",
|
||||
"annual_report.summary.archetype.replier": "El más sociable",
|
||||
"annual_report.summary.archetype.replier": "La mariposa sociable",
|
||||
"annual_report.summary.followers.followers": "seguidores",
|
||||
"annual_report.summary.followers.total": "{count} en total",
|
||||
"annual_report.summary.here_it_is": "Aquí está tu resumen de {year}:",
|
||||
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Ninguna",
|
||||
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplicación más usada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "etiqueta más usada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Ninguna",
|
||||
"annual_report.summary.new_posts.new_posts": "nuevas publicaciones",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Eso te pone en el top</topLabel><percentage></percentage><bottomLabel>de usuarios de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "No se lo diremos a Bernie.",
|
||||
|
@ -87,10 +87,22 @@
|
||||
"alert.unexpected.title": "Hups!",
|
||||
"alt_text_badge.title": "Vaihtoehtoinen teksti",
|
||||
"announcement.announcement": "Tiedote",
|
||||
"annual_report.summary.archetype.booster": "Tehostaja",
|
||||
"annual_report.summary.archetype.lurker": "Lymyilijä",
|
||||
"annual_report.summary.archetype.oracle": "Oraakkeli",
|
||||
"annual_report.summary.archetype.pollster": "Mielipidetutkija",
|
||||
"annual_report.summary.archetype.replier": "Sosiaalinen perhonen",
|
||||
"annual_report.summary.followers.followers": "seuraajaa",
|
||||
"annual_report.summary.followers.total": "{count} yhteensä",
|
||||
"annual_report.summary.here_it_is": "Tässä on katsaus vuoteesi {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "suosikkeihin lisätyin julkaisu",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "tehostetuin julkaisu",
|
||||
"annual_report.summary.highlighted_post.by_replies": "julkaisu, jolla on eniten vastauksia",
|
||||
"annual_report.summary.highlighted_post.possessive": "Käyttäjän {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "käytetyin sovellus",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "käytetyin aihetunniste",
|
||||
"annual_report.summary.new_posts.new_posts": "uutta julkaisua",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Olet osa huippujoukkoa, johon kuuluu</topLabel><percentage></percentage><bottomLabel>Mastodon-käyttäjistä.</bottomLabel>",
|
||||
"annual_report.summary.thanks": "Kiitos, että olet osa Mastodonia!",
|
||||
"attachments_list.unprocessed": "(käsittelemätön)",
|
||||
"audio.hide": "Piilota ääni",
|
||||
@ -513,6 +525,7 @@
|
||||
"notification.admin.report_statuses_other": "{name} raportoi käyttäjän {target}",
|
||||
"notification.admin.sign_up": "{name} rekisteröityi",
|
||||
"notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}} rekisteröityivät",
|
||||
"notification.annual_report.message": "Vuoden {year} #Wrapstodon odottaa! Paljasta vuotesi kohokohdat ikimuistoiset hetket Mastodonissa!",
|
||||
"notification.annual_report.view": "Näytä #Wrapstodon",
|
||||
"notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa",
|
||||
"notification.favourite.name_and_others_with_link": "{name} ja <a>{count, plural, one {# muu} other {# muuta}}</a> lisäsivät julkaisusi suosikkeihinsa",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "hjá {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest brúkta app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brúkta frámerki",
|
||||
"annual_report.summary.most_used_hashtag.none": "Einki",
|
||||
"annual_report.summary.new_posts.new_posts": "nýggir postar",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Tað fær teg í topp</topLabel><percentage></percentage><bottomLabel>av Mastodon brúkarum.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Vit fara ikki at fortelja Bernie tað.",
|
||||
|
@ -87,6 +87,9 @@
|
||||
"alert.unexpected.title": "Oups!",
|
||||
"alt_text_badge.title": "Texte Alt",
|
||||
"announcement.announcement": "Annonce",
|
||||
"annual_report.summary.archetype.oracle": "L’oracle",
|
||||
"annual_report.summary.here_it_is": "Voici votre récap de {year} :",
|
||||
"annual_report.summary.most_used_app.most_used_app": "appli la plus utilisée",
|
||||
"attachments_list.unprocessed": "(non traité)",
|
||||
"audio.hide": "Masquer l'audio",
|
||||
"block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.",
|
||||
|
@ -87,6 +87,9 @@
|
||||
"alert.unexpected.title": "Oups !",
|
||||
"alt_text_badge.title": "Texte Alt",
|
||||
"announcement.announcement": "Annonce",
|
||||
"annual_report.summary.archetype.oracle": "L’oracle",
|
||||
"annual_report.summary.here_it_is": "Voici votre récap de {year} :",
|
||||
"annual_report.summary.most_used_app.most_used_app": "appli la plus utilisée",
|
||||
"attachments_list.unprocessed": "(non traité)",
|
||||
"audio.hide": "Masquer l'audio",
|
||||
"block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.",
|
||||
|
@ -87,6 +87,11 @@
|
||||
"alert.unexpected.title": "Vaites!",
|
||||
"alt_text_badge.title": "Texto Alt",
|
||||
"announcement.announcement": "Anuncio",
|
||||
"annual_report.summary.archetype.booster": "A axencia de noticias",
|
||||
"annual_report.summary.archetype.lurker": "Volleur",
|
||||
"annual_report.summary.archetype.oracle": "Sabichón/e",
|
||||
"annual_report.summary.archetype.pollster": "O INE",
|
||||
"annual_report.summary.archetype.replier": "Lareteire",
|
||||
"annual_report.summary.followers.followers": "seguidoras",
|
||||
"annual_report.summary.followers.total": "{count} en total",
|
||||
"annual_report.summary.here_it_is": "Este é o resumo do teu {year}:",
|
||||
@ -96,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "app que mais usaches",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "o cancelo mais utilizado",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nada",
|
||||
"annual_report.summary.new_posts.new_posts": "novas publicacións",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Sitúante no top</topLabel><percentage></percentage><bottomLabel> das usuarias de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.thanks": "Grazas por ser parte de Mastodon!",
|
||||
@ -520,6 +526,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} denunciou a {target}",
|
||||
"notification.admin.sign_up": "{name} rexistrouse",
|
||||
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# máis} other {# máis}} crearon unha conta",
|
||||
"notification.annual_report.message": "A #VidaEnMastodon de {year} agarda por ti! Desvela os momentos máis destacados e historias reseñables en Mastodon!",
|
||||
"notification.annual_report.view": "Ver #VidaEnMastodon",
|
||||
"notification.favourite": "{name} marcou como favorita a túa publicación",
|
||||
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {# máis} other {# máis}}</a> favoreceron a túa publicación",
|
||||
"notification.follow": "{name} comezou a seguirte",
|
||||
|
@ -87,6 +87,24 @@
|
||||
"alert.unexpected.title": "אופס!",
|
||||
"alt_text_badge.title": "כיתוב חלופי",
|
||||
"announcement.announcement": "הכרזה",
|
||||
"annual_report.summary.archetype.booster": "ההד-וניסט(ית)",
|
||||
"annual_report.summary.archetype.lurker": "השורץ.ת השקט.ה",
|
||||
"annual_report.summary.archetype.oracle": "כבוד הרב.ה",
|
||||
"annual_report.summary.archetype.pollster": "הסקרן.ית",
|
||||
"annual_report.summary.archetype.replier": "הפרפר.ית החברתי.ת",
|
||||
"annual_report.summary.followers.followers": "עוקבים",
|
||||
"annual_report.summary.followers.total": "{count} בסך הכל",
|
||||
"annual_report.summary.here_it_is": "והנה סיכום {year} שלך:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "התות הכי מחובב",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "התות הכי מהודהד",
|
||||
"annual_report.summary.highlighted_post.by_replies": "התות עם מספר התשובות הגבוה ביותר",
|
||||
"annual_report.summary.highlighted_post.possessive": "של {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "היישומון שהכי בשימוש",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "התג בשימוש הרב ביותר",
|
||||
"annual_report.summary.new_posts.new_posts": "הודעות חדשות",
|
||||
"annual_report.summary.percentile.text": "<topLabel>ממקם אותך באחוזון </topLabel><percentage></percentage><bottomLabel>של משמשי מסטודון.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "לא נגלה לברני.",
|
||||
"annual_report.summary.thanks": "תודה על היותך חלק ממסטודון!",
|
||||
"attachments_list.unprocessed": "(לא מעובד)",
|
||||
"audio.hide": "השתק",
|
||||
"block_modal.remote_users_caveat": "אנו נבקש מהשרת {domain} לכבד את החלטתך. עם זאת, ציות למוסכמות איננו מובטח כיוון ששרתים מסויימים עשויים לטפל בחסימות בצורה אחרת. הודעות פומביות עדיין יהיו גלויות לעיני משתמשים שאינם מחוברים.",
|
||||
@ -508,6 +526,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} דיווח.ה על {target}",
|
||||
"notification.admin.sign_up": "{name} נרשמו",
|
||||
"notification.admin.sign_up.name_and_others": "{name} ועוד {count, plural,one {אחד אחר}other {# אחרים}} נרשמו",
|
||||
"notification.annual_report.message": "ה- #סיכומודון שלך לשנת {year} מחכה! גלו את רגעי השיא והזכרונות ממסטודון!",
|
||||
"notification.annual_report.view": "לצפייה ב- #סיכומודון",
|
||||
"notification.favourite": "הודעתך חובבה על ידי {name}",
|
||||
"notification.favourite.name_and_others_with_link": "{name} ועוד <a>{count, plural,one {אחד נוסף}other {# נוספים}}</a> חיבבו את הודעתך",
|
||||
"notification.follow": "{name} במעקב אחרייך",
|
||||
|
@ -87,6 +87,25 @@
|
||||
"alert.unexpected.title": "Hoppá!",
|
||||
"alt_text_badge.title": "Helyettesítő szöveg",
|
||||
"announcement.announcement": "Közlemény",
|
||||
"annual_report.summary.archetype.booster": "A cool-vadász",
|
||||
"annual_report.summary.archetype.lurker": "A settenkedő",
|
||||
"annual_report.summary.archetype.oracle": "Az orákulum",
|
||||
"annual_report.summary.archetype.pollster": "A közvélemény-kutató",
|
||||
"annual_report.summary.archetype.replier": "A társasági pillangó",
|
||||
"annual_report.summary.followers.followers": "követő",
|
||||
"annual_report.summary.followers.total": "{count} összesen",
|
||||
"annual_report.summary.here_it_is": "Itt a {year}. év értékelése:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "legkedvencebb bejegyzés",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "legtöbbet megtolt bejegyzés",
|
||||
"annual_report.summary.highlighted_post.by_replies": "bejegyzés a legtöbb válasszal",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name} fióktól",
|
||||
"annual_report.summary.most_used_app.most_used_app": "legtöbbet használt app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "legtöbbet használt hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nincs",
|
||||
"annual_report.summary.new_posts.new_posts": "új bejegyzés",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Ezzel a</topLabel><percentage></percentage><bottomLabel>csúcs Mastodon felhasználó között vagy.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Nem mondjuk el Bernie-nek.",
|
||||
"annual_report.summary.thanks": "Kösz, hogy a Mastodon része vagy!",
|
||||
"attachments_list.unprocessed": "(feldolgozatlan)",
|
||||
"audio.hide": "Hang elrejtése",
|
||||
"block_modal.remote_users_caveat": "Arra kérjük a {domain} kiszolgálót, hogy tartsa tiszteletben a döntésedet. Ugyanakkor az együttműködés nem garantált, mivel néhány kiszolgáló másképp kezelheti a letiltásokat. A nyilvános bejegyzések a be nem jelentkezett felhasználók számára továbbra is látszódhatnak.",
|
||||
@ -508,6 +527,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} jelentette: {target}",
|
||||
"notification.admin.sign_up": "{name} regisztrált",
|
||||
"notification.admin.sign_up.name_and_others": "{name} és {count, plural, one {# másik} other {# másik}} regisztrált",
|
||||
"notification.annual_report.message": "Vár a {year}. év #Wrapstodon jelentése! Fedd fel az éved jelentős eseményeit és emlékezetes pillanatait a Mastodonon!",
|
||||
"notification.annual_report.view": "#Wrapstodon Megtekintése",
|
||||
"notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet",
|
||||
"notification.favourite.name_and_others_with_link": "{name} és <a>{count, plural, one {# másik} other {# másik}}</a> kedvencnek jelölte a bejegyzésedet",
|
||||
"notification.follow": "{name} követ téged",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest notaða forrit",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest notaða myllumerki",
|
||||
"annual_report.summary.most_used_hashtag.none": "Ekkert",
|
||||
"annual_report.summary.new_posts.new_posts": "nýjar færslur",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Það setur þig á meðal efstu</topLabel><percentage></percentage><bottomLabel>notenda Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Við förum ekkert að raupa um þetta.",
|
||||
|
@ -97,9 +97,11 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "di {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "l'app più utilizzata",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "l'hashtag più usato",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nessuno",
|
||||
"annual_report.summary.new_posts.new_posts": "nuovi post",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Questo ti colloca tra il</topLabel><percentage></percentage><bottomLabel>dei migliori utenti Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Non lo diremo a Bernie.",
|
||||
"annual_report.summary.thanks": "Grazie per far parte di Mastodon!",
|
||||
"attachments_list.unprocessed": "(non elaborato)",
|
||||
"audio.hide": "Nascondi audio",
|
||||
"block_modal.remote_users_caveat": "Chiederemo al server {domain} di rispettare la tua decisione. Tuttavia, la conformità non è garantita poiché alcuni server potrebbero gestire i blocchi in modo diverso. I post pubblici potrebbero essere ancora visibili agli utenti che non hanno effettuato l'accesso.",
|
||||
|
@ -87,6 +87,24 @@
|
||||
"alert.unexpected.title": "エラー!",
|
||||
"alt_text_badge.title": "代替テキスト",
|
||||
"announcement.announcement": "お知らせ",
|
||||
"annual_report.summary.archetype.booster": "トレンドハンター",
|
||||
"annual_report.summary.archetype.lurker": "ROM専",
|
||||
"annual_report.summary.archetype.oracle": "予言者",
|
||||
"annual_report.summary.archetype.pollster": "調査員",
|
||||
"annual_report.summary.archetype.replier": "社交家",
|
||||
"annual_report.summary.followers.followers": "フォロワー",
|
||||
"annual_report.summary.followers.total": "合計{count}",
|
||||
"annual_report.summary.here_it_is": "こちらがあなたの{year}年の振り返りです",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "最もお気に入りされた投稿",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "最もブーストされた投稿",
|
||||
"annual_report.summary.highlighted_post.by_replies": "最も返信が多かった投稿",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}の",
|
||||
"annual_report.summary.most_used_app.most_used_app": "最も使用されているアプリ",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最も使用されたハッシュタグ",
|
||||
"annual_report.summary.new_posts.new_posts": "新しい投稿",
|
||||
"annual_report.summary.percentile.text": "<topLabel>それにより、あなたは上位に位置しています。</topLabel><percentage></percentage><bottomLabel>Mastodonユーザーの中で。</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "バー二ーには秘密にしておくよ。",
|
||||
"annual_report.summary.thanks": "Mastodonの一員になってくれてありがとう!",
|
||||
"attachments_list.unprocessed": "(未処理)",
|
||||
"audio.hide": "音声を閉じる",
|
||||
"block_modal.remote_users_caveat": "このサーバーはあなたのブロックの意思を尊重するように {domain} へ通知します。しかしながら、ブロックの扱い方はサーバーによってさまざまで、相手のサーバーは必ずしもこのブロックを適切に取り扱うものではないことに留意が必要です。また、あなたの公開投稿はサーバーからログアウトすれば誰からも見ることができます。",
|
||||
@ -508,6 +526,8 @@
|
||||
"notification.admin.report_statuses_other": "{name}さんが{target}さんを通報しました",
|
||||
"notification.admin.sign_up": "{name}さんがサインアップしました",
|
||||
"notification.admin.sign_up.name_and_others": "{name}さんとほか{count, plural, other {#人}}がサインアップしました",
|
||||
"notification.annual_report.message": "「あなたの{year}年の#Wrapstodonが待っています!Mastodonであなたの年のハイライトや思い出の瞬間を公開しましょう!」と訳せます。",
|
||||
"notification.annual_report.view": "#Wrapstodon を表示",
|
||||
"notification.favourite": "{name}さんがお気に入りしました",
|
||||
"notification.favourite.name_and_others_with_link": "{name}さんと<a>ほか{count, plural, other {#人}}</a>がお気に入りしました",
|
||||
"notification.follow": "{name}さんにフォローされました",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name} 님의",
|
||||
"annual_report.summary.most_used_app.most_used_app": "가장 많이 사용한 앱",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "가장 많이 사용한 해시태그",
|
||||
"annual_report.summary.most_used_hashtag.none": "없음",
|
||||
"annual_report.summary.new_posts.new_posts": "새 게시물",
|
||||
"annual_report.summary.percentile.text": "<topLabel>마스토돈 사용자의 상위</topLabel><percentage></percentage><bottomLabel>입니다.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "엄마한테 말 안 할게요.",
|
||||
|
@ -87,6 +87,17 @@
|
||||
"alert.unexpected.title": "Atyo!",
|
||||
"alt_text_badge.title": "Teksto alternativo",
|
||||
"announcement.announcement": "Pregon",
|
||||
"annual_report.summary.archetype.pollster": "El anketero",
|
||||
"annual_report.summary.followers.followers": "suivantes",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "la puvlikasyon mas favoritada",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "la puvlikasyon mas repartajada",
|
||||
"annual_report.summary.highlighted_post.by_replies": "la puvlikasyon kon mas repuestas",
|
||||
"annual_report.summary.highlighted_post.possessive": "de {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "la aplikasyon mas uzada",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "la etiketa mas uzada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Dinguno",
|
||||
"annual_report.summary.new_posts.new_posts": "puvlikasyones muevas",
|
||||
"annual_report.summary.thanks": "Mersi por ser parte de Mastodon!",
|
||||
"attachments_list.unprocessed": "(no prosesado)",
|
||||
"audio.hide": "Eskonde audio",
|
||||
"block_modal.show_less": "Amostra manko",
|
||||
@ -97,6 +108,7 @@
|
||||
"block_modal.you_wont_see_mentions": "No veras publikasyones ke lo enmentan.",
|
||||
"boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez",
|
||||
"boost_modal.reblog": "Repartajar puvlikasyon?",
|
||||
"boost_modal.undo_reblog": "Departajar puvlikasyon?",
|
||||
"bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro",
|
||||
"bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.",
|
||||
"bundle_column_error.error.title": "Atyo, no!",
|
||||
@ -155,6 +167,7 @@
|
||||
"compose_form.poll.duration": "Durasion de anketa",
|
||||
"compose_form.poll.multiple": "Multiples opsyones",
|
||||
"compose_form.poll.option_placeholder": "Opsyon {number}",
|
||||
"compose_form.poll.single": "Opsyon unika",
|
||||
"compose_form.poll.switch_to_multiple": "Troka anketa para permeter a eskojer mas ke una opsyon",
|
||||
"compose_form.poll.switch_to_single": "Troka anketa para permeter a eskojer solo una opsyon",
|
||||
"compose_form.poll.type": "Estilo",
|
||||
@ -213,6 +226,7 @@
|
||||
"dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.",
|
||||
"domain_block_modal.block": "Bloka sirvidor",
|
||||
"domain_block_modal.block_account_instead": "Bloka @{name} en su lugar",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Las personas de este sirvidor pueden enteraktuar kon tus puvlikasyones viejas.",
|
||||
"domain_block_modal.they_cant_follow": "Dingun de este sirvidor puede segirte.",
|
||||
"domain_block_modal.they_wont_know": "No savra ke tiene sido blokado.",
|
||||
"domain_block_modal.title": "Bloka el domeno?",
|
||||
@ -307,6 +321,7 @@
|
||||
"follow_suggestions.personalized_suggestion": "Sujestion personalizada",
|
||||
"follow_suggestions.popular_suggestion": "Sujestion populara",
|
||||
"follow_suggestions.popular_suggestion_longer": "Popular en {domain}",
|
||||
"follow_suggestions.similar_to_recently_followed_longer": "Similares a los profils ke tienes segido resyentemente",
|
||||
"follow_suggestions.view_all": "Ve todos",
|
||||
"follow_suggestions.who_to_follow": "A ken segir",
|
||||
"followed_tags": "Etiketas segidas",
|
||||
@ -335,6 +350,9 @@
|
||||
"hashtag.follow": "Sige etiketa",
|
||||
"hashtag.unfollow": "Desige etiketa",
|
||||
"hashtags.and_other": "…i {count, plural, one {}other {# mas}}",
|
||||
"hints.profiles.followers_may_be_missing": "Puede ser ke algunos suivantes de este profil no se amostren.",
|
||||
"hints.profiles.follows_may_be_missing": "Puede ser ke algunos kuentos segidos por este profil no se amostren.",
|
||||
"hints.profiles.posts_may_be_missing": "Puede ser ke algunas puvlikasyones de este profil no se amostren.",
|
||||
"hints.profiles.see_more_followers": "Ve mas suivantes en {domain}",
|
||||
"hints.profiles.see_more_follows": "Ve mas segidos en {domain}",
|
||||
"hints.profiles.see_more_posts": "Ve mas puvlikasyones en {domain}",
|
||||
@ -352,10 +370,12 @@
|
||||
"ignore_notifications_modal.new_accounts_title": "Inyorar avizos de kuentos muevos?",
|
||||
"ignore_notifications_modal.not_followers_title": "Inyorar avizos de personas a las kualas no te sigen?",
|
||||
"ignore_notifications_modal.not_following_title": "Inyorar avizos de personas a las kualas no siges?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Ignorar avizos de mensyones privadas no solisitadas?",
|
||||
"interaction_modal.description.favourite": "Kon un kuento en Mastodon, puedes markar esta publikasyon komo favorita para ke el autor sepa ke te plaze i para guadrarla para dempues.",
|
||||
"interaction_modal.description.follow": "Kon un kuento en Mastodon, puedes segir a {name} para risivir sus publikasyones en tu linya temporal prinsipala.",
|
||||
"interaction_modal.description.reblog": "Kon un kuento en Mastodon, puedes repartajar esta publikasyon para amostrarla a tus suivantes.",
|
||||
"interaction_modal.description.reply": "Kon un kuento en Mastodon, puedes arispondir a esta publikasyon.",
|
||||
"interaction_modal.description.vote": "Kon un kuento en Mastodon, puedes votar en esta anketa.",
|
||||
"interaction_modal.login.action": "Va a tu sirvidor",
|
||||
"interaction_modal.login.prompt": "Domeno del sirvidor de tu kuento, por enshemplo mastodon.social",
|
||||
"interaction_modal.no_account_yet": "No tyenes kuento de Mastodon?",
|
||||
@ -367,6 +387,7 @@
|
||||
"interaction_modal.title.follow": "Sige a {name}",
|
||||
"interaction_modal.title.reblog": "Repartaja publikasyon de {name}",
|
||||
"interaction_modal.title.reply": "Arisponde a publikasyon de {name}",
|
||||
"interaction_modal.title.vote": "Vota en la anketa de {name}",
|
||||
"intervals.full.days": "{number, plural, one {# diya} other {# diyas}}",
|
||||
"intervals.full.hours": "{number, plural, one {# ora} other {# oras}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
|
||||
@ -466,13 +487,16 @@
|
||||
"navigation_bar.security": "Segurita",
|
||||
"not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.",
|
||||
"notification.admin.report": "{name} raporto {target}",
|
||||
"notification.admin.report_statuses": "{name} raporto {target} por {category}",
|
||||
"notification.admin.report_statuses_other": "{name} raporto {target}",
|
||||
"notification.admin.sign_up": "{name} kriyo un konto",
|
||||
"notification.annual_report.view": "Ve #Wrapstodon",
|
||||
"notification.favourite": "A {name} le plaze tu publikasyon",
|
||||
"notification.follow": "{name} te ampeso a segir",
|
||||
"notification.follow_request": "{name} tiene solisitado segirte",
|
||||
"notification.label.mention": "Enmenta",
|
||||
"notification.label.private_mention": "Enmentadura privada",
|
||||
"notification.label.private_reply": "Repuesta privada",
|
||||
"notification.label.reply": "Arisponde",
|
||||
"notification.mention": "Enmenta",
|
||||
"notification.mentioned_you": "{name} te enmento",
|
||||
@ -536,6 +560,7 @@
|
||||
"notifications.policy.accept_hint": "Amostra en avizos",
|
||||
"notifications.policy.drop": "Inyora",
|
||||
"notifications.policy.filter": "Filtra",
|
||||
"notifications.policy.filter_limited_accounts_hint": "Limitadas por moderadores del sirvidor",
|
||||
"notifications.policy.filter_limited_accounts_title": "Kuentos moderados",
|
||||
"notifications.policy.filter_new_accounts.hint": "Kriyadas durante {days, plural, one {el ultimo diya} other {los ultimos # diyas}}",
|
||||
"notifications.policy.filter_new_accounts_title": "Muevos kuentos",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "labiausiai naudota programa",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "labiausiai naudotas saitažodis",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nieko",
|
||||
"annual_report.summary.new_posts.new_posts": "nauji įrašai",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Tai reiškia, kad esate tarp</topLabel><percentage></percentage><bottomLabel>populiariausių „Mastodon“ naudotojų.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Mes nesakysime Bernie.",
|
||||
|
@ -86,6 +86,10 @@
|
||||
"alert.unexpected.message": "Radās negaidīta kļūda.",
|
||||
"alert.unexpected.title": "Ups!",
|
||||
"announcement.announcement": "Paziņojums",
|
||||
"annual_report.summary.followers.followers": "sekotāji",
|
||||
"annual_report.summary.followers.total": "pavisam {count}",
|
||||
"annual_report.summary.here_it_is": "Šeit ir {year}. gada pārskats:",
|
||||
"annual_report.summary.new_posts.new_posts": "jauni ieraksti",
|
||||
"attachments_list.unprocessed": "(neapstrādāti)",
|
||||
"audio.hide": "Slēpt audio",
|
||||
"block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}'s",
|
||||
"annual_report.summary.most_used_app.most_used_app": "meest gebruikte app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "meest gebruikte hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Geen",
|
||||
"annual_report.summary.new_posts.new_posts": "nieuwe berichten",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Dat zet je in de top</topLabel><percentage></percentage><bottomLabel>van Mastodon-gebruikers.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "We zullen Bernie niets vertellen.",
|
||||
|
@ -87,6 +87,24 @@
|
||||
"alert.unexpected.title": "Oi sann!",
|
||||
"alt_text_badge.title": "Alternativ tekst",
|
||||
"announcement.announcement": "Kunngjering",
|
||||
"annual_report.summary.archetype.booster": "Den som jaktar på noko kult",
|
||||
"annual_report.summary.archetype.lurker": "Den som heng på hjørnet",
|
||||
"annual_report.summary.archetype.oracle": "Orakelet",
|
||||
"annual_report.summary.archetype.pollster": "Meiningsmålaren",
|
||||
"annual_report.summary.archetype.replier": "Den sosiale sumarfuglen",
|
||||
"annual_report.summary.followers.followers": "fylgjarar",
|
||||
"annual_report.summary.followers.total": "{count} i alt",
|
||||
"annual_report.summary.here_it_is": "Her er eit gjensyn med {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "det mest omtykte innlegget",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "det mest framheva innlegget",
|
||||
"annual_report.summary.highlighted_post.by_replies": "innlegget med flest svar",
|
||||
"annual_report.summary.highlighted_post.possessive": "som {name} laga",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest brukte app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest brukte emneknagg",
|
||||
"annual_report.summary.new_posts.new_posts": "nye innlegg",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Du er av dei</topLabel><percentage></percentage><bottomLabel>ivrigaste Mastodon-brukarane.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ikkje eit ord til pressa.",
|
||||
"annual_report.summary.thanks": "Takk for at du er med i Mastodon!",
|
||||
"attachments_list.unprocessed": "(ubehandla)",
|
||||
"audio.hide": "Gøym lyd",
|
||||
"block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektere di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.",
|
||||
@ -197,6 +215,7 @@
|
||||
"confirmations.unfollow.title": "Slutt å fylgja brukaren?",
|
||||
"content_warning.hide": "Gøym innlegg",
|
||||
"content_warning.show": "Vis likevel",
|
||||
"content_warning.show_more": "Vis meir",
|
||||
"conversation.delete": "Slett samtale",
|
||||
"conversation.mark_as_read": "Marker som lesen",
|
||||
"conversation.open": "Sjå samtale",
|
||||
@ -305,6 +324,7 @@
|
||||
"filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny",
|
||||
"filter_modal.select_filter.title": "Filtrer dette innlegget",
|
||||
"filter_modal.title.status": "Filtrer eit innlegg",
|
||||
"filter_warning.matches_filter": "Passar med filteret «<span>{title}</span>»",
|
||||
"filtered_notifications_banner.pending_requests": "Frå {count, plural, =0 {ingen} one {éin person} other {# personar}} du kanskje kjenner",
|
||||
"filtered_notifications_banner.title": "Filtrerte varslingar",
|
||||
"firehose.all": "Alle",
|
||||
@ -506,6 +526,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} rapporterte {target}",
|
||||
"notification.admin.sign_up": "{name} er registrert",
|
||||
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} vart med",
|
||||
"notification.annual_report.message": "#Året ditt for {year} ventar! Sjå kva som skjedde i løpet av Mastodon-året ditt!",
|
||||
"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.follow": "{name} fylgde deg",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplicativo mais usado",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag mais usada",
|
||||
"annual_report.summary.most_used_hashtag.none": "Nenhuma",
|
||||
"annual_report.summary.new_posts.new_posts": "novas publicações",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Isso o coloca no topo</topLabel></percentage><bottomLabel>dos usuários de Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Não contaremos à Bernie.",
|
||||
|
@ -85,7 +85,11 @@
|
||||
"alert.rate_limited.title": "Limite de tentativas",
|
||||
"alert.unexpected.message": "Ocorreu um erro inesperado.",
|
||||
"alert.unexpected.title": "Bolas!",
|
||||
"alt_text_badge.title": "Texto alternativo",
|
||||
"announcement.announcement": "Anúncio",
|
||||
"annual_report.summary.followers.total": "{count} total",
|
||||
"annual_report.summary.here_it_is": "Aqui está o seu {year} em revisão:",
|
||||
"annual_report.summary.new_posts.new_posts": "novas publicações",
|
||||
"attachments_list.unprocessed": "(não processado)",
|
||||
"audio.hide": "Ocultar áudio",
|
||||
"block_modal.remote_users_caveat": "Vamos pedir ao servidor {domain} para respeitar a sua decisão. No entanto, não é garantido o seu cumprimento, uma vez que alguns servidores podem tratar os bloqueios de forma diferente. As mensagens públicas podem continuar a ser visíveis para utilizadores não autenticados.",
|
||||
|
@ -89,9 +89,11 @@
|
||||
"announcement.announcement": "Объявление",
|
||||
"annual_report.summary.archetype.booster": "Репостер",
|
||||
"annual_report.summary.archetype.lurker": "Молчун",
|
||||
"annual_report.summary.archetype.oracle": "Шаман",
|
||||
"annual_report.summary.archetype.pollster": "Опросчик",
|
||||
"annual_report.summary.archetype.replier": "Душа компании",
|
||||
"annual_report.summary.followers.followers": "подписчиков",
|
||||
"annual_report.summary.followers.total": "{count} за всё время",
|
||||
"annual_report.summary.here_it_is": "Вот ваши итоги {year} года:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "пост с наибольшим количеством звёздочек",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "пост с наибольшим количеством продвижений",
|
||||
@ -99,7 +101,9 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "наиболее часто используемое приложение",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "наиболее часто используемый хэштег",
|
||||
"annual_report.summary.most_used_hashtag.none": "Нет",
|
||||
"annual_report.summary.new_posts.new_posts": "новых постов",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Всё это помещает вас в топ</topLabel><percentage></percentage><bottomLabel>пользователей Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.thanks": "Спасибо за то, что были вместе с Mastodon!",
|
||||
"attachments_list.unprocessed": "(не обработан)",
|
||||
"audio.hide": "Скрыть аудио",
|
||||
|
@ -88,6 +88,8 @@
|
||||
"alt_text_badge.title": "Alternatívny popis",
|
||||
"announcement.announcement": "Oznámenie",
|
||||
"annual_report.summary.followers.followers": "sledovatelia",
|
||||
"annual_report.summary.followers.total": "{count} celkovo",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "najviac obľúbený príspevok",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "najviac vyzdvihovaný príspevok",
|
||||
"annual_report.summary.highlighted_post.by_replies": "príspevok s najviac odpoveďami",
|
||||
"annual_report.summary.most_used_app.most_used_app": "najviac používaná aplikácia",
|
||||
@ -99,6 +101,7 @@
|
||||
"block_modal.show_less": "Zobraziť menej",
|
||||
"block_modal.show_more": "Zobraziť viac",
|
||||
"block_modal.they_cant_mention": "Nemôžu ťa spomenúť, alebo nasledovať.",
|
||||
"block_modal.they_cant_see_posts": "On/a nemôže vidieť tvoje príspevky a ty neuvidíš jej/ho.",
|
||||
"block_modal.they_will_know": "Môžu vidieť, že sú zablokovaní/ý.",
|
||||
"block_modal.title": "Blokovať užívateľa?",
|
||||
"block_modal.you_wont_see_mentions": "Neuvidíš príspevky, ktoré ich spomínajú.",
|
||||
@ -345,6 +348,7 @@
|
||||
"hashtag.follow": "Sledovať hashtag",
|
||||
"hashtag.unfollow": "Prestať sledovať hashtag",
|
||||
"hashtags.and_other": "…a {count, plural, other {# ďalších}}",
|
||||
"hints.threads.see_more": "Pozri viac odpovedí na {domain}",
|
||||
"home.column_settings.show_reblogs": "Zobraziť zdieľania",
|
||||
"home.column_settings.show_replies": "Zobraziť odpovede",
|
||||
"home.hide_announcements": "Skryť oznámenia",
|
||||
@ -371,6 +375,7 @@
|
||||
"interaction_modal.title.follow": "Sledovať {name}",
|
||||
"interaction_modal.title.reblog": "Zdieľať príspevok od {name}",
|
||||
"interaction_modal.title.reply": "Odpovedať na príspevok od {name}",
|
||||
"interaction_modal.title.vote": "Hlasuj v ankete od {name}",
|
||||
"intervals.full.days": "{number, plural, one {# deň} few {# dni} many {# dní} other {# dní}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodín} other {# hodín}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minúta} few {# minúty} many {# minút} other {# minút}}",
|
||||
|
@ -96,6 +96,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "nga {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplikacioni më i përdorur",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag-u më i përdorur",
|
||||
"annual_report.summary.most_used_hashtag.none": "Asnjë",
|
||||
"annual_report.summary.new_posts.new_posts": "postime të reja",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Kjo ju vë në krye</topLabel><percentage></percentage><bottomLabel>të përdoruesve të Mastodon-it.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Nuk do t’ia themi Bernit.",
|
||||
@ -526,6 +527,7 @@
|
||||
"notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer",
|
||||
"notification.favourite.name_and_others_with_link": "{name} dhe <a>{count, plural, one {# tjetër} other {# të tjerë}}</a> i vunë shenjë postimit tuaj si të parapëlqyer",
|
||||
"notification.follow": "{name} zuri t’ju ndjekë",
|
||||
"notification.follow.name_and_others": "Ju ndoqi {name} dhe <a>{count, plural, one {# tjetër} other {# të tjerë}}</a>",
|
||||
"notification.follow_request": "{name} ka kërkuar t’ju ndjekë",
|
||||
"notification.follow_request.name_and_others": "Ka kërkuar t’ju ndjekë {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}",
|
||||
"notification.label.mention": "Përmendje",
|
||||
@ -584,6 +586,7 @@
|
||||
"notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta",
|
||||
"notifications.column_settings.follow": "Ndjekës të rinj:",
|
||||
"notifications.column_settings.follow_request": "Kërkesa të reja për ndjekje:",
|
||||
"notifications.column_settings.group": "Grupoji",
|
||||
"notifications.column_settings.mention": "Përmendje:",
|
||||
"notifications.column_settings.poll": "Përfundime pyetësori:",
|
||||
"notifications.column_settings.push": "Njoftime Push",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}s",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest använda app",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest använda hashtag",
|
||||
"annual_report.summary.most_used_hashtag.none": "Inga",
|
||||
"annual_report.summary.new_posts.new_posts": "nya inlägg",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Det placerar dig i topp</topLabel><percentage></percentage><bottomLabel>av Mastodon-användare.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Vi berättar inte för Bernie.",
|
||||
@ -424,7 +425,7 @@
|
||||
"keyboard_shortcuts.blocked": "Öppna listan över blockerade användare",
|
||||
"keyboard_shortcuts.boost": "Boosta inlägg",
|
||||
"keyboard_shortcuts.column": "Fokusera kolumn",
|
||||
"keyboard_shortcuts.compose": "för att fokusera skrivfältet",
|
||||
"keyboard_shortcuts.compose": "Fokusera skrivfältet",
|
||||
"keyboard_shortcuts.description": "Beskrivning",
|
||||
"keyboard_shortcuts.direct": "för att öppna privata nämningskolumnen",
|
||||
"keyboard_shortcuts.down": "Flytta ner i listan",
|
||||
@ -433,20 +434,20 @@
|
||||
"keyboard_shortcuts.favourites": "Öppna favoritlistan",
|
||||
"keyboard_shortcuts.federated": "Öppna federerad tidslinje",
|
||||
"keyboard_shortcuts.heading": "Tangentbordsgenvägar",
|
||||
"keyboard_shortcuts.home": "för att öppna Hem-tidslinjen",
|
||||
"keyboard_shortcuts.home": "Öppna Hemtidslinjen",
|
||||
"keyboard_shortcuts.hotkey": "Kommando",
|
||||
"keyboard_shortcuts.legend": "för att visa denna översikt",
|
||||
"keyboard_shortcuts.local": "för att öppna Lokal tidslinje",
|
||||
"keyboard_shortcuts.mention": "för att nämna skaparen",
|
||||
"keyboard_shortcuts.legend": "Visa denna översikt",
|
||||
"keyboard_shortcuts.local": "Öppna lokal tidslinje",
|
||||
"keyboard_shortcuts.mention": "Nämna skaparen",
|
||||
"keyboard_shortcuts.muted": "Öppna listan över tystade användare",
|
||||
"keyboard_shortcuts.my_profile": "för att öppna din profil",
|
||||
"keyboard_shortcuts.notifications": "för att öppna Meddelanden",
|
||||
"keyboard_shortcuts.open_media": "öppna media",
|
||||
"keyboard_shortcuts.my_profile": "Öppna din profil",
|
||||
"keyboard_shortcuts.notifications": "Öppna meddelanden",
|
||||
"keyboard_shortcuts.open_media": "Öppna media",
|
||||
"keyboard_shortcuts.pinned": "Öppna listan över fästa inlägg",
|
||||
"keyboard_shortcuts.profile": "för att öppna skaparens profil",
|
||||
"keyboard_shortcuts.profile": "Öppna författarens profil",
|
||||
"keyboard_shortcuts.reply": "Svara på inlägg",
|
||||
"keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
|
||||
"keyboard_shortcuts.search": "för att fokusera sökfältet",
|
||||
"keyboard_shortcuts.requests": "Öppna följförfrågningar",
|
||||
"keyboard_shortcuts.search": "Fokusera sökfältet",
|
||||
"keyboard_shortcuts.spoilers": "Visa/dölja CW-fält",
|
||||
"keyboard_shortcuts.start": "Öppna \"Kom igång\"-kolumnen",
|
||||
"keyboard_shortcuts.toggle_hidden": "Visa/gömma text bakom CW",
|
||||
|
@ -87,6 +87,13 @@
|
||||
"alert.unexpected.title": "อุปส์!",
|
||||
"alt_text_badge.title": "ข้อความแสดงแทน",
|
||||
"announcement.announcement": "ประกาศ",
|
||||
"annual_report.summary.followers.followers": "ผู้ติดตาม",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "โพสต์ที่ได้รับการชื่นชอบมากที่สุด",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "โพสต์ที่ได้รับการดันมากที่สุด",
|
||||
"annual_report.summary.highlighted_post.by_replies": "โพสต์ที่มีการตอบกลับมากที่สุด",
|
||||
"annual_report.summary.new_posts.new_posts": "โพสต์ใหม่",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "เราจะไม่บอก Bernie",
|
||||
"annual_report.summary.thanks": "ขอบคุณสำหรับการเป็นส่วนหนึ่งของ Mastodon!",
|
||||
"attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)",
|
||||
"audio.hide": "ซ่อนเสียง",
|
||||
"block_modal.remote_users_caveat": "เราจะขอให้เซิร์ฟเวอร์ {domain} เคารพการตัดสินใจของคุณ อย่างไรก็ตาม ไม่รับประกันการปฏิบัติตามข้อกำหนดเนื่องจากเซิร์ฟเวอร์บางแห่งอาจจัดการการปิดกั้นแตกต่างกัน โพสต์สาธารณะอาจยังคงปรากฏแก่ผู้ใช้ที่ไม่ได้เข้าสู่ระบบ",
|
||||
@ -508,6 +515,7 @@
|
||||
"notification.admin.report_statuses_other": "{name} ได้รายงาน {target}",
|
||||
"notification.admin.sign_up": "{name} ได้ลงทะเบียน",
|
||||
"notification.admin.sign_up.name_and_others": "{name} และ {count, plural, other {# อื่น ๆ}} ได้ลงทะเบียน",
|
||||
"notification.annual_report.view": "ดู #Wrapstodon",
|
||||
"notification.favourite": "{name} ได้ชื่นชอบโพสต์ของคุณ",
|
||||
"notification.favourite.name_and_others_with_link": "{name} และ <a>{count, plural, other {# อื่น ๆ}}</a> ได้ชื่นชอบโพสต์ของคุณ",
|
||||
"notification.follow": "{name} ได้ติดตามคุณ",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "en çok kullanılan uygulama",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "en çok kullanılan etiket",
|
||||
"annual_report.summary.most_used_hashtag.none": "Yok",
|
||||
"annual_report.summary.new_posts.new_posts": "yeni gönderiler",
|
||||
"annual_report.summary.percentile.text": "<bottomLabel>Mastodon kullanıcılarının</bottomLabel><percentage></percentage><topLabel>üst dilimindesiniz</topLabel>.",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Bernie'ye söylemeyiz.",
|
||||
|
@ -87,7 +87,25 @@
|
||||
"alert.unexpected.title": "Ой!",
|
||||
"alt_text_badge.title": "Альтернативний текст",
|
||||
"announcement.announcement": "Оголошення",
|
||||
"annual_report.summary.archetype.booster": "Мисливець на дописи",
|
||||
"annual_report.summary.archetype.lurker": "Причаєнець",
|
||||
"annual_report.summary.archetype.oracle": "Оракул",
|
||||
"annual_report.summary.archetype.pollster": "Опитувач",
|
||||
"annual_report.summary.archetype.replier": "Душа компанії",
|
||||
"annual_report.summary.followers.followers": "підписники",
|
||||
"annual_report.summary.followers.total": "Загалом {count}",
|
||||
"annual_report.summary.here_it_is": "Ось ваші підсумки {year} року:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "найуподобаніші дописи",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "найпоширюваніші дописи",
|
||||
"annual_report.summary.highlighted_post.by_replies": "найкоментованіші дописи",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "найчастіше використовуваний застосунок",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "найчастіший хештег",
|
||||
"annual_report.summary.most_used_hashtag.none": "Немає",
|
||||
"annual_report.summary.new_posts.new_posts": "нові дописи",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Це виводить вас в топ</topLabel><percentage></percentage><bottomLabel> користувачів Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ми не скажемо Bernie.",
|
||||
"annual_report.summary.thanks": "Дякуємо, що ви є частиною Mastodon!",
|
||||
"attachments_list.unprocessed": "(не оброблено)",
|
||||
"audio.hide": "Сховати аудіо",
|
||||
"block_modal.remote_users_caveat": "Ми попросимо сервер {domain} поважати ваше рішення. Однак дотримання вимог не гарантується, оскільки деякі сервери можуть обробляти блоки по-різному. Загальнодоступні дописи все ще можуть бути видимими для користувачів, які не увійшли в систему.",
|
||||
@ -509,6 +527,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} повідомляє про {target}",
|
||||
"notification.admin.sign_up": "{name} приєдналися",
|
||||
"notification.admin.sign_up.name_and_others": "{name} та {count, plural, one {# інший} few {# інших} many {# інших} other {# інший}} зареєструвалися",
|
||||
"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 {# інших} many {# інших} other {# інший}}</a> вподобали ваш допис",
|
||||
"notification.follow": "{name} підписалися на вас",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "app dùng nhiều nhất",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "hashtag dùng nhiều nhất",
|
||||
"annual_report.summary.most_used_hashtag.none": "Không có",
|
||||
"annual_report.summary.new_posts.new_posts": "tút mới",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Bạn nằm trong top</topLabel><percentage></percentage><bottomLabel>thành viên Mastodon.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Chúng tôi sẽ không kể cho Bernie.",
|
||||
|
@ -101,6 +101,7 @@
|
||||
"annual_report.summary.highlighted_post.possessive": "{name} 的",
|
||||
"annual_report.summary.most_used_app.most_used_app": "最常用的应用",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常用的话题",
|
||||
"annual_report.summary.most_used_hashtag.none": "无",
|
||||
"annual_report.summary.new_posts.new_posts": "新发嘟",
|
||||
"annual_report.summary.percentile.text": "<topLabel>这使你跻身 Mastodon 用户的前</topLabel><percentage></percentage><bottomLabel></bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "我们打死也不会告诉Bernie。",
|
||||
|
@ -87,23 +87,25 @@
|
||||
"alert.unexpected.title": "哎呀!",
|
||||
"alt_text_badge.title": "ALT 說明文字",
|
||||
"announcement.announcement": "公告",
|
||||
"annual_report.summary.archetype.booster": "酷炫的獵人",
|
||||
"annual_report.summary.archetype.lurker": "潛伏者",
|
||||
"annual_report.summary.archetype.booster": "酷炫獵人",
|
||||
"annual_report.summary.archetype.lurker": "潛水高手",
|
||||
"annual_report.summary.archetype.oracle": "先知",
|
||||
"annual_report.summary.archetype.pollster": "民調人員",
|
||||
"annual_report.summary.archetype.pollster": "民調專家",
|
||||
"annual_report.summary.archetype.replier": "社交菁英",
|
||||
"annual_report.summary.followers.followers": "跟隨者",
|
||||
"annual_report.summary.followers.total": "總共 {count}",
|
||||
"annual_report.summary.here_it_is": "以下是您的{year}年度回顧:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "最愛的嘟文",
|
||||
"annual_report.summary.here_it_is": "以下是您的 {year} 年度回顧:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "最多被加到最愛的嘟文",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "最多轉嘟的嘟文",
|
||||
"annual_report.summary.highlighted_post.by_replies": "最多回覆的嘟文",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name} 的",
|
||||
"annual_report.summary.most_used_app.most_used_app": "最常使用的應用程式",
|
||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "最常使用的主題標籤",
|
||||
"annual_report.summary.most_used_hashtag.none": "無最常用之主題標籤",
|
||||
"annual_report.summary.new_posts.new_posts": "新嘟文",
|
||||
"annual_report.summary.percentile.text": "<topLabel>這讓您成為前</topLabel><percentage></percentage><bottomLabel>Mastodon 的使用者。</bottomLabel>",
|
||||
"annual_report.summary.thanks": "感謝您成為 Mastodon 的一員!",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "我們不會告訴 Bernie。",
|
||||
"annual_report.summary.thanks": "感謝您成為 Mastodon 的一份子!",
|
||||
"attachments_list.unprocessed": "(未經處理)",
|
||||
"audio.hide": "隱藏音訊",
|
||||
"block_modal.remote_users_caveat": "我們會要求 {domain} 伺服器尊重您的決定。然而,我們無法保證所有伺服器皆會遵守,某些伺服器可能以不同方式處理封鎖。未登入之使用者仍可能看見您的公開嘟文。",
|
||||
@ -525,6 +527,8 @@
|
||||
"notification.admin.report_statuses_other": "{name} 已檢舉 {target}",
|
||||
"notification.admin.sign_up": "{name} 已經註冊",
|
||||
"notification.admin.sign_up.name_and_others": "{name} 與{count, plural, other {其他 # 個人}}已註冊",
|
||||
"notification.annual_report.message": "您的 {year} #Wrapstodon 正等著您!揭開您 Mastodon 上的年度精彩時刻與值得回憶的難忘時光!",
|
||||
"notification.annual_report.view": "檢視 #Wrapstodon",
|
||||
"notification.favourite": "{name} 已將您的嘟文加入最愛",
|
||||
"notification.favourite.name_and_others_with_link": "{name} 與<a>{count, plural, other {其他 # 個人}}</a>已將您的嘟文加入最愛",
|
||||
"notification.follow": "{name} 已跟隨您",
|
||||
|
@ -535,3 +535,10 @@ a.sparkline {
|
||||
::-webkit-scrollbar-thumb {
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.notification-group--annual-report {
|
||||
.notification-group__icon,
|
||||
.notification-group__main .link-button {
|
||||
color: var(--indigo-3);
|
||||
}
|
||||
}
|
||||
|
@ -1938,3 +1938,31 @@ a.sparkline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status__card {
|
||||
padding: 15px;
|
||||
border-radius: 4px;
|
||||
background: $ui-base-color;
|
||||
font-size: 15px;
|
||||
line-height: 20px;
|
||||
word-wrap: break-word;
|
||||
font-weight: 400;
|
||||
border: 1px solid lighten($ui-base-color, 4%);
|
||||
color: $primary-text-color;
|
||||
box-sizing: border-box;
|
||||
min-height: 100%;
|
||||
|
||||
.status__prepend {
|
||||
padding: 0 0 15px;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.status__content {
|
||||
padding-top: 0;
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -103,6 +103,11 @@
|
||||
background-color: var(--goldenrod-2);
|
||||
}
|
||||
}
|
||||
|
||||
.status-card,
|
||||
.hashtag-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__followers {
|
||||
@ -237,7 +242,7 @@
|
||||
}
|
||||
|
||||
&__number {
|
||||
font-size: 61px;
|
||||
font-size: 54px;
|
||||
font-weight: 600;
|
||||
line-height: 73px;
|
||||
color: var(--goldenrod-2);
|
||||
@ -306,7 +311,7 @@
|
||||
}
|
||||
|
||||
.annual-report-modal {
|
||||
max-width: 480px;
|
||||
max-width: 600px;
|
||||
background: var(--indigo-1);
|
||||
border-radius: 16px;
|
||||
display: flex;
|
||||
|
@ -339,16 +339,12 @@ a.table-action-link {
|
||||
}
|
||||
}
|
||||
|
||||
.status__content {
|
||||
padding-top: 0;
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 700;
|
||||
}
|
||||
// Reset the status card to not have borders, background or padding when
|
||||
// inline in the table of statuses
|
||||
.status__card {
|
||||
border: none;
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.nothing-here {
|
||||
|
@ -1,6 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AccountReachFinder
|
||||
RECENT_LIMIT = 2_000
|
||||
STATUS_LIMIT = 200
|
||||
STATUS_SINCE = 2.days
|
||||
|
||||
def initialize(account)
|
||||
@account = account
|
||||
end
|
||||
@ -20,13 +24,27 @@ class AccountReachFinder
|
||||
end
|
||||
|
||||
def recently_mentioned_inboxes
|
||||
cutoff_id = Mastodon::Snowflake.id_at(2.days.ago, with_random: false)
|
||||
recent_statuses = @account.statuses.recent.where(id: cutoff_id...).limit(200)
|
||||
|
||||
Account.joins(:mentions).where(mentions: { status: recent_statuses }).inboxes.take(2000)
|
||||
Account
|
||||
.joins(:mentions)
|
||||
.where(mentions: { status: recent_statuses })
|
||||
.inboxes
|
||||
.take(RECENT_LIMIT)
|
||||
end
|
||||
|
||||
def relay_inboxes
|
||||
Relay.enabled.pluck(:inbox_url)
|
||||
end
|
||||
|
||||
def oldest_status_id
|
||||
Mastodon::Snowflake
|
||||
.id_at(STATUS_SINCE.ago, with_random: false)
|
||||
end
|
||||
|
||||
def recent_statuses
|
||||
@account
|
||||
.statuses
|
||||
.recent
|
||||
.where(id: oldest_status_id...)
|
||||
.limit(STATUS_LIMIT)
|
||||
end
|
||||
end
|
||||
|
22
app/lib/domain_resource.rb
Normal file
22
app/lib/domain_resource.rb
Normal file
@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class DomainResource
|
||||
attr_reader :domain
|
||||
|
||||
RESOLVE_TIMEOUT = 5
|
||||
|
||||
def initialize(domain)
|
||||
@domain = domain
|
||||
end
|
||||
|
||||
def mx
|
||||
Resolv::DNS.open do |dns|
|
||||
dns.timeouts = RESOLVE_TIMEOUT
|
||||
dns
|
||||
.getresources(domain, Resolv::DNS::Resource::IN::MX)
|
||||
.to_a
|
||||
.map { |mx| mx.exchange.to_s }
|
||||
.compact_blank
|
||||
end
|
||||
end
|
||||
end
|
@ -334,14 +334,10 @@ class Request
|
||||
def check_private_address(address, host)
|
||||
addr = IPAddr.new(address.to_s)
|
||||
|
||||
return if Rails.env.development? || private_address_exceptions.any? { |range| range.include?(addr) }
|
||||
return if Rails.env.development? || Rails.configuration.x.private_address_exceptions.any? { |range| range.include?(addr) }
|
||||
|
||||
raise Mastodon::PrivateNetworkAddressError, host if PrivateAddressCheck.private_address?(addr)
|
||||
end
|
||||
|
||||
def private_address_exceptions
|
||||
@private_address_exceptions = (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(/(?:\s*,\s*|\s+)/).map { |addr| IPAddr.new(addr) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -9,10 +9,16 @@ class Vacuum::ImportsVacuum
|
||||
private
|
||||
|
||||
def clean_unconfirmed_imports!
|
||||
BulkImport.state_unconfirmed.where(created_at: ..10.minutes.ago).in_batches.delete_all
|
||||
BulkImport
|
||||
.confirmation_missed
|
||||
.in_batches
|
||||
.delete_all
|
||||
end
|
||||
|
||||
def clean_old_imports!
|
||||
BulkImport.where(created_at: ..1.week.ago).in_batches.delete_all
|
||||
BulkImport
|
||||
.archival_completed
|
||||
.in_batches
|
||||
.delete_all
|
||||
end
|
||||
end
|
||||
|
@ -90,6 +90,8 @@ class Account < ApplicationRecord
|
||||
include Account::Interactions
|
||||
include Account::Merging
|
||||
include Account::Search
|
||||
include Account::Sensitizes
|
||||
include Account::Silences
|
||||
include Account::StatusesSearch
|
||||
include Account::Suspensions
|
||||
include Account::AttributionDomains
|
||||
@ -129,9 +131,6 @@ class Account < ApplicationRecord
|
||||
scope :remote, -> { where.not(domain: nil) }
|
||||
scope :local, -> { where(domain: nil) }
|
||||
scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) }
|
||||
scope :silenced, -> { where.not(silenced_at: nil) }
|
||||
scope :sensitized, -> { where.not(sensitized_at: nil) }
|
||||
scope :without_silenced, -> { where(silenced_at: nil) }
|
||||
scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) }
|
||||
scope :recent, -> { reorder(id: :desc) }
|
||||
scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) }
|
||||
@ -244,30 +243,6 @@ class Account < ApplicationRecord
|
||||
ResolveAccountService.new.call(acct) unless local?
|
||||
end
|
||||
|
||||
def silenced?
|
||||
silenced_at.present?
|
||||
end
|
||||
|
||||
def silence!(date = Time.now.utc)
|
||||
update!(silenced_at: date)
|
||||
end
|
||||
|
||||
def unsilence!
|
||||
update!(silenced_at: nil)
|
||||
end
|
||||
|
||||
def sensitized?
|
||||
sensitized_at.present?
|
||||
end
|
||||
|
||||
def sensitize!(date = Time.now.utc)
|
||||
update!(sensitized_at: date)
|
||||
end
|
||||
|
||||
def unsensitize!
|
||||
update!(sensitized_at: nil)
|
||||
end
|
||||
|
||||
def memorialize!
|
||||
update!(memorial: true)
|
||||
end
|
||||
|
@ -31,6 +31,7 @@ class Admin::ActionLogFilter
|
||||
create_domain_block: { target_type: 'DomainBlock', action: 'create' }.freeze,
|
||||
create_email_domain_block: { target_type: 'EmailDomainBlock', action: 'create' }.freeze,
|
||||
create_ip_block: { target_type: 'IpBlock', action: 'create' }.freeze,
|
||||
create_relay: { target_type: 'Relay', action: 'create' }.freeze,
|
||||
create_unavailable_domain: { target_type: 'UnavailableDomain', action: 'create' }.freeze,
|
||||
create_user_role: { target_type: 'UserRole', action: 'create' }.freeze,
|
||||
create_canonical_email_block: { target_type: 'CanonicalEmailBlock', action: 'create' }.freeze,
|
||||
@ -40,6 +41,7 @@ class Admin::ActionLogFilter
|
||||
destroy_domain_allow: { target_type: 'DomainAllow', action: 'destroy' }.freeze,
|
||||
destroy_domain_block: { target_type: 'DomainBlock', action: 'destroy' }.freeze,
|
||||
destroy_ip_block: { target_type: 'IpBlock', action: 'destroy' }.freeze,
|
||||
destroy_relay: { target_type: 'Relay', action: 'destroy' }.freeze,
|
||||
destroy_email_domain_block: { target_type: 'EmailDomainBlock', action: 'destroy' }.freeze,
|
||||
destroy_instance: { target_type: 'Instance', action: 'destroy' }.freeze,
|
||||
destroy_unavailable_domain: { target_type: 'UnavailableDomain', action: 'destroy' }.freeze,
|
||||
@ -49,8 +51,10 @@ class Admin::ActionLogFilter
|
||||
disable_2fa_user: { target_type: 'User', action: 'disable_2fa' }.freeze,
|
||||
disable_custom_emoji: { target_type: 'CustomEmoji', action: 'disable' }.freeze,
|
||||
disable_user: { target_type: 'User', action: 'disable' }.freeze,
|
||||
disable_relay: { target_type: 'Relay', action: 'disable' }.freeze,
|
||||
enable_custom_emoji: { target_type: 'CustomEmoji', action: 'enable' }.freeze,
|
||||
enable_user: { target_type: 'User', action: 'enable' }.freeze,
|
||||
enable_relay: { target_type: 'Relay', action: 'enable' }.freeze,
|
||||
memorialize_account: { target_type: 'Account', action: 'memorialize' }.freeze,
|
||||
promote_user: { target_type: 'User', action: 'promote' }.freeze,
|
||||
remove_avatar_user: { target_type: 'User', action: 'remove_avatar' }.freeze,
|
||||
|
@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ApplicationRecord < ActiveRecord::Base
|
||||
self.abstract_class = true
|
||||
primary_abstract_class
|
||||
|
||||
include Remotable
|
||||
|
||||
|
@ -21,6 +21,9 @@
|
||||
class BulkImport < ApplicationRecord
|
||||
self.inheritance_column = false
|
||||
|
||||
ARCHIVE_PERIOD = 1.week
|
||||
CONFIRM_PERIOD = 10.minutes
|
||||
|
||||
belongs_to :account
|
||||
has_many :rows, class_name: 'BulkImportRow', inverse_of: :bulk_import, dependent: :delete_all
|
||||
|
||||
@ -42,6 +45,9 @@ class BulkImport < ApplicationRecord
|
||||
|
||||
validates :type, presence: true
|
||||
|
||||
scope :archival_completed, -> { where(created_at: ..ARCHIVE_PERIOD.ago) }
|
||||
scope :confirmation_missed, -> { state_unconfirmed.where(created_at: ..CONFIRM_PERIOD.ago) }
|
||||
|
||||
def self.progress!(bulk_import_id, imported: false)
|
||||
# Use `increment_counter` so that the incrementation is done atomically in the database
|
||||
BulkImport.increment_counter(:processed_items, bulk_import_id)
|
||||
|
21
app/models/concerns/account/sensitizes.rb
Normal file
21
app/models/concerns/account/sensitizes.rb
Normal file
@ -0,0 +1,21 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Account::Sensitizes
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :sensitized, -> { where.not(sensitized_at: nil) }
|
||||
end
|
||||
|
||||
def sensitized?
|
||||
sensitized_at.present?
|
||||
end
|
||||
|
||||
def sensitize!(date = Time.now.utc)
|
||||
update!(sensitized_at: date)
|
||||
end
|
||||
|
||||
def unsensitize!
|
||||
update!(sensitized_at: nil)
|
||||
end
|
||||
end
|
22
app/models/concerns/account/silences.rb
Normal file
22
app/models/concerns/account/silences.rb
Normal file
@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Account::Silences
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :silenced, -> { where.not(silenced_at: nil) }
|
||||
scope :without_silenced, -> { where(silenced_at: nil) }
|
||||
end
|
||||
|
||||
def silenced?
|
||||
silenced_at.present?
|
||||
end
|
||||
|
||||
def silence!(date = Time.now.utc)
|
||||
update!(silenced_at: date)
|
||||
end
|
||||
|
||||
def unsilence!
|
||||
update!(silenced_at: nil)
|
||||
end
|
||||
end
|
@ -34,7 +34,7 @@ class List < ApplicationRecord
|
||||
private
|
||||
|
||||
def validate_account_lists_limit
|
||||
errors.add(:base, I18n.t('lists.errors.limit')) if account.lists.count >= PER_ACCOUNT_LIMIT
|
||||
errors.add(:base, I18n.t('lists.errors.limit')) if account.owned_lists.count >= PER_ACCOUNT_LIMIT
|
||||
end
|
||||
|
||||
def clean_feed_manager
|
||||
|
@ -25,6 +25,10 @@ class Relay < ApplicationRecord
|
||||
|
||||
alias enabled? accepted?
|
||||
|
||||
def to_log_human_identifier
|
||||
inbox_url
|
||||
end
|
||||
|
||||
def enable!
|
||||
activity_id = ActivityPub::TagManager.instance.generate_uri_for(nil)
|
||||
payload = Oj.dump(follow_activity(activity_id))
|
||||
|
@ -22,19 +22,33 @@ class SoftwareUpdate < ApplicationRecord
|
||||
Gem::Version.new(version)
|
||||
end
|
||||
|
||||
def outdated?
|
||||
runtime_version >= gem_version
|
||||
end
|
||||
|
||||
def pending?
|
||||
gem_version > runtime_version
|
||||
end
|
||||
|
||||
class << self
|
||||
def check_enabled?
|
||||
ENV['UPDATE_CHECK_URL'] != ''
|
||||
Rails.configuration.x.mastodon.software_update_url.present?
|
||||
end
|
||||
|
||||
def pending_to_a
|
||||
return [] unless check_enabled?
|
||||
|
||||
all.to_a.filter { |update| update.gem_version > Mastodon::Version.gem_version }
|
||||
all.to_a.filter(&:pending?)
|
||||
end
|
||||
|
||||
def urgent_pending?
|
||||
pending_to_a.any?(&:urgent?)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def runtime_version
|
||||
Mastodon::Version.gem_version
|
||||
end
|
||||
end
|
||||
|
@ -280,6 +280,15 @@ class User < ApplicationRecord
|
||||
save!
|
||||
end
|
||||
|
||||
def applications_last_used
|
||||
Doorkeeper::AccessToken
|
||||
.where(resource_owner_id: id)
|
||||
.where.not(last_used_at: nil)
|
||||
.group(:application_id)
|
||||
.maximum(:last_used_at)
|
||||
.to_h
|
||||
end
|
||||
|
||||
def token_for_app(app)
|
||||
return nil if app.nil? || app.owner != self
|
||||
|
||||
@ -457,13 +466,7 @@ class User < ApplicationRecord
|
||||
|
||||
# Doing this conditionally is not very satisfying, but this is consistent
|
||||
# with the MX records validations we do and keeps the specs tractable.
|
||||
unless self.class.skip_mx_check?
|
||||
Resolv::DNS.open do |dns|
|
||||
dns.timeouts = 5
|
||||
|
||||
records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }.compact_blank
|
||||
end
|
||||
end
|
||||
records = DomainResource.new(domain).mx unless self.class.skip_mx_check?
|
||||
|
||||
EmailDomainBlock.requires_approval?(records + [domain], attempt_ip: sign_up_ip)
|
||||
end
|
||||
|
@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class REST::CredentialApplicationSerializer < REST::ApplicationSerializer
|
||||
attributes :client_id, :client_secret
|
||||
attributes :client_id, :client_secret, :client_secret_expires_at
|
||||
|
||||
def client_id
|
||||
object.uid
|
||||
@ -10,4 +10,10 @@ class REST::CredentialApplicationSerializer < REST::ApplicationSerializer
|
||||
def client_secret
|
||||
object.secret
|
||||
end
|
||||
|
||||
# Added for future forwards compatibility when we may decide to expire OAuth
|
||||
# Applications. Set to zero means that the client_secret never expires.
|
||||
def client_secret_expires_at
|
||||
0
|
||||
end
|
||||
end
|
||||
|
@ -12,7 +12,7 @@ class SoftwareUpdateCheckService < BaseService
|
||||
|
||||
def clean_outdated_updates!
|
||||
SoftwareUpdate.find_each do |software_update|
|
||||
software_update.delete if Mastodon::Version.gem_version >= software_update.gem_version
|
||||
software_update.delete if software_update.outdated?
|
||||
rescue ArgumentError
|
||||
software_update.delete
|
||||
end
|
||||
@ -27,7 +27,7 @@ class SoftwareUpdateCheckService < BaseService
|
||||
end
|
||||
|
||||
def api_url
|
||||
ENV.fetch('UPDATE_CHECK_URL', 'https://api.joinmastodon.org/update-check')
|
||||
Rails.configuration.x.mastodon.software_update_url
|
||||
end
|
||||
|
||||
def version
|
||||
|
@ -1,5 +1,4 @@
|
||||
- content_for :page_title do
|
||||
= t('about.title')
|
||||
- content_for :page_title, t('about.title')
|
||||
|
||||
- content_for :header_tags do
|
||||
= render partial: 'shared/og'
|
||||
|
@ -1,5 +1,4 @@
|
||||
- content_for :page_title do
|
||||
#{display_name(@account)} (#{acct(@account)})
|
||||
- content_for :page_title, "#{display_name(@account)} (#{acct(@account)})"
|
||||
|
||||
- content_for :header_tags do
|
||||
- if @account.user_prefers_noindex?
|
||||
|
@ -16,7 +16,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: @time_period.last,
|
||||
href: admin_accounts_path(origin: 'local'),
|
||||
href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'local') : nil,
|
||||
label: t('admin.dashboard.new_users'),
|
||||
measure: 'new_users',
|
||||
start_at: @time_period.first
|
||||
@ -24,7 +24,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: @time_period.last,
|
||||
href: admin_accounts_path(origin: 'local'),
|
||||
href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'local') : nil,
|
||||
label: t('admin.dashboard.active_users'),
|
||||
measure: 'active_users',
|
||||
start_at: @time_period.first
|
||||
@ -39,7 +39,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: @time_period.last,
|
||||
href: admin_reports_path,
|
||||
href: current_user.can?(:manage_reports) ? admin_reports_path : nil,
|
||||
label: t('admin.dashboard.opened_reports'),
|
||||
measure: 'opened_reports',
|
||||
start_at: @time_period.first
|
||||
@ -47,7 +47,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: @time_period.last,
|
||||
href: admin_reports_path(resolved: '1'),
|
||||
href: current_user.can?(:manage_reports) ? admin_reports_path(resolved: '1') : nil,
|
||||
label: t('admin.dashboard.resolved_reports'),
|
||||
measure: 'resolved_reports',
|
||||
start_at: @time_period.first
|
||||
|
@ -30,12 +30,12 @@
|
||||
%label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
|
||||
= f.input_field :other_domains,
|
||||
as: :boolean,
|
||||
checked_value: record.exchange.to_s,
|
||||
checked_value: record,
|
||||
include_hidden: false,
|
||||
multiple: true
|
||||
.batch-table__row__content.pending-account
|
||||
.pending-account__header
|
||||
%samp= record.exchange.to_s
|
||||
%samp= record
|
||||
%br
|
||||
= t('admin.email_domain_blocks.dns.types.mx')
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: period_end_at,
|
||||
href: admin_accounts_path(origin: 'remote', by_domain: instance_domain),
|
||||
href: current_user.can?(:manage_users) ? admin_accounts_path(origin: 'remote', by_domain: instance_domain) : nil,
|
||||
label: t('admin.instances.dashboard.instance_accounts_measure'),
|
||||
measure: 'instance_accounts',
|
||||
params: { domain: instance_domain },
|
||||
@ -43,7 +43,7 @@
|
||||
.dashboard__item
|
||||
= react_admin_component :counter,
|
||||
end_at: period_end_at,
|
||||
href: admin_reports_path(by_target_domain: instance_domain),
|
||||
href: current_user.can?(:manage_reports) ? admin_reports_path(by_target_domain: instance_domain) : nil,
|
||||
label: t('admin.instances.dashboard.instance_reports_measure'),
|
||||
measure: 'instance_reports',
|
||||
params: { domain: instance_domain },
|
||||
|
@ -2,6 +2,15 @@
|
||||
%label.batch-table__row__select.batch-checkbox
|
||||
= f.check_box :status_ids, { multiple: true, include_hidden: false }, status.id
|
||||
.batch-table__row__content
|
||||
.status__card
|
||||
- if status.reblog?
|
||||
.status__prepend
|
||||
= material_symbol('repeat')
|
||||
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account, path: admin_account_status_path(status.proper.account.id, status.proper.id)))
|
||||
- elsif status.reply? && status.in_reply_to_id.present?
|
||||
.status__prepend
|
||||
= material_symbol('reply')
|
||||
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: admin_account_status_path(status.thread.account_id, status.in_reply_to_id)))
|
||||
.status__content><
|
||||
- if status.proper.spoiler_text.blank?
|
||||
= prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis)
|
||||
@ -18,7 +27,8 @@
|
||||
- if status.application
|
||||
= status.application.name
|
||||
·
|
||||
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener noreferrer' do
|
||||
|
||||
= link_to admin_account_status_path(status.account.id, status), class: 'detailed-status__datetime' do
|
||||
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
|
||||
- if status.edited?
|
||||
·
|
||||
@ -29,12 +39,14 @@
|
||||
·
|
||||
%span.negative-hint= t('admin.statuses.deleted')
|
||||
·
|
||||
- if status.reblog?
|
||||
= material_symbol('repeat_active')
|
||||
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account))
|
||||
- else
|
||||
|
||||
= material_symbol visibility_icon(status)
|
||||
= t("statuses.visibilities.#{status.visibility}")
|
||||
·
|
||||
|
||||
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', target: stream_link_target, rel: 'noopener noreferrer' do
|
||||
= t('admin.statuses.view_publicly')
|
||||
|
||||
- if status.proper.sensitive?
|
||||
·
|
||||
= material_symbol('visibility_off')
|
||||
|
@ -1,7 +1,5 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.statuses.title')
|
||||
\-
|
||||
@#{@account.pretty_acct}
|
||||
= t('admin.statuses.title', name: @account.pretty_acct)
|
||||
|
||||
.filters
|
||||
.filter-subset
|
||||
@ -33,6 +31,13 @@
|
||||
= check_box_tag :batch_checkbox_all, nil, false
|
||||
.batch-table__toolbar__actions
|
||||
- unless @statuses.empty?
|
||||
- if params[:report_id]
|
||||
= f.button safe_join([material_symbol('add'), t('admin.statuses.batch.add_to_report', id: params[:report_id])]),
|
||||
class: 'table-action-link',
|
||||
data: { confirm: t('admin.reports.are_you_sure') },
|
||||
name: :report,
|
||||
type: :submit
|
||||
- else
|
||||
= f.button safe_join([material_symbol('flag'), t('admin.statuses.batch.report')]),
|
||||
class: 'table-action-link',
|
||||
data: { confirm: t('admin.reports.are_you_sure') },
|
||||
|
@ -1,7 +1,14 @@
|
||||
- content_for :page_title do
|
||||
= t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false))
|
||||
= t('admin.statuses.status_title', name: @account.pretty_acct)
|
||||
|
||||
- content_for :heading_actions do
|
||||
= form_with model: @status_batch_action, url: batch_admin_account_statuses_path(@account.id) do |f|
|
||||
= f.hidden_field :status_ids, { multiple: true, value: @status.id }
|
||||
= f.button safe_join([material_symbol('flag'), t('admin.statuses.batch.report')]),
|
||||
class: 'button',
|
||||
data: { confirm: t('admin.reports.are_you_sure') },
|
||||
name: :report,
|
||||
type: :submit
|
||||
= link_to t('admin.statuses.open'), ActivityPub::TagManager.instance.url_for(@status), class: 'button', target: '_blank', rel: 'noopener noreferrer'
|
||||
|
||||
%h3= t('admin.statuses.metadata')
|
||||
@ -44,7 +51,56 @@
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
%h3= t('admin.statuses.history')
|
||||
%h3= t('admin.statuses.contents')
|
||||
|
||||
%ol.history
|
||||
.status__card
|
||||
- if @status.reblog?
|
||||
.status__prepend
|
||||
= material_symbol('repeat')
|
||||
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(@status.proper.account, path: admin_account_status_path(@status.proper.account.id, @status.proper.id)))
|
||||
- elsif @status.reply? && @status.in_reply_to_id.present?
|
||||
.status__prepend
|
||||
= material_symbol('reply')
|
||||
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(@status.in_reply_to_account, path: admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id)))
|
||||
.status__content><
|
||||
- if @status.proper.spoiler_text.blank?
|
||||
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
|
||||
- else
|
||||
%details<
|
||||
%summary><
|
||||
%strong> Content warning: #{prerender_custom_emojis(h(@status.proper.spoiler_text), @status.proper.emojis)}
|
||||
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
|
||||
|
||||
- unless @status.proper.ordered_media_attachments.empty?
|
||||
= render partial: 'admin/reports/media_attachments', locals: { status: @status.proper }
|
||||
|
||||
.detailed-status__meta
|
||||
- if @status.application
|
||||
= @status.application.name
|
||||
·
|
||||
%span.detailed-status__datetime
|
||||
%time.formatted{ datetime: @status.created_at.iso8601, title: l(@status.created_at) }= l(@status.created_at)
|
||||
- if @status.edited?
|
||||
·
|
||||
%span.detailed-status__datetime
|
||||
= t('statuses.edited_at_html', date: content_tag(:time, l(@status.edited_at), datetime: @status.edited_at.iso8601, title: l(@status.edited_at), class: 'formatted'))
|
||||
- if @status.discarded?
|
||||
·
|
||||
%span.negative-hint= t('admin.statuses.deleted')
|
||||
- unless @status.reblog?
|
||||
·
|
||||
= material_symbol(visibility_icon(@status))
|
||||
= t("statuses.visibilities.#{@status.visibility}")
|
||||
- if @status.proper.sensitive?
|
||||
·
|
||||
= material_symbol('visibility_off')
|
||||
= t('stream_entries.sensitive_content')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
%h3= t('admin.statuses.history')
|
||||
- if @status.edits.empty?
|
||||
%p= t('admin.statuses.no_history')
|
||||
- else
|
||||
%ol.history
|
||||
= render partial: 'admin/status_edits/status_edit', collection: batched_ordered_status_edits
|
||||
|
@ -1,5 +1,4 @@
|
||||
- content_for :page_title do
|
||||
= t('privacy_policy.title')
|
||||
- content_for :page_title, t('privacy_policy.title')
|
||||
|
||||
- content_for :header_tags do
|
||||
= render partial: 'shared/og'
|
||||
|
@ -65,7 +65,7 @@
|
||||
%p.lead= t('author_attribution.then_instructions')
|
||||
|
||||
.fields-group
|
||||
= f.input :attribution_domains_as_text, as: :text, wrapper: :with_block_label, input_html: { placeholder: "example1.com\nexample2.com\nexample3.com", rows: 4 }
|
||||
= f.input :attribution_domains_as_text, as: :text, wrapper: :with_block_label, input_html: { placeholder: "example1.com\nexample2.com\nexample3.com", rows: 4, autocapitalize: 'none', autocorrect: 'off' }
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit
|
||||
|
@ -1,3 +1,4 @@
|
||||
- content_for :body_classes, 'app-body'
|
||||
- content_for :header_tags do
|
||||
- if user_signed_in?
|
||||
= preload_signed_in_js_packs
|
||||
|
@ -1,5 +1,4 @@
|
||||
- content_for :page_title do
|
||||
= t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false))
|
||||
- content_for :page_title, t('statuses.title', name: display_name(@account), quote: truncate(@status.spoiler_text.presence || @status.text, length: 50, omission: '…', escape: false))
|
||||
|
||||
- content_for :header_tags do
|
||||
- if @account.user_prefers_noindex?
|
||||
|
@ -13,6 +13,8 @@ class Web::PushNotificationWorker
|
||||
@subscription = Web::PushSubscription.find(subscription_id)
|
||||
@notification = Notification.find(notification_id)
|
||||
|
||||
return if @notification.updated_at < TTL.ago
|
||||
|
||||
# Polymorphically associated activity could have been deleted
|
||||
# in the meantime, so we have to double-check before proceeding
|
||||
return unless @notification.activity.present? && @subscription.pushable?(@notification)
|
||||
|
@ -105,6 +105,7 @@ module Mastodon
|
||||
end
|
||||
|
||||
config.x.captcha = config_for(:captcha)
|
||||
config.x.mastodon = config_for(:mastodon)
|
||||
config.x.translation = config_for(:translation)
|
||||
|
||||
config.to_prepare do
|
||||
|
5
config/initializers/allowed_private_addresses.rb
Normal file
5
config/initializers/allowed_private_addresses.rb
Normal file
@ -0,0 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
Rails.application.configure do
|
||||
config.x.private_address_exceptions = (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(/(?:\s*,\s*|\s+)/).map { |addr| IPAddr.new(addr) }
|
||||
end
|
@ -723,7 +723,7 @@ an:
|
||||
original_status: Publicación orichinal
|
||||
reblogs: Impulsos
|
||||
status_changed: Publicación cambiada
|
||||
title: Estau d'as cuentas
|
||||
title: Estau d'as cuentas - @%{name}
|
||||
trending: En tendencia
|
||||
visibility: Visibilidat
|
||||
with_media: Con multimedia
|
||||
|
@ -847,7 +847,7 @@ ar:
|
||||
original_status: المنشور الأصلي
|
||||
reblogs: المعاد تدوينها
|
||||
status_changed: عُدّل المنشور
|
||||
title: منشورات الحساب
|
||||
title: منشورات الحساب - @%{name}
|
||||
trending: المتداولة
|
||||
visibility: مدى الظهور
|
||||
with_media: تحتوي على وسائط
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user