From e4e07b1c34858dc6b7070f1b5d81f40ec63ebf4c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 4 Oct 2024 10:11:15 -0400 Subject: [PATCH 01/23] Reduce factory usage across `spec/services` area (#32098) --- .../account_statuses_cleanup_service_spec.rb | 75 +++--- .../process_status_update_service_spec.rb | 74 +++-- .../services/authorize_follow_service_spec.rb | 34 ++- .../batched_remove_status_service_spec.rb | 52 ++-- spec/services/block_service_spec.rb | 13 +- spec/services/bulk_import_service_spec.rb | 255 +++++++----------- spec/services/favourite_service_spec.rb | 19 +- spec/services/follow_service_spec.rb | 13 +- .../services/process_mentions_service_spec.rb | 48 ++-- spec/services/reject_follow_service_spec.rb | 36 ++- .../remove_from_followers_service_spec.rb | 23 +- spec/services/remove_status_service_spec.rb | 44 ++- spec/services/report_service_spec.rb | 35 ++- spec/services/resolve_account_service_spec.rb | 128 +++++---- spec/services/resolve_url_service_spec.rb | 44 ++- .../services/translate_status_service_spec.rb | 52 ++-- spec/services/unblock_domain_service_spec.rb | 38 +-- spec/services/unblock_service_spec.rb | 24 +- spec/services/unfollow_service_spec.rb | 38 +-- spec/services/update_account_service_spec.rb | 20 +- spec/services/update_status_service_spec.rb | 143 +++++----- 21 files changed, 567 insertions(+), 641 deletions(-) diff --git a/spec/services/account_statuses_cleanup_service_spec.rb b/spec/services/account_statuses_cleanup_service_spec.rb index 857bd4fda..553d20029 100644 --- a/spec/services/account_statuses_cleanup_service_spec.rb +++ b/spec/services/account_statuses_cleanup_service_spec.rb @@ -27,39 +27,35 @@ RSpec.describe AccountStatusesCleanupService do end context 'when given a normal budget of 10' do - it 'reports 3 deleted statuses' do - expect(subject.call(account_policy, 10)).to eq 3 - end + it 'reports 3 deleted statuses and records last deleted id, deletes statuses, preserves recent unrelated statuses' do + expect(subject.call(account_policy, 10)) + .to eq(3) - it 'records the last deleted id' do - subject.call(account_policy, 10) - expect(account_policy.last_inspected).to eq [old_status.id, another_old_status.id].max - end + expect(account_policy.last_inspected) + .to eq [old_status.id, another_old_status.id].max - it 'actually deletes the statuses' do - subject.call(account_policy, 10) - expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])).to be_nil - expect { recent_status.reload }.to_not raise_error - end - - it 'preserves recent and unrelated statuses' do - subject.call(account_policy, 10) - expect { unrelated_status.reload }.to_not raise_error - expect { recent_status.reload }.to_not raise_error + expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])) + .to be_nil + expect { recent_status.reload } + .to_not raise_error + expect { unrelated_status.reload } + .to_not raise_error + expect { recent_status.reload } + .to_not raise_error end end context 'when called repeatedly with a budget of 2' do - it 'reports 2 then 1 deleted statuses' do - expect(subject.call(account_policy, 2)).to eq 2 - expect(subject.call(account_policy, 2)).to eq 1 - end + it 'reports 2 then 1 deleted statuses and deletes in expected order' do + expect(subject.call(account_policy, 2)) + .to eq(2) + expect(Status.find_by(id: very_old_status.id)) + .to be_nil - it 'actually deletes the statuses in the expected order' do - subject.call(account_policy, 2) - expect(Status.find_by(id: very_old_status.id)).to be_nil - subject.call(account_policy, 2) - expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])).to be_nil + expect(subject.call(account_policy, 2)) + .to eq(1) + expect(Status.find_by(id: [very_old_status.id, old_status.id, another_old_status.id])) + .to be_nil end end @@ -90,19 +86,24 @@ RSpec.describe AccountStatusesCleanupService do end end - it 'reports 0 deleted statuses then 0 then 3 then 0 again' do - expect(subject.call(account_policy, 10)).to eq 0 - expect(subject.call(account_policy, 10)).to eq 0 - expect(subject.call(account_policy, 10)).to eq 3 - expect(subject.call(account_policy, 10)).to eq 0 + it 'reports 0 deleted statuses then 0 then 3 then 0 again, and keeps id under oldest deletable record' do + expect(subject.call(account_policy, 10)) + .to eq(0) + expect(subject.call(account_policy, 10)) + .to eq(0) + expect(subject.call(account_policy, 10)) + .to eq(3) + expect(subject.call(account_policy, 10)) + .to eq(0) + expect(account_policy.last_inspected) + .to be < oldest_deletable_record_id end - it 'never causes the recorded id to get higher than oldest deletable toot' do - subject.call(account_policy, 10) - subject.call(account_policy, 10) - subject.call(account_policy, 10) - subject.call(account_policy, 10) - expect(account_policy.last_inspected).to be < Mastodon::Snowflake.id_at(account_policy.min_status_age.seconds.ago, with_random: false) + def oldest_deletable_record_id + Mastodon::Snowflake.id_at( + account_policy.min_status_age.seconds.ago, + with_random: false + ) end end end diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index a97e84080..b6ceba374 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -2,10 +2,6 @@ require 'rails_helper' -def poll_option_json(name, votes) - { type: 'Note', name: name, replies: { type: 'Collection', totalItems: votes } } -end - RSpec.describe ActivityPub::ProcessStatusUpdateService do subject { described_class.new } @@ -294,7 +290,6 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do context 'when originally without media attachments' do before do stub_request(:get, 'https://example.com/foo.png').to_return(body: attachment_fixture('emojo.png')) - subject.call(status, json, json) end let(:payload) do @@ -310,19 +305,18 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do } end - it 'updates media attachments' do - media_attachment = status.reload.ordered_media_attachments.first + it 'updates media attachments, fetches attachment, records media change in edit' do + subject.call(status, json, json) - expect(media_attachment).to_not be_nil - expect(media_attachment.remote_url).to eq 'https://example.com/foo.png' - end + expect(status.reload.ordered_media_attachments.first) + .to be_present + .and(have_attributes(remote_url: 'https://example.com/foo.png')) - it 'fetches the attachment' do - expect(a_request(:get, 'https://example.com/foo.png')).to have_been_made - end + expect(a_request(:get, 'https://example.com/foo.png')) + .to have_been_made - it 'records media change in edit' do - expect(status.edits.reload.last.ordered_media_attachment_ids).to_not be_empty + expect(status.edits.reload.last.ordered_media_attachment_ids) + .to_not be_empty end end @@ -344,27 +338,26 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do before do allow(RedownloadMediaWorker).to receive(:perform_async) + end + + it 'updates the existing media attachment in-place, does not queue redownload, updates media, records media change' do subject.call(status, json, json) - end - it 'updates the existing media attachment in-place' do - media_attachment = status.media_attachments.ordered.reload.first + expect(status.media_attachments.ordered.reload.first) + .to be_present + .and have_attributes( + remote_url: 'https://example.com/foo.png', + description: 'A picture' + ) - expect(media_attachment).to_not be_nil - expect(media_attachment.remote_url).to eq 'https://example.com/foo.png' - expect(media_attachment.description).to eq 'A picture' - end + expect(RedownloadMediaWorker) + .to_not have_received(:perform_async) - it 'does not queue redownload for the existing media attachment' do - expect(RedownloadMediaWorker).to_not have_received(:perform_async) - end + expect(status.ordered_media_attachments.map(&:remote_url)) + .to eq %w(https://example.com/foo.png) - it 'updates media attachments' do - expect(status.ordered_media_attachments.map(&:remote_url)).to eq %w(https://example.com/foo.png) - end - - it 'records media change in edit' do - expect(status.edits.reload.last.ordered_media_attachment_ids).to_not be_empty + expect(status.edits.reload.last.ordered_media_attachment_ids) + .to_not be_empty end end @@ -372,10 +365,11 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do before do poll = Fabricate(:poll, status: status) status.update(preloadable_poll: poll) - subject.call(status, json, json) end it 'removes poll and records media change in edit' do + subject.call(status, json, json) + expect(status.reload.poll).to be_nil expect(status.edits.reload.last.poll_options).to be_nil end @@ -398,15 +392,13 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do } end - before do - subject.call(status, json, json) - end - it 'creates a poll and records media change in edit' do - poll = status.reload.poll + subject.call(status, json, json) + + expect(status.reload.poll) + .to be_present + .and have_attributes(options: %w(Foo Bar Baz)) - expect(poll).to_not be_nil - expect(poll.options).to eq %w(Foo Bar Baz) expect(status.edits.reload.last.poll_options).to eq %w(Foo Bar Baz) end end @@ -419,4 +411,8 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do .to eq '2021-09-08 22:39:25 UTC' end end + + def poll_option_json(name, votes) + { type: 'Note', name: name, replies: { type: 'Collection', totalItems: votes } } + end end diff --git a/spec/services/authorize_follow_service_spec.rb b/spec/services/authorize_follow_service_spec.rb index 533b791fb..de2857280 100644 --- a/spec/services/authorize_follow_service_spec.rb +++ b/spec/services/authorize_follow_service_spec.rb @@ -12,15 +12,15 @@ RSpec.describe AuthorizeFollowService do before do FollowRequest.create(account: bob, target_account: sender) + end + + it 'removes follow request and creates follow relation' do subject.call(bob, sender) - end - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'creates follow relation' do - expect(bob.following?(sender)).to be true + expect(bob) + .to_not be_requested(sender) + expect(bob) + .to be_following(sender) end end @@ -30,19 +30,17 @@ RSpec.describe AuthorizeFollowService do before do FollowRequest.create(account: bob, target_account: sender) stub_request(:post, bob.inbox_url).to_return(status: 200) + end + + it 'removes follow request, creates follow relation, send accept activity', :inline_jobs do subject.call(bob, sender) - end - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'creates follow relation' do - expect(bob.following?(sender)).to be true - end - - it 'sends an accept activity', :inline_jobs do - expect(a_request(:post, bob.inbox_url)).to have_been_made.once + expect(bob) + .to_not be_requested(sender) + expect(bob) + .to be_following(sender) + expect(a_request(:post, bob.inbox_url)) + .to have_been_made.once end end end diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index 628bb198e..1ff73a633 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -24,32 +24,38 @@ RSpec.describe BatchedRemoveStatusService, :inline_jobs do status_alice_hello status_alice_other + end + it 'removes status records, removes from author and local follower feeds, notifies stream, sends delete' do subject.call([status_alice_hello, status_alice_other]) + + expect { Status.find(status_alice_hello.id) } + .to raise_error ActiveRecord::RecordNotFound + expect { Status.find(status_alice_other.id) } + .to raise_error ActiveRecord::RecordNotFound + + expect(feed_ids_for(alice)) + .to_not include(status_alice_hello.id, status_alice_other.id) + + expect(feed_ids_for(jeff)) + .to_not include(status_alice_hello.id, status_alice_other.id) + + expect(redis) + .to have_received(:publish) + .with("timeline:#{jeff.id}", any_args).at_least(:once) + + expect(redis) + .to have_received(:publish) + .with('timeline:public', any_args).at_least(:once) + + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.at_least_once end - it 'removes statuses' do - expect { Status.find(status_alice_hello.id) }.to raise_error ActiveRecord::RecordNotFound - expect { Status.find(status_alice_other.id) }.to raise_error ActiveRecord::RecordNotFound - end - - it 'removes statuses from author\'s home feed' do - expect(HomeFeed.new(alice).get(10).pluck(:id)).to_not include(status_alice_hello.id, status_alice_other.id) - end - - it 'removes statuses from local follower\'s home feed' do - expect(HomeFeed.new(jeff).get(10).pluck(:id)).to_not include(status_alice_hello.id, status_alice_other.id) - end - - it 'notifies streaming API of followers' do - expect(redis).to have_received(:publish).with("timeline:#{jeff.id}", any_args).at_least(:once) - end - - it 'notifies streaming API of public timeline' do - expect(redis).to have_received(:publish).with('timeline:public', any_args).at_least(:once) - end - - it 'sends delete activity to followers' do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.at_least_once + def feed_ids_for(account) + HomeFeed + .new(account) + .get(10) + .pluck(:id) end end diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb index 46dd69198..d9687a540 100644 --- a/spec/services/block_service_spec.rb +++ b/spec/services/block_service_spec.rb @@ -26,15 +26,16 @@ RSpec.describe BlockService do before do stub_request(:post, 'http://example.com/inbox').to_return(status: 200) + end + + it 'creates a blocking relation and send block activity', :inline_jobs do subject.call(sender, bob) - end - it 'creates a blocking relation' do - expect(sender.blocking?(bob)).to be true - end + expect(sender) + .to be_blocking(bob) - it 'sends a block activity', :inline_jobs do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end end diff --git a/spec/services/bulk_import_service_spec.rb b/spec/services/bulk_import_service_spec.rb index 0197f81a4..f52fc4d7d 100644 --- a/spec/services/bulk_import_service_spec.rb +++ b/spec/services/bulk_import_service_spec.rb @@ -24,30 +24,19 @@ RSpec.describe BulkImportService do ].map { |data| import.rows.create!(data: data) } end - before do - account.follow!(Fabricate(:account)) - end + before { account.follow!(Fabricate(:account)) } - it 'does not immediately change who the account follows' do - expect { subject.call(import) }.to_not(change { account.reload.active_relationships.to_a }) - end + it 'does not immediately change who the account follows, enqueues workers, sends follow requests after worker run' do + expect { subject.call(import) } + .to_not(change { account.reload.active_relationships.to_a }) - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows.map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows.map(&:id)) - it 'requests to follow all the listed users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(FollowRequest.includes(:target_account).where(account: account).map { |follow_request| follow_request.target_account.acct }).to contain_exactly('user@foo.bar', 'unknown@unknown.bar') + expect(FollowRequest.includes(:target_account).where(account: account).map { |follow_request| follow_request.target_account.acct }) + .to contain_exactly('user@foo.bar', 'unknown@unknown.bar') end end @@ -71,31 +60,20 @@ RSpec.describe BulkImportService do account.follow!(to_be_unfollowed) end - it 'unfollows user not present on list' do - subject.call(import) - expect(account.following?(to_be_unfollowed)).to be false - end + it 'updates the existing follow relationship as expected and unfollows user not on list, enqueues workers, sends follow reqs after worker run' do + expect { subject.call(import) } + .to change { Follow.where(account: account, target_account: followed).pick(:show_reblogs, :notify, :languages) }.from([true, false, nil]).to([false, true, ['en']]) - it 'updates the existing follow relationship as expected' do - expect { subject.call(import) }.to change { Follow.where(account: account, target_account: followed).pick(:show_reblogs, :notify, :languages) }.from([true, false, nil]).to([false, true, ['en']]) - end + expect(account) + .to_not be_following(to_be_unfollowed) - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows[1..].map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows[1..].map(&:id)) - it 'requests to follow all the expected users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(FollowRequest.includes(:target_account).where(account: account).map { |follow_request| follow_request.target_account.acct }).to contain_exactly('user@foo.bar', 'unknown@unknown.bar') + expect(FollowRequest.includes(:target_account).where(account: account).map { |follow_request| follow_request.target_account.acct }) + .to contain_exactly('user@foo.bar', 'unknown@unknown.bar') end end @@ -110,30 +88,19 @@ RSpec.describe BulkImportService do ].map { |data| import.rows.create!(data: data) } end - before do - account.block!(Fabricate(:account, username: 'already_blocked', domain: 'remote.org')) - end + before { account.block!(Fabricate(:account, username: 'already_blocked', domain: 'remote.org')) } - it 'does not immediately change who the account blocks' do - expect { subject.call(import) }.to_not(change { account.reload.blocking.to_a }) - end + it 'does not immediately change who the account blocks, enqueues worker, blocks after run' do + expect { subject.call(import) } + .to_not(change { account.reload.blocking.to_a }) - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows.map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows.map(&:id)) - it 'blocks all the listed users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(account.blocking.map(&:acct)).to contain_exactly('already_blocked@remote.org', 'user@foo.bar', 'unknown@unknown.bar') + expect(account.reload.blocking.map(&:acct)) + .to contain_exactly('already_blocked@remote.org', 'user@foo.bar', 'unknown@unknown.bar') end end @@ -157,27 +124,18 @@ RSpec.describe BulkImportService do account.block!(to_be_unblocked) end - it 'unblocks user not present on list' do + it 'unblocks user not present on list, enqueues worker, requests follow after run' do subject.call(import) + expect(account.blocking?(to_be_unblocked)).to be false - end - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows[1..].map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows[1..].map(&:id)) - it 'requests to follow all the expected users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(account.blocking.map(&:acct)).to contain_exactly('blocked@foo.bar', 'user@foo.bar', 'unknown@unknown.bar') + expect(account.blocking.map(&:acct)) + .to contain_exactly('blocked@foo.bar', 'user@foo.bar', 'unknown@unknown.bar') end end @@ -192,30 +150,19 @@ RSpec.describe BulkImportService do ].map { |data| import.rows.create!(data: data) } end - before do - account.mute!(Fabricate(:account, username: 'already_muted', domain: 'remote.org')) - end + before { account.mute!(Fabricate(:account, username: 'already_muted', domain: 'remote.org')) } - it 'does not immediately change who the account blocks' do - expect { subject.call(import) }.to_not(change { account.reload.muting.to_a }) - end + it 'does not immediately change who the account blocks, enqueures worker, mutes users after worker run' do + expect { subject.call(import) } + .to_not(change { account.reload.muting.to_a }) - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows.map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows.map(&:id)) - it 'mutes all the listed users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(account.muting.map(&:acct)).to contain_exactly('already_muted@remote.org', 'user@foo.bar', 'unknown@unknown.bar') + expect(account.reload.muting.map(&:acct)) + .to contain_exactly('already_muted@remote.org', 'user@foo.bar', 'unknown@unknown.bar') end end @@ -239,31 +186,19 @@ RSpec.describe BulkImportService do account.mute!(to_be_unmuted) end - it 'updates the existing mute as expected' do - expect { subject.call(import) }.to change { Mute.where(account: account, target_account: muted).pick(:hide_notifications) }.from(false).to(true) - end + it 'updates the existing mute as expected and unblocks user not on list, and enqueues worker, and requests follow after worker run' do + expect { subject.call(import) } + .to change { Mute.where(account: account, target_account: muted).pick(:hide_notifications) }.from(false).to(true) - it 'unblocks user not present on list' do - subject.call(import) expect(account.muting?(to_be_unmuted)).to be false - end - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows[1..].map(&:id)) - end + expect(row_worker_job_args) + .to match_array(rows[1..].map(&:id)) - it 'requests to follow all the expected users once the workers have run' do - subject.call(import) + stub_resolve_account_and_drain_workers - resolve_account_service_double = instance_double(ResolveAccountService) - allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) - allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } - allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } - - Import::RowWorker.drain - - expect(account.muting.map(&:acct)).to contain_exactly('muted@foo.bar', 'user@foo.bar', 'unknown@unknown.bar') + expect(account.muting.map(&:acct)) + .to contain_exactly('muted@foo.bar', 'user@foo.bar', 'unknown@unknown.bar') end end @@ -284,13 +219,11 @@ RSpec.describe BulkImportService do account.block_domain!('blocked.com') end - it 'blocks all the new domains' do + it 'blocks all the new domains and marks import finished' do subject.call(import) - expect(account.domain_blocks.pluck(:domain)).to contain_exactly('alreadyblocked.com', 'blocked.com', 'to-block.com') - end - it 'marks the import as finished' do - subject.call(import) + expect(account.domain_blocks.pluck(:domain)) + .to contain_exactly('alreadyblocked.com', 'blocked.com', 'to-block.com') expect(import.reload.state_finished?).to be true end end @@ -312,14 +245,13 @@ RSpec.describe BulkImportService do account.block_domain!('blocked.com') end - it 'blocks all the new domains' do + it 'blocks all the new domains and marks import finished' do subject.call(import) - expect(account.domain_blocks.pluck(:domain)).to contain_exactly('blocked.com', 'to-block.com') - end - it 'marks the import as finished' do - subject.call(import) - expect(import.reload.state_finished?).to be true + expect(account.domain_blocks.pluck(:domain)) + .to contain_exactly('blocked.com', 'to-block.com') + expect(import.reload.state_finished?) + .to be true end end @@ -347,22 +279,16 @@ RSpec.describe BulkImportService do account.bookmarks.create!(status: bookmarked) end - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows.map(&:id)) - end - - it 'updates the bookmarks as expected once the workers have run' do + it 'enqueues workers for the expected rows and updates bookmarks after worker run' do subject.call(import) - service_double = instance_double(ActivityPub::FetchRemoteStatusService) - allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_double) - allow(service_double).to receive(:call).with('https://domain.unknown/foo') { Fabricate(:status, uri: 'https://domain.unknown/foo') } - allow(service_double).to receive(:call).with('https://domain.unknown/private') { Fabricate(:status, uri: 'https://domain.unknown/private', visibility: :direct) } + expect(row_worker_job_args) + .to match_array(rows.map(&:id)) - Import::RowWorker.drain + stub_fetch_remote_and_drain_workers - expect(account.bookmarks.map { |bookmark| bookmark.status.uri }).to contain_exactly(already_bookmarked.uri, status.uri, bookmarked.uri, 'https://domain.unknown/foo') + expect(account.bookmarks.map { |bookmark| bookmark.status.uri }) + .to contain_exactly(already_bookmarked.uri, status.uri, bookmarked.uri, 'https://domain.unknown/foo') end end @@ -390,23 +316,48 @@ RSpec.describe BulkImportService do account.bookmarks.create!(status: bookmarked) end - it 'enqueues workers for the expected rows' do - subject.call(import) - expect(Import::RowWorker.jobs.pluck('args').flatten).to match_array(rows.map(&:id)) - end - - it 'updates the bookmarks as expected once the workers have run' do + it 'enqueues workers for the expected rows and updates bookmarks' do subject.call(import) - service_double = instance_double(ActivityPub::FetchRemoteStatusService) - allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_double) - allow(service_double).to receive(:call).with('https://domain.unknown/foo') { Fabricate(:status, uri: 'https://domain.unknown/foo') } - allow(service_double).to receive(:call).with('https://domain.unknown/private') { Fabricate(:status, uri: 'https://domain.unknown/private', visibility: :direct) } + expect(row_worker_job_args) + .to match_array(rows.map(&:id)) - Import::RowWorker.drain + stub_fetch_remote_and_drain_workers - expect(account.bookmarks.map { |bookmark| bookmark.status.uri }).to contain_exactly(status.uri, bookmarked.uri, 'https://domain.unknown/foo') + expect(account.bookmarks.map { |bookmark| bookmark.status.uri }) + .to contain_exactly(status.uri, bookmarked.uri, 'https://domain.unknown/foo') end end + + def row_worker_job_args + Import::RowWorker + .jobs + .pluck('args') + .flatten + end + + def stub_resolve_account_and_drain_workers + resolve_account_service_double = instance_double(ResolveAccountService) + allow(ResolveAccountService) + .to receive(:new) + .and_return(resolve_account_service_double) + allow(resolve_account_service_double) + .to receive(:call) + .with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } + allow(resolve_account_service_double) + .to receive(:call) + .with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } + + Import::RowWorker.drain + end + + def stub_fetch_remote_and_drain_workers + service_double = instance_double(ActivityPub::FetchRemoteStatusService) + allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_double) + allow(service_double).to receive(:call).with('https://domain.unknown/foo') { Fabricate(:status, uri: 'https://domain.unknown/foo') } + allow(service_double).to receive(:call).with('https://domain.unknown/private') { Fabricate(:status, uri: 'https://domain.unknown/private', visibility: :direct) } + + Import::RowWorker.drain + end end end diff --git a/spec/services/favourite_service_spec.rb b/spec/services/favourite_service_spec.rb index c39362def..123e8699c 100644 --- a/spec/services/favourite_service_spec.rb +++ b/spec/services/favourite_service_spec.rb @@ -11,11 +11,9 @@ RSpec.describe FavouriteService do let(:bob) { Fabricate(:account) } let(:status) { Fabricate(:status, account: bob) } - before do - subject.call(sender, status) - end - it 'creates a favourite' do + subject.call(sender, status) + expect(status.favourites.first).to_not be_nil end end @@ -26,15 +24,16 @@ RSpec.describe FavouriteService do before do stub_request(:post, 'http://example.com/inbox').to_return(status: 200, body: '', headers: {}) + end + + it 'creates a favourite and sends like activity', :inline_jobs do subject.call(sender, status) - end - it 'creates a favourite' do - expect(status.favourites.first).to_not be_nil - end + expect(status.favourites.first) + .to_not be_nil - it 'sends a like activity', :inline_jobs do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end end diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index 0c4cd6004..bbd8a6f99 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -143,15 +143,16 @@ RSpec.describe FollowService do before do stub_request(:post, 'http://example.com/inbox').to_return(status: 200, body: '', headers: {}) + end + + it 'creates follow request and sends an activity to inbox', :inline_jobs do subject.call(sender, bob) - end - it 'creates follow request' do - expect(FollowRequest.find_by(account: sender, target_account: bob)).to_not be_nil - end + expect(FollowRequest.find_by(account: sender, target_account: bob)) + .to_not be_nil - it 'sends a follow activity to the inbox', :inline_jobs do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end end diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index 2c202d3e5..3cc83d82f 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -16,20 +16,25 @@ RSpec.describe ProcessMentionsService do before do account.block!(individually_blocked_account) account.domain_blocks.create!(domain: domain_blocked_account.domain) - - subject.call(status) end - it 'creates a mention to the non-blocked account' do - expect(non_blocked_account.mentions.where(status: status).count).to eq 1 + it 'creates a mention to the non-blocked account but not the individually or domain blocked accounts' do + expect { subject.call(status) } + .to create_mention_for_non_blocked + .and skip_mention_for_individual + .and skip_mention_for_domain_blocked end - it 'does not create a mention to the individually blocked account' do - expect(individually_blocked_account.mentions.where(status: status).count).to eq 0 + def create_mention_for_non_blocked + change { non_blocked_account.mentions.where(status: status).count }.to(1) end - it 'does not create a mention to the domain-blocked account' do - expect(domain_blocked_account.mentions.where(status: status).count).to eq 0 + def skip_mention_for_individual + not_change { individually_blocked_account.mentions.where(status: status).count }.from(0) + end + + def skip_mention_for_domain_blocked + not_change { domain_blocked_account.mentions.where(status: status).count }.from(0) end end @@ -40,11 +45,9 @@ RSpec.describe ProcessMentionsService do context 'with a valid remote user' do let!(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } - before do - subject.call(status) - end - it 'creates a mention' do + subject.call(status) + expect(remote_user.mentions.where(status: status).count).to eq 1 end end @@ -53,11 +56,9 @@ RSpec.describe ProcessMentionsService do let!(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } let(:status) { Fabricate(:status, account: account, text: "Hello @#{remote_user.acct} @#{remote_user.acct} @#{remote_user.acct}", visibility: :public) } - before do - subject.call(status, save_records: false) - end - it 'creates exactly one mention' do + subject.call(status, save_records: false) + expect(status.mentions.size).to eq 1 end end @@ -66,11 +67,9 @@ RSpec.describe ProcessMentionsService do let!(:remote_user) { Fabricate(:account, username: 'sneak', protocol: :activitypub, domain: 'xn--hresiar-mxa.ch', inbox_url: 'http://example.com/inbox') } let!(:status) { Fabricate(:status, account: account, text: 'Hello @sneak@hæresiar.ch') } - before do - subject.call(status) - end - it 'creates a mention' do + subject.call(status) + expect(remote_user.mentions.where(status: status).count).to eq 1 end end @@ -79,11 +78,9 @@ RSpec.describe ProcessMentionsService do let!(:remote_user) { Fabricate(:account, username: 'foo', protocol: :activitypub, domain: 'xn--y9a3aq.xn--y9a3aq', inbox_url: 'http://example.com/inbox') } let!(:status) { Fabricate(:status, account: account, text: 'Hello @foo@հայ.հայ') } - before do - subject.call(status) - end - it 'creates a mention' do + subject.call(status) + expect(remote_user.mentions.where(status: status).count).to eq 1 end end @@ -95,10 +92,11 @@ RSpec.describe ProcessMentionsService do before do stub_request(:get, 'https://example.com/.well-known/host-meta').to_return(status: 404) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:remote_user@example.com').to_return(status: 500) - subject.call(status) end it 'creates a mention' do + subject.call(status) + expect(remote_user.mentions.where(status: status).count).to eq 1 end end diff --git a/spec/services/reject_follow_service_spec.rb b/spec/services/reject_follow_service_spec.rb index d2c7a0020..eec0d6c1e 100644 --- a/spec/services/reject_follow_service_spec.rb +++ b/spec/services/reject_follow_service_spec.rb @@ -10,17 +10,15 @@ RSpec.describe RejectFollowService do describe 'local' do let(:bob) { Fabricate(:account) } - before do - FollowRequest.create(account: bob, target_account: sender) + before { FollowRequest.create(account: bob, target_account: sender) } + + it 'removes follow request and does not create relation' do subject.call(bob, sender) - end - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'does not create follow relation' do - expect(bob.following?(sender)).to be false + expect(bob) + .to_not be_requested(sender) + expect(bob) + .to_not be_following(sender) end end @@ -30,19 +28,17 @@ RSpec.describe RejectFollowService do before do FollowRequest.create(account: bob, target_account: sender) stub_request(:post, bob.inbox_url).to_return(status: 200) + end + + it 'removes follow request, does not create relation, sends reject activity', :inline_jobs do subject.call(bob, sender) - end - it 'removes follow request' do - expect(bob.requested?(sender)).to be false - end - - it 'does not create follow relation' do - expect(bob.following?(sender)).to be false - end - - it 'sends a reject activity', :inline_jobs do - expect(a_request(:post, bob.inbox_url)).to have_been_made.once + expect(bob) + .to_not be_requested(sender) + expect(bob) + .to_not be_following(sender) + expect(a_request(:post, bob.inbox_url)) + .to have_been_made.once end end end diff --git a/spec/services/remove_from_followers_service_spec.rb b/spec/services/remove_from_followers_service_spec.rb index 515600096..381daf1a5 100644 --- a/spec/services/remove_from_followers_service_spec.rb +++ b/spec/services/remove_from_followers_service_spec.rb @@ -10,13 +10,13 @@ RSpec.describe RemoveFromFollowersService do describe 'local' do let(:sender) { Fabricate(:account, username: 'alice') } - before do - Follow.create(account: sender, target_account: bob) - subject.call(bob, sender) - end + before { Follow.create(account: sender, target_account: bob) } it 'does not create follow relation' do - expect(bob.followed_by?(sender)).to be false + subject.call(bob, sender) + + expect(bob) + .to_not be_followed_by(sender) end end @@ -26,15 +26,16 @@ RSpec.describe RemoveFromFollowersService do before do Follow.create(account: sender, target_account: bob) stub_request(:post, sender.inbox_url).to_return(status: 200) + end + + it 'does not create follow relation and sends reject activity', :inline_jobs do subject.call(bob, sender) - end - it 'does not create follow relation' do - expect(bob.followed_by?(sender)).to be false - end + expect(bob) + .to_not be_followed_by(sender) - it 'sends a reject activity', :inline_jobs do - expect(a_request(:post, sender.inbox_url)).to have_been_made.once + expect(a_request(:post, sender.inbox_url)) + .to have_been_made.once end end end diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb index 08f519b53..f2b46f05b 100644 --- a/spec/services/remove_status_service_spec.rb +++ b/spec/services/remove_status_service_spec.rb @@ -28,42 +28,38 @@ RSpec.describe RemoveStatusService, :inline_jobs do Fabricate(:status, account: bill, reblog: status, uri: 'hoge') end - it 'removes status from author\'s home feed' do - subject.call(status) - expect(HomeFeed.new(alice).get(10).pluck(:id)).to_not include(status.id) - end - - it 'removes status from local follower\'s home feed' do - subject.call(status) - expect(HomeFeed.new(jeff).get(10).pluck(:id)).to_not include(status.id) - end - - it 'publishes to public media timeline' do + it 'removes status from notifications and from author and local follower home feeds, publishes to media timeline, sends delete activities' do allow(redis).to receive(:publish).with(any_args) - subject.call(status) + expect { subject.call(status) } + .to remove_status_from_notifications - expect(redis).to have_received(:publish).with('timeline:public:media', Oj.dump(event: :delete, payload: status.id.to_s)) - end + expect(home_feed_ids(alice)) + .to_not include(status.id) + expect(home_feed_ids(jeff)) + .to_not include(status.id) - it 'sends Delete activity to followers' do - subject.call(status) + expect(redis) + .to have_received(:publish).with('timeline:public:media', Oj.dump(event: :delete, payload: status.id.to_s)) expect(delete_delivery(hank, status)) .to have_been_made.once - end - - it 'sends Delete activity to rebloggers' do - subject.call(status) expect(delete_delivery(bill, status)) .to have_been_made.once end - it 'remove status from notifications' do - expect { subject.call(status) }.to change { - Notification.where(activity_type: 'Favourite', from_account: jeff, account: alice).count - }.from(1).to(0) + def home_feed_ids(personage) + HomeFeed + .new(personage) + .get(10) + .pluck(:id) + end + + def remove_status_from_notifications + change { Notification.where(activity_type: 'Favourite', from_account: jeff, account: alice).count } + .from(1) + .to(0) end def delete_delivery(target, status) diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb index 6518c5c27..4659e1c7a 100644 --- a/spec/services/report_service_spec.rb +++ b/spec/services/report_service_spec.rb @@ -31,14 +31,13 @@ RSpec.describe ReportService do context 'when forward is true', :inline_jobs do let(:forward) { true } - it 'sends ActivityPub payload when forward is true' do - subject.call(source_account, remote_account, forward: forward) - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made - end - - it 'has an uri' do + it 'has a URI and sends ActivityPub payload' do report = subject.call(source_account, remote_account, forward: forward) - expect(report.uri).to_not be_nil + + expect(report.uri) + .to_not be_nil + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made end context 'when reporting a reply on a different remote server' do @@ -122,13 +121,12 @@ RSpec.describe ReportService do status.mentions.create(account: source_account) end - it 'creates a report' do - expect { subject.call }.to change { target_account.targeted_reports.count }.from(0).to(1) - end + it 'creates a report and attaches the DM to the report' do + expect { subject.call } + .to change { target_account.targeted_reports.count }.from(0).to(1) - it 'attaches the DM to the report' do - subject.call - expect(target_account.targeted_reports.pluck(:status_ids)).to eq [[status.id]] + expect(target_account.targeted_reports.pluck(:status_ids)) + .to eq [[status.id]] end end @@ -146,13 +144,12 @@ RSpec.describe ReportService do status.mentions.create(account: source_account) end - it 'creates a report' do - expect { subject.call }.to change { target_account.targeted_reports.count }.from(0).to(1) - end + it 'creates a report and attaches DM to report' do + expect { subject.call } + .to change { target_account.targeted_reports.count }.from(0).to(1) - it 'attaches the DM to the report' do - subject.call - expect(target_account.targeted_reports.pluck(:status_ids)).to eq [[status.id]] + expect(target_account.targeted_reports.pluck(:status_ids)) + .to eq [[status.id]] end end diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index a856e019a..1bd4e9a8e 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -22,37 +22,38 @@ RSpec.describe ResolveAccountService do context 'when domain is banned' do before { Fabricate(:domain_block, domain: 'ap.example.com', severity: :suspend) } - it 'does not return an account' do - expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to be_nil - end - - it 'does not make a webfinger query' do - subject.call('foo@ap.example.com', skip_webfinger: true) - expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made + it 'does not return an account or make a webfinger query' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)) + .to be_nil + expect(webfinger_discovery_request) + .to_not have_been_made end end context 'when domain is not banned' do - it 'returns the expected account' do - expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to eq remote_account - end - - it 'does not make a webfinger query' do - subject.call('foo@ap.example.com', skip_webfinger: true) - expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made + it 'returns the expected account and does not make a webfinger query' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)) + .to eq remote_account + expect(webfinger_discovery_request) + .to_not have_been_made end end end context 'when account is not known' do - it 'does not return an account' do - expect(subject.call('foo@ap.example.com', skip_webfinger: true)).to be_nil + it 'does not return an account and does not make webfinger query' do + expect(subject.call('foo@ap.example.com', skip_webfinger: true)) + .to be_nil + expect(webfinger_discovery_request) + .to_not have_been_made end + end - it 'does not make a webfinger query' do - subject.call('foo@ap.example.com', skip_webfinger: true) - expect(a_request(:get, 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com')).to_not have_been_made - end + def webfinger_discovery_request + a_request( + :get, + 'https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com' + ) end end @@ -84,13 +85,11 @@ RSpec.describe ResolveAccountService do allow(AccountDeletionWorker).to receive(:perform_async) end - it 'returns nil' do - expect(subject.call('hoge@example.com')).to be_nil - end - - it 'queues account deletion worker' do - subject.call('hoge@example.com') - expect(AccountDeletionWorker).to have_received(:perform_async) + it 'returns nil and queues deletion worker' do + expect(subject.call('hoge@example.com')) + .to be_nil + expect(AccountDeletionWorker) + .to have_received(:perform_async) end end @@ -110,9 +109,12 @@ RSpec.describe ResolveAccountService do it 'returns new remote account' do account = subject.call('Foo@redirected.example.com') - expect(account.activitypub?).to be true - expect(account.acct).to eq 'foo@ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + expect(account) + .to have_attributes( + activitypub?: true, + acct: 'foo@ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox' + ) end end @@ -125,9 +127,12 @@ RSpec.describe ResolveAccountService do it 'returns new remote account' do account = subject.call('Foo@redirected.example.com') - expect(account.activitypub?).to be true - expect(account.acct).to eq 'foo@ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + expect(account) + .to have_attributes( + activitypub?: true, + acct: 'foo@ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox' + ) end end @@ -161,9 +166,12 @@ RSpec.describe ResolveAccountService do it 'returns new remote account' do account = subject.call('foo@ap.example.com') - expect(account.activitypub?).to be true - expect(account.domain).to eq 'ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + expect(account) + .to have_attributes( + activitypub?: true, + domain: 'ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox' + ) end context 'with multiple types' do @@ -174,10 +182,13 @@ RSpec.describe ResolveAccountService do it 'returns new remote account' do account = subject.call('foo@ap.example.com') - expect(account.activitypub?).to be true - expect(account.domain).to eq 'ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' - expect(account.actor_type).to eq 'Person' + expect(account) + .to have_attributes( + activitypub?: true, + domain: 'ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox', + actor_type: 'Person' + ) end end end @@ -186,20 +197,21 @@ RSpec.describe ResolveAccountService do let!(:duplicate) { Fabricate(:account, username: 'foo', domain: 'old.example.com', uri: 'https://ap.example.com/users/foo') } let!(:status) { Fabricate(:status, account: duplicate, text: 'foo') } - it 'returns new remote account' do + it 'returns new remote account and merges accounts', :inline_jobs do account = subject.call('foo@ap.example.com') - expect(account.activitypub?).to be true - expect(account.domain).to eq 'ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' - expect(account.uri).to eq 'https://ap.example.com/users/foo' - end + expect(account) + .to have_attributes( + activitypub?: true, + domain: 'ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox', + uri: 'https://ap.example.com/users/foo' + ) - it 'merges accounts', :inline_jobs do - account = subject.call('foo@ap.example.com') - - expect(status.reload.account_id).to eq account.id - expect(Account.where(uri: account.uri).count).to eq 1 + expect(status.reload.account_id) + .to eq account.id + expect(Account.where(uri: account.uri).count) + .to eq 1 end end @@ -210,11 +222,15 @@ RSpec.describe ResolveAccountService do it 'returns new remote account' do account = subject.call('foo@ap.example.com') - expect(account.activitypub?).to be true - expect(account.domain).to eq 'ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' - expect(account.uri).to eq 'https://ap.example.com/users/foo' - expect(status.reload.account).to eq(account) + expect(account) + .to have_attributes( + activitypub?: true, + domain: 'ap.example.com', + inbox_url: 'https://ap.example.com/users/foo/inbox', + uri: 'https://ap.example.com/users/foo' + ) + expect(status.reload.account) + .to eq(account) end end diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index 80f2a5a4b..eaf00c1ed 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -51,12 +51,11 @@ RSpec.describe ResolveURLService do let(:url) { 'https://example.com/@foo/42' } let(:uri) { 'https://example.com/users/foo/statuses/42' } - it 'returns status by url' do - expect(subject.call(url, on_behalf_of: account)).to eq(status) - end - - it 'returns status by uri' do - expect(subject.call(uri, on_behalf_of: account)).to eq(status) + it 'returns status by URL or URI' do + expect(subject.call(url, on_behalf_of: account)) + .to eq(status) + expect(subject.call(uri, on_behalf_of: account)) + .to eq(status) end end @@ -75,12 +74,11 @@ RSpec.describe ResolveURLService do let(:url) { 'https://example.com/@foo/42' } let(:uri) { 'https://example.com/users/foo/statuses/42' } - it 'does not return the status by url' do - expect(subject.call(url, on_behalf_of: account)).to be_nil - end - - it 'does not return the status by uri' do - expect(subject.call(uri, on_behalf_of: account)).to be_nil + it 'does not return the status by URL or URI' do + expect(subject.call(url, on_behalf_of: account)) + .to be_nil + expect(subject.call(uri, on_behalf_of: account)) + .to be_nil end end @@ -107,22 +105,20 @@ RSpec.describe ResolveURLService do account.follow!(poster) end - it 'returns status by url' do - expect(subject.call(url, on_behalf_of: account)).to eq(status) - end - - it 'returns status by uri' do - expect(subject.call(uri, on_behalf_of: account)).to eq(status) + it 'returns status by URL or URI' do + expect(subject.call(url, on_behalf_of: account)) + .to eq(status) + expect(subject.call(uri, on_behalf_of: account)) + .to eq(status) end end context 'when the account does not follow the poster' do - it 'does not return the status by url' do - expect(subject.call(url, on_behalf_of: account)).to be_nil - end - - it 'does not return the status by uri' do - expect(subject.call(uri, on_behalf_of: account)).to be_nil + it 'does not return the status by URL or URI' do + expect(subject.call(url, on_behalf_of: account)) + .to be_nil + expect(subject.call(uri, on_behalf_of: account)) + .to be_nil end end end diff --git a/spec/services/translate_status_service_spec.rb b/spec/services/translate_status_service_spec.rb index 0779fbbe6..cd92fb8d1 100644 --- a/spec/services/translate_status_service_spec.rb +++ b/spec/services/translate_status_service_spec.rb @@ -32,20 +32,14 @@ RSpec.describe TranslateStatusService do allow(TranslationService).to receive_messages(configured?: true, configured: translation_service) end - it 'returns translated status content' do - expect(service.call(status, 'es').content).to eq '

Hola

' - end - - it 'returns source language' do - expect(service.call(status, 'es').detected_source_language).to eq 'en' - end - - it 'returns translation provider' do - expect(service.call(status, 'es').provider).to eq 'Dummy' - end - - it 'returns original status' do - expect(service.call(status, 'es').status).to eq status + it 'returns translated status content and source language and provider and original status' do + expect(service.call(status, 'es')) + .to have_attributes( + content: '

Hola

', + detected_source_language: 'en', + provider: 'Dummy', + status: status + ) end describe 'status has content with custom emoji' do @@ -155,26 +149,16 @@ RSpec.describe TranslateStatusService do let!(:source_texts) { service.send(:source_texts) } it 'returns formatted poll options' do - expect(source_texts.size).to eq 3 - expect(source_texts.values).to eq %w(

Hello

Blue Green) - end - - it 'has a first key with content' do - expect(source_texts.keys.first).to eq :content - end - - it 'has the first option in the second key with correct options' do - option1 = source_texts.keys.second - expect(option1).to be_a Poll::Option - expect(option1.id).to eq '0' - expect(option1.title).to eq 'Blue' - end - - it 'has the second option in the third key with correct options' do - option2 = source_texts.keys.third - expect(option2).to be_a Poll::Option - expect(option2.id).to eq '1' - expect(option2.title).to eq 'Green' + expect(source_texts) + .to have_attributes( + size: 3, + values: %w(

Hello

Blue Green), + keys: contain_exactly( + eq(:content), + be_a(Poll::Option).and(have_attributes(id: '0', title: 'Blue')), + be_a(Poll::Option).and(have_attributes(id: '1', title: 'Green')) + ) + ) end end end diff --git a/spec/services/unblock_domain_service_spec.rb b/spec/services/unblock_domain_service_spec.rb index 405fe1cfd..daa1d480a 100644 --- a/spec/services/unblock_domain_service_spec.rb +++ b/spec/services/unblock_domain_service_spec.rb @@ -12,26 +12,32 @@ RSpec.describe UnblockDomainService do let!(:silenced) { Fabricate(:account, domain: 'example.com', silenced_at: domain_block.created_at) } let!(:suspended) { Fabricate(:account, domain: 'example.com', suspended_at: domain_block.created_at) } - it 'unsilences accounts and removes block' do - domain_block.update(severity: :silence) + context 'with severity of silence' do + before { domain_block.update(severity: :silence) } - subject.call(domain_block) - expect_deleted_domain_block - expect(silenced.reload.silenced?).to be false - expect(suspended.reload.suspended?).to be true - expect(independently_suspended.reload.suspended?).to be true - expect(independently_silenced.reload.silenced?).to be true + it 'unsilences accounts and removes block' do + subject.call(domain_block) + + expect_deleted_domain_block + expect(silenced.reload.silenced?).to be false + expect(suspended.reload.suspended?).to be true + expect(independently_suspended.reload.suspended?).to be true + expect(independently_silenced.reload.silenced?).to be true + end end - it 'unsuspends accounts and removes block' do - domain_block.update(severity: :suspend) + context 'with severity of suspend' do + before { domain_block.update(severity: :suspend) } - subject.call(domain_block) - expect_deleted_domain_block - expect(suspended.reload.suspended?).to be false - expect(silenced.reload.silenced?).to be false - expect(independently_suspended.reload.suspended?).to be true - expect(independently_silenced.reload.silenced?).to be true + it 'unsuspends accounts and removes block' do + subject.call(domain_block) + + expect_deleted_domain_block + expect(suspended.reload.suspended?).to be false + expect(silenced.reload.silenced?).to be false + expect(independently_suspended.reload.suspended?).to be true + expect(independently_silenced.reload.silenced?).to be true + end end end diff --git a/spec/services/unblock_service_spec.rb b/spec/services/unblock_service_spec.rb index 6132e7441..a2c5188f0 100644 --- a/spec/services/unblock_service_spec.rb +++ b/spec/services/unblock_service_spec.rb @@ -10,13 +10,13 @@ RSpec.describe UnblockService do describe 'local' do let(:bob) { Fabricate(:account) } - before do - sender.block!(bob) - subject.call(sender, bob) - end + before { sender.block!(bob) } it 'destroys the blocking relation' do - expect(sender.blocking?(bob)).to be false + subject.call(sender, bob) + + expect(sender) + .to_not be_blocking(bob) end end @@ -26,15 +26,15 @@ RSpec.describe UnblockService do before do sender.block!(bob) stub_request(:post, 'http://example.com/inbox').to_return(status: 200) + end + + it 'destroys the blocking relation and sends unblock activity', :inline_jobs do subject.call(sender, bob) - end - it 'destroys the blocking relation' do - expect(sender.blocking?(bob)).to be false - end - - it 'sends an unblock activity', :inline_jobs do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(sender) + .to_not be_blocking(bob) + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end end diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb index 0c206c4b9..6cf24ca5e 100644 --- a/spec/services/unfollow_service_spec.rb +++ b/spec/services/unfollow_service_spec.rb @@ -10,13 +10,13 @@ RSpec.describe UnfollowService do describe 'local' do let(:bob) { Fabricate(:account, username: 'bob') } - before do - sender.follow!(bob) - subject.call(sender, bob) - end + before { sender.follow!(bob) } it 'destroys the following relation' do - expect(sender.following?(bob)).to be false + subject.call(sender, bob) + + expect(sender) + .to_not be_following(bob) end end @@ -26,15 +26,15 @@ RSpec.describe UnfollowService do before do sender.follow!(bob) stub_request(:post, 'http://example.com/inbox').to_return(status: 200) + end + + it 'destroys the following relation and sends unfollow activity' do subject.call(sender, bob) - end - it 'destroys the following relation' do - expect(sender.following?(bob)).to be false - end - - it 'sends an unfollow activity' do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(sender) + .to_not be_following(bob) + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end @@ -44,15 +44,15 @@ RSpec.describe UnfollowService do before do bob.follow!(sender) stub_request(:post, 'http://example.com/inbox').to_return(status: 200) + end + + it 'destroys the following relation and sends a reject activity' do subject.call(bob, sender) - end - it 'destroys the following relation' do - expect(bob.following?(sender)).to be false - end - - it 'sends a reject activity' do - expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once + expect(sender) + .to_not be_following(bob) + expect(a_request(:post, 'http://example.com/inbox')) + .to have_been_made.once end end end diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb index d066db481..f9059af07 100644 --- a/spec/services/update_account_service_spec.rb +++ b/spec/services/update_account_service_spec.rb @@ -18,23 +18,19 @@ RSpec.describe UpdateAccountService do FollowService.new.call(alice, account) FollowService.new.call(bob, account) FollowService.new.call(eve, account) + end + it 'auto accepts pending follow requests from appropriate accounts' do subject.call(account, { locked: false }) - end - it 'auto-accepts pending follow requests' do - expect(alice.following?(account)).to be true - expect(alice.requested?(account)).to be false - end + expect(alice).to be_following(account) + expect(alice).to_not be_requested(account) - it 'does not auto-accept pending follow requests from silenced users' do - expect(bob.following?(account)).to be false - expect(bob.requested?(account)).to be true - end + expect(bob).to_not be_following(account) + expect(bob).to be_requested(account) - it 'auto-accepts pending follow requests from muted users so as to not leak mute' do - expect(eve.following?(account)).to be true - expect(eve.requested?(account)).to be false + expect(eve).to be_following(account) + expect(eve).to_not be_requested(account) end end end diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb index de06fb13c..7c92adeff 100644 --- a/spec/services/update_status_service_spec.rb +++ b/spec/services/update_status_service_spec.rb @@ -10,15 +10,15 @@ RSpec.describe UpdateStatusService do before do allow(ActivityPub::DistributionWorker).to receive(:perform_async) + end + + it 'does not create an edit or notify anyone' do subject.call(status, status.account_id, text: 'Foo') - end - it 'does not create an edit' do - expect(status.reload.edits).to be_empty - end - - it 'does not notify anyone' do - expect(ActivityPub::DistributionWorker).to_not have_received(:perform_async) + expect(status.reload.edits) + .to be_empty + expect(ActivityPub::DistributionWorker) + .to_not have_received(:perform_async) end end @@ -28,18 +28,16 @@ RSpec.describe UpdateStatusService do before do PreviewCardsStatus.create(status: status, preview_card: preview_card) + end + + it 'updates text, resets card, saves edit history' do subject.call(status, status.account_id, text: 'Bar') - end - it 'updates text' do - expect(status.reload.text).to eq 'Bar' - end - - it 'resets preview card' do - expect(status.reload.preview_card).to be_nil - end - - it 'saves edit history' do + expect(status.reload) + .to have_attributes( + text: 'Bar', + preview_card: be_nil + ) expect(status.edits.ordered.pluck(:text)).to eq %w(Foo Bar) end end @@ -50,15 +48,15 @@ RSpec.describe UpdateStatusService do before do PreviewCardsStatus.create(status: status, preview_card: preview_card) + end + + it 'updates content warning and saves history' do subject.call(status, status.account_id, text: 'Foo', spoiler_text: 'Bar') - end - it 'updates content warning' do - expect(status.reload.spoiler_text).to eq 'Bar' - end - - it 'saves edit history' do - expect(status.edits.ordered.pluck(:text, :spoiler_text)).to eq [['Foo', ''], ['Foo', 'Bar']] + expect(status.reload.spoiler_text) + .to eq 'Bar' + expect(status.edits.ordered.pluck(:text, :spoiler_text)) + .to eq [['Foo', ''], ['Foo', 'Bar']] end end @@ -69,23 +67,19 @@ RSpec.describe UpdateStatusService do before do status.media_attachments << detached_media_attachment + end + + it 'updates media attachments, handles attachments, saves history' do subject.call(status, status.account_id, text: 'Foo', media_ids: [attached_media_attachment.id.to_s]) - end - it 'updates media attachments' do - expect(status.ordered_media_attachments).to eq [attached_media_attachment] - end - - it 'does not detach detached media attachments' do - expect(detached_media_attachment.reload.status_id).to eq status.id - end - - it 'attaches attached media attachments' do - expect(attached_media_attachment.reload.status_id).to eq status.id - end - - it 'saves edit history' do - expect(status.edits.ordered.pluck(:ordered_media_attachment_ids)).to eq [[detached_media_attachment.id], [attached_media_attachment.id]] + expect(status.ordered_media_attachments) + .to eq [attached_media_attachment] + expect(detached_media_attachment.reload.status_id) + .to eq status.id + expect(attached_media_attachment.reload.status_id) + .to eq status.id + expect(status.edits.ordered.pluck(:ordered_media_attachment_ids)) + .to eq [[detached_media_attachment.id], [attached_media_attachment.id]] end end @@ -95,19 +89,18 @@ RSpec.describe UpdateStatusService do before do status.media_attachments << media_attachment + end + + it 'does not detach media attachment, updates description, and saves history' do subject.call(status, status.account_id, text: 'Foo', media_ids: [media_attachment.id.to_s], media_attributes: [{ id: media_attachment.id, description: 'New description' }]) - end - it 'does not detach media attachment' do - expect(media_attachment.reload.status_id).to eq status.id - end - - it 'updates the media attachment description' do - expect(media_attachment.reload.description).to eq 'New description' - end - - it 'saves edit history' do - expect(status.edits.ordered.map { |edit| edit.ordered_media_attachments.map(&:description) }).to eq [['Old description'], ['New description']] + expect(media_attachment.reload) + .to have_attributes( + status_id: status.id, + description: 'New description' + ) + expect(status.edits.ordered.map { |edit| edit.ordered_media_attachments.map(&:description) }) + .to eq [['Old description'], ['New description']] end end @@ -120,28 +113,27 @@ RSpec.describe UpdateStatusService do before do status.update(poll: poll) VoteService.new.call(voter, poll, [0]) + end + + it 'updates poll, resets votes, saves history, requeues notifications' do subject.call(status, status.account_id, text: 'Foo', poll: { options: %w(Bar Baz Foo), expires_in: 5.days.to_i }) - end - it 'updates poll' do poll = status.poll.reload - expect(poll.options).to eq %w(Bar Baz Foo) - end - it 'resets votes' do - poll = status.poll.reload - expect(poll.votes_count).to eq 0 - expect(poll.votes.count).to eq 0 - expect(poll.cached_tallies).to eq [0, 0, 0] - end + expect(poll) + .to have_attributes( + options: %w(Bar Baz Foo), + votes_count: 0, + cached_tallies: [0, 0, 0] + ) + expect(poll.votes.count) + .to eq(0) - it 'saves edit history' do - expect(status.edits.ordered.pluck(:poll_options)).to eq [%w(Foo Bar), %w(Bar Baz Foo)] - end + expect(status.edits.ordered.pluck(:poll_options)) + .to eq [%w(Foo Bar), %w(Bar Baz Foo)] - it 'requeues expiration notification' do - poll = status.poll.reload - expect(PollExpirationNotifyWorker).to have_enqueued_sidekiq_job(poll.id).at(poll.expires_at + 5.minutes) + expect(PollExpirationNotifyWorker) + .to have_enqueued_sidekiq_job(poll.id).at(poll.expires_at + 5.minutes) end end @@ -151,16 +143,13 @@ RSpec.describe UpdateStatusService do let!(:bob) { Fabricate(:account, username: 'bob') } let!(:status) { PostStatusService.new.call(account, text: 'Hello @alice') } - before do + it 'changes mentions and keeps old as silent' do subject.call(status, status.account_id, text: 'Hello @bob') - end - it 'changes mentions' do - expect(status.active_mentions.pluck(:account_id)).to eq [bob.id] - end - - it 'keeps old mentions as silent mentions' do - expect(status.mentions.pluck(:account_id)).to contain_exactly(alice.id, bob.id) + expect(status.active_mentions.pluck(:account_id)) + .to eq [bob.id] + expect(status.mentions.pluck(:account_id)) + .to contain_exactly(alice.id, bob.id) end end @@ -168,11 +157,9 @@ RSpec.describe UpdateStatusService do let!(:account) { Fabricate(:account) } let!(:status) { PostStatusService.new.call(account, text: 'Hello #foo') } - before do - subject.call(status, status.account_id, text: 'Hello #bar') - end - it 'changes tags' do + subject.call(status, status.account_id, text: 'Hello #bar') + expect(status.tags.pluck(:name)).to eq %w(bar) end end From ebdeac0731c31b73438aaa369a234d9ac5798b43 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 4 Oct 2024 10:15:14 -0400 Subject: [PATCH 02/23] Add coverage for missing status scenario in NotificationMailer (#32256) --- app/mailers/notification_mailer.rb | 2 +- spec/mailers/notification_mailer_spec.rb | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 4c374f5d5..a20992dcb 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -86,7 +86,7 @@ class NotificationMailer < ApplicationMailer end def thread_by_conversation! - return if @status.conversation.nil? + return if @status&.conversation.nil? conversation_message_id = "" diff --git a/spec/mailers/notification_mailer_spec.rb b/spec/mailers/notification_mailer_spec.rb index 4c6107d9f..d97c01858 100644 --- a/spec/mailers/notification_mailer_spec.rb +++ b/spec/mailers/notification_mailer_spec.rb @@ -14,6 +14,17 @@ RSpec.describe NotificationMailer do end end + shared_examples 'delivery without status' do + context 'when notification target_status is missing' do + before { allow(notification).to receive(:target_status).and_return(nil) } + + it 'does not deliver mail' do + emails = capture_emails { mail.deliver_now } + expect(emails).to be_empty + end + end + end + let(:receiver) { Fabricate(:user, account_attributes: { username: 'alice' }) } let(:sender) { Fabricate(:account, username: 'bob') } let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') } @@ -37,6 +48,7 @@ RSpec.describe NotificationMailer do end include_examples 'delivery to non functional user' + include_examples 'delivery without status' end describe 'follow' do @@ -75,6 +87,7 @@ RSpec.describe NotificationMailer do end include_examples 'delivery to non functional user' + include_examples 'delivery without status' end describe 'reblog' do @@ -95,6 +108,7 @@ RSpec.describe NotificationMailer do end include_examples 'delivery to non functional user' + include_examples 'delivery without status' end describe 'follow_request' do From 1f720366e94c175f171156a86d65787d6f0d7ba6 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 4 Oct 2024 16:29:23 +0200 Subject: [PATCH 03/23] Fix notification push notifications not including the author's username (#32254) --- app/javascript/mastodon/locales/en.json | 1 + .../mastodon/service_worker/web_push_locales.js | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 1e7874535..7f8dc7477 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Private reply", "notification.label.reply": "Reply", "notification.mention": "Mention", + "notification.mentioned_you": "{name} mentioned you", "notification.moderation-warning.learn_more": "Learn more", "notification.moderation_warning": "You have received a moderation warning", "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.", diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js index 89ae20007..3e39c9a4e 100644 --- a/app/javascript/mastodon/service_worker/web_push_locales.js +++ b/app/javascript/mastodon/service_worker/web_push_locales.js @@ -6,6 +6,12 @@ const fs = require('fs'); const path = require('path'); +const { defineMessages } = require('react-intl'); + +const messages = defineMessages({ + mentioned_you: { id: 'notification.mentioned_you', defaultMessage: '{name} mentioned you' }, +}); + const filtered = {}; const filenames = fs.readdirSync(path.resolve(__dirname, '../locales')); @@ -20,7 +26,7 @@ filenames.forEach(filename => { 'notification.favourite': full['notification.favourite'] || '', 'notification.follow': full['notification.follow'] || '', 'notification.follow_request': full['notification.follow_request'] || '', - 'notification.mention': full['notification.mention'] || '', + 'notification.mention': full[messages.mentioned_you.id] || '', 'notification.reblog': full['notification.reblog'] || '', 'notification.poll': full['notification.poll'] || '', 'notification.status': full['notification.status'] || '', From 51769e06708f79a485c444d139cbdbdd7249b0cb Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 4 Oct 2024 16:55:44 +0200 Subject: [PATCH 04/23] Fix media gallery items having incorrect borders when hidden (#32257) --- app/javascript/mastodon/components/media_gallery.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index 1380d244a..e05997844 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -336,14 +336,14 @@ class MediaGallery extends PureComponent { return (
+ {children} + {(!visible || uncached) && (
{spoilerButton}
)} - {children} - {(visible && !uncached) && (
From c40ab43dc703be988c277d4ba6b7987a3a80e16c Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Fri, 4 Oct 2024 18:23:05 +0200 Subject: [PATCH 05/23] Remove redundant title attribute (#32258) --- .../mastodon/features/ui/components/column_link.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/column_link.jsx b/app/javascript/mastodon/features/ui/components/column_link.jsx index 3386c17f0..f27ed5067 100644 --- a/app/javascript/mastodon/features/ui/components/column_link.jsx +++ b/app/javascript/mastodon/features/ui/components/column_link.jsx @@ -15,7 +15,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text if (href) { return ( - + {active ? activeIconElement : iconElement} {text} {badgeElement} @@ -23,7 +23,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text ); } else { return ( - + {active ? activeIconElement : iconElement} {text} {badgeElement} From 2c54b91dd1a0f0a622ea88628d15c8b1bdda70f7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Oct 2024 08:53:29 +0200 Subject: [PATCH 06/23] Fix wrong width on logo in detailed link card in web UI (#32271) --- app/javascript/styles/mastodon/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 5f410ead9..f25736839 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -10628,6 +10628,7 @@ noscript { gap: 8px; .logo { + width: 16px; height: 16px; color: $darker-text-color; } From 498024558ae8d4111b4c263901dfc105b3563ddc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:06:43 +0200 Subject: [PATCH 07/23] New Crowdin Translations (automated) (#32262) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ca.json | 1 + app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/de.json | 3 +- app/javascript/mastodon/locales/en-GB.json | 5 ++ app/javascript/mastodon/locales/eo.json | 1 + app/javascript/mastodon/locales/es-AR.json | 1 + app/javascript/mastodon/locales/es-MX.json | 11 ++-- app/javascript/mastodon/locales/es.json | 1 + app/javascript/mastodon/locales/fi.json | 1 + app/javascript/mastodon/locales/fo.json | 1 + app/javascript/mastodon/locales/fy.json | 15 +++++ app/javascript/mastodon/locales/gl.json | 1 + app/javascript/mastodon/locales/he.json | 19 +++--- app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/is.json | 4 ++ app/javascript/mastodon/locales/it.json | 6 ++ app/javascript/mastodon/locales/ja.json | 1 + app/javascript/mastodon/locales/ko.json | 1 + app/javascript/mastodon/locales/nl.json | 9 +-- app/javascript/mastodon/locales/nn.json | 1 + app/javascript/mastodon/locales/pl.json | 1 + app/javascript/mastodon/locales/pt-BR.json | 1 + app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/th.json | 1 + app/javascript/mastodon/locales/tr.json | 1 + app/javascript/mastodon/locales/uk.json | 1 + app/javascript/mastodon/locales/vi.json | 1 + app/javascript/mastodon/locales/zh-CN.json | 1 + app/javascript/mastodon/locales/zh-TW.json | 1 + config/locales/activerecord.fy.yml | 6 ++ config/locales/ar.yml | 14 ----- config/locales/be.yml | 14 ----- config/locales/bg.yml | 14 ----- config/locales/ca.yml | 14 ----- config/locales/cs.yml | 14 ----- config/locales/cy.yml | 14 ----- config/locales/da.yml | 48 +++++++++++---- config/locales/de.yml | 48 +++++++++++---- config/locales/devise.eo.yml | 2 + config/locales/doorkeeper.fy.yml | 1 + config/locales/el.yml | 14 ----- config/locales/en-GB.yml | 51 +++++++++++---- config/locales/es-AR.yml | 48 +++++++++++---- config/locales/es-MX.yml | 64 +++++++++++++------ config/locales/es.yml | 48 +++++++++++---- config/locales/et.yml | 14 ----- config/locales/eu.yml | 14 ----- config/locales/fi.yml | 48 +++++++++++---- config/locales/fo.yml | 14 ----- config/locales/fr-CA.yml | 14 ----- config/locales/fr.yml | 14 ----- config/locales/fy.yml | 63 +++++++++++++++---- config/locales/ga.yml | 14 ----- config/locales/gd.yml | 14 ----- config/locales/gl.yml | 48 +++++++++++---- config/locales/he.yml | 72 ++++++++++++++++++---- config/locales/hu.yml | 48 +++++++++++---- config/locales/ia.yml | 14 ----- config/locales/ie.yml | 14 ----- config/locales/io.yml | 14 ----- config/locales/is.yml | 18 ++---- config/locales/it.yml | 48 +++++++++++---- config/locales/ja.yml | 19 ++---- config/locales/ko.yml | 36 +++++++---- config/locales/lad.yml | 14 ----- config/locales/lv.yml | 14 ----- config/locales/ms.yml | 14 ----- config/locales/my.yml | 14 ----- config/locales/nl.yml | 52 +++++++++++----- config/locales/nn.yml | 16 +---- config/locales/no.yml | 14 ----- config/locales/pl.yml | 14 ----- config/locales/pt-BR.yml | 14 ----- config/locales/pt-PT.yml | 14 ----- config/locales/ru.yml | 14 ----- config/locales/simple_form.fy.yml | 3 + config/locales/simple_form.nl.yml | 2 +- config/locales/sl.yml | 14 ----- config/locales/sq.yml | 48 +++++++++++---- config/locales/sr-Latn.yml | 14 ----- config/locales/sr.yml | 14 ----- config/locales/sv.yml | 14 ----- config/locales/th.yml | 14 ----- config/locales/tr.yml | 48 +++++++++++---- config/locales/uk.yml | 14 ----- config/locales/vi.yml | 36 +++++++---- config/locales/zh-CN.yml | 36 +++++++---- config/locales/zh-HK.yml | 14 ----- config/locales/zh-TW.yml | 36 +++++++---- 90 files changed, 788 insertions(+), 761 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index b79ac156e..1b583b320 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Resposta en privat", "notification.label.reply": "Resposta", "notification.mention": "Menció", + "notification.mentioned_you": "{name} us ha mencionat", "notification.moderation-warning.learn_more": "Per a saber-ne més", "notification.moderation_warning": "Heu rebut un avís de moderació", "notification.moderation_warning.action_delete_statuses": "S'han eliminat algunes de les vostres publicacions.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 659f807d0..e225bb30a 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Privat svar", "notification.label.reply": "Besvar", "notification.mention": "Omtale", + "notification.mentioned_you": "{name} nævnte dig", "notification.moderation-warning.learn_more": "Læs mere", "notification.moderation_warning": "Du er tildelt en moderationsadvarsel", "notification.moderation_warning.action_delete_statuses": "Nogle af dine indlæg er blevet fjernet.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 0b541b2e4..3d8b57db4 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -62,7 +62,7 @@ "account.requested_follow": "{name} möchte dir folgen", "account.share": "Profil von @{name} teilen", "account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen", - "account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}", + "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}", "account.unblock": "Blockierung von @{name} aufheben", "account.unblock_domain": "Blockierung von {domain} aufheben", "account.unblock_short": "Blockierung aufheben", @@ -516,6 +516,7 @@ "notification.label.private_reply": "Private Antwort", "notification.label.reply": "Antwort", "notification.mention": "Erwähnung", + "notification.mentioned_you": "{name} erwähnte dich", "notification.moderation-warning.learn_more": "Mehr erfahren", "notification.moderation_warning": "Du wurdest von den Moderator*innen verwarnt", "notification.moderation_warning.action_delete_statuses": "Einige deiner Beiträge sind entfernt worden.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index b1d61ddd3..da4c00520 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -852,6 +852,11 @@ "upload_error.poll": "File upload not allowed with polls.", "upload_form.audio_description": "Describe for people who are deaf or hard of hearing", "upload_form.description": "Describe for people who are blind or have low vision", + "upload_form.drag_and_drop.instructions": "To pick up a media attachment, press space or enter. While dragging, use the arrow keys to move the media attachment in any given direction. Press space or enter again to drop the media attachment in its new position, or press escape to cancel.", + "upload_form.drag_and_drop.on_drag_cancel": "Dragging was cancelled. Media attachment {item} was dropped.", + "upload_form.drag_and_drop.on_drag_end": "Media attachment {item} was dropped.", + "upload_form.drag_and_drop.on_drag_over": "Media attachment {item} was moved.", + "upload_form.drag_and_drop.on_drag_start": "Picked up media attachment {item}.", "upload_form.edit": "Edit", "upload_form.thumbnail": "Change thumbnail", "upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 35c2a5c74..5f6582fb6 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Privata respondo", "notification.label.reply": "Respondi", "notification.mention": "Mencii", + "notification.mentioned_you": "{name} menciis vin", "notification.moderation-warning.learn_more": "Lerni pli", "notification.moderation_warning": "Vi ricevis moderigan averton", "notification.moderation_warning.action_delete_statuses": "Kelkaj el viaj afiŝoj estis forigitaj.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 609175d94..7fec88a96 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Respuesta privada", "notification.label.reply": "Respuesta", "notification.mention": "Mención", + "notification.mentioned_you": "{name} te mencionó", "notification.moderation-warning.learn_more": "Aprendé más", "notification.moderation_warning": "Recibiste una advertencia de moderación", "notification.moderation_warning.action_delete_statuses": "Se eliminaron algunos de tus mensajes.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 7c2e40033..ddfdf6960 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Respuesta privada", "notification.label.reply": "Respuesta", "notification.mention": "Mención", + "notification.mentioned_you": "{name} te ha mencionado", "notification.moderation-warning.learn_more": "Saber más", "notification.moderation_warning": "Has recibido una advertencia de moderación", "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.", @@ -852,11 +853,11 @@ "upload_error.poll": "Subida de archivos no permitida con encuestas.", "upload_form.audio_description": "Describir para personas con problemas auditivos", "upload_form.description": "Describir para los usuarios con dificultad visual", - "upload_form.drag_and_drop.instructions": "Para recoger un archivo multimedia, pulsa la barra espaciadora o la tecla Enter. Mientras arrastras, utiliza las teclas de flecha para mover el archivo multimedia en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Enter para soltar el archivo multimedia en su nueva posición, o pulsa Escape para cancelar.", - "upload_form.drag_and_drop.on_drag_cancel": "Se canceló el arrastre. Se eliminó el archivo adjunto {item}.", - "upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} ha sido eliminado.", - "upload_form.drag_and_drop.on_drag_over": "El archivo adjunto {item} se ha movido.", - "upload_form.drag_and_drop.on_drag_start": "Se ha recogido el archivo adjunto {item}.", + "upload_form.drag_and_drop.instructions": "Para recoger un archivo adjunto, pulsa la barra espaciadora o la tecla Intro. Mientras arrastras, usa las teclas de flecha para mover el archivo adjunto en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Intro para soltar el archivo adjunto en su nueva posición, o pulsa la tecla Escape para cancelar.", + "upload_form.drag_and_drop.on_drag_cancel": "Arrastre cancelado. El archivo adjunto {item} fue eliminado.", + "upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} fue eliminado.", + "upload_form.drag_and_drop.on_drag_over": "El archivo adjunto {item} fue movido.", + "upload_form.drag_and_drop.on_drag_start": "Recogidos los archivos adjuntos {item}.", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar miniatura", "upload_form.video_description": "Describir para personas con problemas auditivos o visuales", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index b84148933..2aeb7d47e 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Respuesta privada", "notification.label.reply": "Respuesta", "notification.mention": "Mención", + "notification.mentioned_you": "{name} te ha mencionado", "notification.moderation-warning.learn_more": "Saber más", "notification.moderation_warning": "Has recibido una advertencia de moderación", "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 2e4cd661d..ac7ab097f 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Yksityinen vastaus", "notification.label.reply": "Vastaus", "notification.mention": "Maininta", + "notification.mentioned_you": "{name} mainitsi sinut", "notification.moderation-warning.learn_more": "Lue lisää", "notification.moderation_warning": "Olet saanut moderointivaroituksen", "notification.moderation_warning.action_delete_statuses": "Julkaisujasi on poistettu.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index c7e752d37..5ad8ba557 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Privat svar", "notification.label.reply": "Svara", "notification.mention": "Umrøð", + "notification.mentioned_you": "{name} nevndi teg", "notification.moderation-warning.learn_more": "Lær meira", "notification.moderation_warning": "Tú hevur móttikið eina umsjónarávaring", "notification.moderation_warning.action_delete_statuses": "Onkrir av tínum postum eru strikaðir.", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 1d71ef36c..9fa2300fb 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -85,6 +85,7 @@ "alert.rate_limited.title": "Dataferkear beheind", "alert.unexpected.message": "Der is in ûnferwachte flater bard.", "alert.unexpected.title": "Oepsy!", + "alt_text_badge.title": "Alternative tekst", "announcement.announcement": "Oankundiging", "attachments_list.unprocessed": "(net ferwurke)", "audio.hide": "Audio ferstopje", @@ -221,6 +222,8 @@ "domain_block_modal.they_cant_follow": "Net ien op dizze server kin jo folgje.", "domain_block_modal.they_wont_know": "Se krije net te witten dat se blokkearre wurde.", "domain_block_modal.title": "Domein blokkearje?", + "domain_block_modal.you_will_lose_num_followers": "Jo ferlieze {followersCount, plural, one {{followersCountDisplay} folger} other {{followersCountDisplay} folgers}} en {followingCount, plural, one {{followingCountDisplay} persoan dy’t jo folgje} other {{followingCountDisplay} persoanen dy’t jo folgje}}.", + "domain_block_modal.you_will_lose_relationships": "Jo ferlieze alle folgers en minsken dy’t jo folgje fan dizze server.", "domain_block_modal.you_wont_see_posts": "Jo sjogge gjin berjochten of meldingen mear fan brûkers op dizze server.", "domain_pill.activitypub_lets_connect": "It soarget derfoar dat jo net allinnich mar ferbine en kommunisearje kinne mei minsken op Mastodon, mar ek mei oare sosjale apps.", "domain_pill.activitypub_like_language": "ActivityPub is de taal dy’t Mastodon mei oare sosjale netwurken sprekt.", @@ -433,6 +436,8 @@ "lightbox.close": "Slute", "lightbox.next": "Folgjende", "lightbox.previous": "Foarige", + "lightbox.zoom_in": "Oarspronklike grutte toane", + "lightbox.zoom_out": "Passend toane", "limited_account_hint.action": "Profyl dochs besjen", "limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.", "link_preview.author": "Troch {name}", @@ -454,6 +459,7 @@ "lists.subheading": "Jo listen", "load_pending": "{count, plural, one {# nij item} other {# nije items}}", "loading_indicator.label": "Lade…", + "media_gallery.hide": "Ferstopje", "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.", "mute_modal.hide_from_notifications": "Meldingen ferstopje", "mute_modal.hide_options": "Opsjes ferstopje", @@ -510,6 +516,7 @@ "notification.label.private_reply": "Priveereaksje", "notification.label.reply": "Beäntwurdzje", "notification.mention": "Fermelding", + "notification.mentioned_you": "{name} hat dy fermeld", "notification.moderation-warning.learn_more": "Mear ynfo", "notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen", "notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.", @@ -774,6 +781,7 @@ "status.bookmark": "Blêdwizer tafoegje", "status.cancel_reblog_private": "Net langer booste", "status.cannot_reblog": "Dit berjocht kin net boost wurde", + "status.continued_thread": "Ferfolgje it petear", "status.copy": "Copy link to status", "status.delete": "Fuortsmite", "status.detailed_status": "Detaillearre petearoersjoch", @@ -782,6 +790,7 @@ "status.edit": "Bewurkje", "status.edited": "Lêst bywurke op {date}", "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke", + "status.embed": "Koade om op te nimmen", "status.favourite": "Favoryt", "status.favourites": "{count, plural, one {favoryt} other {favoriten}}", "status.filter": "Dit berjocht filterje", @@ -806,6 +815,7 @@ "status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.", "status.redraft": "Fuortsmite en opnij opstelle", "status.remove_bookmark": "Blêdwizer fuortsmite", + "status.replied_in_thread": "Antwurde yn petear", "status.replied_to": "Antwurde op {name}", "status.reply": "Beäntwurdzje", "status.replyAll": "Alle beäntwurdzje", @@ -843,6 +853,11 @@ "upload_error.poll": "It opladen fan bestannen is yn enkêten net tastien.", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", + "upload_form.drag_and_drop.instructions": "Druk op spaasje of Enter om in mediabylage op te pakken. Bruk de pylktoetsen om de bylage yn in bepaalde rjochting te ferpleatsen. Druk opnij op de spaasjebalke of Enter om de mediabylage op de nije posysje te pleatsen, of druk op Esc om te annulearjen.", + "upload_form.drag_and_drop.on_drag_cancel": "Slepen is annulearre. Mediabylage {item} is net ferpleatst.", + "upload_form.drag_and_drop.on_drag_end": "Mediabylage {item} is net ferpleatst.", + "upload_form.drag_and_drop.on_drag_over": "Mediabylage {item} is ferpleatst.", + "upload_form.drag_and_drop.on_drag_start": "Mediabylage {item} is oppakt.", "upload_form.edit": "Bewurkje", "upload_form.thumbnail": "Miniatuerôfbylding wizigje", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 2a31bfa46..27b4ad246 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Resposta privada", "notification.label.reply": "Resposta", "notification.mention": "Mención", + "notification.mentioned_you": "{name} mencionoute", "notification.moderation-warning.learn_more": "Saber máis", "notification.moderation_warning": "Recibiches unha advertencia da moderación", "notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 16f558e54..d9b0382f4 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,5 +1,5 @@ { - "about.blocks": "שרתים שנחסמו על ידי המנהלים", + "about.blocks": "שרתים מוגבלים", "about.contact": "יצירת קשר:", "about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "הסיבה אינה זמינה", @@ -34,9 +34,9 @@ "account.follow_back": "לעקוב בחזרה", "account.followers": "עוקבים", "account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.", - "account.followers_counter": "{count, plural,one {עוקב אחד} other {{count} עוקבים}}", + "account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}", "account.following": "נעקבים", - "account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {count}}}", + "account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {counter}}}", "account.follows.empty": "משתמש זה עדיין לא עוקב אחרי אף אחד.", "account.go_to_profile": "מעבר לפרופיל", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}", @@ -62,7 +62,7 @@ "account.requested_follow": "{name} ביקשו לעקוב אחריך", "account.share": "שתף את הפרופיל של @{name}", "account.show_reblogs": "הצג הדהודים מאת @{name}", - "account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}", + "account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", "account.unblock": "להסיר חסימה ל- @{name}", "account.unblock_domain": "הסירי את החסימה של קהילת {domain}", "account.unblock_short": "הסר חסימה", @@ -349,9 +349,9 @@ "hashtag.column_settings.tag_mode.any": "לפחות אחד מאלה", "hashtag.column_settings.tag_mode.none": "אף אחד מאלה", "hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה", - "hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{count} משתתפיםות}}", - "hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}", - "hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}} היום", + "hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{counter} משתתפיםות}}", + "hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", + "hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}} היום", "hashtag.follow": "לעקוב אחרי תגית", "hashtag.unfollow": "להפסיק לעקוב אחרי תגית", "hashtags.and_other": "…{count, plural,other {ועוד #}}", @@ -442,7 +442,7 @@ "limited_account_hint.title": "פרופיל המשתמש הזה הוסתר על ידי המנחים של {domain}.", "link_preview.author": "מאת {name}", "link_preview.more_from_author": "עוד מאת {name}", - "link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}", + "link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", "lists.account.add": "הוסף לרשימה", "lists.account.remove": "הסר מרשימה", "lists.delete": "מחיקת רשימה", @@ -516,6 +516,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": "חלק מהודעותיך הוסרו.", @@ -840,7 +841,7 @@ "time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}", "time_remaining.moments": "רגעים נותרו", "time_remaining.seconds": "נותרו {number, plural, one {# שניה} other {# שניות}}", - "trends.counter_by_accounts": "{count, plural, one {אדם אחד} other {{count} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}", + "trends.counter_by_accounts": "{count, plural, one {אדם אחד} other {{counter} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}", "trends.trending_now": "נושאים חמים", "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", "units.short.billion": "{count} מליארד", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f9f403177..0fee79f8b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Privát válasz", "notification.label.reply": "Válasz", "notification.mention": "Említés", + "notification.mentioned_you": "{name} megemlített", "notification.moderation-warning.learn_more": "További információ", "notification.moderation_warning": "Moderációs figyelmeztetést kaptál", "notification.moderation_warning.action_delete_statuses": "Néhány bejegyzésedet eltávolították.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index c78c5d784..bbd3a7a35 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -85,6 +85,7 @@ "alert.rate_limited.title": "Með takmörkum", "alert.unexpected.message": "Upp kom óvænt villa.", "alert.unexpected.title": "Úbbs!", + "alt_text_badge.title": "Hjálpartexti mynda", "announcement.announcement": "Auglýsing", "attachments_list.unprocessed": "(óunnið)", "audio.hide": "Fela hljóð", @@ -433,6 +434,8 @@ "lightbox.close": "Loka", "lightbox.next": "Næsta", "lightbox.previous": "Fyrra", + "lightbox.zoom_in": "Renna að raunstærð", + "lightbox.zoom_out": "Renna að svo passi", "limited_account_hint.action": "Birta notandasniðið samt", "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum {domain}.", "link_preview.author": "Frá {name}", @@ -511,6 +514,7 @@ "notification.label.private_reply": "Einkasvar", "notification.label.reply": "Svara", "notification.mention": "Minnst á", + "notification.mentioned_you": "{name} minntist á þig", "notification.moderation-warning.learn_more": "Kanna nánar", "notification.moderation_warning": "Þú hefur fengið aðvörun frá umsjónarmanni", "notification.moderation_warning.action_delete_statuses": "Sumar færslurnar þínar hafa verið fjarlægðar.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index ef709516c..885be73c6 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Rispondi in privato", "notification.label.reply": "Rispondi", "notification.mention": "Menziona", + "notification.mentioned_you": "{name} ti ha menzionato", "notification.moderation-warning.learn_more": "Scopri di più", "notification.moderation_warning": "Hai ricevuto un avviso di moderazione", "notification.moderation_warning.action_delete_statuses": "Alcuni dei tuoi post sono stati rimossi.", @@ -852,6 +853,11 @@ "upload_error.poll": "Caricamento del file non consentito con i sondaggi.", "upload_form.audio_description": "Descrizione per persone con deficit uditivi", "upload_form.description": "Descrizione per ipovedenti", + "upload_form.drag_and_drop.instructions": "Per selezionare un allegato multimediale, premi Spazio o Invio. Mentre trascini, usa i tasti con le frecce per spostare l'allegato multimediale in una qualsiasi direzione. Premi di nuovo Spazio o Invio per rilasciare l'allegato multimediale nella sua nuova posizione, oppure premi Esc per annullare.", + "upload_form.drag_and_drop.on_drag_cancel": "Il trascinamento è stato annullato. L'allegato multimediale {item} è stato eliminato.", + "upload_form.drag_and_drop.on_drag_end": "L'allegato multimediale {item} è stato eliminato.", + "upload_form.drag_and_drop.on_drag_over": "L'allegato multimediale {item} è stato spostato.", + "upload_form.drag_and_drop.on_drag_start": "L'allegato multimediale {item} è stato ricevuto.", "upload_form.edit": "Modifica", "upload_form.thumbnail": "Cambia la miniatura", "upload_form.video_description": "Descrizione per persone con deficit uditivi o ipovedenti", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 46444863a..1810314c8 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -514,6 +514,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": "あなたによるいくつかの投稿が削除されました。", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index e5e7dc2c1..edcbadd12 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -516,6 +516,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": "게시물 몇 개가 삭제되었습니다.", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 71523b37d..c0ca8f176 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -516,10 +516,11 @@ "notification.label.private_reply": "Privéreactie", "notification.label.reply": "Reactie", "notification.mention": "Vermelding", + "notification.mentioned_you": "Je bent vermeld door {name}", "notification.moderation-warning.learn_more": "Meer informatie", "notification.moderation_warning": "Je hebt een moderatie-waarschuwing ontvangen", "notification.moderation_warning.action_delete_statuses": "Sommige van je berichten zijn verwijderd.", - "notification.moderation_warning.action_disable": "Je account is uitgeschakeld.", + "notification.moderation_warning.action_disable": "Jouw account is uitgeschakeld.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Sommige van je berichten zijn gemarkeerd als gevoelig.", "notification.moderation_warning.action_none": "Jouw account heeft een moderatie-waarschuwing ontvangen.", "notification.moderation_warning.action_sensitive": "Je berichten worden vanaf nu als gevoelig gemarkeerd.", @@ -531,11 +532,11 @@ "notification.reblog.name_and_others_with_link": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben jouw bericht geboost", "notification.relationships_severance_event": "Verloren verbindingen met {name}", "notification.relationships_severance_event.account_suspension": "Een beheerder van {from} heeft {target} geschorst, wat betekent dat je geen updates meer van hen kunt ontvangen of met hen kunt communiceren.", - "notification.relationships_severance_event.domain_block": "Een beheerder van {from} heeft {target} geblokkeerd, inclusief {followersCount} van jouw volgers en {followingCount, plural, one {# account} other {# accounts}} die jij volgt.", + "notification.relationships_severance_event.domain_block": "Een beheerder van {from} heeft {target} geblokkeerd, inclusief {followersCount} van jouw volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt.", "notification.relationships_severance_event.learn_more": "Meer informatie", - "notification.relationships_severance_event.user_domain_block": "Je hebt {target} geblokkeerd, waarmee je {followersCount} van je volgers en {followingCount, plural, one {# account} other {# accounts}} die jij volgt, bent verloren.", + "notification.relationships_severance_event.user_domain_block": "Je hebt {target} geblokkeerd, waarmee je {followersCount} van je volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt, bent verloren.", "notification.status": "{name} heeft zojuist een bericht geplaatst", - "notification.update": "{name} heeft een bericht bewerkt", + "notification.update": "{name} bewerkte een bericht", "notification_requests.accept": "Accepteren", "notification_requests.accept_multiple": "{count, plural, one {# verzoek accepteren…} other {# verzoeken accepteren…}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Verzoek accepteren} other {Verzoeken accepteren}}", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 69883a549..58ed018ba 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Privat svar", "notification.label.reply": "Svar", "notification.mention": "Omtale", + "notification.mentioned_you": "{name} nemnde deg", "notification.moderation-warning.learn_more": "Lær meir", "notification.moderation_warning": "Du har mottatt ei moderasjonsåtvaring", "notification.moderation_warning.action_delete_statuses": "Nokre av innlegga dine har blitt fjerna.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 4dc74db8c..c6555ebb7 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Odpowiedź prywatna", "notification.label.reply": "Odpowiedź", "notification.mention": "Wzmianka", + "notification.mentioned_you": "{name} wspomniał(a) o Tobie", "notification.moderation-warning.learn_more": "Dowiedz się więcej", "notification.moderation_warning": "Otrzymałeś/-łaś ostrzeżenie moderacyjne", "notification.moderation_warning.action_delete_statuses": "Niektóre twoje wpisy zostały usunięte.", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index ab5701cde..b6d2fe112 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Resposta privada", "notification.label.reply": "Resposta", "notification.mention": "Menção", + "notification.mentioned_you": "{name} te mencionou", "notification.moderation-warning.learn_more": "Aprender mais", "notification.moderation_warning": "Você recebeu um aviso de moderação", "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 15101be47..182f01887 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Përgjigje private", "notification.label.reply": "Përgjigje", "notification.mention": "Përmendje", + "notification.mentioned_you": "{name} ju ka përmendur", "notification.moderation-warning.learn_more": "Mësoni më tepër", "notification.moderation_warning": "Ju është dhënë një sinjalizim moderimi", "notification.moderation_warning.action_delete_statuses": "Disa nga postimet tuaja janë hequr.", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index b1e5a95ed..298852100 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -506,6 +506,7 @@ "notification.label.private_reply": "Privata svar", "notification.label.reply": "Svar", "notification.mention": "Nämn", + "notification.mentioned_you": "{name} nämnde dig", "notification.moderation-warning.learn_more": "Läs mer", "notification.moderation_warning": "Du har fått en moderationsvarning", "notification.moderation_warning.action_delete_statuses": "Några av dina inlägg har tagits bort.", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 160b6ec4e..88c48bfb4 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -512,6 +512,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": "เอาโพสต์บางส่วนของคุณออกแล้ว", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 36c0b68f0..937b3e8e1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Özel yanıt", "notification.label.reply": "Yanıt", "notification.mention": "Bahsetme", + "notification.mentioned_you": "{name} sizden söz etti", "notification.moderation-warning.learn_more": "Daha fazlası", "notification.moderation_warning": "Hesabınız bir denetim uyarısı aldı", "notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index a48b071f5..5a9d388f0 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -516,6 +516,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": "Деякі з ваших дописів було вилучено.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 770dcbaef..cf33a15d3 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -516,6 +516,7 @@ "notification.label.private_reply": "Trả lời riêng", "notification.label.reply": "Trả lời", "notification.mention": "Lượt nhắc", + "notification.mentioned_you": "{name} nhắc đến bạn", "notification.moderation-warning.learn_more": "Tìm hiểu", "notification.moderation_warning": "Bạn vừa nhận một cảnh báo kiểm duyệt", "notification.moderation_warning.action_delete_statuses": "Một vài tút của bạn bị gỡ.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 0a4505d4e..74702e512 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -516,6 +516,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": "你的一些嘟文已被移除。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 2047a69f4..e93f7d518 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -516,6 +516,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": "某些您的嘟文已被刪除。", diff --git a/config/locales/activerecord.fy.yml b/config/locales/activerecord.fy.yml index b571ab60d..69139eba1 100644 --- a/config/locales/activerecord.fy.yml +++ b/config/locales/activerecord.fy.yml @@ -15,6 +15,12 @@ fy: user/invite_request: text: Reden errors: + attributes: + domain: + invalid: is in ûnjildige domeinnamme + messages: + invalid_domain_on_line: "%{value} is in ûnjildige domeinnamme" + too_many_lines: giet oer de limyt fan %{limit} rigels models: account: attributes: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 829855776..1a6f0da8c 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1394,20 +1394,6 @@ ar: merge_long: الإبقاء علي التسجيلات الحالية وإضافة الجديدة overwrite: إعادة الكتابة overwrite_long: استبدال التسجيلات الحالية بالجديدة - overwrite_preambles: - blocking_html: أنت على وشك استبدال قائمة الحظر بما يصل إلى %{total_items} من الحسابات من %{filename}. - bookmarks_html: أنت على وشك استبدال إشاراتك المرجعية بما يصل إلى %{total_items} من المشاركات من %{filename}. - domain_blocking_html: أنت على وشك إرشاداتك المرجعية بما يصل إلى %{total_items} من المشاركات من %{filename}. - following_html: أنت على وشك متابعة ما يصل إلى %{total_items} من الحسابات من %{filename} والتوقف عن متابعة أي شخص آخر. - lists_html: إنّك بصدد استبدال قوائمك بمحتوى مِلَفّ %{filename}. ما يُقارِب %{total_items} حسابًا سوف تُضاف إلى قوائم جديدة. - muting_html: أنت على وشك استبدال قائمة الحسابات الصامتة بما يصل إلى %{total_items} من الحسابات من %{filename}. - preambles: - blocking_html: أنت على وشك حظر ما يصل إلى %{total_items} من الحسابات من %{filename}. - bookmarks_html: أنت على وشك إضافة ما يصل إلى %{total_items} من المشاركات من %{filename} إلى إشاراتك المرجعية. - domain_blocking_html: أنت على وشك حظر ما يصل إلى %{total_items} من النطاقات من %{filename}. - following_html: أنت على وشك متابعة ما يصل إلى %{total_items} من الحسابات من %{filename}. - lists_html: أنت على وشك إضافة ما يصل إلى %{total_items} حسابات من %{filename} إلى قوائمك. سيتم إنشاء قوائم جديدة في حالة عدم وجود قائمة للإضافة إليها. - muting_html: أنت على وشك تجاهل ما يصل إلى %{total_items} من الحسابات من %{filename}. preface: بإمكانك استيراد بيانات قد قُمتَ بتصديرها مِن مثيل خادم آخَر، كقوائم المستخدِمين الذين كنتَ تتابِعهم أو قُمتَ بحظرهم. recent_imports: الاستيرادات الحديثة states: diff --git a/config/locales/be.yml b/config/locales/be.yml index d1d3e1767..b627672b2 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1391,20 +1391,6 @@ be: merge_long: Захаваць існуючыя запісы і дадаць новыя overwrite: Перазапісаць overwrite_long: Замяніць бягучыя запісы на новыя - overwrite_preambles: - blocking_html: Вы збіраецеся замяніць свой спіс блакіровак на %{total_items} уліковых запісаў з файла %{filename}. - bookmarks_html: Вы збіраецеся замяніць свае закладкі на %{total_items} допісаў з файла %{filename}. - domain_blocking_html: Вы збіраецеся замяніць свой спіс блакіроўкі даменаў на %{total_items} даменаў з файла %{filename}. - following_html: Вы збіраецеся падпісацца на %{total_items} уліковых запісаў з файла %{filename} і адпісацца ад усіх іншых карыстальнікаў. - lists_html: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. Да %{total_items} уліковых запісаў будуць дададзены ў новыя спісы. - muting_html: Вы збіраецеся замяніць свой спіс ігнараваных уліковых запісаў на %{total_items} уліковых запісаў з файла %{filename}. - preambles: - blocking_html: Вы збіраецеся заблакіраваць да %{total_items} уліковых запісаў з файла%{filename}. - bookmarks_html: Вы збіраецеся дадаць да %{total_items} паведамленняў з файла %{filename} у вашы закладкі. - domain_blocking_html: Вы збіраецеся заблакіраваць да %{total_items} даменаў з файла %{filename}. - following_html: Вы збіраецеся падпісацца на%{total_items} уліковых запісаў з файла %{filename}. - lists_html: Вы збіраецеся дадаць да %{total_items} уліковых запісаў з %{filename} у вашы спісы. Новыя спісы будуць створаны, калі іх няма. - muting_html: Вы збіраецеся ігнараваць да %{total_items} уліковых запісаў з файла %{filename}. preface: Вы можаце імпартаваць даныя, экспартаваныя вамі з іншага сервера, напрыклад, спіс людзей, на якіх вы падпісаны або якіх блакуеце. recent_imports: Нядаўнія імпарты states: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 00b3a4116..1fdd0e353 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1300,20 +1300,6 @@ bg: merge_long: Пази текущите записи и добавя нови overwrite: Презаписване overwrite_long: Заменя текущите записи с новите - overwrite_preambles: - blocking_html: На път сте да замените списъка си с блокирани с до %{total_items} акаунта от %{filename}. - bookmarks_html: На път сте да замените списъка си с отметки с до %{total_items} публикации от %{filename}. - domain_blocking_html: На път сте да замените списъка си с блокирани домейни с до %{total_items} домейна от %{filename}. - following_html: На път сте да последвате до %{total_items} акаунта от %{filename} и да спрете да следвате някой друг. - lists_html: На път сте да замените списъците си със съдържание от %{filename}. До %{total_items} акаунта ще се добавят към новите списъци. - muting_html: На път сте да замените списъка си със заглушени акаунти с до %{total_items} акаунта от %{filename}. - preambles: - blocking_html: На път сте да блокирате до %{total_items} акаунта от %{filename}. - bookmarks_html: На път сте да добавите до %{total_items} публикации от %{filename} в отметките си. - domain_blocking_html: На път сте да блокирате до %{total_items} домейна от %{filename}. - following_html: На път сте да последвате до %{total_items} акаунта от %{filename}. - lists_html: На път сте да добавите до %{total_items} акаунта от %{filename} към вашите списъци. Нови списъци ще се сътворят, ако няма списъци за добавяне. - muting_html: На път сте да заглушите до %{total_items} акаунта от %{filename}. preface: Можеш да импортираш някои данни, като например всички хора, които следваш или блокираш в акаунта си на тази инстанция, от файлове, създадени чрез експорт в друга инстанция. recent_imports: Скорошни внасяния states: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index ced8de4ef..bb81aaa59 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1365,20 +1365,6 @@ ca: merge_long: Mantenir els registres existents i afegir-ne de nous overwrite: Sobreescriu overwrite_long: Reemplaça els registres actuals amb els nous - overwrite_preambles: - blocking_html: Ets a punt per a reemplaçar la teva llista de bloquejos de fins a %{total_items} comptes des de %{filename}. - bookmarks_html: Ets a punt de reemplaçar els teus marcadors de fins a %{total_items} tuts des de %{filename}. - domain_blocking_html: Ets a punt de reemplaçar la teva llista de dominis bloquejats de fins a %{total_items} dominis des de %{filename}. - following_html: Ets a punt de seguir fins a %{total_items} comptes des de %{filename} i deixar de seguir a la resta. - lists_html: Estàs a punt de reemplaçar les teves llistes amb contactes de %{filename}. S'afegiran fins a %{total_items} comptes a les noves llistes. - muting_html: Ets a punt de reemplaçar la teva llista de comptes silenciats de fins a %{total_items} comptes des de %{filename}. - preambles: - blocking_html: Ets a punt de bloquejar fins a %{total_items} comptes des de %{filename}. - bookmarks_html: Ets a punt d'afegir fins a %{total_items} tuts des de %{filename} als teus marcadors. - domain_blocking_html: Ets a punt de bloquejar fins a %{total_items} dominis des de %{filename}. - following_html: Ets a punt de seguir fins a %{total_items} comptes des de %{filename}. - lists_html: Estàs a punt d'afegir %{total_items} comptes de %{filename} a les teves llistes. Es crearan noves llistes si no hi ha cap llista on afegir-los. - muting_html: Ets a punt de silenciar fins a %{total_items} comptes des de %{filename}. preface: Pots importar algunes les dades que has exportat des d'un altre servidor, com ara el llistat de les persones que estàs seguint o bloquejant. recent_imports: Importacions recents states: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 91fa51794..15211b928 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1348,20 +1348,6 @@ cs: merge_long: Ponechat existující záznamy a přidat nové overwrite: Přepsat overwrite_long: Nahradit aktuální záznamy novými - overwrite_preambles: - blocking_html: Chystáte se nahradit váš seznam bloků s %{total_items} účtami od %{filename}. - bookmarks_html: Chystáte se nahradit své záložky s %{total_items} příspěvků z %{filename}. - domain_blocking_html: Chystáte se nahradit seznam stránek s %{total_items} stránek z %{filename}. - following_html: Chystáte se sledovat%{total_items} účtů z %{filename} a přestanete sledovat všechny ostatní. - lists_html: Chystáte se nahradit své seznamy obsahem %{filename}. Až %{total_items} účtů budou přidány do nových seznamů. - muting_html: Chystáte se nahradit seznam skrytých účtů s %{total_items} účtami z %{filename}. - preambles: - blocking_html: Chystáte se blokovat%{total_items} účtů z %{filename}. - bookmarks_html: Chystáte se přidat až %{total_items} příspěvků z %{filename} do vašich záložek. - domain_blocking_html: Chystáte se blokovat%{total_items} stránek z %{filename}. - following_html: Chystáte se sledovat%{total_items} účtů z %{filename}. - lists_html: Chystáte se přidat %{total_items} účtů z %{filename} do vaších seznamů. Nové seznamy budou vytvořeny, pokud neexistuje žádný seznam, do kterého by bylo možné přidat. - muting_html: Chystáte se skrýt%{total_items} účtů z %{filename}. preface: Můžete importovat data, která jste exportovali z jiného serveru, jako například seznam lidí, které sledujete či blokujete. recent_imports: Nedávné importy states: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a70d08ed8..d57ef3869 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1465,20 +1465,6 @@ cy: merge_long: Cadw'r cofnodion presennol ac ychwanegu rhai newydd overwrite: Trosysgrifio overwrite_long: Amnewid y cofnodion cyfredol gyda'r rhai newydd - overwrite_preambles: - blocking_html: Rydych ar fin amnewid eich rhestr rhwystro gyda hyd at %{total_items} o gyfrifon o %{filename} . - bookmarks_html: Rydych ar fin amnewid eich nodau tudalen gyda hyd at %{total_items} o bostiadau gan %{filename} . - domain_blocking_html: Rydych ar fin amnewid eich rhestr rhwystro parth gyda hyd at %{total_items} parth o %{filename} . - following_html: Rydych ar fin dilyn hyd at %{total_items} o gyfrifon o %{filename} a pheidio a ddilyn unrhyw un arall . - lists_html: Rydych ar fin amnewid eich rhestrau gyda chynnwys %{filename} . Bydd hyd at %{total_items} o gyfrifon yn cael eu hychwanegu at restrau newydd. - muting_html: Rydych ar fin amnewid eich rhestr o gyfrifon tawel gyda hyd at %{total_items} o gyfrifon o %{filename} . - preambles: - blocking_html: Rydych ar fin rhwystro hyd at %{total_items} o gyfrifon o %{filename} . - bookmarks_html: Rydych ar fin ychwanegu hyd at %{total_items} o bostiadau o %{filename} at eich nodau tudalen . - domain_blocking_html: Rydych ar fin rhwystro hyd at %{total_items} parth o %{filename} . - following_html: Rydych ar fin dilyn hyd at %{total_items} cyfrif gan %{filename} . - lists_html: Rydych ar fin ychwanegu hyd at %{total_items} o gyfrifon o %{filename} at eich rhestrau . Bydd rhestrau newydd yn cael eu creu os nad oes rhestr i ychwanegu ati. - muting_html: Rydych ar fin anwybyddu hyd at %{total_items} cyfrif o %{filename}. preface: Gallwch fewnforio data rydych chi wedi'i allforio o weinydd arall, fel rhestr o'r bobl rydych chi'n eu dilyn neu'n eu blocio. recent_imports: Mewnforion diweddar states: diff --git a/config/locales/da.yml b/config/locales/da.yml index 0da901d4a..1f80503e9 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1366,19 +1366,43 @@ da: overwrite: Overskriv overwrite_long: Erstat aktuelle poster med de nye overwrite_preambles: - blocking_html: Du er ved at erstatte bloklisten med op til %{total_items} konti fra %{filename}. - bookmarks_html: Du er ved at erstatte bogmærkelisten med op til %{total_items} emner fra %{filename}. - domain_blocking_html: Du er ved at erstatte domæneblokeringslisten med op til %{total_items} domæner fra %{filename}. - following_html: Du er ved at følge op til %{total_items} konti fra %{filename} og stoppe med at følge alle andre. - lists_html: Du er ved at erstatte dine lister med indholdet af %{filename}. Op til %{total_items} konti tilføjes nye lister. - muting_html: Du er ved at erstatte listen over tavsgjorte konti med op til %{total_items} konti fra %{filename}. + blocking_html: + one: Man er ved at erstatte sin sortliste med %{count} konto fra %{filename}. + other: Man er ved at erstatte sin sortliste med optil %{count} konti fra %{filename}. + bookmarks_html: + one: Man er ved at erstatte sine bogmærker med %{count} post fra %{filename}. + other: Man er ved at erstatte sine bogmærker med op til %{count} poster fra %{filename}. + domain_blocking_html: + one: Man er ved at erstatte sin domænesortliste med %{count} domæne fra %{filename}. + other: Man er ved at erstatte sin domænesortliste med op til %{count} domæner fra %{filename}. + following_html: + one: Man er ved at følge %{count} konto fra %{filename} og stoppe med at følge andre. + other: Man er ved at følge %{count} konti fra %{filename} og stoppe med at følge andre. + lists_html: + one: Man er ved at erstatte sine lister med indhold fra %{filename}. %{count} konto føjes til nye lister. + other: Man er ved at erstatte sine lister med indhold fra %{filename}. Op til %{count} konti føjes til nye lister. + muting_html: + one: Man er ved at sin liste over en tavsgjort konto med %{count} konto fra %{filename}. + other: Man er ved at sin liste over tavsgjorte konti med op til %{count} konti fra %{filename}. preambles: - blocking_html: Du er ved at blokere op til %{total_items} konti fra %{filename}. - bookmarks_html: Du er ved at føje op til %{total_items} indlæg fra %{filename} til bogmærkelisten. - domain_blocking_html: Du er ved at blokere op til %{total_items} domæner fra %{filename}. - following_html: Du er ved at følge op til %{total_items} konti fra %{filename}. - lists_html: Du er ved at tilføje op til %{total_items} konti fra %{filename} til dine lister. Nye lister oprettes, hvis der ikke er nogen liste at føje konti til. - muting_html: Du er ved at tavsgøre op til %{total_items} konti fra %{filename}. + blocking_html: + one: Man er ved at blokere %{count} konto fra %{filename}. + other: Man er ved at blokere op til %{count} konti fra %{filename}. + bookmarks_html: + one: Man er ved at tilføje %{count} post fra %{filename} til sine bogmærker. + other: Man er ved at tilføje %{count} poster fra %{filename} til sine bogmærker. + domain_blocking_html: + one: Man er ved at blokere %{count} domæne fra %{filename}. + other: Man er ved at blokere op til %{count} domæner fra %{filename}. + following_html: + one: Man er ved at følge %{count} konto fra %{filename}. + other: Man er ved at følge op til%{count} konti fra %{filename}. + lists_html: + one: Man er ved at tilføje %{count} konto fra %{filename} til sine lister. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til. + other: Man er ved at tilføje %{count} konti fra %{filename} til sine lister. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til. + muting_html: + one: Man er ved at tavsgøre %{count} konto fra %{filename}. + other: Man er ved at tavsgøre op til %{count} konto fra %{filename}. preface: Du kan importere data, du har eksporteret fra en anden server, såsom en liste over folk du følger eller blokerer. recent_imports: Seneste importer states: diff --git a/config/locales/de.yml b/config/locales/de.yml index 7a8469df6..5f0b4ae35 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1366,19 +1366,43 @@ de: overwrite: Überschreiben overwrite_long: Bestehende Datensätze durch neue ersetzen overwrite_preambles: - blocking_html: Du bist dabei, deine Liste blockierter Konten durch bis zu %{total_items} Konten aus %{filename} zu ersetzen. - bookmarks_html: Du bist dabei, deine Lesezeichen durch bis zu %{total_items} Beiträge aus %{filename} zu ersetzen. - domain_blocking_html: Du bist dabei, deine Liste blockierter Domains durch bis zu %{total_items} Domains aus %{filename} zu ersetzen. - following_html: Du bist dabei, bis zu %{total_items} Konten aus %{filename} zu folgen und niemand anderes zu folgen. - lists_html: Du bist dabei, deine Listen durch den Inhalt aus %{filename} zu ersetzen. Es werden bis zu %{total_items} Konten zu neuen Listen hinzugefügt. - muting_html: Du bist dabei, deine Liste stummgeschalteter Konten durch bis zu %{total_items} Konten aus %{filename} zu ersetzen. + blocking_html: + one: Du bist dabei, deine Liste blockierter Konten aus %{filename} durch bis zu %{count} Konto zu ersetzen. + other: Du bist dabei, deine Liste blockierter Konten aus %{filename} durch bis zu %{count} Konten zu ersetzen. + bookmarks_html: + one: Du bist dabei, deine Lesezeichen aus %{filename} durch bis zu %{count} Beitrag zu ersetzen. + other: Du bist dabei, deine Lesezeichen aus %{filename} durch bis zu %{count} Beiträge zu ersetzen. + domain_blocking_html: + one: Du bist dabei, deine Liste blockierter Domains aus %{filename} durch bis zu %{count} Domain zu ersetzen. + other: Du bist dabei, deine Liste blockierter Domains aus %{filename} durch bis zu %{count} Domains zu ersetzen. + following_html: + one: Du bist dabei, bis zu %{count} Konto aus %{filename} zu folgen und allen anderen zu entfolgen. + other: Du bist dabei, bis zu %{count} Konten aus %{filename} zu folgen und allen anderen zu entfolgen. + lists_html: + one: Du bist dabei, deine Listen mit dem Inhalt aus %{filename} zu ersetzen. Bis zu %{count} Konto wird zu neuen Listen hinzugefügt. + other: Du bist dabei, deine Listen mit dem Inhalt aus %{filename} zu ersetzen. Bis zu %{count} Konten wird zu neuen Listen hinzugefügt. + muting_html: + one: Du bist dabei, deine Liste mit einem stummgeschalteten Konto aus %{filename} durch bis zu %{count} Konto zu ersetzen. + other: Du bist dabei, deine Liste stummgeschalteter Konten aus %{filename} durch bis zu %{count} Konten zu ersetzen. preambles: - blocking_html: Du bist dabei, bis zu %{total_items}%{total_items} Konten aus %{filename} zu blockieren. - bookmarks_html: Du bist dabei, bis zu %{total_items} Beiträge aus %{filename} zu deinen Lesezeichen hinzuzufügen. - domain_blocking_html: Du bist dabei, bis zu %{total_items} Domains aus %{filename} zu blockieren. - following_html: Du bist dabei, bis zu %{total_items} Konten aus %{filename} zu folgen. - lists_html: Du bist dabei, bis zu %{total_items} Konten aus %{filename} zu deinen Listen hinzuzufügen. Wenn es keine Liste gibt, zu der etwas hinzugefügt werden kann, dann werden neue Listen erstellt. - muting_html: Du bist dabei, bis zu %{total_items} Konten aus %{filename} stummzuschalten. + blocking_html: + one: Du bist dabei, bis zu %{count} Konto aus %{filename} zu blockieren. + other: Du bist dabei, bis zu %{count} Konten aus %{filename} zu blockieren. + bookmarks_html: + one: Du bist dabei, bis zu %{count} Beitrag aus %{filename} zu deinen Lesezeichen hinzuzufügen. + other: Du bist dabei, bis zu %{count} Beiträge aus %{filename} zu deinen Lesezeichen hinzuzufügen. + domain_blocking_html: + one: Du bist dabei, bis zu %{count} Domain aus %{filename} zu blockieren. + other: Du bist dabei, bis zu %{count} Domains aus %{filename} zu blockieren. + following_html: + one: Du bist dabei, bis zu %{count} Konto aus %{filename} zu folgen. + other: Du bist dabei, bis zu %{count} Konten aus %{filename} zu folgen. + lists_html: + one: Du bist dabei, bis zu %{count} Konto aus %{filename} zu deinen Listen hinzuzufügen. Wenn es keine Listen gibt, zu denen etwas hinzugefügt werden kann, dann werden neue Listen erstellt. + other: Du bist dabei, bis zu %{count} Konten aus %{filename} zu deinen Listen hinzuzufügen. Wenn es keine Listen gibt, zu denen etwas hinzugefügt werden kann, dann werden neue Listen erstellt. + muting_html: + one: Du bist dabei, bis zu %{count} Konto aus %{filename} stummzuschalten. + other: Du bist dabei, bis zu %{count} Konten aus %{filename} stummzuschalten. preface: Daten, die du von einem Mastodon-Server exportiert hast, kannst du hierher importieren. Das betrifft beispielsweise die Listen von Profilen, denen du folgst oder die du blockiert hast. recent_imports: Zuletzt importiert states: diff --git a/config/locales/devise.eo.yml b/config/locales/devise.eo.yml index 9d946967e..43aef271f 100644 --- a/config/locales/devise.eo.yml +++ b/config/locales/devise.eo.yml @@ -73,9 +73,11 @@ eo: title: Unu el viaj sekurecaj ŝlosiloj estis forigita webauthn_disabled: explanation: Aŭtentigo per sekurecaj ŝlosiloj estas malŝaltita por via konto. + extra: Ensaluto nun eblas uzante nur la ĵetonon generitan de la parigita tempbazita unufoja pasvorta aplikaĵo. subject: 'Mastodon: sekureca-ŝlosila aŭtentigo malebligita' title: Sekurecaj ŝlosiloj malaktivigitaj webauthn_enabled: + explanation: Sekurecŝlosila aŭtentigo estas ebligita por via konto. extra: Via sekureca ŝlosilo nun povas esti uzata por ensaluto. subject: 'Mastodon: sekureca-ŝlosila aŭtentigo ebligita' title: Sekurecaj ŝlosiloj aktivigitaj diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml index 94e67d17a..180c7e733 100644 --- a/config/locales/doorkeeper.fy.yml +++ b/config/locales/doorkeeper.fy.yml @@ -60,6 +60,7 @@ fy: error: title: Der is in flater bard new: + prompt_html: "%{client_name} freget om tagong ta jo account. Keur dit fersyk allinnich goed as jo dizze boarne werkenne en fertrouwe." review_permissions: Tastimmingen beoardiele title: Autorisaasje fereaske show: diff --git a/config/locales/el.yml b/config/locales/el.yml index 4496ec51a..0df31b246 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1322,20 +1322,6 @@ el: merge_long: Διατήρηση των εγγράφων που υπάρχουν και προσθήκη των νέων overwrite: Αντικατάσταση overwrite_long: Αντικατάσταση των υπαρχόντων εγγράφων με τις καινούργιες - overwrite_preambles: - blocking_html: Πρόκειται να αντικαταστήσεις τη λίστα αποκλεισμών με έως και %{total_items} λογαριασμούς από το %{filename}. - bookmarks_html: Πρόκειται να αντικαταστήσεις τους σελιδοδείκτες σου με έως και %{total_items} αναρτήσεις από το %{filename}. - domain_blocking_html: Πρόκειται να αντικαταστήσεις τη λίστα αποκλεισμών τομέων με έως και %{total_items} τομείς από το %{filename}. - following_html: Πρόκειται να ακολουθήσεις μέχρι %{total_items} λογαριασμούς από το %{filename} και να σταματήσεις να ακολουθείς οποιονδήποτε άλλο. - lists_html: Πρόκειται να αντικαταστήσεις τις λίστες σου με περιεχόμενο του %{filename}. Μέχρι %{total_items} λογαριασμοί θα προστεθούν σε νέες λίστες. - muting_html: Πρόκειται να αντικαταστήσεις τη λίστα λογαριασμών σε σίγαση με έως και %{total_items} λογαριασμούς από το %{filename}. - preambles: - blocking_html: Πρόκειται να αποκλείσεις έως και %{total_items} λογαριασμούς από το %{filename}. - bookmarks_html: Πρόκειται να προσθέσεις μέχρι και %{total_items} αναρτήσεις από το %{filename} στους σελιδοδείκτες σου. - domain_blocking_html: Πρόκειται να αποκλείσεις έως και %{total_items} τομείς από το %{filename}. - following_html: Πρόκειται να ακολουθήσεις έως και %{total_items} λογαριασμούς από το %{filename}. - lists_html: Πρόκειται να προσθέσεις μέχρι και %{total_items} λογαριασμούς από το %{filename} στις λίστες σου. Θα δημιουργηθούν νέες λίστες αν δεν υπάρχει λίστα για προσθήκη. - muting_html: Πρόκειται να κάνεις σίγαση σε έως και %{total_items} λογαριασμούς από το %{filename}. preface: Μπορείς να εισάγεις τα δεδομένα που έχεις εξάγει από άλλο διακομιστή, όπως τη λίστα των ατόμων που ακολουθείς ή έχεις αποκλείσει. recent_imports: Πρόσφατες Εισαγωγές states: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index fbd48d1c3..65b2e6f71 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -875,6 +875,9 @@ en-GB: message_html: You haven't defined any server rules. sidekiq_process_check: message_html: No Sidekiq process running for the %{value} queue(s). Please review your Sidekiq configuration + software_version_check: + action: See available updates + message_html: A Mastodon update is available. software_version_critical_check: action: See available updates message_html: A critical Mastodon update is available, please update as quickly as possible. @@ -1363,19 +1366,43 @@ en-GB: overwrite: Overwrite overwrite_long: Replace current records with the new ones overwrite_preambles: - blocking_html: You are about to replace your block list with up to %{total_items} accounts from %{filename}. - bookmarks_html: You are about to replace your bookmarks with up to %{total_items} posts from %{filename}. - domain_blocking_html: You are about to replace your domain block list with up to %{total_items} domains from %{filename}. - following_html: You are about to follow up to %{total_items} accounts from %{filename} and stop following anyone else. - lists_html: You are about to replace your lists with contents of %{filename}. Up to %{total_items} accounts will be added to new lists. - muting_html: You are about to replace your list of muted accounts with up to %{total_items} accounts from %{filename}. + blocking_html: + one: You are about to replace your block list with up to %{count} account from %{filename}. + other: You are about to replace your block list with up to %{count} accounts from %{filename}. + bookmarks_html: + one: You are about to replace your bookmarks with up to %{count} post from %{filename}. + other: You are about to replace your bookmarks with up to %{count} posts from %{filename}. + domain_blocking_html: + one: You are about to replace your domain block list with up to %{count} domain from %{filename}. + other: You are about to replace your domain block list with up to %{count} domains from %{filename}. + following_html: + one: You are about to follow up to %{count} account from %{filename} and stop following anyone else. + other: You are about to follow up to %{count} accounts from %{filename} and stop following anyone else. + lists_html: + one: You are about to replace your lists with contents of %{filename}. Up to %{count} account will be added to new lists. + other: You are about to replace your lists with contents of %{filename}. Up to %{count} accounts will be added to new lists. + muting_html: + one: You are about to replace your list of muted account with up to %{count} account from %{filename}. + other: You are about to replace your list of muted accounts with up to %{count} accounts from %{filename}. preambles: - blocking_html: You are about to block up to %{total_items} accounts from %{filename}. - bookmarks_html: You are about to add up to %{total_items} posts from %{filename} to your bookmarks. - domain_blocking_html: You are about to block up to %{total_items} domains from %{filename}. - following_html: You are about to follow up to %{total_items} accounts from %{filename}. - lists_html: You are about to add up to %{total_items} accounts from %{filename} to your lists. New lists will be created if there is no list to add to. - muting_html: You are about to mute up to %{total_items} accounts from %{filename}. + blocking_html: + one: You are about to block up to %{count} account from %{filename}. + other: You are about to block up to %{count} accounts from %{filename}. + bookmarks_html: + one: You are about to add up to %{count} post from %{filename} to your bookmarks. + other: You are about to add up to %{count} posts from %{filename} to your bookmarks. + domain_blocking_html: + one: You are about to block up to %{count} domain from %{filename}. + other: You are about to block up to %{count} domains from %{filename}. + following_html: + one: You are about to follow up to %{count} account from %{filename}. + other: You are about to follow up to %{count} accounts from %{filename}. + lists_html: + one: You are about to add up to %{count} account from %{filename} to your lists. New lists will be created if there is no list to add to. + other: You are about to add up to %{count} accounts from %{filename} to your lists. New lists will be created if there is no list to add to. + muting_html: + one: You are about to mute up to %{count} account from %{filename}. + other: You are about to mute up to %{count} accounts from %{filename}. preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking. recent_imports: Recent imports states: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 49b8f288f..cfc24ce27 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1366,19 +1366,43 @@ es-AR: overwrite: Sobrescribir overwrite_long: Reemplazar registros actuales con los nuevos overwrite_preambles: - blocking_html: Estás a punto de reemplazar tu lista de bloqueos por hasta %{total_items} cuentas provenientes de %{filename}. - bookmarks_html: Estás a punto de reemplazar tus marcadores por hasta %{total_items} mensajes provenientes de %{filename}. - domain_blocking_html: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta %{total_items} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. - lists_html: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se agregarán hasta %{total_items} cuentas a listas nuevas. - muting_html: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{total_items} cuentas provenientes de %{filename}. + blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos por hasta %{count} cuenta provenientes de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos por hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Estás a punto de reemplazar tus marcadores por hasta %{count} mensaje provenientes de %{filename}. + other: Estás a punto de reemplazar tus marcadores por hasta %{count} mensajes provenientes de %{filename}. + domain_blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{count} dominio provenientes de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir hasta %{count} cuenta provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. + lists_html: + one: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se agregarán hasta %{count} cuenta a listas nuevas. + other: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se agregarán hasta %{count} cuentas a listas nuevas. + muting_html: + one: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{count} cuenta provenientes de %{filename}. + other: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{count} cuentas provenientes de %{filename}. preambles: - blocking_html: Estás a punto de bloquear hasta %{total_items} cuentas provenientes de %{filename}. - bookmarks_html: Está a punto de agregar hasta %{total_items} mensajes provenientes de %{filename} a tus marcadores. - domain_blocking_html: Estás a punto de bloquear hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta cuentas%{total_items} provenientes de %{filename}. - lists_html: Estás a punto de agregar hasta %{total_items} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay lista a cual agregar. - muting_html: Estás a punto de silenciar hasta %{total_items} cuentas provenientes de %{filename}. + blocking_html: + one: Estás a punto de bloquear hasta %{count} cuenta provenientes de %{filename}. + other: Estás a punto de bloquear hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Está a punto de agregar hasta %{count} mensaje provenientes de %{filename} a tus marcadores. + other: Está a punto de agregar hasta %{count} mensajes provenientes de %{filename} a tus marcadores. + domain_blocking_html: + one: Estás a punto de bloquear hasta %{count} dominio provenientes de %{filename}. + other: Estás a punto de bloquear hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir hasta %{count} cuenta provenientes de %{filename}. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename}. + lists_html: + one: Estás a punto de agregar hasta %{count} cuenta desde %{filename} a tus listas. Se crearán nuevas listas si no hay lista a cuál agregar. + other: Estás a punto de agregar hasta %{count} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay lista a cuál agregar. + muting_html: + one: Estás a punto de silenciar hasta %{count} cuenta provenientes de %{filename}. + other: Estás a punto de silenciar hasta %{count} cuentas provenientes de %{filename}. preface: Podés importar ciertos datos que exportaste desde otro servidor, como una lista de las cuentas que estás siguiendo o bloqueando. recent_imports: Importaciones recientes states: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 0f4c8452c..4e7ee657e 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -180,21 +180,21 @@ es-MX: confirm_user: Confirmar Usuario create_account_warning: Crear Advertencia create_announcement: Crear Anuncio - create_canonical_email_block: Crear Bloqueo de Correo Electrónico + create_canonical_email_block: Crear bloqueo de correo electrónico create_custom_emoji: Crear Emoji Personalizado create_domain_allow: Crear Permiso de Dominio create_domain_block: Crear Bloqueo de Dominio - create_email_domain_block: Crear Bloqueo de Dominio de Correo Electrónico + create_email_domain_block: Crear bloqueo de dominio de correo electrónico create_ip_block: Crear regla IP create_unavailable_domain: Crear Dominio No Disponible create_user_role: Crear rol demote_user: Degradar Usuario destroy_announcement: Eliminar Anuncio - destroy_canonical_email_block: Eliminar Bloqueo de Correo Electrónico + destroy_canonical_email_block: Eliminar bloqueo de correo electrónico destroy_custom_emoji: Eliminar Emoji Personalizado destroy_domain_allow: Eliminar Permiso de Dominio destroy_domain_block: Eliminar Bloqueo de Dominio - destroy_email_domain_block: Eliminar Bloqueo de Dominio de Correo Electrónico + destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico destroy_instance: Purgar dominio destroy_ip_block: Eliminar regla IP destroy_status: Eliminar Estado @@ -876,8 +876,8 @@ es-MX: sidekiq_process_check: message_html: No hay ningún proceso Sidekiq en ejecución para la(s) cola(s) %{value}. Por favor, revise su configuración de Sidekiq software_version_check: - action: Ver actualizaciones disponibles - message_html: Hay disponible una actualización de Mastodon. + action: Ver las actualizaciones disponibles + message_html: Ya está disponible una actualización de Mastodon. software_version_critical_check: action: Ver actualizaciones disponibles message_html: Una actualización crítica de Mastodon está disponible, por favor actualice lo antes posible. @@ -1366,19 +1366,43 @@ es-MX: overwrite: Sobrescribir overwrite_long: Reemplazar registros actuales con los nuevos overwrite_preambles: - blocking_html: Estás a punto de reemplazar tu lista de bloqueos por hasta %{total_items} cuentas provenientes de %{filename}. - bookmarks_html: Estás a punto de reemplazar tus marcadores por hasta %{total_items} publicaciones provenientes de %{filename}. - domain_blocking_html: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta %{total_items} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. - lists_html: Estás a punto de reemplazar tus listas con contenidos de %{filename}. %{total_items} cuentas se añadirán a listas nuevas. - muting_html: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{total_items} cuentas proveninetes de %{filename}. + blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos por %{count} cuenta proveniente de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos por hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Estás a punto de reemplazar tus marcadores por %{count} publicación proveniente de %{filename}. + other: Estás a punto de reemplazar tus marcadores por hasta %{count} publicaciones provenientes de %{filename}. + domain_blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos de dominio por %{count} dominio proveniente de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir a %{count} cuenta proveniente de %{filename} y dejar de seguir a cualquier otra cuenta. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. + lists_html: + one: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se añadirá %{count} cuenta a una nueva lista. + other: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se añadirán %{count} cuentas a nuevas listas. + muting_html: + one: Estás a punto de reemplazar tu lista de cuentas silenciadas con %{count} cuenta proveninete de %{filename}. + other: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{count} cuentas provenientes de %{filename}. preambles: - blocking_html: Estás a punto de bloquear hasta %{total_items} cuentas proveninetes de %{filename}. - bookmarks_html: Estás a punto de añadir hasta %{total_items} publicaciones proveninetes de %{filename} a tus marcadores. - domain_blocking_html: Estás a punto de bloquear hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta cuentas%{total_items} provenientes de %{filename}. - lists_html: Estás a punto de añadir %{total_items} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay listas para añadirlas. - muting_html: Estás a punto de silenciar hasta %{total_items} cuentas provenientes de %{filename}. + blocking_html: + one: Estás a punto de bloquear a %{count} cuenta proveninete de %{filename}. + other: Estás a punto de bloquear hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Está a punto de añadir %{count} publicación proveniente de %{filename} a tus marcadores. + other: Está a punto de añadir hasta %{count} publicaciones provenientes de %{filename} a tus marcadores. + domain_blocking_html: + one: Estás a punto de bloquear %{count} dominio proveniente de %{filename}. + other: Estás a punto de bloquear hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir a %{count} cuenta proveniente de %{filename}. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename}. + lists_html: + one: Estás a punto de añadir %{count} cuenta desde %{filename} a tus listas. Se creará una nueva listas si no hay listas donde añadirla. + other: Estás a punto de añadir %{count} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay listas donde añadirlas. + muting_html: + one: Estás a punto de silenciar a %{count} cuenta proveniente de %{filename}. + other: Estás a punto de silenciar hasta %{count} cuentas provenientes de %{filename}. preface: Puedes importar ciertos datos, como todas las personas que estás siguiendo o bloqueando en tu cuenta en esta instancia, desde archivos exportados de otra instancia. recent_imports: Importaciones recientes states: @@ -1453,8 +1477,8 @@ es-MX: emails: notification_emails: favourite: correos de notificación de favoritos - follow: correos de notificación de nuevos seguidores - follow_request: correos de notificación de solicitud de seguidor + follow: correos electrónicos de notificación de seguimiento + follow_request: correos electrónicos de solicitud de seguimiento mention: correos de notificación de menciones reblog: correos de notificación de impulsos resubscribe_html: Si te has dado de baja por error, puedes volver a darte de alta desde tus ajustes de notificaciones por correo. diff --git a/config/locales/es.yml b/config/locales/es.yml index aa18e7b52..bb9e5daff 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1366,19 +1366,43 @@ es: overwrite: Sobrescribir overwrite_long: Reemplazar registros actuales con los nuevos overwrite_preambles: - blocking_html: Estás a punto de reemplazar tu lista de bloqueos por hasta %{total_items} cuentas provenientes de %{filename}. - bookmarks_html: Estás a punto de reemplazar tus marcadores por hasta %{total_items} publicaciones provenientes de %{filename}. - domain_blocking_html: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta %{total_items} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. - lists_html: Estás a punto de reemplazar tus listas con contenidos de %{filename}. Se añadirán %{total_items} cuentas a nuevas listas. - muting_html: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{total_items} cuentas proveninetes de %{filename}. + blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos por %{count} cuenta proveniente de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos por hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Estás a punto de reemplazar tus marcadores por %{count} publicación proveniente de %{filename}. + other: Estás a punto de reemplazar tus marcadores por hasta %{count} publicaciones provenientes de %{filename}. + domain_blocking_html: + one: Estás a punto de reemplazar tu lista de bloqueos de dominio por %{count} dominio proveniente de %{filename}. + other: Estás a punto de reemplazar tu lista de bloqueos de dominio por hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir a %{count} cuenta proveniente de %{filename} y dejar de seguir a cualquier otra cuenta. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename} y dejar de seguir a cualquier otra cuenta. + lists_html: + one: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se añadirá %{count} cuenta a una nueva lista. + other: Estás a punto de reemplazar tus listas con el contenido de %{filename}. Se añadirán %{count} cuentas a nuevas listas. + muting_html: + one: Estás a punto de reemplazar tu lista de cuentas silenciadas con %{count} cuenta proveninete de %{filename}. + other: Estás a punto de reemplazar tu lista de cuentas silenciadas con hasta %{count} cuentas provenientes de %{filename}. preambles: - blocking_html: Estás a punto de bloquear hasta %{total_items} cuentas proveninetes de %{filename}. - bookmarks_html: Está a punto de añadir hasta %{total_items} publicaciones proveninetes de %{filename} a tus marcadores. - domain_blocking_html: Estás a punto de bloquear hasta %{total_items} dominios provenientes de %{filename}. - following_html: Estás a punto de seguir hasta cuentas%{total_items} provenientes de %{filename}. - lists_html: Estás a punto de añadir %{total_items} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay listas para añadirlas. - muting_html: Estás a punto de silenciar hasta %{total_items} cuentas provenientes de %{filename}. + blocking_html: + one: Estás a punto de bloquear a %{count} cuenta proveninete de %{filename}. + other: Estás a punto de bloquear hasta %{count} cuentas provenientes de %{filename}. + bookmarks_html: + one: Está a punto de añadir %{count} publicación proveniente de %{filename} a tus marcadores. + other: Está a punto de añadir hasta %{count} publicaciones provenientes de %{filename} a tus marcadores. + domain_blocking_html: + one: Estás a punto de bloquear %{count} dominio proveniente de %{filename}. + other: Estás a punto de bloquear hasta %{count} dominios provenientes de %{filename}. + following_html: + one: Estás a punto de seguir a %{count} cuenta proveniente de %{filename}. + other: Estás a punto de seguir hasta %{count} cuentas provenientes de %{filename}. + lists_html: + one: Estás a punto de añadir %{count} cuenta desde %{filename} a tus listas. Se creará una nueva listas si no hay listas donde añadirla. + other: Estás a punto de añadir %{count} cuentas desde %{filename} a tus listas. Se crearán nuevas listas si no hay listas donde añadirlas. + muting_html: + one: Estás a punto de silenciar a %{count} cuenta proveniente de %{filename}. + other: Estás a punto de silenciar hasta %{count} cuentas provenientes de %{filename}. preface: Puedes importar ciertos datos, como todas las personas que estás siguiendo o bloqueando en tu cuenta en esta instancia, desde archivos exportados de otra instancia. recent_imports: Importaciones recientes states: diff --git a/config/locales/et.yml b/config/locales/et.yml index b71e3ccb6..4372a9284 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1362,20 +1362,6 @@ et: merge_long: Hoia olemasolevad andmed ja lisa uusi overwrite: Kirjuta üle overwrite_long: Vaheta praegused andmed uute vastu - overwrite_preambles: - blocking_html: Oled asendamas oma blokeeringute loetelu kuni %{total_items} kontoga kohast %{filename}. - bookmarks_html: Oled asendamas oma järjehoidjaid kuni %{total_items} postitusega kohast %{filename}. - domain_blocking_html: Oled asendamas oma domeenide blokeeringute loetelu kuni %{total_items} domeeniga kohast %{filename}. - following_html: Oled jälgima hakkamas kuni %{total_items} kontot kohast %{filename} ja lõpetad kõigi teiste jälgimise. - lists_html: Oled asendamas oma loetelusid faili %{filename} sisuga. Uutesse loeteludesse lisatakse kuni %{total_items} kontot. - muting_html: Oled asendamas oma vaigistatud kontode loetelu kuni %{total_items} kontoga kohast %{filename}. - preambles: - blocking_html: Oled blokeerimas kuni %{total_items} kontoga kohast %{filename}. - bookmarks_html: Oled lisamas kuni %{total_items} postitust kohast %{filename} to your bookmarks. - domain_blocking_html: Oled blokeerimas kuni %{total_items} domeeni kohast %{filename}. - following_html: Oled jälgima hakkamas kuni %{total_items} kontot kohast %{filename}. - lists_html: Oled lisamas oma loeteludesse failist %{filename} kuni %{total_items} kontot. Kui pole loetelusi, kuhu lisada, luuakse uued loetelud. - muting_html: Oled vaigistamas kuni %{total_items} kontot kohast %{filename}. preface: Saad importida mistahes andmeid, mis on eksporditud teisest serverist. Näiteks nimekirja inimestest, keda jälgid ja keda blokeerid. recent_imports: Viimati imporditud states: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index e80207d46..e9c3be2d2 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1276,20 +1276,6 @@ eu: merge_long: Mantendu dauden erregistroak eta gehitu berriak overwrite: Gainidatzi overwrite_long: Ordeztu oraingo erregistroak berriekin - overwrite_preambles: - blocking_html: "Blokeatutakoen zerrenda %{filename} fitxategiak dituen %{total_items} kontuekin ordeztear zaude." - bookmarks_html: "Laster-markak %{filename} fitxategiak dituen %{total_items} argitalpenekin ordeztear zaude." - domain_blocking_html: "Blokeatutako domeinuen zerrenda %{filename} fitxategiak dituen %{total_items} domeinuekin ordeztear zaude." - following_html: "%{filename} fitxategiak dituen %{total_items} kontuei jarraitzear zaude; gainontzekoak jarraitzeari utziko diozu." - lists_html: "Zerrendak %{filename} fitxategiak duen edukiarekin ordeztear zaude. %{total_items} kontu gehituko dira zerrenda berrietara." - muting_html: "Mutututako kontuen zerrenda %{filename} fitxategiak dituen %{total_items} kontuekin ordeztear zaude." - preambles: - blocking_html: "%{filename} fitxategiak dituen %{total_items} kontuak blokeatzear zaude." - bookmarks_html: "%{filename} fitxategiak dituen %{total_items} argitalpenei laster-marka jartzear zaude." - domain_blocking_html: "%{filename} fitxategiak dituen %{total_items} domeinuak blokeatzear zaude." - following_html: "%{filename} fitxategiak dituen %{total_items} konturi jarraitzear zaude." - lists_html: "%{filename} fitxategiak dituen %{total_items} kontu zerrendetan gehitzear zaude. Zerrenda berriak sortuko dira zerrendarik ez badago." - muting_html: "%{filename} fitxategiak dituen %{total_items} kontuak mututzear zaude." preface: Beste zerbitzari bateko datuak inportatu ditzakezu, esaterako jarraitzen duzun edo blokeatu duzun jendearen zerrenda. recent_imports: Azken inportazioak states: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 22ccc7116..1767f9e63 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1366,19 +1366,43 @@ fi: overwrite: Korvaa overwrite_long: Korvaa nykyiset tietueet uusilla overwrite_preambles: - blocking_html: Olet aikeissa korvata estoluettelosi kaikkiaan %{total_items} tilillä tiedostosta %{filename}. - bookmarks_html: Olet aikeissa korvata kirjanmerkkisi kaikkiaan %{total_items} julkaisulla tiedostosta %{filename}. - domain_blocking_html: Olet aikeissa korvata verkkotunnusten estoluettelosi kaikkiaan %{total_items} verkkotunnuksella tiedostosta %{filename}. - following_html: Olet aikeissa seurata kaikkiaan %{total_items} tiliä tiedostosta %{filename} ja lopettaa kaikkien muiden seuraamisen. - lists_html: Olet aikeissa korvata listojasi tiedoston %{filename} sisällöllä. Uusiin listoihin lisätään kaikkiaan %{total_items} tiliä. - muting_html: Olet aikeissa korvata mykistettyjen tilien luettelosi kaikkiaan %{total_items} tilillä tiedostosta %{filename}. + blocking_html: + one: Olet aikeissa korvata estoluettelosi kaikkiaan %{count} tilillä tiedostosta %{filename}. + other: Olet aikeissa korvata estoluettelosi kaikkiaan %{count} tilillä tiedostosta %{filename}. + bookmarks_html: + one: Olet aikeissa korvata kirjanmerkkisi kaikkiaan %{count} julkaisulla tiedostosta %{filename}. + other: Olet aikeissa korvata kirjanmerkkisi kaikkiaan %{count} julkaisulla tiedostosta %{filename}. + domain_blocking_html: + one: Olet aikeissa korvata verkkotunnusten estoluettelosi kaikkiaan %{count} verkkotunnuksella tiedostosta %{filename}. + other: Olet aikeissa korvata verkkotunnusten estoluettelosi kaikkiaan %{count} verkkotunnuksella tiedostosta %{filename}. + following_html: + one: Olet aikeissa seurata kaikkiaan %{count} tiliä tiedostosta %{filename} ja lopettaa kaikkien muiden seuraamisen. + other: Olet aikeissa seurata kaikkiaan %{count} tiliä tiedostosta %{filename} ja lopettaa kaikkien muiden seuraamisen. + lists_html: + one: Olet aikeissa korvata listojasi tiedoston %{filename} sisällöllä. Uusiin listoihin lisätään kaikkiaan %{count} tili. + other: Olet aikeissa korvata listojasi tiedoston %{filename} sisällöllä. Uusiin listoihin lisätään kaikkiaan %{count} tiliä. + muting_html: + one: Olet aikeissa korvata mykistettyjen tilien luettelosi kaikkiaan %{count} tilillä tiedostosta %{filename}. + other: Olet aikeissa korvata mykistettyjen tilien luettelosi kaikkiaan %{count} tilillä tiedostosta %{filename}. preambles: - blocking_html: Olet aikeissa estää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - bookmarks_html: Olet aikeissa lisätä kaikkiaan %{total_items} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. - domain_blocking_html: Olet aikeissa estää kaikkiaan %{total_items} verkkotunnusta tiedostosta %{filename}. - following_html: Olet aikeissa seurata kaikkiaan %{total_items} tiliä tiedostosta %{filename}. - lists_html: Olet aikeissa lisätä listoihisi kaikkiaan %{total_items} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. - muting_html: Olet aikeissa mykistää kaikkiaan %{total_items} tiliä tiedostosta %{filename}. + blocking_html: + one: Olet aikeissa estää kaikkiaan %{count} tilin tiedostosta %{filename}. + other: Olet aikeissa estää kaikkiaan %{count} tiliä tiedostosta %{filename}. + bookmarks_html: + one: Olet aikeissa lisätä kaikkiaan %{count} julkaisun tiedostosta %{filename}kirjanmerkkeihisi. + other: Olet aikeissa lisätä kaikkiaan %{count} julkaisua tiedostosta %{filename}kirjanmerkkeihisi. + domain_blocking_html: + one: Olet aikeissa estää kaikkiaan %{count} verkkotunnuksen tiedostosta %{filename}. + other: Olet aikeissa estää kaikkiaan %{count} verkkotunnusta tiedostosta %{filename}. + following_html: + one: Olet aikeissa seurata kaikkiaan %{count} tiliä tiedostosta %{filename}. + other: Olet aikeissa seurata kaikkiaan %{count} tiliä tiedostosta %{filename}. + lists_html: + one: Olet aikeissa lisätä listoihisi kaikkiaan %{count} tilin tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. + other: Olet aikeissa lisätä listoihisi kaikkiaan %{count} tiliä tiedostosta %{filename}. Uusia listoja luodaan, jos sopivaa kohdelistaa ei ole olemassa. + muting_html: + one: Olet aikeissa mykistää kaikkiaan %{count} tilin tiedostosta %{filename}. + other: Olet aikeissa mykistää kaikkiaan %{count} tiliä tiedostosta %{filename}. preface: Voit tuoda toiselta palvelimelta viemiäsi tietoja, kuten seuraamiesi tai estämiesi käyttäjien luettelon. recent_imports: Viimeksi tuotu states: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 31eb67b3b..55104eb6f 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1365,20 +1365,6 @@ fo: merge_long: Varðveit verandi teigarøð og legg nýggjar afturat overwrite: Skriva omaná overwrite_long: Legg nýggj teigarøð inn fyri tey verandi - overwrite_preambles: - blocking_html: Tú ert í ferð við at útskifta blokeringslistan hjá tær við upp til %{total_items} kontum frá %{filename}. - bookmarks_html: Tú ert í ferð við at útskifta tíni bókamerki við upp til %{total_items} postum frá %{filename}. - domain_blocking_html: Tú ert í ferð við at útskifta navnaøkisblokeringslistan hjá tær við upp til %{total_items} navnaøkjum frá %{filename}. - following_html: Tú ert í ferð við at fylgja upp til %{total_items} kontum frá %{filename} og at gevast at fylgja øðrum. - lists_html: Tú ert í ferð við at skifta listarnar hjá tær út við tað, sum er í %{filename}. Upp til %{total_items} kontur verða lagdar afturat nýggjum listum. - muting_html: Tú ert í ferð við at útskifta listan hjá tær við doyvdum kontum við upp til %{total_items} kontum frá %{filename}. - preambles: - blocking_html: Tú ert í ferð við at blokera upp til %{total_items} kontur frá %{filename}. - bookmarks_html: Tú ert í ferð við at leggja upp til %{total_items} postar frá %{filename} afturat tínum bókamerkjum. - domain_blocking_html: Tú ert í ferð við at blokera upp til %{total_items} navnaøki frá %{filename}. - following_html: Tú ert í ferð við at fylgja upp til %{total_items} kontur frá %{filename}. - lists_html: Tú ert í ferð við at leggja upp til %{total_items} kontur frá %{filename} afturat tínum listum. Nýggir listar verða stovnaðir, um eingin listi er at leggja afturat. - muting_html: Tú ert í ferð við at doyva upp til %{total_items} kontur frá %{filename}. preface: Tú kanst innlesa dátur, sum tú hevur útlisið frá einum øðrum ambætara, so sum listar av fólki, sum tú fylgir ella blokerar. recent_imports: Feskar innflytingar states: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 16cdb7931..01463edac 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1368,20 +1368,6 @@ fr-CA: merge_long: Garder les enregistrements existants et ajouter les nouveaux overwrite: Écraser overwrite_long: Remplacer les enregistrements actuels par les nouveaux - overwrite_preambles: - blocking_html: Vous allez remplacer votre liste de blocages par jusqu'à %{total_items} comptes tirés de %{filename}. - bookmarks_html: Vous allez remplacer vos signets par jusqu'à %{total_items} posts tirés de %{filename}. - domain_blocking_html: Vous allez remplacer votre liste de blocages de domaines par jusqu'à %{total_items} domaines tirés de %{filename}. - following_html: Vous allez suivre jusqu’à %{total_items} comptes depuis %{filename} et arrêter de suivre n’importe qui d’autre. - lists_html: Vous allez remplacer vos listes par le contenu de %{filename}. Jusqu'à %{total_items} comptes seront ajoutés à de nouvelles listes. - muting_html: Vous allez remplacer votre liste de comptes masqués par jusqu'à %{total_items} comptes tirés de %{filename}. - preambles: - blocking_html: Vous allez bloquer jusqu'à %{total_items} comptes tirés de %{filename}. - bookmarks_html: Vous allez ajouter jusqu'à %{total_items} messages de %{filename} à vos signets. - domain_blocking_html: Vous allez bloquer jusqu'à %{total_items} domaines tirés de %{filename}. - following_html: Vous allez suivre jusqu'à %{total_items} comptes tirés de %{filename}. - lists_html: Vous allez ajouter jusqu'à %{total_items} comptes depuis %{filename} à vos listes. De nouvelles listes seront créées s'il n'y a aucune liste à laquelle les ajouter. - muting_html: Vous allez masquer jusqu'à %{total_items} comptes tirés de %{filename}. preface: Vous pouvez importer certaines données que vous avez exporté d’un autre serveur, comme une liste des personnes que vous suivez ou bloquez sur votre compte. recent_imports: Importations récentes states: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index bc57d00e6..c3ce66c39 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1368,20 +1368,6 @@ fr: merge_long: Garder les enregistrements existants et ajouter les nouveaux overwrite: Écraser overwrite_long: Remplacer les enregistrements actuels par les nouveaux - overwrite_preambles: - blocking_html: Vous allez remplacer votre liste de blocage par près de %{total_items} comptes tirés de %{filename}. - bookmarks_html: Vous allez remplacer vos signets par près de %{total_items} posts tirés de %{filename}. - domain_blocking_html: Vous allez remplacer votre liste de blocage de domaines par près de %{total_items} domaines tirés de %{filename}. - following_html: Vous allez suivre jusqu’à %{total_items} comptes depuis %{filename} et arrêter de suivre n’importe qui d’autre. - lists_html: Vous allez remplacer vos listes par le contenu de %{filename}. Près de %{total_items} comptes seront ajoutés à de nouvelles listes. - muting_html: Vous allez remplacer votre liste de comptes masqués par près de %{total_items} comptes tirés de %{filename}. - preambles: - blocking_html: Vous allez bloquer près de %{total_items} comptes tirés de %{filename}. - bookmarks_html: Vous allez ajouter près de %{total_items} messages de %{filename} à vos signets. - domain_blocking_html: Vous allez bloquer près de %{total_items} domaines tirés de %{filename}. - following_html: Vous allez suivre près de %{total_items} comptes tirés de %{filename}. - lists_html: Vous allez ajouter près de %{total_items} comptes depuis %{filename} à vos listes. De nouvelles listes seront créées si besoin. - muting_html: Vous allez masquer près de %{total_items} comptes tirés de %{filename}. preface: Vous pouvez importer certaines données que vous avez exporté d’un autre serveur, comme une liste des personnes que vous suivez ou bloquez sur votre compte. recent_imports: Récents imports states: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 0379af34e..d63d2ac2a 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -24,6 +24,8 @@ fy: admin: account_actions: action: Aksje útfiere + already_silenced: Dizze account is al beheind. + already_suspended: Dizze account is al opskort. title: Moderaasjemaatregelen tsjin %{acct} nimme account_moderation_notes: create: Lit in opmerking efter @@ -45,6 +47,7 @@ fy: title: E-mailadres foar %{username} wizigje change_role: changed_msg: Rol mei sukses wizige! + edit_roles: Brûkersrollen beheare label: Rol wizigje no_role: Gjin rol title: Rol fan %{username} wizigje @@ -601,6 +604,7 @@ fy: suspend_description_html: De account en alle ynhâld sil net tagonklik wêze en úteinlik fuortsmiten wurde, en ynteraksje hjirmei sil net mooglik wêze. Binnen 30 dagen werom te draaien. Dit slút alle rapportaazjes oer dizze account. actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de spam-kategory keazen is. actions_description_remote_html: Beslút hokker aksje nommen wurde moat om dizze rapportaazje ôf te hanneljen. Dit hat allinnich ynfloed op hoe’t jo server kommunisearret mei dizze eksterne account en omgiet mei de ynhâld. + actions_no_posts: Dit rapport hat gjin byhearrende berjochten om fuort te smiten add_to_report: Mear oan de rapportaazje tafoegje already_suspended_badges: local: Al opskoarte op dizze server @@ -871,6 +875,9 @@ fy: message_html: Jo hawwe foar dizze server gjin regels opsteld. sidekiq_process_check: message_html: Der draait gjin Sidekiq-proses foar de wachtrige(n) %{value}. Kontrolearje jo Sidekiq-konfiguraasje + software_version_check: + action: Beskikbere fernijingen besjen + message_html: Der is in Mastodon-fernijing beskikber. software_version_critical_check: action: Beskikbere fernijingen besjen message_html: Der is in kritike fernijing foar Mastodon beskikber. Wurkje sa gau as mooglik by. @@ -1156,6 +1163,12 @@ fy: view_strikes: Besjoch de earder troch moderatoaren fêststelde skeiningen dy’t jo makke hawwe too_fast: Formulier is te fluch yntsjinne. Probearje it nochris. use_security_key: Befeiligingskaai brûke + author_attribution: + example_title: Faorbyldtekst + hint_html: Bepaal hoe’t wy jo fermelde, wannear’t jo keppelingen op Mastodon dield wurde. + more_from_html: Mear fan %{name} + s_blog: Weblog fan %{name} + title: Auteur-attribúsje challenge: confirm: Trochgean hint_html: "Tip: Wy freegje jo it kommende oere net mear nei jo wachtwurd." @@ -1353,19 +1366,43 @@ fy: overwrite: Oerskriuwe overwrite_long: Aktuele gegevens mei de nije gegevens ferfange overwrite_preambles: - blocking_html: Jo steane op it punt om jo blokkearlist mei mear as %{total_items} accounts fan %{filename} te ferfangen. - bookmarks_html: Jo steane op it punt om jo blêdwizers mei mear as %{total_items} artikelen fan %{filename} te ferfangen. - domain_blocking_html: Jo steane op it punt om jo domeinblokkearlist mei mear as %{total_items} domeinen fan %{filename} te ferfangen. - following_html: Jo steane op it punt om %{total_items} accounts út %{filename} te folgjen en te stopjen mei folgjen fan alle oaren. - lists_html: Jo steane op it punt jo listen te ferfangen troch ynhâld fan %{filename}. Oant %{total_items} accounts sille oan nije listen tafoege wurde. - muting_html: Jo steane op it punt om jo list mei negearre accounts mei mear as %{total_items} accounts fan %{filename} út te ferfangen. + blocking_html: + one: Jo steane op it punt om jo blokkearlist mei mear as %{count} account fan %{filename} te ferfangen. + other: Jo steane op it punt om jo blokkearlist mei mear as %{count} accounts fan %{filename} te ferfangen. + bookmarks_html: + one: Jo steane op it punt om jo blêdwizers mei mear as %{count} artikel fan %{filename} te ferfangen. + other: Jo steane op it punt om jo blêdwizers mei mear as %{count} artikelen fan %{filename} te ferfangen. + domain_blocking_html: + one: Jo steane op it punt om jo domeinblokkearlist mei mear as %{count} domein fan %{filename} te ferfangen. + other: Jo steane op it punt om jo domeinblokkearlist mei mear as %{count} domeinen fan %{filename} te ferfangen. + following_html: + one: Jo steane op it punt om %{count} account út %{filename} te folgjen en te stopjen mei folgjen fan alle oaren. + other: Jo steane op it punt om %{count} accounts út %{filename} te folgjen en te stopjen mei folgjen fan alle oaren. + lists_html: + one: Jo steane op it punt jo listen te ferfangen troch ynhâld fan %{filename}. Oant %{count} account sille oan nije listen tafoege wurde. + other: Jo steane op it punt jo listen te ferfangen troch ynhâld fan %{filename}. Oant %{count} accounts sille oan nije listen tafoege wurde. + muting_html: + one: Jo steane op it punt om jo list mei negearre accounts mei mear as %{count} account fan %{filename} út te ferfangen. + other: Jo steane op it punt om jo list mei negearre accounts mei mear as %{count} accounts fan %{filename} út te ferfangen. preambles: - blocking_html: Jo steane op it punt om %{total_items} accounts fan %{filename} út te blokkearjen. - bookmarks_html: Jo steane op it punt om %{total_items} berjochten fan %{filename} út oan jo blêdwizers ta te foegjen. - domain_blocking_html: Jo steane op it punt om %{total_items} domeinen fan %{filename} út te blokkearjen. - following_html: Jo steane op it punt om %{total_items} accounts fan %{filename} út te folgjen. - lists_html: Jo steane op it punt om oant %{total_items} accounts fan %{filename} ta te foegjen oan jo listen. Nije listen wurde oanmakke as der gjin list is om oan ta te foegjen. - muting_html: Jo steane op it punt om %{total_items} accounts fan %{filename} út te negearjen. + blocking_html: + one: Jo steane op it punt om %{count} account fan %{filename} út te blokkearjen. + other: Jo steane op it punt om %{count} accounts fan %{filename} út te blokkearjen. + bookmarks_html: + one: Jo steane op it punt om %{count} berjocht fan %{filename} út oan jo blêdwizers ta te foegjen. + other: Jo steane op it punt om %{count} berjochten fan %{filename} út oan jo blêdwizers ta te foegjen. + domain_blocking_html: + one: Jo steane op it punt om %{count} domein fan %{filename} út te blokkearjen. + other: Jo steane op it punt om %{count} domeinen fan %{filename} út te blokkearjen. + following_html: + one: Jo steane op it punt om %{count} account fan %{filename} út te folgjen. + other: Jo steane op it punt om %{count} accounts fan %{filename} út te folgjen. + lists_html: + one: Jo steane op it punt om oant %{count} account fan %{filename} ta te foegjen oan jo listen. Nije listen wurde oanmakke as der gjin list is om oan ta te foegjen. + other: Jo steane op it punt om oant %{count} accounts fan %{filename} ta te foegjen oan jo listen. Nije listen wurde oanmakke as der gjin list is om oan ta te foegjen. + muting_html: + one: Jo steane op it punt om %{count} account fan %{filename} út te negearjen. + other: Jo steane op it punt om %{count} accounts fan %{filename} út te negearjen. preface: Jo kinne bepaalde gegevens, lykas de minsken dy’t jo folgje of blokkearre hawwe, nei jo account op dizze server ymportearje. Jo moatte dizze gegevens wol earst op de oarspronklike server eksportearje. recent_imports: Resinte ymports states: @@ -1682,6 +1719,7 @@ fy: delete: Account fuortsmite development: Untwikkelers edit_profile: Profyl bewurkje + export: Eksportearje featured_tags: Utljochte hashtags import: Ymportearje import_and_export: Ymportearje en eksportearje @@ -1931,6 +1969,7 @@ fy: instructions_html: Kopiearje en plak de ûndersteande koade yn de HTML fan jo website. Foegje dernei it adres fan jo website ta oan ien fan de ekstra fjilden op jo profyl op it ljepblêd ‘Profyl bewurkje’ en bewarje de wizigingen. verification: Ferifikaasje verified_links: Jo ferifiearre keppelingen + website_verification: Website-ferifikaasje webauthn_credentials: add: Nije befeiligingskaai tafoegje create: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index e25865903..a201b7332 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1440,20 +1440,6 @@ ga: merge_long: Coinnigh taifid atá ann cheana féin agus cuir cinn nua leis overwrite: Forscríobh overwrite_long: Cuir na cinn nua in ionad na dtaifead reatha - overwrite_preambles: - blocking_html: Tá tú ar tí do liosta bloc a chur in ionad suas le %{total_items} cuntas ó %{filename}. - bookmarks_html: Tá tú ar tí do leabharmharcanna a chur in ionad suas le %{total_items} postáil ó %{filename}. - domain_blocking_html: Tá tú ar tí do liosta bloc fearainn a chur in ionad suas le %{total_items} fearainn ó %{filename}. - following_html: Tá tú ar tí leanúint suas go dtí %{total_items} cuntas ó %{filename} agus stop a leanúint aon duine eile. - lists_html: Tá tú ar tí do liostaí a chur in ionad inneachair %{filename}. Cuirfear suas le %{total_items} cuntas le liostaí nua. - muting_html: Tá tú ar tí do liosta cuntas balbhaithe a chur in ionad suas le %{total_items} cuntas ó %{filename}. - preambles: - blocking_html: Tá tú ar tí bloc suas le %{total_items} cuntas ó %{filename}. - bookmarks_html: Tá tú ar tí %{total_items} postáil ó %{filename} a chur le do leabharmharcanna. - domain_blocking_html: Tá tú ar tí bloc suas le %{total_items} fearainn ó %{filename}. - following_html: Tá tú ar tí leanúint suas go dtí %{total_items} cuntas ó %{filename}. - lists_html: Tá tú ar tí %{total_items} cuntas ó %{filename} a chur le do liostaí. Cruthófar liostaí nua mura bhfuil aon liosta le cur leis. - muting_html: Tá tú ar tí balbhú suas le %{total_items} cuntas ó %{filename}. preface: Is féidir leat sonraí a d’easpórtáil tú a allmhairiú ó fhreastalaí eile, mar shampla liosta de na daoine a bhfuil tú ag leanúint nó ag cur bac orthu. recent_imports: Allmhairí le déanaí states: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index a030b0d18..cb7c6254b 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1415,20 +1415,6 @@ gd: merge_long: Cùm na reacordan a tha ann is cuir feadhainn ùr ris overwrite: Sgrìobh thairis air overwrite_long: Cuir na reacordan ùra an àite na feadhna a tha ann - overwrite_preambles: - blocking_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a chur an àite liosta nam bacaidhean agad. - bookmarks_html: Tha thu an impis suas ri %{total_items} post(aichean) o %{filename} a chur an àite nan comharra-lìn agad. - domain_blocking_html: Tha thu an impis suas ri %{total_items} àrainn(ean) o %{filename} a chur an àite liosta nam bacaidhean àrainne agad. - following_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a leantainn agus sguiridh tu a leantainn duine sam bith eile. - lists_html: Tha thu an impis susbaint %{filename} a chur an àite nan liostaichean agad. Thèid suas ri %{total_items}cunntas(an) a chur ri liostaichean ùra. - muting_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a chur an àite liosta nan cunntasan mùchte agad. - preambles: - blocking_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a bhacadh. - bookmarks_html: Tha thu an impis suas ri %{total_items} post(aichean) o %{filename} a chur ris na h-annsachdan agad. - domain_blocking_html: Tha thu an impis suas ri %{total_items} àrainn(ean) o %{filename} a bhacadh. - following_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a leantainn. - lists_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a chur ris na liostaichean agad. Thèid liostaichean ùra a chruthachadh mur eil liostaichean ann airson nan cunntasan a chur ris. - muting_html: Tha thu an impis suas ri %{total_items} cunntas(an) o %{filename} a mhùchadh. preface: "’S urrainn dhut dàta ion-phortadh a dh’às-phortaich thu o fhrithealaiche eile, can liosta nan daoine a leanas tu no a tha thu a’ bacadh." recent_imports: Ion-phortaidhean o chionn goirid states: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index e396761f7..8460902a6 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1366,19 +1366,43 @@ gl: overwrite: Sobreescribir overwrite_long: Sustituír rexistros actuais cos novos overwrite_preambles: - blocking_html: Vas substituír a lista de bloqueos por %{total_items} contas desde %{filename}. - bookmarks_html: Vas substituír os marcadores por %{total_items} publicacións desde %{filename}. - domain_blocking_html: Vas substituír a lista de dominios bloqueados por %{total_items} dominios desde %{filename}. - following_html: Vas seguir estas %{total_items} contas desde %{filename} e deixar de seguir a todas as outras contas. - lists_html: Vas substituír as túas listas co contido de %{filename}. Vanse engadir %{total_items} contas ás novas listas. - muting_html: Vas substituír a lista de contas acaladas por %{total_items} contas desde %{filename}. + blocking_html: + one: Vas substituír a lista de bloqueos por %{count} conta desde %{filename}. + other: Vas substituír a lista de bloqueos por %{count} contas desde %{filename}. + bookmarks_html: + one: Vas substituír os marcadores por %{count} publicación desde %{filename}. + other: Vas substituír os marcadores por %{count} publicacións desde %{filename}. + domain_blocking_html: + one: Vas substituír a lista de dominios bloqueados por %{count} dominio desde %{filename}. + other: Vas substituír a lista de dominios bloqueados por %{count} dominios desde %{filename}. + following_html: + one: Vas seguir a %{count} conta desde %{filename} e deixar de seguir a todas as outras contas. + other: Vas seguir a %{count} contas desde %{filename} e deixar de seguir a todas as outras contas. + lists_html: + one: Vas substituír as túas listas co contido de %{filename}. Vaise engadir %{count} conta ás novas listas. + other: Vas substituír as túas listas co contido de %{filename}. Vanse engadir %{count} contas ás novas listas. + muting_html: + one: Vas substituír a lista de contas acaladas por %{count} conta desde %{filename}. + other: Vas substituír a lista de contas acaladas por %{count} contas desde %{filename}. preambles: - blocking_html: Vas bloquear estas %{total_items} contas desde %{filename}. - bookmarks_html: Vas engadir %{total_items} publicacións desde %{filename} aos teus marcadores. - domain_blocking_html: Vas bloquear estes %{total_items} dominios desde %{filename}. - following_html: Vas seguir estas %{total_items} contas desde %{filename}. - lists_html: Vas engadir %{total_items} contas desde %{filename} ás túas listas. Crearánse novas listas se non hai listas ás que engadilas. - muting_html: Vas acalar estas %{total_items} contas desde %{filename}. + blocking_html: + one: Vas bloquear a %{count} conta desde %{filename}. + other: Vas bloquear a %{count} contas desde %{filename}. + bookmarks_html: + one: Vas engadir %{count} publicación desde %{filename} aos teus marcadores. + other: Vas engadir %{count} publicacións desde %{filename} aos teus marcadores. + domain_blocking_html: + one: Vas bloquear a %{count} dominio desde %{filename}. + other: Vas bloquear a %{count} dominios desde %{filename}. + following_html: + one: Vas seguir a %{count} conta desde %{filename}. + other: Vas seguir a %{count} contas desde %{filename}. + lists_html: + one: Vas engadir %{count} conta desde %{filename} ás túas listas. Crearánse novas listas se non hai listas ás que engadilas. + other: Vas engadir %{count} contas desde %{filename} ás túas listas. Crearánse novas listas se non hai listas ás que engadilas. + muting_html: + one: Vas acalar a %{count} conta desde %{filename}. + other: Vas acalar a %{count} contas desde %{filename}. preface: Podes importar os datos que exportaches doutro servidor, tales como a lista de usuarias que estás a seguir ou bloquear. recent_imports: Importacións recentes states: diff --git a/config/locales/he.yml b/config/locales/he.yml index 846b0d14a..f2732678b 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1416,19 +1416,67 @@ he: overwrite: דריסה overwrite_long: החלף רשומות נוכחיות בחדשות overwrite_preambles: - blocking_html: אתם עומדים להחליף את רשימת החסימות עד כדי %{total_items} חשבונות מהקובץ %{filename}. - bookmarks_html: אתם עומדים להחליף את רשימת הסימניות עד כדי %{total_items} הודעות מהקובץ %{filename}. - domain_blocking_html: אתם עומדים להחליף את רשימת חסימות השרתים עד כדי %{total_items} שרתים מהקובץ %{filename}. - following_html: אתם עומדים לעקוב עד כדי %{total_items} חשבונות מהקובץ %{filename} ובמקביל להפסיק מעקב אחרי כל משתמש אחר. - lists_html: הפעולה הבאה תחליף את רשימותיך בתוכן של %{filename}. עד %{total_items} חשבונות יתווספו לרשימות חדשות. - muting_html: אתם עומדים להחליף את רשימת ההשתקות עד כדי %{total_items} חשבונות מהקובץ %{filename}. + blocking_html: + many: אתם עומדים להחליף את רשימת החסימות עד כדי %{count} חשבונות מהקובץ %{filename}. + one: אתם עומדים להחליף את רשימת החסימות %{count} בחשבון אחד מהקובץ %{filename}. + other: אתם עומדים להחליף את רשימת החסימות עד כדי %{count} חשבונות מהקובץ %{filename}. + two: אתם עומדים להחליף את רשימת החסימות בעד שני חשבונות מהקובץ %{filename}. + bookmarks_html: + many: אתם עומדים להחליף את רשימת הסימניות עד כדי %{count} הודעות מהקובץ %{filename}. + one: אתם עומדים להחליף את רשימת הסימניות בהודעה אחת מהקובץ %{filename}. + other: אתם עומדים להחליף את רשימת הסימניות עד כדי %{count} הודעות מהקובץ %{filename}. + two: אתם עומדים להחליף את רשימת הסימניות עד כדי שתי הודעות מהקובץ %{filename}. + domain_blocking_html: + many: אתם עומדים להחליף את רשימת חסימות השרתים עד כדי %{count} שרתים מהקובץ %{filename}. + one: אתם עומדים להחליף את רשימת חסימות השרתים בשרת אחד מהקובץ %{filename}. + other: אתם עומדים להחליף את רשימת חסימות השרתים עד כדי %{count} שרתים מהקובץ %{filename}. + two: אתם עומדים להחליף את רשימת חסימות השרתים עד כדי שני שרתים מהקובץ %{filename}. + following_html: + many: אתם עומדים לעקוב אחרי עד כדי %{count} חשבונות מהקובץ %{filename} ובמקביל להפסיק מעקב אחרי כל משתמש אחר. + one: אתם עומדים לעקוב אחרי חשבון אחד מהקובץ %{filename} ובמקביל להפסיק מעקב אחרי כל משתמש אחר. + other: אתם עומדים לעקוב אחרי עד כדי %{count} חשבונות מהקובץ %{filename} ובמקביל להפסיק מעקב אחרי כל משתמש אחר. + two: אתם עומדים לעקוב אחרי עד כדי שני חשבונות מהקובץ %{filename} ובמקביל להפסיק מעקב אחרי כל משתמש אחר. + lists_html: + many: הפעולה הבאה תחליף את רשימותיך בתוכן של %{filename}. עד %{count} חשבונות יתווספו לרשימות חדשות. + one: הפעולה הבאה תחליף את רשימותיך בתוכן של %{filename}. עד חשבון אחד יתווסף לרשימות חדשות. + other: הפעולה הבאה תחליף את רשימותיך בתוכן של %{filename}. עד %{count} חשבונות יתווספו לרשימות חדשות. + two: הפעולה הבאה תחליף את רשימותיך בתוכן של %{filename}. עד שני חשבונות יתווספו לרשימות חדשות. + muting_html: + many: אתם עומדים להחליף את רשימת ההשתקות בעד כדי %{count} חשבונות מהקובץ %{filename}. + one: אתם עומדים להחליף את רשימת ההשתקות בחשבון אחד מהקובץ %{filename}. + other: אתם עומדים להחליף את רשימת ההשתקות בעד כדי %{count} חשבונות מהקובץ %{filename}. + two: אתם עומדים להחליף את רשימת ההשתקות בעד כדי שני חשבונות מהקובץ %{filename}. preambles: - blocking_html: אתם עומדים לחסום עד %{total_items} חשבונות מהקובץ %{filename}. - bookmarks_html: אתם עומדים להוסיף עד %{total_items} הודעות מהקובץ %{filename} לרשימת הסימניות שלכם. - domain_blocking_html: אתם עומדים לחסום עד כדי %{total_items} שרתים מהקובץ %{filename}. - following_html: אתם עומדים לעקוב אחרי עד %{total_items} חשבונות מהקובץ %{filename}. - lists_html: הפעולה הבאה תוסיף עד %{total_items} חשבונות מהקובץ %{filename} אל הרשימות שלך. רשימות חדשות יווצרו אם עוד לא קיימת רשימה להוסיף אליה. - muting_html: אתם עומדים להשתיק עד %{total_items} חשבונות מהקובץ %{filename}. + blocking_html: + many: אתם עומדים לחסום עד %{count} חשבונות מהקובץ %{filename}. + one: אתם עומדים לחסוםחשבון אחד מהקובץ %{filename}. + other: אתם עומדים לחסום עד %{count} חשבונות מהקובץ %{filename}. + two: אתם עומדים לחסום עד שני חשבונות מהקובץ %{filename}. + bookmarks_html: + many: אתם עומדים להוסיף עד %{count} הודעות מהקובץ %{filename} לרשימת הסימניות שלכם. + one: אתם עומדים להוסיףהודעה אחת מהקובץ %{filename} לרשימת הסימניות שלכם. + other: אתם עומדים להוסיף עד %{count} הודעות מהקובץ %{filename} לרשימת הסימניות שלכם. + two: אתם עומדים להוסיף עד שתי הודעות מהקובץ %{filename} לרשימת הסימניות שלכם. + domain_blocking_html: + many: אתם עומדים לחסום עד כדי %{count} שרתים מהקובץ %{filename}. + one: אתם עומדים לחסום עד שרת אחד מהקובץ %{filename}. + other: אתם עומדים לחסום עד כדי %{count} שרתים מהקובץ %{filename}. + two: אתם עומדים לחסום עד כדי שני שרתים מהקובץ %{filename}. + following_html: + many: אתם עומדים לעקוב אחרי עד %{count} חשבונות מהקובץ %{filename}. + one: אתם עומדים לעקוב אחרי עד חשבון אחד מהקובץ %{filename}. + other: אתם עומדים לעקוב אחרי עד %{count} חשבונות מהקובץ %{filename}. + two: אתם עומדים לעקוב אחרי עד שני חשבונות מהקובץ %{filename}. + lists_html: + many: הפעולה הבאה תוסיף עד %{count} חשבונות מהקובץ %{filename} אל הרשימות שלך. רשימות חדשות יווצרו אם עוד לא קיימת רשימה להוסיף אליה. + one: הפעולה הבאה תוסיף עד חשבון אחד מהקובץ %{filename} אל הרשימות שלך. רשימות חדשות יווצרו אם עוד לא קיימת רשימה להוסיף אליה. + other: הפעולה הבאה תוסיף עד %{count} חשבונות מהקובץ %{filename} אל הרשימות שלך. רשימות חדשות יווצרו אם עוד לא קיימת רשימה להוסיף אליה. + two: הפעולה הבאה תוסיף עד שני חשבונות מהקובץ %{filename} אל הרשימות שלך. רשימות חדשות יווצרו אם עוד לא קיימת רשימה להוסיף אליה. + muting_html: + many: אתם עומדים להשתיק עד %{count} חשבונות מהקובץ %{filename}. + one: אתם עומדים להשתיק עד חשבון אחד מהקובץ %{filename}. + other: אתם עומדים להשתיק עד %{count} חשבונות מהקובץ %{filename}. + two: אתם עומדים להשתיק עד שני חשבונות מהקובץ %{filename}. preface: ניתן ליבא מידע מסויים כגון כל הנעקבים או המשתמשים החסומים לתוך חשבונך על שרת זה, מתוך קבצים שנוצרו על ידי יצוא משרת אחר כגון רשימת הנעקבים והחסומים שלך. recent_imports: ייבואים אחרונים states: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5a00db954..15c632adc 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1366,19 +1366,43 @@ hu: overwrite: Felülírás overwrite_long: Lecseréljük újakkal a jelenlegi bejegyzéseket overwrite_preambles: - blocking_html: 'Arra készülsz, hogy lecseréld a letiltási listát legfeljebb %{total_items} fiókra a következőből: %{filename}.' - bookmarks_html: 'Arra készülsz, hogy lecseréld a könyvjelzőket legfeljebb %{total_items} bejegyzésre a következőből: %{filename}.' - domain_blocking_html: 'Arra készülsz, hogy lecseréld a domain letiltási listát legfeljebb %{total_items} domainre a következőből: %{filename}.' - following_html: 'Arra készülsz, hogy legfeljebb %{total_items} fiókot kövess a következőből: %{filename}, és abbahagyd mindenki más követését.' - lists_html: Arra készülsz, hogy a listákat lecseréld a %{filename} tartalmával. Legfeljebb %{total_items} fiók kerül fel az új listákra. - muting_html: 'Arra készülsz, hogy lecseréld a némított fiókok listáját legfeljebb %{total_items} fiókra a következőből: %{filename}.' + blocking_html: + one: 'Arra készülsz, hogy lecseréld a letiltási listát legfeljebb %{count} fiókra a következőből: %{filename}.' + other: 'Arra készülsz, hogy lecseréld a letiltási listát legfeljebb %{count} fiókra a következőből: %{filename}.' + bookmarks_html: + one: 'Arra készülsz, hogy lecseréld a könyvjelzőket legfeljebb %{count} bejegyzésre a következőből: %{filename}.' + other: 'Arra készülsz, hogy lecseréld a könyvjelzőket legfeljebb %{count} bejegyzésre a következőből: %{filename}.' + domain_blocking_html: + one: 'Arra készülsz, hogy lecseréld a domain letiltási listát legfeljebb %{count} domainre a következőből: %{filename}.' + other: 'Arra készülsz, hogy lecseréld a domain letiltási listát legfeljebb %{count} domainre a következőből: %{filename}.' + following_html: + one: 'Arra készülsz, hogy legfeljebb %{count} fiókot kövess a következőből: %{filename}, és abbahagyd mindenki más követését.' + other: 'Arra készülsz, hogy legfeljebb %{count} fiókot kövess a következőből: %{filename}, és abbahagyd mindenki más követését.' + lists_html: + one: Arra készülsz, hogy a listákat lecseréld a %{filename} tartalmával. Legfeljebb %{count} fiók kerül fel az új listákra. + other: Arra készülsz, hogy a listákat lecseréld a %{filename} tartalmával. Legfeljebb %{count} fiók kerül fel az új listákra. + muting_html: + one: 'Arra készülsz, hogy lecseréld a némított fiókok listáját legfeljebb %{count} fiókra a következőből: %{filename}.' + other: 'Arra készülsz, hogy lecseréld a némított fiókok listáját legfeljebb %{count} fiókra a következőből: %{filename}.' preambles: - blocking_html: 'Arra készülsz, hogy legfeljebb %{total_items} fiókot letilts a következőből: %{filename}.' - bookmarks_html: 'Arra készülsz, hogy legfeljebb %{total_items} bejegyzést adj hozzá a könyvjelzőkhöz a következőből: %{filename}.' - domain_blocking_html: 'Arra készülsz, hogy legfeljebb %{total_items} domaint letilts a következőből: %{filename}.' - following_html: 'Arra készülsz, hogy legfeljebb %{total_items} fiókot kövess a következőből: %{filename}.' - lists_html: Arra készülsz, hogy legfeljebb %{total_items} fiókot hozzáadj a %{filename} fájlból a listákhoz. Új listák jönnek létre, ha nincs hozzáadható lista. - muting_html: 'Arra készülsz, hogy legfeljebb %{total_items} fiókot némíts a következőből: %{filename}.' + blocking_html: + one: 'Arra készülsz, hogy legfeljebb %{count} fiókot letilts a következőből: %{filename}.' + other: 'Arra készülsz, hogy legfeljebb %{count} fiókot letilts a következőből: %{filename}.' + bookmarks_html: + one: 'Arra készülsz, hogy legfeljebb %{count} bejegyzést adj hozzá a könyvjelzőkhöz a következőből: %{filename}.' + other: 'Arra készülsz, hogy legfeljebb %{count} bejegyzést adj hozzá a könyvjelzőkhöz a következőből: %{filename}.' + domain_blocking_html: + one: 'Arra készülsz, hogy legfeljebb %{count} domaint letilts a következőből: %{filename}.' + other: 'Arra készülsz, hogy legfeljebb %{count} domaint letilts a következőből: %{filename}.' + following_html: + one: 'Arra készülsz, hogy legfeljebb %{count} fiókot kövess a következőből: %{filename}.' + other: 'Arra készülsz, hogy legfeljebb %{count} fiókot kövess a következőből: %{filename}.' + lists_html: + one: Arra készülsz, hogy legfeljebb %{count} fiókot hozzáadj a %{filename} fájlból a listákhoz. Új listák jönnek létre, ha nincs hozzáadható lista. + other: Arra készülsz, hogy legfeljebb %{count} fiókot hozzáadj a %{filename} fájlból a listákhoz. Új listák jönnek létre, ha nincs hozzáadható lista. + muting_html: + one: 'Arra készülsz, hogy legfeljebb %{count} fiókot némíts a következőből: %{filename}.' + other: 'Arra készülsz, hogy legfeljebb %{count} fiókot némíts a következőből: %{filename}.' preface: Itt importálhatod egy másik kiszolgálóról lementett adataidat, például követettjeid és letiltott felhasználóid listáját. recent_imports: Legutóbbi importálások states: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index a8bc48b30..4d9148674 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1346,20 +1346,6 @@ ia: merge_long: Conservar le registros existente e adder noves overwrite: Superscriber overwrite_long: Reimplaciar registros actual con le noves - overwrite_preambles: - blocking_html: Tu es sur le puncto de reimplaciar tu lista de blocadas per usque a %{total_items} contos proveniente de %{filename}. - bookmarks_html: Tu es sur le puncto de reimplaciar tu marcapaginas per usque a %{total_items} messages desde %{filename}. - domain_blocking_html: Tu es sur le puncto de reimplaciar tu lista de blocadas de dominio per usque a %{total_items} dominios proveniente de %{filename}. - following_html: Tu es sur le puncto de sequer usque a %{total_items} contos de %{filename} e cessar de sequer tote le alteres. - lists_html: Tu es sur le puncto de reimplaciar tu listas per le contento de %{filename}. Usque a %{total_items} contos essera addite a nove listas. - muting_html: Tu es sur le puncto de reimplaciar tu lista de contos silentiate con usque a %{total_items} contos desde %{filename}. - preambles: - blocking_html: Tu es sur le puncto de blocar usque a %{total_items} contos a partir de %{filename}. - bookmarks_html: Tu es sur le puncto de adder usque a %{total_items} messages desde %{filename} a tu marcapaginas. - domain_blocking_html: Tu es sur le puncto de blocar usque a %{total_items} dominios a partir de %{filename}. - following_html: Tu es sur le puncto de sequer usque a %{total_items} contos desde %{filename}. - lists_html: Tu es sur le puncto de adder usque %{total_items} contos desde %{filename} a tu listas. Nove listas essera create si il non ha un lista al qual adder los. - muting_html: Tu es sur le puncto de silentiar usque a %{total_items} contos desde %{filename}. preface: Tu pote importar datos que tu ha exportate de un altere servitor, como un lista de personas que tu seque o bloca. recent_imports: Importationes recente states: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 7e8140a37..94c4b7f4f 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1274,20 +1274,6 @@ ie: merge_long: Conservar existent registres e adjunter li novis overwrite: Remplazzar overwrite_long: Remplazzar existent registres per li novis - overwrite_preambles: - blocking_html: Tu va remplazzar tui liste de bloccat contos per til %{total_items} contos de %{filename}. - bookmarks_html: Tu va remplazzar tui marcatores per til %{total_items} postas de %{filename}. - domain_blocking_html: Tu va remplazzar tui liste de bloccat dominias per til %{total_items} dominias de %{filename}. - following_html: Tu va sequer til %{total_items} contos de %{filename} e dessequer omni altri contos. - lists_html: Tu va remplazzar tui listes per li contenete de %{filename}. Til %{total_items} contos va esser adjuntet a nov listes. - muting_html: Tu va remplazzar tui liste de silentiat contos per til %{total_items} contos de %{filename}. - preambles: - blocking_html: Tu va bloccar til %{total_items} contos de %{filename}. - bookmarks_html: Tu va adjunter til %{total_items} postas de %{filename} a tui marcatores. - domain_blocking_html: Tu va bloccar til %{total_items} dominias de %{filename}. - following_html: Tu va sequer til %{total_items} contos de %{filename}. - lists_html: Tu va adjunter til %{total_items} contos de %{filename} a tui listes. Nov listes va esser creat si ne hay un liste a quel adjunter. - muting_html: Tu va silentiar til %{total_items} contos de %{filename}. preface: Tu posse importar data quel tu ha exportat de un altri servitor, quam un liste del gente quem tu seque o blocca. recent_imports: Recent importationes states: diff --git a/config/locales/io.yml b/config/locales/io.yml index dfb583450..8ce5f3403 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1247,20 +1247,6 @@ io: merge_long: Retenez displonebla rekordi e insertez novi overwrite: Remplasez overwrite_long: Remplasez nuna rekordi per novi - overwrite_preambles: - blocking_html: Vu substitucos vua blokusolisto per til %{total_items} konti de %{filename}. - bookmarks_html: Vu substitucos vua libromarki per til %{total_items} posti de %{filename}. - domain_blocking_html: Vu substitucos vua domenoblokusolisto per til %{total_items} domeni de %{filename}. - following_html: Vu sequos til %{total_items} konti de %{filename} e haltar sequar irga altra konto. - lists_html: Vu substitucos vua listi kun la kontenaji di %{filename}. Til %{total_items} konti adjuntesos a nova listi. - muting_html: Vu substitucos vua listo di konti silencigita per til %{total_items} konti de %{filename}. - preambles: - blocking_html: Vu blokusos til %{total_items} konti de %{filename}. - bookmarks_html: Vu adjuntos %{total_items} posti de %{filename} a vua libromarki. - domain_blocking_html: Vu blokusos til %{total_items} domeni de %{filename}. - following_html: Vu sequos til %{total_items} konti de %{filename}. - lists_html: Vu adjuntos til %{total_items} konti de %{filename} a vua listi. Nova listi kreesos se ne existas listo a quo adjuntar. - muting_html: Vu silencigos til %{total_items} konti en %{filename}. preface: Tu povas importacar kelka datumi, tal quala listi de omna homi quin tu sequas o blokusas, a tua konto di ca instaluro, per dosiero exportacita de altra instaluro. recent_imports: Importacaji recenta states: diff --git a/config/locales/is.yml b/config/locales/is.yml index 4af26eea0..6eefaf1b0 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -877,6 +877,9 @@ is: message_html: Þú hefur ekki skilgreint neinar reglur fyrir netþjón. sidekiq_process_check: message_html: Ekkert Sidekiq-ferli er í gangi fyrir %{value} biðröð/biðraðir. Endilega athugaðu Sidekiq-uppsetninguna þína + software_version_check: + action: Skoða tiltækar uppfærslur + message_html: Uppfærsla er tiltæk fyrir Mastodon. software_version_critical_check: action: Skoða tiltækar uppfærslur message_html: Áríðandi uppfærsla Mastodon er tiltæk, uppfærðu eins fljótt og auðið er. @@ -1366,20 +1369,6 @@ is: merge_long: Halda fyrirliggjandi færslum og bæta við nýjum overwrite: Skrifa yfir overwrite_long: Skipta út fyrirliggjandi færslum með þeim nýju - overwrite_preambles: - blocking_html: Þú er í þann mund að fara að skipta út útilokanalistanum þínum með allt að %{total_items} aðgöngum úr %{filename}. - bookmarks_html: Þú er í þann mund að fara að skipta út bókamerkjunum þínum með allt að %{total_items} færslum úr %{filename}. - domain_blocking_html: Þú er í þann mund að fara að skipta út listanum þínum yfir útilokuð lén með allt að %{total_items} lénum úr %{filename}. - following_html: Þú er í þann mund að fara að fylgjast með allt að %{total_items} aðgöngum úr %{filename} og hætta að fylgjast með öllum öðrum. - lists_html: Þú ert í þann mund að fara að skipta út listunum þínum með efninu úr %{filename}. Allt að %{total_items} aðgöngum verður bætt við nýju listana. - muting_html: Þú er í þann mund að fara að skipta út listanum þínum yfir útilokaða aðganga með allt að %{total_items} aðgöngum úr %{filename}. - preambles: - blocking_html: Þú er í þann mund að fara að útiloka allt að %{total_items} aðganga úr %{filename}. - bookmarks_html: Þú er í þann mund að fara að bæta við allt að %{total_items} færslum úr %{filename} við bókamerkin þín. - domain_blocking_html: Þú er í þann mund að fara að útiloka allt að %{total_items} lén úr %{filename}. - following_html: Þú er í þann mund að fara að fylgjast með allt að %{total_items} aðgöngum úr %{filename}. - lists_html: Þú ert í þann mund að fara að bæta við allt að %{total_items} aðgöngum úr %{filename} við listana þína. Nýir listar verða útbúnir ef ekki finnst neinn listi til að bæta í. - muting_html: Þú er í þann mund að fara að þagga allt að %{total_items} aðganga úr %{filename}. preface: Þú getur flutt inn gögn sem þú hefur flutt út frá öðrum vefþjóni, svo sem lista yfir fólk sem þú fylgist með eða útilokar. recent_imports: Nýlega flutt inn states: @@ -1696,6 +1685,7 @@ is: delete: Eyðing notandaaðgangs development: Þróun edit_profile: Breyta notandasniði + export: Flytja út featured_tags: Myllumerki með aukið vægi import: Flytja inn import_and_export: Inn- og útflutningur diff --git a/config/locales/it.yml b/config/locales/it.yml index a89fa0a53..91b67c2b4 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1368,19 +1368,43 @@ it: overwrite: Sovrascrivi overwrite_long: Sostituisci record attuali con quelli nuovi overwrite_preambles: - blocking_html: Stai per sostituire la tua lista di blocchi con un massimo di %{total_items} account da %{filename}. - bookmarks_html: Stai per sostituire i tuoi segnalibri con un massimo di %{total_items} post da %{filename}. - domain_blocking_html: Stai per sostituire la tua lista di domini bloccati con un massimo di %{total_items} domini da %{filename}. - following_html: Stai per seguire fino a %{total_items} account da %{filename} e smettere di seguire chiunque altro. - lists_html: Stai per sostituire le tue liste con i contenuti di %{filename}. Fino a %{total_items} profili verranno aggiunti a nuove liste. - muting_html: Stai per sostituire la tua lista di account silenziati con un massimo di %{total_items} account da %{filename}. + blocking_html: + one: Stai per sostituire la tua lista di blocchi con %{count} account da %{filename}. + other: Stai per sostituire la tua lista di blocchi con %{count} account da %{filename}. + bookmarks_html: + one: Stai per sostituire i tuoi segnalibri con %{count} post da %{filename}. + other: Stai per sostituire i tuoi segnalibri con %{count} post da %{filename}. + domain_blocking_html: + one: Stai per sostituire la tua lista di domini bloccati con %{count} dominio da %{filename}. + other: Stai per sostituire la tua lista di domini bloccati con %{count} domini da %{filename}. + following_html: + one: Stai per seguire %{count} account da %{filename} e smettere di seguire chiunque altro. + other: Stai per seguire %{count} account da %{filename} e smettere di seguire chiunque altro. + lists_html: + one: Stai per sostituire le tue liste con il contenuto di %{filename}. Verrà aggiunto %{count} account alle nuove liste. + other: Stai per sostituire le tue liste con il contenuto di %{filename}. Verranno aggiunti %{count} account alle nuove liste. + muting_html: + one: Stai per sostituire la lista degli account silenziati con %{count} account da %{filename}. + other: Stai per sostituire la lista degli account silenziati con %{count} account da %{filename}. preambles: - blocking_html: Stai per bloccare fino a %{total_items} account da %{filename}. - bookmarks_html: Stai per aggiungere fino a %{total_items} post da %{filename} ai tuoi segnalibri. - domain_blocking_html: Stai per bloccare fino a %{total_items} domini da %{filename}. - following_html: Stai per seguire fino a %{total_items} account da %{filename}. - lists_html: Stai per aggiungere fino a %{total_items} profili da %{filename} alla tue liste. Le nuove liste saranno create se non c'è una lista a cui aggiungere. - muting_html: Stai per silenziare fino a %{total_items} account da %{filename}. + blocking_html: + one: Stai per bloccare %{count} account da %{filename}. + other: Stai per bloccare %{count} account da %{filename}. + bookmarks_html: + one: Stai per aggiungere %{count} post da %{filename} ai tuoi segnalibri. + other: Stai per aggiungere %{count} post da %{filename} ai tuoi segnalibri. + domain_blocking_html: + one: Stai per bloccare %{count} dominio da %{filename}. + other: Stai per bloccare %{count} domini da %{filename}. + following_html: + one: Stai per seguire %{count} account da %{filename}. + other: Stai per seguire %{count} account da %{filename}. + lists_html: + one: Stai per aggiungere %{count} account da %{filename} alle tue liste. Saranno create nuove liste, se non ce ne sono altre da aggiungere. + other: Stai per aggiungere %{count} account da %{filename} alle tue liste. Saranno create nuove liste, se non ce ne sono altre da aggiungere. + muting_html: + one: Stai per silenziare %{count} account da %{filename}. + other: Stai per silenziare %{count} account da %{filename}. preface: Puoi importare alcune informazioni, come le persone che segui o hai bloccato su questo server, da file creati da un'esportazione su un altro server. recent_imports: Importazioni recenti states: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 41f93397d..54b7fb541 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1141,6 +1141,9 @@ ja: view_strikes: 過去のストライクを表示 too_fast: フォームの送信が速すぎます。もう一度やり直してください。 use_security_key: セキュリティキーを使用 + author_attribution: + example_title: サンプルテキスト + s_blog: "%{name} のブログ" challenge: confirm: 続ける hint_html: 以後1時間はパスワードの再入力を求めません @@ -1330,20 +1333,6 @@ ja: merge_long: 現在のレコードを保持したまま新しいものを追加します overwrite: 上書き overwrite_long: 現在のレコードを新しいもので置き換えます - overwrite_preambles: - blocking_html: "%{filename}%{total_items}個のアカウントブロックしたアカウントリストを置き換えます。" - bookmarks_html: "%{filename}%{total_items}件の投稿ブックマークの一覧を置き換えます。" - domain_blocking_html: "%{filename}%{total_items}個のドメイン非表示にしたドメインリストを置き換えます。" - following_html: "%{filename}%{total_items}個のアカウントフォローします。また、この中に含まれていないアカウントのフォローを解除します。" - lists_html: "作成済みのリスト%{filename}の内容で置き換えます%{total_items}個のアカウントが新しいリストに追加されます。" - muting_html: "%{filename}%{total_items}個のアカウントミュートしたアカウントリストを置き換えます。" - preambles: - blocking_html: "%{filename}%{total_items}個のアカウントブロックします。" - bookmarks_html: "%{filename}%{total_items}件の投稿ブックマークに追加します。" - domain_blocking_html: "%{filename}%{total_items}個のドメイン非表示にします。" - following_html: "%{filename}%{total_items}個のアカウントフォローします。" - lists_html: "%{filename}%{total_items}個のアカウントリストに追加します。追加先のリストがない場合は新しく作成されます。" - muting_html: "%{filename}%{total_items}個のアカウントミュートします。" preface: 他のサーバーでエクスポートされたファイルから、フォロー/ブロックした情報をこのサーバー上のアカウントにインポートできます。 recent_imports: 最近のインポート states: @@ -1659,6 +1648,7 @@ ja: delete: アカウントの削除 development: 開発 edit_profile: プロフィールを編集 + export: エクスポート featured_tags: 注目のハッシュタグ import: データのインポート import_and_export: インポート・エクスポート @@ -1903,6 +1893,7 @@ ja: instructions_html: 以下のコードをコピーしてwebサイトのHTMLに貼り付けます。次に「プロフィールを編集」タブから、「プロフィール補足情報」のいずれかの欄にwebサイトのURLを記入し、「変更を保存」をクリックしてください。 verification: 認証 verified_links: 確認済みリンク + website_verification: ウェブサイトの認証 webauthn_credentials: add: セキュリティキーを追加 create: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 3f6c4b39b..d20d67e4c 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1343,19 +1343,31 @@ ko: overwrite: 덮어쓰기 overwrite_long: 기존 것을 모두 지우고 새로 추가 overwrite_preambles: - blocking_html: 나의 차단 목록%{filename}에서 가져온 %{total_items} 개의 계정으로 덮어 씌우려고 합니다. - bookmarks_html: 나의 북마크%{filename}에서 가져온 %{total_items} 개의 게시물로 덮어 씌우려고 합니다. - domain_blocking_html: 나의 도메인 차단 목록%{filename}에서 가져온 %{total_items} 개의 도메인으로 덮어 씌우려고 합니다. - following_html: "%{filename}에서 가져온 %{total_items} 개의 계정팔로우하고 나머지 계정을 팔로우 해제하려고 합니다." - lists_html: 나의 리스트%{filename}에서 가져온 %{total_items} 개의 계정으로 덮어 씌우려고 합니다. - muting_html: 나의 뮤트한 계정 목록%{filename}에서 가져온 %{total_items} 개의 계정으로 덮어 씌우려고 합니다. + blocking_html: + other: 나의 차단 목록%{filename}에서 가져온 %{count} 개의 계정으로 덮어 씌우려고 합니다. + bookmarks_html: + other: 나의 북마크%{filename}에서 가져온 %{count} 개의 게시물로 덮어 씌우려고 합니다. + domain_blocking_html: + other: 나의 도메인 차단 목록%{filename}에서 가져온 %{count} 개의 도메인으로 덮어 씌우려고 합니다. + following_html: + other: "%{filename}에서 가져온 %{count} 개의 계정팔로우하고 나머지 계정을 팔로우 해제하려고 합니다." + lists_html: + other: 나의 리스트%{filename}에서 가져온 %{count} 개의 계정으로 덮어 씌우려고 합니다. + muting_html: + other: 나의 뮤트한 계정 목록%{filename}에서 가져온 %{count} 개의 계정으로 덮어 씌우려고 합니다. preambles: - blocking_html: "%{filename}에서 가져온 %{total_items}개의 계정을 차단하려고 합니다." - bookmarks_html: "%{filename}에서 가져온 %{total_items}개의 게시물을 북마크에 추가하려고 합니다." - domain_blocking_html: "%{filename}에서 가져온 %{total_items}개의 도메인을 차단하려고 합니다." - following_html: "%{filename}에서 가져온 %{total_items}개의 계정을 팔로우하려고 합니다." - lists_html: "%{filename}에서 가져온 %{total_items}개의 계정을 내 리스트에 추가하려고 합니다. 추가할 리스트가 존재하지 않으면 새로 생성될 것입니다." - muting_html: "%{filename}에서 가져온 %{total_items}개의 계정을 뮤트하려고 합니다." + blocking_html: + other: "%{filename}에서 가져온 %{count}개의 계정을 차단하려고 합니다." + bookmarks_html: + other: "%{filename}에서 가져온 %{count}개의 게시물을 북마크에 추가하려고 합니다." + domain_blocking_html: + other: "%{filename}에서 가져온 %{count}개의 도메인을 차단하려고 합니다." + following_html: + other: "%{filename}에서 가져온 %{count}개의 계정을 팔로우하려고 합니다." + lists_html: + other: "%{filename}에서 가져온 %{count}개의 계정을 내 리스트에 추가하려고 합니다. 추가할 리스트가 존재하지 않으면 새로 생성될 것입니다." + muting_html: + other: "%{filename}에서 가져온 %{count}개의 계정을 뮤트하려고 합니다." preface: 다른 서버에서 내보내기 한 파일에서 팔로우 / 차단 정보를 이 계정으로 불러올 수 있습니다. recent_imports: 최근의 가져오기 states: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 275bdab86..97fcf7518 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1323,20 +1323,6 @@ lad: merge_long: Manten rejistros egzistentes i adjusta muevos overwrite: Sobreskrive overwrite_long: Mete muevos rejistros en vez de los aktuales - overwrite_preambles: - blocking_html: Estas a punto de substituyir tu lista de blokos por asta %{total_items} kuentos de %{filename}. - bookmarks_html: Estas a punto de substituyir tus markadores por asta %{total_items} publikasyones ke vinyeron de %{filename}. - domain_blocking_html: Estas a punto de substituyir tu lista de blokos de domeno por asta %{total_items} domenos de %{filename}. - following_html: Estas a punto de segir asta %{total_items} kuentos de %{filename} i deshar de segir todos los otros kuentos. - lists_html: Estas a punto de sustituyir tus listas con el kontenido de %{filename}. Asta %{total_items} kuentos seran adjustados a muevas listas. - muting_html: Estas a punto de substituyir tu lista de kuentos silensyados por asta %{total_items} kuentos de %{filename}. - preambles: - blocking_html: Estas a punto de blokar asta %{total_items} kuentos de %{filename}. - bookmarks_html: Estas a punto de adjustar asta %{total_items} publikasyones de %{filename} a tus markadores. - domain_blocking_html: Estas a punto de blokar asta %{total_items} domenos de %{filename}. - following_html: Estas a punto de segir asta %{total_items} kuentos de %{filename}. - lists_html: Estas a punto de adjustar %{total_items} kuentos dizde %{filename} a tus listas. Se kriyaran muevas listas si no ay listas para adjustarlas. - muting_html: Estas a punto de silensyar asta %{total_items} kuentos de %{filename}. preface: Puedes importar siertos datos, komo todas las personas a las kualas estas sigiendo o blokando en tu kuento en esta instansya, dizde dosyas eksportadas de otra instansya. recent_imports: Importasyones resyentes states: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 2cc8ff6a4..5f90b575e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1344,20 +1344,6 @@ lv: merge_long: Saglabāt esošos ierakstus un pievienot jaunus overwrite: Pārrakstīt overwrite_long: Nomainīt pašreizējos ierakstus ar jauniem - overwrite_preambles: - blocking_html: Tu gatavojies aizstāt savu bloķēto sarakstu ar līdz pat %{total_items} kontiem no %{filename}. - bookmarks_html: Tu gatavojies aizstāt savas bloķētās izlases ar līdz pat %{total_items} ziņām no %{filename}. - domain_blocking_html: Tu gatavojies aizstāt savu bloķēto domēnu sarakstu ar līdz pat %{total_items} domēniem no %{filename}. - following_html: Tu gatavojies sekot līdz pat %{total_items} kontiem no %{filename} un pārtrauksi sekot citiem. - lists_html: Tu gatavojies aizstāt savus sarakstus ar %{filename} saturu. Līdz %{total_items} kontiem tiks pievienoti jauni saraksti. - muting_html: Tu gatavojies aizstāt savu noklusināto kontu sarakstu ar līdz pat %{total_items} kontiem no %{filename}. - preambles: - blocking_html: Tu gatavojies bloķēt līdz pat %{total_items} kontiem no %{filename}. - bookmarks_html: Tu gatavojies pievienot līdz pat %{total_items} ziņām no %{filename} savām grāmatzīmēm. - domain_blocking_html: Tu gatavojies bloķēt līdz pat %{total_items} domēniem no %{filename}. - following_html: Tu gatavojies sekot līdz pat %{total_items} kontiem no %{filename}. - lists_html: Tu gatavojies pievienot līdz pat %{total_items} kontiem no %{filename} saviem sarakstiem. Jauni saraksti tiks izveidoti, ja nav saraksta, ko pievienot. - muting_html: Tu gatavojies noklusināt līdz pat %{total_items} kontiem no %{filename}. preface: Tu vari ievietot datus, kurus esi izguvis no cita servera, kā, piemēram, cilvēku sarakstu, kuriem Tu seko vai kurus bloķē. recent_imports: Nesen importēts states: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 9994a34bb..90493a30b 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1223,20 +1223,6 @@ ms: merge_long: Simpan rekod sedia ada dan tambah rekod baharu overwrite: Tulis ganti overwrite_long: Gantikan rekod semasa dengan yang baharu - overwrite_preambles: - blocking_html: Anda akan menggantikan senarai blok anda dengan sehingga %{total_items} akaun daripada %{filename}. - bookmarks_html: Anda akan menggantikan penanda halaman anda dengan sehingga %{total_items} siaran daripada %{filename}. - domain_blocking_html: Anda akan menggantikan senarai blok domain anda dengan sehingga %{total_items} domain daripada %{filename}. - following_html: Anda akan mengikuti sehingga %{total_items} akaun daripada %{filename} dan berhenti mengikuti orang lain. - lists_html: Anda akan menggantikan senarai anda dengan kandungan %{filename}. Sehingga %{total_items} akaun akan ditambahkan pada senarai baharu. - muting_html: Anda akan menggantikan senarai akaun yang diredamkan dengan sehingga %{total_items} akaun daripada %{filename}. - preambles: - blocking_html: Anda akan menyekat sehingga %{total_items} akaun daripada %{filename}. - bookmarks_html: Anda akan menambah sehingga %{total_items} pos daripada %{filename} ke penanda halaman anda. - domain_blocking_html: Anda akan menyekat sehingga %{total_items} domain daripada %{filename}. - following_html: Anda akan mengikuti sehingga %{total_items} akaun daripada %{filename}. - lists_html: Anda akan menambah sehingga %{total_items} akaun daripada %{filename} ke senarai anda. Senarai baharu akan dibuat jika tiada senarai untuk ditambah. - muting_html: Anda akan membisukan sehingga %{total_items} akaun daripada %{filename}. preface: Anda boleh mengimport data yang telah anda eksport dari server lain, seperti senarai orang yang anda ikuti atau sekat. recent_imports: Import terkini states: diff --git a/config/locales/my.yml b/config/locales/my.yml index 598915fad..6a330a16c 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1222,20 +1222,6 @@ my: merge_long: ရှိပြီးသားမှတ်တမ်းများ သိမ်းဆည်းပြီး အသစ်များ ထပ်ထည့်ပါ overwrite: ထပ်ရေးရန် overwrite_long: လက်ရှိမှတ်တမ်းများကို အသစ်များဖြင့် အစားထိုးပါ - overwrite_preambles: - blocking_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ အထိ သင့်ပိတ်ဆို့စာရင်းကို အစားထိုးပါတော့မည်။ - bookmarks_html: သင်သည် %{filename} မှ %{total_items} ပို့စ်များ အထိ သင့် bookmark များကို အစားထိုးပါတော့မည်။ - domain_blocking_html: သင်သည် %{filename} မှ %{total_items} ဒိုမိန်းများ ဖြင့် သင်၏ ဒိုမိန်းပိတ်ဆို့စာရင်းကို အစားထိုးပါတော့မည်။ - following_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ အထိ စောင့်ကြည့် ပြီး အခြားမည်သူ့ကိုမျှ စောင့်မကြည့်တော့ပါ ။ - lists_html: သင်သည် %{filename} ၏ အကြောင်းအရာများဖြင့် သင့်စာရင်းများကို အစားထိုး ပါတော့မည်။ %{total_items} အကောင့်များအထိ စာရင်းအသစ်များသို့ ပေါင်းထည့်ပါမည်။ - muting_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ ဖြင့် အသံပိတ်ထားသော သင့်အကောင့်များစာရင်းကို အစားထိုးပါတော့မည်။ - preambles: - blocking_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ အထိ ပိတ်ဆို့ပါတော့မည်။ - bookmarks_html: သင်သည် %{filename} မှ %{total_items} ပို့စ်များ အထိ သင့် Bookmark များ သို့ ပေါင်းထည့်တော့မည်။ - domain_blocking_html: သင်သည် %{filename} မှ %{total_items} ဒိုမိန်းများ အထိ ပိတ်ဆို့ပါတော့မည်။ - following_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ အထိ စောင့်ကြည့် ပါတော့မည်။ - lists_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ ကို သင့် စာရင်းများ သို့ ပေါင်းထည့်ပါတော့မည်။ ထည့်ရန်စာရင်းမရှိပါက စာရင်းအသစ်များကို ဖန်တီးပါမည်။ - muting_html: သင်သည် %{filename} မှ %{total_items} အကောင့်များ အထိ အသံတိတ်ပါတော့မည်။ preface: သင်စောင့်ကြည့်နေသည့်လူများစာရင်း သို့မဟုတ် ပိတ်ပင်ထားသည့်စာရင်းကဲ့သို့သော အခြားဆာဗာတစ်ခုမှ သင်ထုတ်ယူထားသည့်အချက်အလက်များကို ပြန်လည်ထည့်သွင်းနိုင်သည်။ recent_imports: လတ်တလောထည့်သွင်းမှုများ states: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 7681a04ea..52ec4c89c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1366,19 +1366,43 @@ nl: overwrite: Overschrijven overwrite_long: Huidige gegevens met de nieuwe gegevens vervangen overwrite_preambles: - blocking_html: Je staat op het punt jouw lijst met geblokkeerde accounts te vervangen door %{total_items} accounts vanuit %{filename}. - bookmarks_html: Je staat op het punt jouw bladwijzers te vervangen door %{total_items} berichten vanuit %{filename}. - domain_blocking_html: Je staat op het punt jouw lijst met geblokkeerde domeinen te vervangen door %{total_items} domeinen vanuit %{filename}. - following_html: Je staat op het punt om %{total_items} accounts te volgen vanuit %{filename} en te stoppen met het volgen van alle andere accounts. - lists_html: Je staat op het punt je lijsten te vervangen door inhoud van %{filename}. Er worden totaal %{total_items} accounts aan nieuwe lijsten toegevoegd. - muting_html: Je staat op het punt jouw lijst met genegeerde accounts te vervangen door %{total_items} accounts vanuit %{filename}. + blocking_html: + one: Je staat op het punt om vanuit %{filename} je blokkeerlijst te vervangen met in het totaal %{count} account. + other: Je staat op het punt om vanuit %{filename} je blokkeerlijst te vervangen met in het totaal %{count} accounts. + bookmarks_html: + one: Je staat op het punt om vanuit %{filename} je bladwijzers te vervangen met in het totaal %{count} bericht. + other: Je staat op het punt om vanuit %{filename} je bladwijzers te vervangen met in het totaal %{count} berichten. + domain_blocking_html: + one: Je staat op het punt om vanuit %{filename} je lijst met geblokkeerde domeinen te vervangen met in het totaal %{count} domein. + other: Je staat op het punt om vanuit %{filename} je lijst met geblokkeerde domeinen te vervangen met in het totaal %{count} domeinen. + following_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} account te volgen en de rest te ontvolgen. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} accounts te volgen en de rest te ontvolgen. + lists_html: + one: Je staat op het punt om met de inhoud van %{filename} je lijsten te vervangen. In het totaal wordt %{count} account aan de nieuwe lijst(en) toegevoegd. + other: Je staat op het punt om met de inhoud van %{filename} je lijsten te vervangen. In het totaal worden %{count} accounts aan de nieuwe lijst(en) toegevoegd. + muting_html: + one: Je staat op het punt om vanuit %{filename} je negeerlijst te vervangen met in het totaal %{count} account. + other: Je staat op het punt om vanuit %{filename} je blokkeerlijst te vervangen met in het totaal %{count} accounts. preambles: - blocking_html: Je staat op het punt om %{total_items} accounts te blokkeren vanuit %{filename}. - bookmarks_html: Je staat op het punt om %{total_items} berichten aan je bladwijzers toe te voegen vanuit %{filename}. - domain_blocking_html: Je staat op het punt om %{total_items} accounts te negeren vanuit %{filename}. - following_html: Je staat op het punt om %{total_items} accounts te volgen vanuit %{filename}. - lists_html: Je staat op het punt om tot %{total_items} accounts van %{filename} toe te voegen aan je lijsten. Nieuwe lijsten worden aangemaakt als er geen lijst is om aan toe te voegen. - muting_html: Je staat op het punt om %{total_items} accounts te negeren vanuit %{filename}. + blocking_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} account te blokkeren. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} accounts te blokkeren. + bookmarks_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} bericht aan je bladwijzers toe te voegen. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} berichten aan je bladwijzers toe te voegen. + domain_blocking_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} domein te blokkeren. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} domeinen te blokkeren. + following_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} account te volgen. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} accounts te volgen. + lists_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} account aan je lijsten toe te voegen. Er wordt een nieuwe lijst aangemaakt wanneer er geen lijst is om het aan toe te voegen. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} accounts aan je lijsten toe te voegen. Er worden nieuwe lijsten aangemaakt wanneer er geen lijsten zijn om ze aan toe te voegen. + muting_html: + one: Je staat op het punt om vanuit %{filename} in het totaal %{count} account te negeren. + other: Je staat op het punt om vanuit %{filename} in het totaal %{count} accounts te negeren. preface: Je kunt bepaalde gegevens, zoals de mensen die jij volgt of hebt geblokkeerd, naar jouw account op deze server importeren. Je moet deze gegevens wel eerst op de oorspronkelijke server exporteren. recent_imports: Recent geïmporteerd states: @@ -1526,8 +1550,8 @@ nl: title: Nieuw volgverzoek mention: action: Reageren - body: 'Jij bent door %{name} vermeld in:' - subject: Jij bent vermeld door %{name} + body: 'Je bent door %{name} vermeld in:' + subject: Je bent vermeld door %{name} title: Nieuwe vermelding poll: subject: Een peiling van %{name} is beëindigd diff --git a/config/locales/nn.yml b/config/locales/nn.yml index ca5e34ee5..ec3db6520 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1366,19 +1366,9 @@ nn: overwrite: Skriv over overwrite_long: Byt ut dei noverande oppføringane med dei nye overwrite_preambles: - blocking_html: Du skal til å byta ut blokkeringslista di med opp til %{total_items} brukarkontoar frå %{filename}. - bookmarks_html: Du skal til å byta ut bokmerka dine med opp til %{total_items} innlegg frå %{filename}. - domain_blocking_html: Du skal til å byta ut domeneblokkeringslista di med opp til %{total_items} domene frå %{filename}. - following_html: Du skal til å fylgja opp til %{total_items} brukarkontoar frå %{filename} og slutta å fylgja alle andre. - lists_html: Du er i ferd med å erstatta listene dine med innhaldet i %{filename}. Opptil %{total_items} kontoar vil bli lagt til i nye lister. - muting_html: Du skal til å byta ut lista di over dempa brukarkontoar med opp til %{total_items} brukarkontoar frå %{filename}. - preambles: - blocking_html: Du skal til å blokkera opp til %{total_items} brukarkontoar frå %{filename}. - bookmarks_html: Du skal til å leggja til opp til %{total_items} innlegg frå %{filename} til bokmerka dine. - domain_blocking_html: Du skal til å blokkera opp til %{total_items} domene frå %{filename}. - following_html: Du skal til å fylgja opp til %{total_items} brukarkontoar frå %{filename}. - lists_html: Du er i ferd med å leggja til opptil %{total_items} kontoar frå %{filename} til i listene dine. Nye lister vil blir oppretta om ingen lister finst frå før. - muting_html: Du skal til å dempa opp til %{total_items} brukarkontoar frå %{filename}. + blocking_html: + one: Du skal til å byta ut blokkeringslista di med opp til %{count} brukarkonto frå %{filename}. + other: Du skal til å byta ut blokkeringslista di med opp til %{count} brukarkontoar frå %{filename}. preface: Du kan henta inn data som du har eksportert frå ein annan tenar, som t.d. ei liste over folka du fylgjer eller blokkerer. recent_imports: Siste importar states: diff --git a/config/locales/no.yml b/config/locales/no.yml index ec0b14d5a..94986f4ca 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1268,20 +1268,6 @@ merge_long: Behold eksisterende og legg til nye overwrite: Overskriv overwrite_long: Erstatt gjeldende med de nye - overwrite_preambles: - blocking_html: Du er i ferd med å erstatte din blokkeringsliste med inntil %{total_items} kontoer fra %{filename}. - bookmarks_html: Du er i ferd med å erstatte dine bokmerker med inntil %{total_items} innlegg fra %{filename}. - domain_blocking_html: Du er i ferd med å erstatte din domene-blokkeringsliste med inntil %{total_items} domener fra %{filename}. - following_html: Du er i ferd med å følge inntil %{total_items} kontoer fra %{filename} og slutte å følge alle andre. - lists_html: Du er i ferd med å erstatte dine lister med innholdet i %{filename}. Inntil %{total_items} kontoer legges til i nye lister. - muting_html: Du er i ferd med å erstatte listen over dempede kontoer med inntil %{total_items} kontoer fra %{filename}. - preambles: - blocking_html: Du er i ferd med å blokkere inntil %{total_items} kontoer fra %{filename}. - bookmarks_html: Du er i ferd med å legge til inntil %{total_items} innlegg fra %{filename} til dine bokmerker. - domain_blocking_html: Du er i ferd med å blokkere inntil %{total_items} domener fra %{filename}. - following_html: Du er i ferd med å følge inntil %{total_items} kontoer fra %{filename}. - lists_html: Du er i ferd med å legge inntil %{total_items} kontoer fra %{filename} til dine lister. Nye lister vil bli opprettet hvis det ikke finnes noen liste å legge til. - muting_html: Du er i ferd med å dempe inntil %{total_items} kontoer fra %{filename}. preface: Du kan importere data om brukere du følger eller blokkerer til kontoen din på denne instansen med eksportfiler fra andre instanser. recent_imports: Siste importer states: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 3aaf7a5a5..aaf8a9e72 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1415,20 +1415,6 @@ pl: merge_long: Zachowaj obecne wpisy i dodaj nowe overwrite: Nadpisz overwrite_long: Zastąp obecne wpisy nowymi - overwrite_preambles: - blocking_html: Zamierzasz zastąpić swoją listę bloków maksymalnie %{total_items} kont z %{filename}. - bookmarks_html: Zamierzasz zastąpić swoje zakładki maksymalnie %{total_items} wpisami z %{filename}. - domain_blocking_html: Zamierzasz zastąpić swoją listę bloków domen maksymalnie %{total_items} domenami z %{filename}. - following_html: Zamierzasz zaobserwować maksymalnie %{total_items} kont z %{filename} i przestać obserwować kogokolwiek innego. - lists_html: Zamierzasz zastąpić swoje listy maksymalnie %{total_items} kontami z %{filename}. - muting_html: Zamierzasz zastąpić swoją wyciszonych maksymalnie %{total_items} kontami z %{filename}. - preambles: - blocking_html: Zamierzasz zablokować maksymalnie %{total_items} kont z %{filename}. - bookmarks_html: Zamierzasz dodać maksymalnie %{total_items} wpisów do twoich zakładek z %{filename}. - domain_blocking_html: Zamierzasz zablokować maksymalnie %{total_items} domen z %{filename}. - following_html: Zamierzasz zaobserwować maksymalnie %{total_items} kont z %{filename}. - lists_html: Zamierzasz dodać maksymalnie %{total_items} kont do twoich list z %{filename}. Jeżeli nie ma list, nowe zostaną utworzone. - muting_html: Zamierzasz wyciszyć maksymalnie %{total_items} kont z %{filename}. preface: Możesz zaimportować pewne dane (np. lista kont, które obserwujesz lub blokujesz) do swojego konta na tym serwerze, korzystając z danych wyeksportowanych z innego serwera. recent_imports: Ostatnie importy states: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 6451e7c60..427703f57 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1365,20 +1365,6 @@ pt-BR: merge_long: Manter os registros existentes e adicionar novos overwrite: Sobrescrever overwrite_long: Substituir os registros atuais com os novos - overwrite_preambles: - blocking_html: Você está prestes a substituir sua lista de bloqueios com até contas%{total_items} de %{filename}. - bookmarks_html: Você está prestes a substituir seus favoritos por até %{total_items} posts de %{filename}. - domain_blocking_html: Você está prestes a substituir sua lista de bloqueio de domínio com até domínios%{total_items} de %{filename}. - following_html: Você está prestes a seguir até %{total_items} contas de %{filename} e parar de seguir todos os outros. - lists_html: Você está prestes a substituir sua lista pelo conteúdo de %{filename}. Até %{total_items} contas serão adicionadas a novas listas. - muting_html: Você está prestes a substituir sua lista de contas silenciadas com até %{total_items} contas de %{filename}. - preambles: - blocking_html: Você está prestes a bloquear até %{total_items} contas de %{filename}. - bookmarks_html: Você está prestes a adicionar até %{total_items} posts de %{filename} para seus favoritos. - domain_blocking_html: Você está prestes a bloquear até %{total_items} domínios de %{filename}. - following_html: Você está prestes a seguir até %{total_items} contas de %{filename}. - lists_html: Você está prestes a adicionar até %{total_items} contas a partir de %{filename} para suas listas. Novas listas serão criadas se não houver uma para a qual adicionar. - muting_html: Você está prestes a silenciar até contas%{total_items} de %{filename}. preface: Você pode importar dados que você exportou de outro servidor, como a lista de pessoas que você segue ou bloqueou. recent_imports: Importações recentes states: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 6b48e8de2..68217113d 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1362,20 +1362,6 @@ pt-PT: merge_long: Manter os registos existentes e adicionar novos registos overwrite: Escrever por cima overwrite_long: Substituir os registos atuais pelos novos - overwrite_preambles: - blocking_html: Está prestes a substituir a sua lista de bloqueios com até %{total_items} contas de %{filename}. - bookmarks_html: Está prestes a substituir os seus marcadores com até %{total_items} publicações de %{filename}. - domain_blocking_html: Está prestes a substituir a sua lista de bloqueios de domínio com até %{total_items} domínios de %{filename}. - following_html: Está prestes a seguir até %{total_items} contas de %{filename} e parar de seguir quaisquer outras contas. - lists_html: Está prestes a substituir as suas listas pelo conteúdo de %{filename}. Até %{total_items} contas serão adicionadas a novas listas. - muting_html: Está prestes a substituir a sua lista de contas silenciadas com até %{total_items} contas de %{filename}. - preambles: - blocking_html: Está prestes a bloquear até %{total_items} contas de %{filename}. - bookmarks_html: Está prestes a adicionar até %{total_items} publicações de %{filename} aos seus marcadores. - domain_blocking_html: Está prestes a bloquear até %{total_items} domínios de %{filename}. - following_html: Está prestes a seguir até %{total_items} contas de %{filename}. - lists_html: Está prestes a adicionar até %{total_items} contas do ficheiro %{filename} para as suas listas. Novas listas serão criadas se não existir uma lista onde as adicionar. - muting_html: Está prestes a silenciar até %{total_items} contas de %{filename}. preface: Podes importar dados que tenhas exportado de outra instância, como a lista de pessoas que segues ou bloqueadas. recent_imports: Importações recentes states: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index c61c7f459..25ca70373 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1410,20 +1410,6 @@ ru: merge_long: Сохранить имеющиеся данные и добавить новые. overwrite: Перезаписать overwrite_long: Перезаписать имеющиеся данные новыми. - overwrite_preambles: - blocking_html: Вы собираетесь заменить свой блок-лист на %{total_items} аккаунтов из %{filename}. - bookmarks_html: Вы собираетесь заменить свои закладки на %{total_items} постов из %{filename}. - domain_blocking_html: Вы собираетесь заменить ваш список блокировки доменов на %{total_items} доменов из %{filename}. - following_html: Вы собираетесь следить за %{total_items} аккаунтами из %{filename} и прекратить следить за всеми остальными. - lists_html: Вы собираетесь заменить ваши списки содержимым %{filename}. До %{total_items} аккаунты будут добавлены в новые списки. - muting_html: Вы собираетесь заменить список отключенных аккаунтов на %{total_items} аккаунтов из %{filename}. - preambles: - blocking_html: Вы собираетесь заблокировать до %{total_items} аккаунтов из %{filename}. - bookmarks_html: Вы собираетесь добавить до %{total_items} постов из %{filename} в свои закладки. - domain_blocking_html: Вы собираетесь блокировать до %{total_items} доменов от %{filename}. - following_html: Вы собираетесь следовать за %{total_items} аккаунтами из %{filename}. - lists_html: Вы собираетесь добавить до %{total_items} аккаунтов от %{filename} к вашим спискам. Новые списки будут созданы, если нет списка для добавления. - muting_html: Вы собираетесь отключить до %{total_items} аккаунтов из %{filename}. preface: Вы можете загрузить некоторые данные, например, списки людей, на которых Вы подписаны или которых блокируете, в Вашу учётную запись на этом узле из файлов, экспортированных с другого узла. recent_imports: Недавно импортированное states: diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index e7deca946..11b56bd50 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -3,6 +3,7 @@ fy: simple_form: hints: account: + attribution_domains_as_text: Beskermet tsjin net korrekte attribúsjes. discoverable: Jo iepenbiere berjochten kinne útljochte wurde op ferskate plakken binnen Mastodon en jo account kin oanrekommandearre wurde oan oare brûkers. display_name: Jo folsleine namme of in aardige bynamme. fields: Jo website, persoanlike foarnammewurden, leeftiid, alles wat jo mar kwyt wolle. @@ -130,6 +131,7 @@ fy: name: Jo kinne elk wurd mei in haadletter begjinne, om sa bygelyks de tekst mear lêsber te meitsjen user: chosen_languages: Allinnich berjochten yn de selektearre talen wurde op de iepenbiere tiidline toand + role: De rol bepaalt hokker rjochten in brûker hat. user_role: color: Kleur dy’t brûkt wurdt foar de rol yn de UI, as RGB yn heksadesimaal formaat highlighted: Dit makket de rol iepenbier sichtber @@ -142,6 +144,7 @@ fy: url: Wêr’t eveneminten nei ta stjoerd wurde labels: account: + attribution_domains_as_text: Allinnich bepaalde websites tastean discoverable: Profyl en bydragen yn sykalgoritmen opnimme litte fields: name: Label diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 7f8aaa01d..bf30cdb1b 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -295,7 +295,7 @@ nl: favourite: Wanneer iemand jouw bericht als favoriet markeert follow: Wanneer iemand jou is gaan volgen follow_request: Wanneer iemand jou wil volgen - mention: Wanneer iemand jou heeft vermeld + mention: Je bent door iemand vermeld pending_account: Wanneer een nieuw account moet worden beoordeeld reblog: Wanneer iemand jouw bericht heeft geboost report: Nieuwe rapportage is ingediend diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 286bece87..e9c06bcaa 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1398,20 +1398,6 @@ sl: merge_long: Ohrani obstoječe zapise in dodaj nove overwrite: Prepiši overwrite_long: Zamenjaj trenutne zapise z novimi - overwrite_preambles: - blocking_html: Svoj seznam blokiranih računov boste nadomestili z največ %{total_items} računi iz %{filename}. - bookmarks_html: Svoje zaznamke boste nadomestili z največ %{total_items} objavami iz %{filename}. - domain_blocking_html: Svoj seznam blokiranih domen boste nadomestili z največ %{total_items} domenami iz %{filename}. - following_html: "Začeli boste slediti največ %{total_items} računom iz %{filename} in prenehali slediti vsem ostalim." - lists_html: Svoje sezname boste nadomestili z vsebino datoteke %{filename}. Največ %{total_items} računov bo dodanih na nove sezname. - muting_html: Svoj seznam utišanih računov boste nadomestili z največ %{total_items} računi iz %{filename}. - preambles: - blocking_html: "Blokirali boste največ %{total_items} računov iz %{filename}." - bookmarks_html: "Med zaznamke boste dodali boste največ %{total_items} objav iz %{filename}." - domain_blocking_html: "Blokirali boste največ %{total_items} domen iz %{filename}." - following_html: "Začeli boste slediti največ %{total_items} računom iz %{filename}." - lists_html: Dodali boste največ %{total_items} računov iz %{filename} na svoje sezname. Po potrebi bodo ustvarjeni novi seznami. - muting_html: "Utišali boste največ %{total_items} računov iz %{filename}." preface: Podatke, ki ste jih izvozili iz drugega strežnika, lahko uvozite. Na primer seznam oseb, ki jih spremljate ali blokirate. recent_imports: Nedavni uvozi states: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 2f05d7860..0b276393a 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1359,19 +1359,43 @@ sq: overwrite: Mbishkruaje overwrite_long: Zëvendësoji zërat ekzistues me të rinjtë overwrite_preambles: - blocking_html: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimeve me %{total_items} llogari nga %{filename}. - bookmarks_html: Ju ndan një hap nga zëvendësimi i faqerojtësve tuaj me %{total_items} postime nga %{filename}. - domain_blocking_html: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimit të përkatësive me %{total_items} përkatësi nga %{filename}. - following_html: Ju ndan një hap nga ndjekja e %{total_items} llogarive nga %{filename} dhe reshtja së ndjekuri këdo tjetër. - lists_html: Ju ndan një hap nga zëvendësimi i listave tuaja me lëndë nga %{filename}. Te listat e reja do të shtohen deri në %{total_items} llogari. - muting_html: Ju ndan një hpa nga zëvendësimi i listës suaj të llogarive të heshtuara me %{total_items} llogari nga %{filename}. + blocking_html: + one: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimeve, me %{count} llogari nga %{filename}. + other: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimeve, me %{count} llogari nga %{filename}. + bookmarks_html: + one: Ju ndan një hap nga zëvendësimi i faqerojtësve tuaj, me %{count} postim nga %{filename}. + other: Ju ndan një hap nga zëvendësimi i faqerojtësve tuaj, me %{count} postime nga %{filename}. + domain_blocking_html: + one: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimeve të përkatësive, me %{count} përkatësi nga %{filename}. + other: Ju ndan një hap nga zëvendësimi i listës tuaj të bllokimeve të përkatësive, me %{count} përkatësi nga %{filename}. + following_html: + one: Ju ndan një hap nga ndjekja e %{count} llogarie nga %{filename} dhe reshtja e ndjekjes së gjithkujt tjetër. + other: Ju ndan një hap nga ndjekja e deri %{count} llogarish nga %{filename} dhe reshtja e ndjekjes së gjithkujt tjetër. + lists_html: + one: Ju ndan një hap nga zëvendësimi i listave tuaja me lëndën e %{filename}. Te listat e reja do të shtohet deri %{count} llogari. + other: Ju ndan një hap nga zëvendësimi i listave tuaja me lëndën e %{filename}. Te listat e reja do të shtohet deri %{count} llogari. + muting_html: + one: Ju ndan një hap nga zëvendësimi i listës tuaj të llogarisë së heshtuar me %{count} llogari nga from %{filename}. + other: Ju ndan një hap nga zëvendësimi i listës tuaj të llogarive të heshtuara me %{count} llogari nga from %{filename}. preambles: - blocking_html: Ju ndan një hap nga bllokimi i %{total_items} llogarive nga %{filename}. - bookmarks_html: Ju ndan një hap nga shtimi te faqerojtësit tuaj i %{total_items} postimeve nga %{filename}. - domain_blocking_html: Ju ndan një hap nga bllokimi i %{total_items} përkatësive nga %{filename}. - following_html: Ju ndan një hap nga ndjekja e %{total_items} llogarive nga %{filename}. - lists_html: Jui nda një hap nga shtimi te listat tuaja i deri %{total_items} llogarive nga %{filename}. Nëse s’ka listë ku të shtohen, do të krijohen lista të reja. - muting_html: Ju ndan një hap nga heshtimi i %{total_items} llogarive nga %{filename}. + blocking_html: + one: Ju ndan një hap nga bllokimi i deri %{count} llogarie nga %{filename}. + other: Ju ndan një hap nga bllokimi i deri %{count} llogarive nga %{filename}. + bookmarks_html: + one: Ju ndan një hap nga shtimi te faqerojtësit tuaj i deri %{count} postimi nga %{filename}. + other: Ju ndan një hap nga shtimi te faqerojtësit tuaj i deri %{count} postimeve nga %{filename}. + domain_blocking_html: + one: Ju ndan një hap nga bllokimi i deri %{count} përkatësie nga %{filename}. + other: Ju ndan një hap nga bllokimi i deri %{count} përkatësive nga %{filename}. + following_html: + one: Ju ndan një hap nga ndjekja e deri %{count} llogarie nga %{filename}. + other: Ju ndan një hap nga ndjekja e deri %{count} llogarive nga %{filename}. + lists_html: + one: Ju ndan një hap nga shtimi i deri %{count} llogarie nga %{filename} te listat tuaja. Nëse s’ka listë ku të shtohen, do të krijohen lista të reja. + other: Ju ndan një hap nga shtimi i deri %{count} llogarive nga %{filename} te listat tuaja. Nëse s’ka listë ku të shtohen, do të krijohen lista të reja. + muting_html: + one: Ju ndan një hap nga heshtimi i deri %{count} llogarie nga %{filename}. + other: Ju ndan një hap nga heshtimi i deri %{count} llogarive nga %{filename}. preface: Mund të importoni të dhëna që keni eksportuar nga një shërbyes tjetër, bie fjala, një listë të personave që ndiqni ose bllokoni. recent_imports: Importime së fundi states: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index ad14d9d13..f56cdb9cb 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1302,20 +1302,6 @@ sr-Latn: merge_long: Zadržite postojeće zapise i dodajte nove overwrite: Zameni overwrite_long: Zameni trenutne zapise novima - overwrite_preambles: - blocking_html: Upravo ćete zameniti svoju listu blokiranih sa do %{total_items} naloga iz %{filename}. - bookmarks_html: Upravo ćete zameniti svoje obeleživače sa do %{total_items} objava iz %{filename}. - domain_blocking_html: Upravo ćete zameniti svoju listu blokiranih domena sa do %{total_items} domena iz %{filename}. - following_html: Upravo ćete pratiti do %{total_items} naloga iz %{filename} and i prestati sa praćenjem bilo koga drugog. - lists_html: Spremate se da zamenite svoje liste sadržajem od %{filename}. Do %{total_items} naloga će biti dodato na nove liste. - muting_html: Upravo ćete zameniti svoju listu ignorisanih naloga sa do %{total_items} naloga iz %{filename}. - preambles: - blocking_html: Upravo ćete blokirati do %{total_items} naloga iz %{filename}. - bookmarks_html: Upravo ćete dodati do %{total_items} objava iz %{filename} u vaše obeleživače. - domain_blocking_html: Upravo ćete blokirati do %{total_items} domena iz %{filename}. - following_html: Upravo ćete pratiti do %{total_items} naloga iz %{filename}. - lists_html: Spremate se da dodate do %{total_items} naloga od %{filename} na svoje liste. Nove liste će biti kreirane ako ne postoji lista za dodavanje. - muting_html: Upravo ćete ignorisati do %{total_items} naloga iz %{filename}. preface: Možete uvesti podatke koje ste izvezli sa druge instance, kao što su liste ljudi koje ste pratili ili blokirali. recent_imports: Nedavni uvozi states: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index fc92b9817..45feb0b5f 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1332,20 +1332,6 @@ sr: merge_long: Задржите постојеће записе и додајте нове overwrite: Замени overwrite_long: Замени тренутне записе новима - overwrite_preambles: - blocking_html: Управо ћете заменити своју листу блокираних са до %{total_items} налога из %{filename}. - bookmarks_html: Управо ћете заменити своје обележиваче са до %{total_items} објава из %{filename}. - domain_blocking_html: Управо ћете заменити своју листу блокираних домена са до %{total_items} домена из %{filename}. - following_html: Управо ћете пратити до %{total_items} налога из %{filename} and и престати са праћењем било кога другог. - lists_html: Спремате се да замените своје листе садржајем од %{filename}. До %{total_items} налога ће бити додато на нове листе. - muting_html: Управо ћете заменити своју листу игнорисаних налога са до %{total_items} налога из %{filename}. - preambles: - blocking_html: Управо ћете блокирати до %{total_items} налога из %{filename}. - bookmarks_html: Управо ћете додати до %{total_items} објава из %{filename} у ваше обележиваче. - domain_blocking_html: Управо ћете блокирати до %{total_items} домена из %{filename}. - following_html: Управо ћете пратити до %{total_items} налога из %{filename}. - lists_html: Спремате се да додате до %{total_items} налога од %{filename} на своје листе. Нове листе ће бити креиране ако не постоји листа за додавање. - muting_html: Управо ћете игнорисати до %{total_items} налога из %{filename}. preface: Можете увести податке које сте извезли са друге инстанце, као што су листе људи које сте пратили или блокирали. recent_imports: Недавни увози states: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index dadd5f160..0d19d17c3 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1318,20 +1318,6 @@ sv: merge_long: Behåll befintliga uppgifter och lägg till nya overwrite: Skriv över overwrite_long: Ersätt de nuvarande uppgifterna med de nya - overwrite_preambles: - blocking_html: Du är på väg att ersätta din blockeringslista med upp till %{total_items} konton från %{filename}. - bookmarks_html: Du är på väg att ersätta din blockeringslista med upp till %{total_items} inlägg från %{filename}. - domain_blocking_html: Du är på väg att ersätta din blockeringslista med upp till %{total_items} domäner från %{filename}. - following_html: Du är på väg till följ upp till %{total_items} konton från %{filename} och sluta följa någon annan. - lists_html: Du är på väg att ersätta dina listor med innehållet i %{filename}. Upp till %{total_items} konton kommer att läggas till i nya listor. - muting_html: Du är på väg att ersätta din lista med tystade konton med upp till %{total_items} konton från %{filename}. - preambles: - blocking_html: Du är på väg att blockera med upp till %{total_items} konton från %{filename}. - bookmarks_html: Du håller på att lägga upp till %{total_items} inlägg från %{filename} till dina bokmärken. - domain_blocking_html: Du är på väg att blockera upp till %{total_items} domäner från %{filename}. - following_html: Du är på väg att följa upp till %{total_items} konton från %{filename}. - lists_html: Du håller på att lägga upp till %{total_items} konton från %{filename} till dina listor. Nya listor kommer att skapas om det inte finns någon lista att lägga till. - muting_html: Du är på väg att tysta upp till %{total_items} konton från %{filename}. preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar. recent_imports: Nyligen importerade states: diff --git a/config/locales/th.yml b/config/locales/th.yml index 3cb802afe..c6ba60736 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1340,20 +1340,6 @@ th: merge_long: เก็บระเบียนที่มีอยู่และเพิ่มระเบียนใหม่ overwrite: เขียนทับ overwrite_long: แทนที่ระเบียนปัจจุบันด้วยระเบียนใหม่ - overwrite_preambles: - blocking_html: คุณกำลังจะ แทนที่รายการการปิดกั้นของคุณ ด้วยมากถึง %{total_items} บัญชี จาก %{filename} - bookmarks_html: คุณกำลังจะ แทนที่ที่คั่นหน้าของคุณ ด้วยมากถึง %{total_items} โพสต์ จาก %{filename} - domain_blocking_html: คุณกำลังจะ แทนที่รายการการปิดกั้นโดเมนของคุณ ด้วยมากถึง %{total_items} โดเมน จาก %{filename} - following_html: คุณกำลังจะ ติดตาม มากถึง %{total_items} บัญชี จาก %{filename} และ หยุดการติดตามคนอื่นใด - lists_html: คุณกำลังจะ แทนที่รายการของคุณ ด้วยเนื้อหาของ %{filename} จะเพิ่มมากถึง %{total_items} บัญชี ไปยังรายการใหม่ - muting_html: คุณกำลังจะ แทนที่รายการบัญชีที่ซ่อนอยู่ของคุณ ด้วยมากถึง %{total_items} บัญชี จาก %{filename} - preambles: - blocking_html: คุณกำลังจะ ปิดกั้น มากถึง %{total_items} บัญชี จาก %{filename} - bookmarks_html: คุณกำลังจะเพิ่มมากถึง %{total_items} โพสต์ จาก %{filename} ไปยัง ที่คั่นหน้า ของคุณ - domain_blocking_html: คุณกำลังจะ ปิดกั้น มากถึง %{total_items} โดเมน จาก %{filename} - following_html: คุณกำลังจะ ติดตาม มากถึง %{total_items} บัญชี จาก %{filename} - lists_html: คุณกำลังจะเพิ่มมากถึง %{total_items} บัญชี จาก %{filename} ไปยัง รายการ ของคุณ จะสร้างรายการใหม่หากไม่มีรายการที่จะเพิ่มไปยัง - muting_html: คุณกำลังจะ ซ่อน มากถึง %{total_items} บัญชี จาก %{filename} preface: คุณสามารถนำเข้าข้อมูลที่คุณได้ส่งออกจากเซิร์ฟเวอร์อื่น เช่น รายการผู้คนที่คุณกำลังติดตามหรือกำลังปิดกั้น recent_imports: การนำเข้าล่าสุด states: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index f1e098370..df55aa5a2 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1366,19 +1366,43 @@ tr: overwrite: Üzerine yaz overwrite_long: Mevcut kayıtları yenileriyle değiştir overwrite_preambles: - blocking_html: "Engel listenizi, %{filename} dosyasından, %{total_items} hesapla değiştirmek üzeresiniz." - bookmarks_html: "Yerimlerinizi, %{filename} dosyasından, %{total_items} gönderiyle değiştirmek üzeresiniz." - domain_blocking_html: "Alan adı engel listenizi, %{filename} dosyasından, %{total_items} alan adıyla değiştirmek üzeresiniz." - following_html: "%{filename} dosyasından %{total_items} hesabı takip etmeye başlamak ve diğer herkesi takipten çıkmak üzeresiniz." - lists_html: Listelerinizi %{filename} içeriğiyle değiştirmek üzeresiniz. Yeni listelere en fazla %{total_items} hesap eklenecek. - muting_html: "Sessize alınmış hesaplar listenizi, %{filename} dosyasından, %{total_items} hesapla değiştirmek üzeresiniz." + blocking_html: + one: "Engelleme listenizi, %{filename} dosyasından %{count} hesap ile değiştirmek üzeresiniz." + other: "Engelleme listenizi, %{filename} dosyasından %{count} hesap ile değiştirmek üzeresiniz." + bookmarks_html: + one: "Yerimlerinizi, %{filename} dosyasından %{count} gönderi ile değiştirmek üzeresiniz." + other: "Yerimlerinizi, %{filename} dosyasından %{count} gönderi ile değiştirmek üzeresiniz." + domain_blocking_html: + one: "Alan adı engelleme listenizi, %{filename} dosyasından %{count} alan adı ile değiştirmek üzeresiniz." + other: "Alan adı engelleme listenizi, %{filename} dosyasından %{count} alan adı ile değiştirmek üzeresiniz." + following_html: + one: "%{filename} dosyasından %{count} hesabı takip etmek ve diğer herkesin takibini bırakmak üzeresiniz." + other: "%{filename} dosyasından %{count} hesabı takip etmek ve diğer herkesin takibini bırakmak üzeresiniz." + lists_html: + one: "Listelerinizi, %{filename} dosya içeriğiyle değiştirmek üzeresiniz. %{count} hesap yeni listelere eklenecektir." + other: "Listelerinizi, %{filename} dosya içeriğiyle değiştirmek üzeresiniz. %{count} hesap yeni listelere eklenecektir." + muting_html: + one: "Sessize alınmış hesap listenizi, %{filename} dosyasından %{count} hesap ile değiştirmek üzeresiniz." + other: "Sessize alınmış hesap listenizi, %{filename} dosyasından %{count} hesap ile değiştirmek üzeresiniz." preambles: - blocking_html: "%{filename} dosyasından %{total_items} hesabı engellemek üzeresiniz." - bookmarks_html: "%{filename} dosyasından %{total_items} gönderiyi yerimlerinize eklemek üzeresiniz." - domain_blocking_html: "%{filename} dosyasından %{total_items} alan adını engellemek üzeresiniz." - following_html: "%{filename} dosyasından %{total_items} hesabı takip etmek üzeresiniz." - lists_html: "Listelerinize %{filename} dosyasından en fazla %{total_items} hesap eklemek üzeresiniz. Eklenecek bir liste olmaması durumunda yeni listeler oluşturulacaktır." - muting_html: "%{filename} dosyasından %{total_items} hesabı sessize almak üzeresiniz." + blocking_html: + one: "%{filename} dosyasından %{count} hesap engellemek üzeresiniz." + other: "%{filename} dosyasından %{count} hesap engellemek üzeresiniz." + bookmarks_html: + one: "Yerimlerinize, %{filename} dosyasından %{count} gönderi eklemek üzeresiniz." + other: "Yerimlerinize, %{filename} dosyasından %{count} gönderi eklemek üzeresiniz." + domain_blocking_html: + one: "%{filename} dosyasından %{count} alan adı engellemek üzeresiniz." + other: "%{filename} dosyasından %{count} alan adı engellemek üzeresiniz." + following_html: + one: "%{filename} dosyasından %{count} hesap takip etmek üzeresiniz." + other: "%{filename} dosyasından %{count} hesap takip etmek üzeresiniz." + lists_html: + one: "Listelerinize, %{filename} %{count} hesap eklemek üzeresiniz. Eklenecek liste yoksa yeni listeler oluşturulacaktır." + other: "Listelerinize, %{filename} %{count} hesap eklemek üzeresiniz. Eklenecek liste yoksa yeni listeler oluşturulacaktır." + muting_html: + one: "%{filename} dosyasından %{count} hesabı sessize almak üzeresiniz." + other: "%{filename} dosyasından %{count} hesabı sessize almak üzeresiniz." preface: Diğer sunucudan alarak oluşturduğunuz dosyalar sayesinde, bu sunucudaki hesabınıza takipçilerinizi aktarabilir veya istemediğiniz kişileri otomatik olarak engelleyebilirsiniz. recent_imports: Son içe aktarmalar states: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index de1847a74..47732198f 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1415,20 +1415,6 @@ uk: merge_long: Зберегти наявні записи та додати нові overwrite: Перезаписувати overwrite_long: Замінити наявні записи новими - overwrite_preambles: - blocking_html: Ви збираєтеся замінити ваш список блокування з %{total_items} обліковими записами з %{filename}. - bookmarks_html: Ви збираєтеся замінити ваші закладки з %{total_items} дописами з %{filename}. - domain_blocking_html: Ви збираєтеся замінити ваш список блокування доменів з %{total_items} доменами з %{filename}. - following_html: Ви збираєтеся слідкувати за %{total_items} обліковими записами з %{filename} і перестати слідкувати за всіма іншими. - lists_html: Ви збираєтеся замінити ваші списки вмістом з %{filename}. До нових списків буде додано до %{total_items} облікових записів. - muting_html: Ви збираєтеся замінити ваш список ігнорованих облікових записів з %{total_items} обліковими записами з %{filename}. - preambles: - blocking_html: Ви збираєтеся заблокувати %{total_items} облікових записів з %{filename}. - bookmarks_html: Ви збираєтеся додати %{total_items} дописів з %{filename} до ваших закладок. - domain_blocking_html: Ви збираєтеся заблокувати %{total_items} доменів з %{filename}. - following_html: Ви збираєтеся слідкувати за %{total_items} обліковими записами з %{filename}. - lists_html: Ви збираєтеся додати до %{total_items} облікових записів з %{filename} до ваших списків. Нові списки будуть створені, якщо немає списку для додавання. - muting_html: Ви збираєтеся ігнорувати %{total_items} облікових записів з %{filename}. preface: Ви можете імпортувати дані, які ви експортували з іншого сервера, наприклад, список людей, яких ви відстежуєте або блокуєте. recent_imports: Останні імпорти states: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 7e44e76e4..17edfba70 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1341,19 +1341,31 @@ vi: overwrite: Ghi đè overwrite_long: Thay thế các bản ghi hiện tại bằng các bản ghi mới overwrite_preambles: - blocking_html: Bạn sắp thay thế danh sách chặn với %{total_items} tài khoản từ %{filename}. - bookmarks_html: Bạn sắp thay thế lượt lưu với %{total_items} tút từ %{filename}. - domain_blocking_html: Bạn sắp thay thế danh sách máy chủ chặn với %{total_items} máy chủ từ %{filename}. - following_html: Bạn sắp theo dõi với %{total_items} người từ %{filename}ngừng theo dõi bất kỳ ai. - lists_html: Bạn sắp thay thế các danh sách bằng nội dung từ %{filename}. Hơn %{total_items} tài khoản sẽ được thêm vào những danh sách mới. - muting_html: Bạn sắp thay thế danh sách ẩn với %{total_items} người từ %{filename}. + blocking_html: + other: Bạn sắp thay thế danh sách chặn với %{count} người từ %{filename}. + bookmarks_html: + other: Bạn sắp thay thế danh sách tút đã lưu với %{count} tút từ %{filename}. + domain_blocking_html: + other: Bạn sắp thay thế danh sách máy chủ chặn với %{count} máy chủ từ %{filename}. + following_html: + other: Bạn sắp theo dõi tới %{count} người từ %{filename}ngừng theo dõi mọi người khác. + lists_html: + other: Bạn sắp thay thế danh sách với nội dung của %{filename}. Có %{count} người sẽ được thêm vào những danh sách mới. + muting_html: + other: Bạn sắp they thế danh sách người bạn chặn với %{count} người từ %{filename}. preambles: - blocking_html: Bạn sắp chặn tới %{total_items} người từ %{filename}. - bookmarks_html: Bạn sắp thêm vào %{total_items} tút từ %{filename} vào lượt lưu. - domain_blocking_html: Bạn sắp chặn tới %{total_items} máy chủ từ %{filename}. - following_html: Bạn sắp theo dõi tới %{total_items} người từ %{filename}. - lists_html: Bạn sắp thêm %{total_items} tài khoản từ %{filename} vào danh sách của bạn. Những danh sách mới sẽ được tạo nếu bạn chưa có danh sách nào. - muting_html: Bạn sắp ẩn lên tới %{total_items} người từ %{filename}. + blocking_html: + other: Bạn sắp chặn tới %{count} người từ %{filename}. + bookmarks_html: + other: Bạn sắp thêm tới %{count} tút từ %{filename} vào danh sách tút đã lưu. + domain_blocking_html: + other: Bạn sắp chặn tới %{count} máy chủ từ %{filename}. + following_html: + other: Bạn sắp theo dõi tới %{count} người từ %{filename}. + lists_html: + other: Bạn sắp thêm tới %{count} người từ %{filename} vào danh sách của bạn. Những danh sách mới sẽ được tạo nếu không có danh sách để thêm. + muting_html: + other: Bạn sắp ẩn tới %{count} người từ %{filename}. preface: Bạn có thể nhập dữ liệu mà bạn đã xuất từ một máy chủ khác, chẳng hạn danh sách những người đang theo dõi hoặc chặn. recent_imports: Đã nhập gần đây states: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index a73871115..7be8fb5a5 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1341,19 +1341,31 @@ zh-CN: overwrite: 覆盖 overwrite_long: 将当前记录替换为新记录 overwrite_preambles: - blocking_html: 你即将使用来自 %{filename} 的最多 %{total_items} 个账户替换你的屏蔽列表。 - bookmarks_html: 你即将使用来自 %{filename} %{total_items} 篇嘟文替换你的书签。 - domain_blocking_html: 你即将使用来自 %{filename} 的最多 %{total_items} 个域名替换你的域名屏蔽列表。 - following_html: 你即将从 %{filename} 关注 %{total_items} 个账户,并停止关注其他任何人。 - lists_html: 你即将用 %{filename} 的内容替换你的列表。新列表中将添加 %{total_items} 个账户。 - muting_html: 你即将使用来自 %{filename} 的最多 %{total_items} 个账户替换你已隐藏的账户列表。 + blocking_html: + other: 你即将使用来自 %{filename} 的最多 %{count} 个帐户替换你的屏蔽列表。 + bookmarks_html: + other: 你即将使用来自 %{filename} 的最多 %{count} 条嘟文替换你的书签。 + domain_blocking_html: + other: 你即将使用来自 %{filename} 的最多 %{count} 个域名替换你的域名屏蔽列表。 + following_html: + other: 你即将关注来自 %{filename} 的最多 %{count} 个账户,并停止关注其他所有人。 + lists_html: + other: 你即将使用来自 %{filename} 的内容替换你的列表。最多将会有 %{count} 个账户 被添加到新列表。 + muting_html: + other: 你即将使用来自 %{filename} 的最多 %{count} 个帐户替换你的已隐藏账户列表。 preambles: - blocking_html: 你即将从 %{filename} 封锁多达 %{total_items} 个账户。 - bookmarks_html: 你即将把来自 %{filename} %{total_items} 篇嘟文添加到你的书签中。 - domain_blocking_html: 你即将从 %{filename} 屏蔽 %{total_items} 个域名。 - following_html: 你即将从 %{filename} 关注最多 %{total_items} 个账户。 - lists_html: 你即将从 %{filename} 中添加最多 %{total_items} 个账户到你的列表中。如果没有可用列表,将创建新的列表。 - muting_html: 你即将从 %{filename} 隐藏 %{total_items} 个账户。 + blocking_html: + other: 你即将屏蔽来自 %{filename} 的最多 %{count} 个账号。 + bookmarks_html: + other: 你即将把来自 %{filename} %{count} 篇嘟文添加到你的书签中。 + domain_blocking_html: + other: 你即将屏蔽来自 %{filename} 的最多 %{count} 个域名。 + following_html: + other: 你即将关注来自 %{filename} 的最多 %{count} 个账号。 + lists_html: + other: 你即将从 %{filename} 中添加最多 %{count} 个账户到你的列表中。如果没有可用列表,将创建新的列表。 + muting_html: + other: 你即将隐藏来自 %{filename} 的最多 %{count} 个账号。 preface: 你可以在此导入你在其他实例导出的数据,比如你所关注或屏蔽的用户列表。 recent_imports: 最近导入 states: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index c0726fc2f..e33ebeadb 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1249,20 +1249,6 @@ zh-HK: merge_long: 留下舊有記錄並添加新的資訊 overwrite: 覆蓋 overwrite_long: 用新記錄覆蓋當前記錄 - overwrite_preambles: - blocking_html: 你將以%{filename}的最多%{total_items}個帳號,來取代你現有的封鎖列表。 - bookmarks_html: 你將以%{filename}的最多%{total_items}個帳號,來取代你現有的書籤。 - domain_blocking_html: 你將以%{filename}的最多%{total_items} 個帳號,來取代你現有的網域封鎖列表。 - following_html: 你將從%{filename}追蹤最多%{total_items} 個帳號,並取消追蹤其他人。 - lists_html: 你將根據%{filename}的內容取代的你列表。最多新增 %{total_items} 個帳號 到新列表。 - muting_html: 你將根據%{filename}中最多 %{total_items} 個帳號取代你的靜音帳號列表。 - preambles: - blocking_html: 你將根據%{filename}封鎖最多 %{total_items} 個帳號。 - bookmarks_html: 你將加入 %{filename} 中最多 %{total_items} 篇帖文到你的書籤中。 - domain_blocking_html: 你將封鎖來自%{filename}的最多 %{total_items} 個網域。 - following_html: 你將追蹤 來自 %{filename} 最多 %{total_items} 個帳號。 - lists_html: 你將加入來自%{filename}最多 %{total_items} 個帳號到你的列表中。如果現時沒有列表,將會建立新列表。 - muting_html: 你將靜音來自%{filename}的最多 %{total_items} 個帳號。 preface: 你可以在此匯入你在其他服務站所匯出的資料檔,包括︰你所關注的用戶,被你封鎖的用戶。 recent_imports: 最近的匯入 states: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 4079f68a5..96aedf0a1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1343,19 +1343,31 @@ zh-TW: overwrite: 覆蓋 overwrite_long: 以新的紀錄覆蓋目前紀錄 overwrite_preambles: - blocking_html: 您將要自 %{filename} 中之 %{total_items} 個帳號取代您的封鎖帳號列表。 - bookmarks_html: 您將要自 %{filename} 中之 %{total_items} 個嘟文取代您的書籤。 - domain_blocking_html: 您將要自 %{filename} 中之 %{total_items} 個網域取代您的封鎖網域列表。 - following_html: 您將要 跟隨%{filename} 中之 %{total_items} 個帳號 並且 取消跟隨其他所有人。 - lists_html: 您將以 %{filename} 之內容取代您的列表。這將會新增 %{total_items} 個帳號至新列表。 - muting_html: 您將要自 %{filename} 中之 %{total_items} 個帳號取代您的靜音帳號列表。 + blocking_html: + other: 您將要自 %{filename} 中之 %{count} 個帳號取代您的封鎖帳號列表。 + bookmarks_html: + other: 您將要自 %{filename} 中之 %{count} 個嘟文取代您的書籤。 + domain_blocking_html: + other: 您將要自 %{filename} 中之 %{count} 個網域取代您的封鎖網域列表。 + following_html: + other: 您將要 跟隨%{filename} 中之 %{count} 個帳號 並且 取消跟隨其他所有人。 + lists_html: + other: 您將以 %{filename} 之內容取代您的列表。這將會新增 %{count} 個帳號至新列表。 + muting_html: + other: 您將要自 %{filename} 中之 %{count} 個帳號取代您的靜音帳號列表。 preambles: - blocking_html: 您將要 封鎖%{filename} 中之 %{total_items} 個帳號。 - bookmarks_html: 您將要自 %{filename} 中之 %{total_items} 個嘟文加入至您的書籤。 - domain_blocking_html: 您將要 封鎖%{filename} 中之 %{total_items} 個網域。 - following_html: 您將要 跟隨%{filename} 中之 %{total_items} 個帳號。 - lists_html: 您將自 %{filename} 新增 %{total_items} 個帳號至您的列表。若不存在列表用以新增帳號,則會建立新列表。 - muting_html: 您將要 靜音%{filename} 中之 %{total_items} 個帳號。 + blocking_html: + other: 您將要 封鎖%{filename} 中之 %{count} 個帳號。 + bookmarks_html: + other: 您將要自 %{filename} 中之 %{count} 個嘟文加入至您的書籤。 + domain_blocking_html: + other: 您將要 封鎖%{filename} 中之 %{count} 個網域。 + following_html: + other: 您將要 跟隨%{filename} 中之 %{count} 個帳號。 + lists_html: + other: 您將自 %{filename} 新增 %{count} 個帳號至您的列表。若不存在列表用以新增帳號,則會建立新列表。 + muting_html: + other: 您將要 靜音%{filename} 中之 %{count} 個帳號。 preface: 您能於此匯入您於其他伺服器所匯出的資料檔,包括跟隨中的使用者、封鎖的使用者名單等。 recent_imports: 最近匯入的 states: From 0ce2db4f7d3dad317803a41d33409dd83165bfc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:07:07 +0200 Subject: [PATCH 08/23] Update dependency postcss-preset-env to v10.0.6 (#32260) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9aeb2b02a..35fca2f8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13417,9 +13417,9 @@ __metadata: languageName: node linkType: hard -"postcss-custom-media@npm:^11.0.1": - version: 11.0.1 - resolution: "postcss-custom-media@npm:11.0.1" +"postcss-custom-media@npm:^11.0.2": + version: 11.0.2 + resolution: "postcss-custom-media@npm:11.0.2" dependencies: "@csstools/cascade-layer-name-parser": "npm:^2.0.1" "@csstools/css-parser-algorithms": "npm:^3.0.1" @@ -13427,7 +13427,7 @@ __metadata: "@csstools/media-query-list-parser": "npm:^3.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/771b281a28f105370ede7c4a86f9e3dd8d9ec3bf2d2883d4f2cfe9c42b5ec1bf88f713458b356870315d0ba3a285fbeb7bb514a1203d1c4fb113bd9044369bf2 + checksum: 10c0/7bec2b1e0b5d786c33c5715b611ffc8b9737252ee6bf77ca59255ac16f91ce614406923f43250e5c88b04f1bb050f155dc5ed4d9350dbd704c45fbd72e5a9a04 languageName: node linkType: hard @@ -13906,8 +13906,8 @@ __metadata: linkType: hard "postcss-preset-env@npm:^10.0.0": - version: 10.0.5 - resolution: "postcss-preset-env@npm:10.0.5" + version: 10.0.6 + resolution: "postcss-preset-env@npm:10.0.6" dependencies: "@csstools/postcss-cascade-layers": "npm:^5.0.0" "@csstools/postcss-color-function": "npm:^4.0.2" @@ -13950,7 +13950,7 @@ __metadata: postcss-color-functional-notation: "npm:^7.0.2" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" - postcss-custom-media: "npm:^11.0.1" + postcss-custom-media: "npm:^11.0.2" postcss-custom-properties: "npm:^14.0.1" postcss-custom-selectors: "npm:^8.0.1" postcss-dir-pseudo-class: "npm:^9.0.0" @@ -13972,7 +13972,7 @@ __metadata: postcss-selector-not: "npm:^8.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/db5eb1175cb26bed3f1a4c47acc67935ffc784520321470520e59de366ac6f91be1e609fe36056af707ed20f7910721287cff0fae416c437dd3e944de13ffd05 + checksum: 10c0/01660acf3b9ddf4d612a31819e9a5de9fe5383e9eddd2c130180f66ae90c5a881eb408e73454fd50e1839eae71678d738bf72073de08f9013c183b0bd9950fe5 languageName: node linkType: hard From a59160cf01142a49a15b3237d76a19dcfd9de100 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 7 Oct 2024 09:46:03 +0200 Subject: [PATCH 09/23] Add missing `on_delete: :cascade` on `notification_permissions` (#32281) --- ...ix_notification_permission_foreign_keys.rb | 39 +++++++++++++++++++ db/schema.rb | 6 +-- 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20241007071624_fix_notification_permission_foreign_keys.rb diff --git a/db/migrate/20241007071624_fix_notification_permission_foreign_keys.rb b/db/migrate/20241007071624_fix_notification_permission_foreign_keys.rb new file mode 100644 index 000000000..11b82de8a --- /dev/null +++ b/db/migrate/20241007071624_fix_notification_permission_foreign_keys.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class FixNotificationPermissionForeignKeys < ActiveRecord::Migration[7.1] + def up + safety_assured do + execute <<~SQL.squish + ALTER TABLE notification_permissions + DROP CONSTRAINT fk_rails_7c0bed08df, + ADD CONSTRAINT fk_rails_7c0bed08df + FOREIGN KEY (account_id) + REFERENCES accounts(id) + ON DELETE CASCADE, + + DROP CONSTRAINT fk_rails_e3e0aaad70, + ADD CONSTRAINT fk_rails_e3e0aaad70 + FOREIGN KEY (from_account_id) + REFERENCES accounts(id) + ON DELETE CASCADE + SQL + end + end + + def down + safety_assured do + execute <<~SQL.squish + ALTER TABLE notification_permissions + DROP CONSTRAINT fk_rails_7c0bed08df, + ADD CONSTRAINT fk_rails_7c0bed08df + FOREIGN KEY (account_id) + REFERENCES accounts(id), + + DROP CONSTRAINT fk_rails_e3e0aaad70, + ADD CONSTRAINT fk_rails_e3e0aaad70 + FOREIGN KEY (from_account_id) + REFERENCES accounts(id) + SQL + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f9f2d9739..68067841e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_09_16_190140) do +ActiveRecord::Schema[7.1].define(version: 2024_10_07_071624) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1291,8 +1291,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_09_16_190140) do add_foreign_key "mentions", "statuses", on_delete: :cascade add_foreign_key "mutes", "accounts", column: "target_account_id", name: "fk_eecff219ea", on_delete: :cascade add_foreign_key "mutes", "accounts", name: "fk_b8d8daf315", on_delete: :cascade - add_foreign_key "notification_permissions", "accounts" - add_foreign_key "notification_permissions", "accounts", column: "from_account_id" + add_foreign_key "notification_permissions", "accounts", column: "from_account_id", on_delete: :cascade + add_foreign_key "notification_permissions", "accounts", on_delete: :cascade add_foreign_key "notification_policies", "accounts", on_delete: :cascade add_foreign_key "notification_requests", "accounts", column: "from_account_id", on_delete: :cascade add_foreign_key "notification_requests", "accounts", on_delete: :cascade From 1f5bd571cd26ddb44228b8e6a9498e765037e639 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 7 Oct 2024 11:35:42 +0200 Subject: [PATCH 10/23] Fix missing avatar fallback interfering with transparency in web UI (#32270) --- .../__snapshots__/avatar-test.jsx.snap | 8 ++++-- app/javascript/mastodon/components/avatar.tsx | 25 +++++++++++++++---- .../styles/mastodon/components.scss | 7 ++++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/components/__tests__/__snapshots__/avatar-test.jsx.snap b/app/javascript/mastodon/components/__tests__/__snapshots__/avatar-test.jsx.snap index 2f0a2de32..124b50d8c 100644 --- a/app/javascript/mastodon/components/__tests__/__snapshots__/avatar-test.jsx.snap +++ b/app/javascript/mastodon/components/__tests__/__snapshots__/avatar-test.jsx.snap @@ -2,7 +2,7 @@ exports[` Autoplay renders a animated avatar 1`] = `
Autoplay renders a animated avatar 1`] = ` >
@@ -21,7 +23,7 @@ exports[` Autoplay renders a animated avatar 1`] = ` exports[` Still renders a still avatar 1`] = `
Still renders a still avatar 1`] = ` >
diff --git a/app/javascript/mastodon/components/avatar.tsx b/app/javascript/mastodon/components/avatar.tsx index 8b16296c2..f61d9676d 100644 --- a/app/javascript/mastodon/components/avatar.tsx +++ b/app/javascript/mastodon/components/avatar.tsx @@ -1,10 +1,11 @@ +import { useState, useCallback } from 'react'; + import classNames from 'classnames'; +import { useHovering } from 'mastodon/../hooks/useHovering'; +import { autoPlayGif } from 'mastodon/initial_state'; import type { Account } from 'mastodon/models/account'; -import { useHovering } from '../../hooks/useHovering'; -import { autoPlayGif } from '../initial_state'; - interface Props { account: Account | undefined; // FIXME: remove `undefined` once we know for sure its always there size: number; @@ -25,6 +26,8 @@ export const Avatar: React.FC = ({ counterBorderColor, }) => { const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); const style = { ...styleFromParent, @@ -37,16 +40,28 @@ export const Avatar: React.FC = ({ ? account?.get('avatar') : account?.get('avatar_static'); + const handleLoad = useCallback(() => { + setLoading(false); + }, [setLoading]); + + const handleError = useCallback(() => { + setError(true); + }, [setError]); + return (
- {src && } + {src && !error && ( + + )} + {counter && (
[data-popper-placement] { display: block; position: relative; border-radius: var(--avatar-border-radius); - background-color: var(--surface-background-color); img { width: 100%; @@ -2087,7 +2086,11 @@ body > [data-popper-placement] { display: inline-block; // to not show broken images } - &-inline { + &--loading { + background-color: var(--surface-background-color); + } + + &--inline { display: inline-block; vertical-align: middle; margin-inline-end: 5px; From bfabd6a2b882c4eca186e8fe47ce98a47f74662f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 7 Oct 2024 08:02:04 -0400 Subject: [PATCH 11/23] Move account suspension-related methods to concern (#28351) --- app/models/account.rb | 38 +------------------ app/models/concerns/account/suspensions.rb | 44 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 app/models/concerns/account/suspensions.rb diff --git a/app/models/account.rb b/app/models/account.rb index 3b841e7c7..708415b6e 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -89,6 +89,7 @@ class Account < ApplicationRecord include Account::Merging include Account::Search include Account::StatusesSearch + include Account::Suspensions include Account::AttributionDomains include DomainMaterializable include DomainNormalizable @@ -127,9 +128,7 @@ class Account < ApplicationRecord scope :local, -> { where(domain: nil) } scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) } scope :silenced, -> { where.not(silenced_at: nil) } - scope :suspended, -> { where.not(suspended_at: nil) } scope :sensitized, -> { where.not(sensitized_at: nil) } - scope :without_suspended, -> { where(suspended_at: nil) } scope :without_silenced, -> { where(silenced_at: nil) } scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } @@ -255,41 +254,6 @@ class Account < ApplicationRecord update!(silenced_at: nil) end - def suspended? - suspended_at.present? && !instance_actor? - end - - def suspended_locally? - suspended? && suspension_origin_local? - end - - def suspended_permanently? - suspended? && deletion_request.nil? - end - - def suspended_temporarily? - suspended? && deletion_request.present? - end - - alias unavailable? suspended? - alias permanently_unavailable? suspended_permanently? - - def suspend!(date: Time.now.utc, origin: :local, block_email: true) - transaction do - create_deletion_request! - update!(suspended_at: date, suspension_origin: origin) - create_canonical_email_block! if block_email - end - end - - def unsuspend! - transaction do - deletion_request&.destroy! - update!(suspended_at: nil, suspension_origin: nil) - destroy_canonical_email_block! - end - end - def sensitized? sensitized_at.present? end diff --git a/app/models/concerns/account/suspensions.rb b/app/models/concerns/account/suspensions.rb new file mode 100644 index 000000000..c981fb5a2 --- /dev/null +++ b/app/models/concerns/account/suspensions.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module Account::Suspensions + extend ActiveSupport::Concern + + included do + scope :suspended, -> { where.not(suspended_at: nil) } + scope :without_suspended, -> { where(suspended_at: nil) } + end + + def suspended? + suspended_at.present? && !instance_actor? + end + alias unavailable? suspended? + + def suspended_locally? + suspended? && suspension_origin_local? + end + + def suspended_permanently? + suspended? && deletion_request.nil? + end + alias permanently_unavailable? suspended_permanently? + + def suspended_temporarily? + suspended? && deletion_request.present? + end + + def suspend!(date: Time.now.utc, origin: :local, block_email: true) + transaction do + create_deletion_request! + update!(suspended_at: date, suspension_origin: origin) + create_canonical_email_block! if block_email + end + end + + def unsuspend! + transaction do + deletion_request&.destroy! + update!(suspended_at: nil, suspension_origin: nil) + destroy_canonical_email_block! + end + end +end From 4238da6ee3c93dfd5752e9133cbec958f8ebb18a Mon Sep 17 00:00:00 2001 From: Leni Kadali <52788034+lenikadali@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:05:46 +0300 Subject: [PATCH 12/23] Add error message when user tries to follow their own account (#31910) --- app/controllers/api/v1/accounts_controller.rb | 5 +++++ config/locales/en.yml | 1 + spec/requests/api/v1/accounts_spec.rb | 20 +++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 84b604b30..28acaeea0 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -16,6 +16,7 @@ class Api::V1::AccountsController < Api::BaseController before_action :check_account_confirmation, except: [:index, :create] before_action :check_enabled_registrations, only: [:create] before_action :check_accounts_limit, only: [:index] + before_action :check_following_self, only: [:follow] skip_before_action :require_authenticated_user!, only: :create @@ -101,6 +102,10 @@ class Api::V1::AccountsController < Api::BaseController raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT end + def check_following_self + render json: { error: I18n.t('accounts.self_follow_error') }, status: 403 if current_user.account.id == @account.id + end + def relationships(**options) AccountRelationshipsPresenter.new([@account], current_user.account_id, **options) end diff --git a/config/locales/en.yml b/config/locales/en.yml index 42327ae18..c88ef3fa2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -21,6 +21,7 @@ en: one: Post other: Posts posts_tab_heading: Posts + self_follow_error: Following your own account is not allowed admin: account_actions: action: Perform action diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb index 45e66f074..16010ae2e 100644 --- a/spec/requests/api/v1/accounts_spec.rb +++ b/spec/requests/api/v1/accounts_spec.rb @@ -163,6 +163,26 @@ RSpec.describe '/api/v1/accounts' do end end + context 'when user tries to follow their own account' do + subject do + post "/api/v1/accounts/#{other_account.id}/follow", headers: headers + end + + let(:locked) { false } + let(:other_account) { user.account } + + it 'returns http forbidden and error message' do + subject + + error_msg = I18n.t('accounts.self_follow_error') + + expect(response).to have_http_status(403) + expect(response.parsed_body[:error]).to eq(error_msg) + end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' + end + context 'when modifying follow options' do let(:locked) { false } From 0c163659913f1d9d02cd8b5e45913846f2039c96 Mon Sep 17 00:00:00 2001 From: Jake Anto <64896514+jake-anto@users.noreply.github.com> Date: Tue, 8 Oct 2024 02:03:14 +0530 Subject: [PATCH 13/23] Prefer native apps over PWA (#27254) --- app/serializers/manifest_serializer.rb | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index cf0164c24..3496f329f 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -8,7 +8,8 @@ class ManifestSerializer < ActiveModel::Serializer attributes :id, :name, :short_name, :icons, :theme_color, :background_color, :display, :start_url, :scope, - :share_target, :shortcuts + :share_target, :shortcuts, + :prefer_related_applications, :related_applications def id # This is set to `/home` because that was the old value of `start_url` and @@ -89,4 +90,28 @@ class ManifestSerializer < ActiveModel::Serializer }, ] end + + def prefer_related_applications + true + end + + def related_applications + [ + { + platform: 'play', + url: 'https://play.google.com/store/apps/details?id=org.joinmastodon.android', + id: 'org.joinmastodon.android', + }, + { + platform: 'itunes', + url: 'https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974', + id: 'id1571998974', + }, + { + platform: 'f-droid', + url: 'https://f-droid.org/en/packages/org.joinmastodon.android/', + id: 'org.joinmastodon.android', + }, + ] + end end From c60d4ecc82ce3dd2f2a00eaccf5231f03f24c31d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 09:38:43 +0200 Subject: [PATCH 14/23] Update dependency @reduxjs/toolkit to v2.2.8 (#32296) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 35fca2f8a..5fc15f27e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3110,8 +3110,8 @@ __metadata: linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.2.7 - resolution: "@reduxjs/toolkit@npm:2.2.7" + version: 2.2.8 + resolution: "@reduxjs/toolkit@npm:2.2.8" dependencies: immer: "npm:^10.0.3" redux: "npm:^5.0.1" @@ -3125,7 +3125,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/7761a91adac2b5e1d50a8163ba5441480bb86a3a80b7583037c27a88463394b132dd7592862fc2be03aa7ab98a6e1710549889986dc0d3f033c169a3ba2cb02e + checksum: 10c0/bf1356d71bfb82e5a181692c79c19b7bc19355260a9966f6562604c995f0cd0ce1154177ccd14095e8b319e73f64cfe86a4e46a83d24edba7876d4ae71fd5ae0 languageName: node linkType: hard From 562105c69a9166d3a7f8eb09f2221e3571697ba0 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 8 Oct 2024 10:00:05 +0200 Subject: [PATCH 15/23] Fix source strings being uploaded to crowdin in merge groups (#32298) --- .github/workflows/crowdin-upload.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 62ad1150b..4f4d917d1 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -1,7 +1,6 @@ name: Crowdin / Upload translations on: - merge_group: push: branches: - 'main' From ff3e2c9cfa857b5091a9119337728bf972763856 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 08:10:39 +0000 Subject: [PATCH 16/23] New Crowdin Translations (automated) (#32295) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 1 + app/javascript/mastodon/locales/de.json | 2 +- config/locales/ca.yml | 1 + config/locales/da.yml | 1 + config/locales/de.yml | 1 + config/locales/eo.yml | 1 + config/locales/es-AR.yml | 1 + config/locales/es-MX.yml | 1 + config/locales/es.yml | 1 + config/locales/fi.yml | 1 + config/locales/fo.yml | 1 + config/locales/gl.yml | 1 + config/locales/he.yml | 1 + config/locales/is.yml | 1 + config/locales/ja.yml | 1 + config/locales/ko.yml | 1 + config/locales/nl.yml | 1 + config/locales/nn.yml | 1 + config/locales/pl.yml | 1 + config/locales/pt-BR.yml | 1 + config/locales/tr.yml | 1 + config/locales/uk.yml | 1 + config/locales/vi.yml | 1 + config/locales/zh-CN.yml | 1 + config/locales/zh-TW.yml | 1 + 25 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 797d8cc22..d3a29eae4 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -85,6 +85,7 @@ "alert.rate_limited.title": "Ліміт перавышаны", "alert.unexpected.message": "Узнікла нечаканая памылка.", "alert.unexpected.title": "Вой!", + "alt_text_badge.title": "Альтернативный текст", "announcement.announcement": "Аб'ява", "attachments_list.unprocessed": "(неапрацаваны)", "audio.hide": "Схаваць аўдыя", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3d8b57db4..b807d93ab 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -62,7 +62,7 @@ "account.requested_follow": "{name} möchte dir folgen", "account.share": "Profil von @{name} teilen", "account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen", - "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} posts}}", + "account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}", "account.unblock": "Blockierung von @{name} aufheben", "account.unblock_domain": "Blockierung von {domain} aufheben", "account.unblock_short": "Blockierung aufheben", diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bb81aaa59..cc2da496a 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -21,6 +21,7 @@ ca: one: Tut other: Tuts posts_tab_heading: Tuts + self_follow_error: No es permet seguir el compte propi admin: account_actions: action: Realitza l'acció diff --git a/config/locales/da.yml b/config/locales/da.yml index 1f80503e9..923102c11 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -21,6 +21,7 @@ da: one: Indlæg other: Indlæg posts_tab_heading: Indlæg + self_follow_error: Det er ikke tilladt at følge sin egen konto admin: account_actions: action: Udfør handling diff --git a/config/locales/de.yml b/config/locales/de.yml index 5f0b4ae35..cfd0d6510 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -21,6 +21,7 @@ de: one: Beitrag other: Beiträge posts_tab_heading: Beiträge + self_follow_error: Es ist nicht erlaubt, deinem eigenen Konto zu folgen admin: account_actions: action: Aktion ausführen diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 10b297f1a..1e683b172 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -21,6 +21,7 @@ eo: one: Afiŝo other: Mesaĝoj posts_tab_heading: Afiŝoj + self_follow_error: Sekvi vian propran konton ne estas permesita admin: account_actions: action: Plenumi agon diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index cfc24ce27..04ff7880a 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -21,6 +21,7 @@ es-AR: one: Mensaje other: Mensajes posts_tab_heading: Mensajes + self_follow_error: No está permitido seguir tu propia cuenta admin: account_actions: action: Ejecutar acción diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 4e7ee657e..2c18465a2 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -21,6 +21,7 @@ es-MX: one: Toot other: Toots posts_tab_heading: Toots + self_follow_error: No se permite seguir tu propia cuenta admin: account_actions: action: Realizar acción diff --git a/config/locales/es.yml b/config/locales/es.yml index bb9e5daff..47d32c62c 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -21,6 +21,7 @@ es: one: Publicación other: Publicaciones posts_tab_heading: Publicaciones + self_follow_error: No está permitido seguir tu propia cuenta admin: account_actions: action: Realizar acción diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 1767f9e63..52ea0b374 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -21,6 +21,7 @@ fi: one: Julkaisu other: viestiä posts_tab_heading: Julkaisut + self_follow_error: Oman tilisi seuraaminen ei ole sallittua admin: account_actions: action: Suorita toimi diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 55104eb6f..fcf3eb031 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -21,6 +21,7 @@ fo: one: Uppslag other: Uppsløg posts_tab_heading: Uppsløg + self_follow_error: Tað er ikki loyvt at fylgja tíni egnu kontu admin: account_actions: action: Frem atgerð diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 8460902a6..cdc942132 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -21,6 +21,7 @@ gl: one: Publicación other: Publicacións posts_tab_heading: Publicacións + self_follow_error: Non está permitido seguir a túa propia conta admin: account_actions: action: Executar acción diff --git a/config/locales/he.yml b/config/locales/he.yml index f2732678b..54b6b6f38 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -25,6 +25,7 @@ he: other: הודעות two: הודעותיים posts_tab_heading: הודעות + self_follow_error: בלתי אפשרי לך לעקוב אחרי חשבונך admin: account_actions: action: בצע/י פעולה diff --git a/config/locales/is.yml b/config/locales/is.yml index 6eefaf1b0..f181470e4 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -21,6 +21,7 @@ is: one: Færsla other: Færslur posts_tab_heading: Færslur + self_follow_error: Ekki er leyft að fylgjast með eigin aðgangi admin: account_actions: action: Framkvæma aðgerð diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 54b7fb541..bda5b2d8f 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -19,6 +19,7 @@ ja: posts: other: 投稿 posts_tab_heading: 投稿 + self_follow_error: 自分のアカウントをフォローすることはできません admin: account_actions: action: アクションを実行 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index d20d67e4c..615783738 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -19,6 +19,7 @@ ko: posts: other: 게시물 posts_tab_heading: 게시물 + self_follow_error: 본인의 계정을 팔로우할 수는 없습니다 admin: account_actions: action: 조치 취하기 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 52ec4c89c..968dcc3e7 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -21,6 +21,7 @@ nl: one: Toot other: Berichten posts_tab_heading: Berichten + self_follow_error: Het volgen van je eigen account is niet toegestaan admin: account_actions: action: Actie uitvoeren diff --git a/config/locales/nn.yml b/config/locales/nn.yml index ec3db6520..b28cf3016 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -21,6 +21,7 @@ nn: one: Tut other: Tut posts_tab_heading: Tut + self_follow_error: Det er ikkje tillate å følgje din eigen konto admin: account_actions: action: Utfør diff --git a/config/locales/pl.yml b/config/locales/pl.yml index aaf8a9e72..ba1f4812e 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -25,6 +25,7 @@ pl: one: wpis other: Wpisów posts_tab_heading: Wpisy + self_follow_error: Nie możesz obserwować swojego konta admin: account_actions: action: Wykonaj działanie diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 427703f57..8e806f670 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -21,6 +21,7 @@ pt-BR: one: Publicação other: Publicações posts_tab_heading: Publicações + self_follow_error: Seguir sua conta não é permitido admin: account_actions: action: Tomar uma atitude diff --git a/config/locales/tr.yml b/config/locales/tr.yml index df55aa5a2..ee74f237e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -21,6 +21,7 @@ tr: one: Gönderi other: Gönderiler posts_tab_heading: Gönderiler + self_follow_error: Kendi hesabınızı takip etmenize izin yok admin: account_actions: action: Eylemi gerçekleştir diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 47732198f..dec4299fb 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -25,6 +25,7 @@ uk: one: Допис other: Дописів posts_tab_heading: Дописів + self_follow_error: Ви не можете стежити за власним обліковим записом admin: account_actions: action: Виконати дію diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 17edfba70..7c30c5b12 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -19,6 +19,7 @@ vi: posts: other: Tút posts_tab_heading: Tút + self_follow_error: Bạn không thể tự theo dõi chính bạn admin: account_actions: action: Thực hiện hành động diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 7be8fb5a5..265480469 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -19,6 +19,7 @@ zh-CN: posts: other: 嘟文 posts_tab_heading: 嘟文 + self_follow_error: 不可以关注自己 admin: account_actions: action: 执行操作 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 96aedf0a1..c461aabcd 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -19,6 +19,7 @@ zh-TW: posts: other: 嘟文 posts_tab_heading: 嘟文 + self_follow_error: 無法跟隨您自己的帳號 admin: account_actions: action: 執行動作 From c3a38c7d8c123f5bf736e20e0417fb3d70022391 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 8 Oct 2024 14:24:59 +0200 Subject: [PATCH 17/23] Update changelog and security policy (#32300) --- CHANGELOG.md | 26 ++++++++++++++++---------- SECURITY.md | 11 ++++++----- docker-compose.yml | 6 +++--- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eef082cc..566c47435 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. -## [4.3.0] - UNRELEASED +## [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. @@ -11,12 +11,12 @@ The following changelog entries focus on changes visible to users, administrator - **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\ This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared. - Fix ReDoS vulnerability on some Ruby versions ([GHSA-jpxp-r43f-rhvx](https://github.com/mastodon/mastodon/security/advisories/GHSA-jpxp-r43f-rhvx)) -- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 by @ClearlyClaire) +- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 and #32241 by @ClearlyClaire) - Update dependencies ### Added -- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610, #31929, #32089 and #32085 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\ +- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610, #31929, #32089, #32085, #32243, #32179 and #32254 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\ Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\ This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\ As part of this, the visual design of the entire notifications feature has been revamped.\ @@ -28,7 +28,7 @@ The following changelog entries focus on changes visible to users, administrator - `GET /api/v2/notifications/:group_key/accounts`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts - `POST /api/v2/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group - `GET /api/v2/notifications/:unread_count`: https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count -- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, #31723 and #32062 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\ +- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, #31723, #32062 and #32281 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\ The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\ You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\ Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\ @@ -61,7 +61,7 @@ The following changelog entries focus on changes visible to users, administrator - **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\ You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\ This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link -- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, and #31900 by @Gargron and @oneiros)\ +- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, #31900 and #32188 by @Gargron, @mjankowski and @oneiros)\ This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\ Articles hosted outside the fediverse can indicate a fediverse author with a meta tag: ```html @@ -150,10 +150,12 @@ The following changelog entries focus on changes visible to users, administrator - Add groundwork for annual reports for accounts (#28693 by @Gargron)\ This lays the groundwork for a “year-in-review”/“wrapped” style report for local users, but is currently not in use. - Add notification email on invalid second authenticator (#28822 by @ClearlyClaire) +- Add date of account deletion in list of accounts in the admin interface (#25640 by @tribela) - Add new emojis from `jdecked/twemoji` 15.0 (#28404 by @TheEssem) - Add configurable error handling in attachment batch deletion (#28184 by @vmstan)\ This makes the S3 batch size configurable through the `S3_BATCH_DELETE_LIMIT` environment variable (defaults to 1000), and adds some retry logic, configurable through the `S3_BATCH_DELETE_RETRY` environment variable (defaults to 3). - Add VAPID public key to instance serializer (#28006 by @ThisIsMissEm) +- Add support for serving JRD `/.well-known/host-meta.json` in addition to XRD host-meta (#32206 by @c960657) - Add `nodeName` and `nodeDescription` to nodeinfo `metadata` (#28079 by @6543) - Add Thai diacritics and tone marks in `HASHTAG_INVALID_CHARS_RE` (#26576 by @ppnplus) - Add variable delay before link verification of remote account links (#27774 by @ClearlyClaire) @@ -168,7 +170,7 @@ The following changelog entries focus on changes visible to users, administrator ### Changed -- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, and #31525 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\ +- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, #31525, #32153, and #32201 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\ This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\ In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state. - **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, #29659, #31889 and #32033 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\ @@ -192,9 +194,9 @@ The following changelog entries focus on changes visible to users, administrator Administrators may need to update their setup accordingly. - Change how content warnings and filters are displayed in web UI (#31365, and #31761 by @Gargron) - Change preview card processing to ignore `undefined` as canonical url (#31882 by @oneiros) -- Change embedded posts to use web UI (#31766 and #32135 by @Gargron) +- Change embedded posts to use web UI (#31766, #32135 and #32271 by @Gargron) - Change inner borders in media galleries in web UI (#31852 by @Gargron) -- Change design of media attachments and profile media tab in web UI (#31807, #32048, and #31967 by @Gargron) +- Change design of media attachments and profile media tab in web UI (#31807, #32048, #31967, #32217, #32224 and #32257 by @ClearlyClaire and @Gargron) - Change labels on thread indicators in web UI (#31806 by @Gargron) - Change label of "Data export" menu item in settings interface (#32099 by @c960657) - Change responsive break points on navigation panel in web UI (#32034 by @Gargron) @@ -284,9 +286,10 @@ The following changelog entries focus on changes visible to users, administrator - Fix error when accepting an appeal for sensitive posts deleted in the meantime (#32037 by @ClearlyClaire) - Fix error when encountering reblog of deleted post in feed rebuild (#32001 by @ClearlyClaire) - Fix Safari browser glitch related to horizontal scrolling (#31960 by @Gargron) +- Fix unresolvable mentions sometimes preventing processing incoming posts (#29215 by @tribela and @ClearlyClaire) - Fix too many requests caused by relationship look-ups in web UI (#32042 by @Gargron) - Fix links for reblogs in moderation interface (#31979 by @ClearlyClaire) -- Fix the appearance of avatars when they do not load (#31966 by @renchap) +- Fix the appearance of avatars when they do not load (#31966 and #32270 by @Gargron and @renchap) - Fix spurious error notifications for aborted requests in web UI (#31952 by @c960657) - Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil) - Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire) @@ -309,10 +312,12 @@ The following changelog entries focus on changes visible to users, administrator - Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm) - Fix right-to-left text in preview cards (#30930 by @ClearlyClaire) - Fix rack attack `match_type` value typo in logging config (#30514 by @mjankowski) -- Fix various cases of duplicate, missing, or inconsistent borders or scrollbar styles (#31068, #31286, #31268, #31275, #31284, #31305, #31346, #31372, #31373, #31389, #31432, #31391, #31445 and #32091 by @ClearlyClaire, @valtlai and @vmstan) +- Fix various cases of duplicate, missing, or inconsistent borders or scrollbar styles (#31068, #31286, #31268, #31275, #31284, #31305, #31346, #31372, #31373, #31389, #31432, #31391, #31445, #32091, #32147 and #32137 by @ClearlyClaire, @mjankowski, @valtlai and @vmstan) +- Fix editing description of media uploads with custom thumbnails (#32221 by @ClearlyClaire) - Fix race condition in `POST /api/v1/push/subscription` (#30166 by @ClearlyClaire) - Fix post deletion not being delayed when those are part of an account warning (#30163 by @ClearlyClaire) - Fix rendering error on `/start` when not logged in (#30023 by @timothyjrogers) +- Fix unneeded requests to blocked domains when receiving relayed signed activities from them (#31161 by @ClearlyClaire) - Fix logo pushing header buttons out of view on certain conditions in mobile layout (#29787 by @ClearlyClaire) - Fix notification-related records not being reattributed when merging accounts (#29694 by @ClearlyClaire) - Fix results/query in `api/v1/featured_tags/suggestions` (#29597 by @mjankowski) @@ -322,6 +327,7 @@ The following changelog entries focus on changes visible to users, administrator - Fix full date display not respecting the locale 12/24h format (#29448 by @renchap) - Fix filters title and keywords overflow (#29396 by @GeopJr) - Fix incorrect date format in “Follows and followers” (#29390 by @JasonPunyon) +- Fix navigation item active highlight for some paths (#32159 by @mjankowski) - Fix “Edit media” modal sizing and layout when space-constrained (#27095 by @ronilaukkarinen) - Fix modal container bounds (#29185 by @nico3333fr) - Fix inefficient HTTP signature parsing using regexps and `StringScanner` (#29133 by @ClearlyClaire) diff --git a/SECURITY.md b/SECURITY.md index 156954ce0..43ab4454c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,8 +13,9 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through ## Supported Versions -| Version | Supported | -| ------- | --------- | -| 4.2.x | Yes | -| 4.1.x | Yes | -| < 4.1 | No | +| Version | Supported | +| ------- | ---------------- | +| 4.3.x | Yes | +| 4.2.x | Yes | +| 4.1.x | Until 2025-04-08 | +| < 4.1 | No | diff --git a/docker-compose.yml b/docker-compose.yml index 41876d26f..37cb16497 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.3.0-rc.1 + image: ghcr.io/mastodon/mastodon:v4.3.0 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/mastodon/mastodon-streaming:v4.3.0-rc.1 + image: ghcr.io/mastodon/mastodon-streaming:v4.3.0 restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.3.0-rc.1 + image: ghcr.io/mastodon/mastodon:v4.3.0 restart: always env_file: .env.production command: bundle exec sidekiq From 022c1ae6f2911db8c479e0b6b88cff1e3a79c47e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 08:52:52 -0400 Subject: [PATCH 18/23] Remove unused deprecator configuration (#32288) --- config/application.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/config/application.rb b/config/application.rb index 0013c7885..5e2f44453 100644 --- a/config/application.rb +++ b/config/application.rb @@ -96,10 +96,6 @@ module Mastodon config.middleware.use Rack::Attack config.middleware.use Mastodon::RackMiddleware - initializer :deprecator do |app| - app.deprecators[:mastodon] = ActiveSupport::Deprecation.new('4.3', 'mastodon/mastodon') - end - config.before_configuration do require 'mastodon/redis_configuration' ::REDIS_CONFIGURATION = Mastodon::RedisConfiguration.new From d20a899bb90c78c2290a947e36f19fff6654ad47 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 09:21:36 -0400 Subject: [PATCH 19/23] Bring icon vertical middle to applications list style (#32293) --- app/javascript/styles/mastodon/admin.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 0712a0d3f..c7b32a9c9 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1029,6 +1029,12 @@ a.name-tag, color: var(--user-role-accent); } +.applications-list { + .icon { + vertical-align: middle; + } +} + .announcements-list, .filters-list { border: 1px solid var(--background-border-color); From 3cf2d35c4947cb8fb12cb33c22b2832f823cb3a4 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 09:23:30 -0400 Subject: [PATCH 20/23] Reference `IpBlock.severities` keys from CLI option check (#32291) --- lib/mastodon/cli/ip_blocks.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/cli/ip_blocks.rb b/lib/mastodon/cli/ip_blocks.rb index 3c5fdb275..ef24f2e04 100644 --- a/lib/mastodon/cli/ip_blocks.rb +++ b/lib/mastodon/cli/ip_blocks.rb @@ -5,7 +5,7 @@ require_relative 'base' module Mastodon::CLI class IpBlocks < Base - option :severity, required: true, enum: %w(no_access sign_up_requires_approval sign_up_block), desc: 'Severity of the block' + option :severity, required: true, enum: IpBlock.severities.keys, desc: 'Severity of the block' option :comment, aliases: [:c], desc: 'Optional comment' option :duration, aliases: [:d], type: :numeric, desc: 'Duration of the block in seconds' option :force, type: :boolean, aliases: [:f], desc: 'Overwrite existing blocks' From f49161ab1d57969b105bd115af8c827fc817db61 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 09:30:54 -0400 Subject: [PATCH 21/23] Oauth system spec cleanup / helper method extraction (#32287) --- spec/system/oauth_spec.rb | 96 +++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb index 64ac75879..14ffc163f 100644 --- a/spec/system/oauth_spec.rb +++ b/spec/system/oauth_spec.rb @@ -24,28 +24,28 @@ RSpec.describe 'Using OAuth from an external app' do subject # It presents the user with an authorization page - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) - - # Upon authorizing, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.authorize') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_authorize_text) # It grants the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be true + expect { click_on oauth_authorize_text } + .to change { user_has_grant_with_client_app? }.to(true) + + # Upon authorizing, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end it 'when rejecting the authorization request' do subject # It presents the user with an authorization page - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.deny')) - - # Upon denying, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.deny') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_deny_text) # It does not grant the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be false + expect { click_on oauth_deny_text } + .to_not change { user_has_grant_with_client_app? }.from(false) + + # Upon denying, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end # The tests in this context ensures that requests without PKCE parameters @@ -133,7 +133,6 @@ RSpec.describe 'Using OAuth from an external app' do end it 'when accepting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } visit "/oauth/authorize?#{params.to_query}" # It presents the user with a log-in page @@ -145,18 +144,17 @@ RSpec.describe 'Using OAuth from an external app' do # Logging in redirects to an authorization page fill_in_auth_details(email, password) - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) - - # Upon authorizing, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.authorize') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_authorize_text) # It grants the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be true + expect { click_on oauth_authorize_text } + .to change { user_has_grant_with_client_app? }.to(true) + + # Upon authorizing, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end it 'when rejecting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } visit "/oauth/authorize?#{params.to_query}" # It presents the user with a log-in page @@ -168,21 +166,20 @@ RSpec.describe 'Using OAuth from an external app' do # Logging in redirects to an authorization page fill_in_auth_details(email, password) - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) - - # Upon denying, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.deny') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_authorize_text) # It does not grant the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be false + expect { click_on oauth_deny_text } + .to_not change { user_has_grant_with_client_app? }.from(false) + + # Upon denying, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end context 'when the user has set up TOTP' do let(:user) { Fabricate(:user, email: email, password: password, otp_required_for_login: true, otp_secret: User.generate_otp_secret) } it 'when accepting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } visit "/oauth/authorize?#{params.to_query}" # It presents the user with a log-in page @@ -202,18 +199,17 @@ RSpec.describe 'Using OAuth from an external app' do # Filling in the correct TOTP code redirects to an app authorization page fill_in_otp_details(user.current_otp) - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) - - # Upon authorizing, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.authorize') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_authorize_text) # It grants the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be true + expect { click_on oauth_authorize_text } + .to change { user_has_grant_with_client_app? }.to(true) + + # Upon authorizing, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end it 'when rejecting the authorization request' do - params = { client_id: client_app.uid, response_type: 'code', redirect_uri: client_app.redirect_uri, scope: 'read' } visit "/oauth/authorize?#{params.to_query}" # It presents the user with a log-in page @@ -233,14 +229,14 @@ RSpec.describe 'Using OAuth from an external app' do # Filling in the correct TOTP code redirects to an app authorization page fill_in_otp_details(user.current_otp) - expect(page).to have_content(I18n.t('doorkeeper.authorizations.buttons.authorize')) - - # Upon denying, it redirects to the apps' callback URL - click_on I18n.t('doorkeeper.authorizations.buttons.deny') - expect(page).to have_current_path(/\A#{client_app.redirect_uri}/, url: true) + expect(page).to have_content(oauth_authorize_text) # It does not grant the app access to the account - expect(Doorkeeper::AccessGrant.exists?(application: client_app, resource_owner_id: user.id)).to be false + expect { click_on oauth_deny_text } + .to_not change { user_has_grant_with_client_app? }.from(false) + + # Upon denying, it redirects to the apps' callback URL + expect(page).to redirect_to_callback_url end end # TODO: external auth @@ -252,4 +248,24 @@ RSpec.describe 'Using OAuth from an external app' do fill_in 'user_otp_attempt', with: value click_on I18n.t('auth.login') end + + def oauth_authorize_text + I18n.t('doorkeeper.authorizations.buttons.authorize') + end + + def oauth_deny_text + I18n.t('doorkeeper.authorizations.buttons.deny') + end + + def redirect_to_callback_url + have_current_path(/\A#{client_app.redirect_uri}/, url: true) + end + + def user_has_grant_with_client_app? + Doorkeeper::AccessGrant + .exists?( + application: client_app, + resource_owner_id: user.id + ) + end end From e8ec6667bd24028422abb68525db5b8f6a44c801 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 09:53:35 -0400 Subject: [PATCH 22/23] Extract wrapper constant for `HTTP::*` error classes (#32285) --- app/controllers/application_controller.rb | 2 +- app/controllers/concerns/api/error_handling.rb | 2 +- app/controllers/concerns/signature_verification.rb | 2 +- app/controllers/media_proxy_controller.rb | 2 +- app/lib/activitypub/activity/create.rb | 4 ++-- app/models/account_alias.rb | 2 +- app/models/account_migration.rb | 2 +- app/models/concerns/remotable.rb | 2 +- app/models/form/redirect.rb | 2 +- app/models/remote_follow.rb | 2 +- app/services/activitypub/process_account_service.rb | 6 +++--- app/services/activitypub/process_status_update_service.rb | 2 +- app/services/fetch_link_card_service.rb | 2 +- app/services/fetch_resource_service.rb | 2 +- app/services/import_service.rb | 2 +- app/services/process_mentions_service.rb | 2 +- app/services/software_update_check_service.rb | 2 +- app/services/verify_link_service.rb | 2 +- app/workers/refollow_worker.rb | 2 +- lib/exceptions.rb | 6 ++++++ lib/mastodon/cli/accounts.rb | 2 +- 21 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 62e3355ae..40cae15b4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -32,7 +32,7 @@ class ApplicationController < ActionController::Base rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests - rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error) rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable rescue_from Seahorse::Client::NetworkingError do |e| diff --git a/app/controllers/concerns/api/error_handling.rb b/app/controllers/concerns/api/error_handling.rb index ad559fe2d..9ce4795b0 100644 --- a/app/controllers/concerns/api/error_handling.rb +++ b/app/controllers/concerns/api/error_handling.rb @@ -20,7 +20,7 @@ module Api::ErrorHandling render json: { error: 'Record not found' }, status: 404 end - rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError) do render json: { error: 'Remote data could not be fetched' }, status: 503 end diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 68f09ee02..6773c1109 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -80,7 +80,7 @@ module SignatureVerification fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature'] rescue SignatureVerificationError => e fail_with! e.message - rescue HTTP::Error, OpenSSL::SSL::SSLError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e fail_with! "Failed to fetch remote data: #{e.message}" rescue Mastodon::UnexpectedResponseError fail_with! 'Failed to fetch remote data (got unexpected reply from server)' diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index c4230d62c..09a28c7e3 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -13,7 +13,7 @@ class MediaProxyController < ApplicationController rescue_from ActiveRecord::RecordInvalid, with: :not_found rescue_from Mastodon::UnexpectedResponseError, with: :not_found rescue_from Mastodon::NotPermittedError, with: :not_found - rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error) def show with_redis_lock("media_download:#{params[:id]}") do diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 928803cd6..fd836f230 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -199,7 +199,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity return if account.nil? @mentions << Mention.new(account: account, silent: false) - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError @unresolved_mentions << tag['href'] end @@ -250,7 +250,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity media_attachment.download_file! media_attachment.download_thumbnail! media_attachment.save - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb index 3b75919af..a4a7427e2 100644 --- a/app/models/account_alias.rb +++ b/app/models/account_alias.rb @@ -35,7 +35,7 @@ class AccountAlias < ApplicationRecord def set_uri target_account = ResolveAccountService.new.call(acct) self.uri = ActivityPub::TagManager.instance.uri_for(target_account) unless target_account.nil? - rescue Webfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error # Validation will take care of it end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index 7a01e250e..5df857e3b 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -61,7 +61,7 @@ class AccountMigration < ApplicationRecord def set_target_account self.target_account = ResolveAccountService.new.call(acct, skip_cache: true) - rescue Webfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError # Validation will take care of it end diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index 8382c9159..80a99b35d 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -26,7 +26,7 @@ module Remotable public_send(:"#{attachment_name}=", ResponseWithLimit.new(response, limit)) end - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError => e + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e Rails.logger.debug { "Error fetching remote #{attachment_name}: #{e}" } public_send(:"#{attachment_name}=", nil) if public_send(:"#{attachment_name}_file_name").present? raise e unless suppress_errors diff --git a/app/models/form/redirect.rb b/app/models/form/redirect.rb index 3cd5731e6..ecacaa4d9 100644 --- a/app/models/form/redirect.rb +++ b/app/models/form/redirect.rb @@ -32,7 +32,7 @@ class Form::Redirect def set_target_account @target_account = ResolveAccountService.new.call(acct, skip_cache: true) - rescue Webfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError # Validation will take care of it end diff --git a/app/models/remote_follow.rb b/app/models/remote_follow.rb index fa0586f57..f9719b867 100644 --- a/app/models/remote_follow.rb +++ b/app/models/remote_follow.rb @@ -66,7 +66,7 @@ class RemoteFollow def acct_resource @acct_resource ||= Webfinger.new("acct:#{acct}").perform - rescue Webfinger::Error, HTTP::ConnectionError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS nil end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index a7422b5d0..d9482efac 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -127,13 +127,13 @@ class ActivityPub::ProcessAccountService < BaseService begin @account.avatar_remote_url = image_url('icon') || '' unless skip_download? @account.avatar = nil if @account.avatar_remote_url.blank? - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError RedownloadAvatarWorker.perform_in(rand(30..600).seconds, @account.id) end begin @account.header_remote_url = image_url('image') || '' unless skip_download? @account.header = nil if @account.header_remote_url.blank? - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError RedownloadHeaderWorker.perform_in(rand(30..600).seconds, @account.id) end @account.statuses_count = outbox_total_items if outbox_total_items.present? @@ -276,7 +276,7 @@ class ActivityPub::ProcessAccountService < BaseService total_items = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil has_first_page = collection.is_a?(Hash) && collection['first'].present? @collections[type] = [total_items, has_first_page] - rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::LengthValidationError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::LengthValidationError @collections[type] = [nil, nil] end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index 1dbed27f2..9ec3f2b43 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -109,7 +109,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService media_attachment.download_file! if media_attachment.remote_url_previously_changed? media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed? media_attachment.save - rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 7662fc1f2..bb526099d 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -29,7 +29,7 @@ class FetchLinkCardService < BaseService end attach_card if @card&.persisted? - rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" } nil end diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index b69015a5e..949c289b6 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -12,7 +12,7 @@ class FetchResourceService < BaseService return if url.blank? process(url) - rescue HTTP::Error, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e Rails.logger.debug { "Error fetching resource #{@url}: #{e}" } nil end diff --git a/app/services/import_service.rb b/app/services/import_service.rb index 6dafb5a0b..26fabacb9 100644 --- a/app/services/import_service.rb +++ b/app/services/import_service.rb @@ -115,7 +115,7 @@ class ImportService < BaseService next if status.nil? && ActivityPub::TagManager.instance.local_uri?(uri) status || ActivityPub::FetchRemoteStatusService.new.call(uri) - rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError nil rescue => e Rails.logger.warn "Unexpected error when importing bookmark: #{e}" diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 1c4c7805f..2d3c76630 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -44,7 +44,7 @@ class ProcessMentionsService < BaseService if mention_undeliverable?(mentioned_account) begin mentioned_account = ResolveAccountService.new.call(Regexp.last_match(1)) - rescue Webfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError mentioned_account = nil end end diff --git a/app/services/software_update_check_service.rb b/app/services/software_update_check_service.rb index c8ce1753f..b9818c819 100644 --- a/app/services/software_update_check_service.rb +++ b/app/services/software_update_check_service.rb @@ -22,7 +22,7 @@ class SoftwareUpdateCheckService < BaseService Request.new(:get, "#{api_url}?version=#{version}").add_headers('Accept' => 'application/json', 'User-Agent' => 'Mastodon update checker').perform do |res| return Oj.load(res.body_with_limit, mode: :strict) if res.code == 200 end - rescue HTTP::Error, OpenSSL::SSL::SSLError, Oj::ParseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Oj::ParseError nil end diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb index c4f4191e1..af5a5e4a9 100644 --- a/app/services/verify_link_service.rb +++ b/app/services/verify_link_service.rb @@ -10,7 +10,7 @@ class VerifyLinkService < BaseService return unless link_back_present? field.mark_verified! - rescue OpenSSL::SSL::SSLError, HTTP::Error, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e + rescue OpenSSL::SSL::SSLError, *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e Rails.logger.debug { "Error fetching link #{@url}: #{e}" } nil end diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb index 4b712d3aa..078c8502d 100644 --- a/app/workers/refollow_worker.rb +++ b/app/workers/refollow_worker.rb @@ -21,7 +21,7 @@ class RefollowWorker # Schedule re-follow begin FollowService.new.call(follower, target_account, reblogs: reblogs, notify: notify, languages: languages, bypass_limit: true) - rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError + rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError next end end diff --git a/lib/exceptions.rb b/lib/exceptions.rb index c2ff162a6..9c32cb6dd 100644 --- a/lib/exceptions.rb +++ b/lib/exceptions.rb @@ -36,4 +36,10 @@ module Mastodon super() end end + + HTTP_CONNECTION_ERRORS = [ + HTTP::ConnectionError, + HTTP::Error, + HTTP::TimeoutError, + ].freeze end diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 08a28e5f5..6f0de0fd6 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -305,7 +305,7 @@ module Mastodon::CLI begin code = Request.new(:head, account.uri).perform(&:code) - rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, Mastodon::PrivateNetworkAddressError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::PrivateNetworkAddressError skip_domains << account.domain end From 258dce125668ccac45d6d0958da1c841ab7cfcee Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 8 Oct 2024 10:59:51 -0400 Subject: [PATCH 23/23] Add `OpenSSL::SSL::SSLError` to http connection errors wrapper (#32307) --- app/controllers/application_controller.rb | 2 +- app/controllers/concerns/signature_verification.rb | 2 +- app/controllers/media_proxy_controller.rb | 2 +- app/lib/activitypub/activity/create.rb | 4 ++-- app/models/account_alias.rb | 2 +- app/models/account_migration.rb | 2 +- app/models/concerns/remotable.rb | 2 +- app/models/form/redirect.rb | 2 +- app/services/activitypub/process_account_service.rb | 6 +++--- app/services/activitypub/process_status_update_service.rb | 2 +- app/services/fetch_link_card_service.rb | 2 +- app/services/fetch_resource_service.rb | 2 +- app/services/import_service.rb | 2 +- app/services/process_mentions_service.rb | 2 +- app/services/software_update_check_service.rb | 2 +- app/services/verify_link_service.rb | 2 +- app/workers/refollow_worker.rb | 2 +- lib/exceptions.rb | 1 + lib/mastodon/cli/accounts.rb | 2 +- 19 files changed, 22 insertions(+), 21 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 40cae15b4..d493bd43b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -32,7 +32,7 @@ class ApplicationController < ActionController::Base rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests - rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error) + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error) rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable rescue_from Seahorse::Client::NetworkingError do |e| diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 6773c1109..4ae63632c 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -80,7 +80,7 @@ module SignatureVerification fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature'] rescue SignatureVerificationError => e fail_with! e.message - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS => e fail_with! "Failed to fetch remote data: #{e.message}" rescue Mastodon::UnexpectedResponseError fail_with! 'Failed to fetch remote data (got unexpected reply from server)' diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index 09a28c7e3..f68d85e44 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -13,7 +13,7 @@ class MediaProxyController < ApplicationController rescue_from ActiveRecord::RecordInvalid, with: :not_found rescue_from Mastodon::UnexpectedResponseError, with: :not_found rescue_from Mastodon::NotPermittedError, with: :not_found - rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error) + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error) def show with_redis_lock("media_download:#{params[:id]}") do diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index fd836f230..d04f7226a 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -199,7 +199,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity return if account.nil? @mentions << Mention.new(account: account, silent: false) - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS @unresolved_mentions << tag['href'] end @@ -250,7 +250,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity media_attachment.download_file! media_attachment.download_thumbnail! media_attachment.save - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb index a4a7427e2..41623dded 100644 --- a/app/models/account_alias.rb +++ b/app/models/account_alias.rb @@ -35,7 +35,7 @@ class AccountAlias < ApplicationRecord def set_uri target_account = ResolveAccountService.new.call(acct) self.uri = ActivityPub::TagManager.instance.uri_for(target_account) unless target_account.nil? - rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error # Validation will take care of it end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index 5df857e3b..7bda388f2 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -61,7 +61,7 @@ class AccountMigration < ApplicationRecord def set_target_account self.target_account = ResolveAccountService.new.call(acct, skip_cache: true) - rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error, Addressable::URI::InvalidURIError # Validation will take care of it end diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index 80a99b35d..15133e7bd 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -26,7 +26,7 @@ module Remotable public_send(:"#{attachment_name}=", ResponseWithLimit.new(response, limit)) end - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS => e Rails.logger.debug { "Error fetching remote #{attachment_name}: #{e}" } public_send(:"#{attachment_name}=", nil) if public_send(:"#{attachment_name}_file_name").present? raise e unless suppress_errors diff --git a/app/models/form/redirect.rb b/app/models/form/redirect.rb index ecacaa4d9..c5b3c1f8f 100644 --- a/app/models/form/redirect.rb +++ b/app/models/form/redirect.rb @@ -32,7 +32,7 @@ class Form::Redirect def set_target_account @target_account = ResolveAccountService.new.call(acct, skip_cache: true) - rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error, Addressable::URI::InvalidURIError # Validation will take care of it end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index d9482efac..df6f23c02 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -127,13 +127,13 @@ class ActivityPub::ProcessAccountService < BaseService begin @account.avatar_remote_url = image_url('icon') || '' unless skip_download? @account.avatar = nil if @account.avatar_remote_url.blank? - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS RedownloadAvatarWorker.perform_in(rand(30..600).seconds, @account.id) end begin @account.header_remote_url = image_url('image') || '' unless skip_download? @account.header = nil if @account.header_remote_url.blank? - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS RedownloadHeaderWorker.perform_in(rand(30..600).seconds, @account.id) end @account.statuses_count = outbox_total_items if outbox_total_items.present? @@ -276,7 +276,7 @@ class ActivityPub::ProcessAccountService < BaseService total_items = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil has_first_page = collection.is_a?(Hash) && collection['first'].present? @collections[type] = [total_items, has_first_page] - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::LengthValidationError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::LengthValidationError @collections[type] = [nil, nil] end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index 9ec3f2b43..141ad24e9 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -109,7 +109,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService media_attachment.download_file! if media_attachment.remote_url_previously_changed? media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed? media_attachment.save - rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index bb526099d..4141fb43d 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -29,7 +29,7 @@ class FetchLinkCardService < BaseService end attach_card if @card&.persisted? - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" } nil end diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index 949c289b6..911950ccc 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -12,7 +12,7 @@ class FetchResourceService < BaseService return if url.blank? process(url) - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e Rails.logger.debug { "Error fetching resource #{@url}: #{e}" } nil end diff --git a/app/services/import_service.rb b/app/services/import_service.rb index 26fabacb9..a695df2fc 100644 --- a/app/services/import_service.rb +++ b/app/services/import_service.rb @@ -115,7 +115,7 @@ class ImportService < BaseService next if status.nil? && ActivityPub::TagManager.instance.local_uri?(uri) status || ActivityPub::FetchRemoteStatusService.new.call(uri) - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError nil rescue => e Rails.logger.warn "Unexpected error when importing bookmark: #{e}" diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 2d3c76630..3839eb4df 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -44,7 +44,7 @@ class ProcessMentionsService < BaseService if mention_undeliverable?(mentioned_account) begin mentioned_account = ResolveAccountService.new.call(Regexp.last_match(1)) - rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError + rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError mentioned_account = nil end end diff --git a/app/services/software_update_check_service.rb b/app/services/software_update_check_service.rb index b9818c819..24a6955b8 100644 --- a/app/services/software_update_check_service.rb +++ b/app/services/software_update_check_service.rb @@ -22,7 +22,7 @@ class SoftwareUpdateCheckService < BaseService Request.new(:get, "#{api_url}?version=#{version}").add_headers('Accept' => 'application/json', 'User-Agent' => 'Mastodon update checker').perform do |res| return Oj.load(res.body_with_limit, mode: :strict) if res.code == 200 end - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Oj::ParseError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Oj::ParseError nil end diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb index af5a5e4a9..17c86426b 100644 --- a/app/services/verify_link_service.rb +++ b/app/services/verify_link_service.rb @@ -10,7 +10,7 @@ class VerifyLinkService < BaseService return unless link_back_present? field.mark_verified! - rescue OpenSSL::SSL::SSLError, *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e Rails.logger.debug { "Error fetching link #{@url}: #{e}" } nil end diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb index 078c8502d..7b26e4a06 100644 --- a/app/workers/refollow_worker.rb +++ b/app/workers/refollow_worker.rb @@ -21,7 +21,7 @@ class RefollowWorker # Schedule re-follow begin FollowService.new.call(follower, target_account, reblogs: reblogs, notify: notify, languages: languages, bypass_limit: true) - rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError + rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS next end end diff --git a/lib/exceptions.rb b/lib/exceptions.rb index 9c32cb6dd..1910d37a1 100644 --- a/lib/exceptions.rb +++ b/lib/exceptions.rb @@ -41,5 +41,6 @@ module Mastodon HTTP::ConnectionError, HTTP::Error, HTTP::TimeoutError, + OpenSSL::SSL::SSLError, ].freeze end diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 6f0de0fd6..e76735298 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -305,7 +305,7 @@ module Mastodon::CLI begin code = Request.new(:head, account.uri).perform(&:code) - rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::PrivateNetworkAddressError + rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::PrivateNetworkAddressError skip_domains << account.domain end